31#ifndef ASYNC_DIGEST_INCLUDED
32#define ASYNC_DIGEST_INCLUDED
42#include <openssl/evp.h>
43#include <openssl/err.h>
131 return (s1.size() == s2.size()) &&
132 (CRYPTO_memcmp(s1.data(), s2.data(), s1.size()) == 0);
140#if OPENSSL_VERSION_MAJOR < 3
141 static bool global_is_initialized =
false;
142 if (!global_is_initialized)
146 OpenSSL_add_all_digests();
147 global_is_initialized =
true;
150 m_ctx = EVP_MD_CTX_new();
151 if (m_ctx ==
nullptr)
153 std::cerr <<
"*** ERROR: EVP_MD_CTX_new failed, error "
154 << ERR_get_error() << std::endl;
174 EVP_MD_CTX_free(m_ctx);
186 MessageDigest
md(md_alg);
189 std::cerr <<
"*** ERROR: EVP_MD_fetch failed, error "
190 << ERR_get_error() << std::endl;
193 int rc = EVP_DigestInit_ex(m_ctx,
md,
nullptr);
197 std::cerr <<
"*** ERROR: EVP_DigestInit_ex failed, error "
198 << ERR_get_error() << std::endl;
206 int rc = EVP_DigestUpdate(m_ctx, d, dlen);
209 std::cerr <<
"*** ERROR: EVP_DigestUpdate failed, error "
210 << ERR_get_error() << std::endl;
219 return mdUpdate(d.data(), d.size());
224 unsigned int mdlen = EVP_MAX_MD_SIZE;
226 int rc = EVP_DigestFinal_ex(m_ctx,
md.data(), &mdlen);
229 std::cerr <<
"*** ERROR: EVP_DigestFinal_ex failed, error "
230 << ERR_get_error() << std::endl;
246 const void* d,
size_t dlen)
254 return md(digest, md_alg, d.data(), d.size());
261 (void)
md(digest, md_alg, d);
269 MessageDigest
md(md_alg);
272 std::cerr <<
"*** ERROR: EVP_MD_fetch failed, error "
273 << ERR_get_error() << std::endl;
276 int rc = EVP_DigestSignInit(m_ctx, NULL,
md, NULL, pkey);
280 std::cerr <<
"*** ERROR: EVP_DigestSignInit failed, error "
281 << ERR_get_error() << std::endl;
289 int rc = EVP_DigestSignUpdate(m_ctx,
290 reinterpret_cast<const unsigned char*
>(msg), mlen);
293 std::cerr <<
"*** ERROR: EVP_DigestSignUpdate failed, error "
294 << ERR_get_error() << std::endl;
310 int rc = EVP_DigestSignFinal(m_ctx, NULL, &req);
313 std::cerr <<
"*** ERROR: EVP_DigestSignFinal (1) failed , error "
314 << ERR_get_error() << std::endl;
318 rc = EVP_DigestSignFinal(m_ctx, sig.data(), &req);
321 std::cerr <<
"*** ERROR: EVP_DigestSignFinal (2) failed, error "
322 << ERR_get_error() << std::endl;
340#if OPENSSL_VERSION_MAJOR >= 3
342 int rc = EVP_DigestSign(m_ctx,
nullptr, &siglen,
343 reinterpret_cast<const unsigned char*
>(msg), mlen);
346 std::cerr <<
"*** ERROR: EVP_DigestSign (1) failed, error "
347 << ERR_get_error() << std::endl;
351 rc = EVP_DigestSign(m_ctx, sig.data(), &siglen,
352 reinterpret_cast<const unsigned char*
>(msg), mlen);
355 std::cerr <<
"*** ERROR: EVP_DigestSign (2) failed, error "
356 << ERR_get_error() << std::endl;
369 return sign(sig, msg.data(), msg.size());
375 (void)
sign(sig, msg, mlen);
382 return sign(msg.data(), msg.size());
389 MessageDigest
md(md_alg);
394 int rc = EVP_DigestVerifyInit(m_ctx, NULL,
md, NULL, pkey);
398 std::cerr <<
"*** ERROR: EVP_DigestVerifyInit failed, error "
399 << ERR_get_error() << std::endl;
407 assert((msg !=
nullptr) && (mlen > 0));
408 int rc = EVP_DigestVerifyUpdate(m_ctx,
409 reinterpret_cast<const unsigned char*
>(msg), mlen);
412 std::cerr <<
"*** ERROR: EVP_DigestVerifyUpdate failed, error "
413 << ERR_get_error() << std::endl;
427 int rc = EVP_DigestVerifyFinal(m_ctx, sig.data(), sig.size());
433#if OPENSSL_VERSION_MAJOR >= 3
434 int rc = EVP_DigestVerify(m_ctx, sig.data(), sig.size(),
435 reinterpret_cast<const unsigned char*
>(msg), mlen);
445 return signVerify(sig, msg.data(), msg.size());
454 MessageDigest(
const std::string& md_alg)
456#if OPENSSL_VERSION_MAJOR >= 3
457 m_md = EVP_MD_fetch(
nullptr, md_alg.c_str(),
nullptr);
459 m_md = EVP_get_digestbyname(md_alg.c_str());
464#if OPENSSL_VERSION_MAJOR >= 3
469 operator const EVP_MD*()
const {
return m_md; }
470 bool operator==(std::nullptr_t)
const {
return (m_md ==
nullptr); }
472#if OPENSSL_VERSION_MAJOR >= 3
473 EVP_MD* m_md =
nullptr;
475 const EVP_MD* m_md =
nullptr;
479 EVP_MD_CTX* m_ctx =
nullptr;
Represent private and public keys.
A_brief_class_description.
MsgDigest md(const std::string &md_alg, const T &d)
bool mdUpdate(const void *d, size_t dlen)
bool signVerify(const Signature &sig, const T &msg)
bool signVerify(const Signature &sig, const void *msg, size_t mlen)
bool signUpdate(const void *msg, size_t mlen)
bool mdUpdate(const T &d)
bool signVerifyUpdate(const T &msg)
bool mdFinal(MsgDigest &md)
Signature signFinal(void)
Signature sign(const void *msg, size_t mlen)
Digest & operator=(const Digest &)=delete
Disallow copy assignment.
bool mdInit(const std::string &md_alg)
A_brief_member_function_description.
Digest(void)
Default constructor.
bool md(MsgDigest &digest, const std::string &md_alg, const T &d)
bool signVerifyFinal(const Signature &sig)
std::vector< uint8_t > Signature
bool signFinal(Signature &sig)
bool sign(Signature &sig, const T &msg)
bool sign(Signature &sig, const void *msg, size_t mlen)
bool signVerifyUpdate(const void *msg, size_t mlen)
bool signInit(const std::string &md_alg, SslKeypair &pkey)
std::vector< uint8_t > MsgDigest
bool signVerifyInit(const std::string &md_alg, SslKeypair &pkey)
static bool sigEqual(const Signature &s1, const Signature &s2)
Digest(const Digest &)=delete
Disallow copy construction.
bool md(MsgDigest &digest, const std::string &md_alg, const void *d, size_t dlen)
Signature sign(const T &msg)
bool signUpdate(const T &msg)
A class representing private and public keys.
bool isNull(void) const
Check if the object is empty.
Namespace for the asynchronous programming classes.