DIRECTORY BufferDefs USING[ PupBuffer ], DESFace USING[ Block, IV, Key ], RPC USING[ Conversation, InterfaceName, Principal, SecurityLevel, VersionRange ], RPCLupine USING[ DataLength, Dispatcher, RPCPkt], RPCPkt USING[ CallCount, ConnectionID, ConversationID, DispatcherDetails, DispatcherID, ExportHandle, Header, PktConversationID, PktID, Machine]; RPCInternal: DEFINITIONS = BEGIN RPCBinding: PROGRAM; RPCSecurity: PROGRAM; RPCPktStreams: PROGRAM; ExportInstance: TYPE = RECORD[ id: RPCPkt.DispatcherID, dispatcher: RPCLupine.Dispatcher, mds: CARDINAL, name: RPC.InterfaceName, stubProtocol: RPC.VersionRange ]; ExportTable: TYPE = RECORD[ used: CARDINAL, entries: SEQUENCE length: RPCPkt.ExportHandle OF ExportInstance]; exportTable: REF ExportTable; ImportInstance: TYPE = RECORD[ host: RPCPkt.Machine, dispatcher: RPCPkt.DispatcherDetails ]; ConversationObject: TYPE = RECORD[ next: REF ConversationObject, id: RPCPkt.ConversationID, level: RPC.SecurityLevel, key: DESFace.Key, -- conversation key -- iv: DESFace.IV, originator: RPC.Principal, responder: RPC.Principal, authenticator: Authenticator]; Authenticator: TYPE = REF AuthenticatorObject; AuthenticatorObject: TYPE = RECORD[ SEQUENCE nBlks: CARDINAL OF DESFace.Block ]; firstConversation: RPCPkt.PktConversationID; -- for unencrypted conversations -- EncryptPkt: PROC[pkt: RPCLupine.RPCPkt, l: RPCLupine.DataLength] RETURNS[CARDINAL]; DecryptPkt: PROC[header: LONG POINTER TO RPCPkt.Header, convHandle: RPC.Conversation] RETURNS[ok: BOOLEAN, l: RPCLupine.DataLength]; GetConnectionState: PROC[ decrypted: BOOLEAN, callPkt: RPCLupine.RPCPkt] RETURNS[ ok: BOOLEAN, id: RPCPkt.ConnectionID, call: RPCPkt.CallCount, conv: RPC.Conversation, l: RPCLupine.DataLength ]; ReplyToRFA: PROC[b: BufferDefs.PupBuffer,-- incoming packet -- callHeader: LONG POINTER TO RPCPkt.Header, -- encrypted -- callPktID: RPCPkt.PktID-- clear --, convHandle: RPC.Conversation] RETURNS[BOOLEAN]; DoSignal: PROC[b: BufferDefs.PupBuffer, pktLength: RPCLupine.DataLength, signalHandler: RPCLupine.Dispatcher, convHandle: RPC.Conversation] RETURNS[resumePkt: RPCLupine.RPCPkt, resumeLength: RPCLupine.DataLength, myLocalFrame: POINTER]; ServerMain: PROCEDURE; END. :RPCInternal.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. RPC: Internal interface Andrew Birrell September 7, 1983 4:12 pm Bob Hagmann February 8, 1985 3:33:38 pm PST ******** Modules for start-up sequence. Main control is RPCPktIO ******** ******** Binding: exported by RPCBinding ******** Exporter's record of exported interface Importer's record of successful binding ******** Authentication/Security: exported by RPCSecurity ******** Allocated storage for an authenticator. For A talking to B using key CK, contains: {KY}KB, spare, { {CK}KB, spare, time, A }KY . The keys are single cipher blocks. The rest is encrypted with CBC-check using a zero IV Encrypts packet using pkt.convHandle; "l" is data length of pkt; returns Pup length of packet. Decrypts packet using pkt.convHandle; ok iff checksum matches; returns data length of packet On entry, packet is decrypted iff "decrypted". On exit, packet is decrypted if "ok". If "ok" and not "decrypted", returns pkt data length in "l". Sends RFA and accepts response; results valid iff "ok" Generates RFA response packet if request matches thisPktID ******** Packet stream functions: exported by RPCPktStream ******** Called from inside PktExchange to handle signal-back packets FORK'ed when needed by RPCPktIO, to maintain an adequate stock of them Κ‘˜headšœ™Icodešœ Οmœ1™<—šœ™Jšœ*™*L™+—J˜šΟk ˜ Jšœ žœ˜Jšœžœ žœ˜ JšœžœH˜QJšœ žœ"˜1Jšœžœ…˜‘J˜—Jšœ ž œ˜J˜Jšž˜J˜JšœJ™J˜Jšœžœ˜Jšœžœ˜Jšœžœ˜J˜J˜J˜—Jšœ2™2˜šœžœžœ˜Jšœ'™'J˜J˜!Jšœžœ˜J˜J˜!—J˜šœ žœžœ˜Jšœžœ˜Jšœ žœžœ˜A—J˜Jšœ žœ ˜J˜šœžœžœ˜Jšœ'™'J˜J˜'—J˜J˜J˜—JšœB™B˜šœžœžœ˜"Jšœžœ˜J˜J˜JšœΟc˜(Jšœ žœ˜J˜J˜Jšœ˜—J˜Jšœžœžœ˜.J˜šœžœžœ˜#Jšœ-žœ žœ žœ žœžœ žœžœžœžœAžœž™ΩJšžœžœžœ˜,—J˜Jšœ-Ÿ#˜PJ˜šΟn œžœ0˜@Jšžœžœ˜Jšœ@Ÿ™^—J˜š   œžœ žœžœžœ˜7J˜Jšžœžœ˜.Jšœ>Ÿ™\—J˜š œžœ žœ˜Hšžœžœ˜J˜J˜J˜J˜—Jšœ“Ÿ8™Λ—J˜š  œžœŸ˜>Jšœ žœžœžœŸ˜:JšœŸ œ˜#J˜Jšžœžœ˜Jšœ:™:—J˜J˜J˜—JšœC™C˜š œžœ:˜HJ˜$J˜šžœ˜$J˜#Jšœžœ˜—Jšœ<™<—J˜š  œž œ˜JšœF™F—J˜—Jšžœ˜J˜—…—Ό‡