(Arne Babenhauserheide)
2013-12-26: niccely refactored code, but it does not work. niccely refactored code, but it does not work.
diff --git a/examples/tinyenc.w b/examples/tinyenc.w --- a/examples/tinyenc.w +++ b/examples/tinyenc.w @@ -3,83 +3,86 @@ define-module : examples tinyenc . #:export : encrypt decrypt - + . #:use-syntax : ice-9 syncase ; http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm#toctitle -logxor 1 3 - define delta #x9e3779b9 define : uint32 number . "ensure that the number fits a uint32" modulo number : integer-expt 2 32 +define : v0change k0 v1 sum k1 + logxor + uint32 : + k0 : ash v1 -4 + uint32 : + v1 sum + uint32 : + k1 : uint32 : ash v1 5 + +define : v1change k2 v0 sum k3 + logxor + uint32 : + k2 : ash v0 -4 + uint32 : + v0 sum + uint32 : + k3 : uint32 : ash v0 5 + +; TODO: Define a macro with-split-kv which executes its body with let bindings to k0 k1 k2 k3 v0 and v1 +define-syntax with-split-vk + syntax-rules : + : with-split-vk v k ... + let + : k0 : uint32 : ash k -96 + k1 : uint32 : ash k -64 + k2 : uint32 : ash k -32 + k3 : uint32 k + v0 : uint32 : ash v -32 + v1 : uint32 v + . ... + + define : encrypt v k . "Encrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)." - let* - : k0 : ash k -96 +; with-split-vk v k + let + : k0 : uint32 : ash k -96 k1 : uint32 : ash k -64 k2 : uint32 : ash k -32 k3 : uint32 k + v0 : uint32 : ash v -32 + v1 : uint32 v let loop : sum delta cycle 0 - v0 : ash v -32 - v1 : uint32 v + v0 v0 + v1 v1 if : = cycle 32 + v1 : * v0 : integer-expt 2 32 - let - : - v0tmp - uint32 - + v0 - logxor - + k0 : ash v1 -4 - + v1 sum - + k1 : ash v1 5 + let : : v0tmp : uint32 : + v0 : v0change k0 v1 sum k1 loop uint32 : + sum delta + cycle 1 . v0tmp - uint32 - + v1 - logxor - + k2 : ash v0tmp -4 - + v0tmp sum - + k3 : ash v0tmp 5 + uint32 : + v1 : v1change k2 v0tmp sum k3 define : decrypt v k . "Decrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)." - let* - : k0 : ash k -96 + let + : k0 : uint32 : ash k -96 k1 : uint32 : ash k -64 k2 : uint32 : ash k -32 k3 : uint32 k + v0 : uint32 : ash v -32 + v1 : uint32 v let loop : sum #xc6ef3720 cycle 0 - v0 : ash v -32 - v1 : uint32 v + v0 v0 + v1 v1 if : = cycle 32 + v1 : * v0 : integer-expt 2 32 - let - : - v1tmp - uint32 - - v1 - logxor - + k2 : ash v0 -4 - + v0 sum - + k3 : ash v0 5 + let : : v1tmp : uint32 : - v1 : v1change k2 v0 sum k3 loop uint32 : + sum delta + cycle 1 - uint32 - - v0 - logxor - + k0 : ash v1tmp -4 - + v1tmp sum - + k1 : ash v1tmp 5 + uint32 : - v0 : v0change k0 v1tmp sum k1 . v1tmp @@ -87,11 +90,11 @@ display decrypt encrypt . 5 - + 7 : integer-expt 2 96 - + 7 : integer-expt 2 96 + . 9 + . 9 newline display encrypt . 5 - + 7 : integer-expt 2 96 + . 9 newline