2016-05-19 7 views
0

私は、提供された公開鍵で照合する必要がある署名データ(署名データとその署名[base64 encoded]で区切られています)をいくつか持っています。データは、次のような構造でデータを格納する外部関数によって提供されます。opensslを使用して公開鍵でデータ署名を確認する

typedef struct { 
    char * signature; 
    char * signedData; // base64 encoded --> decoding required 
} data; 

私はopensslの機能に適合し、どこかに間違い(複数可)があると仮定して、それを変換する必要がでています。コンパイルされますが、クラッシュします(SIGSEGV)。 Androidのライブラリで、私はNDKを使用しています。任意のアイデア/ヒント?おそらく何らかの変換の問題でしょうか?

// base64で機能ソース:How do I base64 encode (decode) in C?

//私はまさに「publickeybase64」が、あなたの公開鍵を作成するプロセス全体でエンコードされているのか分からないhttp://fm4dd.com/openssl/manual-crypto/EVP_PKEY_verify.htm

size_t sdlen, siglen; 

    char *tmp = malloc(1000); 
    char *signature = malloc(1000); 
    char *signData = malloc(1000); 

    sprintf(tmp, "%s", data.signature); 
    signature = base64decode(&tmp, strlen(tmp)); 
    siglen = strlen(signature); 

    sprintf(signData, "%s", data.signedData); 
    sdlen = strlen(signData); 


    EVP_PKEY_CTX *ctx = malloc(1000); 
    unsigned char *md, *sig; 

    char publickeybase64[] = "MIIBIjANBgkqhk....."; 
    char *publickey = base64decode(&publickeybase64, strlen(publickeybase64)); 

    EVP_PKEY *verify_key = malloc(1000); 
    sprintf((char *) verify_key, "%s", publickey); 

    ctx = EVP_PKEY_CTX_new(verify_key, 0); 

    if (!ctx) { 
     printf("E1\n"); 
    } 
    if (EVP_PKEY_verify_init(ctx) <= 0) { 
     printf("E2\n"); 
    } 
    if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0) { 
     printf("E3\n"); 
    } 
    if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256() <= 0)) { 
     printf("E4\n"); 
    } 

    int ret = EVP_PKEY_verify(ctx, signature, siglen, signData, sdlen); 

    printf("RESULTVERIFY %d \n", ret); 

    /* ret == 1 indicates success, 0 verify failure and < 0 for some 
    * other error. 
    */ 
+0

'malloc()'の戻り値をチェックする必要があります。また、なぜあなたはpassint '&publickeybase64'ですか? BTW: 'base64'はかなりシンプルで、関数を書くのに20分かかるでしょう。 –

+0

'tmpがすでに' char * 'であるので、' base64decode(&tmp、strlen(tmp)) 'は間違っています。 '&tmp'ではなく最初の引数として' tmp'を渡したいとします。これはあなたの配列ポインタのアドレスです。 'base64decode'の中で' data [i ++] 'として参照解除されると、SIGSEGVが得られます。 – russianfool

+0

さらに、 'strlen'はnil終了文字列を受け取ります。リファレンス 'base64_decode'の実装はそれを終わらせるわけではないので、別のSIGSEGVをもたらす可能性があります。 バッファを埋めるために操作を実行したばかりの場合は、 'strlen'を呼び出すのも悪いフォームです。また、 'tmp'バッファになぜ' sprintf'が必要なのでしょうか? 'base64decode'は初期バッファを変更せずに実装できます。 これらの 'malloc'バッファをすべて解放することを忘れないでください。 – russianfool

答えて

0

に基づいて署名をチェック私は少し奇妙なようです。あなたは、OpenSSLの最新バージョンを使用している場合

まず、私は

EVP_PKEY *verify_key = EVP_PKEY_new(); 

が次にあなたが設定する必要があり、

EVP_PKEY *verify_key = malloc(sizeof(EVP_PKEY)); 

のようなもので

EVP_PKEY *verify_key = malloc(1000); 

を交換するか、でしょうverify_keyのRSAキー。 https://www.openssl.org/docs/manmaster/crypto/EVP_PKEY_set1_RSA.html

RSAキー(https://www.openssl.org/docs/manmaster/crypto/RSA_new.html)を作成し、モジュラスと公開指数(https://www.openssl.org/docs/manmaster/crypto/RSA_set0_key.htmlを参照)を設定する必要があると思います。

関連する問題