none
Signature Provider (провайдер подписи) ( CNG ) RRS feed

  • Общие обсуждения

  • Здравствуйте!
    Я создал тестовый криптопровайдер подписи на основе CNG ( cryptography next generation).

    Создал по аналогии с примером Miscrosoft "HashProviderSample". Зарегистрировал нужный OID и DLL.

    Все функцию вызываются успешно из тестового примера!

    Однако, при открытии сертификата двойным щелчком вызываются только функции:

    BCryptOpenAlgorithmProvider

    GetProperty  [ObjectLength]

    GetProperty  [HashDigestLength]

    А затем сразу CloseAlgorithmProvider.

    Такие функции как : ImportKeyPair, VerifySignature не вызываются или вызываются не правильно, соответственно результат проверки подписи отрицательный.

    Подскажите, пожалуйста, при открытии сертификата, двойным щелчком, Windows должна вызывать функцию VerifySignature из моего провайдера подписи? Если да, то в чем может заключаться причина ошибки? Что нужно чтобы при открытии сертификата Windows вызывал все функции из моего провайдера и успешно проверял подпись сертификата/цепочку?

    P.S.

    Все функции объявлены верно:

    BCRYPT_SIGNATURE_FUNCTION_TABLE MSTestSignFunctionTable =
    {
        BCRYPT_SIGNATURE_INTERFACE_VERSION_1,
        OpenAlgorithmProvider,
        GetProperty,
        SetProperty,
        CloseAlgorithmProvider,
        GenerateKeyPair,
        FinalizeKeyPair,
        SignHash,
        VerifySignature,
        ImportKeyPair,
        ExportKey,
        DestroyKey
    };

    Пример функции VerifySignature и ImportKeyPair:

    NTSTATUS
    WINAPI
    VerifySignature(
        __in                        BCRYPT_KEY_HANDLE   hKey,
        __in_opt                    VOID    *pPaddingInfo,
        __in_bcount(cbHash)         PUCHAR   pbHash,
        __in                        ULONG   cbHash,
        __in_bcount(cbSignature)    PUCHAR   pbSignature,
        __in                        ULONG   cbSignature,
        __in                        ULONG   dwFlags)
    {
        MessageBoxA(NULL,"VERIFY SINGNATURE!","SIGN PROVIDER",0);
        return STATUS_SUCCESS;
    }


    NTSTATUS
    WINAPI
    ImportKeyPair(
        __in                            BCRYPT_ALG_HANDLE hAlgorithm,
        __in_opt                        BCRYPT_KEY_HANDLE hImportKey,
        __in                            LPCWSTR pszBlobType,
        __out                           BCRYPT_KEY_HANDLE *phKey,
        __in_bcount(cbInput)            PUCHAR   pbInput,
        __in                            ULONG   cbInput,
        __in                            ULONG   dwFlags)
    {
        MessageBoxA(NULL,"IMPORT KEY PAIR","SIGN PROVIDER",0);
        return STATUS_SUCCESS;
    }

    Часть кода тестового примера:

    if(!NT_SUCCESS(status = BCryptOpenAlgorithmProvider(
                                                    &hSignAlg,
                                                    L"SIGN_FUNC",
                                                    NULL,
                                                    0)))
        {
            wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
            goto Cleanup;
        }
           if(!NT_SUCCESS(status = BCryptImportKeyPair(
                                                hSignAlg,
                                                NULL,
                                                BCRYPT_ECCPUBLIC_BLOB,
                                                &hTmpKey,
                                                pbBlob,
                                                cbBlob,
                                                0)))
        {
            wchar_t test[4000];
            swprintf(test,L"**** Error 0x%x returned by BCryptImportKeyPair\n", status);
            MessageBoxW(0,test,L"1",0);
            goto Cleanup;
        }
           if(!NT_SUCCESS(status = BCryptVerifySignature(
                                                hTmpKey,
                                                NULL,
                                                pbHash,
                                                cbHash,
                                                pbSignature,
                                                cbSignature,
                                                0)))
        {
            wchar_t test[4000];
            //    signe
          swprintf(test,L"**** Error 0x%x returned by BCryptVerifySignature\n", status);
          MessageBoxW(0,test,L"1",0);

            goto Cleanup;
        }
           else
           {
               MessageBoxA(0,"OK VERIFY OK","1",0);
           }
           Cleanup:
        
        if(hSignAlg)
        {
            BCryptCloseAlgorithmProvider(hSignAlg,0);
        }




    21 октября 2013 г. 13:50

Все ответы