LibItsSecurity_Templates.ttcn 107 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 {
            
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
        
        /**
         * @desc Generic receive 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
        
        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_encryptedData }
        } // End of template mw_etsiTs103097Data_encrypted
        
        /**
         * @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) Oct32 p_extDataHash
        ) := {
            data        := omit,
            extDataHash := { sha256HashedData := p_extDataHash }
        } // End of template m_signedDataPayload_ext
    } // End of group signedData
    
    /**
     * @desc Send templates for ToBeSignedData header
     * @see Draft ETSI TS 103 097 V1.3.1 Clause 5.3 EncryptedData
     */
    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
        
        template (value) RecipientInfo m_recipientInfo_pskRecipInfo(
                                                                    in template (value) PreSharedKeyRecipientInfo p_pskRecipInfo
        ) := {
            pskRecipInfo := p_pskRecipInfo
        } // End of template m_recipientInfo_pskRecipInfo
        
        template (present) RecipientInfo mw_recipientInfo_pskRecipInfo(
                                                                       template (present) PreSharedKeyRecipientInfo p_pskRecipInfo := ?
        ) := {
            pskRecipInfo := p_pskRecipInfo
        } // End of template mw_recipientInfo_pskRecipInfo
        
        template (value) RecipientInfo m_recipientInfo_symmRecipInfo(
                                                                     in template (value) SymmRecipientInfo p_symmRecipInfo
        ) := {
            symmRecipInfo := p_symmRecipInfo
        } // End of template m_recipientInfo_symmRecipInfo
        
        template (value) RecipientInfo m_recipientInfo_certRecipInfo(
                                                                     in template (value) PKRecipientInfo p_certRecipInfo
        ) := {
            certRecipInfo := p_certRecipInfo
        } // End of template m_recipientInfo_certRecipInfo
        
        template (present) RecipientInfo mw_recipientInfo_certRecipInfo(
                                                                        template (present) PKRecipientInfo p_certRecipInfo := ?
        ) := {
            certRecipInfo := p_certRecipInfo
        } // End of template mw_recipientInfo_certRecipInfo
        
        template (value) RecipientInfo m_recipientInfo_signedDataRecipInfo(
                                                                           in template (value) PKRecipientInfo p_signedDataRecipInfo
        ) := {
            signedDataRecipInfo := p_signedDataRecipInfo
        } // End of template m_recipientInfo_signedDataRecipInfo
        
        template (value) RecipientInfo m_recipientInfo_rekRecipInfo(
                                                                    in template (value) PKRecipientInfo p_rekRecipInfo
        ) := {
            rekRecipInfo := p_rekRecipInfo
        } // End of template m_recipientInfo_rekRecipInfo
                
        template (value) PKRecipientInfo m_pKRecipientInfo(
                                                           in template (value) HashedId8 p_recipientId,
                                                           in template (value) EncryptedDataEncryptionKey p_encKey
        ) := { 
            recipientId := p_recipientId, 
            encKey      := p_encKey
        } // End of template m_pKRecipientInfo
        
        template (present) PKRecipientInfo mw_pKRecipientInfo(
                                                              template (present) HashedId8 p_recipientId := ?, 
                                                              template (present) EncryptedDataEncryptionKey p_encKey := ?
        ) := { 
            recipientId := p_recipientId, 
            encKey      := p_encKey
        } // End of template mw_pKRecipientInfo
        
        template (value) EciesP256EncryptedKey m_evciesP256EncryptedKey(
                                                                        in template (value) EccP256CurvePoint p_v,
                                                                        in template (value) Oct16 p_c,
                                                                        in template (value) Oct16 p_t
        ) :={
            v := p_v,
            c := p_c,
            t := p_t
        } // End of template m_evciesP256EncryptedKey
        
        template (present) EciesP256EncryptedKey mw_evciesP256EncryptedKey(
                                                                           template (present) EccP256CurvePoint p_v := ?,
                                                                           template (present) Oct16 p_c := ?,
                                                                           template (present) Oct16 p_t := ?
        ) :={
            v := p_v,
            c := p_c,
            t := p_t
        } // End of template mw_evciesP256EncryptedKey
        
        template (value) EncryptedDataEncryptionKey m_encryptedDataEncryptionKey_eciesNistP256(
                                                                                               in template (value) EciesP256EncryptedKey p_eciesNistP256
        ) := { 
            eciesNistP256 := p_eciesNistP256
        } // End of template m_encryptedDataEncryptionKey_eciesNistP256
        
        template (present) EncryptedDataEncryptionKey mw_encryptedDataEncryptionKey_eciesNistP256(
                                                                                                  template (present) EciesP256EncryptedKey p_eciesNistP256 := ?
        ) := { 
            eciesNistP256 := p_eciesNistP256
        } // End of template mw_encryptedDataEncryptionKey_eciesNistP256
        
        template (value) EncryptedDataEncryptionKey m_encryptedDataEncryptionKey_eciesBrainpoolP256r1(
                                                                                                      in template (value) EciesP256EncryptedKey p_eciesBrainpoolP256r1
        ) := { 
            eciesBrainpoolP256r1 := p_eciesBrainpoolP256r1
        } // End of template m_encryptedDataEncryptionKey_eciesBrainpoolP256r1
        
        template (present) EncryptedDataEncryptionKey mw_encryptedDataEncryptionKey_eciesBrainpoolP256r1(
                                                                                                         template (present) EciesP256EncryptedKey p_eciesBrainpoolP256r1 := ?
        ) := { 
            eciesBrainpoolP256r1 := p_eciesBrainpoolP256r1
        } // End of template mw_encryptedDataEncryptionKey_eciesBrainpoolP256r1
        
        template (value) SymmetricCiphertext m_SymmetricCiphertext_aes128ccm(
                                                                             in template (value) AesCcmCiphertext p_aes128ccm
        ) := {
            aes128ccm := p_aes128ccm
        } // End of template m_SymmetricCiphertext_aes128ccm
        
        template (present) SymmetricCiphertext mw_SymmetricCiphertext_aes128ccm(
                                                                                template (present) AesCcmCiphertext p_aes128ccm := ?
        ) := {
            aes128ccm := p_aes128ccm
        } // End of template mw_SymmetricCiphertext_aes128ccm

        template (value) AesCcmCiphertext m_aesCcmCiphertext(
                                                             in template (value) Oct12 p_nonce,
                                                             in template (value) Opaque p_ccmCiphertext
        ) := {
            nonce         := p_nonce,
            ccmCiphertext := p_ccmCiphertext
        } // End of template m_aesCcmCiphertext
        
        template (present) AesCcmCiphertext mw_aesCcmCiphertext(
                                                                template (present) Oct12 p_nonce := ?,
                                                                template (present) Opaque p_ccmCiphertext := ?
        ) := {
            nonce         := p_nonce,
            ccmCiphertext := p_ccmCiphertext
        } // End of template mw_aesCcmCiphertext
        
    } // 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 := ?,
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              := omit,
garciay's avatar
garciay committed
            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 m_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
         */