Botan  1.11.15
src/lib/cert/cvc/cvc_ado.cpp
Go to the documentation of this file.
00001 /*
00002 * CVC Certificate Constructor
00003 * (C) 2007 FlexSecure GmbH
00004 *      2008 Jack Lloyd
00005 *
00006 * Botan is released under the Simplified BSD License (see license.txt)
00007 */
00008 
00009 #include <botan/cvc_ado.h>
00010 #include <fstream>
00011 
00012 namespace Botan {
00013 
00014 EAC1_1_ADO::EAC1_1_ADO(DataSource& in)
00015    {
00016    init(in);
00017    do_decode();
00018    }
00019 
00020 EAC1_1_ADO::EAC1_1_ADO(const std::string& in)
00021    {
00022    DataSource_Stream stream(in, true);
00023    init(stream);
00024    do_decode();
00025    }
00026 
00027 void EAC1_1_ADO::force_decode()
00028    {
00029    std::vector<byte> inner_cert;
00030    BER_Decoder(tbs_bits)
00031       .start_cons(ASN1_Tag(33))
00032       .raw_bytes(inner_cert)
00033       .end_cons()
00034       .decode(m_car)
00035       .verify_end();
00036 
00037    std::vector<byte> req_bits = DER_Encoder()
00038       .start_cons(ASN1_Tag(33), APPLICATION)
00039       .raw_bytes(inner_cert)
00040       .end_cons()
00041       .get_contents_unlocked();
00042 
00043    DataSource_Memory req_source(req_bits);
00044    m_req = EAC1_1_Req(req_source);
00045    sig_algo = m_req.sig_algo;
00046    }
00047 
00048 std::vector<byte> EAC1_1_ADO::make_signed(PK_Signer& signer,
00049                                            const std::vector<byte>& tbs_bits,
00050                                            RandomNumberGenerator& rng)
00051    {
00052    const std::vector<byte> concat_sig = signer.sign_message(tbs_bits, rng);
00053 
00054    return DER_Encoder()
00055       .start_cons(ASN1_Tag(7), APPLICATION)
00056       .raw_bytes(tbs_bits)
00057       .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION)
00058       .end_cons()
00059       .get_contents_unlocked();
00060    }
00061 
00062 ASN1_Car EAC1_1_ADO::get_car() const
00063    {
00064    return m_car;
00065    }
00066 
00067 void EAC1_1_ADO::decode_info(DataSource& source,
00068                              std::vector<byte> & res_tbs_bits,
00069                              ECDSA_Signature & res_sig)
00070    {
00071    std::vector<byte> concat_sig;
00072    std::vector<byte> cert_inner_bits;
00073    ASN1_Car car;
00074 
00075    BER_Decoder(source)
00076       .start_cons(ASN1_Tag(7))
00077       .start_cons(ASN1_Tag(33))
00078       .raw_bytes(cert_inner_bits)
00079       .end_cons()
00080       .decode(car)
00081       .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION)
00082       .end_cons();
00083 
00084    std::vector<byte> enc_cert = DER_Encoder()
00085       .start_cons(ASN1_Tag(33), APPLICATION)
00086       .raw_bytes(cert_inner_bits)
00087       .end_cons()
00088       .get_contents_unlocked();
00089 
00090    res_tbs_bits = enc_cert;
00091    res_tbs_bits += DER_Encoder().encode(car).get_contents();
00092    res_sig = decode_concatenation(concat_sig);
00093    }
00094 
00095 void EAC1_1_ADO::encode(Pipe& out, X509_Encoding encoding) const
00096    {
00097    if(encoding == PEM)
00098       throw Invalid_Argument("EAC1_1_ADO::encode() cannot PEM encode an EAC object");
00099 
00100    auto concat_sig = EAC1_1_obj<EAC1_1_ADO>::m_sig.get_concatenation();
00101 
00102    out.write(DER_Encoder()
00103              .start_cons(ASN1_Tag(7), APPLICATION)
00104                  .raw_bytes(tbs_bits)
00105                  .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION)
00106              .end_cons()
00107              .get_contents());
00108    }
00109 
00110 std::vector<byte> EAC1_1_ADO::tbs_data() const
00111    {
00112    return tbs_bits;
00113    }
00114 
00115 bool EAC1_1_ADO::operator==(EAC1_1_ADO const& rhs) const
00116    {
00117    return (this->get_concat_sig() == rhs.get_concat_sig()
00118            && this->tbs_data() == rhs.tbs_data()
00119            && this->get_car() ==  rhs.get_car());
00120    }
00121 
00122 EAC1_1_Req EAC1_1_ADO::get_request() const
00123    {
00124    return m_req;
00125    }
00126 
00127 }