8 #include <botan/asn1_oid.h>
9 #include <botan/der_enc.h>
10 #include <botan/ber_dec.h>
11 #include <botan/internal/bit_ops.h>
12 #include <botan/parsing.h>
32 if(m_id.size() < 2 || m_id[0] > 2)
34 if((m_id[0] == 0 || m_id[0] == 1) && m_id[1] > 39)
53 for(
size_t i = 0; i != m_id.size(); ++i)
56 if(i != m_id.size() - 1)
67 if(m_id.size() != oid.m_id.size())
69 for(
size_t i = 0; i != m_id.size(); ++i)
70 if(m_id[i] != oid.m_id[i])
80 m_id.push_back(component);
107 const std::vector<uint32_t>& oid1 = a.
get_id();
108 const std::vector<uint32_t>& oid2 = b.
get_id();
110 if(oid1.size() < oid2.size())
112 if(oid1.size() > oid2.size())
114 for(
size_t i = 0; i != oid1.size(); ++i)
116 if(oid1[i] < oid2[i])
118 if(oid1[i] > oid2[i])
132 std::vector<uint8_t> encoding;
133 encoding.push_back(40 * m_id[0] + m_id[1]);
135 for(
size_t i = 2; i != m_id.size(); ++i)
138 encoding.push_back(0);
141 size_t blocks =
high_bit(m_id[i]) + 6;
142 blocks = (blocks - (blocks % 7)) / 7;
146 for(
size_t j = 0; j != blocks - 1; ++j)
147 encoding.push_back(0x80 | ((m_id[i] >> 7*(blocks-j-1)) & 0x7F));
148 encoding.push_back(m_id[i] & 0x7F);
161 throw BER_Bad_Tag(
"Error decoding OID, unknown tag",
163 if(obj.
value.size() < 2)
168 m_id.push_back(obj.
value[0] / 40);
169 m_id.push_back(obj.
value[0] % 40);
172 while(i != obj.
value.size() - 1)
174 uint32_t component = 0;
175 while(i != obj.
value.size() - 1)
179 if(component >> (32-7))
182 component = (component << 7) + (obj.
value[i] & 0x7F);
184 if(!(obj.
value[i] & 0x80))
187 m_id.push_back(component);
DER_Encoder & add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const uint8_t rep[], size_t length)
void encode_into(class DER_Encoder &) const override
bool operator!=(const AlgorithmIdentifier &a1, const AlgorithmIdentifier &a2)
std::string to_string(const BER_Object &obj)
bool operator<(const OID &a, const OID &b)
OID operator+(const OID &oid, uint32_t component)
#define BOTAN_ASSERT(expr, assertion_made)
secure_vector< uint8_t > value
OID(const std::string &str="")
void decode_from(class BER_Decoder &) override
bool operator==(const OID &) const
BER_Object get_next_object()
std::string as_string() const
std::vector< uint32_t > parse_asn1_oid(const std::string &oid)
const std::vector< uint32_t > & get_id() const
OID & operator+=(uint32_t new_comp)