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 bool extractSubjectCN(
const std::string &cert, std::string *cn);
84 static StructGuard<EVP_PKEY> generateRSAKeyPairEVP(KeyType key_type);
85 static bool generateRSAKeyPair(KeyType key_type, std::string *public_key, std::string *private_key);
86 static bool generateEDKeyPair(std::string *public_key, std::string *private_key);
87 static bool generateKeyPair(KeyType key_type, std::string *public_key, std::string *private_key);
89 static bool RSAPSSVerify(
const std::string &public_key,
const std::string &signature,
const std::string &message);
90 static bool ED25519Verify(
const std::string &public_key,
const std::string &signature,
const std::string &message);
92 static bool IsRsaKeyType(KeyType type);
93 static KeyType IdentifyRSAKeyType(
const std::string &public_key_pem);
The Hash class The hash of a file or Uptane metadata.