BOOL CryptAcquireContext( HCRYPTPROV *phProvider, KOCTSTR ContainerName, LPCTSTR ProviderName, DWORD ProviderType, DWROD Flags);
引数の意味は以下の通り。
| phProvider | (OUT) | 取得結果の鍵コンテナのハンドル。 |
| ConainerName | (IN) | 取得する鍵コンテナの名前。NULLを指定した場合、デフォルトの鍵コンテナのハンドルが取得される。 |
| ProviderName | (IN) | CSPの名前。NULLを指定した場合、デフォルトのCSPの名前が使用される。 |
| ProviderType | (IN) | CSPのタイプを表すフラグ。後述の表を参照。 |
| Flags | (IN) | 後述の表を参照。 |
ProviderTypeに指定可能な値は、以下のいずれかである。
| PROV_RSA_FULL | (説明略) |
| PROV_RSA_SIG | (説明略) |
| PROV_DSS | (説明略) |
| PROV_FORTEZZA | (説明略) |
| PROV_MS_MAIL | (説明略) |
Flagsに指定可能な値は、以下のいずれかである。
| CRYPT_VERIFYCONTEXT | 呼び出し元アプリケーションが秘密鍵を使用しないことを意味する。 |
| CRYPT_NEWKEYSET | ContainerNameで指定した鍵コンテナを新規に作成する。 |
| CRYPT_DELETEKEYSET | ContainerNameで指定した鍵コンテナを削除する。 |
戻り値は、関数の実行に成功したかいなかを表す真偽値である。
void DispProvName()
{
HCRYPTPROV hProv;
BOOL bResult;
DWORD ErrorNo;
char *CspName[1000];
char *ContName[1000];
DWORD CspNameLen = 1000;
DWORD ContNameLen = 1000;
/* デフォルト鍵コンテナの取得 */
bResult = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
ErrorNo = GetLastError();
/* 鍵コンテナが存在しないならば */
if(!bResult && ErrorNo == NTE_BAD_KEYSET) {
/* デフォルト鍵コンテナの生成 */
bResult = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
ErrorNo = GetLastError();
}
/* 失敗? */
if(!bResult) {
printf("err(%08X).\n", ErrorNo);
return;
}
/* CSP名および鍵コンテナ名を取得 */
CryptGetProvParam(hProv, PP_NAME, (BYTE *)CspName, &CspNameLen, 0);
CryptGetProvParam(hProv, PP_CONTAINER, (BYTE *)ContName, &ContNameLen, 0);
/* CSP名および鍵コンテナ名を表示 */
printf("CSP Name: %s\n", CspName);
printf("Container Name: %s\n", ContName);
/* 鍵コンテナの開放 */
CryptReleaseContext(hProv, 0);
}