Как экспортировать закрытый ключ E C в формате PKCS # 1 или PKCS # 8 из хранилища сертификатов CNG? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытался экспортировать закрытый ключ из хранилища сертификатов с помощью API CNG. Он работает нормально при экспорте закрытого ключа RSA, но в секретном ключе E C произошел сбой.

Не удалось выполнить код в NCryptExportKey() с 0x80090029.

. : Экспорт E C закрытый ключ не поддерживается? или любой пример кода?

Вот мой код:

    NCRYPT_KEY_HANDLE       hKey = NULL;
    SECURITY_STATUS         secStatus = ERROR_SUCCESS;
    NTSTATUS                status = STATUS_UNSUCCESSFUL;
    DWORD                   dwKeySpec, cbData = 0, cbBlob = 0, KeyPolicy = 0;
    PBYTE                   pbHash = NULL, pbBlob = NULL;
    PCCERT_CONTEXT          pSignerCert = NULL;
    unsigned char           *MessagePrivKey;
    Struct_Return ExportMessage = { NULL, 0 };
    bool bStatus;

    pSignerCert = GetCert(MY_CERT_NAME);

    if (!CryptAcquireCertificatePrivateKey(
        pSignerCert,
        CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG,
        NULL,
        &hKey,
        &dwKeySpec,
        NULL))
    {
        goto End;
    }

    if (FAILED(secStatus = NCryptExportKey(
        hKey,
        NULL,
        NCRYPT_PKCS8_PRIVATE_KEY_BLOB,
        NULL,
        NULL,
        0,
        &cbBlob,
        0)))
    {
        wprintf(L"**** Error 0x%x returned by NCryptExportKey\n", secStatus);
        goto End;
    }

    pbBlob = (PBYTE)HeapAlloc(GetProcessHeap(), 0, cbBlob);
    if (NULL == pbBlob)
    {
        wprintf(L"**** memory allocation failed\n");
        goto End;
    }


    if (FAILED(secStatus = NCryptExportKey(
        hKey,
        NULL,
        NCRYPT_PKCS8_PRIVATE_KEY_BLOB,
        NULL,
        pbBlob,
        cbBlob,
        &cbBlob,
        0)))
    {
        wprintf(L"**** Error 0x%x returned by NCryptExportKey\n", secStatus);
        goto End;
    }

Я также пытался вызвать NCryptSetProperty() перед экспортом, но это не удалось с 0x8009000b.

KeyPolicy =  NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG | NCRYPT_ALLOW_EXPORT_FLAG;

    if (FAILED(secStatus = NCryptSetProperty(
        hKey,
        NCRYPT_EXPORT_POLICY_PROPERTY,
        (PBYTE)&KeyPolicy,
        sizeof(KeyPolicy),
        NCRYPT_PERSIST_FLAG)))
    {
        wprintf(L"**** Error 0x%x returned by NCryptSetProperty\n", secStatus);
        goto End;
    }
...