7#ifndef BOTAN_ASN1_OBJECT_TYPES_H_
8#define BOTAN_ASN1_OBJECT_TYPES_H_
10#include <botan/secmem.h>
11#include <botan/exceptn.h>
16#include <unordered_map>
72 return static_cast<uint32_t
>(x) &
static_cast<uint32_t
>(
y);
77 return static_cast<ASN1_Type>(
static_cast<uint32_t
>(x) |
static_cast<uint32_t
>(
y));
82 return static_cast<ASN1_Class>(
static_cast<uint32_t
>(x) |
static_cast<uint32_t
>(
y));
87 return static_cast<uint32_t
>(x) |
static_cast<uint32_t
>(
y);
92 return static_cast<uint32_t
>(x) |
static_cast<uint32_t
>(
y);
121 std::vector<uint8_t> BER_encode()
const;
145 bool is_set()
const {
return m_type_tag != ASN1_Type::NoObject; }
147 uint32_t
tagging()
const {
return type_tag() | class_tag(); }
155 const uint8_t*
bits()
const {
return m_value.data(); }
157 size_t length()
const {
return m_value.size(); }
160 std::string_view descr =
"object")
const;
164 bool is_a(
int type_tag,
ASN1_Class class_tag)
const;
175 uint8_t* mutable_bits(
size_t length)
177 m_value.resize(length);
178 return m_value.data();
191std::string
to_string(
const BER_Object& obj);
216 BER_Bad_Tag(std::string_view msg, uint32_t tagging);
235 explicit OID(std::string_view str);
242 BOTAN_ARG_CHECK(m_id.size() > 2 && m_id[0] <= 2 && (m_id[0] != 2 || m_id[1] <= 39),
251 BOTAN_ARG_CHECK(m_id.size() > 2 && m_id[0] <= 2 && (m_id[0] != 2 || m_id[1] <= 39),
260 static OID from_string(std::string_view str);
266 static std::optional<OID> from_name(std::string_view
name);
271 static void register_oid(
const OID& oid, std::string_view
name);
280 bool empty()
const {
return m_id.empty(); }
286 bool has_value()
const {
return (m_id.empty() ==
false); }
294 const std::vector<uint32_t>&
get_id()
const {
return get_components(); }
300 std::string to_string()
const;
306 std::string to_formatted_string()
const;
312 std::string human_name_or_empty()
const;
318 bool registered_oid()
const;
326 return m_id == other.m_id;
330 std::unordered_map<std::string, std::string> load_oid2str_map();
331 std::unordered_map<std::string, OID> load_str2oid_map();
333 std::vector<uint32_t> m_id;
336std::ostream&
operator<<(std::ostream& out,
const OID& oid);
373 std::string readable_string()
const;
376 bool time_is_set()
const;
379 int32_t cmp(
const ASN1_Time& other)
const;
385 explicit ASN1_Time(
const std::chrono::system_clock::time_point& time);
394 std::chrono::system_clock::time_point to_std_timepoint()
const;
397 uint64_t time_since_epoch()
const;
400 void set_to(std::string_view t_spec,
ASN1_Type type);
401 bool passes_sanity_check()
const;
404 uint32_t m_month = 0;
407 uint32_t m_minute = 0;
408 uint32_t m_second = 0;
436 const std::string&
value()
const {
return m_utf8_str; }
438 size_t size()
const {
return value().size(); }
440 bool empty()
const {
return m_utf8_str.empty(); }
445 static bool is_string_type(
ASN1_Type tag);
448 {
return value() == other.
value(); }
453 std::vector<uint8_t> m_data;
454 std::string m_utf8_str;
478 const std::vector<uint8_t>&
parameters()
const {
return m_parameters; }
480 BOTAN_DEPRECATED(
"Use AlgorithmIdentifier::oid")
481 const
OID& get_oid()
const {
return m_oid; }
483 BOTAN_DEPRECATED(
"Use AlgorithmIdentifier::parameters")
484 const
std::vector<uint8_t>& get_parameters()
const {
return m_parameters; }
486 bool parameters_are_null()
const;
491 return parameters_are_empty() || parameters_are_null();
496 return m_oid.empty() && m_parameters.empty();
501 std::vector<uint8_t> m_parameters;
508 const AlgorithmIdentifier&);
510 const AlgorithmIdentifier&);
#define BOTAN_ARG_CHECK(expr, msg)
ASN1_Object & operator=(const ASN1_Object &)=default
ASN1_Object(const ASN1_Object &)=default
virtual ~ASN1_Object()=default
virtual void decode_from(BER_Decoder &from)=0
virtual void encode_into(DER_Encoder &to) const =0
const std::string & value() const
bool operator==(const ASN1_String &other) const
ASN1_Type tagging() const
ASN1_Time()=default
Create an invalid ASN1_Time.
bool parameters_are_empty() const
bool parameters_are_null_or_empty() const
const std::vector< uint8_t > & parameters() const
AlgorithmIdentifier()=default
BER_Object(BER_Object &&other)=default
const uint8_t * bits() const
BER_Object & operator=(const BER_Object &other)=default
ASN1_Type type_tag() const
BER_Object(const BER_Object &other)=default
BER_Object & operator=(BER_Object &&other)=default
ASN1_Class get_class() const
ASN1_Class class_tag() const
const std::vector< uint32_t > & get_id() const
const std::vector< uint32_t > & get_components() const
OID(std::initializer_list< uint32_t > init)
bool operator==(const OID &other) const
OID(std::vector< uint32_t > &&init)
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_UNSTABLE_API
std::vector< uint8_t > put_in_sequence(const std::vector< uint8_t > &contents)
bool maybe_BER(DataSource &source)
std::string to_string(const BER_Object &obj)
ASN1_Type operator|(ASN1_Type x, ASN1_Type y)
std::string asn1_tag_to_string(ASN1_Type type)
@ ExplicitContextSpecific
std::ostream & operator<<(std::ostream &out, const OID &oid)
bool operator!=(const AlgorithmIdentifier &a1, const AlgorithmIdentifier &a2)
std::string asn1_class_to_string(ASN1_Class type)
bool intersects(ASN1_Class x, ASN1_Class y)
std::string to_string(ErrorType type)
Convert an ErrorType to string.
std::vector< T, secure_allocator< T > > secure_vector