私は、提供された公開鍵で照合する必要がある署名データ(署名データとその署名[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.
*/
'malloc()'の戻り値をチェックする必要があります。また、なぜあなたはpassint '&publickeybase64'ですか? BTW: 'base64'はかなりシンプルで、関数を書くのに20分かかるでしょう。 –
'tmpがすでに' char * 'であるので、' base64decode(&tmp、strlen(tmp)) 'は間違っています。 '&tmp'ではなく最初の引数として' tmp'を渡したいとします。これはあなたの配列ポインタのアドレスです。 'base64decode'の中で' data [i ++] 'として参照解除されると、SIGSEGVが得られます。 – russianfool
さらに、 'strlen'はnil終了文字列を受け取ります。リファレンス 'base64_decode'の実装はそれを終わらせるわけではないので、別のSIGSEGVをもたらす可能性があります。 バッファを埋めるために操作を実行したばかりの場合は、 'strlen'を呼び出すのも悪いフォームです。また、 'tmp'バッファになぜ' sprintf'が必要なのでしょうか? 'base64decode'は初期バッファを変更せずに実装できます。 これらの 'malloc'バッファをすべて解放することを忘れないでください。 – russianfool