//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1995.
//
//  File:       keyexch.h
//
//  Contents:   
//
//  Classes:
//
//  Functions:
//
//  History:    10-21-97   jbanes   CAPI integration.
//
//----------------------------------------------------------------------------

#ifndef __KEYEXCH_H__
#define __KEYEXCH_H__

typedef struct _SPContext SPContext;

typedef struct _PUBLICKEY
{
    BLOBHEADER *     pPublic;
    DWORD            cbPublic;
//    CRYPT_OBJID_BLOB Parameters;

} PUBLICKEY, *PPUBLICKEY;


SP_STATUS
MakeSessionKeys(
    SPContext * pContext,
    HCRYPTPROV  hProv, 
    HCRYPTKEY   hMasterKey);
 
VOID
ReverseMemCopy(
    PUCHAR      Dest,
    PUCHAR      Source,
    ULONG       Size) ;

void ReverseInPlace(PUCHAR pByte, DWORD cbByte);


typedef 
SP_STATUS 
 (WINAPI * GenerateServerExchangeValueFn)(
    SPContext     * pContext,               // in
    PUCHAR          pServerExchangeValue,   // out 
    DWORD *         pcbServerExchangeValue  // in/out
    );

typedef
SP_STATUS 
  (WINAPI * GenerateClientExchangeValueFn)(
    SPContext     * pContext,               // in / out
    PUCHAR          pServerExchangeValue,   // in 
    DWORD           pcbServerExchangeValue, // in
    PUCHAR          pClientClearValue,      // out 
    DWORD *         pcbClientClearValue,    // in/out
    PUCHAR          pClientExchangeValue,   // out 
    DWORD *         pcbClientExchangeValue  // in/out
    );

typedef
SP_STATUS
  (WINAPI * GenerateServerMasterKeyFn)(
    SPContext     * pContext,               // in
    PUCHAR          pClientClearValue,      // in
    DWORD           cbClientClearValue,     // in
    PUCHAR          pClientExchangeValue,   // in
    DWORD           cbClientExchangeValue   // in
    );


typedef struct _KeyExchangeSystem {
    DWORD           Type;
    PSTR            pszName;
//    PrivateFromBlobFn               PrivateFromBlob;
    GenerateServerExchangeValueFn   GenerateServerExchangeValue;
    GenerateClientExchangeValueFn   GenerateClientExchangeValue;
    GenerateServerMasterKeyFn       GenerateServerMasterKey;
} KeyExchangeSystem, * PKeyExchangeSystem;


typedef struct kexchtoalg {
    ALG_ID  idAlg;
    KeyExchangeSystem *System;
} AlgToExch;

extern AlgToExch g_AlgToExchMapping[];
extern int g_iAlgToExchMappings;


#define DSA_SIGNATURE_SIZE      40
#define MAX_DSA_ENCODED_SIGNATURE_SIZE (DSA_SIGNATURE_SIZE + 100)

#define MAGIC_DSS1 ((DWORD)'D' + ((DWORD)'S'<<8) + ((DWORD)'S'<<16) + ((DWORD)'1'<<24))
#define MAGIC_DSS2 ((DWORD)'D' + ((DWORD)'S'<<8) + ((DWORD)'S'<<16) + ((DWORD)'2'<<24))
#define MAGIC_DSS3 ((DWORD)'D' + ((DWORD)'S'<<8) + ((DWORD)'S'<<16) + ((DWORD)'3'<<24))
#define MAGIC_DH1  (             ((DWORD)'D'<<8) + ((DWORD)'H'<<16) + ((DWORD)'1'<<24))


/*
 * instantiations of systems
 */

extern KeyExchangeSystem keyexchPKCS;
extern KeyExchangeSystem keyexchDH;


// PROV_RSA_SCHANNEL handle used when building ClientHello messages.
extern HCRYPTPROV           g_hRsaSchannel;
extern PROV_ENUMALGS_EX *   g_pRsaSchannelAlgs;
extern DWORD                g_cRsaSchannelAlgs;

// PROV_DH_SCHANNEL handle used for client and server operations. This is 
// where the schannel ephemeral DH key lives.
extern HCRYPTPROV           g_hDhSchannelProv;
extern PROV_ENUMALGS_EX *   g_pDhSchannelAlgs;
extern DWORD                g_cDhSchannelAlgs;


#endif /* __KEYEXCH_H__ */