From 93515cf43ce16974c7bef1d1d8332e3c8cfe6fac Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Tue, 16 Aug 2011 15:14:52 +0200 Subject: Implement the Salsa20 stream cipher. --- util.rkt | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'util.rkt') diff --git a/util.rkt b/util.rkt index 43dbe01..c1325a6 100644 --- a/util.rkt +++ b/util.rkt @@ -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))))) + -- cgit v1.2.3