MODULE XXTEA; IMPORT SYSTEM; CONST Delta = 9E3779B9H; PROCEDURE MX(z, y, sum, p: INTEGER; e: SET; key: ARRAY OF SET): INTEGER; VAR term0, term1, term2, sub, term3, result: INTEGER; sumSet, pSet, eSet: SET; BEGIN sumSet := SYSTEM.VAL(SET, sum); pSet := SYSTEM.VAL(SET, p); eSet := SYSTEM.VAL(SET, e); term0 := SYSTEM.VAL(INTEGER, (SYSTEM.VAL(SET, ASR(z, 5)) * {0..26}) / SYSTEM.VAL(SET, LSL(y, 2))); term1 := SYSTEM.VAL(INTEGER, (SYSTEM.VAL(SET, ASR(y, 3)) * {0..28}) / SYSTEM.VAL(SET, LSL(z, 4))); term2 := SYSTEM.VAL(INTEGER, sumSet / SYSTEM.VAL(SET, y)); sub := SYSTEM.VAL(INTEGER, (pSet * {0, 1}) / eSet); term3 := SYSTEM.VAL(INTEGER, key[sub] / SYSTEM.VAL(SET, z)); result := SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, term0 + term1) / SYSTEM.VAL(SET, term2 + term3)); RETURN result END MX; PROCEDURE BTEA*(VAR v: ARRAY OF INTEGER; n: INTEGER; key: ARRAY OF SET); VAR y, z, rounds, sum, p: INTEGER; e: SET; BEGIN IF n > 1 THEN (* Coding part *) rounds := 6 + 52 DIV n; sum := 0; z := v[n - 1]; REPEAT sum := sum + Delta; e := SYSTEM.VAL(SET, ASR(sum, 2)) * {0..1}; FOR p := 0 TO n - 2 DO y := v[p + 1]; v[p] := v[p] + MX(z, y, sum, p, e, key); z := v[p]; END; y := v[0]; v[n - 1] := v[n - 1] + MX(z, y, sum, n - 1, e, key); z := v[n - 1]; DEC(rounds) UNTIL rounds = 0 ELSIF n < -1 THEN (* Decoding part *) n := -n; rounds := 6 + 52 DIV n; sum := rounds * Delta; y := v[0]; REPEAT e := SYSTEM.VAL(SET, ASR(sum, 2)) * {0..1}; FOR p := n - 1 TO 1 BY -1 DO z := v[p - 1]; v[p] := v[p] - MX(z, y, sum, p, e, key); y := v[p]; END; z := v[n - 1]; v[0] := v[0] - MX(z, y, sum, 0, e, key); y := v[0]; sum := sum - Delta; DEC(rounds) UNTIL rounds = 0 END END BTEA; END XXTEA. MODULE TestXXTEA; IMPORT XXTEA, Texts, Oberon; VAR v: ARRAY 4 OF INTEGER; key: ARRAY 4 OF SET; W: Texts.Writer; PROCEDURE Run*; BEGIN v[0] := 00010203H; v[1] := 04050607H; v[2] := 08090A0BH; v[3] := 0C0D0E0FH; XXTEA.BTEA(v, 4, key); Texts.WriteHex(W, v[0]); Texts.WriteLn(W); Texts.WriteHex(W, v[1]); Texts.WriteLn(W); Texts.WriteHex(W, v[2]); Texts.WriteLn(W); Texts.WriteHex(W, v[3]); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END Run; BEGIN Texts.OpenWriter(W); key[0] := {0,1,2,3}; key[1] := {4,5,6,7}; key[2] := {8,9,10,11}; key[3] := {12,13,14,15} END TestXXTEA.