8#include <botan/tls_messages.h>
9#include <botan/tls_extensions.h>
10#include <botan/internal/tls_reader.h>
11#include <botan/internal/tls_handshake_io.h>
12#include <botan/internal/tls_handshake_hash.h>
13#include <botan/der_enc.h>
14#include <botan/ber_dec.h>
22std::string cert_type_code_to_name(uint8_t code)
37uint8_t cert_type_name_to_code(
const std::string&
name)
46 throw Invalid_Argument(
"Unknown cert type " +
name);
57 const std::vector<X509_DN>& ca_certs,
60 m_cert_key_types({
"RSA",
"ECDSA",
"DSA" })
62 if(version.supports_negotiable_signature_algorithms())
64 m_schemes = policy.allowed_signature_schemes();
67 hash.update(io.send(*
this));
81 std::vector<uint8_t> cert_type_codes = reader.
get_range_vector<uint8_t>(1, 1, 255);
83 for(
size_t i = 0; i != cert_type_codes.size(); ++i)
85 const std::string cert_type_name = cert_type_code_to_name(cert_type_codes[i]);
87 if(cert_type_name.empty())
90 m_cert_key_types.emplace_back(cert_type_name);
95 const std::vector<uint8_t> algs = reader.
get_range_vector<uint8_t>(2, 2, 65534);
97 if(algs.size() % 2 != 0)
98 throw Decoding_Error(
"Bad length for signature IDs in certificate request");
100 for(
size_t i = 0; i != algs.size(); i += 2)
109 throw Decoding_Error(
"Inconsistent length in certificate request");
113 std::vector<uint8_t> name_bits = reader.
get_range_vector<uint8_t>(2, 0, 65535);
115 BER_Decoder decoder(name_bits.data(), name_bits.size());
117 decoder.decode(
name);
118 m_names.emplace_back(
name);
125std::vector<uint8_t> Certificate_Req::serialize()
const
127 std::vector<uint8_t> buf;
129 std::vector<uint8_t> cert_types;
131 for(
size_t i = 0; i != m_cert_key_types.size(); ++i)
132 cert_types.push_back(cert_type_name_to_code(m_cert_key_types[i]));
136 if(m_schemes.size() > 0)
139 std::vector<uint8_t> encoded_names;
141 for(
size_t i = 0; i != m_names.size(); ++i)
144 encoder.
encode(m_names[i]);
secure_vector< uint8_t > get_contents()
DER_Encoder & encode(bool b)
Certificate_Req(Handshake_IO &io, Handshake_Hash &hash, const Policy &policy, const std::vector< X509_DN > &allowed_cas, Protocol_Version version)
bool supports_negotiable_signature_algorithms() const
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)
constexpr uint16_t make_uint16(uint8_t i0, uint8_t i1)