23 #include "../../encoding/buffer.hpp"
24 #include "../detail/openssl-helper.hpp"
26 #include <boost/lexical_cast.hpp>
40 :
m_md(BIO_new(BIO_f_md()))
41 ,
m_sink(BIO_new(BIO_s_null()))
61 BOOST_THROW_EXCEPTION(
Error(
getIndex(),
"Unsupported digest algorithm " +
62 boost::lexical_cast<std::string>(algo)));
65 if (!BIO_set_md(m_impl->m_md, md)) {
67 boost::lexical_cast<std::string>(algo)));
72 DigestFilter::convert(
const uint8_t* buf,
size_t size)
74 int wLen = BIO_write(m_impl->m_md, buf, size);
77 if (!BIO_should_retry(m_impl->m_md)) {
79 BOOST_THROW_EXCEPTION(
Error(
getIndex(),
"Failed to accept more input"));
89 DigestFilter::finalize()
91 auto buffer = make_unique<OBuffer>(EVP_MAX_MD_SIZE);
93 int mdLen = BIO_gets(m_impl->m_md, reinterpret_cast<char*>(&(*buffer)[0]), EVP_MAX_MD_SIZE);
95 BOOST_THROW_EXCEPTION(Error(
getIndex(),
"Failed to compute digest"));
97 buffer->erase(buffer->begin() + mdLen, buffer->end());
103 unique_ptr<Transform>
106 return make_unique<DigestFilter>(algo);
Copyright (c) 2013-2016 Regents of the University of California.
const EVP_MD * toDigestEvpMd(DigestAlgorithm algo)