aboutsummaryrefslogtreecommitdiffstats
path: root/src/x509/x509_crl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/x509/x509_crl.cpp')
-rw-r--r--src/x509/x509_crl.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/x509/x509_crl.cpp b/src/x509/x509_crl.cpp
new file mode 100644
index 000000000..306c78bd1
--- /dev/null
+++ b/src/x509/x509_crl.cpp
@@ -0,0 +1,149 @@
+/*************************************************
+* X.509 CRL Source File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#include <botan/x509_crl.h>
+#include <botan/x509_ext.h>
+#include <botan/ber_dec.h>
+#include <botan/parsing.h>
+#include <botan/bigint.h>
+#include <botan/libstate.h>
+#include <botan/oids.h>
+
+namespace Botan {
+
+/*************************************************
+* Load a X.509 CRL *
+*************************************************/
+X509_CRL::X509_CRL(DataSource& in) : X509_Object(in, "X509 CRL/CRL")
+ {
+ do_decode();
+ }
+
+/*************************************************
+* Load a X.509 CRL *
+*************************************************/
+X509_CRL::X509_CRL(const std::string& in) : X509_Object(in, "CRL/X509 CRL")
+ {
+ do_decode();
+ }
+
+/*************************************************
+* Decode the TBSCertList data *
+*************************************************/
+void X509_CRL::force_decode()
+ {
+ BER_Decoder tbs_crl(tbs_bits);
+
+ u32bit version;
+ tbs_crl.decode_optional(version, INTEGER, UNIVERSAL);
+
+ if(version != 0 && version != 1)
+ throw X509_CRL_Error("Unknown X.509 CRL version " +
+ to_string(version+1));
+
+ AlgorithmIdentifier sig_algo_inner;
+ tbs_crl.decode(sig_algo_inner);
+
+ if(sig_algo != sig_algo_inner)
+ throw X509_CRL_Error("Algorithm identifier mismatch");
+
+ X509_DN dn_issuer;
+ tbs_crl.decode(dn_issuer);
+ info.add(dn_issuer.contents());
+
+ X509_Time start, end;
+ tbs_crl.decode(start).decode(end);
+ info.add("X509.CRL.start", start.readable_string());
+ info.add("X509.CRL.end", end.readable_string());
+
+ BER_Object next = tbs_crl.get_next_object();
+
+ if(next.type_tag == SEQUENCE && next.class_tag == CONSTRUCTED)
+ {
+ BER_Decoder cert_list(next.value);
+
+ while(cert_list.more_items())
+ {
+ CRL_Entry entry;
+ cert_list.decode(entry);
+ revoked.push_back(entry);
+ }
+ next = tbs_crl.get_next_object();
+ }
+
+ if(next.type_tag == 0 &&
+ next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC))
+ {
+ BER_Decoder crl_options(next.value);
+
+ std::string action = global_state().option("x509/crl/unknown_critical");
+ if(action != "throw" && action != "ignore")
+ throw Invalid_Argument("Bad value of x509/crl/unknown_critical: "
+ + action);
+
+ Extensions extensions(action == "throw");
+
+ crl_options.decode(extensions).verify_end();
+
+ extensions.contents_to(info, info);
+
+ next = tbs_crl.get_next_object();
+ }
+
+ if(next.type_tag != NO_OBJECT)
+ throw X509_CRL_Error("Unknown tag in CRL");
+
+ tbs_crl.verify_end();
+ }
+
+/*************************************************
+* Return the list of revoked certificates *
+*************************************************/
+std::vector<CRL_Entry> X509_CRL::get_revoked() const
+ {
+ return revoked;
+ }
+
+/*************************************************
+* Return the distinguished name of the issuer *
+*************************************************/
+X509_DN X509_CRL::issuer_dn() const
+ {
+ return create_dn(info);
+ }
+
+/*************************************************
+* Return the key identifier of the issuer *
+*************************************************/
+MemoryVector<byte> X509_CRL::authority_key_id() const
+ {
+ return info.get1_memvec("X509v3.AuthorityKeyIdentifier");
+ }
+
+/*************************************************
+* Return the CRL number of this CRL *
+*************************************************/
+u32bit X509_CRL::crl_number() const
+ {
+ return info.get1_u32bit("X509v3.CRLNumber");
+ }
+
+/*************************************************
+* Return the issue data of the CRL *
+*************************************************/
+X509_Time X509_CRL::this_update() const
+ {
+ return info.get1("X509.CRL.start");
+ }
+
+/*************************************************
+* Return the date when a new CRL will be issued *
+*************************************************/
+X509_Time X509_CRL::next_update() const
+ {
+ return info.get1("X509.CRL.end");
+ }
+
+}