10#include <botan/tls_messages_12.h>
12#include <botan/ber_dec.h>
13#include <botan/der_enc.h>
14#include <botan/pkix_types.h>
15#include <botan/tls_extensions.h>
16#include <botan/tls_policy.h>
17#include <botan/internal/fmt.h>
18#include <botan/internal/tls_handshake_hash.h>
19#include <botan/internal/tls_handshake_io.h>
20#include <botan/internal/tls_reader.h>
32std::string cert_type_code_to_name(uint8_t code) {
43uint8_t cert_type_name_to_code(std::string_view name) {
51 throw Invalid_Argument(
fmt(
"Unknown/unhandled TLS cert type {}", name));
62 const std::vector<X509_DN>& ca_certs) :
63 m_names(ca_certs), m_cert_key_types({
"RSA",
"ECDSA"}) {
64 m_schemes = policy.acceptable_signature_schemes();
66 if(m_schemes.empty()) {
67 throw Internal_Error(
"Policy returned no acceptable signature schemes for CertificateRequest");
69 hash.update(io.send(*
this));
84 for(
const auto cert_type_code : cert_type_codes) {
85 const std::string cert_type_name = cert_type_code_to_name(cert_type_code);
87 if(cert_type_name.empty()) {
91 m_cert_key_types.emplace_back(cert_type_name);
94 const std::vector<uint8_t> algs = reader.
get_range_vector<uint8_t>(2, 2, 65534);
96 if(algs.size() % 2 != 0) {
97 throw Decoding_Error(
"Bad length for signature IDs in certificate request");
100 for(
size_t i = 0; i != algs.size(); i += 2) {
101 m_schemes.emplace_back(
make_uint16(algs[i], algs[i + 1]));
107 throw Decoding_Error(
"Inconsistent length in certificate request");
112 std::vector<uint8_t> name_bits = reader.
get_range_vector<uint8_t>(2, 1, 65535);
116 decoder.decode(name).verify_end();
117 m_names.emplace_back(name);
122 return m_cert_key_types;
137 std::vector<uint8_t> buf;
139 std::vector<uint8_t> cert_types;
141 cert_types.reserve(m_cert_key_types.size());
142 for(
const auto& cert_key_type : m_cert_key_types) {
143 cert_types.push_back(cert_type_name_to_code(cert_key_type));
151 std::vector<uint8_t> encoded_names;
153 for(
const auto& name : m_names) {
secure_vector< uint8_t > get_contents()
DER_Encoder & encode(bool b)
~Certificate_Request_12() override
const std::vector< std::string > & acceptable_cert_types() const
const std::vector< Signature_Scheme > & signature_schemes() const
std::vector< uint8_t > serialize() const override
const std::vector< X509_DN > & acceptable_CAs() const
Certificate_Request_12(Handshake_IO &io, Handshake_Hash &hash, const Policy &policy, const std::vector< X509_DN > &allowed_cas)
Handshake_Type type() const override
std::vector< uint8_t > serialize(Connection_Side whoami) const override
bool has_remaining() const
size_t remaining_bytes() const
std::vector< T > get_range_vector(size_t len_bytes, size_t min_elems, size_t max_elems)
void append_tls_length_value(std::vector< uint8_t, Alloc > &buf, const T *vals, size_t vals_size, size_t tag_size)
std::string fmt(std::string_view format, const T &... args)
constexpr uint16_t make_uint16(uint8_t i0, uint8_t i1)