Проверка подписи сообщения приводит к ошибке HEADER TOO LONG - PullRequest
0 голосов
/ 25 февраля 2019

Фон

Я пытаюсь проверить подпись данного двоичного файла, используя openssl.Фактическое подписание бинарного хэша выполняется третьей стороной.И у третьей стороны, и у меня есть один и тот же точный сертификат - они отправили мне сертификат.

Я проверил работоспособность своего сертификата, запустив openssl x509 -noout -text -inform DER -in CERT_PATH.Это правильно отображает содержимое сертификата.

Ниже приведен мой код - я основал его на примере openssl wiki здесь :

static std::vector<char> ReadAllBytes(char const* filename){
    std::ifstream ifs(filename, std::ios::binary|std::ios::ate);
    std::ifstream::pos_type pos = ifs.tellg();

    std::vector<char>  result(pos);

    ifs.seekg(0, std::ios::beg);
    ifs.read(result.data(), pos);

    return result;
}

int main(int ac, const char * av[]) {

    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();

    // most of error check omitted for brevity

    auto foundBinBytes = ReadAllBytes("BINARY_PATH");

    auto foundSgnBytes = ReadAllBytes("SIGNATURE_PATH");

    auto foundCertBytes = ReadAllBytes("CERT_PATH");

    ERR_clear_error();
    BIO *b = NULL;
    X509 *c;
    b = BIO_new_mem_buf(reinterpret_cast<const unsigned char *>(foundCertBytes.data()), foundCertBytes.size());

    c = d2i_X509_bio(b, NULL);
    EVP_MD_CTX* ctx = NULL;
    ctx = EVP_MD_CTX_create();

    const EVP_MD* md = EVP_get_digestbyname("SHA256");

    int rc = EVP_DigestInit_ex(ctx, md, NULL);

    EVP_PKEY *k = NULL;
    k = X509_get_pubkey(c);

    rc = EVP_DigestVerifyInit(ctx, NULL, md, NULL, k);

    rc = EVP_DigestVerifyUpdate(ctx, reinterpret_cast<const unsigned char *>(foundBinBytes.data()), foundBinBytes.size());

    ERR_clear_error();
    rc = EVP_DigestVerifyFinal(ctx, reinterpret_cast<const unsigned char *>(foundSgnBytes.data()), foundSgnBytes.size());

    ERR_print_errors_fp( stdout );
    // openssl free functions omitted
    if(ctx) {
        EVP_MD_CTX_destroy(ctx);
        ctx = NULL;
    }

    return 0;
}

Issue

Запуск этого кода приводит к следующим ошибкам:

4511950444:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:/.../crypto/asn1/asn1_lib.c:152:
4511950444:error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header:/.../crypto/asn1/tasn_dec.c:1152:
4511950444:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:/.../crypto/asn1/tasn_dec.c:314:Type=X509_SIG

Вопрос

Что не так с моей настройкой / кодом?Я что-то пропустил по пути?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы никогда не проверяете ошибки при чтении файлов.Там могут быть ошибки (существует ли файл «CERT_PATH»? У вас есть права на чтение? ...).

Если «CERT_PATH» не может быть прочитано, foundCertBytes.data () - это пустой байтовый массив, и это объясняет последующие ошибки.

...