174 throw Invalid_State(
"Basic_Constraints::get_path_limit: Not a CA");
188 .encode_optional(path_limit, NO_CERT_PATH_LIMIT)
213void Basic_Constraints::contents_to(Data_Store& subject, Data_Store&)
const
215 subject.add(
"X509v3.BasicConstraints.is_ca", (is_ca ? 1 : 0));
216 subject.add(
"X509v3.BasicConstraints.path_constraint", path_limit);
227 const size_t unused_bits =
low_bit(constraints) - 1;
229 MemoryVector<byte> der;
231 der.push_back(2 + ((unused_bits < 8) ? 1 : 0));
232 der.push_back(unused_bits % 8);
233 der.push_back((constraints >> 8) & 0xFF);
234 if(constraints & 0xFF)
235 der.push_back(constraints & 0xFF);
243void Key_Usage::decode_inner(
const MemoryRegion<byte>& in)
247 BER_Object obj = ber.get_next_object();
251 obj.type_tag, obj.class_tag);
253 if(obj.value.size() != 2 && obj.value.size() != 3)
256 if(obj.value[0] >= 8)
259 obj.value[obj.value.size()-1] &= (0xFF << obj.value[0]);
262 for(
size_t i = 1; i != obj.value.size(); ++i)
263 usage = (obj.value[i] << 8) | usage;
271void Key_Usage::contents_to(Data_Store& subject, Data_Store&)
const
273 subject.add(
"X509v3.KeyUsage", constraints);
281 return DER_Encoder().encode(key_id,
OCTET_STRING).get_contents();
287void Subject_Key_ID::decode_inner(
const MemoryRegion<byte>& in)
295void Subject_Key_ID::contents_to(Data_Store& subject, Data_Store&)
const
297 subject.add(
"X509v3.SubjectKeyIdentifier", key_id);
306 key_id = hash.
process(pub_key);
334void Authority_Key_ID::contents_to(Data_Store&, Data_Store& issuer)
const
337 issuer.add(
"X509v3.AuthorityKeyIdentifier", key_id);
345 return DER_Encoder().encode(alt_name).get_contents();
351void Alternative_Name::decode_inner(
const MemoryRegion<byte>& in)
359void Alternative_Name::contents_to(Data_Store& subject_info,
360 Data_Store& issuer_info)
const
362 std::multimap<std::string, std::string> contents =
365 if(oid_name_str ==
"X509v3.SubjectAlternativeName")
366 subject_info.add(contents);
367 else if(oid_name_str ==
"X509v3.IssuerAlternativeName")
368 issuer_info.add(contents);
378 const std::string& oid_name_str,
379 const std::string& config_name_str)
381 this->alt_name = alt_name;
382 this->oid_name_str = oid_name_str;
383 this->config_name_str = config_name_str;
393 "subject_alternative_name")
402 "issuer_alternative_name")
432void Extended_Key_Usage::contents_to(Data_Store& subject, Data_Store&)
const
434 for(
size_t i = 0; i != oids.size(); ++i)
435 subject.add(
"X509v3.ExtendedKeyUsage", oids[i].as_string());
443class Policy_Information :
public ASN1_Object
448 Policy_Information() {}
449 Policy_Information(
const OID& oid) : oid(oid) {}
451 void encode_into(DER_Encoder& codec)
const
458 void decode_from(BER_Decoder& codec)
474 std::vector<Policy_Information> policies;
476 for(
size_t i = 0; i != oids.size(); ++i)
481 .encode_list(policies)
489void Certificate_Policies::decode_inner(
const MemoryRegion<byte>& in)
491 std::vector<Policy_Information> policies;
495 .decode_list(policies)
499 for(
size_t i = 0; i != policies.size(); ++i)
500 oids.push_back(policies[i].oid);
506void Certificate_Policies::contents_to(Data_Store& info, Data_Store&)
const
508 for(
size_t i = 0; i != oids.size(); ++i)
509 info.add(
"X509v3.ExtendedKeyUsage", oids[i].as_string());
551void CRL_Number::contents_to(Data_Store& info, Data_Store&)
const
553 info.add(
"X509v3.CRLNumber", crl_number);
569void CRL_ReasonCode::decode_inner(
const MemoryRegion<byte>& in)
571 size_t reason_code = 0;
573 reason =
static_cast<CRL_Code>(reason_code);
579void CRL_ReasonCode::contents_to(Data_Store& info, Data_Store&)
const
581 info.add(
"X509v3.CRLReasonCode", reason);