|
|
/*-----------------------------------------------------------------------------
* Copyright (C) Microsoft Corporation, 1995 - 1996. * All rights reserved. * * This file is part of the Microsoft Private Communication Technology * reference implementation, version 1.0 * * The Private Communication Technology reference implementation, version 1.0 * ("PCTRef"), is being provided by Microsoft to encourage the development and * enhancement of an open standard for secure general-purpose business and * personal communications on open networks. Microsoft is distributing PCTRef * at no charge irrespective of whether you use PCTRef for non-commercial or * commercial use. * * Microsoft expressly disclaims any warranty for PCTRef and all derivatives of * it. PCTRef and any related documentation is provided "as is" without * warranty of any kind, either express or implied, including, without * limitation, the implied warranties or merchantability, fitness for a * particular purpose, or noninfringement. Microsoft shall have no obligation * to provide maintenance, support, upgrades or new releases to you or to anyone * receiving from you PCTRef or your modifications. The entire risk arising out * of use or performance of PCTRef remains with you. * * Please see the file LICENSE.txt, * or http://pct.microsoft.com/pct/pctlicen.txt
* for more information on licensing. * * Please see http://pct.microsoft.com/pct/pct.htm for The Private
* Communication Technology Specification version 1.0 ("PCT Specification") * * 1/23/96 *----------------------------------------------------------------------------*/
#ifndef __PCT1MSG_H__
#define __PCT1MSG_H__
#define PCT_CH_OFFSET_V1 (WORD)10
#define PCT_VERSION_1 (WORD)0x8001
/* message type codes */ #define PCT1_MSG_NOMSG 0x00
#define PCT1_MSG_CLIENT_HELLO 0x01
#define PCT1_MSG_SERVER_HELLO 0x02
#define PCT1_MSG_CLIENT_MASTER_KEY 0x03
#define PCT1_MSG_SERVER_VERIFY 0x04
#define PCT1_MSG_ERROR 0x05
#define PCT1_ET_OOB_DATA 0x01
#define PCT1_ET_REDO_CONN 0x02
#define PCT1_SESSION_ID_SIZE 32
#define PCT1_CHALLENGE_SIZE 32
#define PCT1_MASTER_KEY_SIZE 16
#define PCT1_RESPONSE_SIZE 32
#define PCT1_MAX_MESSAGE_LENGTH 0x3f00
#define PCT1_MAX_CLIENT_HELLO 256
#define PCT1_CERT_TYPE_FROM_CAPI2(s) X509_ASN_ENCODING
/*
* * Useful Macros * */
#define LSBOF(x) ((UCHAR) ((x) & 0xFF))
#define MSBOF(x) ((UCHAR) (((x) >> 8) & 0xFF) )
#define COMBINEBYTES(Msb, Lsb) ((DWORD) (((DWORD) (Msb) << 8) | (DWORD) (Lsb)))
/* external representations of algorithm specs */
typedef DWORD ExtCipherSpec, *PExtCipherSpec; typedef WORD ExtHashSpec, *PExtHashSpec; typedef WORD ExtCertSpec, *PExtCertSpec; typedef WORD ExtExchSpec, *PExtExchSpec; typedef WORD ExtSigSpec, *PExtSigSpec;
typedef struct _Pct1CipherMap { ALG_ID aiCipher; DWORD dwStrength; CipherSpec Spec; } Pct1CipherMap, *PPct1CipherMap;
typedef struct _Pct1HashMap { ALG_ID aiHash; CipherSpec Spec; } Pct1HashMap, *PPct1HashMap;
extern Pct1CipherMap Pct1CipherRank[]; extern DWORD Pct1NumCipher;
/* available hashes, in order of preference */ extern Pct1HashMap Pct1HashRank[]; extern DWORD Pct1NumHash;
extern CertTypeMap aPct1CertEncodingPref[]; extern DWORD cPct1CertEncodingPref;
extern KeyTypeMap aPct1LocalExchKeyPref[];
extern DWORD cPct1LocalExchKeyPref;
extern KeyTypeMap aPct1LocalSigKeyPref[]; extern DWORD cPct1LocalSigKeyPref;
typedef struct _PCT1_MESSAGE_HEADER { UCHAR Byte0; UCHAR Byte1; } PCT1_MESSAGE_HEADER, * PPCT1_MESSAGE_HEADER;
typedef struct _PCT1_MESSAGE_HEADER_EX { UCHAR Byte0; UCHAR Byte1; UCHAR PaddingSize; } PCT1_MESSAGE_HEADER_EX, * PPCT1_MESSAGE_HEADER_EX;
typedef struct _PCT1_ERROR { PCT1_MESSAGE_HEADER Header; UCHAR MessageId; UCHAR ErrorMsb; UCHAR ErrorLsb; UCHAR ErrorInfoMsb; UCHAR ErrorInfoLsb; UCHAR VariantData[1]; } PCT1_ERROR, * PPCT1_ERROR;
typedef struct _PCT1_CLIENT_HELLO { PCT1_MESSAGE_HEADER Header; UCHAR MessageId; UCHAR VersionMsb; UCHAR VersionLsb; UCHAR Pad; UCHAR SessionIdData[PCT1_SESSION_ID_SIZE]; UCHAR ChallengeData[PCT1_CHALLENGE_SIZE]; UCHAR OffsetMsb; UCHAR OffsetLsb; UCHAR CipherSpecsLenMsb; UCHAR CipherSpecsLenLsb; UCHAR HashSpecsLenMsb; UCHAR HashSpecsLenLsb; UCHAR CertSpecsLenMsb; UCHAR CertSpecsLenLsb; UCHAR ExchSpecsLenMsb; UCHAR ExchSpecsLenLsb; UCHAR KeyArgLenMsb; UCHAR KeyArgLenLsb; UCHAR VariantData[1]; } PCT1_CLIENT_HELLO, * PPCT1_CLIENT_HELLO;
typedef struct _PCT1_SERVER_HELLO { PCT1_MESSAGE_HEADER Header; UCHAR MessageId; UCHAR Pad; UCHAR ServerVersionMsb; UCHAR ServerVersionLsb; UCHAR RestartSessionOK; UCHAR ClientAuthReq; ExtCipherSpec CipherSpecData; ExtHashSpec HashSpecData; ExtCertSpec CertSpecData; ExtExchSpec ExchSpecData; UCHAR ConnectionIdData[PCT1_SESSION_ID_SIZE]; UCHAR CertificateLenMsb; UCHAR CertificateLenLsb; UCHAR CertSpecsLenMsb; UCHAR CertSpecsLenLsb; UCHAR ClientSigSpecsLenMsb; UCHAR ClientSigSpecsLenLsb; UCHAR ResponseLenMsb; UCHAR ResponseLenLsb; UCHAR VariantData[1]; } PCT1_SERVER_HELLO, * PPCT1_SERVER_HELLO;
typedef struct _PCT1_CLIENT_MASTER_KEY { PCT1_MESSAGE_HEADER Header; UCHAR MessageId; UCHAR Pad; ExtCertSpec ClientCertSpecData; ExtSigSpec ClientSigSpecData; UCHAR ClearKeyLenMsb; UCHAR ClearKeyLenLsb; UCHAR EncryptedKeyLenMsb; UCHAR EncryptedKeyLenLsb; UCHAR KeyArgLenMsb; UCHAR KeyArgLenLsb; UCHAR VerifyPreludeLenMsb; UCHAR VerifyPreludeLenLsb; UCHAR ClientCertLenMsb; UCHAR ClientCertLenLsb; UCHAR ResponseLenMsb; UCHAR ResponseLenLsb; UCHAR VariantData[1]; } PCT1_CLIENT_MASTER_KEY, * PPCT1_CLIENT_MASTER_KEY;
typedef struct _PCT1_SERVER_VERIFY { PCT1_MESSAGE_HEADER Header; UCHAR MessageId; UCHAR Pad; UCHAR SessionIdData[PCT1_SESSION_ID_SIZE]; UCHAR ResponseLenMsb; UCHAR ResponseLenLsb; UCHAR VariantData[1]; } PCT1_SERVER_VERIFY, * PPCT1_SERVER_VERIFY;
/*
* * Expanded Form Messages: * */
typedef struct _Pct1_Error { DWORD Error; DWORD ErrInfoLen; BYTE *ErrInfo; } Pct1Error, *PPct1_Error;
typedef struct _Pct1_Client_Hello { DWORD cCipherSpecs; DWORD cHashSpecs; DWORD cCertSpecs; DWORD cExchSpecs; DWORD cbKeyArgSize; DWORD cbSessionID; DWORD cbChallenge; PUCHAR pKeyArg; CipherSpec * pCipherSpecs; HashSpec * pHashSpecs; CertSpec * pCertSpecs; ExchSpec * pExchSpecs; UCHAR SessionID[PCT1_SESSION_ID_SIZE]; UCHAR Challenge[PCT1_CHALLENGE_SIZE]; } Pct1_Client_Hello, * PPct1_Client_Hello;
typedef struct _Pct1_Server_Hello { DWORD RestartOk; DWORD ClientAuthReq; DWORD CertificateLen; DWORD ResponseLen; DWORD cSigSpecs; DWORD cCertSpecs; DWORD cbConnectionID; UCHAR * pCertificate; CipherSpec SrvCipherSpec; HashSpec SrvHashSpec; CertSpec SrvCertSpec; ExchSpec SrvExchSpec; SigSpec * pClientSigSpecs; CertSpec * pClientCertSpecs; UCHAR ConnectionID[PCT1_SESSION_ID_SIZE]; UCHAR Response[PCT1_RESPONSE_SIZE]; } Pct1_Server_Hello, * PPct1_Server_Hello;
typedef struct _Pct1_Client_Master_Key { DWORD ClearKeyLen; DWORD EncryptedKeyLen; DWORD KeyArgLen; DWORD VerifyPreludeLen; DWORD ClientCertLen; DWORD ResponseLen; CertSpec ClientCertSpec; SigSpec ClientSigSpec; UCHAR ClearKey[PCT1_MASTER_KEY_SIZE]; PBYTE pbEncryptedKey; UCHAR KeyArg[PCT1_MASTER_KEY_SIZE]; PUCHAR pClientCert; PBYTE pbResponse; UCHAR VerifyPrelude[PCT1_RESPONSE_SIZE]; } Pct1_Client_Master_Key, * PPct1_Client_Master_Key;
typedef struct _Pct1_Server_Verify { UCHAR SessionIdData[PCT1_SESSION_ID_SIZE]; DWORD ResponseLen; UCHAR Response[PCT1_RESPONSE_SIZE]; } Pct1_Server_Verify, * PPct1_Server_Verify;
/*
* * Pickling Prototypes * */
SP_STATUS Pct1PackClientHello( PPct1_Client_Hello pCanonical, PSPBuffer pCommOutput);
SP_STATUS Pct1UnpackClientHello( PSPBuffer pInput, PPct1_Client_Hello * ppClient);
SP_STATUS Pct1PackServerHello( PPct1_Server_Hello pCanonical, PSPBuffer pCommOutput);
SP_STATUS Pct1UnpackServerHello( PSPBuffer pInput, PPct1_Server_Hello * ppServer);
SP_STATUS Pct1PackClientMasterKey( PPct1_Client_Master_Key pCanonical, PSPBuffer pCommOutput);
SP_STATUS Pct1UnpackClientMasterKey( PSPBuffer pInput, PPct1_Client_Master_Key * ppClient);
SP_STATUS Pct1PackServerVerify( PPct1_Server_Verify pCanonical, PSPBuffer pCommOutput);
SP_STATUS Pct1UnpackServerVerify( PSPBuffer pInput, PPct1_Server_Verify * ppServer);
SP_STATUS Pct1PackError( PPct1_Error pCanonical, PSPBuffer pCommOutput);
#endif /* __PCT1MSG_H__ */
|