//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: pvkutil.cpp // //-------------------------------------------------------------------------- #include "global.hxx" #include "pvkhlpr.h" //+------------------------------------------------------------------------- // Get crypto provider to based on either the pvkfile or key container name //-------------------------------------------------------------------------- HRESULT WINAPI PvkGetCryptProv( IN HWND hwnd, IN LPCWSTR pwszCaption, IN LPCWSTR pwszCapiProvider, IN DWORD dwProviderType, IN LPCWSTR pwszPvkFile, IN LPCWSTR pwszKeyContainerName, IN DWORD *pdwKeySpec, OUT LPWSTR *ppwszTmpContainer, OUT HCRYPTPROV *phCryptProv) { HANDLE hFile=NULL; HRESULT hr=E_FAIL; DWORD dwRequiredKeySpec=0; //Init *ppwszTmpContainer=NULL; *phCryptProv=NULL; //get the provider handle based on the key container name if(pwszKeyContainerName) { if(!CryptAcquireContextU(phCryptProv, pwszKeyContainerName, pwszCapiProvider, dwProviderType, 0)) // dwFlags return SignError(); //try to figure out the key specification if((*pdwKeySpec)==0) dwRequiredKeySpec=AT_SIGNATURE; else dwRequiredKeySpec=*pdwKeySpec; //make sure *pdwKeySpec is the correct key spec HCRYPTKEY hPubKey; if (CryptGetUserKey( *phCryptProv, dwRequiredKeySpec, &hPubKey )) { CryptDestroyKey(hPubKey); *pdwKeySpec=dwRequiredKeySpec; return S_OK; } else { //we fail is user required another key spec if((*pdwKeySpec)!=0) { // Doesn't have the specified public key hr=SignError(); CryptReleaseContext(*phCryptProv, 0); *phCryptProv=NULL; return hr; } //now we try AT_EXCHANGE key dwRequiredKeySpec=AT_KEYEXCHANGE; if (CryptGetUserKey( *phCryptProv, dwRequiredKeySpec, &hPubKey )) { CryptDestroyKey(hPubKey); *pdwKeySpec=dwRequiredKeySpec; return S_OK; } else { // Doesn't have the specified public key hr=SignError(); CryptReleaseContext(*phCryptProv, 0); *phCryptProv=NULL; return hr; } } } //get the providedr handle based on the pvk file name hFile = CreateFileU(pwszPvkFile, GENERIC_READ, FILE_SHARE_READ, NULL, // lpsa OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // hTemplateFile if (hFile == INVALID_HANDLE_VALUE) return SignError(); if(!PvkPrivateKeyAcquireContext(pwszCapiProvider, dwProviderType, hFile, hwnd, pwszCaption, pdwKeySpec, phCryptProv, ppwszTmpContainer)) { *phCryptProv=NULL; hr=SignError(); } else hr=S_OK; CloseHandle(hFile); return hr; } void WINAPI PvkFreeCryptProv(IN HCRYPTPROV hProv, IN LPCWSTR pwszCapiProvider, IN DWORD dwProviderType, IN LPWSTR pwszTmpContainer) { if (pwszTmpContainer) { // Delete the temporary container for the private key from // the provider PvkPrivateKeyReleaseContext(hProv, pwszCapiProvider, dwProviderType, pwszTmpContainer); } else { if (hProv) CryptReleaseContext(hProv, 0); } }