LibItsSecurity_Templates.ttcn 99.2 KB
Newer Older
garciay's avatar
garciay committed
/**
 *  @author   ETSI / STF481 / STF507 / STF517 / STF538
garciay's avatar
garciay committed
 *  @version  $URL$
 *            $Id$
 *  @desc     Module containing templates for Security Protocol
garciay's avatar
garciay committed
 *  @copyright   ETSI Copyright Notification
 *               No part may be reproduced except as authorized by written permission.
 *               The copyright and the foregoing restriction extend to reproduction in all media.
 *               All rights reserved.
garciay's avatar
garciay committed
 *
 */
module LibItsSecurity_Templates {
    
    // LibCommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_DataStrings all;
garciay's avatar
garciay committed
    
    // LibItsCommon
    import from LibItsCommon_TypesAndValues all;
garciay's avatar
garciay committed
    // LibItsGeoNetworking
    import from LibItsGeoNetworking_TypesAndValues all;
    
garciay's avatar
garciay committed
    // LibIts
    import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
    import from IEEE1609dot2 language "ASN.1:1997" all;
    import from EtsiTs103097Module language "ASN.1:1997" all;
garciay's avatar
garciay committed
    
garciay's avatar
garciay committed
    // LibItsSecurity
    import from LibItsSecurity_TypesAndValues all;
    import from LibItsSecurity_Pixits all;
garciay's avatar
garciay committed
    /**
     * @desc Constants declaration
     */
    group constants {
        
        /**
         * @desc Protocol version
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.1 Ieee1609Dot2Data
        const UInt8 c_protocol_version := 3;
         * @desc Certificate version
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 6.1 Certificate
        const UInt8 c_certificate_version := 3;
        /**
         * @desc Its AID for Other
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 7.3 Security profile for DENMs
//FIXME RGY definition type is changed to modulepar, as Titan doesn't support dynamic constants
//        const IntX c_its_aid_Other := PX_OTHER_ITS_AID;
        template Psid c_its_aid_Other := PX_OTHER_ITS_AID;
garciay's avatar
garciay committed
        
        /**
         * @desc Minimal value of Longitude
garciay's avatar
garciay committed
         */
        const SecLongitude c_minLongitude := -1799999999; // TODO Use constant from IEEE1609dot2BaseTypes
         * @desc Maximal value of Longitude
        const SecLongitude c_maxLongitude :=  1800000000; // TODO Use constant from IEEE1609dot2BaseTypes
         * @desc Minimal value of Latitude
        const SecLatitude c_minLatitude  := -900000000;  // TODO Use constant from IEEE1609dot2BaseTypes
        
        /**
         * @desc Maximal value of Latitude
         */
        const SecLatitude c_maxLatitude  :=  900000000; // TODO Use constant from IEEE1609dot2BaseTypes
filatov's avatar
filatov committed
        
        /**
         * @desc List of ISO-3166 country codes
         */
        const SequenceOfUint16 c_iso3166Codes := {
filatov's avatar
filatov committed
            4,   8,  10,  12,  16,  20,  24,  28,  31,  32,  36,  40,  44,  48,  50,  51,  52,  56,
           60,  64,  68,  70,  72,  74,  76,  84,  86,  90,  92,  96, 100, 104, 108, 112, 116, 120,
          124, 132, 136, 140, 144, 148, 152, 156, 158, 162, 166, 170, 174, 175, 178, 180, 184, 188,
          191, 192, 196, 203, 204, 208, 212, 214, 218, 222, 226, 231, 232, 233, 234, 238, 239, 242,
          246, 248, 250, 254, 258, 260, 262, 266, 268, 270, 275, 276, 288, 292, 296, 300, 304, 308,
          312, 316, 320, 324, 328, 332, 334, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376,
          380, 384, 388, 392, 398, 400, 404, 408, 410, 414, 417, 418, 422, 426, 428, 430, 434, 438,
          440, 442, 446, 450, 454, 458, 462, 466, 470, 474, 478, 480, 484, 492, 496, 498, 499, 500,
          504, 508, 512, 516, 520, 524, 528, 531, 533, 534, 535, 540, 548, 554, 558, 562, 566, 570,
          574, 578, 580, 581, 583, 584, 585, 586, 591, 598, 600, 604, 608, 612, 616, 620, 624, 626,
          630, 634, 638, 642, 643, 646, 652, 654, 659, 660, 662, 663, 666, 670, 674, 678, 682, 686,
          688, 690, 694, 702, 703, 704, 705, 706, 710, 716, 724, 728, 729, 732, 740, 744, 748, 752,
          756, 760, 762, 764, 768, 772, 776, 780, 784, 788, 792, 795, 796, 798, 800, 804, 807, 810,
          818, 826, 831, 832, 833, 834, 840, 850, 854, 858, 860, 862, 876, 882, 887, 894 
        /**
         * @desc List of United Nations Statistics Division country codes
         */
        const SequenceOfUint16 c_unStatsAdditionalCodes := {
            1,   2,   5,   9,  11,  13,  14,  15,  17,  18,  19,  21,  29,  30,  34,  35,  39,  53,
           54,  57,  61, 142, 143, 145, 150, 151, 154, 155, 199, 419, 432, 680, 722, 830
       };
    } // End of group constants
garciay's avatar
garciay committed
     * @desc Dummy send/receive templates for security headers
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 4   Basic format elements
garciay's avatar
garciay committed
    group dummyBasicFormatElements {
        
        /**
         * @desc Dummy receive templates for security headers
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2    Specification of basic format elements
         */
        group dummyBasicFormatElementsRecv {
            /**
             * @desc Dummy receive template for TwoDLocation
             * @param p_latitude    Latitude range from  900 000 000 to +900 000 000
             * @param p_longitude   Longitude range from  1 800 000 000 to +1 800 000 000
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.19    TwoDLocation
             */
            template (present) TwoDLocation mw_twoDLocation_dummy := {
                latitude    := ?,
                longitude   := ?
            } // End of template mw_twoDLocation_dummy
            
            /**
             * @desc Dummy send template for ThreeDLocation
             * @param p_latitude    Latitude range from  900 000 000 to +900 000 000
             * @param p_longitude   Longitude range from  1 800 000 000 to +1 800 000 000
             * @param p_elevation   Elevation relative to the WGS-84 ellipsoid in decimetres
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.20    ThreeDLocation
            template (present) ThreeDLocation mw_threeDLocation_dummy := {
                latitude    := ?,
                longitude   := ?,
                elevation   := ?
            } // End of template mw_threeDLocation_dummy
            
        } // End of group dummyBasicFormatElementsRecv
        
    } // End of group dummyBasicFormatElements 
    
    /**
     * @desc Send/receive templates for security headers
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 4   Basic format elements
     */
    group basicFormatElements {
        
        /**
         * @desc Send templates for security headers
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2    Specification of basic format elements
         */
        group basicFormatElementsSend {
            
            /**
             * @desc Send templates for security algorithm descriptions
                 * @desc Send template for EccP256CurvePoint description based on x_coordinate_only type
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.5   EccP256CurvePoint
                 * @see Draft ETSI TS 103 097 V1.3.1 Table 2: Derivation of field sizes depending on the used algorithm
                template (value) EccP256CurvePoint m_eccPointecdsa_nistp256_with_sha256_x_coordinate_only(
                                                                                                          in template (value) octetstring p_x
garciay's avatar
garciay committed
                ) := { 
                    x_only := p_x
                } // End of template m_eccPointecdsa_nistp256_with_sha256_x_coordinate_only
                
                 * @desc Send template for EccP256CurvePoint description based on y_coordinate_only type
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.5   EccP256CurvePoint
                 * @see Draft ETSI TS 103 097 V1.3.1 Table 2: Derivation of field sizes depending on the used algorithm
                template (value) EccP256CurvePoint m_eccPointecdsa_nistp256_with_sha256_y_coordinate_only(
                                                                                                          in template (value) octetstring p_y
                    compressed_y_0 := p_y
                } // End of template m_eccPointecdsa_nistp256_with_sha256_y_coordinate_only
                
                 * @desc Send template for EccP256CurvePoint description based on uncompressed type
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.5   EccP256CurvePoint
                 * @see Draft ETSI TS 103 097 V1.3.1 Table 2: Derivation of field sizes depending on the used algorithm
                template (value) EccP256CurvePoint m_eccPointecdsa_nistp256_with_sha256_uncompressed(
                                                                                                     in template (value) octetstring p_x,
                                                                                                     in template (value) octetstring p_y
garciay's avatar
garciay committed
                ) := {
                    uncompressedP256 := {
                       x := p_x,
                       y := p_y
garciay's avatar
garciay committed
                    }
                } // End of template m_eccPointecdsa_nistp256_with_sha256_uncompressed
                
            } // End of group algorithms
garciay's avatar
garciay committed
            /**
             * @desc Send templates for Signature description
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.9   Signature
             * @see Draft ETSI TS 103 097 V1.3.1 Table 2: Derivation of field sizes depending on the used algorithm
garciay's avatar
garciay committed
             */
            group signatures {
                
garciay's avatar
garciay committed
                /**
                 * @desc Send template for signatures based on ECDSA algorithm
                 * @member p_ecdsaSignature The ECDSA based signature
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.9   Signature
garciay's avatar
garciay committed
                 */
garciay's avatar
garciay committed
                template (value) Signature m_signature(
                                                       in template (value) EcdsaP256Signature p_ecdsaSignature
garciay's avatar
garciay committed
                ):= {
                    ecdsaNistP256Signature := p_ecdsaSignature
garciay's avatar
garciay committed
                } // End of template m_signature_ecdsa
                
garciay's avatar
garciay committed
                /**
                 * @desc Send template for ECDSA based signature
                 * @member p_r          The coordinate of the elliptic curve point resulting from multiplying the generator element by the ephemeral private key
                 * @member p_s          The signature
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.10   EcdsaP256Signature
garciay's avatar
garciay committed
                 */
                template (value) EcdsaP256Signature m_ecdsaSignature(
garciay's avatar
garciay committed
                                                                     in template (value) EccP256CurvePoint p_rSig,
                                                                     in template (value) octetstring p_sSig
                    rSig := p_rSig,
                    sSig := p_sSig
garciay's avatar
garciay committed
                } // End of template m_ecdsaSignature
                
garciay's avatar
garciay committed
            } // End of group signatures 
            
            group signerInfos {
                
                /**
                 * @desc Send template for self signed message
                 */
                template (value) SignerIdentifier m_signerIdentifier_self := {
                    self_ := NULL
                } // End of template m_signerIdentifier_self
garciay's avatar
garciay committed
                /**
                 * @desc Send template for certificate signed message
                 */
                template (value) SignerIdentifier m_signerIdentifier_certificate(
                                                                                 in template (value) Certificate p_certificate // TODO Use SingleEtsiTs103097Certificate
garciay's avatar
garciay committed
                ) := {
                    certificate := { p_certificate } // Only one
                } // End of template m_signerIdentifier_certificate
                /**
                 * @desc Send template for digest signed message
                 */
                template (value) SignerIdentifier m_signerIdentifier_digest(
garciay's avatar
garciay committed
                                                                            in template (value) HashedId8 p_digest := '0000000000000000'O
                ) := {
                    digest := p_digest
                } // End of template m_signerIdentifier_digest
                
garciay's avatar
garciay committed
                /**
                 * @desc Send template for certificate signed message
garciay's avatar
garciay committed
                 */
                template (value) SignerIdentifier m_signerIdentifier_certificates(
garciay's avatar
garciay committed
                                                                                  in template (value) SequenceOfCertificate p_certificates := {}
garciay's avatar
garciay committed
                ) := {
                    certificate := p_certificates
                } // End of template m_signerIdentifier_certificates
garciay's avatar
garciay committed
                
garciay's avatar
garciay committed
            } // End of group signerInfos
garciay's avatar
garciay committed
            
garciay's avatar
garciay committed
            /**
             * @desc Send template for TwoDLocation
             * @param p_latitude    Latitude range from  900 000 000 to +900 000 000
             * @param p_longitude   Longitude range from  1 800 000 000 to +1 800 000 000
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.19    TwoDLocation
garciay's avatar
garciay committed
             */
            template (value) TwoDLocation m_twoDLocation(
                                                         in template (value) SecLatitude p_latitude,
                                                         in template (value) SecLongitude p_longitude
garciay's avatar
garciay committed
            ) := {
                latitude    := p_latitude,
                longitude   := p_longitude
            } // End of template m_twoDLocation
            
            /**
             * @desc Send template for ThreeDLocation
             * @param p_latitude    Latitude range from  900 000 000 to +900 000 000
             * @param p_longitude   Longitude range from  1 800 000 000 to +1 800 000 000
             * @param p_elevation   Elevation relative to the WGS-84 ellipsoid in decimetres
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.20    ThreeDLocation
garciay's avatar
garciay committed
             */
            template (value) ThreeDLocation m_threeDLocation(
                                                             in template (value) SecLatitude p_latitude,
                                                             in template (value) SecLongitude p_longitude,
                                                             in template (value) SecElevation p_elevation
garciay's avatar
garciay committed
            ) := {
                latitude    := p_latitude,
                longitude   := p_longitude,
                elevation := p_elevation
            } // End of template m_threeDLocation
            
garciay's avatar
garciay committed
            /**
             * @desc Send template circular geographic region
             * @param p_center  Circle center 
             * @param p_radius  Circle radius
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
garciay's avatar
garciay committed
             */
            template (value) GeographicRegion m_geographicRegion_circle(
                                                                        in template (value) TwoDLocation p_center,
                                                                        in template (value) UInt16 p_radius
garciay's avatar
garciay committed
            ) := {
                circularRegion := {
                    center := p_center,
                    radius := p_radius
                }
garciay's avatar
garciay committed
            } // End of template m_geographicRegion_circle
            
            /**
             * @desc Send template rectangular geographic region
garciay's avatar
garciay committed
             * @param p_northwest  Upper left corner 
             * @param p_southeast  Lower rigth corner
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
garciay's avatar
garciay committed
             */
            template (value) GeographicRegion m_geographicRegion_rectangular(
                                                                             in template (value) TwoDLocation p_northwest,
                                                                             in template (value) TwoDLocation p_southeast
garciay's avatar
garciay committed
            ) := {
                rectangularRegion := {
                    {
                        northWest := p_northwest,
                        southEast := p_southeast 
                    }
                }
            } // End of template m_geographicRegion_rectangular
garciay's avatar
garciay committed
            
            /**
             * @desc Send template polygonial geographic region
             * @param p_polygonal_region  Polygonial region description
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
garciay's avatar
garciay committed
             */
            template (value) GeographicRegion m_geographicRegion_polygonial(
                                                                            in template (value) PolygonalRegion p_polygonal_region
garciay's avatar
garciay committed
            ) := {
                polygonalRegion := p_polygonal_region
garciay's avatar
garciay committed
            } // End of template m_geographicRegion_polygonial
            
            /**
             * @desc Send template for geographic identified region
             * @param p_identifiedRegion  Indentified region
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
garciay's avatar
garciay committed
            template (value) GeographicRegion m_geographicRegion_identifiedRegion(
                                                                                  in template (value) SequenceOfIdentifiedRegion p_identifiedRegions
garciay's avatar
garciay committed
            ) := {
                identifiedRegion := p_identifiedRegions
garciay's avatar
garciay committed
            } // End of template m_geographicRegion_identifiedRegion
            
            template (value) IdentifiedRegion m_identifiedRegion_country_only(
                                                                              in template (value) CountryOnly p_countryOnly
            ) := {
                countryOnly := p_countryOnly
            } // End of template m_identifiedRegion_country_only
            
            template (value) IdentifiedRegion m_identifiedRegion_country_and_region(
                                                                                    in template (value) CountryOnly p_countryOnly,
                                                                                    in template (value) SequenceOfUint8 p_regions       
            ) := {
                countryAndRegions := {
                    countryOnly := p_countryOnly,
                    regions     := p_regions
                }
            } // End of template m_identifiedRegion_country_and_region
        } // End of group basicFormatElementsSend 
garciay's avatar
garciay committed
        
        /**
         * @desc Receive templates for security headers
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2    Specification of basic format elements
garciay's avatar
garciay committed
         */
        group basicFormatElementsRecv {
            group signerIdentifiers {
                
                /**
                 * @desc Recv template for message signed with digest 
                 */
                template (present) SignerIdentifier mw_signerIdentifier_digest(
                                                                               in template (present) HashedId8 p_digest  := ?
                    digest := p_digest
                } // End of template mw_signerIdentifier_digest
                template (present) SignerIdentifier mw_signerIdentifier_certificate(
                                                                                    in template (present) EtsiTs103097Certificate p_certificate  := ?
                    certificate := { p_certificate }
                } // End of template m_signerIdentifier_certificate
                template (present) SignerIdentifier mw_signerIdentifier_certificates(
                                                                                     in template (present) SequenceOfCertificate p_certificates := ?
                    certificate := p_certificates
                } // End of template mw_signerIdentifier_certificates
            } // End of group signerIdentifiers
            /**
             * @desc Receive templates for Signature description
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.9   Signature
             * @see Draft ETSI TS 103 097 V1.3.1 Table 2: Derivation of field sizes depending on the used algorithm
             */
            group signatures {
                
                /**
                 * @desc Receive template for signatures based on ECDSA algorithm
                 * @member p_ecdsaSignature The ECDSA based signature
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.9   Signature
                 */
                template (present) Signature mw_signature(
                                                          in template (present) EcdsaP256Signature p_ecdsaSignature := ?
                    ecdsaNistP256Signature := p_ecdsaSignature
                } // End of template mw_signature
                
                /**
                 * @desc Receive template for ECDSA based signature
                 * @member p_r          The coordinate of the elliptic curve point resulting from multiplying the generator element by the ephemeral private key
                 * @member p_s          The signature
                 * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.10   EcdsaP256Signature
                template (present) EcdsaP256Signature mw_ecdsaSignature(
                                                                        in template (present) EccP256CurvePoint p_rSig := ?,
                                                                        in template (present) octetstring p_sSig := ?
                    rSig := p_rSig,
                    sSig := p_sSig
                } // End of template mw_ecdsaSignature
                
            } // End of group signatures 
            
garciay's avatar
garciay committed
            /**
             * @desc Receive template for TwoDLocation
garciay's avatar
garciay committed
             * @param p_latitude    Latitude range from  900 000 000 to +900 000 000
             * @param p_longitude   Longitude range from  1 800 000 000 to +1 800 000 000
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.19    TwoDLocation
garciay's avatar
garciay committed
             */
            template (present) TwoDLocation mw_twoDLocation(
                                                            in template (present) SecLatitude p_latitude,
                                                            in template (present) SecLongitude p_longitude
garciay's avatar
garciay committed
            ) := {
                latitude    := p_latitude,
                longitude   := p_longitude
            } // End of template mw_twoDLocation
            
            /**
             * @desc Receive template for ThreeDLocation
             * @param p_latitude    Latitude range from  900 000 000 to +900 000 000
             * @param p_longitude   Longitude range from  1 800 000 000 to +1 800 000 000
             * @param p_elevation   Elevation relative to the WGS-84 ellipsoid in decimetres
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.20    ThreeDLocation
garciay's avatar
garciay committed
             */
            template (present) ThreeDLocation mw_threeDLocation(
                                                                in template (present) SecLatitude p_latitude,
                                                                in template (present) SecLongitude p_longitude,
                                                                in template (present) SecElevation p_elevation
garciay's avatar
garciay committed
            ) := {
                latitude    := p_latitude,
                longitude   := p_longitude,
                elevation   := p_elevation
            } // End of template mw_threeDLocation
            
garciay's avatar
garciay committed
            /**
             * @desc Receive template circular geographic region
             * @param p_center  Circle center 
             * @param p_radius  Circle radius
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
garciay's avatar
garciay committed
             */
            template (present) GeographicRegion mw_geographicRegion_circle(
                                                                           in template (present) TwoDLocation p_center := ?,
                                                                           in template (present) UInt16 p_radius := ?
garciay's avatar
garciay committed
            ) := {
                circularRegion := {
                    center := p_center,
                    radius := p_radius
                }
garciay's avatar
garciay committed
            } // End of template mw_geographicRegion_circle
            
            /**
             * @desc Basic receive template rectangular geographic region
             * @param p_northwest  Upper left corner 
             * @param p_southeast  Lower rigth corner
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
            template (present) GeographicRegion mw_geographicRegion_rectangular := {
                rectangularRegion := ?
            } // End of template mw_geographicRegion_rectangular
garciay's avatar
garciay committed
            /**
             * @desc Receive template polygonial geographic region
             * @param p_polygonal_region  Polygonial region description
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
garciay's avatar
garciay committed
             */
            template (present) GeographicRegion mw_geographicRegion_polygonal(
                                                                              in template (present) PolygonalRegion p_polygonal_region := ?
garciay's avatar
garciay committed
            ) := {
                polygonalRegion := p_polygonal_region
garciay's avatar
garciay committed
            } // End of template mw_geographicRegion_polygonial
            
            /**
             * @desc Receive template for geographic identified region
             * @param p_identifiedRegion  Indentified region
             * @see Draft ETSI TS 103 097 V1.3.1 Clause 4.2.21  GeographicRegion
            template (present) GeographicRegion mw_geographicRegion_identified(
                                                                               in template (present) SequenceOfIdentifiedRegion p_identifiedRegion := ?
garciay's avatar
garciay committed
            ) := {
                identifiedRegion := p_identifiedRegion
garciay's avatar
garciay committed
            } // End of template mw_geographicRegion_identifiedRegion
            
            template (present) IdentifiedRegion mw_identifiedRegion_country_only
filatov's avatar
filatov committed
            := {
                countryOnly := ?// FIXME ((all from c_iso3166Codes), (all from c_unStatsAdditionalCodes))
            template (present) IdentifiedRegion mw_identifiedRegion_country_and_region := {
                countryAndRegions := {
                    countryOnly := ?, // FIXME ((all from c_iso3166Codes), (all from c_unStatsAdditionalCodes)),
                    regions     := ?
                }
        } // End of group basicFormatElementsRecv
garciay's avatar
garciay committed
        
garciay's avatar
garciay committed
    } // End of group dummyBasicFormatElements 
    
     * @desc Send templates for security headers
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.1 EtsiTs103097Data
    group etsiTs103097Data {
         * @desc Generic send template for EtsiTs103097Data message
        template (value) EtsiTs103097Data m_etsiTs103097Data(
                                                             in template (value) Ieee1609Dot2Content p_content
        ) := {
            protocolVersion := c_protocol_version,
            content         := p_content
        } // End of template m_etsiTs103097Data
        
        template (value) EtsiTs103097Data m_etsiTs103097Data_unsecured(
                                                                       in template (value) Opaque p_unsecuredData
        ) := {
            protocolVersion := c_protocol_version,
            content         := { unsecuredData := p_unsecuredData }
        } // End of template m_secured_data_unsecured
        
        template (value) EtsiTs103097Data m_etsiTs103097Data_signed(
                                                                    in template (value) SignedData p_signedData
        ) := {
            protocolVersion := c_protocol_version,
            content         := { signedData := p_signedData }
        } // End of template m_secured_data_signed
        template (present) EtsiTs103097Data mw_etsiTs103097Data_signed(
                                                                       template (present) SignedData p_signedData := ?
        ) := {
            protocolVersion := c_protocol_version,
            content         := { signedData := p_signedData }
        } // End of template mw_secured_data_signed
        
        template (value) EtsiTs103097Data m_etsiTs103097Data_encrypted(
                                                                       in template (value) EncryptedData p_encryptedData
        ) := {
            protocolVersion := c_protocol_version,
            content         := { encryptedData := p_encryptedData }
        } // End of template m_etsiTs103097Data_encrypted
        
        template (present) EtsiTs103097Data mw_etsiTs103097Data_encrypted(
                                                                          template (present) EncryptedData p_encryptedData := ?
        ) := {
            protocolVersion := c_protocol_version,
            content         := { encryptedData := p_encryptedDat }
        } // End of template mw_etsiTs103097Data_encrypted
        
         * @desc Generic send template for EtsiTs103097Data message
        template (present) EtsiTs103097Data mw_etsiTs103097Data(
                                                                template (present) Ieee1609Dot2Content p_content := ?
        ) := {
            protocolVersion := c_protocol_version,
            content         := p_content
        } // End of template mw_etsiTs103097Data
        /**
         * @desc Generic send template for EtsiTs103097Data message
         */
        template (value) EtsiTs103097Data m_etsiTs103097Data_wrong_protocol(
                                                                            in template (value) UInt8 p_protocol_version,
                                                                            in template (value) Ieee1609Dot2Content p_content
        ) := {
            protocolVersion := c_protocol_version,
            content         := p_content
        } // End of template m_etsiTs103097Data_wrong_protocol
    } // End of group etsiTs103097Data
     * @desc Send templates for ToBeSignedData header
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 SignedData
    group signedData {
    
        template (value) SignedData m_signedData(
                                                 in template (value) HashAlgorithm p_hashId,
                                                 in template (value) ToBeSignedData p_tbsData,
                                                 in template (value) SignerIdentifier p_signer,
                                                 in template (value) Signature p_signature_      
        ) := {
            hashId     := p_hashId,
            tbsData    := p_tbsData,
            signer     := p_signer,
            signature_ := p_signature_
        } // End of template m_signedData
        
        template (present) SignedData mw_signedData(
                                                    template (present) HashAlgorithm p_hashId := ?,
                                                    template (present) ToBeSignedData p_tbsData := ?,
                                                    template (present) SignerIdentifier p_signer := ?,
                                                    template (present) Signature p_signature_ := ?     
        ) := {
            hashId     := p_hashId,
            tbsData    := p_tbsData,
            signer     := p_signer,
            signature_ := p_signature_
        } // End of template mw_signedData
        
        template (value) ToBeSignedData m_toBeSignedData(
                                                         in template (value) SignedDataPayload p_payload,
                                                         in template (value) HeaderInfo p_headerInfo      
        ) := {
            payload    := p_payload,
            headerInfo := p_headerInfo
        } // End of template m_toBeSignedData
        
        template (present) ToBeSignedData mw_toBeSignedData(
                                                            template (present) SignedDataPayload p_payload := ?,
                                                            template (present) HeaderInfo p_headerInfo := ?   
        ) := {
            payload    := p_payload,
            headerInfo := p_headerInfo
        } // End of template mw_toBeSignedData
        
        template (value) SignedDataPayload m_signedDataPayload(
                                                               in template (value) Ieee1609Dot2Data p_data
        ) := {
            data        := p_data,
            extDataHash := omit
        } // End of template m_signedDataPayload
    
        template (present) SignedDataPayload mw_signedDataPayload(
                                                                  template (present) Ieee1609Dot2Data p_data := ?
        ) := {
            data        := p_data,
            extDataHash := *
        } // End of template mw_signedDataPayload
    
        template (value) SignedDataPayload m_signedDataPayload_ext(
                                                                   in template (value) Ieee1609Dot2Data p_data,
                                                                   in template (value) Oct32 p_extDataHash
        ) := {
            data        := p_data,
            extDataHash := { sha256HashedData := p_extDataHash }
        } // End of template m_signedDataPayload_ext
    } // End of group signedData
    
    group encryptedData {
        
        template (value) EncryptedData m_encryptedData(
                                                       in template (value) SequenceOfRecipientInfo p_recipients,
                                                       in template (value) SymmetricCiphertext p_ciphertex
        ) := {
            recipients := p_recipients,
            ciphertext := p_ciphertex
        } // End of template m_encryptedData
        
        template (present) EncryptedData mw_encryptedData(
                                                          template (present) SequenceOfRecipientInfo p_recipients := ?,
                                                          template (present) SymmetricCiphertext p_ciphertex := ?
        ) := {
            recipients := p_recipients,
            ciphertext := p_ciphertex
        } // End of template mw_encryptedData
        
    } // End of group encryptedData
    
    /**
     * @desc Send/Receive templates for Payload
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
     */
    group ieee1609Dot2Data {
            
         * @desc Send template for Ieee1609Dot2Data 
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
        template (value) Ieee1609Dot2Data m_ieee1609Dot2Data(
                                                             in template (value) Ieee1609Dot2Content p_content
        ) := { 
            content := p_content
        } // End of template m_ieee1609Dot2Data
garciay's avatar
garciay committed
            
        /**
         * @desc Receive template for Ieee1609Dot2Data 
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
         */
        template (present) Ieee1609Dot2Data mw_ieee1609Dot2Data(
                                                                template (present) Ieee1609Dot2Content p_content := ?
        ) := { 
            content := p_content
        } // End of template mw_ieee1609Dot2Data
         * @desc Send template for 'unsecured' Payload 
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
        template (value) Ieee1609Dot2Content m_ieee1609Dot2Data_unsecured(
                                                                          in template (value) Opaque p_unsecuredData
        ) := {
            unsecuredData := p_unsecuredData 
        } // End of template m_ieee1609Dot2Data_unsecured
        /**
         * @desc Receive template for 'unsecured' Payload 
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
         */
        template (present) Ieee1609Dot2Content mw_ieee1609Dot2Data_unsecured(
                                                                             template (present) Opaque p_unsecuredData := ?
        ) := {
            unsecuredData := p_unsecuredData 
        } // End of template mw_ieee1609Dot2Data_unsecured
        
         * @desc Send template for 'signed' Payload 
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
        template (value) Ieee1609Dot2Content m_ieee1609Dot2Data_signed(
                                                                       in template (value) SignedData p_signedData
        ) := {
            signedData := p_signedData
        } // End of template m_ieee1609Dot2Data_signed
        
        /**
         * @desc Send template for 'signed' Payload 
         * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.2 Payload
         */
        template (present) Ieee1609Dot2Content mw_ieee1609Dot2Data_signed(
                                                                          template (present) SignedData p_signedData := ?
        ) := {
            signedData := p_signedData
        } // End of template mw_ieee1609Dot2Data_signed
        
    } // End of group ieee1609Dot2Data
    
    /**
     * @desc Send/Receive templates for HeaderInfo
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.4 HeaderInfo
     */
    group headerFields {
        
        /**
         * @desc Basic send HeaderInfo template with ETSI ITS restrction
         */
        template (omit) HeaderInfo m_ieee1609Dot2_headerInfo(
                                                             in template (value) Psid p_psid
        ) := { 
            psid                 := p_psid,
            generationTime       := omit,
            expiryTime           := omit,
            generationLocation   := omit,
            p2pcdLearningRequest := omit,
            missingCrlIdentifier := omit,
            encryptionKey        := omit,
            inlineP2pcdRequest   := omit,
            requestedCertificate := omit
        } // End of template m_ieee1609Dot2_headerInfo
         * @desc Basic receive HeaderInfo template with ETSI ITS restrction
         */
        template (present) HeaderInfo mw_ieee1609Dot2_headerInfo(
                                                                 template (present) Psid p_psid := ?
        ) := { 
            psid                 := p_psid,
            generationTime       := *,
            expiryTime           := *,
            generationLocation   := *,
            p2pcdLearningRequest := omit,
            missingCrlIdentifier := omit,
            encryptionKey        := omit,
garciay's avatar
garciay committed
            inlineP2pcdRequest   := omit,
garciay's avatar
garciay committed
            requestedCertificate := omit
        } // End of template mw_ieee1609Dot2_headerInfo
        
        /**
         * @desc Basic receive HeaderInfo template with ETSI ITS restrction
         */
        template (present) HeaderInfo mw_ieee1609Dot2_headerInfo_request_certificate(
                                                                                     template (present) Psid p_psid := ?,
                                                                                     template (present) Certificate p_requestedCertificate := ?
        ) modifies mw_ieee1609Dot2_headerInfo := { 
            psid                 := p_psid,
            generationTime       := *,
            expiryTime           := *,
            generationLocation   := *,
            p2pcdLearningRequest := omit,
            missingCrlIdentifier := omit,
            encryptionKey        := omit,
            inlineP2pcdRequest   := omit,
            requestedCertificate := p_requestedCertificate
        } // End of template mw_ieee1609Dot2_headerInfo
        
        /**
         * @desc CAM specific send HeaderInfo template with ETSI ITS restrction
         * @see Clause 7.1.1 Security profile for CAMs
        template (omit) HeaderInfo m_headerInfo_cam(
                                                    in template (value) Psid p_psid := c_its_aid_CAM,
                                                    in template (value) Time64 p_generationTime,
garciay's avatar
garciay committed
                                                    in template (omit) Time64 p_expiryTime := omit,
                                                    in template (omit) SequenceOfHashedId3 p_inlineP2pcdRequest := omit
        ) modifies m_ieee1609Dot2_headerInfo := {
            generationTime     := p_generationTime,
            expiryTime         := p_expiryTime,
garciay's avatar
garciay committed
            generationLocation := omit,
            inlineP2pcdRequest := p_inlineP2pcdRequest
        } // End of template m_headerInfo_cam
        /**
         * @desc CAM specific receive HeaderInfo template with ETSI ITS restrction
         * 
         * Clause 7.1.1 Security profile for CAMs
         */
        template (present) HeaderInfo mw_headerInfo_cam(
                                                        template (present) Psid p_psid := c_its_aid_CAM,
garciay's avatar
garciay committed
                                                        template (present) Time64 p_generationTime := ?,
                                                        template Time64 p_expiryTime := omit,
garciay's avatar
garciay committed
                                                        template SequenceOfHashedId3 p_inlineP2pcdRequest := omit,
                                                        template Certificate p_requestedCertificate := omit
        ) modifies mw_ieee1609Dot2_headerInfo := {
garciay's avatar
garciay committed
            psid                    := c_its_aid_CAM,
            generationTime          := p_generationTime,
            expiryTime              := p_expiryTime,
            generationLocation      := omit,
            inlineP2pcdRequest      := p_inlineP2pcdRequest,
            requestedCertificate    := p_requestedCertificate
        } // End of template mw_headerInfo_cam
        
         * 
         * Clause 7.1.2 Security profile for DENMs
        template (omit) HeaderInfo m_headerInfo_denm(
                                                     in template (value) Psid p_psid := c_its_aid_DENM,
                                                     in template (value) Time64 p_generationTime,
garciay's avatar
garciay committed
                                                     in template (value) ThreeDLocation p_generationLocation,
                                                     in template (omit) Time64 p_expiryTime := omit
        ) modifies mw_ieee1609Dot2_headerInfo := {
            generationTime     := p_generationTime,
            expiryTime         := p_expiryTime,
            generationLocation := p_generationLocation
        } // End of template m_headerInfo_denm
garciay's avatar
garciay committed
        /**
         * 
         * Clause 7.1.2 Security profile for DENMs
         */
        template (present) HeaderInfo mw_headerInfo_denm(
                                                         template (present) Psid p_psid := c_its_aid_DENM,
                                                         template (present) Time64 p_generationTime := ?,
                                                         template (present) ThreeDLocation p_generationLocation := ?,
                                                         template Time64 p_expiryTime := omit
        ) modifies mw_ieee1609Dot2_headerInfo := {
garciay's avatar
garciay committed
            generationTime     := p_generationTime,
            expiryTime         := p_expiryTime,
            generationLocation := p_generationLocation
        } // End of template mw_headerInfo_denm
        
         * 
         * Clause 7.1.3 Generic security profile for other signed messages
        template (omit) HeaderInfo m_headerInfo_gn(
garciay's avatar
garciay committed
                                                   in template (value) Psid p_psid := c_its_aid_GN,
                                                   in template (value) Time64 p_generationTime
        ) modifies m_ieee1609Dot2_headerInfo := {
            generationTime     := p_generationTime
        } // End of template m_headerInfo_gn
        /**
         * 
         * Clause 7.1.3 Generic security profile for other signed messages
         */
        template (present) HeaderInfo mw_headerInfo_gn(
                                                       template (present) Psid p_psid := c_its_aid_GN,
                                                       template (present) Time64 p_generationTime := ?
        ) modifies mw_ieee1609Dot2_headerInfo := {
            generationTime       := p_generationTime,
            expiryTime           := *,
            generationLocation   := *,
            encryptionKey        := *,
            inlineP2pcdRequest   := *,
            requestedCertificate := *
        } // End of template mw_headerInfo_gn
        
    } // End of group headerFields
    
    group signatures {
        template (value) Signature m_signature_ecdsaNistP256(
                                                             in template (value) EcdsaP256Signature p_ecdsaNistP256Signature
        ) := {
            ecdsaNistP256Signature := p_ecdsaNistP256Signature
        } // End of template m_signature_ecdsaNistP256
        
        template (present) Signature mw_signature_ecdsaNistP256(
                                                                template (present) EcdsaP256Signature p_ecdsaNistP256Signature := ?
        ) := {
            ecdsaNistP256Signature := p_ecdsaNistP256Signature
        } // End of template mw_signature_ecdsaNistP256
        
        template (value) Signature m_signature_ecdsaBrainpoolP256r1(
                                                                    in template (value) EcdsaP256Signature p_ecdsaBrainpoolP256r1Signature
        ) := {
            ecdsaBrainpoolP256r1Signature := p_ecdsaBrainpoolP256r1Signature
        }  // End of template m_signature_ecdsaBrainpoolP256r1
        
        template (present) Signature mw_signature_ecdsaBrainpoolP256r1(
                                                                       template (present) EcdsaP256Signature p_ecdsaBrainpoolP256r1Signature := ?
        ) := {
            ecdsaBrainpoolP256r1Signature := p_ecdsaBrainpoolP256r1Signature
        }  // End of template m_signature_ecdsaBrainpoolP256r1
        
        template (value) Signature m_signature_ecdsaBrainpoolP384r1(
                                                                    in template (value) EcdsaP384Signature p_ecdsaBrainpoolP384r1Signature
        ) := {
            ecdsaBrainpoolP384r1Signature := p_ecdsaBrainpoolP384r1Signature
        } // End of template m_signature_ecdsaBrainpoolP384r1
        
        template (present) Signature mw_signature_ecdsaBrainpoolP384r1(
                                                                       template (present) EcdsaP384Signature p_ecdsaBrainpoolP384r1Signature := ?
        ) := {
            ecdsaBrainpoolP384r1Signature := p_ecdsaBrainpoolP384r1Signature
        } // End of template mw_signature_ecdsaBrainpoolP384r1
        
        template (value) EcdsaP256Signature m_ecdsaP256Signature(
                                                                 in template (value) EccP256CurvePoint p_rSig,
                                                                 in template (value) Oct32 p_sSig
        ) := {
            rSig := p_rSig,
            sSig := p_sSig
        } // End of template m_ecdsaP256Signature
        template (present) EcdsaP256Signature mw_ecdsaP256Signature(
                                                                    template (present) EccP256CurvePoint p_rSig := ?,
                                                                    template (present) Oct32 p_sSig := ?
        ) := {
            rSig := p_rSig,
            sSig := p_sSig
        } // End of template mw_ecdsaP256Signature
        template (value) EcdsaP384Signature m_ecdsaP384Signature(
                                                                 in template (value) EccP384CurvePoint p_rSig,
                                                                 in template (value) Oct48 p_sSig
        ) := {
            rSig := p_rSig,
            sSig := p_sSig
        } // End of template m_ecdsaP384Signature
        template (present) EcdsaP384Signature mw_ecdsaP384Signature(
                                                                    template (present) EccP384CurvePoint p_rSig := ?,
                                                                    template (present) Oct48 p_sSig := ?
        ) := {
            rSig := p_rSig,
            sSig := p_sSig
        } // End of template mw_ecdsaP384Signature
        
        template (value) EccP256CurvePoint m_eccP256CurvePoint_x_only(
                                                                      in template (value) Oct32 p_x_only
        ) := {
            x_only := p_x_only