-- Copyright (C) 1981, 1984 by Xerox Corporation. All rights reserved. -- MesaRPC.mesa, HGM, 21-Jan-84 21:39:48 -- Cedar 5, HGM, 21-Jan-84 20:35:44 -- MesaRPC.mesa is the Mesa-compatible public interface to the RPC runtime. -- RPC.mesa defines the Cedar-compatible interface. -- Andrew Birrell 3-Dec-81 10:12:00 -- BZM 29-Oct-81 11:45:47 DIRECTORY BodyDefs USING [maxRNameLength, Password]; MesaRPC: DEFINITIONS = BEGIN -- Short string types. Used only by Lupine clients. maxShortStringLength: CARDINAL = 64; -- Maximum length of ShortSTRING values. ShortSTRING: TYPE = LONG STRING; -- Types for Import/Export calls InterfaceName: TYPE = RECORD [ type: ShortSTRING ← NIL, -- e.g. "AlpineAccess.Alpine" instance: ShortSTRING ← NIL, -- e.g. "MontBlanc.Alpine" version: VersionRange ← matchAllVersions]; defaultInterfaceName: InterfaceName = []; VersionRange: TYPE = MACHINE DEPENDENT RECORD [first, last: CARDINAL]; -- client-defined, closed interval matchAllVersions: VersionRange = [1, 0]; -- importer: use any version; exporter: no versioning implied -- Parameter storage zones. Used only by Lupine clients, not the runtime. Zones: TYPE = RECORD [gc, heap: UNCOUNTED ZONE ← NIL, mds: MDSZone ← NIL]; standardZones: Zones = []; -- Encryption and Authentication facilities maxPrincipalLength: CARDINAL = MIN[ -- Limit on length of strings used for Principal maxShortStringLength, BodyDefs.maxRNameLength]; Principal: TYPE = ShortSTRING; -- Name of authentication principal EncryptionKey: TYPE = BodyDefs.Password; -- DES key MakeKey: PROC [text: LONG STRING] RETURNS [EncryptionKey]; Conversation: TYPE = LONG POINTER TO 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; -- Dummy conversation; may be passed to RPC runtime. -- GetConversationID[unencrypted] = ERROR; -- GetCaller[unencrypted] = NIL; -- GetLevel[unencrypted] = none; GenerateConversation: PROC RETURNS [Conversation]; -- 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; StartConversation: PROC [ caller: Principal, key: EncryptionKey, callee: Principal, level: ConversationLevel] RETURNS [conversation: Conversation]; -- Obtains authenticator for conversation, registers it with runtime, -- and allocates ConversationID EndConversation: PROC [conversation: Conversation]; -- Terminates use of this conversation GetCaller: PROC [conversation: Conversation] RETURNS [caller: Principal]; -- Returns the caller name for a current call. The result -- string has lifetime at least equal to the duration of the -- call. Result is NIL if conversation's security level is "none" (including -- conversation = "unencrypted"). GetLevel: PROC [conversation: Conversation] RETURNS [level: SecurityLevel]; ConversationID: TYPE [3]; -- UID allocated by initiator host GetConversationID: PROC [conversation: Conversation] RETURNS [id: ConversationID]; -- Returns permanently unique ID of this conversation -- Public signals 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]; -- Raised by StartConversation ExportFailed: ERROR [why: ExportFailure]; -- Raised by ExportInterface ImportFailed: ERROR [why: ImportFailure]; -- Raised by ImportInterface CallFailed: SIGNAL [why: CallFailure]; -- Raised by any remote call; only why=timeout is resumable END.