DIRECTORY GVBasics USING[ maxRNameLength, Password ], Rope USING [ROPE]; RPC: CEDAR DEFINITIONS = BEGIN maxShortStringLength: CARDINAL = 64; ShortSTRING: TYPE = STRING; ShortROPE: TYPE = Rope.ROPE; ShortATOM: TYPE = ATOM; InterfaceName: TYPE = RECORD [ type: ShortROPE _ NIL, -- e.g., "AlpineAccess.Alpine" instance: ShortROPE _ NIL, -- e.g., "MontBlanc.Alpine" version: VersionRange _ matchAllVersions ]; defaultInterfaceName: InterfaceName = []; VersionRange: TYPE = MACHINE DEPENDENT RECORD[first, last: CARDINAL]; matchAllVersions: VersionRange = [1,0]; Zones: TYPE = RECORD [ gc: ZONE _ NIL, heap: UNCOUNTED ZONE _ NIL, mds: MDSZone _ NIL ]; standardZones: Zones = []; maxPrincipalLength: CARDINAL = MIN[maxShortStringLength, GVBasics.maxRNameLength]; Principal: TYPE = ShortROPE; EncryptionKey: TYPE = GVBasics.Password; MakeKey: PROCEDURE [text: Rope.ROPE] RETURNS[EncryptionKey]; Conversation: TYPE = REF ConversationObject; ConversationObject: PRIVATE TYPE; SecurityLevel: TYPE = MACHINE DEPENDENT { none(0), -- unauthenticated, insecure; used for "unencrypted" authOnly(1), -- authenticated, but unencrypted calls ECB(2), -- authenticated, encrypt with ECB mode of DES CBC(3), -- authenticated, encrypt with CBC mode of DES CBCCheck(4) -- authenticated, encrypt with CBC mode of DES + checksum }; ConversationLevel: TYPE = SecurityLevel[authOnly..CBCCheck]; unencrypted: Conversation = NIL; GenerateConversation: PROC RETURNS[Conversation]; StartConversation: PROCEDURE[ caller: Principal, key: EncryptionKey, callee: Principal, level: ConversationLevel ] RETURNS[conversation: Conversation]; EndConversation: PROCEDURE [conversation: Conversation]; GetCaller: PROCEDURE [conversation: Conversation] RETURNS [caller: Principal]; GetLevel: PROCEDURE [conversation: Conversation] RETURNS [level: SecurityLevel]; ConversationID: TYPE[3]; GetConversationID: PROC[conversation: Conversation] RETURNS[id: ConversationID]; AuthenticateFailure: TYPE = { communications, -- couldn't contact authentication server(s) -- badCaller, -- invalid caller name -- badKey, -- incorrect caller password -- badCallee -- invalid callee name -- }; ExportFailure: TYPE = { communications, -- couldn't access binding database -- badType, -- unacceptable interface type name -- badInstance, -- unacceptable interface instance name -- badVersion, -- statically silly version range -- tooMany, -- too many exports for local tables -- badCredentials -- not allowed to change the database -- }; ImportFailure: TYPE = { communications, -- couldn't access binding database -- badType, -- unacceptable interface type name -- badInstance, -- unacceptable interface instance name -- badVersion, -- statically silly version range -- wrongVersion, -- exported version not in req'd range -- unbound, -- this instance not exported -- stubProtocol -- exporter protocol incompatible with importer -- }; CallFailure: TYPE = { timeout, -- no acknowledgement within reasonable time -- unbound, -- server no longer exports the interface -- busy, -- server says it's too busy -- runtimeProtocol, -- user/server runtimes don't understand each other -- stubProtocol -- user/server stubs don't understand each other -- }; AuthenticateFailed: ERROR[why: AuthenticateFailure]; ExportFailed: ERROR[why: ExportFailure]; ImportFailed: ERROR[why: ImportFailure]; CallFailed: SIGNAL[why: CallFailure]; END. âRPC is the Cedar interface to the RPC runtime. RPC.mesa Last Edited by: Birrell, September 7, 1983 3:20 pm Last Edited by: BZM 29-Oct-81 11:46:31 Last Edited by: Taft 6-Oct-81 18:35:28 Short string/rope/atom types. Used only by Lupine clients. Types for Import and Export calls. client-defined, closed interval importer: use any version; exporter: no versioning implied Parameter storage zones. Used only by Lupine clients. Encryption and Authentication facilities. Limit on length of ropes used for Principal names Name of authentication principal DES key Dummy conversation; may be passed to RPC runtime. GetConversationID[unencrypted] = ERROR; GetCaller[unencrypted] = NIL; GetLevel[unencrypted] = none; Returns a handle for a previously unused Conversation. This conversation is only for local use, it must not be passed to the RPC runtime. GetConversationID[GenerateConversation[]] = unique ID; GetCaller[GenerateConversation[]] = NIL; GetLevel[GenerateConversation[]] = "none"; Obtains authenticator for conversation, registers it with runtime, and allocates ConversationID Terminates use of this conversation Returns the caller name for a current call. Result is NIL if conversation's security level is "none" (including conversation = "unencrypted"). UID allocated by initiator host Returns permanently unique ID of this conversation Public signals: Raised by StartConversation Raised by ExportInterface Raised by ImportInterface Raised by any remote call; only why=timeout is resumable Ê"˜Jšœ.™.Jšœ™J˜J™2Jšœ&™&Jšœ&™&J˜šÏk ˜ Jšœ œ˜+Jšœœœ˜J˜—Jšœœ œ˜J˜Jš˜J˜Jšœ:™:˜Jšœœ˜$J˜Jšœ œœ˜Jšœ œœ˜Jšœ œœ˜J˜J˜—Jšœ"™"˜šœœœ˜JšœœÏc˜:Jšœœž˜7J˜+—J˜J˜)J˜š œœœ œœœ˜EJšœ™—J˜˜'Jšœ;™;—J˜J˜—Jšœ6™6˜šœœœ˜Jšœœœ˜Jšœ œœœ˜Jšœœ˜—J˜J˜J˜J˜—Jšœ)™)˜šœœœ0˜RJšœ1™1—J˜šœ œ ˜Jšœ ™ —J˜šœœ˜(Jšœ™—J˜JšÏnœ œ œœ˜