Botan 3.12.0
Crypto and TLS for C&
Botan::PKCS10_Request Class Referencefinal

#include <pkcs10.h>

Inheritance diagram for Botan::PKCS10_Request:
Botan::X509_Object Botan::ASN1_Object

Public Member Functions

std::vector< uint8_t > BER_encode () const
std::string challenge_password () const
bool check_signature (const Public_Key &key) const
Key_Constraints constraints () const
void decode_from (BER_Decoder &from) override
void encode_into (DER_Encoder &to) const override
std::vector< OIDex_constraints () const
const Extensionsextensions () const
bool is_CA () const
std::optional< size_t > path_length_constraint () const
size_t path_limit () const
std::string PEM_encode () const
 PKCS10_Request (const std::vector< uint8_t > &vec)
 PKCS10_Request (DataSource &source)
const std::vector< uint8_t > & raw_public_key () const
const std::vector< uint8_t > & signature () const
const AlgorithmIdentifiersignature_algorithm () const
const std::vector< uint8_t > & signed_body () const
const AlternativeNamesubject_alt_name () const
const X509_DNsubject_dn () const
std::unique_ptr< Public_Keysubject_public_key () const
std::vector< uint8_t > tbs_data () const
std::pair< Certificate_Status_Code, std::string > verify_signature (const Public_Key &key) const

Static Public Member Functions

static std::unique_ptr< PK_Signerchoose_sig_format (const Private_Key &key, RandomNumberGenerator &rng, std::string_view hash_fn, std::string_view padding_algo)
static PKCS10_Request create (const Private_Key &key, const X509_DN &subject_dn, const Extensions &extensions, std::string_view hash_fn, RandomNumberGenerator &rng, std::string_view padding_scheme="", std::string_view challenge="")
static std::vector< uint8_t > make_signed (PK_Signer &signer, RandomNumberGenerator &rng, const AlgorithmIdentifier &alg_id, std::span< const uint8_t > tbs)

Protected Member Functions

void load_data (DataSource &src)

Detailed Description

PKCS #10 Certificate Request.

Definition at line 28 of file pkcs10.h.

Constructor & Destructor Documentation

◆ PKCS10_Request() [1/2]

Botan::PKCS10_Request::PKCS10_Request ( DataSource & source)
explicit

Create a PKCS#10 Request from a data source.

Parameters
sourcethe data source providing the DER encoded request

Definition at line 37 of file pkcs10.cpp.

37 {
38 load_data(src);
39}
void load_data(DataSource &src)
Definition x509_obj.cpp:24

References Botan::X509_Object::load_data().

Referenced by create().

◆ PKCS10_Request() [2/2]

Botan::PKCS10_Request::PKCS10_Request ( const std::vector< uint8_t > & vec)
explicit

Create a PKCS#10 Request from binary data.

Parameters
veca std::vector containing the DER value

Definition at line 41 of file pkcs10.cpp.

41 {
42 DataSource_Memory src(vec.data(), vec.size());
43 load_data(src);
44}

References Botan::X509_Object::load_data().

Member Function Documentation

◆ BER_encode()

std::vector< uint8_t > Botan::ASN1_Object::BER_encode ( ) const
inherited

Return the encoding of this object. This is a convenience method when just one object needs to be serialized. Use DER_Encoder for complicated encodings.

Definition at line 20 of file asn1_obj.cpp.

20 {
21 std::vector<uint8_t> output;
22 DER_Encoder der(output);
23 this->encode_into(der);
24 return output;
25}
virtual void encode_into(DER_Encoder &to) const =0

References encode_into().

Referenced by decode_from(), Botan::Certificate_Store_In_SQL::find_all_certs(), Botan::Certificate_Store_In_SQL::find_cert(), Botan::X509_Certificate::fingerprint(), Botan::Certificate_Store_In_SQL::insert_cert(), Botan::X509_Object::PEM_encode(), Botan::PSS_Params::PSS_Params(), and Botan::Certificate_Store_In_SQL::revoke_cert().

◆ challenge_password()

std::string Botan::PKCS10_Request::challenge_password ( ) const

Get the challenge password for this request

Returns
challenge password for this request

Definition at line 183 of file pkcs10.cpp.

183 {
184 return data().m_challenge;
185}

◆ check_signature()

bool Botan::X509_Object::check_signature ( const Public_Key & key) const
inherited

Check the signature on this data

Parameters
keythe public key purportedly used to sign this data
Returns
true if the signature is valid, otherwise false

Definition at line 125 of file x509_obj.cpp.

125 {
126 const auto result = this->verify_signature(pub_key);
127 return (result.first == Certificate_Status_Code::VERIFIED);
128}
std::pair< Certificate_Status_Code, std::string > verify_signature(const Public_Key &key) const
Definition x509_obj.cpp:130

References Botan::VERIFIED, and verify_signature().

◆ choose_sig_format()

std::unique_ptr< PK_Signer > Botan::X509_Object::choose_sig_format ( const Private_Key & key,
RandomNumberGenerator & rng,
std::string_view hash_fn,
std::string_view padding_algo )
staticinherited

Choose and return a signature scheme appropriate for X.509 signing using the provided parameters.

Parameters
keywill be the key to choose a padding scheme for
Random Number Generatorsthe random generator to use
hash_fnis the desired hash function
padding_algospecifies the padding method
Returns
a PK_Signer object for generating signatures

Definition at line 237 of file x509_obj.cpp.

240 {
241 const Signature_Format format = key._default_x509_signature_format();
242
243 if(!user_specified_padding.empty()) {
244 try {
245 auto pk_signer = std::make_unique<PK_Signer>(key, rng, user_specified_padding, format);
246 if(!hash_fn.empty() && pk_signer->hash_function() != hash_fn) {
247 throw Invalid_Argument(format_padding_error_message(
248 key.algo_name(), pk_signer->hash_function(), hash_fn, "", user_specified_padding));
249 }
250 return pk_signer;
251 } catch(Lookup_Error&) {}
252 }
253
254 const std::string padding = x509_signature_padding_for(key.algo_name(), hash_fn, user_specified_padding);
255
256 try {
257 auto pk_signer = std::make_unique<PK_Signer>(key, rng, padding, format);
258 if(!hash_fn.empty() && pk_signer->hash_function() != hash_fn) {
259 throw Invalid_Argument(format_padding_error_message(
260 key.algo_name(), pk_signer->hash_function(), hash_fn, padding, user_specified_padding));
261 }
262 return pk_signer;
263 } catch(Not_Implemented&) {
264 throw Invalid_Argument("Signatures using " + key.algo_name() + "/" + padding + " are not supported");
265 }
266}
Signature_Format
Definition pk_keys.h:32

References Botan::Asymmetric_Key::_default_x509_signature_format(), and Botan::Asymmetric_Key::algo_name().

Referenced by Botan::PKCS10_Request::create(), Botan::X509::create_self_signed_cert(), and Botan::X509_CA::X509_CA().

◆ constraints()

Key_Constraints Botan::PKCS10_Request::constraints ( ) const

Get the key constraints for the key associated with this PKCS#10 object.

Returns
key constraints

Definition at line 226 of file pkcs10.cpp.

226 {
227 if(const auto* ext = extensions().get_extension_object_as<Cert_Extension::Key_Usage>()) {
228 return ext->get_constraints();
229 } else {
231 }
232}
const Extensions & extensions() const
Definition pkcs10.cpp:219

References extensions(), and Botan::Key_Constraints::None.

◆ create()

PKCS10_Request Botan::PKCS10_Request::create ( const Private_Key & key,
const X509_DN & subject_dn,
const Extensions & extensions,
std::string_view hash_fn,
RandomNumberGenerator & rng,
std::string_view padding_scheme = "",
std::string_view challenge = "" )
static

Create a new PKCS10 certificate request

Parameters
keythe key that will be included in the certificate request
subject_dnthe DN to be placed in the request
extensionsextensions to include in the request
hash_fnthe hash function to use to create the signature
Random Number Generatorsa random number generator
padding_schemeif set specifies the padding scheme, otherwise an algorithm-specific default is used.
challengea challenge string to be included in the PKCS10 request, sometimes used for revocation purposes.

Definition at line 54 of file pkcs10.cpp.

60 {
61 auto signer = choose_sig_format(key, rng, hash_fn, padding_scheme);
62 const AlgorithmIdentifier sig_algo = signer->algorithm_identifier();
63
64 const size_t PKCS10_VERSION = 0;
65
66 DER_Encoder tbs_req;
67
68 tbs_req.start_sequence()
69 .encode(PKCS10_VERSION)
70 .encode(subject_dn)
71 .raw_bytes(key.subject_public_key())
72 .start_explicit(0);
73
74 if(!challenge.empty()) {
75 std::vector<uint8_t> value;
76 DER_Encoder(value).encode(ASN1_String(challenge));
77 tbs_req.encode(Attribute("PKCS9.ChallengePassword", value));
78 }
79
80 std::vector<uint8_t> extension_req;
81 DER_Encoder(extension_req).start_sequence().encode(extensions).end_cons();
82 tbs_req.encode(Attribute("PKCS9.ExtensionRequest", extension_req));
83
84 // end the start_explicit above
85 tbs_req.end_explicit().end_cons();
86
87 const std::vector<uint8_t> req = X509_Object::make_signed(*signer, rng, sig_algo, tbs_req.get_contents_unlocked());
88
89 return PKCS10_Request(req);
90}
PKCS10_Request(DataSource &source)
Definition pkcs10.cpp:37
const X509_DN & subject_dn() const
Definition pkcs10.cpp:190
static std::unique_ptr< PK_Signer > choose_sig_format(const Private_Key &key, RandomNumberGenerator &rng, std::string_view hash_fn, std::string_view padding_algo)
Definition x509_obj.cpp:237
static std::vector< uint8_t > make_signed(PK_Signer &signer, RandomNumberGenerator &rng, const AlgorithmIdentifier &alg_id, std::span< const uint8_t > tbs)
Definition x509_obj.cpp:153
CK_ATTRIBUTE Attribute
Definition p11.h:1212

References Botan::X509_Object::choose_sig_format(), Botan::DER_Encoder::encode(), Botan::DER_Encoder::end_cons(), Botan::DER_Encoder::end_explicit(), extensions(), Botan::DER_Encoder::get_contents_unlocked(), Botan::X509_Object::make_signed(), PKCS10_Request(), Botan::DER_Encoder::raw_bytes(), Botan::DER_Encoder::start_explicit(), Botan::DER_Encoder::start_sequence(), subject_dn(), and Botan::Public_Key::subject_public_key().

Referenced by Botan::X509::create_cert_req().

◆ decode_from()

void Botan::X509_Object::decode_from ( BER_Decoder & from)
overridevirtualinherited

Decode a BER encoded X509_Object See ASN1_Object::decode_from()

Implements Botan::ASN1_Object.

Definition at line 93 of file x509_obj.cpp.

93 {
94 auto data = std::make_shared<Signed_Data>();
95
96 from.start_sequence()
97 .start_sequence()
98 .raw_bytes(data->m_tbs_bits)
99 .end_cons()
100 .decode(data->m_sig_algo)
101 .decode(data->m_sig, ASN1_Type::BitString)
102 .end_cons();
103
104 m_signed_data = std::move(data);
105 force_decode();
106}

References Botan::BitString, Botan::BER_Decoder::decode(), Botan::BER_Decoder::end_cons(), Botan::BER_Decoder::raw_bytes(), and Botan::BER_Decoder::start_sequence().

Referenced by load_data().

◆ encode_into()

void Botan::X509_Object::encode_into ( DER_Encoder & to) const
overridevirtualinherited

DER encode an X509_Object See ASN1_Object::encode_into()

Implements Botan::ASN1_Object.

Definition at line 80 of file x509_obj.cpp.

80 {
81 to.start_sequence()
82 .start_sequence()
83 .raw_bytes(signed_body())
84 .end_cons()
85 .encode(signature_algorithm())
87 .end_cons();
88}
const std::vector< uint8_t > & signed_body() const
Definition x509_obj.cpp:66
const AlgorithmIdentifier & signature_algorithm() const
Definition x509_obj.cpp:73
const std::vector< uint8_t > & signature() const
Definition x509_obj.cpp:59

References Botan::BitString, Botan::DER_Encoder::encode(), Botan::DER_Encoder::end_cons(), Botan::DER_Encoder::raw_bytes(), signature(), signature_algorithm(), signed_body(), and Botan::DER_Encoder::start_sequence().

◆ ex_constraints()

std::vector< OID > Botan::PKCS10_Request::ex_constraints ( ) const

Get the extendend key constraints (if any).

Returns
extended key constraints

Definition at line 237 of file pkcs10.cpp.

237 {
238 if(const auto* ext = extensions().get_extension_object_as<Cert_Extension::Extended_Key_Usage>()) {
239 return ext->object_identifiers();
240 } else {
241 return {};
242 }
243}

References extensions().

◆ extensions()

const Extensions & Botan::PKCS10_Request::extensions ( ) const

Get the X509v3 extensions.

Returns
X509v3 extensions

Definition at line 219 of file pkcs10.cpp.

219 {
220 return data().m_extensions;
221}

Referenced by constraints(), create(), ex_constraints(), is_CA(), and path_length_constraint().

◆ is_CA()

bool Botan::PKCS10_Request::is_CA ( ) const

Find out whether this is a CA request.

Returns
true if it is a CA request, false otherwise.

Definition at line 248 of file pkcs10.cpp.

248 {
249 if(const auto* ext = extensions().get_extension_object_as<Cert_Extension::Basic_Constraints>()) {
250 return ext->is_ca();
251 } else {
252 return false;
253 }
254}

References extensions().

◆ load_data()

void Botan::X509_Object::load_data ( DataSource & src)
protectedinherited

Decodes from src as either DER or PEM data, then calls force_decode()

Definition at line 24 of file x509_obj.cpp.

24 {
25 try {
26 if(ASN1::maybe_BER(in) && !PEM_Code::matches(in)) {
27 BER_Decoder dec(in, BER_Decoder::Limits::DER());
28 decode_from(dec);
29 // Call to verify_end omitted here since we have to sometimes decode
30 // multiple certificates encoded sequentially in a DataSource
31 } else {
32 std::string got_label;
33 DataSource_Memory ber(PEM_Code::decode(in, got_label));
34
35 if(got_label != PEM_label()) {
36 bool is_alternate = false;
37 for(const std::string_view alt_label : alternate_PEM_labels()) {
38 if(got_label == alt_label) {
39 is_alternate = true;
40 break;
41 }
42 }
43
44 if(!is_alternate) {
45 throw Decoding_Error("Unexpected PEM label for " + PEM_label() + " of " + got_label);
46 }
47 }
48
49 BER_Decoder dec(ber, BER_Decoder::Limits::DER());
50 decode_from(dec);
51 // Call to verify_end omitted here since we have to sometimes decode
52 // multiple certificates encoded sequentially in a DataSource
53 }
54 } catch(Decoding_Error& e) {
55 throw Decoding_Error(PEM_label() + " decoding", e);
56 }
57}
static Limits DER()
Definition ber_dec.h:35
void decode_from(BER_Decoder &from) override
Definition x509_obj.cpp:93
virtual std::vector< std::string > alternate_PEM_labels() const
Definition x509_obj.h:102
virtual std::string PEM_label() const =0
bool maybe_BER(DataSource &source)
Definition asn1_obj.cpp:197
bool matches(DataSource &source, std::string_view extra, size_t search_range)
Definition pem.cpp:143
secure_vector< uint8_t > decode(DataSource &source, std::string &label)
Definition pem.cpp:62

References alternate_PEM_labels(), Botan::PEM_Code::decode(), decode_from(), Botan::BER_Decoder::Limits::DER(), Botan::PEM_Code::matches(), Botan::ASN1::maybe_BER(), and PEM_label().

Referenced by Botan::PKCS10_Request::PKCS10_Request(), Botan::PKCS10_Request::PKCS10_Request(), Botan::X509_Certificate::X509_Certificate(), Botan::X509_Certificate::X509_Certificate(), Botan::X509_CRL::X509_CRL(), Botan::X509_CRL::X509_CRL(), and X509_Object().

◆ make_signed()

std::vector< uint8_t > Botan::X509_Object::make_signed ( PK_Signer & signer,
RandomNumberGenerator & rng,
const AlgorithmIdentifier & alg_id,
std::span< const uint8_t > tbs )
staticinherited

Create a signed X509 object.

Parameters
signerthe signer used to sign the object
Random Number Generatorsthe random number generator to use
alg_idthe algorithm identifier of the signature scheme
tbsthe tbs bits to be signed
Returns
signed X509 object

Definition at line 153 of file x509_obj.cpp.

156 {
157 const std::vector<uint8_t> signature = signer.sign_message(tbs_bits, rng);
158
159 std::vector<uint8_t> output;
160 DER_Encoder(output)
161 .start_sequence()
162 .raw_bytes(tbs_bits)
163 .encode(algo)
165 .end_cons();
166
167 return output;
168}

References Botan::BitString, Botan::DER_Encoder::encode(), Botan::DER_Encoder::end_cons(), Botan::DER_Encoder::raw_bytes(), Botan::PK_Signer::sign_message(), signature(), and Botan::DER_Encoder::start_sequence().

Referenced by Botan::PKCS10_Request::create(), and Botan::X509_CA::make_cert().

◆ path_length_constraint()

std::optional< size_t > Botan::PKCS10_Request::path_length_constraint ( ) const

Return the constraint on the path length defined in the BasicConstraints extension.

Returns
path limit (or nullopt if not set)

Definition at line 259 of file pkcs10.cpp.

259 {
260 if(const auto* ext = extensions().get_extension_object_as<Cert_Extension::Basic_Constraints>()) {
261 if(ext->is_ca()) {
262 return ext->path_length_constraint();
263 }
264 }
265
266 return std::nullopt;
267}

References extensions().

Referenced by path_limit().

◆ path_limit()

size_t Botan::PKCS10_Request::path_limit ( ) const
inline

Return the constraint on the path length defined in the BasicConstraints extension.

Note this returns 0 if the extension is not set

Returns
path limit

Definition at line 80 of file pkcs10.h.

80 {
81 return path_length_constraint().value_or(0);
82 }
std::optional< size_t > path_length_constraint() const
Definition pkcs10.cpp:259

References path_length_constraint(), and path_limit().

Referenced by path_limit().

◆ PEM_encode()

std::string Botan::X509_Object::PEM_encode ( ) const
inherited
Returns
PEM encoding of this

Definition at line 111 of file x509_obj.cpp.

111 {
113}
std::vector< uint8_t > BER_encode() const
Definition asn1_obj.cpp:20
std::string encode(const uint8_t der[], size_t length, std::string_view label, size_t width)
Definition pem.cpp:39

References Botan::ASN1_Object::BER_encode(), Botan::PEM_Code::encode(), and PEM_label().

◆ raw_public_key()

const std::vector< uint8_t > & Botan::PKCS10_Request::raw_public_key ( ) const

Get the raw DER encoded public key.

Returns
raw DER encoded public key

Definition at line 197 of file pkcs10.cpp.

197 {
198 return data().m_public_key_bits;
199}

Referenced by Botan::X509_CA::sign_request(), Botan::X509_CA::sign_request(), and subject_public_key().

◆ signature()

const std::vector< uint8_t > & Botan::X509_Object::signature ( ) const
inherited
Returns
signature on tbs_data()

Definition at line 59 of file x509_obj.cpp.

59 {
60 if(!m_signed_data) {
61 throw Invalid_State("X509_Object uninitialized");
62 }
63 return m_signed_data->m_sig;
64}

Referenced by encode_into(), make_signed(), Botan::X509_Certificate::operator<(), Botan::X509_Certificate::operator==(), and verify_signature().

◆ signature_algorithm()

const AlgorithmIdentifier & Botan::X509_Object::signature_algorithm ( ) const
inherited
Returns
signature algorithm that was used to generate signature

Definition at line 73 of file x509_obj.cpp.

73 {
74 if(!m_signed_data) {
75 throw Invalid_State("X509_Object uninitialized");
76 }
77 return m_signed_data->m_sig_algo;
78}

Referenced by Botan::PKIX::check_chain(), encode_into(), Botan::X509_Certificate::operator==(), Botan::X509_Certificate::to_string(), and verify_signature().

◆ signed_body()

const std::vector< uint8_t > & Botan::X509_Object::signed_body ( ) const
inherited
Returns
signed body

Definition at line 66 of file x509_obj.cpp.

66 {
67 if(!m_signed_data) {
68 throw Invalid_State("X509_Object uninitialized");
69 }
70 return m_signed_data->m_tbs_bits;
71}

Referenced by encode_into(), Botan::X509_Certificate::operator<(), Botan::X509_Certificate::operator==(), and tbs_data().

◆ subject_alt_name()

const AlternativeName & Botan::PKCS10_Request::subject_alt_name ( ) const

Get the subject alternative name.

Returns
subject alternative name.

Definition at line 212 of file pkcs10.cpp.

212 {
213 return data().m_alt_name;
214}

◆ subject_dn()

const X509_DN & Botan::PKCS10_Request::subject_dn ( ) const

Get the subject DN.

Returns
subject DN

Definition at line 190 of file pkcs10.cpp.

190 {
191 return data().m_subject_dn;
192}

Referenced by create(), Botan::X509_CA::sign_request(), and Botan::X509_CA::sign_request().

◆ subject_public_key()

std::unique_ptr< Public_Key > Botan::PKCS10_Request::subject_public_key ( ) const

Get the subject public key.

Returns
subject public key

Definition at line 204 of file pkcs10.cpp.

204 {
205 DataSource_Memory source(raw_public_key());
206 return X509::load_key(source);
207}
const std::vector< uint8_t > & raw_public_key() const
Definition pkcs10.cpp:197
std::unique_ptr< Public_Key > load_key(DataSource &source)
Definition x509_key.cpp:28

References Botan::X509::load_key(), and raw_public_key().

◆ tbs_data()

std::vector< uint8_t > Botan::X509_Object::tbs_data ( ) const
inherited

The underlying data that is to be or was signed

Returns
data that is or was signed

Definition at line 118 of file x509_obj.cpp.

118 {
120}
std::vector< uint8_t > put_in_sequence(const std::vector< uint8_t > &contents)
Definition asn1_obj.cpp:177

References Botan::ASN1::put_in_sequence(), and signed_body().

Referenced by verify_signature().

◆ verify_signature()

std::pair< Certificate_Status_Code, std::string > Botan::X509_Object::verify_signature ( const Public_Key & key) const
inherited

Check the signature on this data

Parameters
keythe public key purportedly used to sign this data
Returns
status of the signature - OK if verified or otherwise an indicator of the problem preventing verification, along with the hash function that was used, for further policy checks. The second parameter is empty unless the validation was successful.

Definition at line 130 of file x509_obj.cpp.

130 {
131 try {
132 PK_Verifier verifier(pub_key, signature_algorithm());
133 const bool valid = verifier.verify_message(tbs_data(), signature());
134
135 if(valid) {
136 return std::make_pair(Certificate_Status_Code::VERIFIED, verifier.hash_function());
137 } else {
138 return std::make_pair(Certificate_Status_Code::SIGNATURE_ERROR, "");
139 }
140 } catch(Decoding_Error&) {
142 } catch(Algorithm_Not_Found&) {
143 return std::make_pair(Certificate_Status_Code::SIGNATURE_ALGO_UNKNOWN, "");
144 } catch(...) {
145 // This shouldn't happen, fallback to generic signature error
146 return std::make_pair(Certificate_Status_Code::SIGNATURE_ERROR, "");
147 }
148}
std::vector< uint8_t > tbs_data() const
Definition x509_obj.cpp:118

References Botan::PK_Verifier::hash_function(), signature(), Botan::SIGNATURE_ALGO_BAD_PARAMS, Botan::SIGNATURE_ALGO_UNKNOWN, signature_algorithm(), Botan::SIGNATURE_ERROR, tbs_data(), Botan::VERIFIED, and Botan::PK_Verifier::verify_message().

Referenced by Botan::PKIX::check_chain(), and check_signature().


The documentation for this class was generated from the following files: