(Arne Babenhauserheide)
2013-12-26: still wrong results. still wrong results.
diff --git a/examples/tinyenc.w b/examples/tinyenc.w --- a/examples/tinyenc.w +++ b/examples/tinyenc.w @@ -4,14 +4,16 @@ define-module : examples tinyenc . #:export : encrypt decrypt -use-modules : - ; 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 : encrypt v k . "Encrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)." let @@ -24,29 +26,72 @@ define : encrypt v k cycle 0 v0 : ash v -32 v1 : modulo v : integer-expt 2 32 - if : > cycle 31 + if : = cycle 32 + v1 : * v0 : integer-expt 2 32 let : v0tmp - + v0 + uint32! + + v0 logxor + k0 : ash v1 -4 + v1 sum + k1 : ash v1 5 loop - + sum delta + modulo (+ sum delta) : integer-expt 2 32 + cycle 1 . v0tmp - + v1 + uint32! + + v1 logxor + k2 : ash v0tmp -4 + v0tmp sum + k3 : ash v0tmp 5 +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 + k1 : modulo (ash k -64) : integer-expt 2 32 + k2 : modulo (ash k -32) : integer-expt 2 64 + k3 : modulo k : integer-expt 2 96 + let loop + : sum #xc6ef3720 + cycle 0 + v0 : ash v -32 + v1 : modulo v : integer-expt 2 32 + if : = cycle 32 + + v1 : * v0 : integer-expt 2 32 + let + : + v1tmp + uint32! + - v1 + logxor + + k2 : ash v0 -4 + + v0 sum + + k3 : ash v0 5 + loop + modulo (+ sum delta) : integer-expt 2 32 + + cycle 1 + uint32! + - v0 + logxor + + k0 : ash v1tmp -4 + + v1tmp sum + + k1 : ash v1tmp 5 + . v1tmp + display + decrypt encrypt - + 1 : integer-expt 2 33 + . 5 + + 7 : integer-expt 2 96 + + 7 : integer-expt 2 96 +newline +display + encrypt + . 5 + 7 : integer-expt 2 96 newline