obu-firmware builds against vanetza-idf from microbu-esp32c5/external, but that tree was gitignored, so a clone of this repository could not build the firmware it ships. It is now committed here as ordinary files in its own folder, microbu-esp32c5/: the colleague's commit cf4b99f plus the V2X2MAP bridge's signature verification (--trust) used on the bench. Nothing is fetched from or pushed to the colleague's repository; this repository and its remotes carry everything. The folder's own .gitignore keeps build output, downloaded components and private key material out, as it did there; the committed file set is identical to that repository's tracked files. The ESP32-C5 is still flashed from obu-firmware/, which only takes vanetza-idf from microbu-esp32c5/, so the two stay separate folders. FLASHING.md says how to take a newer version of the colleague's tree (copy it over the folder, rebuild, test, commit).
135 lines
5.9 KiB
C++
135 lines
5.9 KiB
C++
#include <gtest/gtest.h>
|
|
#include <vanetza/security/v2/secured_message.hpp>
|
|
#include <vanetza/security/v2/tests/check_secured_message.hpp>
|
|
#include <vanetza/security/v2/tests/check_signature.hpp>
|
|
#include <vanetza/security/tests/serialization.hpp>
|
|
|
|
using namespace vanetza;
|
|
using namespace vanetza::security;
|
|
|
|
// Note: WebValidator refers to https://werkzeug.dcaiti.tu-berlin.de/etsi/ts103097/
|
|
|
|
TEST(SecuredMessage, Serialization)
|
|
{
|
|
v2::SecuredMessage m;
|
|
|
|
m.header_fields.push_back(v2::Time64 { 0x4711 });
|
|
m.payload = { v2::PayloadType::Unsecured, CohesivePacket({ 5, 10, 15, 25, 40 }, OsiLayer::Application) };
|
|
std::list<v2::TrailerField> list;
|
|
list.push_back(v2::Signature { create_random_ecdsa_signature(44) });
|
|
list.push_back(v2::Signature { create_random_ecdsa_signature(45) });
|
|
m.trailer_fields = list;
|
|
|
|
check(m, serialize_roundtrip(m));
|
|
}
|
|
|
|
TEST(SecuredMessage, header_field_extractor)
|
|
{
|
|
v2::SecuredMessage m;
|
|
auto empty = m.header_field(v2::HeaderFieldType::Generation_Time);
|
|
EXPECT_FALSE(empty);
|
|
|
|
m.header_fields.push_back(v2::Time64 { 25 });
|
|
m.header_fields.push_back(v2::IntX { 23 });
|
|
|
|
auto time = m.header_field(v2::HeaderFieldType::Generation_Time);
|
|
ASSERT_TRUE(time);
|
|
EXPECT_EQ(25, boost::get<v2::Time64>(*time));
|
|
|
|
auto msg = m.header_field(v2::HeaderFieldType::Its_Aid);
|
|
ASSERT_TRUE(msg);
|
|
EXPECT_EQ(23, boost::get<v2::IntX>(*msg).get());
|
|
|
|
// field modifications should pass through
|
|
boost::get<v2::Time64>(*time) = 26;
|
|
auto time2 = m.header_field(v2::HeaderFieldType::Generation_Time);
|
|
ASSERT_TRUE(time2);
|
|
EXPECT_EQ(v2::Time64 { 26 }, boost::get<v2::Time64>(*time2));
|
|
}
|
|
|
|
TEST(SecuredMessage, trailer_field_extractor)
|
|
{
|
|
v2::SecuredMessage m;
|
|
auto empty = m.trailer_field(v2::TrailerFieldType::Signature);
|
|
EXPECT_FALSE(!!empty);
|
|
|
|
m.trailer_fields.push_back(v2::Signature {});
|
|
m.trailer_fields.push_back(v2::Signature {});
|
|
auto first = m.trailer_field(v2::TrailerFieldType::Signature);
|
|
ASSERT_TRUE(!!first);
|
|
EXPECT_EQ(&m.trailer_fields.front(), first);
|
|
}
|
|
|
|
TEST(SecuredMessage, WebValidator_Serialize_SecuredMessageV2_1)
|
|
{
|
|
// SecuredMessage/v1 from FOKUS WebValidator adapted for v2
|
|
const char str[] =
|
|
"02810180020201A8ED6DF65B0E6D6A0100809400000418929DB6A9E452223062C52028E956BF98"
|
|
"74E0A40D21D5F9F56564F39C5DD187C922F2E5F0630373879A43393373B9F6205BF01FBD9C1F1131"
|
|
"65C291C376F535010004EABA91A915D81807E910FD292D99DF8B401EED88CF7F031412D5ED9905F9"
|
|
"996469798C412FC8F7237A3AB3469795E2DEF5E1B783EA4F6B6A2359D21772B2EA9D0200210AC040"
|
|
"800101C0408101010F01099EB20109B1270003040100960000004B2E6D0D0EE9BC4AD9CD087B601E"
|
|
"9AF06031995443D652763455FBB794B33982889260740EF64CFA8C6808A58F98E06CE42A1E9C22A0"
|
|
"785D7242647F7895ABFC0000009373931CD7580502011C983E690E5F6D755BD4871578A9427E7B"
|
|
"C383903DC7DA3B560384013643010000FE8566BEA87B39E6411F80226E792D6E01E77B598F2BB1FC"
|
|
"E7F2DD441185C07CEF0573FBFB9876B99FE811486F6F5D499E6114FC0724A67F8D71D2A897A7EB34";
|
|
v2::SecuredMessage m;
|
|
deserialize_from_hexstring(str, m);
|
|
|
|
EXPECT_EQ(358, get_size(m));
|
|
EXPECT_EQ(2, m.protocol_version());
|
|
|
|
EXPECT_EQ(3, m.header_fields.size());
|
|
auto signer_info = m.header_field(v2::HeaderFieldType::Signer_Info);
|
|
ASSERT_TRUE(!!signer_info);
|
|
auto generation_time = m.header_field(v2::HeaderFieldType::Generation_Time);
|
|
ASSERT_TRUE(!!generation_time);
|
|
auto its_aid = m.header_field(v2::HeaderFieldType::Its_Aid);
|
|
ASSERT_TRUE(!!its_aid);
|
|
EXPECT_EQ(v2::IntX {2}, boost::get<v2::IntX>(*its_aid));
|
|
|
|
EXPECT_EQ(v2::PayloadType::Signed, m.payload.type);
|
|
EXPECT_EQ(28, size(m.payload.data, min_osi_layer(), max_osi_layer()));
|
|
|
|
EXPECT_EQ(1, m.trailer_fields.size());
|
|
EXPECT_TRUE(!!m.trailer_field(v2::TrailerFieldType::Signature));
|
|
}
|
|
|
|
TEST(SecuredMessage, WebValidator_Serialize_SecuredMessageV2_2)
|
|
{
|
|
// SecuredMessage/v1 from FOKUS WebValidator adapted for v2
|
|
const char str[] =
|
|
"02810180020201A8ED6DF65B0E6D6A01008094000004C4EC137145DD4F450145DE530CCA36E73A"
|
|
"B3D87FC8275847CDAD8248C1CD20879BD6A8CB54EA9E05D3B41376CE2F24789AEF82836CA818D568"
|
|
"ADF4A140E96E48010004D6C268EE68B5B8B387B2312B7E1D21CE0C366D251A32431508B96EB6A347"
|
|
"9CCF96A8738F30ED451F00DA8DDE84367C7EB16727D14FF14F5DD8F9791FE0A12A640200210AC040"
|
|
"800101C0408101010F01099EB20109B1270003040100960000001EB035FE8E51DCDD8558DE0BE9B8"
|
|
"7895B36B420583A5C6B2B8B2EAB7F3D3C99163638FA025A0033D4BD80BBA02B8E3DE1B55766459D4"
|
|
"94677AF24917E51B80AC0000009373CC5F22C805020120F29384759027349075829034707ABABA"
|
|
"BABABAABAB98437985739845783974954301000081E7CDB6D2C741C1700822305C39E8E809622AF9"
|
|
"FCA1C0786F762D08E80580C42F1FCC1D5499577210834C390BB4613E102DECB14F575A2820743DC9"
|
|
"A66BBD7A";
|
|
v2::SecuredMessage m;
|
|
deserialize_from_hexstring(str, m);
|
|
check(m, serialize_roundtrip(m));
|
|
}
|
|
|
|
TEST(SecuredMessage, WebValidator_Serialize_SecuredMessageV2_3)
|
|
{
|
|
// SecuredMessage/v1 from FOKUS WebValidator adapted for v2
|
|
const char str[] =
|
|
"02810180020201A8ED6DF65B0E6D6A010080940000040209B0434163CCBAFDD34A45333E418FB9"
|
|
"6C05BBE0E7E1D755D40D0B4BBE8DA508EC2F2723B7ADF0F27C39F3AECFF0783C196F9961F8821E62"
|
|
"94375D9294CD6A01000452113CE698DB081491675DF8FFE81C23EA5D0071B2D2BF0E0DA4ADA0CDA5"
|
|
"8259CA5D999200B6565E194EDAB8BD3DCA863F2DDF39C13E7A0375ECE2566C5EB8C60200210AC040"
|
|
"800101C0408101010F01099EB20109B1270003040100960000008DA1F3F9F35E04C3DE77D7438988"
|
|
"A8D57EBE44DAA021A4269E297C177C9CFE458E128EC290785D6631961625020943B6D87DAA54919A"
|
|
"98F7865709929A7C6E480000009373CF482D40050201080123456789ABCDEF43010000371423BB"
|
|
"A0902D8AF2FB2226D73A7781D4D6B6772650A8BEE5A1AF198CEDABA2C9BF57540C629E6A1E629B88"
|
|
"12AEBDDDBCAF472F6586F16C14B3DEFBE9B6ADB2";
|
|
v2::SecuredMessage m;
|
|
deserialize_from_hexstring(str, m);
|
|
check(m, serialize_roundtrip(m));
|
|
}
|
|
|