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>
29 std::multimap<OID, std::string>::const_iterator j;
30 for(j = args.begin(); j != args.end(); ++j)
39 std::multimap<std::string, std::string>::const_iterator j;
40 for(j = args.begin(); j != args.end(); ++j)
48 const std::string& str)
62 typedef std::multimap<OID, ASN1_String>::iterator rdn_iter;
64 std::pair<rdn_iter, rdn_iter> range = dn_info.equal_range(oid);
65 for(rdn_iter j = range.first; j != range.second; ++j)
66 if(j->second.value() == str)
78 typedef std::multimap<OID, ASN1_String>::const_iterator rdn_iter;
80 std::multimap<OID, std::string> retval;
81 for(rdn_iter j = dn_info.begin(); j != dn_info.end(); ++j)
91 typedef std::multimap<OID, ASN1_String>::const_iterator rdn_iter;
93 std::multimap<std::string, std::string> retval;
94 for(rdn_iter j = dn_info.begin(); j != dn_info.end(); ++j)
104 typedef std::multimap<OID, ASN1_String>::const_iterator rdn_iter;
107 std::pair<rdn_iter, rdn_iter> range = dn_info.equal_range(oid);
109 std::vector<std::string> values;
110 for(rdn_iter j = range.first; j != range.second; ++j)
111 values.push_back(j->second.value());
128 if(info ==
"Name" || info ==
"CommonName")
return "X520.CommonName";
129 if(info ==
"SerialNumber")
return "X520.SerialNumber";
130 if(info ==
"Country")
return "X520.Country";
131 if(info ==
"Organization")
return "X520.Organization";
132 if(info ==
"Organizational Unit" || info ==
"OrgUnit")
133 return "X520.OrganizationalUnit";
134 if(info ==
"Locality")
return "X520.Locality";
135 if(info ==
"State" || info ==
"Province")
return "X520.State";
136 if(info ==
"Email")
return "RFC822";
145 typedef std::multimap<OID, std::string>::const_iterator rdn_iter;
150 if(attr1.size() != attr2.size())
return false;
152 rdn_iter p1 = attr1.begin();
153 rdn_iter p2 = attr2.begin();
157 if(p1 == attr1.end() && p2 == attr2.end())
159 if(p1 == attr1.end())
return false;
160 if(p2 == attr2.end())
return false;
161 if(p1->first != p2->first)
return false;
175 return !(dn1 == dn2);
183 typedef std::multimap<OID, std::string>::const_iterator rdn_iter;
188 if(attr1.size() < attr2.size())
return true;
189 if(attr1.size() > attr2.size())
return false;
191 for(rdn_iter p1 = attr1.begin(); p1 != attr1.end(); ++p1)
193 std::multimap<OID, std::string>::const_iterator p2;
194 p2 = attr2.find(p1->first);
195 if(p2 == attr2.end())
return false;
196 if(p1->second > p2->second)
return false;
197 if(p1->second < p2->second)
return true;
207 void do_ava(DER_Encoder& encoder,
208 const std::multimap<OID, std::string>& dn_info,
209 ASN1_Tag string_type,
const std::string& oid_str,
210 bool must_exist =
false)
212 typedef std::multimap<OID, std::string>::const_iterator rdn_iter;
215 const bool exists = (dn_info.find(oid) != dn_info.end());
217 if(!exists && must_exist)
218 throw Encoding_Error(
"X509_DN: No entry for " + oid_str);
221 std::pair<rdn_iter, rdn_iter> range = dn_info.equal_range(oid);
223 for(rdn_iter j = range.first; j != range.second; ++j)
225 encoder.start_cons(
SET)
228 .encode(ASN1_String(j->second, string_type))
bool x500_name_cmp(const std::string &name1, const std::string &name2)
bool operator!=(const OctetString &s1, const OctetString &s2)
std::string value() const
std::vector< std::string > get_attribute(const std::string &) const
DER_Encoder & raw_bytes(const byte val[], size_t len)
BER_Decoder & decode(bool &)
bool operator==(const OctetString &s1, const OctetString &s2)
void add_attribute(const std::string &, const std::string &)
BER_Decoder start_cons(ASN1_Tag, ASN1_Tag=UNIVERSAL)
std::string lookup(const OID &oid)
void encode_into(class DER_Encoder &) const
BER_Decoder & raw_bytes(MemoryRegion< byte > &)
BER_Decoder & verify_end()
bool BOTAN_DLL operator<(const X509_Time &, const X509_Time &)
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
MemoryVector< byte > get_bits() const
void multimap_insert(std::multimap< K, V > &multimap, const K &key, const V &value)
void decode_from(class BER_Decoder &)