EVP_PKEY_decryptにおいてSegmentation faultが発生します
現在、C++でOpenSSLライブラリを用いて公開鍵暗号方式の暗号化、復号を実装しています。
しかし、プログラムを実行すると、以下の中の2回目のEVP_PKEY_decryptでSegmentation faultが発生します。
OSはUbuntu 14.04.3、コンパイラはclang++-3.6またはclang++-3.8です。
bool decryptData(EVP_PKEY *key, unsigned char *data, size_t datalen, unsigned char **decdata, size_t *declen) {
int ret;
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(key, NULL); // 鍵はRSA
if ((ret = EVP_PKEY_decrypt_init(ctx)) != 1) {
std::cerr << "init: " << ret << std::endl;
return false;
}
if ((ret = EVP_PKEY_decrypt(ctx, NULL, declen, data, datalen)) != 1) {
std::cerr << "dec1: " << ret << std::endl;
return false;
}
*decdata = (unsigned char *)realloc(*decdata, sizeof(unsigned char *) * *declen);
//*decdata = (unsigned char *)malloc(sizeof(unsigned char *) * *declen);
if ((ret = EVP_PKEY_decrypt(ctx, *decdata, declen, data, datalen)) != 1) { // <--
std::cerr << "dec2: " << ret << std::endl;
return false;
}
return true;
}
valgrindで見てみると以下のようになります。
==21343== Invalid read of size 8
==21343== at 0x4EFF421: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==21343== by 0x4F047B6: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==21343== by 0x402FC9: decryptData(evp_pkey_st*, unsigned char*, unsigned long, unsigned char**, unsigned long*) (pubkeyenc.h:53)
==21343== by 0x40323E: main (tmp.cpp:27)
==21343== Address 0x0 is not stack'd, malloc'd or (recently) free'd
decryptData()の引数の変数のアドレスはすべて0でないことを確認したのですが、このようなエラーになるのはどういった原因が考えられるのでしょうか?
どうぞよろしくお願いします。
追記:
呼び出し側は以下のようなコードで,encryptDataはdecryptData内のdecryptをencryptになっただけです.
int main() {
unsigned char msg[] = "hoge";ただ
unsigned char *enc = nullptr;
//unsigned char *enc = NULL;
size_t *enclen = (size_t *)malloc(sizeof(size_t));
EVP_PKEY *key = /* 鍵を入れる関数 */
if (key == nullptr) cerr << "priv key error" << endl;
if(!(encryptData(key, msg, strlen(reinterpret_cast<char *>(msg)), &enc, enclen))) {
cerr << "enc error" << endl;
}else {
cerr << "enc success" << endl;
}
unsigned char *decoded = nullptr;
//unsigned char *decoded = NULL;
size_t *declen = (size_t *)malloc(sizeof(size_t));
key = /* 鍵を入れる関数 */
if (key == nullptr) cerr << "pub key error" << endl;
if(!(decryptData(key, enc, *enclen, &decoded, declen))) {
cerr << "dec error" << endl;
}else {
cerr << "dec success" << endl;
}
free(enclen);
free(declen);
if (enc != nullptr) free(enc);
if (decoded != nullptr) free(decoded);
return 0;
}
追記 (2016/12/19):
暗号化に用いる鍵はPEM_read_PrivateKeyを用いて,ssh-keygenで作成した秘密鍵を利用し,復号に用いる鍵はPEM_read_PUBKEYを用いて,ssh-keygenで作成した公開鍵を利用していました.
しかし,これらを逆にして公開鍵で暗号化し,秘密鍵で復号したところ問題なくプログラムが動きました.