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

274 lines
12 KiB
C

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1995 - 1999
//
// File: pvkhlpr.h
//
// Contents: Private Key Helper API Prototypes and Definitions
//
// Note: Base CSP also exports/imports the public key with the
// private key.
//
// APIs: PrivateKeyLoad
// PrivateKeySave
// PrivateKeyLoadFromMemory
// PrivateKeySaveToMemory
// PrivateKeyAcquireContext
// PrivateKeyAcquireContextFromMemory
// PrivateKeyReleaseContext
// PrivateKeyLoadA
// PrivateKeySaveA
// PrivateKeyLoadFromMemoryA
// PrivateKeySaveToMemoryA
// PrivateKeyAcquireContextA
// PrivateKeyAcquireContextFromMemoryA
// PrivateKeyReleaseContextA
//
// History: 10-May-96 philh created
//--------------------------------------------------------------------------
#ifndef __PVKHLPR_H__
#define __PVKHLPR_H__
#include "wincrypt.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifndef PRIVATEKEYBLOB
#define PRIVATEKEYBLOB 0x7
#endif
//+-------------------------------------------------------------------------
// Load the AT_SIGNATURE or AT_KEYEXCHANGE private key (and its public key)
// from the file into the cryptographic provider.
//
// If the private key was password encrypted, then, the user is first
// presented with a dialog box to enter the password.
//
// If pdwKeySpec is non-Null, then, if *pdwKeySpec is nonzero, verifies the
// key type before loading. Sets LastError to PVK_HELPER_WRONG_KEY_TYPE for
// a mismatch. *pdwKeySpec is updated with the key type.
//
// dwFlags is passed through to CryptImportKey.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeyLoad(IN HCRYPTPROV hCryptProv,
IN HANDLE hFile,
IN HWND hwndOwner,
IN LPCWSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags,
IN OUT OPTIONAL DWORD *pdwKeySpec);
BOOL WINAPI
PvkPrivateKeyLoadA(IN HCRYPTPROV hCryptProv,
IN HANDLE hFile,
IN HWND hwndOwner,
IN LPCTSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags,
IN OUT OPTIONAL DWORD *pdwKeySpec);
//+-------------------------------------------------------------------------
// Save the AT_SIGNATURE or AT_KEYEXCHANGE private key (and its public key)
// to the specified file.
//
// The user is presented with a dialog box to enter an optional password to
// encrypt the private key.
//
// dwFlags is passed through to CryptExportKey.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeySave(IN HCRYPTPROV hCryptProv,
IN HANDLE hFile,
IN DWORD dwKeySpec, // either AT_SIGNATURE or AT_KEYEXCHANGE
IN HWND hwndOwner,
IN LPCWSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags);
BOOL WINAPI
PvkPrivateKeySaveA(IN HCRYPTPROV hCryptProv,
IN HANDLE hFile,
IN DWORD dwKeySpec, // either AT_SIGNATURE or AT_KEYEXCHANGE
IN HWND hwndOwner,
IN LPCTSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags);
//+-------------------------------------------------------------------------
// Load the AT_SIGNATURE or AT_KEYEXCHANGE private key (and its public key)
// from memory into the cryptographic provider.
//
// Except for the key being loaded from memory, identical to PrivateKeyLoad.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeyLoadFromMemory(IN HCRYPTPROV hCryptProv,
IN BYTE *pbData,
IN DWORD cbData,
IN HWND hwndOwner,
IN LPCWSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags,
IN OUT OPTIONAL DWORD *pdwKeySpec);
BOOL WINAPI
PvkPrivateKeyLoadFromMemoryA(IN HCRYPTPROV hCryptProv,
IN BYTE *pbData,
IN DWORD cbData,
IN HWND hwndOwner,
IN LPCTSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags,
IN OUT OPTIONAL DWORD *pdwKeySpec);
//+-------------------------------------------------------------------------
// Save the AT_SIGNATURE or AT_KEYEXCHANGE private key (and its public key)
// to memory.
//
// If pbData == NULL || *pcbData == 0, calculates the length and doesn't
// return an error (also, the user isn't prompted for a password).
//
// Except for the key being saved to memory, identical to PrivateKeySave.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeySaveToMemory(IN HCRYPTPROV hCryptProv,
IN DWORD dwKeySpec, // either AT_SIGNATURE or AT_KEYEXCHANGE
IN HWND hwndOwner,
IN LPCWSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags,
OUT BYTE *pbData,
IN OUT DWORD *pcbData);
BOOL WINAPI
PvkPrivateKeySaveToMemoryA(IN HCRYPTPROV hCryptProv,
IN DWORD dwKeySpec, // either AT_SIGNATURE or AT_KEYEXCHANGE
IN HWND hwndOwner,
IN LPCTSTR pwszKeyName, // name used in dialog
IN DWORD dwFlags,
OUT BYTE *pbData,
IN OUT DWORD *pcbData);
//+-------------------------------------------------------------------------
// Creates a temporary container in the provider and loads the private key
// from the specified file.
// For success, returns a handle to a cryptographic provider for the private
// key and the name of the temporary container. PrivateKeyReleaseContext must
// be called to release the hCryptProv and delete the temporary container.
//
// PrivateKeyLoad is called to load the private key into the temporary
// container.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeyAcquireContext(IN LPCWSTR pwszProvName,
IN DWORD dwProvType,
IN HANDLE hFile,
IN HWND hwndOwner,
IN LPCWSTR pwszKeyName, // name used in dialog
IN OUT OPTIONAL DWORD *pdwKeySpec,
OUT HCRYPTPROV *phCryptProv,
OUT LPWSTR *ppwszTmpContainer
);
BOOL WINAPI
PvkPrivateKeyAcquireContextA(IN LPCTSTR pwszProvName,
IN DWORD dwProvType,
IN HANDLE hFile,
IN HWND hwndOwner,
IN LPCTSTR pwszKeyName, // name used in dialog
IN OUT OPTIONAL DWORD *pdwKeySpec,
OUT HCRYPTPROV *phCryptProv,
OUT LPTSTR *ppwszTmpContainer);
//+-------------------------------------------------------------------------
// Creates a temporary container in the provider and loads the private key
// from memory.
// For success, returns a handle to a cryptographic provider for the private
// key and the name of the temporary container. PrivateKeyReleaseContext must
// be called to release the hCryptProv and delete the temporary container.
//
// PrivateKeyLoadFromMemory is called to load the private key into the
// temporary container.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeyAcquireContextFromMemory(IN LPCWSTR pwszProvName,
IN DWORD dwProvType,
IN BYTE *pbData,
IN DWORD cbData,
IN HWND hwndOwner,
IN LPCWSTR pwszKeyName, // name used in dialog
IN OUT OPTIONAL DWORD *pdwKeySpec,
OUT HCRYPTPROV *phCryptProv,
OUT LPWSTR *ppwszTmpContainer);
BOOL WINAPI
PvkPrivateKeyAcquireContextFromMemoryA(IN LPCTSTR pwszProvName,
IN DWORD dwProvType,
IN BYTE *pbData,
IN DWORD cbData,
IN HWND hwndOwner,
IN LPCTSTR pwszKeyName, // name used in dialog
IN OUT OPTIONAL DWORD *pdwKeySpec,
OUT HCRYPTPROV *phCryptProv,
OUT LPTSTR *ppwszTmpContainer);
//+-------------------------------------------------------------------------
// Releases the cryptographic provider and deletes the temporary container
// created by PrivateKeyAcquireContext or PrivateKeyAcquireContextFromMemory.
//--------------------------------------------------------------------------
BOOL WINAPI
PvkPrivateKeyReleaseContext(IN HCRYPTPROV hCryptProv,
IN LPCWSTR pwszProvName,
IN DWORD dwProvType,
IN LPWSTR pwszTmpContainer);
BOOL WINAPI
PvkPrivateKeyReleaseContextA(IN HCRYPTPROV hCryptProv,
IN LPCTSTR pwszProvName,
IN DWORD dwProvType,
IN LPTSTR pwszTmpContainer);
//+-------------------------------------------------------------------------
// Acquiring hprovs, Trys the file first and then the KeyContainer. Use
// PvkFreeCryptProv to release HCRYPTPROV and resources.
//--------------------------------------------------------------------------
HCRYPTPROV WINAPI
PvkGetCryptProvA(IN HWND hwnd,
IN LPCSTR pszCaption,
IN LPCSTR pszCapiProvider,
IN DWORD dwProviderType,
IN LPCSTR pszPrivKey,
OUT LPSTR *ppszTmpContainer);
void WINAPI
PvkFreeCryptProvA(IN HCRYPTPROV hProv,
IN LPCSTR pszCapiProvider,
IN DWORD dwProviderType,
IN LPSTR pszTmpContainer);
HCRYPTPROV WINAPI
PvkGetCryptProvU(IN HWND hwnd,
IN LPCWSTR pwszCaption,
IN LPCWSTR pwszCapiProvider,
IN DWORD dwProviderType,
IN LPCWSTR pwszPrivKey,
OUT LPWSTR *ppwszTmpContainer);
void WINAPI
PvkFreeCryptProvU(IN HCRYPTPROV hProv,
IN LPCWSTR pwszCapiProvider,
IN DWORD dwProviderType,
IN LPWSTR pwszTmpContainer);
//+-------------------------------------------------------------------------
// Private Key helper error codes
//--------------------------------------------------------------------------
#define PVK_HELPER_BAD_PARAMETER 0x80097001
#define PVK_HELPER_BAD_PVK_FILE 0x80097002
#define PVK_HELPER_WRONG_KEY_TYPE 0x80097003
#define PVK_HELPER_PASSWORD_CANCEL 0x80097004
#ifdef __cplusplus
} // Balance extern "C" above
#endif
#endif