4 #include <openssl/engine.h> 5 #include <openssl/err.h> 6 #include <openssl/evp.h> 7 #include <openssl/opensslv.h> 8 #include <openssl/pem.h> 9 #include <openssl/pkcs12.h> 10 #include <openssl/rand.h> 11 #include <openssl/rsa.h> 13 #include <boost/algorithm/hex.hpp> 14 #include <boost/algorithm/string.hpp> 15 #include <boost/algorithm/string/case_conv.hpp> 21 #include "utilities/utils.h" 25 #undef BIO_new_mem_buf 26 BIO *BIO_new_mem_buf(
const void *,
int);
31 explicit PublicKey(
const boost::filesystem::path &path);
33 explicit PublicKey(Json::Value uptane_json);
35 PublicKey(std::string value, KeyType type);
37 std::string Value()
const {
return value_; }
39 KeyType Type()
const {
return type_; }
43 bool VerifySignature(
const std::string &signature,
const std::string &message)
const;
50 std::string KeyId()
const;
51 bool operator==(
const PublicKey &rhs)
const;
53 bool operator!=(
const PublicKey &rhs)
const {
return !(*
this == rhs); }
60 KeyType type_{KeyType::kUnknown};
65 virtual void update(
const unsigned char *part, uint64_t size) = 0;
66 virtual std::string getHexDigest() = 0;
74 void update(
const unsigned char *part, uint64_t size)
override { crypto_hash_sha512_update(&state_, part, size); }
75 std::string getHexDigest()
override {
76 unsigned char sha512_hash[crypto_hash_sha512_BYTES];
77 crypto_hash_sha512_final(&state_, static_cast<unsigned char *>(sha512_hash));
78 return boost::algorithm::hex(std::string(reinterpret_cast<char *>(sha512_hash), crypto_hash_sha512_BYTES));
82 crypto_hash_sha512_state state_{};
89 void update(
const unsigned char *part, uint64_t size)
override { crypto_hash_sha256_update(&state_, part, size); }
90 std::string getHexDigest()
override {
91 unsigned char sha256_hash[crypto_hash_sha256_BYTES];
92 crypto_hash_sha256_final(&state_, static_cast<unsigned char *>(sha256_hash));
93 return boost::algorithm::hex(std::string(reinterpret_cast<char *>(sha256_hash), crypto_hash_sha256_BYTES));
97 crypto_hash_sha256_state state_{};
102 static std::string sha256digest(
const std::string &text);
103 static std::string sha512digest(
const std::string &text);
104 static std::string RSAPSSSign(ENGINE *engine,
const std::string &private_key,
const std::string &message);
105 static std::string Sign(KeyType key_type, ENGINE *engine,
const std::string &private_key,
const std::string &message);
106 static std::string ED25519Sign(
const std::string &private_key,
const std::string &message);
107 static bool parseP12(BIO *p12_bio,
const std::string &p12_password, std::string *out_pkey, std::string *out_cert,
108 std::string *out_ca);
109 static bool extractSubjectCN(
const std::string &cert, std::string *cn);
110 static bool generateRSAKeyPair(KeyType key_type, std::string *public_key, std::string *private_key);
111 static bool generateEDKeyPair(std::string *public_key, std::string *private_key);
112 static bool generateKeyPair(KeyType key_type, std::string *public_key, std::string *private_key);
114 static bool RSAPSSVerify(
const std::string &public_key,
const std::string &signature,
const std::string &message);
115 static bool ED25519Verify(
const std::string &public_key,
const std::string &signature,
const std::string &message);
117 static bool IsRsaKeyType(KeyType type);
118 static KeyType IdentifyRSAKeyType(
const std::string &public_key_pem);
Json::Value ToUptane() const
Uptane Json representation of this public key.
bool VerifySignature(const std::string &signature, const std::string &message) const
Verify a signature using this public key.
static bool generateRSAKeyPair(KeyType key_type, std::string *public_key, std::string *private_key)
Generate a RSA keypair.