diff options
| author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2011-08-16 15:14:52 +0200 | 
|---|---|---|
| committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2011-08-16 15:14:52 +0200 | 
| commit | 93515cf43ce16974c7bef1d1d8332e3c8cfe6fac (patch) | |
| tree | 84af96f2c50a933d94857d1563186c8bd66dadb7 /util.rkt | |
| parent | 594c161d6e84581fb89873e216a70bd68a750919 (diff) | |
Implement the Salsa20 stream cipher.
Diffstat (limited to 'util.rkt')
| -rw-r--r-- | util.rkt | 28 | 
1 files changed, 22 insertions, 6 deletions
| @@ -21,23 +21,31 @@           integer->bytes/size           bytes->integer           pad-bytes -         Justification) +         Justification +         Endianness +         bytes-xor)  (define-type Justification (U 'left 'right)) +(define-type Endianness    (U 'little-endian 'big-endian)) -(define: (integer->bytes [x : Exact-Nonnegative-Integer]) : Bytes +(define: (integer->bytes [x          : Exact-Nonnegative-Integer] +                         [endianness : Endianness]) +  : Bytes    (let: loop : Bytes          ([acc : (Listof Byte) (list)]           [x : Exact-Nonnegative-Integer x])      (if (zero? x) -        (list->bytes acc) +        (list->bytes (if (eq? endianness 'big-endian) +                         acc +                         (reverse acc)))          (loop (cons (bitwise-and #xff x) acc)                (arithmetic-shift x -8))))) -(define: (integer->bytes/size [x : Exact-Nonnegative-Integer] -                              [size : Exact-Nonnegative-Integer]) +(define: (integer->bytes/size [x          : Exact-Nonnegative-Integer] +                              [endianness : Endianness] +                              [size       : Exact-Nonnegative-Integer])    : Bytes -  (pad-bytes (integer->bytes x) size #x0 'right)) +  (pad-bytes (integer->bytes x endianness) size #x0 'right))  (define: (bytes->integer [b : Bytes]) : Exact-Nonnegative-Integer    (for/fold: ([n : Exact-Nonnegative-Integer 0]) @@ -58,3 +66,11 @@              (bytes-append b padding)              (bytes-append padding b))))) +(define: (bytes-xor [a : Bytes] [b : Bytes]) : Bytes +  (list->bytes +   (reverse +    (for/fold: ([acc : (Listof Byte) (list)]) +               ([x : Byte (in-bytes a)] +                [y : Byte (in-bytes b)]) +      (cons (bitwise-xor x y) acc))))) + | 
