Статус: Участник
Группы: Участники
Зарегистрирован: 25.01.2008(UTC) Сообщений: 29 Откуда: Moscow
|
Прямо смотри в примерах sdk: Код:// Для создания нового ключевого контейнера строка второго параметра
// заменяется на NULL здесь и при следующем вызове функции
// CryptAcquireContext.
if(CryptAcquireContext(
&hCryptProv, // Дескриптор CSP
UserName, // Имя контейнера
NULL, // Использование провайдера по умолчанию
75, // Тип провайдера
0)) // Значения флагов
{
printf("A crypto context with the %s key container \n", UserName);
printf("has been acquired.\n\n");
}
else
{
//--------------------------------------------------------------------
// Некоторая разновидность ошибок, возникающих при получении контекста.
// Создание нового контейнера.
if(CryptAcquireContext(
&hCryptProv,
UserName,
NULL,
75,
CRYPT_NEWKEYSET))
{
printf("A new key container has been created.\n");
}
else
{
HandleError("Could not create a new key container.\n");
}
} // Конец else
//--------------------------------------------------------------------
// Криптографический контекст с ключевым контейнером доступен. Получение
// имени ключевого контейнера.
if(CryptGetProvParam(
hCryptProv, // Дескриптор CSP
PP_CONTAINER, // Получение имени ключевого контейнера
(BYTE *)szUserName, // Указатель на имя ключевого контейнера
&dwUserNameLen, // Длина имени, ограниченная до 100
0))
{
printf("A crypto context has been acquired and \n");
printf("The name on the key container is %s\n\n",szUserName);
}
else
{
// Ошибка получении имени ключевого контейнера
HandleError("A context was acquired or created, but\
an error occurred getting the key container name.\n");
}
//--------------------------------------------------------------------
// Контекст с ключевым контейнером доступен,
// попытка получения дескриптора ключа обмена.
if(CryptGetUserKey(
hCryptProv, // Дескриптор CSP
AT_SIGNATURE, // Спецификация ключа
&hKey)) // Дескриптор ключа
{
printf("A signature key is available.\n");
}
else
{
printf("No signature key is available.\n");
if(GetLastError() == NTE_NO_KEY)
{
//----------------------------------------------------------------
// Ошибка в том, что контейнер не содержит ключа.
// Создание подписанной ключевой пары.
printf("The signature key does not exist.\n");
printf("Create a signature key pair.\n");
if(CryptGenKey(
hCryptProv,
AT_SIGNATURE,
0,
&hKey))
{
printf("Created a signature key pair.\n");
}
else
{
HandleError("Error occurred creating a signature key.\n");
}
}
else
{
HandleError("An error other than NTE_NO_KEY getting signature\
key.\n");
}
} // Конец if
printf("A signature key pair existed, or one was created.\n\n");
CryptDestroyKey(hKey);
// Следующее, проверка ключа обмена.
if(CryptGetUserKey(
hCryptProv,
AT_KEYEXCHANGE,
&hKey))
{
printf("An exchange key exists. \n");
}
else
{
printf("No exchange key is available.\n");
// Проверка на то, нужно ли что-либо создавать.
if(GetLastError()==NTE_NO_KEY)
{
// Создание ключевой пары обмена.
printf("The exchange key does not exist.\n");
printf("Attempting to create an exchange key pair.\n");
if(CryptGenKey(
hCryptProv,
AT_KEYEXCHANGE,
0,
&hKey))
{
printf("Exchange key pair created.\n");
}
else
{
HandleError("Error occurred attempting to create \
an exchange key.\n");
}
}
else
{
HandleError("An error other than NTE_NO_KEY occurred.\n");
}
}
printf("An exchange key pair existed, or one was created.\n\n");
CryptDestroyKey(hKey);
CryptReleaseContext(hCryptProv,0);
|