Windows Vista上のIE7でのCrypt API利用

Crypt APIを使うためには、通常、CryptAcquireContextを使用して、暗号プロバイダのハンドルを取得しなければなりません。この時には、KB238187 CryptAcquireContext() use and troubleshootingにあるように、暗号プロバイダのキーセットが未初期化であった場合にNTE_BAD_KEYSETがエラーとして返ってきます。この場合は、明示的にキーセットを初期化しなければなりません。そのため、通常、この処理は次のようになります。

HCRYPTPROV hCryptProv;
DWORD dwFlags = CRYPT_VERIFYCONTEXT; // KB238187
while(!CryptAcquireContext(
  &hCryptProv, NULL, NULL, PROV_RSA_FULL, dwFlags))
{
  if(GetLastError() == NTE_BAD_KEYSET)
    dwFlags |= CRYPT_NEWKEYSET; // Create a new keyset
  else
    throw CryptException("Cannot create a new keyset!");
}

// やりたい作業を行う
// .....

CryptReleaseContext(hCryptProv, 0);