test_LibItsGeoNetworking_TypesAndValues.ttcn 155 KB
Newer Older
                f_setGenerationLocation(
                    f_getTsLatitude(),
                    f_getTsLongitude()
                );
                
                // Build signed SecuredMessage
                v_gnNonSecuredPacket := m_geoNwShbPacket(
                    m_dummyLongPosVectorIut
                );
                // Add DENM payload
                v_gnNonSecuredPacket.payload := f_adaptPayload_m(
                    bit2oct(
                        encvalue(
                            m_denmReq(
                                m_denmPdu(
                                    m_denm(
                                        m_denmMgmtCon(
                                            m_tsActionId
                                        ),
                                        v_situation,
                                        m_denmLocation_zeroDelta
                                    )
                               )
                           )
                        )
                    )
                );
                log("v_gnNonSecuredPacket= ", v_gnNonSecuredPacket);
                // Encode it
                v_gnPayload := bit2oct( // Create GN payload
                    encvalue(
                        v_gnNonSecuredPacket
                    )
                );
                log("v_gnPayload= ", v_gnPayload);
                
                f_buildGnSecuredDenm(
                    v_securedMessageBeacon,
                    m_payload_signed(v_gnPayload),
                    e_certificate_digest_with_sha256,
                    m_threeDLocation(
                        1234,
                        5678,
                        '002F'O
                    )
                );
                log("v_securedMessageBeacon= ", v_securedMessageBeacon);
                
                // Build secured Gn packet
                v_gnReq := m_geoNwReq_linkLayerBroadcast(
                    m_geoNwSecPdu(
                        v_gnNonSecuredPacket,
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                log("v_gnReq= ", v_gnReq);
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                log("v_encMsg= ", v_encMsg);
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 60;
                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 GeoNetworkingReq/TSB ExtendedHeader
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_TsbHeaderPacket() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var GeoNetworkingPacket v_geoNetworkingPacket;
                var octetstring v_payload := 'CAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECA'O;
                var octetstring v_buffer := '01002B0A0051800000480A00269400008431A4FDEA5EA5ED0000036B000001090000031500500224CAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECAFFFFFFFFFFFF'O;
                
                if (PX_GN_UPPER_LAYER != e_any) {
                    log("PX_GN_UPPER_LAYER shall be set to e_any");
                    setverdict(inconc);
                    stop;
                }
                
                v_geoNetworkingPacket := m_geoNwPacketWithOctetstringPayload(
                    m_commonHeader(
                        PX_GN_UPPER_LAYER,
                        m_tsbHeaderType,
                        m_trafficClass,
                        c_defaultHopLimit
                    ),
                    m_tsbHeader(
                        9876, 
                        m_dummyLongPosVectorNodeA
                    ),
                    v_payload
                );
                v_gnReq := m_geoNwReq_linkLayerBroadcast(
                    m_geoNwPdu(
                        v_geoNetworkingPacket.packet
                ));
                log("v_gnReq :", v_gnReq);
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer)
                );
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := lengthof(v_payload);
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate secured GeoNetworkingReq/TSB ExtendedHeader
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredTsbHeaderPacket() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var GeoNetworkingPacket v_geoNetworkingPacket;
                var octetstring v_gnPayload, v_encMsg;
                var octetstring v_payload := 'CAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECA'O;
                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_geoNetworkingPacket := m_geoNwPacketWithOctetstringPayload(
                    m_commonHeader(
                        PX_GN_UPPER_LAYER,
                        m_tsbHeaderType,
                        m_trafficClass,
                        c_defaultHopLimit
                    ),
                    m_tsbHeader(
                        9876, 
                        m_dummyLongPosVectorNodeA
                    ),
                    v_payload
                );
                v_gnReq := m_geoNwReq_linkLayerBroadcast(
                    m_geoNwPdu(
                        v_geoNetworkingPacket.packet
                ));
                v_gnPayload := bit2oct( // Create GN payload
                    encvalue(
                        v_gnReq.msgOut.gnPacket.packet 
                    )
                );
                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(
                        v_gnReq.msgOut.gnPacket.packet,
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := lengthof(v_payload);
                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 GeoNetworkingReq/Anycast
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_AnycastPacket() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var octetstring v_buffer := '01002B0A00308000000F0A001DE60000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D217BE23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFF'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_geoNwAnycastPacket(
                            m_dummyLongPosVectorNodeB, 
                            7654, 
                            m_dummyGeoAnycastArea1
                )));
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate secured GeoNetworkingReq/Anycast
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredAnycastPacket() 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_geoNwAnycastPacket(
                            m_dummyLongPosVectorNodeB, 
                            7654, 
                            m_dummyGeoAnycastArea1
                        )
                    )
                );
                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_geoNwAnycastPacket(
                            m_dummyLongPosVectorNodeB, 
                            7654, 
                            m_dummyGeoAnycastArea1
                        ),
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                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 GeoNetworkingReq/Anycast with hop limit
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_AnycastPacketWithHopLimit() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var ExtendedHeader v_header := null;
                var octetstring v_buffer := '01002B0A00308000000F05001DE60000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D217BE23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFF'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_geoNwAnycastPacket(
                            m_dummyLongPosVectorNodeB, 
                            7654, 
                            m_dummyGeoAnycastArea1,
                            c_defaultHopLimit / 2
                )));
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate secured GeoNetworkingReq/Anycast with hop limit
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredAnycastPacketWithHopLimit() 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_geoNwAnycastPacket(
                            m_dummyLongPosVectorNodeB, 
                            7654, 
                            m_dummyGeoAnycastArea1,
                            c_defaultHopLimit / 2
                        )
                    )
                );
                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_geoNwAnycastPacket(
                            m_dummyLongPosVectorNodeB, 
                            7654, 
                            m_dummyGeoAnycastArea1,
                            c_defaultHopLimit / 2
                        ),
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                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 GeoNetworkingReq/Unicast
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_UnicastPacket() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var ExtendedHeader v_header := null;
                var octetstring v_buffer := '01002B0A00208000000F0A001DE60000A832A40102030405000011E90000007E0000007B002D007DBC21A4FEDECABEEF0001E240000012F8000002A344454641554C545F5041594C4F4144FFFFFFFFFFFF'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_geoNwUnicastPacket(
                            m_dummyLongPosVectorNodeB, 
                            f_longPosVector2ShortPosVector(m_dummyLongPosVectorIut), 
                            7654
                )));
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate secured GeoNetworkingReq/Anycast
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredDigestUnicastPacket() 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_geoNwUnicastPacket(
                            m_dummyLongPosVectorNodeB, 
                            f_longPosVector2ShortPosVector(m_dummyLongPosVectorIut), 
                            7654
                        )
                    )
                );
                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_geoNwUnicastPacket(
                            m_dummyLongPosVectorNodeB, 
                            f_longPosVector2ShortPosVector(m_dummyLongPosVectorIut), 
                            7654
                        ),
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // 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("SecuredMsg=", v_encMsg);
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                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 GeoNetworkingReq/Unicast with hop limit
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_UnicastPacketWithHopLimit() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var ExtendedHeader v_header := null;
                var octetstring v_buffer := '01002B0A00208000000F01001DE60000A832A40102030405000011E90000007E0000007B002D007DBC21A4FEDECABEEF0001E240000012F8000002A344454641554C545F5041594C4F4144FFFFFFFFFFFF'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_geoNwUnicastPacket(
                            m_dummyLongPosVectorNodeB, 
                            f_longPosVector2ShortPosVector(m_dummyLongPosVectorIut), 
                            7654,
                            1
                )));
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate secured GeoNetworkingReq/Anycast with hop limit
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredUnicastPacketWithHopLimit() 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_geoNwUnicastPacket(
                            m_dummyLongPosVectorNodeB, 
                            f_longPosVector2ShortPosVector(m_dummyLongPosVectorIut), 
                            7654,
                            1
                        )
                    )
                );
                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_geoNwUnicastPacket(
                            m_dummyLongPosVectorNodeB, 
                            f_longPosVector2ShortPosVector(m_dummyLongPosVectorIut), 
                            7654,
                            1
                        ),
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                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 GeoNetworkingReq/Broadcast
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_BroadcastPacket() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var ExtendedHeader v_header := null;
                var octetstring v_buffer := '01002B0A00418000000F0A000D800000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D217BE23A3000044454641554C545F5041594C4F4144FFFFFFFFFFFF'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_geoNwBroadcastPacket(
                            m_dummyLongPosVectorNodeB, 
                            3456, 
                            m_dummyGeoBroadcastArea1
                )));
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate secured GeoNetworkingReq/Broadcast
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredBroadcastPacket() 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_geoNwBroadcastPacket(
                            m_dummyLongPosVectorNodeB, 
                            3456, 
                            m_dummyGeoBroadcastArea1
                        )
                    )
                );
                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_geoNwBroadcastPacket(
                            m_dummyLongPosVectorNodeB, 
                            3456, 
                            m_dummyGeoBroadcastArea1
                        ),
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 15;
                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 GeoNetworkingReq/Broadcast with payload
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_BroadcastPacketWithBtpPayload() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var GnNonSecuredPacket v_gnNonSecuredPacket;
                var GeoNetworkingPacket v_geoNetworkingPacket;
                var octetstring v_payload := 'CAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECA'O;
                var octetstring v_buffer := '01002B0A0041800000480A000D800000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D2162E23A30000CAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECAFFFFFFFFFFFF'O;
                
                if ((PX_GN_UPPER_LAYER != e_btpA) and (PX_GN_UPPER_LAYER != e_btpB)) {
                    log("PX_GN_UPPER_LAYER shall be set to e_btpA or e_btpB");
                    setverdict(inconc);
                    stop;
                }
                
                v_gnNonSecuredPacket := m_geoNwBroadcastPacket(
                    m_dummyLongPosVectorNodeB, 
                    3456, 
                    m_dummyGeoBroadcastArea1
                );
                v_geoNetworkingPacket := m_geoNwPacketWithOctetstringPayload(
                    v_gnNonSecuredPacket.commonHeader,
                    v_gnNonSecuredPacket.extendedHeader,
                    v_payload
                );
                v_gnReq := m_geoNwReq_linkLayerBroadcast(
                    m_geoNwPdu(
                        v_geoNetworkingPacket.packet
                ));
                log("v_gnReq :", v_gnReq);
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := lengthof(v_payload);
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            }
            
            /**
             * @desc validate GeoNetworkingReq/Broadcast with payload
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_BroadcastPacketWithPayloadDenm() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var GnNonSecuredPacket v_gnNonSecuredPacket;
                var GeoNetworkingPacket v_geoNetworkingPacket;
                var template (value) SituationContainer v_situation := m_situation(CauseCodeType_vehicleBreakdown_, VehicleBreakdownSubCauseCode_unavailable_);
                var octetstring v_buffer := '01002B0A20418000003C0A000D800000A832A40102030405000011E90000007E0000007B002D007D00048D8800007FE904D217BE23A3000007D2000001010001B207C70000D90380000A0843F2F2828210FCBCACFA46CAE6F7E4630001001000186A000009600C05B00000DFFFF7FFFD8CE40400FFFFFFFFFFFF'O; 
                
                if (PX_GN_UPPER_LAYER != e_btpB) {
                    log("PX_GN_UPPER_LAYER shall be set to e_btpB");
                    stop;
                }
                
                v_gnReq := m_geoNwReq_linkLayerBroadcast(
                    m_geoNwPdu(
                        m_geoNwBroadcastPacket(
                            m_dummyLongPosVectorNodeB, 
                            3456, 
                            m_dummyGeoBroadcastArea1
                )));
                v_gnReq.msgOut.gnPacket.packet.payload := f_adaptPayload_m(
                    bit2oct(
                        encvalue(
                            m_denmReq(
                                m_denmPdu(
                                    m_denm(
                                        m_denmMgmtCon(
                                            m_tsActionId
                                        ),
                                        v_situation,
                                        m_denmLocation_zeroDelta
                                    )
                               )
                           )
                        )
                    )
                );
                log("v_gnReq :", v_gnReq);
                test_PDU<GeoNetworkingReq>(
                    v_gnReq, 
                    false, 
                    oct2bit(v_buffer));
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := 60;
                test_decodePDU<GeoNetworkingReq>(
                    v_gnReq, 
                    v_buffer
                );
            
            /**
             * @desc validate secured GeoNetworkingReq/Broadcast with payload
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredBroadcastPacketWithBtpPayload() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var GnNonSecuredPacket v_gnNonSecuredPacket;
                var GeoNetworkingPacket v_geoNetworkingPacket;
                var octetstring v_gnPayload, v_encMsg;
                var octetstring v_payload := 'CAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECACAFEDECA'O;
                var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
                var template (value) SecuredMessage v_securedMessageBeacon;
                
                if ((PX_GN_UPPER_LAYER != e_btpA) and (PX_GN_UPPER_LAYER != e_btpB)) {
                    log("PX_GN_UPPER_LAYER shall be set to e_btpA or e_btpB");
                    setverdict(inconc);
                    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_gnNonSecuredPacket := m_geoNwBroadcastPacket(
                    m_dummyLongPosVectorNodeB, 
                    3456, 
                    m_dummyGeoBroadcastArea1
                );
                v_geoNetworkingPacket := m_geoNwPacketWithOctetstringPayload(
                    v_gnNonSecuredPacket.commonHeader,
                    v_gnNonSecuredPacket.extendedHeader,
                    v_payload
                );
                v_gnReq := m_geoNwReq_linkLayerBroadcast(
                    m_geoNwPdu(
                        v_geoNetworkingPacket.packet
                ));
                v_gnPayload := bit2oct( // Create GN payload
                    encvalue(
                        v_gnReq.msgOut.gnPacket.packet 
                    )
                );
                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(
                        v_gnReq.msgOut.gnPacket.packet,
                        v_securedMessageBeacon
                    ) // End of template m_geoNwSecPdu
                ); // End of template m_geoNwReq_linkLayerBroadcast
                
                // Encode it
                v_encMsg := bit2oct(encvalue(v_gnReq));
                log("v_encMsg=", v_encMsg);
                if (not isbound(v_encMsg)) {
                    setverdict(fail, "Encoding failed!");
                    stop;
                }
                setverdict(pass, "Encoding passed.");
                // Decode it
                v_gnReq.msgOut.gnPacket.packet.commonHeader.plLength := lengthof(v_payload);
                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/Broadcast with DENM payload
             * @verdict Pass on success, Fail otherwise
             */
            testcase tc_GeoNetReq_SecuredDigestBroadcastPacketWithBtpDenm() runs on TCType system TCType {
                var GeoNetworkingReq v_gnReq;
                var GnNonSecuredPacket v_gnNonSecuredPacket;