windows-nt/Source/XPSP1/NT/ds/security/protocols/schannel/inc/pct1msg.h
2020-09-26 16:20:57 +08:00

342 lines
10 KiB
C

/*-----------------------------------------------------------------------------
* 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__ */