Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

517 lines
15 KiB

/*++
Copyright (C) Microsoft Corporation, 2001
Module Name:
csplib.h
General Cryptographic Service Provider Library
Abstract:
Author:
Dan Griffin
Notes:
--*/
#ifndef __CSP__LIB__H__
#define __CSP__LIB__H__
#include <windows.h>
#include <wincrypt.h>
#include <cspdk.h>
//
// Hash OID Encodings for PKCS #1 Signing
//
// Reverse ASN.1 Encodings of possible hash identifiers. The leading byte is
// the length of the remaining byte string. The lists of possible identifiers
// is terminated with a '\x00' entry.
//
static const BYTE
*md2Encodings[]
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
= { (CONST BYTE *)"\x12\x10\x04\x00\x05\x02\x02\x0d\xf7\x86\x48\x86\x2a\x08\x06\x0c\x30\x20\x30",
(CONST BYTE *)"\x10\x10\x04\x02\x02\x0d\xf7\x86\x48\x86\x2a\x08\x06\x0a\x30\x1e\x30",
(CONST BYTE *)"\x00" },
*md4Encodings[]
= { (CONST BYTE *)"\x12\x10\x04\x00\x05\x04\x02\x0d\xf7\x86\x48\x86\x2a\x08\x06\x0c\x30\x20\x30",
(CONST BYTE *)"\x10\x10\x04\x04\x02\x0d\xf7\x86\x48\x86\x2a\x08\x06\x0a\x30\x1e\x30",
(CONST BYTE *)"\x00" },
*md5Encodings[]
= { (CONST BYTE *)"\x12\x10\x04\x00\x05\x05\x02\x0d\xf7\x86\x48\x86\x2a\x08\x06\x0c\x30\x20\x30",
(CONST BYTE *)"\x10\x10\x04\x05\x02\x0d\xf7\x86\x48\x86\x2a\x08\x06\x0a\x30\x1e\x30",
// The following encoding which excludes the digest algorithm was added
// for: Nortel V1 Cert Signatures
//
// It can be removed when these type of certificates no longer exist.
//
// Since we only allow the digest OID to be omitted for MD5 there
// isn't a compromise where another algorithm could be substituted.
(CONST BYTE *)"\x02\x10\x04",
(CONST BYTE *)"\x00" },
*shaEncodings[]
= { (CONST BYTE *)"\x0f\x14\x04\x00\x05\x1a\x02\x03\x0e\x2b\x05\x06\x09\x30\x21\x30",
(CONST BYTE *)"\x0d\x14\x04\x1a\x02\x03\x0e\x2b\x05\x06\x07\x30\x1f\x30",
(CONST BYTE *)"\x00"},
*sha256Encodings[]
= { (CONST BYTE *)"\x13\x20\x04\x00\x05\x01\x02\x04\x03\x65\x01\x48\x86\x60\x09\x06\x0d\x30\x31\x30",
(CONST BYTE *)"\x11\x20\x04\x01\x02\x04\x03\x65\x01\x48\x86\x60\x09\x06\x0b\x30\x2f\x30",
(CONST BYTE *)"\x00"},
*sha384Encodings[]
= { (CONST BYTE *)"\x13\x30\x04\x00\x05\x02\x02\x04\x03\x65\x01\x48\x86\x60\x09\x06\x0d\x30\x41\x30",
(CONST BYTE *)"\x11\x30\x04\x02\x02\x04\x03\x65\x01\x48\x86\x60\x09\x06\x0b\x30\x3f\x30",
(CONST BYTE *)"\x00"},
*sha512Encodings[]
= { (CONST BYTE *)"\x13\x40\x04\x00\x05\x03\x02\x04\x03\x65\x01\x48\x86\x60\x09\x06\x0d\x30\x51\x30",
(CONST BYTE *)"\x11\x40\x04\x03\x02\x04\x03\x65\x01\x48\x86\x60\x09\x06\x0b\x30\x4f\x30",
(CONST BYTE *)"\x00"},
*endEncodings[]
= { (CONST BYTE *)"\x00" };
//
// Type: USER_CONTEXT
//
typedef struct _USER_CONTEXT
{
HCRYPTPROV hSupportProv;
//
// The csplib will set this to the string value passed by the
// caller to CryptAcquireContext. For a smartcard CSP, it might
// include a reader name.
//
LPWSTR wszContainerNameFromCaller;
//
// The CSP allocates this string (using CspAllocH) and sets it to
// the name of the key container being used for this context.
//
// The csplib will free this value on CryptReleaseContext.
//
LPWSTR wszBaseContainerName;
BOOL fBaseContainerNameIsRpcUuid;
//
// The CSP allocates this string (using CspAllocH) and sets it to
// the expanded representation of the container name. This may be the
// same as the wszBaseContainerName value.
//
// The csplib will free this value on CryptReleaseContext.
//
LPWSTR wszUniqueContainerName;
DWORD dwFlags;
PVTableProvStrucW pVTableW;
PVOID pvLocalUserContext;
} USER_CONTEXT, *PUSER_CONTEXT;
//
// Type: KEY_CONTEXT
//
typedef struct _KEY_CONTEXT
{
PUSER_CONTEXT pUserContext;
HCRYPTKEY hSupportKey;
DWORD dwFlags;
DWORD cKeyBits;
ALG_ID Algid;
PVOID pvLocalKeyContext;
} KEY_CONTEXT, *PKEY_CONTEXT;
//
// Type: HASH_CONTEXT
//
typedef struct _HASH_CONTEXT
{
PUSER_CONTEXT pUserContext;
HCRYPTHASH hSupportHash;
DWORD dwFlags;
ALG_ID Algid;
PVOID pvLocalHashContext;
} HASH_CONTEXT, *PHASH_CONTEXT;
//
// Type: LOCAL_CALL_INFO
//
typedef BOOL LOCAL_CALL_INFO, *PLOCAL_CALL_INFO;
//
// Function: LocalAcquireContext
//
typedef DWORD (WINAPI *PFN_LOCAL_ACQUIRE_CONTEXT)(
IN OUT PUSER_CONTEXT pUserContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalReleaseContext
//
typedef DWORD (WINAPI *PFN_LOCAL_RELEASE_CONTEXT)(
IN OUT PUSER_CONTEXT pUserContext,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalGenKey
//
typedef DWORD (WINAPI *PFN_LOCAL_GEN_KEY)(
IN OUT PKEY_CONTEXT pKeyContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDeriveKey
//
typedef DWORD (WINAPI *PFN_LOCAL_DERIVE_KEY)(
IN OUT PKEY_CONTEXT pKeyContext,
IN PHASH_CONTEXT pHashContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDestroyKey
//
typedef DWORD (WINAPI *PFN_LOCAL_DESTROY_KEY)(
IN OUT PKEY_CONTEXT pKeyContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalSetKeyParam
//
typedef DWORD (WINAPI *PFN_LOCAL_SET_KEY_PARAM)(
IN PKEY_CONTEXT pKeyContext,
IN DWORD dwParam,
IN PBYTE pbData,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalGetKeyParam
//
typedef DWORD (WINAPI *PFN_LOCAL_GET_KEY_PARAM)(
IN PKEY_CONTEXT pKeyContext,
IN DWORD dwParam,
OUT PBYTE pbData,
IN OUT PDWORD pcbDataLen,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalSetProvParam
//
typedef DWORD (WINAPI *PFN_LOCAL_SET_PROV_PARAM)(
IN PUSER_CONTEXT pUserContext,
IN DWORD dwParam,
IN PBYTE pbData,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalGetProvParam
//
typedef DWORD (WINAPI *PFN_LOCAL_GET_PROV_PARAM)(
IN PUSER_CONTEXT pUserContext,
IN DWORD dwParam,
OUT PBYTE pbData,
IN OUT PDWORD pcbDataLen,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalSetHashParam
//
typedef DWORD (WINAPI *PFN_LOCAL_SET_HASH_PARAM)(
IN PHASH_CONTEXT pHashContext,
IN DWORD dwParam,
IN PBYTE pbData,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalGetHashParam
//
typedef DWORD (WINAPI *PFN_LOCAL_GET_HASH_PARAM)(
IN PHASH_CONTEXT pHashContext,
IN DWORD dwParam,
OUT PBYTE pbData,
IN OUT PDWORD pcbDataLen,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalExportKey
//
typedef DWORD (WINAPI *PFN_LOCAL_EXPORT_KEY)(
IN PKEY_CONTEXT pKeyContext,
IN PKEY_CONTEXT pPubKey,
IN DWORD dwBlobType,
IN DWORD dwFlags,
OUT PBYTE pbData,
IN OUT PDWORD pcbDataLen,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalImportKey
//
typedef DWORD (WINAPI *PFN_LOCAL_IMPORT_KEY)(
IN PKEY_CONTEXT pKeyContext,
IN PBYTE pbData,
IN DWORD cbDataLen,
IN PKEY_CONTEXT pPubKey,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalEncrypt
//
typedef DWORD (WINAPI *PFN_LOCAL_ENCRYPT)(
IN PKEY_CONTEXT pKeyContext,
IN PHASH_CONTEXT pHashContext,
IN BOOL fFinal,
IN DWORD dwFlags,
IN OUT LPBYTE pbData,
IN OUT LPDWORD pcbDataLen,
IN DWORD cbBufLen,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDecrypt
//
typedef DWORD (WINAPI *PFN_LOCAL_DECRYPT)(
IN PKEY_CONTEXT pKeyContext,
IN PHASH_CONTEXT pHashContext,
IN BOOL fFinal,
IN DWORD dwFlags,
IN OUT LPBYTE pbData,
IN OUT LPDWORD pcbDataLen,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalCreateHash
//
typedef DWORD (WINAPI *PFN_LOCAL_CREATE_HASH)(
IN PHASH_CONTEXT pHashContext,
IN PKEY_CONTEXT pKeyContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalHashData
//
typedef DWORD (WINAPI *PFN_LOCAL_HASH_DATA)(
IN PHASH_CONTEXT pHashContext,
IN CONST BYTE *pbData,
IN DWORD cbDataLen,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalHashSessionKey
//
typedef DWORD (WINAPI *PFN_LOCAL_HASH_SESSION_KEY)(
IN PHASH_CONTEXT pHashContext,
IN PKEY_CONTEXT pKeyContext,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalSignHash
//
typedef DWORD (WINAPI *PFN_LOCAL_SIGN_HASH)(
IN PHASH_CONTEXT pHashContext,
IN DWORD dwKeySpec,
IN DWORD dwFlags,
OUT LPBYTE pbSignature,
IN OUT LPDWORD pcbSigLen,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDestroyHash
//
typedef DWORD (WINAPI *PFN_LOCAL_DESTROY_HASH)(
IN PHASH_CONTEXT pHashContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalVerifySignature
//
typedef DWORD (WINAPI *PFN_LOCAL_VERIFY_SIGNATURE)(
IN PHASH_CONTEXT pHashContext,
IN CONST BYTE *pbSignature,
IN DWORD cbSigLen,
IN PKEY_CONTEXT pPubKey,
IN DWORD dwFlags,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalGenRandom
//
typedef DWORD (WINAPI *PFN_LOCAL_GEN_RANDOM)(
IN PUSER_CONTEXT pUserContext,
IN DWORD cbLen,
OUT LPBYTE pbBuffer,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalGetUserKey
//
typedef DWORD (WINAPI *PFN_LOCAL_GET_USER_KEY)(
IN PKEY_CONTEXT pKeyContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDuplicateHash
//
typedef DWORD (WINAPI *PFN_LOCAL_DUPLICATE_HASH)(
IN PHASH_CONTEXT pHashContext,
IN LPDWORD pdwReserved,
IN PHASH_CONTEXT pNewHashContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDuplicateKey
//
typedef DWORD (WINAPI *PFN_LOCAL_DUPLICATE_KEY)(
IN PKEY_CONTEXT pKeyContext,
IN LPDWORD pdwReserved,
IN PKEY_CONTEXT pNewKeyContext,
OUT PLOCAL_CALL_INFO pLocalCallInfo);
//
// Function: LocalDllInitialize
//
typedef BOOL (WINAPI *PFN_LOCAL_DLL_INITIALIZE)(
IN PVOID hmod,
IN ULONG Reason,
IN PCONTEXT Context);
//
// Function: LocalDllRegisterServer
//
typedef DWORD (WINAPI *PFN_LOCAL_DLL_REGISTER_SERVER)(void);
//
// Function: LocalDllUnregisterServer
//
typedef DWORD (WINAPI *PFN_LOCAL_DLL_UNREGISTER_SERVER)(void);
//
// Type: LOCAL_CSP_INFO
//
typedef struct _LOCAL_CSP_INFO
{
//
// Function pointers for the "local" CSP implementation to fill
// in, and be called by the CSP library.
//
PFN_LOCAL_ACQUIRE_CONTEXT pfnLocalAcquireContext; // Required
PFN_LOCAL_RELEASE_CONTEXT pfnLocalReleaseContext; // Required
PFN_LOCAL_GEN_KEY pfnLocalGenKey;
PFN_LOCAL_DERIVE_KEY pfnLocalDeriveKey;
PFN_LOCAL_DESTROY_KEY pfnLocalDestroyKey;
PFN_LOCAL_SET_KEY_PARAM pfnLocalSetKeyParam;
PFN_LOCAL_GET_KEY_PARAM pfnLocalGetKeyParam;
PFN_LOCAL_SET_PROV_PARAM pfnLocalSetProvParam;
PFN_LOCAL_GET_PROV_PARAM pfnLocalGetProvParam;
PFN_LOCAL_SET_HASH_PARAM pfnLocalSetHashParam;
PFN_LOCAL_GET_HASH_PARAM pfnLocalGetHashParam;
PFN_LOCAL_EXPORT_KEY pfnLocalExportKey;
PFN_LOCAL_IMPORT_KEY pfnLocalImportKey;
PFN_LOCAL_ENCRYPT pfnLocalEncrypt;
PFN_LOCAL_DECRYPT pfnLocalDecrypt;
PFN_LOCAL_CREATE_HASH pfnLocalCreateHash;
PFN_LOCAL_HASH_DATA pfnLocalHashData;
PFN_LOCAL_HASH_SESSION_KEY pfnLocalHashSessionKey;
PFN_LOCAL_SIGN_HASH pfnLocalSignHash;
PFN_LOCAL_DESTROY_HASH pfnLocalDestroyHash;
PFN_LOCAL_VERIFY_SIGNATURE pfnLocalVerifySignature;
PFN_LOCAL_GEN_RANDOM pfnLocalGenRandom;
PFN_LOCAL_GET_USER_KEY pfnLocalGetUserKey;
PFN_LOCAL_DUPLICATE_HASH pfnLocalDuplicateHash;
PFN_LOCAL_DUPLICATE_KEY pfnLocalDuplicateKey;
PFN_LOCAL_DLL_INITIALIZE pfnLocalDllInitialize;
PFN_LOCAL_DLL_REGISTER_SERVER pfnLocalDllRegisterServer;
PFN_LOCAL_DLL_UNREGISTER_SERVER pfnLocalDllUnregisterServer;
//
// Static data describing the local CSP.
//
LPWSTR wszProviderName;
DWORD dwProviderType;
DWORD dwImplementationType;
//
// Description of the support CSP to be used.
//
LPWSTR wszSupportProviderName;
DWORD dwSupportProviderType;
} LOCAL_CSP_INFO, *PLOCAL_CSP_INFO;
//
// General Wrappers
//
LPVOID WINAPI CspAllocH(
IN SIZE_T cBytes);
LPVOID WINAPI CspReAllocH(
IN LPVOID pMem,
IN SIZE_T cBytes);
void WINAPI CspFreeH(
IN LPVOID pMem);
DWORD CspInitializeCriticalSection(
IN CRITICAL_SECTION *pcs);
DWORD CspEnterCriticalSection(
IN CRITICAL_SECTION *pcs);
void CspLeaveCriticalSection(
IN CRITICAL_SECTION *pcs);
void CspDeleteCriticalSection(
IN CRITICAL_SECTION *pcs);
DWORD WINAPI RegOpenProviderKey(
IN OUT HKEY *phProviderKey,
IN REGSAM samDesired);
void SetLocalCallInfo(
IN OUT PLOCAL_CALL_INFO pLocalCallInfo,
IN BOOL fContinue);
DWORD WINAPI CreateUuidContainerName(
IN PUSER_CONTEXT pUserCtx);
DWORD WINAPI ApplyPKCS1SigningFormat(
IN ALG_ID HashAlgid,
IN BYTE *pbHash,
IN DWORD cbHash,
IN DWORD dwFlags,
IN DWORD cbModulus,
OUT PBYTE *ppbPKCS1Format);
#ifndef PKCS_BLOCKTYPE_2
#define PKCS_BLOCKTYPE_2 2
#endif
DWORD WINAPI VerifyPKCS2Padding(
IN PBYTE pbPaddedData,
IN DWORD cbModulus,
OUT PBYTE *ppbData,
OUT PDWORD pcbData);
#endif