CCF
Loading...
Searching...
No Matches
key_pair.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "ccf/crypto/curve.h"
6#include "ccf/crypto/jwk.h"
7#include "ccf/crypto/pem.h"
9#include "ccf/crypto/san.h"
10
11#include <cstdint>
12#include <optional>
13#include <string>
14#include <vector>
15
16namespace ccf::crypto
17{
18 class KeyPair
19 {
20 public:
21 virtual ~KeyPair() = default;
22
23 virtual Pem private_key_pem() const = 0;
24 virtual Pem public_key_pem() const = 0;
25 virtual std::vector<uint8_t> public_key_der() const = 0;
26 virtual std::vector<uint8_t> private_key_der() const = 0;
27
28 virtual bool verify(
29 const std::vector<uint8_t>& contents,
30 const std::vector<uint8_t>& signature) = 0;
31
32 virtual bool verify(
33 const uint8_t* contents,
34 size_t contents_size,
35 const uint8_t* signature,
36 size_t signature_size) = 0;
37
38 virtual std::vector<uint8_t> sign_hash(
39 const uint8_t* hash, size_t hash_size) const = 0;
40
41 virtual int sign_hash(
42 const uint8_t* hash,
43 size_t hash_size,
44 size_t* sig_size,
45 uint8_t* sig) const = 0;
46
47 virtual std::vector<uint8_t> sign(
48 std::span<const uint8_t> d, MDType md_type = {}) const = 0;
49
50 virtual Pem create_csr(
51 const std::string& subject_name,
52 const std::vector<SubjectAltName>& subject_alt_names,
53 const std::optional<Pem>& public_key = std::nullopt) const = 0;
54
55 Pem create_csr(const std::string& subject_name) const
56 {
57 return create_csr(subject_name, {});
58 }
59
60 virtual std::vector<uint8_t> create_csr_der(
61 const std::string& subject_name,
62 const std::vector<SubjectAltName>& subject_alt_names,
63 const std::optional<Pem>& public_key = std::nullopt) const = 0;
64
65 // Note about the signed_by_issuer parameter to sign_csr: when issuing a new
66 // certificate for an old subject, which does not exist anymore, we cannot
67 // sign the CSR with that old subject's private key. Instead, the issuer
68 // signs the CSR itself, which is slightly unusal. Instead, we could also
69 // ask the subject to produce a CSR right after it becomes alive and keep it
70 // around until we need it, but those complications are not stricly
71 // necessary. In our case, we use this to re-endorse previous service
72 // identities, which are self-signed, and replace them with new endorsements
73 // by the current service identity (which doesn't have the private key of
74 // previous ones).
75
76 enum class Signer
77 {
78 SUBJECT = 0,
79 ISSUER = 1
80 };
81
82 private:
83 virtual Pem sign_csr_impl(
84 const std::optional<Pem>& issuer_cert,
85 const Pem& signing_request,
86 const std::string& valid_from,
87 const std::string& valid_to,
88 bool ca = false,
89 Signer signer = Signer::SUBJECT) const = 0;
90
91 public:
92 virtual Pem sign_csr(
93 const Pem& issuer_cert,
94 const Pem& signing_request,
95 const std::string& valid_from,
96 const std::string& valid_to,
97 bool ca = false,
98 Signer signer = Signer::SUBJECT) const
99 {
100 return sign_csr_impl(
101 issuer_cert, signing_request, valid_from, valid_to, ca, signer);
102 }
103
105 const std::string& name,
106 const std::string& valid_from,
107 const std::string& valid_to,
108 const std::optional<SubjectAltName> subject_alt_name = std::nullopt,
109 bool ca = true) const
110 {
111 std::vector<SubjectAltName> sans;
112 if (subject_alt_name.has_value())
113 {
114 sans.push_back(subject_alt_name.value());
115 }
116 auto csr = create_csr(name, sans);
117 return sign_csr_impl(std::nullopt, csr, valid_from, valid_to, ca);
118 }
119
121 const std::string& subject_name,
122 const std::string& valid_from,
123 const std::string& valid_to,
124 const std::vector<SubjectAltName>& subject_alt_names,
125 bool ca = true) const
126 {
127 auto csr = create_csr(subject_name, subject_alt_names);
128 return sign_csr_impl(std::nullopt, csr, valid_from, valid_to, ca);
129 }
130
131 virtual std::vector<uint8_t> derive_shared_secret(
132 const PublicKey& peer_key) = 0;
133
134 virtual std::vector<uint8_t> public_key_raw() const = 0;
135
136 virtual CurveID get_curve_id() const = 0;
137
138 virtual PublicKey::Coordinates coordinates() const = 0;
139
141 const std::optional<std::string>& kid = std::nullopt) const = 0;
142 };
143
144 using PublicKeyPtr = std::shared_ptr<PublicKey>;
145 using KeyPairPtr = std::shared_ptr<KeyPair>;
146
153 PublicKeyPtr make_public_key(const Pem& pem);
154
161 PublicKeyPtr make_public_key(const std::vector<uint8_t>& der);
162
170
178 KeyPairPtr make_key_pair(CurveID curve_id = service_identity_curve_choice);
179
186 KeyPairPtr make_key_pair(const Pem& pem);
187
196}
Definition key_pair.h:19
Signer
Definition key_pair.h:77
Pem self_sign(const std::string &name, const std::string &valid_from, const std::string &valid_to, const std::optional< SubjectAltName > subject_alt_name=std::nullopt, bool ca=true) const
Definition key_pair.h:104
virtual PublicKey::Coordinates coordinates() const =0
Pem self_sign(const std::string &subject_name, const std::string &valid_from, const std::string &valid_to, const std::vector< SubjectAltName > &subject_alt_names, bool ca=true) const
Definition key_pair.h:120
virtual std::vector< uint8_t > public_key_raw() const =0
virtual std::vector< uint8_t > derive_shared_secret(const PublicKey &peer_key)=0
virtual Pem create_csr(const std::string &subject_name, const std::vector< SubjectAltName > &subject_alt_names, const std::optional< Pem > &public_key=std::nullopt) const =0
virtual JsonWebKeyECPrivate private_key_jwk(const std::optional< std::string > &kid=std::nullopt) const =0
virtual int sign_hash(const uint8_t *hash, size_t hash_size, size_t *sig_size, uint8_t *sig) const =0
virtual CurveID get_curve_id() const =0
virtual std::vector< uint8_t > sign(std::span< const uint8_t > d, MDType md_type={}) const =0
virtual bool verify(const std::vector< uint8_t > &contents, const std::vector< uint8_t > &signature)=0
virtual std::vector< uint8_t > private_key_der() const =0
virtual std::vector< uint8_t > public_key_der() const =0
virtual std::vector< uint8_t > create_csr_der(const std::string &subject_name, const std::vector< SubjectAltName > &subject_alt_names, const std::optional< Pem > &public_key=std::nullopt) const =0
virtual Pem public_key_pem() const =0
virtual Pem sign_csr(const Pem &issuer_cert, const Pem &signing_request, const std::string &valid_from, const std::string &valid_to, bool ca=false, Signer signer=Signer::SUBJECT) const
Definition key_pair.h:92
virtual Pem private_key_pem() const =0
virtual ~KeyPair()=default
Pem create_csr(const std::string &subject_name) const
Definition key_pair.h:55
virtual bool verify(const uint8_t *contents, size_t contents_size, const uint8_t *signature, size_t signature_size)=0
virtual std::vector< uint8_t > sign_hash(const uint8_t *hash, size_t hash_size) const =0
Definition pem.h:18
Definition public_key.h:19
Definition base64.h:10
std::shared_ptr< KeyPair > KeyPairPtr
Definition key_pair.h:145
std::shared_ptr< PublicKey > PublicKeyPtr
Definition key_pair.h:144
MDType
Definition md_type.h:10
PublicKeyPtr make_public_key(const Pem &pem)
Definition key_pair.cpp:20
CurveID
Definition curve.h:18
KeyPairPtr make_key_pair(CurveID curve_id=service_identity_curve_choice)
Definition key_pair.cpp:35