10.09.2003 14:39:21Экспорт PRIVATEKEYBLOB Ответов: 2
Алексей
Здравствуйте уважаемые!

Не сочтите за труд прояснить следующий момент:

В руководстве программиста ЖТЯИ.00005-01 30 01 для Вашего продукта КриптоПро CSP 2.0 в описании функций CPExportKey() указано, что поддерживаются три обычных типа ключевого блоба (сессионный, только открытый ключ и полная ключевая пара). Однако, в описании флага CRYPT_EXPORTABLE в функции CPGenKey() сказано, что "В текущей версии "КриптоПро CSP" экспорт секретных ключей ключевых пар невозможен.". Т.е. выходит, что невозможен экспорт полной ключевой пары (тип блоба - PRIVATEKEYBLOB).
Это как-то невяжется со всем остальным описанием - везде подразумевается, что это возможно. Может быть просто забыли поправить описание CPGenKey() с выходом новой версии?

Следующий тест:
------ фрагмент кода ------
if(! CryptGetUserKey(
hCryptProv, // handle to the CSP
AT_KEYEXCHANGE,
&hExpKey))
{
if(GetLastError() == NTE_NO_KEY) {
printf("Creating new AT_KEYEXCHANGE key...\n");
if(CryptGenKey (hCryptProv,
AT_KEYEXCHANGE, CRYPT_EXPORTABLE,
&hExpKey))
printf("Created a exchange key pair.!\n");
else MyHandleError("Error occurred creating a exchange key.\n");
}else MyHandleError("An error other than NTE_NO_KEY getting exchange key.\n");
}

if(! CryptGetUserKey
(hCryptProv, AT_SIGNATURE,
&hSigKey))
{
if(GetLastError() == NTE_NO_KEY)
{
printf("Creating new AT_SIGNATURE key...\n");
if(CryptGenKey(hCryptProv,
AT_SIGNATURE,
CRYPT_EXPORTABLE,&hSigKey))
printf("Created a signature key pair.!\n");
else MyHandleError("Error occurred creating a signature key.\n");
}else MyHandleError("An error other than NTE_NO_KEY getting signature key.\n");
}

printf ("Going to export full signature key on export key...\n");
BYTE keyBlob[4096];
DWORD dw = 4096;
if (! CryptExportKey(hSigKey,
hExpKey,PRIVATEKEYBLOB,0,keyBlob,&dw))
MyHandleError ("CryptExportKey() failed!!!\n");
------ конец фрагмента кода ------
завершается с ошибкой в CryptExportKey() с кодом GetLastError() == NTE_BAD_KEY_STATE.

Значит ли это, что всё-таки экспортировать полные ключевые пары нельзя или я что-то делаю не так?

Если возможно, пожалуйста, продублируйте ответ на arech (at) km.ru

Спасибо.
С уважением, Алексей.
 
Ответы:
10.09.2003 16:16:03Алексей
Ага, разобрался, экспортировать надо на ГОСТ28147, что вполне логично. Тогда PRIVATEKEYBLOB можно получить. Видимо, документацию в CPGenKey просто забыли (не успели) поправить.
Параллельно выяснил, что в этом случае CPExportKey не сохраняет в DWORD * pdwDataLen количество байт, помещённых в BYTE * pbData. (хотя должен бы).

А вот что интересно, есть ли где-нибудь более понятное описание формата структур PRIVATEKEYBLOB и PUBLICKEYBLOB, чем в "Руководстве программиста" или WinCryptEx.h? Ведь наверно они не являются секретными?

Спасибо.
С уважением, Алексей.
12.09.2003 11:32:51Василий
Спасибо за замечание. Действительно, забыли поправить. Экспорт секретных ключей невозможен в версии CSP 1.1.