8#ifndef BOTAN_DER_ENCODER_H_
9#define BOTAN_DER_ENCODER_H_
11#include <botan/asn1_obj.h>
24 typedef std::function<void(
const uint8_t[],
size_t)>
append_fn;
61 std::vector<uint8_t> get_contents_unlocked();
65 DER_Encoder& start_sequence() {
return start_cons(ASN1_Type::Sequence, ASN1_Class::Universal); }
70 return start_cons(
ASN1_Type(tag), ASN1_Class::ContextSpecific);
74 return start_cons(
ASN1_Type(tag), ASN1_Class::ExplicitContextSpecific);
85 DER_Encoder& raw_bytes(
const uint8_t val[],
size_t len);
87 template <
typename Alloc>
89 return raw_bytes(val.data(), val.size());
98 template <
typename Alloc>
100 return encode(vec.data(), vec.size(), real_type);
113 ASN1_Class class_tag = ASN1_Class::ContextSpecific);
115 template <
typename Alloc>
120 return encode(bytes.data(), bytes.size(), real_type, type_tag, class_tag);
123 template <
typename T>
125 if(value != default_value)
130 template <
typename T>
132 for(
size_t i = 0; i != values.size(); ++i)
160 return add_object(type_tag, class_tag, rep.data(), rep.size());
164 return add_object(type_tag, class_tag, rep.data(), rep.size());
172 class DER_Sequence
final {
174 uint32_t tag_of()
const;
178 void add_bytes(
const uint8_t val[],
size_t len);
180 void add_bytes(
const uint8_t hdr[],
size_t hdr_len,
const uint8_t val[],
size_t val_len);
184 DER_Sequence(DER_Sequence&& seq) :
185 m_type_tag(
std::move(seq.m_type_tag)),
186 m_class_tag(
std::move(seq.m_class_tag)),
187 m_contents(
std::move(seq.m_contents)),
188 m_set_contents(
std::move(seq.m_set_contents)) {}
190 DER_Sequence& operator=(DER_Sequence&& seq) {
191 std::swap(m_type_tag, seq.m_type_tag);
192 std::swap(m_class_tag, seq.m_class_tag);
193 std::swap(m_contents, seq.m_contents);
194 std::swap(m_set_contents, seq.m_set_contents);
198 DER_Sequence(
const DER_Sequence& seq) =
default;
200 DER_Sequence& operator=(
const DER_Sequence& seq) =
default;
205 secure_vector<uint8_t> m_contents;
206 std::vector<secure_vector<uint8_t>> m_set_contents;
209 append_fn m_append_output;
210 secure_vector<uint8_t> m_default_outbuf;
211 std::vector<DER_Sequence> m_subsequences;
secure_vector< uint8_t > get_contents()
DER_Encoder & start_set()
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const std::vector< uint8_t > &rep)
DER_Encoder & raw_bytes(const std::vector< uint8_t, Alloc > &val)
DER_Encoder & encode_optional(const T &value, const T &default_value)
DER_Encoder & encode_list(const std::vector< T > &values)
DER_Encoder & encode_if(bool pred, const ASN1_Object &obj)
DER_Encoder & encode(const std::vector< uint8_t, Alloc > &vec, ASN1_Type real_type)
DER_Encoder & start_explicit_context_specific(uint32_t tag)
DER_Encoder & start_context_specific(uint32_t tag)
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const secure_vector< uint8_t > &rep)
DER_Encoder(append_fn append)
DER_Encoder & encode(const std::vector< uint8_t, Alloc > &bytes, ASN1_Type real_type, ASN1_Type type_tag, ASN1_Class class_tag)
DER_Encoder & encode_if(bool pred, DER_Encoder &enc)
std::function< void(const uint8_t[], size_t)> append_fn
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_DEPRECATED(msg)
std::vector< T, secure_allocator< T > > secure_vector