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

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -