- const EVP_MD* md=nullptr;
- if (hash) {
- md = EVP_get_digestbyname(hash);
- if (!md) {
- Category::getInstance(XMLTOOLING_LOGCAT".SecurityHelper").error("hash algorithm (%s) not available", hash);
- return ret;
- }
- }
- BIO* chain = BIO_new(BIO_s_mem());
- BIO* b = BIO_new(BIO_f_base64());
- if (nowrap)
- BIO_set_flags(b, BIO_FLAGS_BASE64_NO_NL);
- chain = BIO_push(b, chain);
- if (md) {
- b = BIO_new(BIO_f_md());
- BIO_set_md(b, md);
- chain = BIO_push(b, chain);
- }
- i2d_RSA_PUBKEY_bio(chain, const_cast<RSA*>(rsa));
- BIO_flush(chain);
- if (md) {
- char digest[EVP_MAX_MD_SIZE];
- int len = BIO_gets(chain, digest, EVP_MD_size(md));
- if (len != EVP_MD_size(md)) {
- 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);
- }
- BUF_MEM* bptr=nullptr;
- BIO_get_mem_ptr(chain, &bptr);
- if (bptr && bptr->length > 0)
- ret.append(bptr->data, bptr->length);
- BIO_free_all(chain);