| ||||
| ||||
Здравствуйте уважаемые! Не сочтите за труд прояснить следующий момент: В руководстве программиста ЖТЯИ.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 Спасибо. С уважением, Алексей. | ||||
Ответы: | ||||
| ||||
Ага, разобрался, экспортировать надо на ГОСТ28147, что вполне логично. Тогда PRIVATEKEYBLOB можно получить. Видимо, документацию в CPGenKey просто забыли (не успели) поправить. Параллельно выяснил, что в этом случае CPExportKey не сохраняет в DWORD * pdwDataLen количество байт, помещённых в BYTE * pbData. (хотя должен бы). А вот что интересно, есть ли где-нибудь более понятное описание формата структур PRIVATEKEYBLOB и PUBLICKEYBLOB, чем в "Руководстве программиста" или WinCryptEx.h? Ведь наверно они не являются секретными? Спасибо. С уважением, Алексей. | ||||
| ||||
Спасибо за замечание. Действительно, забыли поправить. Экспорт секретных ключей невозможен в версии CSP 1.1. | ||||