IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Bug dans libcrypto.


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut Bug dans libcrypto.
    Salut!

    J'ai un bug dans libcrypto, voici l'assembleur générer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    0x43ba20	push   rbp
    0x43ba21	mov    rbp,rsp
    0x43ba24	sub    rsp,0x50
    0x43ba28	mov    QWORD PTR [rbp-0x8],rdi
    0x43ba2c	mov    rdi,QWORD PTR [rbp-0x8]
    0x43ba30	mov    QWORD PTR [rbp-0x38],rdi
    0x43ba34	call   0x4807e0 <odfaeg::core::Application::load()>
    0x43ba39	mov    rdi,QWORD PTR [rbp-0x38]
    0x43ba3d	call   0x480800 <odfaeg::core::Application::init()>
    0x43ba42	mov    rdi,QWORD PTR [rbp-0x38]
    0x43ba46	mov    BYTE PTR [rdi+0x48],0x1
    0x43ba4a	mov    rax,QWORD PTR [rbp-0x38]
    0x43ba4e	test   BYTE PTR [rax+0x48],0x1
    0x43ba52	je     0x43bbe0 <odfaeg::core::Application::exec()+448>
    0x43ba58	movabs rsi,0x0
    0x43ba62	mov    rax,QWORD PTR [rbp-0x38]
    0x43ba66	add    rax,0x8
    0x43ba6c	mov    rdi,rax
    0x43ba6f	call   0x4806d0 <std::operator!=<odfaeg::graphic::RenderWindow, std::default_delete<odfaeg::graphic::RenderWindow> >(std::unique_ptr<odfaeg::graphic::RenderWindow, std::default_delete<odfaeg::graphic::RenderWindow> > const&, decltype(nullptr))>
    0x43ba74	test   al,0x1
    0x43ba76	jne    0x43ba81 <odfaeg::core::Application::exec()+97>
    0x43ba7c	jmp    0x43baba <odfaeg::core::Application::exec()+154>
    0x43ba81	mov    rax,QWORD PTR [rbp-0x38]
    0x43ba85	add    rax,0x8
    0x43ba8b	mov    rdi,rax
    0x43ba8e	call   0x480700 <std::unique_ptr<odfaeg::graphic::RenderWindow, std::default_delete<odfaeg::graphic::RenderWindow> >::operator->() const>
    0x43ba93	mov    rdi,rax
    0x43ba96	call   0x409960 <sf::Window::isOpen() const@plt>
    0x43ba9b	test   al,0x1
    0x43ba9d	jne    0x43baa8 <odfaeg::core::Application::exec()+136>
    0x43baa3	jmp    0x43baba <odfaeg::core::Application::exec()+154>
    0x43baa8	mov    rdi,QWORD PTR [rbp-0x38]
    0x43baac	call   0x480820 <odfaeg::core::Application::render()>
    0x43bab1	mov    rdi,QWORD PTR [rbp-0x38]
    0x43bab5	call   0x4809a0 <odfaeg::core::Application::update()>
    0x43baba	call   0x480ce0 <odfaeg::network::Network::getCliInstance()>
    0x43babf	mov    rdi,rax
    0x43bac2	call   0x486670 <odfaeg::network::SrkClient::isRunning()>
    0x43bac7	test   al,0x1
    0x43bac9	jne    0x43bad4 <odfaeg::core::Application::exec()+180>
    0x43bacf	jmp    0x43baf6 <odfaeg::core::Application::exec()+214>
    0x43bad4	call   0x480ce0 <odfaeg::network::Network::getCliInstance()>
    0x43bad9	mov    rdi,rax
    0x43badc	call   0x484c10 <odfaeg::network::SrkClient::isUsingThread()>
    0x43bae1	test   al,0x1
    0x43bae3	jne    0x43baf6 <odfaeg::core::Application::exec()+214>
    0x43bae9	call   0x480ce0 <odfaeg::network::Network::getCliInstance()>
    0x43baee	mov    rdi,rax
    0x43baf1	call   0x486680 <odfaeg::network::SrkClient::checkMessages()>
    0x43baf6	call   0x480de0 <odfaeg::network::Network::getSrvInstance()>
    0x43bafb	mov    rdi,rax
    0x43bafe	call   0x4890e0 <odfaeg::network::SrkServer::isRunning()>
    0x43bb03	test   al,0x1
    0x43bb05	jne    0x43bb10 <odfaeg::core::Application::exec()+240>
    0x43bb0b	jmp    0x43bb32 <odfaeg::core::Application::exec()+274>
    0x43bb10	call   0x480de0 <odfaeg::network::Network::getSrvInstance()>
    0x43bb15	mov    rdi,rax
    0x43bb18	call   0x487540 <odfaeg::network::SrkServer::isUsingThread()>
    0x43bb1d	test   al,0x1
    0x43bb1f	jne    0x43bb32 <odfaeg::core::Application::exec()+274>
    0x43bb25	call   0x480de0 <odfaeg::network::Network::getSrvInstance()>
    0x43bb2a	mov    rdi,rax
    0x43bb2d	call   0x4890f0 <odfaeg::network::SrkServer::checkMessages()>
    0x43bb32	mov    rax,QWORD PTR [rbp-0x38]
    0x43bb36	mov    rcx,QWORD PTR [rax]
    0x43bb39	mov    rcx,QWORD PTR [rcx+0x28]
    0x43bb3d	mov    rdi,rax
    0x43bb40	call   rcx
    0x43bb42	lea    rax,[rbp-0x18]
    0x43bb46	mov    rdi,rax
    0x43bb49	mov    QWORD PTR [rbp-0x40],rax
    0x43bb4d	call   0x409940 <std::allocator<char>::allocator()@plt>
    0x43bb52	mov    edx,0x4e790e
    0x43bb57	mov    esi,edx
    0x43bb59	lea    rdi,[rbp-0x10]
    0x43bb5d	mov    rdx,QWORD PTR [rbp-0x40]
    0x43bb61	call   0x409cc0 <std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)@plt>
    0x43bb66	jmp    0x43bb6b <odfaeg::core::Application::exec()+331>
    0x43bb6b	lea    rsi,[rbp-0x10]
    0x43bb6f	mov    rdi,QWORD PTR [rbp-0x38]
    0x43bb73	call   0x419bc0 <odfaeg::core::Application::getClock(std::string)>
    0x43bb78	mov    QWORD PTR [rbp-0x48],rax
    0x43bb7c	jmp    0x43bb81 <odfaeg::core::Application::exec()+353>
    0x43bb81	mov    rdi,QWORD PTR [rbp-0x48]
    0x43bb85	call   0x4091e0 <sf::Clock::restart()@plt>
    0x43bb8a	mov    QWORD PTR [rbp-0x50],rax
    0x43bb8e	jmp    0x43bb93 <odfaeg::core::Application::exec()+371>
    0x43bb93	lea    rdi,[rbp-0x10]
    0x43bb97	mov    rax,QWORD PTR [rbp-0x50]
    0x43bb9b	mov    QWORD PTR [rbp-0x30],rax
    0x43bb9f	call   0x409c80 <std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()@plt>
    0x43bba4	lea    rdi,[rbp-0x18]
    0x43bba8	call   0x409d90 <std::allocator<char>::~allocator()@plt>
    0x43bbad	jmp    0x43ba4a <odfaeg::core::Application::exec()+42>
    0x43bbb2	mov    ecx,edx
    0x43bbb4	mov    QWORD PTR [rbp-0x20],rax
    0x43bbb8	mov    DWORD PTR [rbp-0x24],ecx
    0x43bbbb	jmp    0x43bbd2 <odfaeg::core::Application::exec()+434>
    0x43bbc0	lea    rdi,[rbp-0x10]
    0x43bbc4	mov    ecx,edx
    0x43bbc6	mov    QWORD PTR [rbp-0x20],rax
    0x43bbca	mov    DWORD PTR [rbp-0x24],ecx
    0x43bbcd	call   0x409c80 <std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()@plt>
    0x43bbd2	lea    rdi,[rbp-0x18]
    0x43bbd6	call   0x409d90 <std::allocator<char>::~allocator()@plt>
    0x43bbdb	jmp    0x43bbeb <odfaeg::core::Application::exec()+459>
    0x43bbe0	mov    eax,0x0
    0x43bbe5	add    rsp,0x50
    0x43bbe9	pop    rbp
    0x43bbea	ret
    0x43bbeb	mov    rdi,QWORD PTR [rbp-0x20]
    0x43bbef	call   0x409320 <_Unwind_Resume@plt>
    La pile d'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #0 0x7ffff6673a41	??() (/lib/x86_64-linux-gnu/libcrypto.so.1.0.0:??)
    #1 0x48febc	odfaeg::network::Rsa::decryptWithPrKey(unsigned char const*, int, int*) () (??:??)
    #2 0x4900e9	odfaeg::network::EncryptedPacket::onReceive(void const*, unsigned long) () (??:??)
    #3 0x7ffff79bb42d	sf::TcpSocket::receive(sf::Packet&) () (/usr/local/lib/libsfml-network.so.2.3:??)
    #4 0x489b37	odfaeg::network::SrkServer::checkMessages() () (??:??)
    #5 0x43bb32	odfaeg::core::Application::exec(this=0x7fffffebb138) (../../../../../usr/local/include/odfaeg/Core/application.h:84)
    #6 0x436b33	main(argv=1, argc=0x7fffffffe488) (/home/laurent/Développement/Projets-c++/ODFAEG-SERVER/main.cpp:20)
    Et enfin, le code source ou se produit le bug, il faut noter également que je change le certificat à plusieurs reprise, la première fois pour chiffrer les messages avec la clé publique du client, et la seconde fois pour envoyer la clé publique du serveur au client.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     void Rsa::setCertificate(const unsigned char* in, int length) {
                x = d2i_X509(NULL,&in,length);
                evp_pkey = X509_get_pubkey(x);
                keypair = EVP_PKEY_get1_RSA(evp_pkey);           
            }
    unsigned char* Rsa::decryptWithPrKey (const unsigned char *encData, int dataSize, int* newSize) {
                unsigned char *data = new unsigned char[dataSize];
                *newSize = RSA_private_decrypt(RSA_size(keypair), encData, data, keypair, RSA_PKCS1_OAEP_PADDING);
                if (*newSize == -1) {
                    char* err = (char*) malloc(130);
                    ERR_load_crypto_strings();
                    ERR_error_string(ERR_get_error(), err);
                    fprintf(stderr, "Error encrypting message: %s\n", err);
                    free(err);
                    return nullptr;
                }
                return data;
            }

    Je pense qu'il doit vraiment y avoir un problème dans lib crypto. :/

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ha oui j'oubliais le plantage surviens dans cette fonction-ci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    keypair = EVP_PKEY_get1_RSA(evp_pkey);

    Dans la fonction EVP_PKEY_get1_RSA donc.

    A cette ligne-ci dans le code ASM :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0x7ffff669ff41	cmp    DWORD PTR [rdi],0x6

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Lolilolight Voir le message
    Salut!
    <snip>
    Je pense qu'il doit vraiment y avoir un problème dans lib crypto. :/
    Encore une fois libcrypto est utilisée de manière intensive... S'il y avait un bug quelconque, on peut décemment estimer qu'il aurait surement été remonté et corrigé depuis longtemps

    Je ne garanti pas que libcrypto soit totalement exempte de bug (je ne m'y suis pas assez intéressé pour pouvoir faire une telle affirmation), mais il y a surement beaucoup plus de chances pour que tu fasses une c...rie en essayant de l'utiliser que de chances d'avoir effectivement repéré un bug

    Malheureusment, je suis trop crevé et je ne manipule pas cette bibliothèque avec assez d'aisance que pour essayer de trouver où se situe le problème
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Malheureusment, je suis trop crevé et je ne manipule pas cette bibliothèque avec assez d'aisance que pour essayer de trouver où se situe le problème
    Surtout sans voir le main()...
    -- Yankel Scialom

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et si tu as un bug dans libcrypto, c'est eux que ca intéresse en premier lieu.
    Tu trouveras sur leur site un moyen de rapporter ce bug (un bug tracker quelconque, genre trackpad) que je t'invite très vivement à utiliser.

    Eux sauront à la fois t'indiquer comment le contourner le temps qu'il soit corrigé, ou te montrer ce que tu fais de travers.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char* Rsa::decryptWithPrKey (const unsigned char *encData, int dataSize, int* newSize) {
                unsigned char *data = new unsigned char[dataSize];
                *newSize = RSA_private_decrypt(RSA_size(keypair), encData, data, keypair, RSA_PKCS1_OAEP_PADDING);
    J'ai copié les deux premières lignes de ta fonction.

    Puisque newSize n'est pas une référence mais un pointeur, peux-tu m'expliquer pourquoi tu ne vérifies pas que le pointeur n'est pas nul?
    As-tu vérifié la documentation de RSA_private_decrypt? et de RSA_size?


    Par ailleurs, en cas d'erreur, tu ne fais pas de delete de data.

    Pour moi, il y a au moins deux fautes graves qui sont de ton ressort.

    Ton bug de libcrypto n'est pas crédible tant que tu ne pourras pas montrer un main produisant cette erreur.
    Quitte à utiliser une string faite à la main.
    Ca s'appelle un "code minimal reproduisant le problème"
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Que vaut ?

    * keypair
    * RSA_size(keypair)

    man RSA_private_decrypt donne quelques préconditions à respecter sur les paramètres. Soit tu les respectes, et dans ce cas, effectivement, tu es en droit de remonter un bug à libcrypto, soit tu ne les respectes pas, et à toi de faire ta part du contrat .

    Sinon, pourquoi renvoyer un char* ? std::vector<unsigned char> ça ne te coûtera pas bien cher et t’évitera un des problèmes qu’a souligné leternel (pour le deuxième, passe ton paramètre par référence plutôt que par pointeur).

  7. #7
    Invité
    Invité(e)
    Par défaut
    RSA_size(keypair) vaut 256 et keypair on dirait qu'il n'est pas bon, car lorsque je n'utilise pas ces fonctions là pas de soucis.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::string Rsa::ossl_getCertificate () {
            unsigned char* out=nullptr;
            int len= i2d_X509(x, &out);
            return std::string (reinterpret_cast<char*>(out), len);
    }
    void Rsa::ossl_setCertificate(std::string in) {
           const unsigned char* c_in = reinterpret_cast<const unsigned char*>(in.c_str());
           x = d2i_X509(NULL,&c_in,in.length());
           evp_pkey = X509_get_pubkey(x);
           keypair = EVP_PKEY_get1_RSA(evp_pkey);           
    }

    C'est sûrement la fonction pour extraire la clé publique du certificat qui foire.

    Mais en matière de certificat je n'y connais rien du tout, j'essaye juste de transférer la clé publique du serveur vers le client et inversément. Et j'ai vu que pour ça il fallait passer par un certificat et donc un objet de type X509.

    Et c'est à partir de là que il y a tout qui foire. :/

    De plus je n'ai trouvé aucun exemple de code sur internet pour le faire.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ou alors c'est lorsque je créer le certificat, ici, qu'il y a un problème :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    RSA* key_pair = RSA_generate_key(size, 3, NULL, NULL);           
    EVP_PKEY_set1_RSA(evp_pkey,key_pair);
    X509_set_version(x,2);
    ASN1_INTEGER_set(X509_get_serialNumber(x),0);
    X509_gmtime_adj(X509_get_notBefore(x),0);
    X509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*365);
    X509_set_pubkey(x,evp_pkey);           
    X509_sign(x,evp_pkey,EVP_sha1());
    return key_pair;

Discussions similaires

  1. Bug dans le TCheckListBox ?
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 6
    Dernier message: 04/11/2004, 08h39
  2. Bug dans les expressions régulières ?
    Par SergioF dans le forum Linux
    Réponses: 8
    Dernier message: 12/05/2004, 15h14
  3. [PROPERTIES] Bug dans java.util.Properties ?
    Par mathieu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 28/04/2004, 15h11
  4. bug dans une base Access
    Par bizouard dans le forum Access
    Réponses: 5
    Dernier message: 29/12/2003, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo