C プログラムの例: CryptAcquireContext の使用
次の例では、 CryptAcquireContext 関数と関連する CryptoAPI 関数を使用して 、暗号化サービス プロバイダー (CSP) と キー コンテナーを操作するさまざまな方法を示します。
この例では、次のタスクと CryptoAPI 関数を示します。
- CryptAcquireContext 関数を使用して、既定の CSP と既定のキー コンテナーのハンドルを取得します。 既定のキー コンテナーが存在しない場合は、 CryptAcquireContext 関数を使用して既定のキー コンテナーを作成します。
- CSP とキー コンテナーに関する情報を取得するには、 CryptGetProvParam 関数を使用します。
- CryptContextAddRef 関数を使用して、プロバイダーの参照数を増やします。
- CryptReleaseContext 関数を使用して CSP を解放します。
- CryptAcquireContext 関数を使用して、名前付きキー コンテナーを作成します。
- 新しく作成されたキー コンテナーを使用して、CSP のハンドルを取得します。
- CryptAcquireContext 関数を使用してキー コンテナーを削除します。
この例では、 関数 MyHandleError を使用します。 この関数のコードは、サンプルに含まれています。 この関数およびその他の補助関数のコードは、General Purpose関数の下にも表示されます。
//-------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Example code using CryptAcquireContext.
#pragma comment(lib, "crypt32.lib")
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <Wincrypt.h>
//-------------------------------------------------------------------
// This example uses the function MyHandleError, a simple error
// handling function to print an error message and exit
// the program.
// For most applications, replace this function with one
// that does more extensive error reporting.
void MyHandleError(LPTSTR psz)
{
_ftprintf(stderr, TEXT("An error occurred in the program. \n"));
_ftprintf(stderr, TEXT("%s\n"), psz);
_ftprintf(stderr, TEXT("Error number %x.\n"), GetLastError());
_ftprintf(stderr, TEXT("Program terminating. \n"));
exit(1);
} // End of MyHandleError.
void main(void)
{
//---------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hCryptProv;
//---------------------------------------------------------------
// Get a handle to the default PROV_RSA_FULL provider.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
_tprintf(TEXT("CryptAcquireContext succeeded.\n"));
}
else
{
if (GetLastError() == NTE_BAD_KEYSET)
{
// No default container was found. Attempt to create it.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_NEWKEYSET))
{
_tprintf(TEXT("CryptAcquireContext succeeded.\n"));
}
else
{
MyHandleError(TEXT("Could not create the default ")
TEXT("key container.\n"));
}
}
else
{
MyHandleError(TEXT("A general error running ")
TEXT("CryptAcquireContext."));
}
}
CHAR pszName[1000];
DWORD cbName;
//---------------------------------------------------------------
// Read the name of the CSP.
cbName = 1000;
if(CryptGetProvParam(
hCryptProv,
PP_NAME,
(BYTE*)pszName,
&cbName,
0))
{
_tprintf(TEXT("CryptGetProvParam succeeded.\n"));
printf("Provider name: %s\n", pszName);
}
else
{
MyHandleError(TEXT("Error reading CSP name.\n"));
}
//---------------------------------------------------------------
// Read the name of the key container.
cbName = 1000;
if(CryptGetProvParam(
hCryptProv,
PP_CONTAINER,
(BYTE*)pszName,
&cbName,
0))
{
_tprintf(TEXT("CryptGetProvParam succeeded.\n"));
printf("Key Container name: %s\n", pszName);
}
else
{
MyHandleError(TEXT("Error reading key container name.\n"));
}
//---------------------------------------------------------------
// Perform cryptographic operations.
//...
//---------------------------------------------------------------
// Add to the reference count on the provider. When the
// reference count on a provider is greater than one,
// CryptReleaseContext reduces the reference count but does not
// free the provider.
if(CryptContextAddRef(
hCryptProv,
NULL,
0))
{
_tprintf(TEXT("CryptcontextAddRef succeeded.\n"));
}
else
{
MyHandleError(TEXT("Error during CryptContextAddRef!\n"));
}
//---------------------------------------------------------------
// The reference count on hCryptProv is now greater than one.
// The first call to CryptReleaseContext will not release the
// provider handle.
//---------------------------------------------------------------
// Release the context once.
if (CryptReleaseContext(hCryptProv, 0))
{
_tprintf(TEXT("The first call to CryptReleaseContext ")
TEXT("succeeded.\n"));
}
else
{
MyHandleError(TEXT("Error during ")
TEXT("CryptReleaseContext #1!\n"));
}
//---------------------------------------------------------------
// Release the provider handle again.
if (CryptReleaseContext(hCryptProv, 0))
{
_tprintf(TEXT("The second call to CryptReleaseContext ")
TEXT("succeeded.\n"));
}
else
{
MyHandleError(TEXT("Error during ")
TEXT("CryptReleaseContext #2!\n"));
}
//---------------------------------------------------------------
// Get a handle to a PROV_RSA_FULL provider and
// create a key container named "My Sample Key Container".
LPCTSTR pszContainerName = TEXT("My Sample Key Container");
hCryptProv = NULL;
if(CryptAcquireContext(
&hCryptProv,
pszContainerName,
NULL,
PROV_RSA_FULL,
CRYPT_NEWKEYSET))
{
_tprintf(TEXT("CryptAcquireContext succeeded. \n"));
_tprintf(TEXT("New key set created. \n"));
//-----------------------------------------------------------
// Release the provider handle and the key container.
if(hCryptProv)
{
if(CryptReleaseContext(hCryptProv, 0))
{
hCryptProv = NULL;
_tprintf(TEXT("CryptReleaseContext succeeded. \n"));
}
else
{
MyHandleError(TEXT("Error during ")
TEXT("CryptReleaseContext!\n"));
}
}
}
else
{
if(GetLastError() == NTE_EXISTS)
{
_tprintf(TEXT("The named key container could not be ")
TEXT("created because it already exists.\n"));
// Just continue the program. The named container
// will be reopened below.
}
else
{
MyHandleError(TEXT("Error during CryptAcquireContext ")
TEXT("for a new key container."));
}
}
//---------------------------------------------------------------
// Get a handle to the provider by using the new key container.
// Note: This key container will be empty until keys
// are explicitly created by using the CryptGenKey function.
if(CryptAcquireContext(
&hCryptProv,
pszContainerName,
NULL,
PROV_RSA_FULL,
0))
{
_tprintf(TEXT("Acquired the key set just created. \n"));
}
else
{
MyHandleError(TEXT("Error during CryptAcquireContext!\n"));
}
//---------------------------------------------------------------
// Perform cryptographic operations.
//---------------------------------------------------------------
// Release the provider handle.
if(CryptReleaseContext(
hCryptProv,
0))
{
_tprintf(TEXT("CryptReleaseContext succeeded. \n"));
}
else
{
MyHandleError(TEXT("Error during CryptReleaseContext!\n"));
}
//---------------------------------------------------------------
// Delete the new key container.
if(CryptAcquireContext(
&hCryptProv,
pszContainerName,
NULL,
PROV_RSA_FULL,
CRYPT_DELETEKEYSET))
{
_tprintf(TEXT("Deleted the key container just created. \n"));
}
else
{
MyHandleError(TEXT("Error during CryptAcquireContext!\n"));
}
} // End of main.