On 2019-09-29 01:21,
[email protected] wrote:
You can use SYSTEM.VAL to typecast an INTEGER to a SET.
Ah, of course. Thanks! Below is my implementation in Oberon. Is there a
more efficient way to implement logical right shift?
MODULE Tea;
(**Tiny Encryption Algorithm*)
IMPORT SYSTEM;
PROCEDURE Bits(x: INTEGER): SET;
RETURN SYSTEM.VAL(SET, x)
END Bits;
PROCEDURE Lsr(x, n: INTEGER): INTEGER; (*logical shift right*)
RETURN ORD(Bits(ROR(x, n)) - {32 - n .. 31})
END Lsr;
PROCEDURE Encrypt*(k0, k1, k2, k3: INTEGER; VAR v0, v1: INTEGER);
CONST delta = 9E3779B9H;
VAR sum, i: INTEGER;
BEGIN
sum := 0;
FOR i := 0 TO 31 DO
INC(sum, delta);
INC(v0, ORD(Bits(LSL(v1, 4) + k0) / Bits(v1 + sum) / Bits(Lsr(v1, 5)
+ k1)));
INC(v1, ORD(Bits(LSL(v0, 4) + k2) / Bits(v0 + sum) / Bits(Lsr(v0, 5)
+ k3)))
END
END Encrypt;
PROCEDURE Decrypt*(k0, k1, k2, k3: INTEGER; VAR v0, v1: INTEGER);
CONST delta = 9E3779B9H;
VAR sum, i: INTEGER;
BEGIN
sum := 0C6EF3720H;
FOR i := 0 TO 31 DO
DEC(v1, ORD(Bits(LSL(v0, 4) + k2) / Bits(v0 + sum) / Bits(Lsr(v0, 5)
+ k3)));
DEC(v0, ORD(Bits(LSL(v1, 4) + k0) / Bits(v1 + sum) / Bits(Lsr(v1, 5)
+ k1)));
DEC(sum, delta)
END
END Decrypt;
BEGIN
ASSERT(SYSTEM.SIZE(INTEGER) = 4);
ASSERT(SYSTEM.SIZE(SET) = 4)
END Tea.
-- August
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)