BN_hex2bn магически сегрегирует в openSSL - PullRequest
2 голосов
/ 27 марта 2010

Привет, это мой первый пост на stackoverflow, и мне жаль, если он немного длинный.

Я пытаюсь создать протокол рукопожатия для своего собственного проекта, и у меня возникают проблемы с сервером, преобразующим открытый ключ RSA клиента в Bignum. Это работает в моем чистом коде, но сервер работает с ошибками при попытке преобразовать шестнадцатеричное значение общедоступного RSA клиента в bignum.

Я уже проверил, что нет никакого мусора до или после данных RSA, и посмотрел онлайн, но я застрял.

сегмент заголовка:

typedef struct KEYS {  
    RSA *serv;  
    char* serv_pub;  
    int pub_size;  
    RSA *clnt;  
} KEYS;

KEYS keys;

Функция инициализации:

// Generates and validates the servers key

/* code for generating server RSA left out, it's working */
//Set client exponent
keys.clnt = 0;
keys.clnt = RSA_new();
BN_dec2bn(&keys.clnt->e, RSA_E_S); // RSA_E_S contains the public exponent

Код проблемы (в сети :: server_handshake):

// *Recieved an encrypted message from the network and decrypt into 'buffer' (1024 byte long)*
cout << "Assigning clients RSA" << endl;
// I have verified that 'buffer' contains the proper key
if (BN_hex2bn(&keys.clnt->n, buffer) < 0) { 
    Error("ERROR reading server RSA");
}
cout << "clients RSA has been assigned" << endl;

Программа segfaults на

BN_hex2bn(&keys.clnt->n, buffer)

с ошибкой (вывод valgrind)

Недопустимое чтение размера 8 в 0x50DBF9F: BN_hex2bn (в /usr/lib/libcrypto.so.0.9.8) 0x40F23E: Сеть :: server_handshake () (Network.cpp: 177) по 0x40EF42: Сеть :: startNet () (Network.cpp: 126) по 0x403C38: основной (server.cpp: 51) Адрес 0x20 не является стековым, malloc или (недавно) свободным

Процесс завершается с действием по умолчанию для сигнала 11 (SIGSEGV) Доступ не в сопоставленном регионе по адресу 0x20 в 0x50DBF9F: BN_hex2bn (в /usr/lib/libcrypto.so.0.9.8)

И я не знаю, почему, я использую точно такой же код в клиентской программе, и он работает просто отлично. Любой вклад очень ценится!

1 Ответ

4 голосов
/ 28 марта 2010

RSA_new () только создает структуру RSA, она не создает любые объекты bignum внутри этой структуры, например поля n и e. Вы должны создать их самостоятельно, используя BN_new (), или, скорее всего, вам нужно найти подходящую функцию openssl для генерации или чтения в вашем ключе RSA.

...