简体   繁体   English

具有EVP_PKEY的OpenSSL RSA_size

[英]OpenSSL RSA_size with EVP_PKEY

I have a question regarding RSA_size. 我对RSA_size有疑问。

Version that crash on WIN32 but works on linux platforms : 在WIN32上崩溃但在Linux平台上可以运行的版本:

  ... 
  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
  }
  ...

Version that work on win32 (not tested on linux but I suppose it works as well): 可以在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);
  }
  ...

I do not understand why the first version crash. 我不明白为什么第一个版本会崩溃。 But when I look into the pkey.rsa structure, values are not the same as in the RSA pointer in the 2nd version. 但是,当我查看pkey.rsa结构时,其值与第二版RSA指针中的值不同。 Any ideas ? 有任何想法吗 ?

I looked into EVP_PKEY struct and it seems that WIN32 and linux version are different... So I guess i am using a really old one for my WIN32. 我查看了EVP_PKEY结构,似乎WIN32和linux版本是不同的...所以我想我正在为WIN32使用一个非常老的版本。

WIN32 version : 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 */;

linux : linux的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM