Выполняю экспорт/импорт закрытого/открытого ключей.
Экспортирую закрытый ключ на пользовательском уровне
CryptAcquireContext(hProv, Container, NULL, PROV_GOST_2001_DH, 0);
CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKey);
CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash);
CryptHashData(hHash, Password, PasswordLen, 0);
CryptDeriveKey(hProv, CALG_G28147, hHash, 0, &hExpKey);
DWORD Param = CALG_PRO_EXPORT;
CryptSetKeyParam(hExpKey, KP_ALGID, &Param, 0);
CryptExportKey(hKey, hExpKey, PRIVATEKEYBLOB, 0, NULL, &PrivateKeyBlobLen);
CryptExportKey(hKey, hExpKey, PRIVATEKEYBLOB, 0, PrivateKeyBlob, &PrivateKeyBlobLen);
Импортирую закрытый ключ на пользовательском уровне
CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash);
CryptHashData(hHash, Password, PasswordLen, 0);
CryptDeriveKey(hProv, CALG_G28147, hHash, 0, &hImpKey);
CryptImportKey(hProv, PrivateKeyBlob, PrivateKeyBlobLen, hImpKey, 0, &hKey);
Все выполняется без ошибок.
Пытаюсь импортировать закрытый ключ на уровне ядра
const VTABLEPROVSTRUC VTABLE2001 = {3, 0, 0, PROV_GOST_2001_DH, 0, 0, 0};
memcpy(&vtable, &VTABLE2001, sizeof(VTABLE2001));
csp->AcquireContext(csp, &hProv, NULL, CRYPT_NOSERIALIZE, &vtable);
csp->CreateHash(csp, hProv, CALG_GR3411, 0, 0, &hHash);
csp->HashData(csp, hProv, hHash, Password, PasswordLen, 0);
csp->DeriveKey(csp, hProv, CALG_G28147, hHash, 0, &hImpKey);
csp->ImportKey(csp, hProv, PrivateKeyBlob, PrivateKeyBlobLen, hImpKey, 0, &hKey);
возвращает NTE_BAD_TYPE.
Как сказано в документации
"NTE_BAD_TYPE - Тип ключевого блоба не поддерживается этим криптопровайдером и, возможно, ошибочен."
При этом импорт открытого ключа
csp->ImportKey(csp, hProv, PublicKeyBlob, PublicKeyBlobLen, 0, 0, &hKey)
проходит нормально
Возможен ли импорт закрытого ключа в криптопровайдере уровня ядра?