#!/home/arne/wisp/wisp-multiline.sh -l guile ; !# define-module : examples tinyenc . #:export : encrypt decrypt ; 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 : 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 delta cycle 0 v0 : ash v -32 v1 : modulo v : integer-expt 2 32 if : = cycle 32 + v1 : * v0 : integer-expt 2 32 let : v0tmp uint32! + v0 logxor + k0 : ash v1 -4 + v1 sum + k1 : ash v1 5 loop modulo (+ sum delta) : integer-expt 2 32 + cycle 1 . v0tmp 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 . 5 + 7 : integer-expt 2 96 + 7 : integer-expt 2 96 newline display encrypt . 5 + 7 : integer-expt 2 96 newline