2014-12-10 3 views
2

У меня есть вопрос относительно RSA_size.OpenSSL RSA_size с EVP_PKEY

версия, что авария на WIN32, но работает на Линукс платформ:

... 
    EVP_PKEY* pPublicKey = null; 
    unsigned int uKeySize = 0; 
    const unsigned char *pData; 
    pData = a_publicKey->Key.Data; /* Key.Data = unsigned char *p containing the Key in a string version */ 
    pPublicKey = d2i_PublicKey(EVP_PKEY_RSA, null, &pData, a_publicKey->Key.Length); 
    if(pPublicKey != null) 
    { 
    uKeySize = RSA_size(pPublicKey->pkey.rsa); //Crash 
    } 
    ... 

версии, которые работают на win32 (не тестировался на Linux, но я предполагаю, что это работает, а):

... 
    EVP_PKEY* pPublicKey = null; 
    RSA* pRsaPublicKey = null; 
    unsigned int uKeySize = 0; 
    const unsigned char *pData; 
    pData = a_publicKey->Key.Data; /* Key.Data = unsigned char *p containing the Key in a string version */ 
    pPublicKey = d2i_PublicKey(EVP_PKEY_RSA, null, &pData, a_publicKey->Key.Length); 
    if(pPublicKey != null) 
    { 
    pRsaPublicKey = EVP_PKEY_get1_RSA(pPublicKey); 
    EVP_PKEY_free(pPublicKey); 
    uKeySize = RSA_size(pRsaPublicKey); 
    } 
    ... 

я не понимаю, почему сбой первой версии. Но когда я смотрю на структуру pkey.rsa, значения не совпадают с указателями RSA во второй версии. Любые идеи?

+0

Вы должны также освободить 'RSA *' вы получили назад от 'EVP_PKEY_get1_RSA'. Значение 'get1' означает, что счетчик ссылок был увеличен. «Get0» означает, что счетчик * не * увеличивался, поэтому не требуется '* _free'. – jww

+0

@jww Да, на самом деле я освобождаю его сразу после «...», но я понимаю, что это может привести к недоразумениям. –

ответ

0

Я смотрел структуру EVP_PKEY и кажется, что WIN32 и версия Linux различны ... Так что, я думаю, я использую действительно старую для WIN32.

версия WIN32:

struct evp_pkey_st 
    { 
    int type; 
    int save_type; 
    int references; 
    union { 
     char *ptr; 
#ifndef OPENSSL_NO_RSA 
     struct rsa_st *rsa; /* RSA */ 
#endif 
#ifndef OPENSSL_NO_DSA 
     struct dsa_st *dsa; /* DSA */ 
#endif 
#ifndef OPENSSL_NO_DH 
     struct dh_st *dh; /* DH */ 
#endif 
#ifndef OPENSSL_NO_EC 
     struct ec_key_st *ec; /* ECC */ 
#endif 
     } pkey; 
    int save_parameters; 
    STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ 
    } /* EVP_PKEY */; 

линукс:

struct evp_pkey_st 
    { 
    int type; 
    int save_type; 
    int references; 
    const EVP_PKEY_ASN1_METHOD *ameth; 
    ENGINE *engine; 
    union { 
     char *ptr; 
#ifndef OPENSSL_NO_RSA 
     struct rsa_st *rsa; /* RSA */ 
#endif 
#ifndef OPENSSL_NO_DSA 
     struct dsa_st *dsa; /* DSA */ 
#endif 
#ifndef OPENSSL_NO_DH 
     struct dh_st *dh; /* DH */ 
#endif 
#ifndef OPENSSL_NO_EC 
     struct ec_key_st *ec; /* ECC */ 
#endif 
     } pkey; 
    int save_parameters; 
    STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ 
    } /* EVP_PKEY */; 
+0

В модуле памяти 'EVP_PKEY *' не должно иметь значения для вашего кода. Оба имеют член 'rsa', поэтому оба имеют смещение от начала структуры. Похоже, что происходит что-то еще. – jww