Botan 3.0.0-alpha0
Crypto and TLS for C&
Classes | Public Types | Public Member Functions | List of all members
Botan::DER_Encoder Class Referencefinal

#include <der_enc.h>

Public Types

typedef std::function< void(const uint8_t[], size_t)> append_fn
 

Public Member Functions

DER_Encoderadd_object (ASN1_Type type_tag, ASN1_Class class_tag, const secure_vector< uint8_t > &rep)
 
DER_Encoderadd_object (ASN1_Type type_tag, ASN1_Class class_tag, const std::string &str)
 
DER_Encoderadd_object (ASN1_Type type_tag, ASN1_Class class_tag, const std::vector< uint8_t > &rep)
 
DER_Encoderadd_object (ASN1_Type type_tag, ASN1_Class class_tag, const uint8_t rep[], size_t length)
 
DER_Encoderadd_object (ASN1_Type type_tag, ASN1_Class class_tag, uint8_t val)
 
 DER_Encoder ()=default
 
 DER_Encoder (append_fn append)
 
 DER_Encoder (secure_vector< uint8_t > &vec)
 
 DER_Encoder (std::vector< uint8_t > &vec)
 
DER_Encoderencode (bool b)
 
DER_Encoderencode (bool b, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
 
DER_Encoderencode (const ASN1_Object &obj)
 
DER_Encoderencode (const BigInt &n)
 
DER_Encoderencode (const BigInt &n, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
 
template<typename Alloc >
DER_Encoderencode (const std::vector< uint8_t, Alloc > &bytes, ASN1_Type real_type, ASN1_Type type_tag, ASN1_Class class_tag)
 
template<typename Alloc >
DER_Encoderencode (const std::vector< uint8_t, Alloc > &vec, ASN1_Type real_type)
 
DER_Encoderencode (const uint8_t v[], size_t len, ASN1_Type real_type, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
 
DER_Encoderencode (const uint8_t val[], size_t len, ASN1_Type real_type)
 
DER_Encoderencode (size_t s)
 
DER_Encoderencode (size_t s, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
 
DER_Encoderencode_if (bool pred, const ASN1_Object &obj)
 
DER_Encoderencode_if (bool pred, DER_Encoder &enc)
 
template<typename T >
DER_Encoderencode_list (const std::vector< T > &values)
 
DER_Encoderencode_null ()
 
template<typename T >
DER_Encoderencode_optional (const T &value, const T &default_value)
 
DER_Encoderend_cons ()
 
DER_Encoderend_explicit ()
 
secure_vector< uint8_t > get_contents ()
 
std::vector< uint8_t > get_contents_unlocked ()
 
template<typename Alloc >
DER_Encoderraw_bytes (const std::vector< uint8_t, Alloc > &val)
 
DER_Encoderraw_bytes (const uint8_t val[], size_t len)
 
DER_Encoderstart_cons (ASN1_Type type_tag, ASN1_Class class_tag)
 
DER_Encoderstart_context_specific (uint32_t tag)
 
DER_Encoderstart_explicit (uint16_t type_tag)
 
DER_Encoderstart_explicit_context_specific (uint32_t tag)
 
DER_Encoderstart_sequence ()
 
DER_Encoderstart_set ()
 

Detailed Description

General DER Encoding Object

Definition at line 22 of file der_enc.h.

Member Typedef Documentation

◆ append_fn

typedef std::function<void (const uint8_t[], size_t)> Botan::DER_Encoder::append_fn

Definition at line 25 of file der_enc.h.

Constructor & Destructor Documentation

◆ DER_Encoder() [1/4]

Botan::DER_Encoder::DER_Encoder ( )
default

DER encode, writing to an internal buffer Use get_contents or get_contents_unlocked to read the results after all encoding is completed.

◆ DER_Encoder() [2/4]

Botan::DER_Encoder::DER_Encoder ( secure_vector< uint8_t > &  vec)

DER encode, writing to

Parameters
vecIf this constructor is used, get_contents* may not be called.

Definition at line 72 of file der_enc.cpp.

73 {
74 m_append_output = [&vec](const uint8_t b[], size_t l)
75 {
76 vec.insert(vec.end(), b, b + l);
77 };
78 }
PolynomialVector b
Definition: kyber.cpp:821

References b.

◆ DER_Encoder() [3/4]

Botan::DER_Encoder::DER_Encoder ( std::vector< uint8_t > &  vec)

DER encode, writing to

Parameters
vecIf this constructor is used, get_contents* may not be called.

Definition at line 80 of file der_enc.cpp.

81 {
82 m_append_output = [&vec](const uint8_t b[], size_t l)
83 {
84 vec.insert(vec.end(), b, b + l);
85 };
86 }

References b.

◆ DER_Encoder() [4/4]

Botan::DER_Encoder::DER_Encoder ( append_fn  append)
inline

DER encode, calling append to write output If this constructor is used, get_contents* may not be called.

Definition at line 50 of file der_enc.h.

50: m_append_output(append) {}

Member Function Documentation

◆ add_object() [1/5]

DER_Encoder & Botan::DER_Encoder::add_object ( ASN1_Type  type_tag,
ASN1_Class  class_tag,
const secure_vector< uint8_t > &  rep 
)
inline

Definition at line 187 of file der_enc.h.

189 {
190 return add_object(type_tag, class_tag, rep.data(), rep.size());
191 }
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const uint8_t rep[], size_t length)
Definition: der_enc.cpp:252

◆ add_object() [2/5]

DER_Encoder & Botan::DER_Encoder::add_object ( ASN1_Type  type_tag,
ASN1_Class  class_tag,
const std::string &  str 
)

Definition at line 391 of file der_enc.cpp.

393 {
394 const uint8_t* rep = cast_char_ptr_to_uint8(rep_str.data());
395 const size_t rep_len = rep_str.size();
396 return add_object(type_tag, class_tag, rep, rep_len);
397 }
const uint8_t * cast_char_ptr_to_uint8(const char *s)
Definition: mem_ops.h:183

References add_object(), and Botan::cast_char_ptr_to_uint8().

◆ add_object() [3/5]

DER_Encoder & Botan::DER_Encoder::add_object ( ASN1_Type  type_tag,
ASN1_Class  class_tag,
const std::vector< uint8_t > &  rep 
)
inline

Definition at line 181 of file der_enc.h.

183 {
184 return add_object(type_tag, class_tag, rep.data(), rep.size());
185 }

◆ add_object() [4/5]

DER_Encoder & Botan::DER_Encoder::add_object ( ASN1_Type  type_tag,
ASN1_Class  class_tag,
const uint8_t  rep[],
size_t  length 
)

Definition at line 252 of file der_enc.cpp.

254 {
255 std::vector<uint8_t> hdr;
256 encode_tag(hdr, type_tag, class_tag);
257 encode_length(hdr, length);
258
259 if(!m_subsequences.empty())
260 {
261 m_subsequences[m_subsequences.size()-1].add_bytes(hdr.data(), hdr.size(), rep, length);
262 }
263 else if(m_append_output)
264 {
265 m_append_output(hdr.data(), hdr.size());
266 m_append_output(rep, length);
267 }
268 else
269 {
270 m_default_outbuf += hdr;
271 m_default_outbuf += std::make_pair(rep, length);
272 }
273
274 return (*this);
275 }

Referenced by add_object(), encode(), Botan::OID::encode_into(), Botan::ASN1_Time::encode_into(), Botan::ASN1_String::encode_into(), and encode_null().

◆ add_object() [5/5]

DER_Encoder & Botan::DER_Encoder::add_object ( ASN1_Type  type_tag,
ASN1_Class  class_tag,
uint8_t  val 
)

Definition at line 402 of file der_enc.cpp.

404 {
405 return add_object(type_tag, class_tag, &rep, 1);
406 }

References add_object().

◆ encode() [1/11]

DER_Encoder & Botan::DER_Encoder::encode ( bool  b)

Definition at line 288 of file der_enc.cpp.

289 {
291 }
DER_Encoder & encode(bool b)
Definition: der_enc.cpp:288

References Botan::Boolean, encode(), and Botan::Universal.

Referenced by Botan::GOST_3410_PublicKey::algorithm_identifier(), Botan::OCSP::Request::BER_encode(), Botan::PKCS8::BER_encode(), Botan::PKCS8::BER_encode_encrypted_pbkdf_iter(), Botan::PKCS8::BER_encode_encrypted_pbkdf_msec(), Botan::PSSR::config_for_x509(), Botan::PKCS10_Request::create(), Botan::TLS::Session::DER_encode(), Botan::DL_Group::DER_encode(), Botan::EC_Group::DER_encode(), encode(), Botan::AlgorithmIdentifier::encode_into(), Botan::X509_DN::encode_into(), Botan::AlternativeName::encode_into(), Botan::Extensions::encode_into(), Botan::CRL_Entry::encode_into(), Botan::OCSP::CertID::encode_into(), Botan::Attribute::encode_into(), Botan::X509_Object::encode_into(), Botan::X509_Object::make_signed(), Botan::Curve25519_PrivateKey::private_key_bits(), Botan::DL_Scheme_PrivateKey::private_key_bits(), Botan::EC_PrivateKey::private_key_bits(), Botan::Ed25519_PrivateKey::private_key_bits(), Botan::McEliece_PrivateKey::private_key_bits(), Botan::RSA_PrivateKey::private_key_bits(), Botan::XMSS_PrivateKey::private_key_bits(), Botan::Private_Key::private_key_info(), Botan::TPM_PrivateKey::public_key_bits(), Botan::DL_Scheme_PublicKey::public_key_bits(), Botan::GOST_3410_PublicKey::public_key_bits(), Botan::McEliece_PublicKey::public_key_bits(), Botan::RSA_PublicKey::public_key_bits(), Botan::XMSS_PublicKey::public_key_bits(), Botan::Kyber_PublicKey::public_key_bits_der(), Botan::TLS::Certificate_Request_12::serialize(), and Botan::Public_Key::subject_public_key().

◆ encode() [2/11]

DER_Encoder & Botan::DER_Encoder::encode ( bool  b,
ASN1_Type  type_tag,
ASN1_Class  class_tag = ASN1_Class::ContextSpecific 
)

Definition at line 321 of file der_enc.cpp.

323 {
324 uint8_t val = is_true ? 0xFF : 0x00;
325 return add_object(type_tag, class_tag, &val, 1);
326 }

References add_object().

◆ encode() [3/11]

DER_Encoder & Botan::DER_Encoder::encode ( const ASN1_Object obj)

Definition at line 382 of file der_enc.cpp.

383 {
384 obj.encode_into(*this);
385 return (*this);
386 }

References Botan::ASN1_Object::encode_into().

◆ encode() [4/11]

DER_Encoder & Botan::DER_Encoder::encode ( const BigInt n)

Definition at line 304 of file der_enc.cpp.

References encode(), Botan::Integer, and Botan::Universal.

◆ encode() [5/11]

DER_Encoder & Botan::DER_Encoder::encode ( const BigInt n,
ASN1_Type  type_tag,
ASN1_Class  class_tag = ASN1_Class::ContextSpecific 
)

Definition at line 340 of file der_enc.cpp.

342 {
343 if(n == 0)
344 return add_object(type_tag, class_tag, 0);
345
346 const size_t extra_zero = (n.bits() % 8 == 0) ? 1 : 0;
347 secure_vector<uint8_t> contents(extra_zero + n.bytes());
348 n.binary_encode(&contents[extra_zero]);
349 if(n < 0)
350 {
351 for(unsigned char & content : contents)
352 content = ~content;
353 for(size_t i = contents.size(); i > 0; --i)
354 if(++contents[i-1])
355 break;
356 }
357
358 return add_object(type_tag, class_tag, contents);
359 }

References add_object(), Botan::BigInt::binary_encode(), Botan::BigInt::bits(), and Botan::BigInt::bytes().

◆ encode() [6/11]

template<typename Alloc >
DER_Encoder & Botan::DER_Encoder::encode ( const std::vector< uint8_t, Alloc > &  bytes,
ASN1_Type  real_type,
ASN1_Type  type_tag,
ASN1_Class  class_tag 
)
inline

Definition at line 132 of file der_enc.h.

135 {
136 return encode(bytes.data(), bytes.size(),
137 real_type, type_tag, class_tag);
138 }

References Botan::PEM_Code::encode().

◆ encode() [7/11]

template<typename Alloc >
DER_Encoder & Botan::DER_Encoder::encode ( const std::vector< uint8_t, Alloc > &  vec,
ASN1_Type  real_type 
)
inline

Definition at line 109 of file der_enc.h.

110 {
111 return encode(vec.data(), vec.size(), real_type);
112 }

References Botan::PEM_Code::encode().

◆ encode() [8/11]

DER_Encoder & Botan::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 
)

Definition at line 364 of file der_enc.cpp.

367 {
368 if(real_type != ASN1_Type::OctetString && real_type != ASN1_Type::BitString)
369 throw Invalid_Argument("DER_Encoder: Invalid tag for byte/bit string");
370
371 if(real_type == ASN1_Type::BitString)
372 {
373 secure_vector<uint8_t> encoded;
374 encoded.push_back(0);
375 encoded += std::make_pair(bytes, length);
376 return add_object(type_tag, class_tag, encoded);
377 }
378 else
379 return add_object(type_tag, class_tag, bytes, length);
380 }

References add_object(), Botan::BitString, and Botan::OctetString.

◆ encode() [9/11]

DER_Encoder & Botan::DER_Encoder::encode ( const uint8_t  val[],
size_t  len,
ASN1_Type  real_type 
)

Definition at line 312 of file der_enc.cpp.

314 {
315 return encode(bytes, length, real_type, real_type, ASN1_Class::Universal);
316 }

References encode(), and Botan::Universal.

◆ encode() [10/11]

DER_Encoder & Botan::DER_Encoder::encode ( size_t  s)

Definition at line 296 of file der_enc.cpp.

297 {
299 }
static BigInt from_u64(uint64_t n)
Definition: bigint.cpp:28

References encode(), Botan::BigInt::from_u64(), Botan::Integer, and Botan::Universal.

◆ encode() [11/11]

DER_Encoder & Botan::DER_Encoder::encode ( size_t  s,
ASN1_Type  type_tag,
ASN1_Class  class_tag = ASN1_Class::ContextSpecific 
)

Definition at line 331 of file der_enc.cpp.

333 {
334 return encode(BigInt::from_u64(n), type_tag, class_tag);
335 }

References encode(), and Botan::BigInt::from_u64().

◆ encode_if() [1/2]

DER_Encoder & Botan::DER_Encoder::encode_if ( bool  pred,
const ASN1_Object obj 
)
inline

Definition at line 171 of file der_enc.h.

172 {
173 if(pred)
174 encode(obj);
175 return (*this);
176 }

References Botan::PEM_Code::encode().

◆ encode_if() [2/2]

DER_Encoder & Botan::DER_Encoder::encode_if ( bool  pred,
DER_Encoder enc 
)
inline

Definition at line 164 of file der_enc.h.

165 {
166 if(pred)
167 return raw_bytes(enc.get_contents());
168 return (*this);
169 }
DER_Encoder & raw_bytes(const uint8_t val[], size_t len)
Definition: der_enc.cpp:231

References get_contents().

◆ encode_list()

template<typename T >
DER_Encoder & Botan::DER_Encoder::encode_list ( const std::vector< T > &  values)
inline

Definition at line 149 of file der_enc.h.

150 {
151 for(size_t i = 0; i != values.size(); ++i)
152 encode(values[i]);
153 return (*this);
154 }

References Botan::PEM_Code::encode().

◆ encode_null()

DER_Encoder & Botan::DER_Encoder::encode_null ( )

Definition at line 280 of file der_enc.cpp.

281 {
283 }

References add_object(), Botan::Null, and Botan::Universal.

Referenced by Botan::EC_Group::DER_encode().

◆ encode_optional()

template<typename T >
DER_Encoder & Botan::DER_Encoder::encode_optional ( const T value,
const T default_value 
)
inline

Definition at line 141 of file der_enc.h.

142 {
143 if(value != default_value)
144 encode(value);
145 return (*this);
146 }

References Botan::PEM_Code::encode().

Referenced by Botan::Extensions::encode_into().

◆ end_cons()

DER_Encoder & Botan::DER_Encoder::end_cons ( )

◆ end_explicit()

DER_Encoder & Botan::DER_Encoder::end_explicit ( )

Definition at line 223 of file der_enc.cpp.

224 {
225 return end_cons();
226 }
DER_Encoder & end_cons()
Definition: der_enc.cpp:194

References end_cons().

Referenced by Botan::OCSP::Request::BER_encode(), Botan::PKCS10_Request::create(), and Botan::AlternativeName::encode_into().

◆ get_contents()

secure_vector< uint8_t > Botan::DER_Encoder::get_contents ( )

Definition at line 155 of file der_enc.cpp.

156 {
157 if(!m_subsequences.empty())
158 throw Invalid_State("DER_Encoder: Sequence hasn't been marked done");
159
160 if(m_append_output)
161 throw Invalid_State("DER_Encoder Cannot get contents when using output vector");
162
163 secure_vector<uint8_t> output;
164 std::swap(output, m_default_outbuf);
165 return output;
166 }

Referenced by Botan::PKCS10_Request::create(), Botan::TLS::Session::DER_encode(), encode_if(), Botan::Curve25519_PrivateKey::private_key_bits(), Botan::DL_Scheme_PrivateKey::private_key_bits(), Botan::EC_PrivateKey::private_key_bits(), Botan::Ed25519_PrivateKey::private_key_bits(), Botan::McEliece_PrivateKey::private_key_bits(), Botan::RSA_PrivateKey::private_key_bits(), Botan::XMSS_PrivateKey::private_key_bits(), Botan::Private_Key::private_key_info(), and Botan::TLS::Certificate_Request_12::serialize().

◆ get_contents_unlocked()

std::vector< uint8_t > Botan::DER_Encoder::get_contents_unlocked ( )

Return the encoded contents as a std::vector

If using this function, instead pass a std::vector to the contructor of DER_Encoder where the output will be placed. This avoids several unecessary copies.

Definition at line 168 of file der_enc.cpp.

169 {
170 if(!m_subsequences.empty())
171 throw Invalid_State("DER_Encoder: Sequence hasn't been marked done");
172
173 if(m_append_output)
174 throw Invalid_State("DER_Encoder Cannot get contents when using output vector");
175
176 std::vector<uint8_t> output(m_default_outbuf.begin(), m_default_outbuf.end());
177 m_default_outbuf.clear();
178 return output;
179 }

◆ raw_bytes() [1/2]

template<typename Alloc >
DER_Encoder & Botan::DER_Encoder::raw_bytes ( const std::vector< uint8_t, Alloc > &  val)
inline

Definition at line 97 of file der_enc.h.

98 {
99 return raw_bytes(val.data(), val.size());
100 }

◆ raw_bytes() [2/2]

DER_Encoder & Botan::DER_Encoder::raw_bytes ( const uint8_t  val[],
size_t  len 
)

Insert raw bytes directly into the output stream

Definition at line 231 of file der_enc.cpp.

232 {
233 if(!m_subsequences.empty())
234 {
235 m_subsequences[m_subsequences.size()-1].add_bytes(bytes, length);
236 }
237 else if(m_append_output)
238 {
239 m_append_output(bytes, length);
240 }
241 else
242 {
243 m_default_outbuf += std::make_pair(bytes, length);
244 }
245
246 return (*this);
247 }

Referenced by Botan::PKCS10_Request::create(), Botan::AlgorithmIdentifier::encode_into(), Botan::X509_DN::encode_into(), Botan::Attribute::encode_into(), Botan::X509_Object::encode_into(), Botan::X509_Object::make_signed(), and Botan::ASN1::put_in_sequence().

◆ start_cons()

DER_Encoder & Botan::DER_Encoder::start_cons ( ASN1_Type  type_tag,
ASN1_Class  class_tag 
)

Definition at line 184 of file der_enc.cpp.

186 {
187 m_subsequences.push_back(DER_Sequence(type_tag, class_tag));
188 return (*this);
189 }

Referenced by start_explicit().

◆ start_context_specific()

DER_Encoder & Botan::DER_Encoder::start_context_specific ( uint32_t  tag)
inline

Definition at line 76 of file der_enc.h.

77 {
79 }
DER_Encoder & start_cons(ASN1_Type type_tag, ASN1_Class class_tag)
Definition: der_enc.cpp:184
ASN1_Type
Definition: asn1_obj.h:39

References Botan::ContextSpecific.

Referenced by Botan::PSSR::config_for_x509().

◆ start_explicit()

DER_Encoder & Botan::DER_Encoder::start_explicit ( uint16_t  type_tag)

Definition at line 209 of file der_enc.cpp.

210 {
211 ASN1_Type type_tag = static_cast<ASN1_Type>(type_no);
212
213 // This would confuse DER_Sequence
214 if(type_tag == ASN1_Type::Set)
215 throw Internal_Error("DER_Encoder.start_explicit(SET) not supported");
216
217 return start_cons(type_tag, ASN1_Class::ContextSpecific);
218 }

References Botan::ContextSpecific, Botan::Set, and start_cons().

Referenced by Botan::OCSP::Request::BER_encode(), Botan::PKCS10_Request::create(), and Botan::AlternativeName::encode_into().

◆ start_explicit_context_specific()

DER_Encoder & Botan::DER_Encoder::start_explicit_context_specific ( uint32_t  tag)
inline

◆ start_sequence()

DER_Encoder & Botan::DER_Encoder::start_sequence ( )
inline

◆ start_set()

DER_Encoder & Botan::DER_Encoder::start_set ( )
inline

Definition at line 71 of file der_enc.h.

References Botan::Set, and Botan::Universal.

Referenced by Botan::X509_DN::encode_into(), and Botan::Attribute::encode_into().


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