C/C++ [C++] Problème lors de l'encryption des credentials

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#1
Bonjour,

Je suis actuellement entrain de tenter de sérialiser le paquet 4, pour ce faire, j'appelle donc la fonction generateCredentials et ensuite encrypt credentials qui sont dans l'ordre:
Code:
QList<int> RsaManager::generateCredentials(const QString &salt, const QString &username, const QString &password)
{
    MessageWriter temp;
    temp.writeUTFBytes(salt.toStdString().c_str());
    temp.writeByte(username.size());
    temp.writeUTFBytes(username.toStdString().c_str());
    temp.writeUTFBytes(password.toStdString().c_str());

    QByteArray credentials(temp.getBuffer(),temp.getSize());

    credentials = loginPublicKeyEncrypt(credentials);
    MessageReader reader(credentials.data());
    m_credentials.clear();

    for(int i = 0; i < credentials.size(); i++) 
       {
          char data = reader.readByte();
           m_credentials[i] = data;
       }

    foreach (int number, m_credentials)
        qDebug()<<number;

     return m_credentials;
}
et
Code:
QByteArray RsaManager::loginPublicKeyEncrypt(const QByteArray &credentials) {
    char * loginPublicKeyByte = (char *) malloc(m_loginPublicKey.size());
    strcpy(loginPublicKeyByte, m_loginPublicKey.toStdString().c_str());

    BIO *bp_login = BIO_new_mem_buf(loginPublicKeyByte, -1);
    RSA *my_second_rsa = PEM_read_bio_RSA_PUBKEY(bp_login, NULL, NULL, NULL);
    byte *pinputCredentials, *poutputCredentials;
    pinputCredentials = (byte*) malloc(5000);
    poutputCredentials = (byte*) malloc(5000);
    pinputCredentials = (byte*)credentials.data();

    int buflen = RSA_public_encrypt(credentials.size(), pinputCredentials, poutputCredentials, my_second_rsa, RSA_PKCS1_PADDING);
    m_outputCredentialsVector = QByteArray((const char*)poutputCredentials, buflen);

sauf que arrivé a la ligne
Code:
int buflen = RSA_public_encrypt(credentials.size(), pinputCredentials, poutputCredentials, my_second_rsa, RSA_PKCS1_PADDING);
le prog plante sans raison!
Si vous pouviez m'aider merci d'avance!
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Aucune erreur ne s'affiche ? La fenetre ne répond pas ?
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#3
Le prog quitte subitement la fenêtre se ferme.
D'après ce que j'ai compris l'erreur c'est un seg fault
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#5
NicoMasterChief a dit:
Utilise GDB pour connaître l'erreur.
oui c'est ce que j'ai fait mais le debug me signale juste une erreur au niveau de cette fonction en disant que c'est genre un acces a une case d'un array non autorisé par la mémoire :(
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#6
Code:
pinputCredentials = (byte*)credentials.data();
Ça m'étonnerait beaucoup qu'on puisse convertir tout un tableau comme ça. Mais je me trompe peut-être.

Et sinon, ta première fonction DofusPKeyDecrypt, elle marche ?
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#7
NicoMasterChief a dit:
Code:
pinputCredentials = (byte*)credentials.data();
Ça m'étonnerait beaucoup qu'on puisse convertir tout un tableau comme ça. Mais je me trompe peut-être.

Et sinon, ta première fonction DofusPKeyDecrypt, elle marche ?
je vais voir en ce qui concerne la conversion, ce qui m'étonne c'est que Decrypt marche....
EDIT: la conversion est bonne
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#8
Ça convertit tout le tableau en byte ?!
Moi la première ne marche pas... Je peux voir ta première fonction.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#9
ca c'est ma premiere fonction:

Code:
QByteArray RsaManager::publicKeyDecrypt(const QByteArray &signature) {
    char * DPKey =(char *) malloc(m_privateKey.size());
    strcpy(DPKey, m_privateKey.toStdString().c_str());

    BIO *bp_dofus = BIO_new_mem_buf(DPKey, m_privateKey.size());
    RSA *my_rsa = PEM_read_bio_RSA_PUBKEY(bp_dofus, NULL, NULL, NULL);

    byte *inputSignature, *outputSignature;
    inputSignature = (byte*) malloc(5000);
    outputSignature = (byte*) malloc(5000);
    inputSignature = (byte*)signature.data();
    int buflen = RSA_public_decrypt(signature.size(), inputSignature, outputSignature, my_rsa, RSA_PKCS1_PADDING);

    m_outputSignatureVector = QByteArray((const char*)outputSignature, buflen);
    return m_outputSignatureVector;
 }
j'ai plus d'infos sur l'erreur: apparamment le GDB m'indique que l'adresse des pointeurs est "out of bounds"
 
A

Anonymous

Invité
#10
Attention, les QByteArray n'ont pas le même comportement vis à vis de la mémoire qu'un bête vector !
Je ne serais pas étonné que le soucis se trouve à ce niveau : pinputCredentials = (byte*)credentials.data(); ou alors c'est un soucis avec le size.

Manipuler des objets haut niveau Qt avec des librairies assez bas niveau comme openssl est un exercice risqué.
Je te conseille de garder ma classe originale qui fonctionne très bien et de faire un cast avant appel de ton QByteArray vers un vector.

J'ajoute que même si tout le monde s'en fout, elle est sous licence GPLv3 et tout ce que cela implique ...

Edit : en plus les QByteArray vont automatiquement te terminer les données par un '\0', qui n'est pas compté dans la size. Fait extrêmement attention avec ces objets, ça me fait me rappeler maintenant pourquoi j'avais choisi de ne pas les utiliser.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#11
Bon,
Je ne sais par quel miracle mais le truc ne plante plus, ca venait des mallocs et y'avais des débordements de mémoire

Munrek a dit:
J'ajoute que même si tout le monde s'en fout, elle est sous licence GPLv3 et tout ce que cela implique ...
Ne t'inquiète pas j'utilise seulement ta classe pour tester mais a terme je ferais ma propre classe

PS: j'ai réussi a me connecter et je reçois entre autres le paquet 22 :) ! (ce qui est, pour ne rien vous cacher, extrêmement jouissif)
 
A

Anonymous

Invité
#12
Comment un bete malloc peut générer un débordement de mémoire, alors qu'il n'y a pas de boucle o_O
Je n'avais aucun soucis en C++ brut, peut etre est-ce la faute de Qt qui redéfinit size_t ? Il aurait peut etre fallu mettre 5000*sizeof(char) ou un truc comme ça.

En tout cas sent le bug interne à Qt, je n'ai jamais eu de soucis avec.

En ce qui concerne cette classe, tu n'es pas le seul à l'exploiter et la modifier au mépris de sa license d'utilisation, j'avoue avoir fait un peu exprès pour voir comment vous réagiriez.
 
Haut Bas