Newer
Older
module test_LibItsGeoNetworking_TypesAndValues /*language "TTCN-3:2009 Advanced Parameterization"*/ {
import from LibCommon_BasicTypesAndValues all;
import from LibCommon_DataStrings all;
// LibIts
import from ITS_Container language "ASN.1:1997" all;
import from CAM_PDU_Descriptions language "ASN.1:1997"all;
import from DENM_PDU_Descriptions language "ASN.1:1997" all;
// LibItsCommon
import from LibItsCommon_TypesAndValues all;
import from LibItsCommon_Functions all;
// LibItsExternal
import from LibItsExternal_TypesAndValues all;
// LibItsCam
import from LibItsCam_TypesAndValues all;
import from LibItsCam_TestSystem all;
import from LibItsCam_Templates all;
// LibItsDenm
import from LibItsDenm_Templates all;
import from LibItsDenm_TestSystem all;
// LibItsSecurity
import from LibItsSecurity_TypesAndValues all;
import from LibItsSecurity_TestSystem all;
import from LibItsSecurity_Templates all;
import from LibItsSecurity_Functions all;
import from LibItsSecurity_Pixits all;
// LibItsGeoNetworking
import from LibItsGeoNetworking_TypesAndValues all;
import from LibItsGeoNetworking_Templates all;
import from LibItsGeoNetworking_Functions all;
import from LibItsGeoNetworking_TestSystem all;
import from LibItsGeoNetworking_Pixits all;
import from LibItsGeoNetworking_Pics all;
// AtsSecurity
import from AtsSecurity_Functions all;
// import from LibItsIpv6OverGeoNetworking_TypesAndValues all;
// import from LibItsIpv6OverGeoNetworking_Templates all;
// import from LibItsExternal_TypesAndValues all;
import from test_CommonCodec all;
import from test_LibItsBtp_TypesAndValues {
template all
};
group LibItsGeoNetworking_testCases {
group LibItsGeoNetworking_DummyTemplates {
/**
* @desc Dummy template for GN_Address
*/
template (value) GN_Address m_dummyGnAddrIut := {
typeOfAddress := e_manual,
stationType := e_roadSideUnit,
stationCountryCode := 33,
mid := 'a4fedecabeef'O
}
/**
* @desc Dummy template for long position vector
*/
template (value) LongPosVector m_dummyLongPosVectorIut := {
gnAddr := m_dummyGnAddrIut,
latitude := 4856,
longitude := 675,
pai := '1'B,
speed := 55,
heading := 9876
template (value) GN_Address m_dummyGnAddrNodeA := {
typeOfAddress := e_manual,
stationType := e_pedestrian,
stationCountryCode := 49,
mid := 'a4fdea5ea5ed'O
template (value) GN_Address m_dummyGnAddrNodeB := {
typeOfAddress := e_manual,
stationType := e_specialVehicle,
stationCountryCode := 50,
mid := 'a40102030405'O
template (value) GN_Address m_dummyGnAddrNodeC := {
typeOfAddress := e_manual,
stationType := e_moped,
stationCountryCode := 42,
mid := 'deadbabebeef'O
template (value) LongPosVector m_dummyLongPosVectorNodeA := {
gnAddr := m_dummyGnAddrNodeA,
latitude := 265,
longitude := 789,
pai := '0'B,
speed := 80,
heading := 548
template (value) LongPosVector m_dummyLongPosVectorNodeB := {
gnAddr := m_dummyGnAddrNodeB,
latitude := 126,
longitude := 123,
pai := '0'B,
speed := 45,
heading := 125
template (value) LongPosVector m_dummyLongPosVectorNodeC := {
gnAddr := m_dummyGnAddrNodeC,
latitude := 23754,
longitude := 49645,
pai := '0'B,
speed := 110,
heading := 23
template (value) Area m_dummyArea1 := {
geoAreaPosLatitude := 298376,
geoAreaPosLongitude := 32745,
distanceA := 1234,
template (value) Area m_dummyArea2 := {
geoAreaPosLatitude := 873548,
geoAreaPosLongitude := 2837,
distanceA := 8765,
distanceB := 4321,
angle := 4567
template (value) GeoBroadcastArea m_dummyGeoBroadcastArea1 := {
geoBroadcastSubType := e_geoBroadcastRect,
geoBroadcastArea := m_dummyArea1
template (value) GeoBroadcastArea m_dummyGeoBroadcastArea2 := {
geoBroadcastSubType := e_geoBroadcastElip,
geoBroadcastArea := m_dummyArea2
template (value) GeoAnycastArea m_dummyGeoAnycastArea1 := {
geoAnycastSubType := e_geoAnycastCircle,
geoAnycastArea := m_dummyArea1
}
template (value) GeoAnycastArea m_dummyGeoAnycastArea2 := {
geoAnycastSubType := e_geoAnycastRect,
geoAnycastArea := m_dummyArea2
}
* @desc Send template for GeoUnicast header
* @param p_sourceLongPosVec Long position vector of source
* @param p_destinationLongPosVec Long position vector of destination
* @param p_senderLongPosVec Long position vector of sender
* @param p_seqNumber Sequence number of GeoUnicast packet
template (value) ExtendedHeader m_geoUnicastHeaderBtp(
in template (value) LongPosVector p_sourceLongPosVec,
in template (value) ShortPosVector p_dstPosVector,
in template (value) UInt16 p_seqNumber
) := {
geoUnicastHeader := {
seqNumber := p_seqNumber,
reserved := c_uInt8Zero,
srcPosVector := p_sourceLongPosVec,
dstPosVector := p_dstPosVector
}
} // End of group LibItsGeoNetworking_DummyTemplates
group camTemplates {
template (value) CAM m_camMsg(
StationID p_stationId,
GenerationDeltaTime p_generationTime
) := {
header := {
protocolVersion := 1,
messageID := 2,
stationID := p_stationId
},
cam := {
generationDeltaTime := p_generationTime,
camParameters := {
basicContainer := {
stationType := StationType_passengerCar_,
referencePosition := {
latitude := f_integer2Latitude(f_getTsLatitude()),
longitude := f_integer2Longitude(f_getTsLongitude()),
positionConfidenceEllipse := {
semiMajorConfidence := SemiAxisLength_oneCentimeter_,
semiMinorConfidence := SemiAxisLength_oneCentimeter_,
semiMajorOrientation := HeadingValue_wgs84North_
altitudeValue := AltitudeValue_referenceEllipsoidSurface_,
altitudeConfidence := unavailable
}
}
},
highFrequencyContainer := {
basicVehicleContainerHighFrequency := {
heading := {
headingValue := HeadingValue_wgs84North_, //0
headingConfidence := 10
},
speed := {
speedValue := 45,
speedConfidence := 5
},
driveDirection := forward,
vehicleLength := {
vehicleLengthValue := 50,
vehicleLengthConfidenceIndication := noTrailerPresent
},
vehicleWidth := 21,
longitudinalAcceleration := {
longitudinalAccelerationValue := LongitudinalAccelerationValue_unavailable_,
longitudinalAccelerationConfidence := AccelerationConfidence_unavailable_
curvatureValue := CurvatureValue_straight_,
curvatureConfidence := unavailable
},
curvatureCalculationMode := yawRateUsed,
yawRate := {
yawRateValue := YawRateValue_straight_,
yawRateConfidence := unavailable
},
accelerationControl := omit,
lanePosition := omit,
steeringWheelAngle := omit,
lateralAcceleration := omit,
verticalAcceleration := omit,
performanceClass := omit,
cenDsrcTollingZone := omit
}
},
lowFrequencyContainer := omit,
specialVehicleContainer := omit
}
}
};
} // End of group camTemplates
group testAcPrimitives {
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
// /**
// *
// * @desc validate StartBeaconing primitive
// * @verdict Pass on success, Fail otherwise
// */
// testcase tc_startBeaconing() runs on TCType system TCType {
// test_PDU<AcGnPrimitive>(
// m_startBeaconing(
// m_beaconHeader(m_dummyLongPosVectorIut).beaconHeader),
// true,
// oct2bit('010027050024001000000000000a9421a4fedecabeef0001e240000012f8000002a300372694020e6248'O) // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump
// );
// }
//
// /**
// *
// * @desc validate StartBeaconing primitive for roadside equipment
// * @verdict Pass on success, Fail otherwise
// */
// testcase tc_startBeaconingRoadside() runs on TCType system TCType {
// test_PDU<AcGnPrimitive>(
// m_startBeaconingRoadSide,
// true,
// oct2bit('010027050024001000000000000a4c00deadbeef00030000000017d75cf005f5e10003e8000000140000'O) // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump
// );
// }
// testcase tc_startBeaconingRoadside_NEC() runs on TCType system TCType {
// test_PDU<AcGnPrimitive>(
// m_startBeaconingRoadSide_NEC,
// true,
// oct2bit('010027050024101000000000000a4c00deadbeef0002c90c152800004e20000000000000000000000000'O) // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump
// );
// }
// testcase tc_startBeaconingRoadside_NEC_1() runs on TCType system TCType {
// test_PDU<AcGnPrimitive>(
// m_startBeaconingRoadSide_NEC_1,
// true,
// oct2bit('010027050024101000000000000a4c00deadbeef0003c926268affffd8f0000000000000000000000000'O) // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump
// );
// }
//
// /**
// * @desc validate StartPassBeaconing primitive
// * @verdict Pass on success, Fail otherwise
// */
// testcase tc_startPassBeaconing() runs on TCType system TCType {
// test_PDU<AcGnPrimitive>(
// m_startPassBeaconing(
// m_beaconHeader(m_dummyLongPosVectorIut).beaconHeader),
// true,
// oct2bit('010027070024001000000000000a9421a4fedecabeef0001e240000012f8000002a300372694020e6248'O) // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump
// );
// }
//
// /**
// * @desc validate StartBeaconingMultipleNeighbour primitive
// * @verdict Pass on success, Fail otherwise
// */
// testcase tc_startBeaconingMultipleNeighbour() runs on TCType system TCType {
// test_PDU<AcGnPrimitive>(
// m_startBeaconingMultipleNeighbour(
// m_beaconHeader(m_dummyLongPosVectorIut).beaconHeader,
// 3),
// true,
// oct2bit('01002b090028001000000000000a9421a4fedecabeef0001e240000012f8000002a300372694020e624800000003'O) // Check for 'LibItsGeoNetworking_TypesAndValues.encode:' output in codec traces to get the dump
// );
// }
//
/**
* @desc validate StopBeaconing primitive
* @verdict Pass on success, Fail otherwise
*/
testcase tc_stopBeaconing() runs on TCType system TCType {
test_PDU<AcGnPrimitive>(m_stopBeaconing, true, oct2bit('0001'O));
}
/**
* @desc validate StopPassBeaconing primitive
* @verdict Pass on success, Fail otherwise
*/
testcase tc_stopPassBeaconing() runs on TCType system TCType {
test_PDU<AcGnPrimitive>(m_stopPassBeaconing, true, oct2bit('0003'O));
}
/**
* @desc validate StopBeaconingMultipleNeighbour
* @verdict Pass on success, Fail otherwise
*/
testcase tc_stopBeaconingMultipleNeighbour() runs on TCType system TCType {
test_PDU<AcGnPrimitive>(m_stopBeaconingMultipleNeighbour, true, oct2bit('0005'O));
}
/**
* @desc validate AcGetLongPosVector
* @verdict Pass on success, Fail otherwise
*/
testcase tc_getLongPosVector() runs on TCType system TCType {
test_PDU<AcGnPrimitive>(m_getLongPosVector(m_dummyGnAddrIut), true, oct2bit('0006BC21A4FEDECABEEF'O)); // Check log for TC_GEONW_FDV_COH_BV_01 TC to retrieve the frame
// /**
// * @desc validate AcGnResponse
// * @verdict Pass on success, Fail otherwise
// */
// testcase tc_longPosVector() runs on TCType system TCType {
// test_decodePDU<AcGnResponse>(mw_getLongPosVectorAny(m_dummyGnAddrIut), '0300270c00249421a4fedecabeef000030aa000030aa000030aa000030aa000030aa000030aa000030aa'O); // Check log for TC_GEONW_FDV_COH_BV_01 TC to retrieve the frame
// }
//
// /**
// * @desc validate AcGnResponse with a NULL LongPosVector
// * @verdict Pass on success, Fail otherwise
// */
// testcase tc_longPosVectorWithNullLongPosVector() runs on TCType system TCType {
// test_decodePDU<AcGnResponse>(mw_getLongPosVectorAny(m_dummyGnAddrIut), '03000b0c00088400000000000001FFFFFFFFFFFF'O); // Check log for TC_GEONW_PON_LPV_BV_01 TC to retrieve the frame
// }
//
* @desc validate AcEnableSecurity
* @verdict Pass on success, Fail otherwise
*/
testcase tc_enableSecurity() runs on TCType system TCType {
if (f_loadCertificates("dummy") == true) {
setverdict(fail);
stop;
}
// Setup certificates memory cache
if (f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) == false) {
setverdict(fail);
stop;
}
f_setGenerationLocation(
f_getTsLatitude(),
f_getTsLongitude()
);
* @desc validate AcDisableSecurity
* @verdict Pass on success, Fail otherwise
*/
testcase tc_disableSecurity() runs on TCType system TCType {
group testDeviceSigning {
* @desc This function build and sign the SecureMessage part covered by the signature process
* @param p_securedMessage The signed SecureMessage part
* @param p_unsecuredPayload The unsigned payload (e.g. a beacon)
* @param p_threeDLocation The ThreeDLocation value
* @param p_headerFileds Additional HeaderFields
* @return true on success, false otherwise
* @verdict Unchanged
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
function f_buildGnSecuredOtherMessageWithDeviceCertificate(
out template (value) SecuredMessage p_securedMessage,
in octetstring p_signedPayload,
in ThreeDLocation p_threeDLocation,
in template (value) Certificate p_deviceCertificate,
in Oct32 p_devicePrivateKey,
in template (omit) HeaderFields p_hearderFields := omit
) return boolean {
// Local variables
var octetstring v_secPayload, v_signature;
var Oct32 v_hash;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
// Create SecuredMessage payload to be signed
v_toBeSignedSecuredMessage := m_toBeSignedSecuredMessage(
{ // Field HeaderFields
m_header_field_signer_info(
m_signerInfo_certificate(
p_deviceCertificate
) // End of template m_signerInfo_certificate
), // End of template m_header_field_signer_info
m_header_field_generation_time(1000 * f_getCurrentTime()), // In us
m_header_field_generation_location(
p_threeDLocation
)
}, // End of field HeaderFields
m_payload_signed(
p_signedPayload
),
e_signature
);
v_secPayload := bit2oct(encvalue(v_toBeSignedSecuredMessage));
log("f_buildGnSecuredOtherMessageWithDeviceCertificate:ithDeviceCertificate v_toBeSignedSecuredMessage: ", v_secPayload);
// FIXME BUG Framework already compute the hash
// // Calculate the hash of the SecuredMessage payload to be signed
// v_hash := f_hashWithSha256(v_secPayload);
// log("f_buildGnSecuredOtherMessageWithDeviceCertificate: v_hash: ", v_hash);
// Signed payload
v_signature := fx_signWithEcdsaNistp256WithSha256(
p_devicePrivateKey
);
log("f_buildGnSecuredOtherMessageWithDeviceCertificate: v_signature: ", v_signature);
p_securedMessage := m_securedMessage( // See Clause 7.3 Generic security profile for other signed messages
v_toBeSignedSecuredMessage.header_fields,
v_toBeSignedSecuredMessage.payload_field,
{
m_trailer_field_signature(
m_signature(
m_ecdsaSignature(
m_eccPointecdsa_nistp256_with_sha256_y_coordinate_only(
substr(v_signature, 2, 32)
),
substr(v_signature, 34, 32)
)
)
)
}
); // End of template md_securedMessage_profileOther
return true;
} // End of function f_buildGnSecuredOtherMessageWithDeviceCertificate
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
testcase tc_checkDeviceSignature_01() runs on TCType system TCType {
// Local variables
var GnNonSecuredPacket v_gnNonSecuredPacket;
var octetstring v_gnPayload;
var template (value) SecuredMessage v_securedMessage;
var Certificate v_aaCertificate, v_atCertificate;
var HeaderFields v_mandatoryHeaders := {};
var HeaderField v_signerInfo;
var template (value) SecPayload p_payloadField := m_payload_signed(v_gnPayload);
var template (omit) SignerInfoType p_signerInfoType := e_certificate;
var template (omit) HeaderFields p_headerFields := {
m_header_field_generation_time(1000 * f_getCurrentTime()), // In us
m_header_field_its_aid_CAM
};
var template (omit) charstring p_certificateName := cc_taCert_EC;
var boolean p_addMissingHeaders := true;
f_loadCertificates(PX_IUT_SEC_CONFIG_NAME);
// Build signed SecuredMessage
v_gnNonSecuredPacket := m_geoNwShbPacket(
m_dummyLongPosVectorIut
);
// Add CAM payload
v_gnNonSecuredPacket.payload := valueof(
f_adaptPayload_m(
bit2oct(
encvalue(
m_camReq(
m_camMsg_vehicle_HF_BV(
f_getTsStationId(),
f_getCurrentTime() mod 65536, // See ETSI EN 302 637-2 V1.3.0 - Clause B.3 generationDelatTime
LibItsCam_Templates.m_tsPosition
))))));
log("v_gnNonSecuredPacket=", v_gnNonSecuredPacket);
// Encode it
v_gnPayload := bit2oct(
encvalue(
v_gnNonSecuredPacket
)
);
log("v_gnPayload=", v_gnPayload);
// Load certificates if required
if (f_prepareCertificates(p_certificateName, v_aaCertificate, v_atCertificate) == false) {
setverdict(fail);
stop;
}
log("v_aaCertificate=", v_aaCertificate);
log("v_atCertificate=", v_atCertificate);
if (p_addMissingHeaders == true) {
// Prepare mandatory headers
if (valueof(p_signerInfoType) == e_certificate) { // Add the AT certificate
v_signerInfo := valueof(
m_header_field_signer_info(
m_signerInfo_certificate(
v_atCertificate
)));
}
if (valueof(p_signerInfoType) == e_certificate_chain) { // Add the AT certificate + AA Certificate
v_signerInfo := valueof(
m_header_field_signer_info(
m_signerInfo_certificates(
{
v_aaCertificate,
v_atCertificate
}
)
));
}
if (valueof(p_signerInfoType) == e_certificate_digest_with_sha256) { // Add the AT certificate digest
v_signerInfo := valueof(
m_header_field_signer_info(
m_signerInfo_digest(
f_calculateDigestFromCertificate(v_atCertificate)
)));
}
v_mandatoryHeaders := {
v_signerInfo,
valueof(m_header_field_generation_time(1000 * f_getCurrentTime())), // In us
valueof(m_header_field_its_aid(c_its_aid_CAM))
}
}
log("v_mandatoryHeaders=", v_mandatoryHeaders);
log("v_securedMessage=", v_securedMessage);
setverdict(pass);
}
testcase tc_checkDeviceSignature_02() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_gnPayload, v_encMsg;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
var template (value) SecuredMessage v_securedMessageBeacon;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
stop;
}
f_loadCertificates(PX_IUT_SEC_CONFIG_NAME);
// Build signed SecuredMessage
v_gnPayload := bit2oct( // Create GN payload
encvalue(
m_geoNwBeaconPacket( // Non secured GN beacon
m_dummyLongPosVectorIut
)
)
);
log("v_securedMessageBeacon= ", v_securedMessageBeacon);
log("vc_atCertificate= ", vc_atCertificate);
log("vc_signingPrivateKey= ", vc_signingPrivateKey);
f_buildGnSecuredOtherMessageWithDeviceCertificate(
v_securedMessageBeacon,
v_gnPayload,
m_threeDLocation(
1234,
5678,
'002F'O
),
vc_atCertificate,
vc_signingPrivateKey
// Build secured Gn packet
v_gnReq := m_geoNwReq_linkLayerBroadcast(
m_geoNwSecPdu(
m_geoNwBeaconPacket(
m_dummyLongPosVectorIut
),
v_securedMessageBeacon
) // End of template m_geoNwBeaconPacket
); // End of template m_geoNwReq_linkLayerBroadcast
// Encode it
v_encMsg := bit2oct(encvalue(v_gnReq));
if (not isbound(v_encMsg)) {
setverdict(fail, "Encoding failed!");
stop;
}
log("Secured beacon: ", v_encMsg);
setverdict(pass, "Encoding passed.");
// Decode it
if (decvalue(oct2bit(v_encMsg), v_gnReq) == 0) {
if (f_verifyGnSecuredMessageSignatureWithCertificate(v_securedMessageBeacon, vc_atCertificate) == true) {
setverdict(pass, "Signature check succeed.");
} else {
setverdict(fail, "Signature check failed.");
}
} else {
setverdict(fail, "Decoding failed.");
}
} // End of group testSecurityFunctions
group testGeoNetPrimitiveMessages {
* @desc validate GeoNetworkingReq/Beacon
* @verdict Pass on success, Fail otherwise
*/
testcase tc_GeoNetReq_Beacon() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_buffer := '01002B0A0010800000000100BC21A4FEDECABEEF0001E240000012F8000002A380372694FFFFFFFFFFFF'O;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
stop;
}
v_gnReq := m_geoNwReq_linkLayerBroadcast(
m_geoNwPdu(
m_geoNwBeaconPacket(
m_dummyLongPosVectorIut
)));
v_gnReq,
true,
oct2bit(v_buffer)
* @desc validate secured GeoNetworkingReq/Beacon with certificate digest in header fields
* @verdict Pass on success, Fail otherwise
*/
testcase tc_GeoNetReq_SecuredBeacon_digest() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_gnPayload, v_encMsg;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
var template (value) SecuredMessage v_securedMessageBeacon;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
stop;
}
// Load certificates & keys
if (f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) == false) {
setverdict(fail);
stop;
}
f_setGenerationLocation(
f_getTsLatitude(),
f_getTsLongitude()
);
// Build signed SecuredMessage
v_gnPayload := bit2oct( // Create GN payload
encvalue(
m_geoNwBeaconPacket( // Non secured GN beacon
m_dummyLongPosVectorIut
)
);
f_buildGnSecuredOtherMessage(
v_securedMessageBeacon,
m_payload_signed(v_gnPayload),
e_certificate_digest_with_sha256,
m_threeDLocation(
1234,
5678,
'002F'O
)
// Build secured Gn packet
v_gnReq := m_geoNwReq_linkLayerBroadcast(
m_geoNwSecPdu(
m_geoNwBeaconPacket(
m_dummyLongPosVectorIut
),
v_securedMessageBeacon
) // End of template m_geoNwBeaconPacket
); // End of template m_geoNwReq_linkLayerBroadcast
// Encode it
v_encMsg := bit2oct(encvalue(v_gnReq));
if (not isbound(v_encMsg)) {
setverdict(fail, "Encoding failed!");
log("Secured beacon: ", v_encMsg);
setverdict(pass, "Encoding passed.");
// Decode it
if (decvalue(oct2bit(v_encMsg), v_gnReq) == 0) {
if (f_verifyGnSecuredMessageSignatureWithCertificate(v_gnReq.msgOut.gnPacket.securedMsg, vc_atCertificate) == true) {
setverdict(pass, "Signature check succeed.");
} else {
setverdict(fail, "Signature check failed.");
}
} else {
setverdict(fail, "Decoding failed.");
}
* @desc validate secured GeoNetworkingReq/Beacon with certificate in header fields
* @verdict Pass on success, Fail otherwise
*/
testcase tc_GeoNetReq_SecuredBeacon_certificate() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_gnPayload, v_encMsg;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
var template (value) SecuredMessage v_securedMessageBeacon;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
stop;
}
// Load certificates & keys
if (f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) == false) {
setverdict(fail);
stop;
}
f_setGenerationLocation(
f_getTsLatitude(),
f_getTsLongitude()
);
// Build signed SecuredMessage
v_gnPayload := bit2oct( // Create GN payload
encvalue(
m_geoNwBeaconPacket( // Non secured GN beacon
m_dummyLongPosVectorIut
)
);
f_buildGnSecuredOtherMessage(
v_securedMessageBeacon,
m_payload_signed(v_gnPayload),
e_certificate,
m_threeDLocation(
1234,
5678,
'002F'O
)
// Build secured Gn packet
v_gnReq := m_geoNwReq_linkLayerBroadcast(
m_geoNwSecPdu(
m_geoNwBeaconPacket(
m_dummyLongPosVectorIut
),
v_securedMessageBeacon
) // End of template m_geoNwBeaconPacket
); // End of template m_geoNwReq_linkLayerBroadcast
// Encode it
v_encMsg := bit2oct(encvalue(v_gnReq));
if (not isbound(v_encMsg)) {
setverdict(fail, "Encoding failed!");
log("Secured beacon: ", v_encMsg);
setverdict(pass, "Encoding passed.");
// Decode it
if (decvalue(oct2bit(v_encMsg), v_gnReq) == 0) {
if (f_verifyGnSecuredMessageSignatureWithCertificate(v_gnReq.msgOut.gnPacket.securedMsg, vc_atCertificate) == true) {
setverdict(pass, "Signature check succeed.");
} else {
setverdict(fail, "Signature check failed.");
}
} else {
setverdict(fail, "Decoding failed.");
* @desc validate secured GeoNetworkingReq/Beacon
* @verdict Pass on success, Fail otherwise
*/
testcase tc_GeoNetReq_SecuredBeacon_WithAdditionalHeaders() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_gnPayload, v_encMsg;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
var template (value) SecuredMessage v_securedMessageBeacon;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
// Load certificates & keys
if (f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) == false) {
setverdict(fail);
stop;
}
f_setGenerationLocation(
f_getTsLatitude(),
f_getTsLongitude()
);
log("vc_signingPrivateKey=", vc_signingPrivateKey);
log("vc_encryptPrivateKey=", vc_encryptPrivateKey);
log("vc_aaCertificate=", vc_aaCertificate);
log("vc_atCertificate=", vc_atCertificate);
// Build signed SecuredMessage
v_gnPayload := bit2oct( // Create GN payload
encvalue(
m_geoNwBeaconPacket( // Non secured GN beacon
m_dummyLongPosVectorIut
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
f_buildGnSecuredOtherMessage(
v_securedMessageBeacon,
m_payload_signed(v_gnPayload),
e_certificate_digest_with_sha256,
m_threeDLocation(
1234,
5678,
'002F'O
),
{
{
type_ := e_request_unrecognized_certificate,
headerField := {
digests := { '00CAFE'O }
}
}
}
);
log("v_securedMessageBeacon= ", v_securedMessageBeacon);
// Build secured Gn packet
v_gnReq := m_geoNwReq_linkLayerBroadcast(
m_geoNwSecPdu(
m_geoNwBeaconPacket(
m_dummyLongPosVectorIut
),
v_securedMessageBeacon
) // End of template m_geoNwBeaconPacket
); // End of template m_geoNwReq_linkLayerBroadcast
// Encode it
v_encMsg := bit2oct(encvalue(v_gnReq));
if (not isbound(v_encMsg)) {
setverdict(fail, "Encoding failed!");
log("Secured beacon: ", v_encMsg);
setverdict(pass, "Encoding passed.");
// Decode it
test_decodePDU<GeoNetworkingReq>(
v_gnReq,
v_encMsg
);
if (decvalue(oct2bit(v_encMsg), v_gnReq) == 0) {
if (f_verifyGnSecuredMessageSignatureWithCertificate(v_gnReq.msgOut.gnPacket.securedMsg, vc_atCertificate) == true) {
setverdict(pass, "Signature check succeed.");
} else {
setverdict(fail, "Signature check failed.");
}
} else {
setverdict(fail, "Decoding failed.");
}
* @desc validate secured digest GeoNetworkingReq/LsRequest
* @verdict Pass on success, Fail otherwise
*/
testcase tc_GeoNetReq_LsRequestPacket() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_buffer := '01002B0A0060800000000A0030390000BC21A4FEDECABEEF0001E240000012F8000002A380372694BC21A4FEDECABEEFFFFFFFFFFFFF'O;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
stop;
}
v_gnReq := m_geoNwReq_linkLayerBroadcast(
m_geoNwPdu(
m_geoNwLsRequestPacket(
m_dummyLongPosVectorIut,
12345,
m_dummyGnAddrIut
)));
oct2bit(v_buffer)
);
/**
* @desc validate secured digest GeoNetworkingReq/LsRequest
* @verdict Pass on success, Fail otherwise
*/
testcase tc_GeoNetReq_SecuredDigestLsRequestPacket() runs on TCType system TCType {
var GeoNetworkingReq v_gnReq;
var octetstring v_gnPayload, v_encMsg;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
var template (value) SecuredMessage v_securedMessageBeacon;
if (PX_GN_UPPER_LAYER != e_any) {
log("PX_GN_UPPER_LAYER shall be set to e_any");
stop;
}
// Load certificates & keys
if (f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) == false) {