c++ - OpenSSL EVP_DigestSignFinal segfault -
i'm trying sign message using openssl c api. following code segfaults because of exc_bad_access
during either of calls evp_digestsignfinal
. i'm using openssl 1.0.1g. tried switching newer digestsign*
functions older sign*
functions, , still segfaults.
private_key
set evp_pkey_set1_rsa
rsa key loaded pem file. first call evp_digestsignfinal
fills s_len
maximum possible length of signature signing algorithm, signature
not being big enough shouldn't issue, , second call writes signature buffer , fills s_len
length of signature.
i appreciate this.
vector<unsigned char> rsa_sha512_sign( const vector<unsigned char>& document, shared_ptr<evp_pkey> private_key) { evp_md_ctx* md; if (!(md = evp_md_ctx_create())) { throw runtime_error("error initializing env_md_ctx."); } if (evp_digestsigninit(md, null, evp_sha512(), null, private_key.get()) != 1) { throw runtime_error("error in evp_digestsigninit."); } if (evp_digestsignupdate(md, document.data(), document.size()) != 1) { throw runtime_error("error computing hash on document."); } size_t s_len; if (evp_digestsignfinal(md, null, &s_len) != 1) { // segfault here throw runtime_error("error determining maximum signature size."); } vector<unsigned char> signature(s_len); if (evp_digestsignfinal(md, signature.data(), &s_len) != 1) { // or here (or both) throw runtime_error("error signing document."); } signature.resize(s_len); evp_md_ctx_destroy(md); return move(signature); }
the problem how initializing private_key
. probably, mixing malloc()
delete
, , corrupting heap in process. need provide shared_ptr
proper deleter pointer feed if pointer not created new
.
shared_ptr<rsa> r(rsa_new(), rsa_free); shared_ptr<evp_pkey> p(evp_pkey_new(), evp_pkey_free); shared_ptr<bignum> bn(bn_new(), bn_free); vector<unsigned char> doc(0, 100); bn_set_word(bn.get(), rsa_f4); rsa_generate_key_ex(r.get(), 2048, bn.get(), 0); evp_pkey_set1_rsa(p.get(), r.get()); rsa_sha512_sign(doc, p);
Comments
Post a Comment