/* * CRL Entry * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { struct CRL_Entry_Data { std::vector m_serial; X509_Time m_time; CRL_Code m_reason = UNSPECIFIED; Extensions m_extensions; }; /* * Create a CRL_Entry */ CRL_Entry::CRL_Entry(const X509_Certificate& cert, CRL_Code why) { m_data.reset(new CRL_Entry_Data); m_data->m_serial = cert.serial_number(); m_data->m_time = X509_Time(std::chrono::system_clock::now()); m_data->m_reason = why; if(why != UNSPECIFIED) { m_data->m_extensions.add(new Cert_Extension::CRL_ReasonCode(why)); } } /* * Compare two CRL_Entrys for equality */ bool operator==(const CRL_Entry& a1, const CRL_Entry& a2) { if(a1.serial_number() != a2.serial_number()) return false; if(a1.expire_time() != a2.expire_time()) return false; if(a1.reason_code() != a2.reason_code()) return false; return true; } /* * Compare two CRL_Entrys for inequality */ bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2) { return !(a1 == a2); } /* * DER encode a CRL_Entry */ void CRL_Entry::encode_into(DER_Encoder& der) const { der.start_cons(SEQUENCE) .encode(BigInt::decode(serial_number())) .encode(expire_time()) .start_cons(SEQUENCE) .encode(extensions()) .end_cons() .end_cons(); } /* * Decode a BER encoded CRL_Entry */ void CRL_Entry::decode_from(BER_Decoder& source) { BigInt serial_number_bn; std::unique_ptr data(new CRL_Entry_Data); BER_Decoder entry = source.start_cons(SEQUENCE); entry.decode(serial_number_bn).decode(data->m_time); data->m_serial = BigInt::encode(serial_number_bn); if(entry.more_items()) { entry.decode(data->m_extensions); if(auto ext = data->m_extensions.get_extension_object_as()) { data->m_reason = ext->get_reason(); } else { data->m_reason = UNSPECIFIED; } } entry.end_cons(); m_data.reset(data.release()); } const CRL_Entry_Data& CRL_Entry::data() const { if(!m_data) { throw Invalid_State("CRL_Entry_Data uninitialized"); } return *m_data.get(); } const std::vector& CRL_Entry::serial_number() const { return data().m_serial; } const X509_Time& CRL_Entry::expire_time() const { return data().m_time; } CRL_Code CRL_Entry::reason_code() const { return data().m_reason; } const Extensions& CRL_Entry::extensions() const { return data().m_extensions; } }