test_LibItsGeoNetworking_TypesAndValues.ttcn 148 KB
Newer Older
filatov's avatar
filatov committed
module test_LibItsGeoNetworking_TypesAndValues /*language "TTCN-3:2009 Advanced Parameterization"*/ {
filatov's avatar
filatov committed
    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
filatov's avatar
filatov committed
    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;
filatov's avatar
filatov committed

    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
                }
            
        } // 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 {
//            /**
//             * 
//             * @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
//                );
//            }
//
filatov's avatar
filatov committed
            /**
             * @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));
filatov's avatar
filatov committed
            }

            /**
             * @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));
filatov's avatar
filatov committed
            }

            /**
             * @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));
filatov's avatar
filatov committed
            }

            /**
             * @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
filatov's avatar
filatov committed
             * @verdict Pass on success, Fail otherwise
             */
            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
filatov's avatar
filatov committed
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_disableSecurity() runs on TCType system TCType {
                test_PDU<AcGnPrimitive>(
                    AcGnPrimitive:{ acDisableSecurity := m_disableSecurity }, 
                    false
                ); 
filatov's avatar
filatov committed
            }

        } // End of group testAcPrimitives
             * @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
            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;
filatov's avatar
filatov committed
                
                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
filatov's avatar
filatov committed
                test_decodePDU<GeoNetworkingReq>(
                
                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
filatov's avatar
filatov committed
             * @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;
filatov's avatar
filatov committed
                
                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
                    )));
filatov's avatar
filatov committed
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    true, 
                    oct2bit(v_buffer)
             * @desc validate secured GeoNetworkingReq/Beacon with certificate digest in header fields
filatov's avatar
filatov committed
             * @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;
filatov's avatar
filatov committed
                
                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
filatov's avatar
filatov committed
                test_decodePDU<GeoNetworkingReq>(
                
                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
filatov's avatar
filatov committed
             * @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;
filatov's avatar
filatov committed
                
                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
filatov's avatar
filatov committed
                test_decodePDU<GeoNetworkingReq>(
                
                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
filatov's avatar
filatov committed
             * @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
                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
filatov's avatar
filatov committed
             * @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;
filatov's avatar
filatov committed
                
                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
                    )));
filatov's avatar
filatov committed
                test_PDU<GeoNetworkingReq>(
filatov's avatar
filatov committed
                    false, 
filatov's avatar
filatov committed
                test_decodePDU<GeoNetworkingReq>(
            /**
             * @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;
filatov's avatar
filatov committed
                
                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);
                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