8 #include <botan/x509_dn.h>
9 #include <botan/der_enc.h>
10 #include <botan/ber_dec.h>
11 #include <botan/parsing.h>
12 #include <botan/internal/stl_util.h>
13 #include <botan/oids.h>
31 for(
auto i = args.begin(); i != args.end(); ++i)
40 for(
auto i = args.begin(); i != args.end(); ++i)
48 const std::string& str)
62 auto range = m_dn_info.equal_range(oid);
63 for(
auto i = range.first; i != range.second; ++i)
64 if(i->second.value() == str)
76 std::multimap<OID, std::string> retval;
77 for(
auto i = m_dn_info.begin(); i != m_dn_info.end(); ++i)
87 std::multimap<std::string, std::string> retval;
88 for(
auto i = m_dn_info.begin(); i != m_dn_info.end(); ++i)
100 auto range = m_dn_info.equal_range(oid);
102 std::vector<std::string> values;
103 for(
auto i = range.first; i != range.second; ++i)
104 values.push_back(i->second.value());
121 if(info ==
"Name" || info ==
"CommonName" || info ==
"CN")
return "X520.CommonName";
122 if(info ==
"SerialNumber" || info ==
"SN")
return "X520.SerialNumber";
123 if(info ==
"Country" || info ==
"C")
return "X520.Country";
124 if(info ==
"Organization" || info ==
"O")
return "X520.Organization";
125 if(info ==
"Organizational Unit" || info ==
"OrgUnit" || info ==
"OU")
126 return "X520.OrganizationalUnit";
127 if(info ==
"Locality" || info ==
"L")
return "X520.Locality";
128 if(info ==
"State" || info ==
"Province" || info ==
"ST")
return "X520.State";
129 if(info ==
"Email")
return "RFC822";
141 if(attr1.size() != attr2.size())
return false;
143 auto p1 = attr1.begin();
144 auto p2 = attr2.begin();
148 if(p1 == attr1.end() && p2 == attr2.end())
150 if(p1 == attr1.end())
return false;
151 if(p2 == attr2.end())
return false;
152 if(p1->first != p2->first)
return false;
166 return !(dn1 == dn2);
177 if(attr1.size() < attr2.size())
return true;
178 if(attr1.size() > attr2.size())
return false;
180 for(
auto p1 = attr1.begin(); p1 != attr1.end(); ++p1)
182 auto p2 = attr2.find(p1->first);
183 if(p2 == attr2.end())
return false;
184 if(p1->second > p2->second)
return false;
185 if(p1->second < p2->second)
return true;
195 void do_ava(DER_Encoder& encoder,
196 const std::multimap<OID, std::string>& dn_info,
197 ASN1_Tag string_type,
const std::string& oid_str,
198 bool must_exist =
false)
201 const bool exists = (dn_info.find(oid) != dn_info.end());
203 if(!exists && must_exist)
204 throw Encoding_Error(
"X509_DN: No entry for " + oid_str);
207 auto range = dn_info.equal_range(oid);
209 for(
auto i = range.first; i != range.second; ++i)
211 encoder.start_cons(
SET)
214 .encode(ASN1_String(i->second, string_type))
231 if(!m_dn_bits.empty())
252 std::vector<uint8_t> bits;
283 std::string to_short_form(
const std::string& long_id)
285 if(long_id ==
"X520.CommonName")
288 if(long_id ==
"X520.Organization")
291 if(long_id ==
"X520.OrganizationalUnit")
301 std::multimap<std::string, std::string> contents = dn.
contents();
303 for(std::multimap<std::string, std::string>::const_iterator i = contents.begin();
304 i != contents.end(); ++i)
306 out << to_short_form(i->first) <<
"=\"";
307 for(
char c: i->second)
309 if(c ==
'\\' || c ==
'\"')
317 if(std::next(i) != contents.end())
338 if(std::isspace(c) && key.empty())
340 else if(!std::isspace(c))
353 if(!std::isspace(c) && c !=
'=')
361 bool in_quotes =
false;
368 if(!in_quotes && !val.empty())
374 in_quotes = !in_quotes;
381 else if(c ==
',' && !in_quotes)
387 if(!key.empty() && !val.empty())
bool x500_name_cmp(const std::string &name1, const std::string &name2)
std::string value() const
std::vector< std::string > get_attribute(const std::string &) const
std::istream & operator>>(std::istream &in, X509_DN &dn)
bool operator!=(const AlgorithmIdentifier &a1, const AlgorithmIdentifier &a2)
std::ostream & operator<<(std::ostream &out, const X509_DN &dn)
bool operator==(const AlgorithmIdentifier &a1, const AlgorithmIdentifier &a2)
std::vector< uint8_t > get_bits() const
BER_Decoder & decode(bool &v)
void add_attribute(const std::string &, const std::string &)
void encode_into(class DER_Encoder &) const override
bool operator<(const OID &a, const OID &b)
DER_Encoder & raw_bytes(const uint8_t val[], size_t len)
void decode_from(class BER_Decoder &) override
std::string lookup(const OID &oid)
BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag=UNIVERSAL)
DER_Encoder & start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag=UNIVERSAL)
static std::string deref_info_field(const std::string &)
std::multimap< OID, std::string > get_attributes() const
std::multimap< std::string, std::string > contents() const
void multimap_insert(std::multimap< K, V > &multimap, const K &key, const V &value)
BER_Decoder & raw_bytes(secure_vector< uint8_t > &v)