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 {
template m_camReq;
group camTemplateFunctions
};
// LibItsDenm
import from LibItsDenm_Templates all;
import from LibItsDenm_TestSystem all;
// LibItsSecurity
import from LibItsSecurity_TypesAndValues 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;
// 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,
timestamp := 123456,
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,
timestamp := 875,
latitude := 265,
longitude := 789,
pai := '0'B,
speed := 80,
heading := 548
template (value) LongPosVector m_dummyLongPosVectorNodeB := {
gnAddr := m_dummyGnAddrNodeB,
timestamp := 4585,
latitude := 126,
longitude := 123,
pai := '0'B,
speed := 45,
heading := 125
template (value) LongPosVector m_dummyLongPosVectorNodeC := {
gnAddr := m_dummyGnAddrNodeC,
timestamp := 23644,
latitude := 23754,
longitude := 49645,
pai := '0'B,
speed := 110,
heading := 23
template (value) Area m_dummyArea1 := {
geoAreaPosLatitude := 298376,
geoAreaPosLongitude := 32745,
distanceA := 1234,
distanceB := 5678,
angle := 9123
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
}
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
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
} // 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 := c_stationType_passengerCar,
referencePosition := {
latitude := f_integer2Latitude(f_getTsLatitude()),
longitude := f_integer2Longitude(f_getTsLongitude()),
positionConfidenceEllipse := {
semiMajorConfidence := c_semiAxisLengthOneCentimeter,
semiMinorConfidence := c_semiAxisLengthOneCentimeter,
semiMajorOrientation := c_headingValue_wgs84North
},
altitude := {
altitudeValue := c_altitudeValue_seaLevel,
altitudeConfidence := unavailable
}
}
},
highFrequencyContainer := {
basicVehicleContainerHighFrequency := {
heading := {
headingValue := c_headingValue_wgs84North, //0
headingConfidence := 10
},
speed := {
speedValue := 45,
speedConfidence := 5
},
driveDirection := forward,
vehicleLength := {
vehicleLengthValue := 50,
vehicleLengthConfidenceIndication := noTrailerPresent
},
vehicleWidth := 21,
longitudinalAcceleration := {
longitudinalAccelerationValue := c_longitudinalAccelerationValue_unavailable,
longitudinalAccelerationConfidence := c_accelerationConfidence_unavailable
},
curvature := {
curvatureValue := c_curvatureValue_straight,
curvatureConfidence := unavailable
},
curvatureCalculationMode := yawRateUsed,
yawRate := {
yawRateValue := c_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 securityTemplates {
template (value) Oct32 m_devicePrivateKey := '3aa27835bfe11dc6711b7c471fd3994b3ee94bcf59bcb0cade6abffe7c2f6530'O;
template (value) Certificate m_deviceCertificate := {
version := 2,
signer_info := m_signerInfo_digest('0727A031EE3F372C'O),
subject_info := m_subject_info_authorization_ticket,
subject_attributes := {
m_subject_attribute_verification_key(
m_publicKey_eccPoint(
m_eccPointecdsa_nistp256_with_sha256_uncompressed(
'cd2904aee519278f5c1d0c89810d2b846b7796ba244944d2a15fa5665bc2d1c2'O,
'ec0dd4f97c194c7c3e92b7e9af4c25b43b1c8de9bba8261c2b8454ec51b42e8e'O
)
)
),
m_subject_attribute_encryption_key(
m_publicKey_aesccm(
m_aesccm(
m_eccPointecdsa_nistp256_with_sha256_uncompressed(
'ad4334139b7659360d46b423e01971aae009bd15a77c9144e67312ff7c6f7d93'O,
'01068089afad1f25941e2e1ab230eebf8bf022dadd201e64311d62868d2a3ec0'O
)
)
)
),
m_subject_attribute_assurance_level(
m_subjectAssurance(
'001'B,
'00'B
)
),
m_subject_attribute_its_aid_list(
{
16512,
16513
}
)
},
validity_restrictions := {
m_validity_restriction_time_start_and_end(
1405173485,
1513691885
)
},
signature_ := m_signature(
m_ecdsaSignature(
m_eccPointecdsa_nistp256_with_sha256_x_coordinate_only(
'54c524c932ac1d7fb2cf3c7e5a6f9d0e46092d84eab0fa7240c47b202eb1566d'O
),
'98f54758fb46e4f3254aedfa59dda07c1e49f19b2dee2ab6922a7526d32f9842'O
)
)
} // End of template m_deviceCertificate
} // End of group securityTemplates
group testAcPrimitives {
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
// /**
// *
// * @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
*/
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
testcase tc_enableSecurity() runs on TCType system TCType {
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessageDigest;
var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessageCertificate;
if (f_loadCertificates("dummy") == true) {
setverdict(fail);
stop;
}
// Setup certificates memory cache
if (f_loadCertificates("cfg01") == false) {
setverdict(fail);
stop;
}
f_setGenerationLocation(
f_getTsLatitude(),
f_getTsLongitude()
);
// Build the beacon template
v_toBeSignedSecuredMessageDigest := f_buildSecuredMessagePayloadToBeSigned();
v_toBeSignedSecuredMessageCertificate := f_buildSecuredMessagePayloadToBeSigned(true);
test_PDU<AcGnPrimitive>(
AcGnPrimitive:{ acEnableSecurity := m_enableSecurity(
"TA_CERT_A"
) },
false
);
* @desc validate AcDisableSecurity
* @verdict Pass on success, Fail otherwise
*/
testcase tc_disableSecurity() runs on TCType system TCType {
test_PDU<AcGnPrimitive>(
AcGnPrimitive:{ acDisableSecurity := m_disableSecurity },
false
);
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
504
505
506
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
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;
// log("f_buildGnSecuredOtherMessageWithDeviceCertificate: p_unsecuredPayload: ", p_unsecuredPayload);
// 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);
// 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(
v_hash,
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
testcase tc_checkDeviceSignature() 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;
}
// Build signed SecuredMessage
v_gnPayload := bit2oct( // Create GN payload
encvalue(
m_geoNwBeaconPacket( // Non secured GN beacon
m_dummyLongPosVectorIut
)
)
);
f_buildGnSecuredOtherMessageWithDeviceCertificate(
v_securedMessageBeacon,
v_gnPayload,
m_threeDLocation(
1234,
5678,
'002F'O
),
m_deviceCertificate,
m_devicePrivateKey
// 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, m_deviceCertificate) == 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("cfg01") == 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("cfg01") == 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("cfg01") == 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
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
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("cfg01") == false) {
setverdict(fail);
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
f_setGenerationLocation(
f_getTsLatitude(),
f_getTsLongitude()
);
// Build signed SecuredMessage
v_gnPayload := bit2oct( // Create GN payload
encvalue(
m_geoNwLsRequestPacket(
m_dummyLongPosVectorIut,
12345,
m_dummyGnAddrIut
)
)
);
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_geoNwLsRequestPacket(
m_dummyLongPosVectorIut,
12345,
m_dummyGnAddrIut