-- RPC: Veneer over MesaMesaRPC.mesa for Cedar's benefit
-- File [Ivy]<Birrell>RPC>CedarRPCImpl.mesa
-- Andrew Birrell July 6, 1982 3:42 pm
-- BZM 29-Oct-81 11:46:31
-- Taft 6-Oct-81 18:35:28
DIRECTORY
BodyDefs USING [Password],
RPC USING [EncryptionKey, Principal],
ConvertUnsafe USING [AppendRope, ToRope],
Rope USING [Length, ROPE],
MesaRPC USING [AuthenticateFailed, Conversation, ConversationLevel,
GetCaller, MakeKey, maxPrincipalLength, StartConversation];
CedarRPCImpl: PROGRAM
IMPORTS ConvertUnsafe, Rope, MesaRPC
EXPORTS RPC =
BEGIN
MakeKey: PUBLIC PROC [text: Rope.ROPE] RETURNS[RPC.EncryptionKey] =
BEGIN
p: STRING = [64];
ConvertUnsafe.AppendRope[p,text];
RETURN[MesaRPC.MakeKey[p]]
END;
StartConversation: PUBLIC PROC[caller: RPC.Principal,
key: RPC.EncryptionKey,
callee: RPC.Principal,
level: MesaRPC.ConversationLevel ]
RETURNS[conversation: MesaRPC.Conversation] =
BEGIN
callerString: STRING = [MesaRPC.maxPrincipalLength];
calleeString: STRING = [MesaRPC.maxPrincipalLength];
IF Rope.Length[caller] > MesaRPC.maxPrincipalLength
THEN ERROR MesaRPC.AuthenticateFailed[badCaller];
IF Rope.Length[callee] > MesaRPC.maxPrincipalLength
THEN ERROR MesaRPC.AuthenticateFailed[badCallee];
ConvertUnsafe.AppendRope[to: callerString, from: caller];
ConvertUnsafe.AppendRope[to: calleeString, from: callee];
RETURN[ MesaRPC.StartConversation[callerString, key, calleeString, level] ];
END;
GetCaller: PUBLIC PROC[conversation: MesaRPC.Conversation]
RETURNS[caller: RPC.Principal] =
{ RETURN[ ConvertUnsafe.ToRope[from: MesaRPC.GetCaller[conversation]] ] };
END.