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. ĐRPC: Internal interface RPCInternal.mesa Andrew Birrell September 7, 1983 4:12 pm ******** 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 Ęv˜Jšœ™Jšœ™Jšœ*™*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˜—…—ź