#!/home/arne/wisp/wisp-multiline.sh -l guile
; !#
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 : 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 31
+ v1 : * v0 : integer-expt 2 32
let
:
v0tmp
+ v0
logxor
+ k0 : ash v1 -4
+ v1 sum
+ k1 : ash v1 5
loop
+ sum delta
+ cycle 1
. v0tmp
+ v1
logxor
+ k2 : ash v0tmp -4
+ v0tmp sum
+ k3 : ash v0tmp 5
display
encrypt
+ 1 : integer-expt 2 33
+ 7 : integer-expt 2 96
newline