CryptAcquireContext 鍵コンテナハンドルの取得

Cの宣言:

BOOL CryptAcquireContext(
	HCRYPTPROV *phProvider,
	KOCTSTR ContainerName,
	LPCTSTR ProviderName,
	DWORD ProviderType,
	DWROD Flags);

説明:

ProviderNameで指定したCSPの、ConainerNameで指定した鍵コンテナのハンドルを取得し、phProviderに返す。

引数の意味は以下の通り。
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で指定した鍵コンテナを削除する。

戻り値は、関数の実行に成功したかいなかを表す真偽値である。

Cのサンプル:

デフォルトのCSPのデフォルトの鍵コンテナの名前を取得し、表示する。デフォルトのCSPにデフォルトの鍵コンテナが存在しない場合、新規に鍵コンテナを作成する。
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);
}
(original text:1998/12/28 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。