c - EVP_PKEYを使用したOpenSSL RSA_size

原文 c ssl openssl rsa pki

RSA_sizeについて質問があります。

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


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構造体を調べると、値は第2バージョンのRSAポインターの値と同じではありません。
何か案は ?
答え
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 */;


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 */;
関連記事

c - 構造体を関数に渡し、Cで変更する

c - C99で関数ポインターの構造がNULLかどうかを確認するクイックチェック

python - プロセス間通信Python [重複]

c++ - ゼロパディング付きのインテルMKLを使用した3D FFT

c - 複数の構造体を宣言し、それらをすでに割り当てられているメモリにオーバーレイする

c - 厳格なエイリアシングを破った結果を理解する

java - Android Gstreamer SDKでANativeWindow_lockがエラー-22を返す

c - 二分木;頻度の高い順に印刷します。 C言語

c - コピーを作成するのではなく、ポインタを使い始める前に、構造はどのくらいの大きさにすべきですか? [C] [終了]

c - Cの配列で2次元配列にインデックスを付ける方法のベクトル化