<<>> <> <> <> <> <> DIRECTORY Basics USING [BITXOR, BITSHIFT], RefTab USING [ Create, Delete, Ref, Store ], Rope USING [Fetch, Length, ROPE], RPC ; RPCImpl: CEDAR MONITOR IMPORTS Basics, RefTab, Rope EXPORTS RPC = BEGIN bpw: INT = 2; -- bytes per word on Dorado MakeKey: PUBLIC PROCEDURE [text: Rope.ROPE] RETURNS [RPC.EncryptionKey] = CHECKED { <> key: RPC.EncryptionKey; key ¬ ALL[0]; FOR i: CARD16 IN CARD16[0..Rope.Length[text]) DO j: [0..LENGTH[key]) = (i/bpw) MOD LENGTH[key]; c: WORD = LOOPHOLE[ IF Rope.Fetch[text, i] IN ['A..'Z] THEN Rope.Fetch[text, i] - 'A + 'a ELSE Rope.Fetch[text, i] ]; key[j] ¬ Basics.BITXOR[key[j], Basics.BITSHIFT[c, IF (i MOD 2) = 0 THEN 9 ELSE 1]]; ENDLOOP; RETURN[key]; }; convTable: RefTab.Ref ¬ RefTab.Create[]; n: INT ¬ 0; GenerateConversation: PUBLIC ENTRY PROC RETURNS [RPC.Conversation] ~ { conv: REF INT ¬ NEW[INT ¬ n]; n ¬ n+1; [] ¬ RefTab.Store[x: convTable, key: conv, val: $OK ]; RETURN[conv]; }; EndConversation: PUBLIC ENTRY PROC [conversation: RPC.Conversation] ~ { [] ¬ RefTab.Delete[x: convTable, key: conversation]; }; END.