Я работаю со старым кодом, который подписывал данные с использованием установленного сертификата и CryptoAPI, и мне нужно перенести его на использование CNG. Я попробовал два разных подхода: один с использованием CryptAcquireCertificatePrivateKey(), а другой с использованием NCryptOpenStorageProvider() и NCryptOpenKey(). Оба подхода открывают ключ CNG, и первый вызов NCryptSignHash() правильно возвращает длину подписи как 256 байт.
Второй вызов NCryptOpenKey() для создания данных подписи всегда происходит сбой с NTE_INVALID_PARAMETER (0x80090027).
Я сформулировал проблему в этом примере:
Когда я попробовал AcquireCertificatePrivateKey(), я подтвердил, что pKeyProvInfo->dwKeySpec содержит AT_KEYEXCHANGE, который также использовался в исходном коде. Я передаю NCRYPT_MACHINE_KEY_FLAG из-за того, как настроен сертификат, и во время тестирования я запускаю Visual Studio и Embarcadero от имени администратора.
Есть идеи?
Спасибо!
Я работаю со старым кодом, который подписывал данные с использованием установленного сертификата и CryptoAPI, и мне нужно перенести его на использование CNG. Я попробовал два разных подхода: один с использованием CryptAcquireCertificatePrivateKey(), а другой с использованием NCryptOpenStorageProvider() и NCryptOpenKey(). Оба подхода открывают ключ CNG, и первый вызов NCryptSignHash() правильно возвращает длину подписи как 256 байт. Второй вызов NCryptOpenKey() для создания данных подписи всегда происходит сбой с NTE_INVALID_PARAMETER (0x80090027). Я сформулировал проблему в этом примере: [code]#define MY_TYPE (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
// The real data is a SHA-1 hash, but this should be fine for testing for(int i = 0; i < sizeof(bData); i++) bData[i] = i; Check(NCryptSignHash(hKey, NULL, bData, sizeof(bData), NULL, 0, &dwSigLen, 0));
Cleanup: if(pbSignature) free(pbSignature); if(hKey && fCallerFree) NCryptFreeObject(hKey); if(hProvider) NCryptFreeObject(hProvider); if(hStoreHandle) CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG); return hr; } [/code] Когда я попробовал AcquireCertificatePrivateKey(), я подтвердил, что pKeyProvInfo->dwKeySpec содержит AT_KEYEXCHANGE, который также использовался в исходном коде. Я передаю NCRYPT_MACHINE_KEY_FLAG из-за того, как настроен сертификат, и во время тестирования я запускаю Visual Studio и Embarcadero от имени администратора. Есть идеи? Спасибо!