-- AuthenticationP14V2ServerImpl.Mesa
	-- Copyright (C) 1986 by Xerox Corporation.  All rights reserved.
	-- Generated by demers.pa at October 7, 1986 9:23:33 am PDT
	--  using Sirocco [1.0] of September 25, 1986 3:44:23 am PDT
	
DIRECTORY
	CrRPC,
	TimeP15V2,
	CHNameP2V0,
	AuthenticationP14V2;

AuthenticationP14V2ServerImpl: CEDAR PROGRAM
	IMPORTS CrRPC, AuthenticationP14V2 ~ {
	OPEN AuthenticationP14V2;

Server: CrRPC.ServerProc ~ {
	-- [h: Handle, pgm: CARD, pgmVersion: CARDINAL, proc: CARDINAL, beginReturn: BeginReturnProc, beginError: BeginErrorProc, beginReject: BeginRejectProc]
	
	ENABLE {
		AuthenticationP14V2.CallError => { -- (1)
			beginError[h, 1];
			CrRPC.PutCARDINAL[h, ORD[problem]];
			CrRPC.PutCARDINAL[h, ORD[whichArg]];
			GO TO Finished;
			};
		AuthenticationP14V2.AuthenticationError => { -- (2)
			beginError[h, 2];
			CrRPC.PutCARDINAL[h, ORD[problem]];
			GO TO Finished;
			};
		};
	
	IF (pgmVersion # 2) THEN {
		beginReject[h, CrRPC.noSuchVersion];
		CrRPC.PutCARDINAL[h, 2]; --low
		CrRPC.PutCARDINAL[h, 2]; --high
		RETURN
		};
	
	SELECT proc FROM
		2 => { -- CheckSimpleCredentials
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			ok: BOOLEAN;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			
			[ok] ← CheckSimpleCredentials[h, credentials, verifier];
			
			beginReturn[h];
			
			CrRPC.PutBOOL[h, ok];
			};
		4 => { -- ChangeStrongKey
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			newKey: AuthenticationP14V2.Block;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			FOR i0: CARDINAL IN [0..4) DO
				newKey[i0] ← CrRPC.GetCARDINAL[h];
				ENDLOOP;
			
			[] ← ChangeStrongKey[h, credentials, verifier, newKey];
			
			beginReturn[h];
			
			};
		5 => { -- DeleteStrongKey
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			name: CHNameP2V0.ThreePartName;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			name.organization ← CrRPC.GetROPE[h];
			name.domain ← CrRPC.GetROPE[h];
			name.object ← CrRPC.GetROPE[h];
			
			[] ← DeleteStrongKey[h, credentials, verifier, name];
			
			beginReturn[h];
			
			};
		3 => { -- CreateStrongKey
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			name: CHNameP2V0.ThreePartName;
			key: AuthenticationP14V2.Block;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			name.organization ← CrRPC.GetROPE[h];
			name.domain ← CrRPC.GetROPE[h];
			name.object ← CrRPC.GetROPE[h];
			FOR i0: CARDINAL IN [0..4) DO
				key[i0] ← CrRPC.GetCARDINAL[h];
				ENDLOOP;
			
			[] ← CreateStrongKey[h, credentials, verifier, name, key];
			
			beginReturn[h];
			
			};
		7 => { -- ChangeSimpleKey
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			newKey: CARDINAL;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			newKey ← CrRPC.GetCARDINAL[h];
			
			[] ← ChangeSimpleKey[h, credentials, verifier, newKey];
			
			beginReturn[h];
			
			};
		8 => { -- DeleteSimpleKey
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			name: CHNameP2V0.ThreePartName;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			name.organization ← CrRPC.GetROPE[h];
			name.domain ← CrRPC.GetROPE[h];
			name.object ← CrRPC.GetROPE[h];
			
			[] ← DeleteSimpleKey[h, credentials, verifier, name];
			
			beginReturn[h];
			
			};
		6 => { -- CreateSimpleKey
			credentials: AuthenticationP14V2.Credentials;
			verifier: AuthenticationP14V2.SeqWords;
			name: CHNameP2V0.ThreePartName;
			key: CARDINAL;
			
			credentials.type ← VAL[CrRPC.GetCARDINAL[h]];
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				credentials.value ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					credentials.value.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			{
				length1: CARDINAL ~ CrRPC.GetCARDINAL[h];
				verifier ←  NEW[AuthenticationP14V2.SeqWordsObject[length1]];
				FOR i0: CARDINAL IN [0..length1) DO
					verifier.body[i0] ← CrRPC.GetCARDINAL[h];
					ENDLOOP;
				};
			name.organization ← CrRPC.GetROPE[h];
			name.domain ← CrRPC.GetROPE[h];
			name.object ← CrRPC.GetROPE[h];
			key ← CrRPC.GetCARDINAL[h];
			
			[] ← CreateSimpleKey[h, credentials, verifier, name, key];
			
			beginReturn[h];
			
			};
		1 => { -- GetStrongCredentials
			initiator: CHNameP2V0.ThreePartName;
			recipient: CHNameP2V0.ThreePartName;
			nonce: CARD;
			encryptedCredentialsPackage: AuthenticationP14V2.SeqWords;
			
			initiator.organization ← CrRPC.GetROPE[h];
			initiator.domain ← CrRPC.GetROPE[h];
			initiator.object ← CrRPC.GetROPE[h];
			recipient.organization ← CrRPC.GetROPE[h];
			recipient.domain ← CrRPC.GetROPE[h];
			recipient.object ← CrRPC.GetROPE[h];
			nonce ← CrRPC.GetCARD[h];
			
			[encryptedCredentialsPackage] ← GetStrongCredentials[h, initiator, recipient, nonce];
			
			beginReturn[h];
			
			CrRPC.PutCARDINAL[h, encryptedCredentialsPackage.length];
			FOR i0: CARDINAL IN [0..encryptedCredentialsPackage.length) DO
				CrRPC.PutCARDINAL[h, encryptedCredentialsPackage.body[i0]];
				ENDLOOP;
			};
		ENDCASE => {
			beginReject[h, CrRPC.noSuchProcedure];
			};
	
	EXITS
		Finished => { NULL };
	};

	CrRPC.RegisterServerProc[pgm~14, serverProc~Server, pgmVersion~2];
	CrRPC.EnsureListener[class~$SPP];
}...