ошибка сегмента для RSA_size () и EVP_PKEY_size () после использования EVP_PKEY_assign_RSA () или EVP_PKEY_set1_RSA () - PullRequest
0 голосов
/ 05 февраля 2019

, почему RSA_size () и EVP_PKEY_size () будут аварийно завершать работу после того, как я вызову EVP_PKEY_assign_RSA () или EVP_PKEY_set1_RSA () в моем коде?

версия openssl - 1.10.

Если я не вызываю EVP_RS() или EVP_PKEY_set1_RSA (), программа работает правильно.

Кроме того, я думаю, что обе эти функции используют обе для установки RSA_st из EVP_PKEY, у меня есть какое-то недопонимание этих двух функций?

void testfun(char **argc) {

    OpenSSL_add_all_algorithms();

    EVP_PKEY *prikey = nullptr, *pubkey = nullptr;
    BIO *prifile = nullptr, *pubfile = nullptr;
    RSA *pubrsa = nullptr, *prirsa = nullptr, *newra = nullptr;

    prifile = BIO_new_file(argc[1], "r");

    char passwd[] = "1111";
    prikey = EVP_PKEY_new();
    prikey = PEM_read_bio_PrivateKey(prifile, nullptr, 0, passwd);

    prirsa = RSA_new();

    /* all those code block combination will cause segmentation fault
     * 1-3
     * 1-4
     * 2-3
     * 2-4
     * and output will be correct if i only use code block 3
     * */

    //1
    //cout << EVP_PKEY_assign_RSA(prikey, prirsa) << endl;

    //2
    //cout << EVP_PKEY_set1_RSA(prikey, prirsa) << endl;

    //3
    //cout << EVP_PKEY_size(prikey) << endl;

    //4
    //cout << RSA_size(prirsa) << endl;
}

1 Ответ

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

RSA_size сбой

RSA_size берет указатель RSA и возвращает размер модуля ключа - указанный ключ должен быть инициализирован в соответствии с https://www.openssl.org/docs/man1.0.2/man3/RSA_size.html rsa->n must не быть NULL .Ваш RSA_new не создает ключ - он только распределяет структуру.Таким образом, вы не можете вызвать функцию, которая извлекает размер из несуществующего ключа.

EVP_PKEY_size crash

EVP_PKEY_size причина сбоя в основном та же - вы назначаете неправильный ключ длясуществующий правильный ключ (при условии, что вы указали правильный ключ в BIO_new_file.

Итак, код, который вы, вероятно, ищете:

  1. Генерация ключа RSAс паролем 1111, вот так:

    openssl genrsa -des3 -out private.pem 2048

  2. Запустите программу со следующим кодом:

    #include <iostream>
    #include <openssl/evp.h>
    #include <openssl/pem.h>
    #include <cassert>
    
    int main() {
        OpenSSL_add_all_algorithms();
    
        // UNUSED
        // *pubkey = nullptr;
        // *pubfile = nullptr;
        // RSA *pubrsa = nullptr, *prirsa = nullptr, *newra = nullptr;
    
        BIO * prifile = BIO_new_file("../private.pem", "r");
        assert(prifile);
    
        char passwd[] = "1111";
        //prikey = EVP_PKEY_new(); // why allocate if you assign it somewhere else? memory leak!
        EVP_PKEY * prikey = PEM_read_bio_PrivateKey(prifile, nullptr, 0, passwd);
        assert(prikey);
    
        //1
        //std::cout << EVP_PKEY_assign_RSA(prikey, prirsa) << std::endl;
    
        //2
        //std::cout << EVP_PKEY_set1_RSA(prikey, prirsa) << std::endl;
    
        //3 Should correctly output 256 (modulo size in bytes)
        std::cout << EVP_PKEY_size(prikey) << std::endl;
    
        //4
        //std::cout << RSA_size(prirsa) << std::endl;
    
        std::cout << "done\n";
        return 0;
    }
    

Вам не нужны EVP_PKEY_assign_RSA или EVP_PKEY_set1_RSA для чтения вашей клавиши. Функция PEM_read_bio_PrivateKey сделает все это за вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...