CryptoAPI函数测试实例代码(二)
YTE*)szPassword, strlen(szPassword), 0 );
#endif
bRet = ::CryptDeriveKey( hCryptProv, CALG_RC2, hHash, 0x00800000|CRYPT_EXPORTABLE, &hKey );
if( FALSE == bRet )
break;
::CryptDestroyHash( hHash );
hHash = NULL;
const int ENCRYPT_BLOCK_SIZE = 8;
DWORD dwBufferLen = 1000 - 1000%8 + 8; // 每次加密的字节数
DWORD dwEncrypt = 0; // 到目前为止加密了多少数据
do
{
BOOL bFinal = dwEncrypt + dwBufferLen >= (DWORD)nOriLen;
DWORD dwDataLen = bFinal nOriLen-dwEncrypt : dwBufferLen;
bRet = ::CryptEncrypt( hKey, 0, bFinal, 0, bOrign+dwEncrypt, &dwDataLen, dwDataLen );
if( FALSE == bRet )
{
DWORD dwErr = ::GetLastError();
break;
}
dwEncrypt += dwBufferLen;
if( bFinal )
break;
}
while( true );
}
while( false );
if( hKey )
::CryptDestroyKey( hKey );
if( hHash )
::CryptDestroyHash( hHash );
if( hCryptProv )
::CryptReleaseContext( hCryptProv, 0 );
}
//
// 函数:DWORD WINAPI ImportRootCertAutoClickProc( LPVOID lpParameter )
//
// 目的:在导入一个根证书的时候,由程序来自动点击确定按钮
//
DWORD WINAPI ImportRootCertAutoClickProc( LPVOID lpParameter )
{
int nRetryTimes = 20;
int nSleepTime = 200;
HWND hWnd = NULL;
bool bFinish = false;
TCHAR titleR[64] = _T("根证书存储"); // 卸载根证书的对话框标题
TCHAR titleI_xp[64] = _T("安全警告"); // xp下,导入根证书的对话框标题
TCHAR titleI_win7[64] = _T("安全性警告"); // win7下,导入根证书的对话框标题
for( int i = 0; i < nRetryTimes; i++ )
{
if( bFinish )
break;
Sleep(nSleepTime);
hWnd = FindWindow( _T("#32770"), titleR );
if( !hWnd)
{
HWND hWndXp = FindWindow( _T("#32770"), titleI_xp );
HWND hWndWin7 = FindWindow( _T("#32770"), titleI_win7 );
if( hWndXp != NULL || hWndWin7 != NULL )
{
bFinish = true;
hWnd = ( hWndXp == NULL hWndWin7:hWndXp );
}
else
continue;
}
SendMessage(hWnd, WM_COMMAND, MAKELONG(IDYES, BN_CLICKED), (long)GetDlgItem( hWnd, IDYES ));
}
return 0;
}
//
// 函数:DWORD WINAPI RemoveRootCertAutoClickProc( LPVOID lpParameter )
//
// 目的:在删除一个根证书的时候,由程序来自动点击确定按钮
//
DWORD WINAPI RemoveRootCertAutoClickProc( LPVOID lpParameter )
{
int nRetryTimes = 20;
int nSleepTime = 200;
HWND hWnd = NULL;
bool bFinish = false;
TCHAR titleR[64] = _T("根证书存储"); // 卸载根证书的对话框标题
for( int i = 0; i < nRetryTimes; i++ )
{
Sleep(nSleepTime);
hWnd = FindWindow( _T("#32770"), titleR );
if( hWnd)
{
SendMessage(hWnd, WM_COMMAND, MAKELONG(IDYES, BN_CLICKED), (long)GetDlgItem( hWnd, IDYES ));
break;
}
else
continue;
}
return 0;
}
//
// 函数: bool ImportPfxCert( TCHAR* szCertPath, TCHAR* szPassword, WCHAR* wcsImportToWhere, TCHAR* szErrInfo = NULL )
//
// 目的: 导入一张PFX证书到IE中的wcsImportToWhere指定的区域
//
// 参数
// szCertPath
// [in]: p12证书所在路径
// szPassword
// [in]: p12证书的密码
// wcsImportToWhere
// [in]: L"MY", L"CA", L"ROOT"
// szErrInfo
// [out]: 如果错误,返回错误信息
//
// 返回: 成功返回true,失败返回false
//
bool ImportPfxCert( TCHAR* szCertPath, TCHAR* szPassword, WCHAR* wcsImportToWhere, TCHAR* szErrInfo )
{
bool nRet = false;
HCERTSTORE hCertStore = NULL;
HCERTSTORE hCertStoreToWhere = NULL;
PCCERT_CONTEXT pCertContex = NULL;
HCRYPTPROV hCryptProv = NULL;
do
{
CBufferT
bufCert;
if( FALSE == GetFileBuffer( szCertPath, bufCert ) )
{
if( szErrInfo != NULL )
{
_stprintf( szErrInfo, _T("读取证书文件数据失败") );
}
break;
}
CRYPT_DATA_BLOB blob;
blob.cbData = bufCert.GetBufSize();
blob.pbData = (unsigned char *)(char*)bufCert;
#ifdef _UNICODE
hCertStore = PFXImportCertStore( &blob, szPassword, CRYPT_EXPORTABLE );
#else
int nPswdLen = ::MultiByteToWideChar( CP_ACP, 0, szPassword, strlen( szPassword )+1, NULL, 0 );
CBufferT wcsPassword;
wcsPassword.malloc( nPswdLen );
::MultiByteToWideChar( CP_ACP, 0, szPassword, strlen( szPassword )+1, wcsPassword, nPswdLen );
hCertStore = PFXImportCertStore( &blob, wcsPassword, CRYPT_EXPORTABLE );
#endif
if( NULL == hCertStore )
{
if( NULL != szErrInfo )
{
DWORD dwError = ::GetLastError();
_stprintf( szErrInfo, _T("PFXImportCertStore FAILED, Error Code: 0x%X。请确认密码是否正确。 "), dwError );
}
break;
}
// 从临时区找到刚才那张证书,导入到MY里面
BOOL bCertFound = FALSE;
DWORD dwKeySpec = 0;
BOOL boCallerFreeProv = FALSE;
do
{
pCertContex = CertEnumCertificatesInStore(hCertStore,pCertContex);
if (!pCertContex)
break;
if (CryptAcquireCertificatePrivateKey(pCertContex, CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
NULL,&hCryptProv,&dwKeySpec,&boCallerFreeProv) && hCryptProv)
{
bCertFound = TRUE;
break;
}
}while(1);
if( FALSE == bCertFound )
break;
hCertStoreToWhere = ::CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, NULL,
CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, wcsImportToWhere );
if( NULL == hCertStoreToWhere )
{
if( NULL != szErrInfo )
{
_tcscpy( szErrInfo, _T("CertOpenStoren Failed") );
}
break;
}
// 自动选择是按钮
if( 0 == wcscmp( L"ROOT", wcsImportToWhere ) )
{
CreateThread( NULL, 0, ImportRootCertAutoClickProc, 0, 0, 0 );
}
BOOL bRet = ::CertAddCertificateContextToStore( hCertStoreToWhere, pCertContex, CERT_STORE_ADD_REPLACE_EXISTING, NULL );
if( !bRet )
{
if( NULL != szErrInfo )
{
DWORD dwError = ::GetLastE