Botan 1.10.17
cvc_ado.cpp
Go to the documentation of this file.
1/*
2* CVC Certificate Constructor
3* (C) 2007 FlexSecure GmbH
4* 2008 Jack Lloyd
5*
6* Distributed under the terms of the Botan license
7*/
8
9#include <botan/cvc_ado.h>
10#include <fstream>
11
12namespace Botan {
13
15 {
16 init(in);
17 do_decode();
18 }
19
20EAC1_1_ADO::EAC1_1_ADO(const std::string& in)
21 {
22 DataSource_Stream stream(in, true);
23 init(stream);
24 do_decode();
25 }
26
27void EAC1_1_ADO::force_decode()
28 {
29 SecureVector<byte> inner_cert;
31 .start_cons(ASN1_Tag(33))
32 .raw_bytes(inner_cert)
33 .end_cons()
34 .decode(m_car)
35 .verify_end();
36
39 .raw_bytes(inner_cert)
40 .end_cons()
41 .get_contents();
42
43 DataSource_Memory req_source(req_bits);
44 m_req = EAC1_1_Req(req_source);
45 sig_algo = m_req.sig_algo;
46 }
47
61
63 {
64 return m_car;
65 }
66
67void EAC1_1_ADO::decode_info(DataSource& source,
68 SecureVector<byte> & res_tbs_bits,
69 ECDSA_Signature & res_sig)
70 {
71 SecureVector<byte> concat_sig;
72 SecureVector<byte> cert_inner_bits;
73 ASN1_Car car;
74
75 BER_Decoder(source)
76 .start_cons(ASN1_Tag(7))
77 .start_cons(ASN1_Tag(33))
78 .raw_bytes(cert_inner_bits)
79 .end_cons()
80 .decode(car)
81 .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION)
82 .end_cons();
83
86 .raw_bytes(cert_inner_bits)
87 .end_cons()
88 .get_contents();
89
90 res_tbs_bits = enc_cert;
91 res_tbs_bits += DER_Encoder().encode(car).get_contents();
92 res_sig = decode_concatenation(concat_sig);
93 }
94
95void EAC1_1_ADO::encode(Pipe& out, X509_Encoding encoding) const
96 {
97 if(encoding == PEM)
98 throw Invalid_Argument("EAC1_1_ADO::encode() cannot PEM encode an EAC object");
99
100 SecureVector<byte> concat_sig(
101 EAC1_1_obj<EAC1_1_ADO>::m_sig.get_concatenation());
102
103 out.write(DER_Encoder()
104 .start_cons(ASN1_Tag(7), APPLICATION)
105 .raw_bytes(tbs_bits)
106 .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION)
107 .end_cons()
108 .get_contents());
109 }
110
112 {
113 return tbs_bits;
114 }
115
116bool EAC1_1_ADO::operator==(EAC1_1_ADO const& rhs) const
117 {
118 return (this->get_concat_sig() == rhs.get_concat_sig()
119 && this->tbs_data() == rhs.tbs_data()
120 && this->get_car() == rhs.get_car());
121 }
122
124 {
125 return m_req;
126 }
127
128}
BER_Decoder(DataSource &)
Definition ber_dec.cpp:264
DER_Encoder & start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag=UNIVERSAL)
Definition der_enc.cpp:135
DER_Encoder & raw_bytes(const byte val[], size_t len)
Definition der_enc.cpp:188
SecureVector< byte > get_contents()
Definition der_enc.cpp:122
DER_Encoder & end_cons()
Definition der_enc.cpp:145
DER_Encoder & encode(bool b)
Definition der_enc.cpp:209
EAC1_1_ADO(const std::string &str)
Definition cvc_ado.cpp:20
SecureVector< byte > tbs_data() const
Definition cvc_ado.cpp:111
ASN1_Car get_car() const
Definition cvc_ado.cpp:62
void encode(Pipe &out, X509_Encoding encoding) const
Definition cvc_ado.cpp:95
EAC1_1_Req get_request() const
Definition cvc_ado.cpp:123
bool operator==(EAC1_1_ADO const &rhs) const
Definition cvc_ado.cpp:116
static MemoryVector< byte > make_signed(PK_Signer &signer, const MemoryRegion< byte > &tbs_bits, RandomNumberGenerator &rng)
Definition cvc_ado.cpp:48
EAC1_1_Req(DataSource &source)
Definition cvc_req.cpp:38
ECDSA_Signature m_sig
Definition eac_obj.h:36
void init(DataSource &in)
Definition eac_obj.h:38
SecureVector< byte > get_concat_sig() const
Definition eac_obj.h:27
SecureVector< byte > tbs_bits
Definition signed_obj.h:86
AlgorithmIdentifier sig_algo
Definition signed_obj.h:85
SecureVector< byte > sign_message(const byte in[], size_t length, RandomNumberGenerator &rng)
Definition pubkey.cpp:160
void write(const byte in[], size_t length)
Definition pipe_rw.cpp:34
std::invalid_argument Invalid_Argument
Definition exceptn.h:20
ASN1_Tag
Definition asn1_int.h:19
@ APPLICATION
Definition asn1_int.h:21
@ OCTET_STRING
Definition asn1_int.h:31
ECDSA_Signature decode_concatenation(const MemoryRegion< byte > &concat)
Definition ecdsa_sig.cpp:46