Убедитесь, что открытый ключ соответствует подписи закрытого ключа

Я новичок в openssl API.

Моя цель - убедиться, что мой открытый ключ «связан» с моим скрытым закрытым ключом.

решение с использованием openssl cli:

У меня есть сертификат, закрытый ключ скрыт (в HSM) у меня есть буфер:

echo "hello world!!!!" > sign.txt

используя следующие команды, я создаю сигнатуру sha256 моего буфера, аналогичную тому, что будет делать мой HSM:

openssl dgst -sha256 -sign myrootca.key.insecure -out sign.sha256 sign.txt

извлечь открытый ключ:

openssl x509 -pubkey -noout -in myrootca.crt  > myrootca.publicKey.pem

проверить открытый ключ:

openssl dgst -sha256 -verify myrootca.publicKey.pem -signature sign.sha256 sign.txt

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

sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL,
                                 e, "key file");
sigbio = BIO_new_file(sigfile, "rb");

но не могу найти подходящий API, чтобы продолжить отсюда


person LordTitiKaka    schedule 29.11.2017    source источник
comment
Может быть полезно Проверка подписи сертификата x509 вручную   -  person David C. Rankin    schedule 29.11.2017
comment
у вас есть подпись с закрытым ключом, который спрятан в hsm   -  person Pras    schedule 29.11.2017
comment
См. Пример кода на этой странице: wiki.openssl.org/index.php / Руководство: EVP_PKEY_verify (3)   -  person lockcmpxchg8b    schedule 29.11.2017
comment
@Pras мой HSM PCI содержит закрытый ключ (и), сервер (содержащий PCI) может подписывать буфер, используя закрытый ключ, я использую открытый ключ, чтобы быть уверенным, что подписание выполнено с правильным закрытым ключом   -  person LordTitiKaka    schedule 29.11.2017
comment
@ lockcmpxchg8b Я разберусь !! и опубликуйте мой вывод (или ответ)   -  person LordTitiKaka    schedule 29.11.2017
comment
@ lockcmpxchg8b ваш пример направил меня на правильный путь, см. опубликованный ответ   -  person LordTitiKaka    schedule 06.12.2017


Ответы (1)


Проблема, с которой я столкнулся, заключалась в том, чтобы выяснить, какова длина подписи, прежде чем выделить место для подписи, которая должна иметь предварительные знания о размере ключа RSA и типе хэша.

sha256 + RSA1024 ~ 128byte
sha256 + RSA2048 ~ 256byte

используя openssl API, на основе этого руководства мне удалось проверить подпись, используя следующий код:

Verifyx509VsPrivKeySig(X509* x509Cert,char* signature,size_t sigLen,char* message,size_t messageLen)
{
        int rc;
        EVP_PKEY* pPubkey = NULL;
        EVP_MD_CTX* ctx = NULL;

        rc = getX509Publickey(x509Cert, &pPubkey);
        if (rc != SSL_OK)
        {
                goto err_verify;
        }

        ctx = EVP_MD_CTX_create();
        if(ctx == NULL) {
                PRINT_LOG_ERR("EVP_MD_CTX_create failed, error 0x%lx\n", ERR_get_error());
                /* failed */
                goto err_verify;
        }

        rc = EVP_DigestVerifyInit(ctx, NULL, EVP_sha256(), NULL, pPubkey);
        if(rc != 1) {
                PRINT_LOG_ERR("EVP_DigestVerifyInit failed, error 0x%lx\n", ERR_get_error());
                goto err_EVP_XTX_destroy; /* failed */
        }

        rc = EVP_DigestVerifyUpdate(ctx, message, messageLen);
        if(rc != 1) {
                PRINT_LOG_ERR("EVP_DigestVerifyUpdate failed, error 0x%lx\n", ERR_get_error());
                goto err_EVP_XTX_destroy; /* failed */
        }

        /* Clear any errors for the call below */
        ERR_clear_error();

        rc = EVP_DigestVerifyFinal(ctx,(const unsigned char*) signature, sigLen);
        if(rc != 1) {
                PRINT_LOG_ERR("EVP_DigestVerifyFinal failed, error 0x%lx\n", ERR_get_error());
                goto err_EVP_XTX_destroy; /* failed */
        }


        /*if we got to here , verify sig finished with good result!!*/
    if(ctx) {
        EVP_MD_CTX_destroy(ctx);
        ctx = NULL;
    }

    return true;
    //////////////////// ERROR HANDLING ///////////////////////////
err_EVP_XTX_destroy:
        EVP_MD_CTX_destroy(ctx);
err_verify:
        return false;
}
person LordTitiKaka    schedule 06.12.2017