2017-01-14 13 views
2

私のプログラムに公開RSA鍵をロードしようとしました。文字列からRSA *構造体にRSA公開鍵を渡す際にエラーが発生しました

#define PUBLIC_KEY "-----BEGIN PUBLIC KEY-----\n" \ 
        "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuDcT2OiToi9edqil/3ha\n" \ 
        "1MMrgqYvdYObRkb8C5SZtf8iv4LynuHi3hvEtybqFW84Uf2l3Dxuz3IWVp2v1C2f\n" \ 
        "cUxwf+hFqL4Nt2Ww/XOKLtFXTSX/2fPYoelmLja2grHPSuFx6N4gtDUXRIGSYXIz\n" \ 
        "c2GBx8lOiOP+qUguFmWZ9E0GiMLvh4XUQUzTGr4ZNNoc5LODdO0g7beFFqhntt9w\n" \ 
        "EKdceGQtA7Zyt5l13x0lj+RONdPJkDFZrNGdqDwNUSog9mufpvR1P2UW09pC+lzy\n" \ 
        "z32P+w0U3Za4zv4Btis9ky16vaqdN/KlDWJRt+4W9TQSAL0x9w708OQr0Sf2CXNq\n" \ 
        "EobSLZ/aybe75yQmzFqmn10X+NuwTtJkArIKK7JONCBSxjohQmTZw0U497TCEHia\n" \ 
        "itzgsHNLf1of31G/3GK5rCkm9fl39nnrg0yJi1cONTDjSHzKlrPhA584jFRD0CIO\n" \ 
        "VNHYgsVLuFQuJ0WkZON8uEZELXN1ZyWnmPXH8wSwxjud65JD4JSQornCXorBMfxd\n" \ 
        "DFEeeNk8tjgPMaCTLFNP/gfVDzkvcct9RoC8uZxHk8zgrGOwuxOZ/ZyihE7M8v0i\n" \ 
        "+VwG9iMrPl8W3+KqunIt/FB4Le1vJ0yYorK64DRNdeMAIsYq2iFWO3GXNsX631/K\n" \ 
        "EuZJS8tGNhK9dF5umo0GceUCAwEAAQ==\n" \ 
        "-----END PUBLIC KEY-----\n" 

RSAキーがRSA *構造内に保存されることになっている:私は、キーがヘッダーcrypt.hファイルで定義されているC.でのopensslのlibを使用しています。私はそのためにグローバル変数を使用します。

RSA *rsaPubkey; 

main()PUBLIC_KEYを取り、rsaPubkeyに渡します関数を呼び出します。関数は怒鳴るようになります。

#include "crypt.h" 

int EVP_PKEY_get_type(EVP_PKEY *pkey) { 
    if (!pkey) 
     return EVP_PKEY_NONE; 

    return EVP_PKEY_type(pkey->type); 
} 

int PublicRSAKeyToStruct(const char *pubKey) { 
    BIO* bio; 
    bio = BIO_new_mem_buf(pubKey, (int)sizeof(pubKey)); 
    if (bio == NULL) { 
     printf("bio"); 
     return -1; 
    } 

    EVP_PKEY* pkey; 
    PEM_read_bio_PUBKEY(bio, &pkey, NULL, NULL); 
    if (pkey == NULL) { 
     printf("pkey"); 
     return -1; 
    } 

    int type = EVP_PKEY_get_type(pkey); 
    if (type != EVP_PKEY_RSA && type != EVP_PKEY_RSA2) { 
     printf("get type"); 
     return -1; 
    } 

    rsaPubkey = EVP_PKEY_get1_RSA(pkey); 
    if (rsaPubkey == NULL) { 
     printf("pubkey"); 
     return -1; 
    } 

    EVP_PKEY_free(pkey); 
    BIO_free(bio); 
    return 0; 
} 

我々はそのような関数を呼び出す:

status = PublicRSAKeyToStruct(PUBLIC_KEY); 
if (status == -1) { 
    exit(EXIT_FAILURE); 
} 

私の問題はPublicRSAKeyToStruct()機能は私に怒鳴るユーザー定義のエラーをスローしていることである:

get type 

このEVP_PKEY_get_type()に合格しなかったことを意味します。私はなぜこれが起こるか理解できません。私は、問題が前のステップにあるかどうかを知ることもできません。

+1

エラーが発生したときの 'type'の値は何ですか? – Alden

+0

@Aldenそれはゼロです(0)。だからどこかに失敗がある? –

+0

@GuyL:それをしないでください。示されたデータはPUBKEY = SPKI形式であり、RSA PUBLIC KEY(raw PKCS1)形式ではありません。 –

答えて

1

あなたが与えたBIOが正しいデータにアクセスしていないのに戻り値をチェックせず、pkeyを初期化していないため、あなたのPEM_read呼び出しが失敗しましたpkey == NULLチェックdoesn 'それをキャッチします。あなたのシステムのマニュアルページ(Windowsを除く)またはon the webに記載されているように、BIO_new_mem_bufの2番目の引数はバッファ内のバイト数でなければならず、バッファにヌル終了C文字列が含まれていれば-1でなければなりません。 -1が適切ですが、sizeof(apointer)はこれらのどちらでもありません。

コードの残りの部分は正しいもので、有効なEVP_PKEY*を付けると問題なく動作します。

+0

私はそれを 'bio = BIO_new_mem_buf(pubKey、-1);'に変更しました。今それは動作します。あなたの答えにそれを加えてください。また、https://linux.die.net/man/3/bio_new_mem_bufへの参照を追加し、2番目のパラメータに '-1'を追加することを提案します。他人が理解できるようにこれを変更してください。いずれにせよ、私はあなたの答えを受け入れるでしょう。 (これらの情報を追加してください)。 –

+0

私は 'PEM_read_bio_PrivateKey()'を使っていますか? –

+0

@GeorgeGkas:バージョンごとに異なるものはlinux.die.netを参照しないことをお勧めします.OpenSSLはmemBIO用のAFAIRではありませんが、多くの領域で異なります。はい、OpenSSLが使用するいくつかのPEM形式のいずれかに秘密鍵がある場合、 'PEM_read_bio_PrivateKey'がそれを読み取ります。プライベートキーはプライベートキーとは異なり、パスワードで暗号化されることが多く、パスワードが必要な場合は、パスワード自体またはパスワードを取得するコールバックのいずれかを指定する必要があります。 –

関連する問題