#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>
-
#include <folly/Range.h>
#include <folly/io/IOBuf.h>
+#include <folly/portability/OpenSSL.h>
+#include <folly/ssl/OpenSSLPtrTypes.h>
namespace folly {
namespace ssl {
/// These functions are not thread-safe unless you initialize OpenSSL.
class OpenSSLHash {
public:
-
class Digest {
public:
Digest() : ctx_(EVP_MD_CTX_new()) {}
+ Digest(const Digest& other) {
+ ctx_ = EvpMdCtxUniquePtr(EVP_MD_CTX_new());
+ if (other.md_ != nullptr) {
+ hash_init(other.md_);
+ check_libssl_result(
+ 1, EVP_MD_CTX_copy_ex(ctx_.get(), other.ctx_.get()));
+ }
+ }
+
+ Digest& operator=(const Digest& other) {
+ this->~Digest();
+ return *new (this) Digest(other);
+ }
+
void hash_init(const EVP_MD* md) {
md_ = md;
check_libssl_result(1, EVP_DigestInit_ex(ctx_.get(), md, nullptr));
check_libssl_result(size, int(len));
md_ = nullptr;
}
+
private:
const EVP_MD* md_ = nullptr;
EvpMdCtxUniquePtr ctx_{nullptr};
};
- static void hash(
- MutableByteRange out,
- const EVP_MD* md,
- ByteRange data) {
+ static void hash(MutableByteRange out, const EVP_MD* md, ByteRange data) {
Digest hash;
hash.hash_init(md);
hash.hash_update(data);
hash.hash_final(out);
}
- static void hash(
- MutableByteRange out,
- const EVP_MD* md,
- const IOBuf& data) {
+ static void hash(MutableByteRange out, const EVP_MD* md, const IOBuf& data) {
Digest hash;
hash.hash_init(md);
hash.hash_update(data);
check_libssl_result(size, int(len));
md_ = nullptr;
}
+
private:
const EVP_MD* md_ = nullptr;
HmacCtxUniquePtr ctx_{nullptr};
};
- static void hmac(
- MutableByteRange out,
- const EVP_MD* md,
- ByteRange key,
- ByteRange data) {
+ static void
+ hmac(MutableByteRange out, const EVP_MD* md, ByteRange key, ByteRange data) {
Hmac hmac;
hmac.hash_init(md, key);
hmac.hash_update(data);
hmac.hash_update(data);
hmac.hash_final(out);
}
- static void hmac_sha1(
- MutableByteRange out, ByteRange key, ByteRange data) {
+ static void hmac_sha1(MutableByteRange out, ByteRange key, ByteRange data) {
hmac(out, EVP_sha1(), key, data);
}
- static void hmac_sha1(
- MutableByteRange out, ByteRange key, const IOBuf& data) {
+ static void
+ hmac_sha1(MutableByteRange out, ByteRange key, const IOBuf& data) {
hmac(out, EVP_sha1(), key, data);
}
- static void hmac_sha256(
- MutableByteRange out, ByteRange key, ByteRange data) {
+ static void hmac_sha256(MutableByteRange out, ByteRange key, ByteRange data) {
hmac(out, EVP_sha256(), key, data);
}
- static void hmac_sha256(
- MutableByteRange out, ByteRange key, const IOBuf& data) {
+ static void
+ hmac_sha256(MutableByteRange out, ByteRange key, const IOBuf& data) {
hmac(out, EVP_sha256(), key, data);
}
}
[[noreturn]] static void check_libssl_result_throw();
};
-
-}
-}
+} // namespace ssl
+} // namespace folly