2010-03-27 7 views
2

Salutations, ceci est mon premier post sur stackoverflow, et je suis désolé si c'est un peu long. J'essaye de construire un protocole de poignée de main pour mon propre projet et ai des problèmes avec le serveur convertissant la clé publique de RSA des clients à un Bignum. Cela fonctionne dans mon code de clent, mais le serveur segfaults en essayant de convertir la valeur hexadécimale du client RSA public en un bignum.BN_hex2bn par magie segfaults dans openSSL

J'ai déjà vérifié qu'il n'y a pas garbidge avant ou après les données RSA, et j'ai regardé en ligne, mais je suis coincé.

segment tête:

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

KEYS keys; 

fonction Initialiser:

// 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 

code problème (dans le réseau de la 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; 

Les segfaults programme à

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

avec l'erreur (sortie valgrind)

de lecture non valide de taille 8 à 0x50DBF9F: BN_hex2bn (en /usr/lib/libcrypto.so.0.9.8) par 0x40F23E: Réseau de server_handshake () (Network.cpp: 177) par 0x40EF42: Réseau :: startNet() (Network.cpp: 126) par 0x403C38: principal (server.cpp: 51) Adresse 0x20 n'est pas empilé, malloc'd ou (récemment) free'd

Processus se terminant avec l'action par défaut du signal 11 (SIGSEGV) Accès non dans la région cartographiée à un DRESSE 0x20 à 0x50DBF9F: BN_hex2bn (en /usr/lib/libcrypto.so.0.9.8)

Et je ne sais pas pourquoi il est, Im en utilisant exactement le même code dans le programme client, et ça fonctionne très bien. Toute entrée est grandement appréciée!

+0

Avez-vous vérifié, si le paramètre bigint que vous définissez n'est pas NULL? – Accipitridae

Répondre

4

RSA_new() ne crée la struct RSA, il ne pas créer l'un des objets à l'intérieur BigNum qui struct, comme les n et e champs. Vous devez les créer vous-même en utilisant BN_new(), ou plus probablement vous devez trouver la bonne fonction openssl pour générer ou lire dans votre clé RSA.

+0

BN_hex2bn doit initialiser n (si n est NULL) réellement lorsqu'il est appelé correctement. – diedthreetimes