Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2009(UTC) Сообщений: 7
|
Здравствуйте! Подскажите пожалуйста, в чем может быть проблема? Генерирую ключевую пару (RSA на ENHANCED_PROV), сохраняю ее в файл (public функцией CryptExportKey, private - CryptExportPKCS8). В дальнейшем пытаюсь создать контейнер на этой паре. Импорт открытого ключ проходит нормально, а вот импорт закрытого не получается (возваращется ошибка ERROR_INVALID_PARAMETER). Вот как делаю: Код:
CRYPT_PKCS8_IMPORT_PARAMS impParam;
FILE *f = fopen("c:\\temp\\privkey.key","rb");
fseek(f,SEEK_SET,SEEK_END);
DWORD f_len = ftell(f);
impParam.PrivateKey.pbData = (BYTE*)malloc(f_len);
memset(impParam.PrivateKey.pbData,0,f_len);
impParam.PrivateKey.cbData = f_len;
fseek(f,0,SEEK_SET);
f_len = ftell(f);
fread(impParam.PrivateKey.pbData,impParam.PrivateKey.cbData,1,f);
fclose(f);
impParam.pResolvehCryptProvFunc =NULL;
impParam.pVoidResolveFunc = NULL;
impParam.pDecryptPrivateKeyFunc = NULL;
impParam.pVoidDecryptFunc = NULL;
DWORD err=0;
if (!CryptImportPKCS8(impParam,CRYPT_EXPORTABLE,&hCryptProv,NULL))
{
err = GetLastError();
return 1;
}
В чем может быть проблема? Нужно ли описывать callback (pResolvehCryptProvFunc)? Если да, то как?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2009(UTC) Сообщений: 7
|
Вот кстати, еще вопрос.. Можно как-то "заставить" CryptoAPI генерировать RSA-ключи на флэшку?
Заранее спасибо.
|
|
|
|
Статус: Администратор
Группы: Администраторы, Участники Зарегистрирован: 13.12.2007(UTC) Сообщений: 111 Откуда: Крипто-Про
Поблагодарили: 33 раз в 10 постах
|
По первому вопросу не подскажу, по второму. CryptoAPI к генерации ключей не имеет никакого отношения. Генерит CSP. Микрософтовые CSP генерят только в реестр. Но сохранить на флэшку уже сгенеренные можно, экспортировав в PFX.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2009(UTC) Сообщений: 7
|
Цитата:Но сохранить на флэшку уже сгенеренные можно, экспортировав в PFX.
Эмм... а разве pfx - это не для сертификатов? По крайней мере MSDN говорит: "The PFXExportCertStore function exports the certificates and, if available, the associated private keys from the referenced certificate store. ".. А как туда только ключи положить?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:В чем может быть проблема? Нужно ли описывать callback (pResolvehCryptProvFunc)? Если да, то как? Нужно. Эта функция как раз и возвращает контекст провайдера, куда импортируется ключ. Описывать так как написано в MSDN. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2009(UTC) Сообщений: 7
|
Спасибо за ответ! :) Цитата:Описывать так как написано в MSDN. А можете подсказать, в структуре CRYPT_PRIVATE_KEY_INFO как поля заполнять? Вот например версию какую указывать? Опять же PrivateKey (СRYPT_DER_BLOB ) - это содержимое файла PKCS8? И с параметром pVoidResolveFunc тоже непонятно.. А из callback возвращаемый hCryptProv надо CryptAcquireContext получать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2009(UTC) Сообщений: 7
|
Спасибо, Кирилл! Попробую :)
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2009(UTC) Сообщений: 7
|
Вообщем заработало вот так.. Может кому пригодится.. Callback: Код:
__stdcall ResolveFunc(CRYPT_PRIVATE_KEY_INFO* pPrivateKeyInfo,HCRYPTPROV* phCryptProv, LPVOID pVoidResolveFunc)
{
CryptAcquireContext(phCryptProv,NULL,MS_ENHANCED_PROV,1,0);
return 1;
}
сам вызов: Код:
CRYPT_PKCS8_IMPORT_PARAMS impParam;
FILE *f = fopen("privkey.key","rb");
fseek(f,SEEK_SET,SEEK_END);
DWORD f_len = ftell(f);
impParam.PrivateKey.pbData = (BYTE*)malloc(f_len);
memset(impParam.PrivateKey.pbData,0,f_len);
impParam.PrivateKey.cbData = f_len;
fseek(f,0,SEEK_SET);
f_len = ftell(f);
fread(impParam.PrivateKey.pbData,impParam.PrivateKey.cbData,1,f);
fclose(f);
CRYPT_PRIVATE_KEY_INFO keyInfo;
memset(&keyInfo,0,sizeof(keyInfo));
keyInfo.Version = 1;
keyInfo.Algorithm.pszObjId = "1.2.840.113549.1.1.1";
keyInfo.PrivateKey.cbData =impParam.PrivateKey.cbData;
keyInfo.PrivateKey.pbData = (BYTE*)malloc(impParam.PrivateKey.cbData);
memcpy(keyInfo.PrivateKey.pbData,impParam.PrivateKey.pbData,impParam.PrivateKey.cbData);
impParam.pResolvehCryptProvFunc = ResolveFunc;
impParam.pVoidResolveFunc = NULL;
impParam.pDecryptPrivateKeyFunc = NULL;
impParam.pVoidDecryptFunc = NULL;
DWORD err=0;
if (!CryptImportPKCS8(impParam,CRYPT_EXPORTABLE,&hCryptProv,NULL))
{
err = GetLastError();
return 1;
}
Еще раз спасибо :)
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close