Botan
1.11.15
|
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 }