8#ifndef BOTAN_DER_ENCODER_H_
9#define BOTAN_DER_ENCODER_H_
11#include <botan/asn1_obj.h>
12#include <botan/secmem.h>
30 typedef std::function<void(
const uint8_t[],
size_t)>
append_fn;
72 BOTAN_DEPRECATED(
"Use DER_Encoder(vector) instead") std::vector<uint8_t> get_contents_unlocked();
149 DER_Encoder& raw_bytes(
const uint8_t val[],
size_t len);
187 DER_Encoder& encode_bitstring(std::span<const uint8_t> bits,
188 size_t unused_bits = 0,
233 return this->
encode(std::span{val, len}, real_type);
271 DER_Encoder& encode(std::span<const uint8_t> value,
290 return encode(std::span{v, len}, real_type, type_tag, class_tag);
299 template <
typename T>
302 if(value != default_value) {
313 template <
typename T>
326 template <
typename T>
328 for(
size_t i = 0; i != values.size(); ++i) {
411 return add_object(type_tag, class_tag, rep.data(), rep.size());
422 return add_object(type_tag, class_tag, std::span{rep});
433 return add_object(type_tag, class_tag, std::span{rep});
460 template <
typename T>
464 std::vector<uint8_t> tlv;
466 return add_object_tlv(type_tag, class_tag, std::move(tlv));
474 class DER_Sequence final {
476 uint32_t tag_of()
const;
480 void add_bytes(
const uint8_t val[],
size_t len);
482 void add_bytes(
const uint8_t hdr[],
size_t hdr_len,
const uint8_t val[],
size_t val_len);
486 DER_Sequence(DER_Sequence&& seq) noexcept :
487 m_type_tag(seq.m_type_tag),
488 m_class_tag(seq.m_class_tag),
489 m_sort_contents(seq.m_sort_contents),
490 m_contents(std::move(seq.m_contents)),
491 m_set_contents(std::move(seq.m_set_contents)) {}
493 DER_Sequence& operator=(DER_Sequence&& seq)
noexcept {
494 std::swap(m_type_tag, seq.m_type_tag);
495 std::swap(m_class_tag, seq.m_class_tag);
496 std::swap(m_sort_contents, seq.m_sort_contents);
497 std::swap(m_contents, seq.m_contents);
498 std::swap(m_set_contents, seq.m_set_contents);
502 DER_Sequence(
const DER_Sequence& seq) =
default;
503 DER_Sequence& operator=(
const DER_Sequence& seq) =
default;
504 ~DER_Sequence() =
default;
509 bool m_sort_contents;
510 secure_vector<uint8_t> m_contents;
511 std::vector<secure_vector<uint8_t>> m_set_contents;
514 append_fn m_append_output;
515 secure_vector<uint8_t> m_default_outbuf;
516 std::vector<DER_Sequence> m_subsequences;
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_DEPRECATED(msg)
#define BOTAN_FUTURE_EXPLICIT
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const uint8_t rep[], size_t length)
secure_vector< uint8_t > get_contents()
DER_Encoder & start_set()
DER_Encoder & encode_implicit(const T &value, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
DER_Encoder & encode_if(bool pred, bool num)
DER_Encoder & encode_octet_aligned_bitstring(std::span< const uint8_t > bytes, ASN1_Type type_tag=ASN1_Type::BitString, ASN1_Class class_tag=ASN1_Class::Universal)
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const std::vector< uint8_t > &rep)
DER_Encoder & encode_optional(const T &value, const T &default_value)
DER_Encoder & encode_list(const std::vector< T > &values)
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, std::span< const uint8_t > rep)
DER_Encoder & encode_if(bool pred, const ASN1_Object &obj)
DER_Encoder & start_set(uint32_t tag)
DER_Encoder & start_explicit_context_specific(uint32_t tag)
DER_Encoder & start_context_specific(uint32_t tag)
DER_Encoder & encode_optional(const std::optional< T > &value)
DER_Encoder & encode(const uint8_t val[], size_t len, ASN1_Type real_type)
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const secure_vector< uint8_t > &rep)
DER_Encoder & encode(const uint8_t v[], size_t len, ASN1_Type real_type, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
DER_Encoder & start_sequence()
DER_Encoder & encode_if(bool pred, DER_Encoder &enc)
DER_Encoder & raw_bytes(std::span< const uint8_t > val)
DER_Encoder & start_cons(ASN1_Type type_tag, ASN1_Class class_tag)
DER_Encoder & raw_bytes(const uint8_t val[], size_t len)
DER_Encoder & encode_if(bool pred, size_t num)
BOTAN_FUTURE_EXPLICIT DER_Encoder(append_fn append)
DER_Encoder & encode_bitstring(std::span< const uint8_t > bits, size_t unused_bits=0, ASN1_Type type_tag=ASN1_Type::BitString, ASN1_Class class_tag=ASN1_Class::Universal)
DER_Encoder & encode(bool b)
std::function< void(const uint8_t[], size_t)> append_fn
@ ExplicitContextSpecific
std::vector< T, secure_allocator< T > > secure_vector