4 #include <openssl/engine.h>
5 #include <openssl/err.h>
6 #include <openssl/evp.h>
7 #include <openssl/pem.h>
8 #include <openssl/pkcs12.h>
9 #include <openssl/rsa.h>
11 #include <boost/algorithm/hex.hpp>
12 #include <boost/algorithm/string.hpp>
13 #include <boost/algorithm/string/case_conv.hpp>
19 #include "utilities/utils.h"
23 #undef BIO_new_mem_buf
24 BIO *BIO_new_mem_buf(
const void *,
int);
28 using Ptr = std::shared_ptr<MultiPartHasher>;
29 static Ptr create(Hash::Type hash_type);
31 virtual void update(
const unsigned char *part, uint64_t size) = 0;
32 virtual void reset() = 0;
33 virtual std::string getHexDigest() = 0;
34 virtual Hash getHash() = 0;
42 void update(
const unsigned char *part, uint64_t size)
override { crypto_hash_sha512_update(&state_, part, size); }
43 void reset()
override { crypto_hash_sha512_init(&state_); }
44 std::string getHexDigest()
override {
45 std::array<unsigned char, crypto_hash_sha512_BYTES> sha512_hash{};
46 crypto_hash_sha512_final(&state_, sha512_hash.data());
47 return boost::algorithm::hex(std::string(
reinterpret_cast<char *
>(sha512_hash.data()), crypto_hash_sha512_BYTES));
50 Hash getHash()
override {
return Hash(Hash::Type::kSha512, getHexDigest()); }
53 crypto_hash_sha512_state state_{};
60 void update(
const unsigned char *part, uint64_t size)
override { crypto_hash_sha256_update(&state_, part, size); }
61 void reset()
override { crypto_hash_sha256_init(&state_); }
62 std::string getHexDigest()
override {
63 std::array<unsigned char, crypto_hash_sha256_BYTES> sha256_hash{};
64 crypto_hash_sha256_final(&state_, sha256_hash.data());
65 return boost::algorithm::hex(std::string(
reinterpret_cast<char *
>(sha256_hash.data()), crypto_hash_sha256_BYTES));
68 Hash getHash()
override {
return Hash(Hash::Type::kSha256, getHexDigest()); }
71 crypto_hash_sha256_state state_{};
76 static std::string sha256digest(
const std::string &text);
77 static std::string sha512digest(
const std::string &text);
78 static std::string RSAPSSSign(ENGINE *engine,
const std::string &private_key,
const std::string &message);
79 static std::string Sign(KeyType key_type, ENGINE *engine,
const std::string &private_key,
const std::string &message);
80 static std::string ED25519Sign(
const std::string &private_key,
const std::string &message);
81 static bool parseP12(BIO *p12_bio,
const std::string &p12_password, std::string *out_pkey, std::string *out_cert,
83 static std::string extractSubjectCN(
const std::string &cert);
84 static StructGuard<EVP_PKEY> generateRSAKeyPairEVP(KeyType key_type);
85 static StructGuard<EVP_PKEY> generateRSAKeyPairEVP(
const int bits);
86 static bool generateRSAKeyPair(KeyType key_type, std::string *public_key, std::string *private_key);
87 static bool generateEDKeyPair(std::string *public_key, std::string *private_key);
88 static bool generateKeyPair(KeyType key_type, std::string *public_key, std::string *private_key);
90 static bool RSAPSSVerify(
const std::string &public_key,
const std::string &signature,
const std::string &message);
91 static bool ED25519Verify(
const std::string &public_key,
const std::string &signature,
const std::string &message);
93 static bool IsRsaKeyType(KeyType type);
94 static KeyType IdentifyRSAKeyType(
const std::string &public_key_pem);
96 static StructGuard<X509> generateCert(
const int rsa_bits,
const int cert_days,
const std::string &cert_c,
97 const std::string &cert_st,
const std::string &cert_o,
98 const std::string &cert_cn,
bool self_sign =
false);
99 static void signCert(
const std::string &cacert_path,
const std::string &capkey_path, X509 *
const certificate);
100 static void serializeCert(std::string *pkey, std::string *cert, X509 *
const certificate);