- BIO_set_flags(base64, BIO_FLAGS_BASE64_NO_NL);
- BIO* mem = BIO_new(BIO_s_mem());
- BIO_push(base64, mem);
- i2d_RSA_PUBKEY_bio(base64, const_cast<RSA*>(rsa));
- BIO_flush(base64);
+ BIO_set_flags(b, BIO_FLAGS_BASE64_NO_NL);
+ chain = BIO_push(b, chain);
+ if (hash) {
+ b = BIO_new(BIO_f_md());
+ BIO_set_md(b, EVP_sha1());
+ chain = BIO_push(b, chain);
+ }
+ i2d_RSA_PUBKEY_bio(chain, const_cast<RSA*>(rsa));
+ BIO_flush(chain);
+ if (hash) {
+ char digest[20];
+ int len = BIO_gets(chain, digest, sizeof(digest));
+ if (len != sizeof(digest)) {
+ BIO_free_all(chain);
+ return ret;
+ }
+ b = BIO_pop(chain);
+ BIO_free(chain);
+ chain = b;
+ BIO_reset(chain);
+ BIO_write(chain, digest, len);
+ BIO_flush(chain);
+ }