(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