5 #include <gtest/gtest.h> 10 #include "asn1/asn1_message.h" 11 #include "config/config.h" 12 #include "der_encoder.h" 14 void printStringHex(
const std::string& s) {
16 std::cerr << std::setfill(
'0') << std::setw(2) << std::hex << (((
unsigned int)c) & 0xFF);
20 std::cerr << std::dec << std::endl;
23 std::string CCString(OCTET_STRING_t par) {
return std::string((
const char*)par.buf, (
size_t)par.size); }
24 bool operator==(
const AKTlsConfig& cc_config,
const TlsConfig& config) {
25 if (config.server != CCString(cc_config.server))
return false;
26 if (config.server_url_path.string() != CCString(cc_config.serverUrlPath))
return false;
27 if (static_cast<int>(config.ca_source) != cc_config.caSource)
return false;
28 if (static_cast<int>(config.pkey_source) != cc_config.pkeySource)
return false;
29 if (static_cast<int>(config.cert_source) != cc_config.certSource)
return false;
33 bool operator==(
const TlsConfig& config,
const AKTlsConfig& cc_config) {
return cc_config == config; }
35 TEST(asn1_config, tls_config) {
38 conf.server =
"https://example.com";
39 conf.server_url_path =
"";
40 conf.ca_source = CryptoSource::kFile;
41 conf.pkey_source = CryptoSource::kPkcs11;
42 conf.cert_source = CryptoSource::kPkcs11;
49 EXPECT_NO_THROW(des >> conf2);
50 EXPECT_EQ(
conf.server, conf2.server);
51 EXPECT_EQ(
conf.server_url_path, conf2.server_url_path);
52 EXPECT_EQ(
conf.ca_source, conf2.ca_source);
53 EXPECT_EQ(
conf.pkey_source, conf2.pkey_source);
54 EXPECT_EQ(
conf.cert_source, conf2.cert_source);
57 TEST(asn1_config, tls_config_asn1cc_to_man) {
58 AKTlsConfig_t cc_tls_conf;
59 memset(&cc_tls_conf, 0,
sizeof(cc_tls_conf));
61 std::string server =
"https://example.com";
62 EXPECT_EQ(0, OCTET_STRING_fromBuf(&cc_tls_conf.server, server.c_str(),
static_cast<int>(server.length())));
64 std::string server_url_path =
"";
65 EXPECT_EQ(0, OCTET_STRING_fromBuf(&cc_tls_conf.serverUrlPath, server_url_path.c_str(),
66 static_cast<int>(server_url_path.length())));
68 cc_tls_conf.caSource =
static_cast<int>(CryptoSource::kFile);
69 cc_tls_conf.pkeySource =
static_cast<int>(CryptoSource::kPkcs11);
70 cc_tls_conf.certSource =
static_cast<int>(CryptoSource::kPkcs11);
75 enc = der_encode(&asn_DEF_AKTlsConfig, &cc_tls_conf, Asn1StringAppendCallback, &der);
76 EXPECT_NE(enc.encoded, -1);
80 EXPECT_NO_THROW(des >>
conf);
81 EXPECT_EQ(
conf, cc_tls_conf);
82 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_AKTlsConfig, &cc_tls_conf);
85 TEST(asn1_config, tls_config_man_to_asn1cc) {
88 conf.server =
"https://example.com";
89 conf.server_url_path =
"";
90 conf.ca_source = CryptoSource::kFile;
91 conf.pkey_source = CryptoSource::kPkcs11;
92 conf.cert_source = CryptoSource::kPkcs11;
98 AKTlsConfig_t* cc_tls_conf =
nullptr;
100 ber_decode(0, &asn_DEF_AKTlsConfig, (
void**)&cc_tls_conf, ser.getResult().c_str(), ser.getResult().length());
101 EXPECT_EQ(ret.code, RC_OK);
102 EXPECT_EQ(*cc_tls_conf,
conf);
103 ASN_STRUCT_FREE(asn_DEF_AKTlsConfig, cc_tls_conf);
106 TEST(asn1_common, longstring) {
108 "-----BEGIN PUBLIC KEY-----\ 109 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumdoILJANzcKUn0IZi1B\ 110 OB6jj0uE5XrZPTbUuQT8jsA+rYNet1VF1Y0X8/hftShHzL8M+X9rlEwvnAhzdWKd\ 111 IEQUjfuiJIOLBtAGZZNYdTTXx7sFQ/UQwKo8mU6vSMqsbOdzidp6SpRRiEHpWH4m\ 112 rvurn/jWPAVY2vwD0VxUBl1ps/C4qYGqeRQz7o7SAgV3NPDZLPbKVz9+YH+tkVR+\ 113 FMsH9/YebTpaiL8uQsf24WdeVUc7WCJLzOTvPh+FnNB2y78ye29sIwHpbiivmfrO\ 114 GSdjzMzSMr0UATqOXcaONhPKGNDQ3jhTCayi/lryYBgpRyvSLRpaIlaS0dLtp7Zp\ 116 -----END PUBLIC KEY-----";
119 ser << asn1::implicit<kAsn1OctetString>(in);
123 EXPECT_NO_THROW(des >> asn1::implicit<kAsn1OctetString>(out));
127 TEST(asn1_common, longlongstring) {
129 "-----BEGIN PUBLIC KEY-----\ 130 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumdoILJANzcKUn0IZi1B\ 131 OB6jj0uE5XrZPTbUuQT8jsA+rYNet1VF1Y0X8/hftShHzL8M+X9rlEwvnAhzdWKd\ 132 IEQUjfuiJIOLBtAGZZNYdTTXx7sFQ/UQwKo8mU6vSMqsbOdzidp6SpRRiEHpWH4m\ 133 rvurn/jWPAVY2vwD0VxUBl1ps/C4qYGqeRQz7o7SAgV3NPDZLPbKVz9+YH+tkVR+\ 134 FMsH9/YebTpaiL8uQsf24WdeVUc7WCJLzOTvPh+FnNB2y78ye29sIwHpbiivmfrO\ 135 GSdjzMzSMr0UATqOXcaONhPKGNDQ3jhTCayi/lryYBgpRyvSLRpaIlaS0dLtp7Zp\ 137 -----END PUBLIC KEY-----\ 138 -----BEGIN PUBLIC KEY-----\ 139 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumdoILJANzcKUn0IZi1B\ 140 OB6jj0uE5XrZPTbUuQT8jsA+rYNet1VF1Y0X8/hftShHzL8M+X9rlEwvnAhzdWKd\ 141 IEQUjfuiJIOLBtAGZZNYdTTXx7sFQ/UQwKo8mU6vSMqsbOdzidp6SpRRiEHpWH4m\ 142 rvurn/jWPAVY2vwD0VxUBl1ps/C4qYGqeRQz7o7SAgV3NPDZLPbKVz9+YH+tkVR+\ 143 FMsH9/YebTpaiL8uQsf24WdeVUc7WCJLzOTvPh+FnNB2y78ye29sIwHpbiivmfrO\ 144 GSdjzMzSMr0UATqOXcaONhPKGNDQ3jhTCayi/lryYBgpRyvSLRpaIlaS0dLtp7Zp\ 146 -----END PUBLIC KEY-----\ 147 -----BEGIN PUBLIC KEY-----\ 148 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumdoILJANzcKUn0IZi1B\ 149 OB6jj0uE5XrZPTbUuQT8jsA+rYNet1VF1Y0X8/hftShHzL8M+X9rlEwvnAhzdWKd\ 150 IEQUjfuiJIOLBtAGZZNYdTTXx7sFQ/UQwKo8mU6vSMqsbOdzidp6SpRRiEHpWH4m\ 151 rvurn/jWPAVY2vwD0VxUBl1ps/C4qYGqeRQz7o7SAgV3NPDZLPbKVz9+YH+tkVR+\ 152 FMsH9/YebTpaiL8uQsf24WdeVUc7WCJLzOTvPh+FnNB2y78ye29sIwHpbiivmfrO\ 153 GSdjzMzSMr0UATqOXcaONhPKGNDQ3jhTCayi/lryYBgpRyvSLRpaIlaS0dLtp7Zp\ 155 -----END PUBLIC KEY-----\ 156 -----BEGIN PUBLIC KEY-----\ 157 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAumdoILJANzcKUn0IZi1B\ 158 OB6jj0uE5XrZPTbUuQT8jsA+rYNet1VF1Y0X8/hftShHzL8M+X9rlEwvnAhzdWKd\ 159 IEQUjfuiJIOLBtAGZZNYdTTXx7sFQ/UQwKo8mU6vSMqsbOdzidp6SpRRiEHpWH4m\ 160 rvurn/jWPAVY2vwD0VxUBl1ps/C4qYGqeRQz7o7SAgV3NPDZLPbKVz9+YH+tkVR+\ 161 FMsH9/YebTpaiL8uQsf24WdeVUc7WCJLzOTvPh+FnNB2y78ye29sIwHpbiivmfrO\ 162 GSdjzMzSMr0UATqOXcaONhPKGNDQ3jhTCayi/lryYBgpRyvSLRpaIlaS0dLtp7Zp\ 164 -----END PUBLIC KEY-----";
167 ser << asn1::implicit<kAsn1OctetString>(in);
171 EXPECT_NO_THROW(des >> asn1::implicit<kAsn1OctetString>(out));
175 TEST(asn1_common, Asn1MessageSimple) {
178 original->present(AKIpUptaneMes_PR_discoveryResp);
180 SetString(&req->ecuSerial,
"serial1234");
184 der_encode(&asn_DEF_AKIpUptaneMes, &original->msg_, Asn1StringAppendCallback, &buffer);
186 EXPECT_GT(buffer.size(), 0);
189 asn_codec_ctx_t context;
190 memset(&context, 0,
sizeof(context));
192 AKIpUptaneMes_t* m =
nullptr;
194 ber_decode(&context, &asn_DEF_AKIpUptaneMes, reinterpret_cast<void**>(&m), buffer.c_str(), buffer.size());
198 EXPECT_EQ(res.code, RC_OK);
199 EXPECT_EQ(res.consumed, buffer.size());
202 EXPECT_EQ(msg->present(), AKIpUptaneMes_PR_discoveryResp);
205 EXPECT_EQ(ToString(resp->ecuSerial),
"serial1234");
208 TEST(asn1_common, parse) {
209 std::string
data = Utils::fromBase64(
"rAowCAQGaGVsbG8K");
211 asn_codec_ctx_t context;
212 memset(&context, 0,
sizeof(context));
214 AKIpUptaneMes_t* m =
nullptr;
216 ber_decode(&context, &asn_DEF_AKIpUptaneMes, reinterpret_cast<void**>(&m),
data.c_str(),
data.size());
218 EXPECT_EQ(res.code, RC_OK);
219 EXPECT_EQ(AKIpUptaneMes_PR_sendFirmwareReq, msg->present());
222 TEST(asn1_common, Asn1MessageFromRawNull) {
224 AKIpUptaneMes_t* m =
nullptr;
229 int main(
int argc,
char** argv) {
230 ::testing::InitGoogleTest(&argc, argv);
231 return RUN_ALL_TESTS();
static Asn1Message::Ptr FromRaw(AKIpUptaneMes_t **msg)
Destructively copy from a raw msg pointer created by parsing an incomming message.
Config conf("tests/config/basic.toml")
static Asn1Message::Ptr Empty()
Create a new Asn1Message, in order to fill it with data and send it.