//+------------------------------------------------------------------------- // // 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