Привет, это мой первый пост на 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)
И я не знаю, почему, я использую точно такой же код в клиентской программе, и он работает просто отлично. Любой вклад очень ценится!