#pragma once
+#include <folly/io/async/ssl/OpenSSLPtrTypes.h>
+#include <folly/portability/OpenSSL.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <openssl/sha.h>
class Digest {
public:
- Digest() {
- EVP_MD_CTX_init(&ctx_);
- }
- ~Digest() {
- EVP_MD_CTX_cleanup(&ctx_);
- }
+ Digest() : ctx_(EVP_MD_CTX_new()) {}
+
void hash_init(const EVP_MD* md) {
md_ = md;
- check_libssl_result(1, EVP_DigestInit_ex(&ctx_, md, nullptr));
+ check_libssl_result(1, EVP_DigestInit_ex(ctx_.get(), md, nullptr));
}
void hash_update(ByteRange data) {
- check_libssl_result(1, EVP_DigestUpdate(&ctx_, data.data(), data.size()));
+ check_libssl_result(
+ 1, EVP_DigestUpdate(ctx_.get(), data.data(), data.size()));
}
void hash_update(const IOBuf& data) {
for (auto r : data) {
const auto size = EVP_MD_size(md_);
check_out_size(size_t(size), out);
unsigned int len = 0;
- check_libssl_result(1, EVP_DigestFinal_ex(&ctx_, out.data(), &len));
+ check_libssl_result(1, EVP_DigestFinal_ex(ctx_.get(), out.data(), &len));
check_libssl_result(size, int(len));
md_ = nullptr;
}
private:
const EVP_MD* md_ = nullptr;
- EVP_MD_CTX ctx_;
+ EvpMdCtxUniquePtr ctx_{nullptr};
};
static void hash(
class Hmac {
public:
- Hmac() {
- HMAC_CTX_init(&ctx_);
- }
- ~Hmac() {
- HMAC_CTX_cleanup(&ctx_);
- }
+ Hmac() : ctx_(HMAC_CTX_new()) {}
+
void hash_init(const EVP_MD* md, ByteRange key) {
md_ = md;
check_libssl_result(
- 1, HMAC_Init_ex(&ctx_, key.data(), int(key.size()), md_, nullptr));
+ 1,
+ HMAC_Init_ex(ctx_.get(), key.data(), int(key.size()), md_, nullptr));
}
void hash_update(ByteRange data) {
- check_libssl_result(1, HMAC_Update(&ctx_, data.data(), data.size()));
+ check_libssl_result(1, HMAC_Update(ctx_.get(), data.data(), data.size()));
}
void hash_update(const IOBuf& data) {
for (auto r : data) {
const auto size = EVP_MD_size(md_);
check_out_size(size_t(size), out);
unsigned int len = 0;
- check_libssl_result(1, HMAC_Final(&ctx_, out.data(), &len));
+ check_libssl_result(1, HMAC_Final(ctx_.get(), out.data(), &len));
check_libssl_result(size, int(len));
md_ = nullptr;
}
private:
const EVP_MD* md_ = nullptr;
- HMAC_CTX ctx_;
+ HmacCtxUniquePtr ctx_{nullptr};
};
static void hmac(