IEEE1609.2: Allow Service Specific Permissions dissection
[metze/wireshark/wip.git] / epan / dissectors / packet-ieee1609dot2.c
1 /* Do not modify this file. Changes will be overwritten.                      */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler       */
3 /* packet-ieee1609dot2.c                                                      */
4 /* asn2wrs.py -p ieee1609dot2 -c ./ieee1609dot2.cnf -s ./packet-ieee1609dot2-template -D . -O ../.. IEEE1609dot2BaseTypes.asn IEEE1609dot2DataTypes.asn IEEE1609dot12.asn */
5
6 /* Input file: packet-ieee1609dot2-template.c */
7
8 #line 1 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
9 /* packet-IEEE1609dot2.c
10  * Routines for IEEE 1609.2
11  * Copyright 2018, Anders Broman <anders.broman@ericsson.com>
12  *
13  * Wireshark - Network traffic analyzer
14  * By Gerald Combs <gerald@wireshark.org>
15  * Copyright 1998 Gerald Combs
16  *
17  * SPDX-License-Identifier: GPL-2.0-or-later
18  */
19
20 /* Also contains IEEE std 1609.12
21  * section 4.1.3 PSID allocations
22  */
23
24 #include "config.h"
25
26 #include <epan/packet.h>
27 #include <epan/conversation.h>
28 #include <epan/oids.h>
29 #include <epan/asn1.h>
30 #include <epan/proto_data.h>
31
32 #include "packet-oer.h"
33 #include "packet-ieee1609dot2.h"
34
35 #define PNAME  "IEEE1609dot2"
36 #define PSNAME "IEEE1609dot2"
37 #define PFNAME "ieee1609dot2"
38
39 void proto_register_ieee1609dot2(void);
40 void proto_reg_handoff_ieee1609dot2(void);
41
42 /* Initialize the protocol and registered fields */
43 int proto_ieee1609dot2 = -1;
44
45 /*--- Included file: packet-ieee1609dot2-hf.c ---*/
46 #line 1 "./asn1/ieee1609dot2/packet-ieee1609dot2-hf.c"
47 static int hf_ieee1609dot2_Ieee1609Dot2Data_PDU = -1;  /* Ieee1609Dot2Data */
48 static int hf_ieee1609dot2_SequenceOfUint8_item = -1;  /* Uint8 */
49 static int hf_ieee1609dot2_SequenceOfUint16_item = -1;  /* Uint16 */
50 static int hf_ieee1609dot2_start = -1;            /* Time32 */
51 static int hf_ieee1609dot2_duration = -1;         /* Duration */
52 static int hf_ieee1609dot2_microseconds = -1;     /* Uint16 */
53 static int hf_ieee1609dot2_milliseconds = -1;     /* Uint16 */
54 static int hf_ieee1609dot2_seconds = -1;          /* Uint16 */
55 static int hf_ieee1609dot2_minutes = -1;          /* Uint16 */
56 static int hf_ieee1609dot2_hours = -1;            /* Uint16 */
57 static int hf_ieee1609dot2_sixtyHours = -1;       /* Uint16 */
58 static int hf_ieee1609dot2_years = -1;            /* Uint16 */
59 static int hf_ieee1609dot2_circularRegion = -1;   /* CircularRegion */
60 static int hf_ieee1609dot2_rectangularRegion = -1;  /* SequenceOfRectangularRegion */
61 static int hf_ieee1609dot2_polygonalRegion = -1;  /* PolygonalRegion */
62 static int hf_ieee1609dot2_identifiedRegion = -1;  /* SequenceOfIdentifiedRegion */
63 static int hf_ieee1609dot2_center = -1;           /* TwoDLocation */
64 static int hf_ieee1609dot2_radius = -1;           /* Uint16 */
65 static int hf_ieee1609dot2_northWest = -1;        /* TwoDLocation */
66 static int hf_ieee1609dot2_southEast = -1;        /* TwoDLocation */
67 static int hf_ieee1609dot2_SequenceOfRectangularRegion_item = -1;  /* RectangularRegion */
68 static int hf_ieee1609dot2_PolygonalRegion_item = -1;  /* TwoDLocation */
69 static int hf_ieee1609dot2_latitude = -1;         /* Latitude */
70 static int hf_ieee1609dot2_longitude = -1;        /* Longitude */
71 static int hf_ieee1609dot2_countryOnly = -1;      /* CountryOnly */
72 static int hf_ieee1609dot2_countryAndRegions = -1;  /* CountryAndRegions */
73 static int hf_ieee1609dot2_countryAndSubregions = -1;  /* CountryAndSubregions */
74 static int hf_ieee1609dot2_SequenceOfIdentifiedRegion_item = -1;  /* IdentifiedRegion */
75 static int hf_ieee1609dot2_regions = -1;          /* SequenceOfUint8 */
76 static int hf_ieee1609dot2_country = -1;          /* CountryOnly */
77 static int hf_ieee1609dot2_regionAndSubregions = -1;  /* SequenceOfRegionAndSubregions */
78 static int hf_ieee1609dot2_region = -1;           /* Uint8 */
79 static int hf_ieee1609dot2_subregions = -1;       /* SequenceOfUint16 */
80 static int hf_ieee1609dot2_SequenceOfRegionAndSubregions_item = -1;  /* RegionAndSubregions */
81 static int hf_ieee1609dot2_elevation = -1;        /* Elevation */
82 static int hf_ieee1609dot2_ecdsaNistP256Signature = -1;  /* EcdsaP256Signature */
83 static int hf_ieee1609dot2_ecdsaBrainpoolP256r1Signature = -1;  /* EcdsaP256Signature */
84 static int hf_ieee1609dot2_r = -1;                /* EccP256CurvePoint */
85 static int hf_ieee1609dot2_s = -1;                /* OCTET_STRING_SIZE_32 */
86 static int hf_ieee1609dot2_x_only = -1;           /* OCTET_STRING_SIZE_32 */
87 static int hf_ieee1609dot2_fill = -1;             /* NULL */
88 static int hf_ieee1609dot2_compressed_y_0 = -1;   /* OCTET_STRING_SIZE_32 */
89 static int hf_ieee1609dot2_compressed_y_1 = -1;   /* OCTET_STRING_SIZE_32 */
90 static int hf_ieee1609dot2_uncompressed = -1;     /* T_uncompressed */
91 static int hf_ieee1609dot2_x = -1;                /* OCTET_STRING_SIZE_32 */
92 static int hf_ieee1609dot2_y = -1;                /* OCTET_STRING_SIZE_32 */
93 static int hf_ieee1609dot2_v = -1;                /* EccP256CurvePoint */
94 static int hf_ieee1609dot2_c = -1;                /* OCTET_STRING_SIZE_16 */
95 static int hf_ieee1609dot2_t = -1;                /* OCTET_STRING_SIZE_16 */
96 static int hf_ieee1609dot2_public = -1;           /* PublicEncryptionKey */
97 static int hf_ieee1609dot2_symmetric = -1;        /* SymmetricEncryptionKey */
98 static int hf_ieee1609dot2_supportedSymmAlg = -1;  /* SymmAlgorithm */
99 static int hf_ieee1609dot2_publicKey = -1;        /* BasePublicEncryptionKey */
100 static int hf_ieee1609dot2_eciesNistP256 = -1;    /* EccP256CurvePoint */
101 static int hf_ieee1609dot2_eciesBrainpoolP256r1 = -1;  /* EccP256CurvePoint */
102 static int hf_ieee1609dot2_ecdsaNistP256 = -1;    /* EccP256CurvePoint */
103 static int hf_ieee1609dot2_ecdsaBrainpoolP256r1 = -1;  /* EccP256CurvePoint */
104 static int hf_ieee1609dot2_aes128Ccm = -1;        /* OCTET_STRING_SIZE_16 */
105 static int hf_ieee1609dot2_psid = -1;             /* T_psid */
106 static int hf_ieee1609dot2_ssp = -1;              /* ServiceSpecificPermissions */
107 static int hf_ieee1609dot2_SequenceOfPsidSsp_item = -1;  /* PsidSsp */
108 static int hf_ieee1609dot2_opaque = -1;           /* T_opaque */
109 static int hf_ieee1609dot2_psid_01 = -1;          /* Psid */
110 static int hf_ieee1609dot2_sspRange = -1;         /* SspRange */
111 static int hf_ieee1609dot2_SequenceOfPsidSspRange_item = -1;  /* PsidSspRange */
112 static int hf_ieee1609dot2_opaque_01 = -1;        /* SequenceOfOctetString */
113 static int hf_ieee1609dot2_all = -1;              /* NULL */
114 static int hf_ieee1609dot2_SequenceOfOctetString_item = -1;  /* OCTET_STRING_SIZE_0_MAX */
115 static int hf_ieee1609dot2_jValue = -1;           /* OCTET_STRING_SIZE_4 */
116 static int hf_ieee1609dot2_value = -1;            /* OCTET_STRING_SIZE_9 */
117 static int hf_ieee1609dot2_data = -1;             /* Ieee1609Dot2Data */
118 static int hf_ieee1609dot2_extDataHash = -1;      /* HashedData */
119 static int hf_ieee1609dot2_protocolVersion = -1;  /* Uint8 */
120 static int hf_ieee1609dot2_content = -1;          /* Ieee1609Dot2Content */
121 static int hf_ieee1609dot2_unsecuredData = -1;    /* T_unsecuredData */
122 static int hf_ieee1609dot2_signedData = -1;       /* SignedData */
123 static int hf_ieee1609dot2_encryptedData = -1;    /* EncryptedData */
124 static int hf_ieee1609dot2_signedCertificateRequest = -1;  /* Opaque */
125 static int hf_ieee1609dot2_hashId = -1;           /* HashAlgorithm */
126 static int hf_ieee1609dot2_tbsData = -1;          /* ToBeSignedData */
127 static int hf_ieee1609dot2_signer = -1;           /* SignerIdentifier */
128 static int hf_ieee1609dot2_signature = -1;        /* Signature */
129 static int hf_ieee1609dot2_digest = -1;           /* HashedId8 */
130 static int hf_ieee1609dot2_certificate = -1;      /* SequenceOfCertificate */
131 static int hf_ieee1609dot2_self = -1;             /* NULL */
132 static int hf_ieee1609dot2_payload = -1;          /* SignedDataPayload */
133 static int hf_ieee1609dot2_headerInfo = -1;       /* HeaderInfo */
134 static int hf_ieee1609dot2_sha256HashedData = -1;  /* OCTET_STRING_SIZE_32 */
135 static int hf_ieee1609dot2_psid_02 = -1;          /* T_psid_01 */
136 static int hf_ieee1609dot2_generationTime = -1;   /* Time64 */
137 static int hf_ieee1609dot2_expiryTime = -1;       /* Time64 */
138 static int hf_ieee1609dot2_generationLocation = -1;  /* ThreeDLocation */
139 static int hf_ieee1609dot2_p2pcdLearningRequest = -1;  /* HashedId3 */
140 static int hf_ieee1609dot2_missingCrlIdentifier = -1;  /* MissingCrlIdentifier */
141 static int hf_ieee1609dot2_encryptionKey = -1;    /* EncryptionKey */
142 static int hf_ieee1609dot2_cracaId = -1;          /* HashedId3 */
143 static int hf_ieee1609dot2_crlSeries = -1;        /* CrlSeries */
144 static int hf_ieee1609dot2_recipients = -1;       /* SequenceOfRecipientInfo */
145 static int hf_ieee1609dot2_ciphertext = -1;       /* SymmetricCiphertext */
146 static int hf_ieee1609dot2_pskRecipInfo = -1;     /* PreSharedKeyRecipientInfo */
147 static int hf_ieee1609dot2_symmRecipInfo = -1;    /* SymmRecipientInfo */
148 static int hf_ieee1609dot2_certRecipInfo = -1;    /* PKRecipientInfo */
149 static int hf_ieee1609dot2_signedDataRecipInfo = -1;  /* PKRecipientInfo */
150 static int hf_ieee1609dot2_rekRecipInfo = -1;     /* PKRecipientInfo */
151 static int hf_ieee1609dot2_SequenceOfRecipientInfo_item = -1;  /* RecipientInfo */
152 static int hf_ieee1609dot2_recipientId = -1;      /* HashedId8 */
153 static int hf_ieee1609dot2_encKey = -1;           /* SymmetricCiphertext */
154 static int hf_ieee1609dot2_encKey_01 = -1;        /* EncryptedDataEncryptionKey */
155 static int hf_ieee1609dot2_eciesNistP256_01 = -1;  /* EciesP256EncryptedKey */
156 static int hf_ieee1609dot2_eciesBrainpoolP256r1_01 = -1;  /* EciesP256EncryptedKey */
157 static int hf_ieee1609dot2_aes128ccm = -1;        /* AesCcmCiphertext */
158 static int hf_ieee1609dot2_nonce = -1;            /* OCTET_STRING_SIZE_12 */
159 static int hf_ieee1609dot2_ccmCiphertext = -1;    /* Opaque */
160 static int hf_ieee1609dot2_SequenceOfCertificate_item = -1;  /* Certificate */
161 static int hf_ieee1609dot2_version = -1;          /* Uint8 */
162 static int hf_ieee1609dot2_type = -1;             /* CertificateType */
163 static int hf_ieee1609dot2_issuer = -1;           /* IssuerIdentifier */
164 static int hf_ieee1609dot2_toBeSigned = -1;       /* ToBeSignedCertificate */
165 static int hf_ieee1609dot2_sha256AndDigest = -1;  /* HashedId8 */
166 static int hf_ieee1609dot2_self_01 = -1;          /* HashAlgorithm */
167 static int hf_ieee1609dot2_id = -1;               /* CertificateId */
168 static int hf_ieee1609dot2_validityPeriod = -1;   /* ValidityPeriod */
169 static int hf_ieee1609dot2_region_01 = -1;        /* GeographicRegion */
170 static int hf_ieee1609dot2_assuranceLevel = -1;   /* SubjectAssurance */
171 static int hf_ieee1609dot2_appPermissions = -1;   /* SequenceOfPsidSsp */
172 static int hf_ieee1609dot2_certIssuePermissions = -1;  /* SequenceOfPsidGroupPermissions */
173 static int hf_ieee1609dot2_certRequestPermissions = -1;  /* SequenceOfPsidGroupPermissions */
174 static int hf_ieee1609dot2_canRequestRollover = -1;  /* NULL */
175 static int hf_ieee1609dot2_encryptionKey_01 = -1;  /* PublicEncryptionKey */
176 static int hf_ieee1609dot2_verifyKeyIndicator = -1;  /* VerificationKeyIndicator */
177 static int hf_ieee1609dot2_linkageData = -1;      /* LinkageData */
178 static int hf_ieee1609dot2_name = -1;             /* Hostname */
179 static int hf_ieee1609dot2_binaryId = -1;         /* OCTET_STRING_SIZE_1_64 */
180 static int hf_ieee1609dot2_none = -1;             /* NULL */
181 static int hf_ieee1609dot2_iCert = -1;            /* IValue */
182 static int hf_ieee1609dot2_linkage_value = -1;    /* LinkageValue */
183 static int hf_ieee1609dot2_group_linkage_value = -1;  /* GroupLinkageValue */
184 static int hf_ieee1609dot2_appPermissions_01 = -1;  /* SubjectPermissions */
185 static int hf_ieee1609dot2_minChainDepth = -1;    /* INTEGER */
186 static int hf_ieee1609dot2_chainDepthRange = -1;  /* INTEGER */
187 static int hf_ieee1609dot2_eeType = -1;           /* EndEntityType */
188 static int hf_ieee1609dot2_SequenceOfPsidGroupPermissions_item = -1;  /* PsidGroupPermissions */
189 static int hf_ieee1609dot2_explicit = -1;         /* SequenceOfPsidSspRange */
190 static int hf_ieee1609dot2_verificationKey = -1;  /* PublicVerificationKey */
191 static int hf_ieee1609dot2_reconstructionValue = -1;  /* EccP256CurvePoint */
192 /* named bits */
193 static int hf_ieee1609dot2_EndEntityType_app = -1;
194 static int hf_ieee1609dot2_EndEntityType_enrol = -1;
195
196 /*--- End of included file: packet-ieee1609dot2-hf.c ---*/
197 #line 37 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
198
199 /* Initialize the subtree pointers */
200 static int ett_ieee1609dot2_ssp = -1;
201
202 /*--- Included file: packet-ieee1609dot2-ett.c ---*/
203 #line 1 "./asn1/ieee1609dot2/packet-ieee1609dot2-ett.c"
204 static gint ett_ieee1609dot2_SequenceOfUint8 = -1;
205 static gint ett_ieee1609dot2_SequenceOfUint16 = -1;
206 static gint ett_ieee1609dot2_ValidityPeriod = -1;
207 static gint ett_ieee1609dot2_Duration = -1;
208 static gint ett_ieee1609dot2_GeographicRegion = -1;
209 static gint ett_ieee1609dot2_CircularRegion = -1;
210 static gint ett_ieee1609dot2_RectangularRegion = -1;
211 static gint ett_ieee1609dot2_SequenceOfRectangularRegion = -1;
212 static gint ett_ieee1609dot2_PolygonalRegion = -1;
213 static gint ett_ieee1609dot2_TwoDLocation = -1;
214 static gint ett_ieee1609dot2_IdentifiedRegion = -1;
215 static gint ett_ieee1609dot2_SequenceOfIdentifiedRegion = -1;
216 static gint ett_ieee1609dot2_CountryAndRegions = -1;
217 static gint ett_ieee1609dot2_CountryAndSubregions = -1;
218 static gint ett_ieee1609dot2_RegionAndSubregions = -1;
219 static gint ett_ieee1609dot2_SequenceOfRegionAndSubregions = -1;
220 static gint ett_ieee1609dot2_ThreeDLocation = -1;
221 static gint ett_ieee1609dot2_Signature = -1;
222 static gint ett_ieee1609dot2_EcdsaP256Signature = -1;
223 static gint ett_ieee1609dot2_EccP256CurvePoint = -1;
224 static gint ett_ieee1609dot2_T_uncompressed = -1;
225 static gint ett_ieee1609dot2_EciesP256EncryptedKey = -1;
226 static gint ett_ieee1609dot2_EncryptionKey = -1;
227 static gint ett_ieee1609dot2_PublicEncryptionKey = -1;
228 static gint ett_ieee1609dot2_BasePublicEncryptionKey = -1;
229 static gint ett_ieee1609dot2_PublicVerificationKey = -1;
230 static gint ett_ieee1609dot2_SymmetricEncryptionKey = -1;
231 static gint ett_ieee1609dot2_PsidSsp = -1;
232 static gint ett_ieee1609dot2_SequenceOfPsidSsp = -1;
233 static gint ett_ieee1609dot2_ServiceSpecificPermissions = -1;
234 static gint ett_ieee1609dot2_PsidSspRange = -1;
235 static gint ett_ieee1609dot2_SequenceOfPsidSspRange = -1;
236 static gint ett_ieee1609dot2_SspRange = -1;
237 static gint ett_ieee1609dot2_SequenceOfOctetString = -1;
238 static gint ett_ieee1609dot2_GroupLinkageValue = -1;
239 static gint ett_ieee1609dot2_SignedDataPayload = -1;
240 static gint ett_ieee1609dot2_Ieee1609Dot2Data = -1;
241 static gint ett_ieee1609dot2_Ieee1609Dot2Content = -1;
242 static gint ett_ieee1609dot2_SignedData = -1;
243 static gint ett_ieee1609dot2_SignerIdentifier = -1;
244 static gint ett_ieee1609dot2_ToBeSignedData = -1;
245 static gint ett_ieee1609dot2_HashedData = -1;
246 static gint ett_ieee1609dot2_HeaderInfo = -1;
247 static gint ett_ieee1609dot2_MissingCrlIdentifier = -1;
248 static gint ett_ieee1609dot2_EncryptedData = -1;
249 static gint ett_ieee1609dot2_RecipientInfo = -1;
250 static gint ett_ieee1609dot2_SequenceOfRecipientInfo = -1;
251 static gint ett_ieee1609dot2_SymmRecipientInfo = -1;
252 static gint ett_ieee1609dot2_PKRecipientInfo = -1;
253 static gint ett_ieee1609dot2_EncryptedDataEncryptionKey = -1;
254 static gint ett_ieee1609dot2_SymmetricCiphertext = -1;
255 static gint ett_ieee1609dot2_AesCcmCiphertext = -1;
256 static gint ett_ieee1609dot2_SequenceOfCertificate = -1;
257 static gint ett_ieee1609dot2_CertificateBase = -1;
258 static gint ett_ieee1609dot2_IssuerIdentifier = -1;
259 static gint ett_ieee1609dot2_ToBeSignedCertificate = -1;
260 static gint ett_ieee1609dot2_CertificateId = -1;
261 static gint ett_ieee1609dot2_LinkageData = -1;
262 static gint ett_ieee1609dot2_EndEntityType = -1;
263 static gint ett_ieee1609dot2_PsidGroupPermissions = -1;
264 static gint ett_ieee1609dot2_SequenceOfPsidGroupPermissions = -1;
265 static gint ett_ieee1609dot2_SubjectPermissions = -1;
266 static gint ett_ieee1609dot2_VerificationKeyIndicator = -1;
267
268 /*--- End of included file: packet-ieee1609dot2-ett.c ---*/
269 #line 41 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
270
271 static dissector_table_t unsecured_data_subdissector_table;
272 static dissector_table_t ssp_subdissector_table;
273
274 typedef struct ieee1609_private_data {
275   tvbuff_t *unsecured_data;
276   guint64 psidssp; // psid for Service Specific Permissions
277 } ieee1609_private_data_t;
278
279 void
280 ieee1609dot2_set_next_default_psid(packet_info *pinfo, guint32 psid)
281 {
282   guint32 *ctxt = wmem_new0(wmem_file_scope(), guint32);
283   *ctxt = psid;
284   p_add_proto_data(wmem_file_scope(), pinfo, proto_ieee1609dot2, 0, (void*)ctxt);
285 }
286
287
288 /*--- Included file: packet-ieee1609dot2-fn.c ---*/
289 #line 1 "./asn1/ieee1609dot2/packet-ieee1609dot2-fn.c"
290 /*--- Cyclic dependencies ---*/
291
292 /* SignedDataPayload -> Ieee1609Dot2Data -> Ieee1609Dot2Content -> SignedData -> ToBeSignedData -> SignedDataPayload */
293 static int dissect_ieee1609dot2_SignedDataPayload(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
294
295
296
297
298 static int
299 dissect_ieee1609dot2_Uint8(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
300   offset = dissect_oer_constrained_integer(tvb, offset, actx, tree, hf_index,
301                                                             0U, 255U, NULL, FALSE);
302
303   return offset;
304 }
305
306
307
308 static int
309 dissect_ieee1609dot2_Uint16(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
310   offset = dissect_oer_constrained_integer(tvb, offset, actx, tree, hf_index,
311                                                             0U, 65535U, NULL, FALSE);
312
313   return offset;
314 }
315
316
317
318 static int
319 dissect_ieee1609dot2_Uint32(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
320   offset = dissect_oer_constrained_integer(tvb, offset, actx, tree, hf_index,
321                                                             0U, 4294967295U, NULL, FALSE);
322
323   return offset;
324 }
325
326
327
328 static int
329 dissect_ieee1609dot2_Uint64(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
330   offset = dissect_oer_constrained_integer_64b(tvb, offset, actx, tree, hf_index,
331                                                             0U, G_GUINT64_CONSTANT(18446744073709551615), NULL, FALSE);
332
333   return offset;
334 }
335
336
337 static const oer_sequence_t SequenceOfUint8_sequence_of[1] = {
338   { &hf_ieee1609dot2_SequenceOfUint8_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Uint8 },
339 };
340
341 static int
342 dissect_ieee1609dot2_SequenceOfUint8(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
343   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
344                                       ett_ieee1609dot2_SequenceOfUint8, SequenceOfUint8_sequence_of);
345
346   return offset;
347 }
348
349
350 static const oer_sequence_t SequenceOfUint16_sequence_of[1] = {
351   { &hf_ieee1609dot2_SequenceOfUint16_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Uint16 },
352 };
353
354 static int
355 dissect_ieee1609dot2_SequenceOfUint16(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
356   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
357                                       ett_ieee1609dot2_SequenceOfUint16, SequenceOfUint16_sequence_of);
358
359   return offset;
360 }
361
362
363
364 static int
365 dissect_ieee1609dot2_Opaque(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
366   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
367                                        NO_BOUND, NO_BOUND, FALSE, NULL);
368
369   return offset;
370 }
371
372
373
374 static int
375 dissect_ieee1609dot2_HashedId8(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
376   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
377                                        8, 8, FALSE, NULL);
378
379   return offset;
380 }
381
382
383
384 static int
385 dissect_ieee1609dot2_HashedId3(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
386   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
387                                        3, 3, FALSE, NULL);
388
389   return offset;
390 }
391
392
393
394 static int
395 dissect_ieee1609dot2_Time32(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
396   offset = dissect_ieee1609dot2_Uint32(tvb, offset, actx, tree, hf_index);
397
398   return offset;
399 }
400
401
402
403 static int
404 dissect_ieee1609dot2_Time64(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
405   offset = dissect_ieee1609dot2_Uint64(tvb, offset, actx, tree, hf_index);
406
407   return offset;
408 }
409
410
411 static const value_string ieee1609dot2_Duration_vals[] = {
412   {   0, "microseconds" },
413   {   1, "milliseconds" },
414   {   2, "seconds" },
415   {   3, "minutes" },
416   {   4, "hours" },
417   {   5, "sixtyHours" },
418   {   6, "years" },
419   { 0, NULL }
420 };
421
422 static const oer_choice_t Duration_choice[] = {
423   {   0, &hf_ieee1609dot2_microseconds, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
424   {   1, &hf_ieee1609dot2_milliseconds, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
425   {   2, &hf_ieee1609dot2_seconds, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
426   {   3, &hf_ieee1609dot2_minutes, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
427   {   4, &hf_ieee1609dot2_hours  , ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
428   {   5, &hf_ieee1609dot2_sixtyHours, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
429   {   6, &hf_ieee1609dot2_years  , ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_Uint16 },
430   { 0, NULL, 0, NULL }
431 };
432
433 static int
434 dissect_ieee1609dot2_Duration(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
435   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
436                                  ett_ieee1609dot2_Duration, Duration_choice,
437                                  NULL);
438
439   return offset;
440 }
441
442
443 static const oer_sequence_t ValidityPeriod_sequence[] = {
444   { &hf_ieee1609dot2_start  , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Time32 },
445   { &hf_ieee1609dot2_duration, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Duration },
446   { NULL, 0, 0, NULL }
447 };
448
449 static int
450 dissect_ieee1609dot2_ValidityPeriod(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
451   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
452                                    ett_ieee1609dot2_ValidityPeriod, ValidityPeriod_sequence);
453
454   return offset;
455 }
456
457
458 static const value_string ieee1609dot2_NinetyDegreeInt_vals[] = {
459   { -900000000, "min" },
460   { 900000000, "max" },
461   { 900000001, "unknown" },
462   { 0, NULL }
463 };
464
465
466 static int
467 dissect_ieee1609dot2_NinetyDegreeInt(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
468   offset = dissect_oer_constrained_integer(tvb, offset, actx, tree, hf_index,
469                                                             -900000000, 900000001U, NULL, FALSE);
470
471   return offset;
472 }
473
474
475
476 static int
477 dissect_ieee1609dot2_Latitude(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
478   offset = dissect_ieee1609dot2_NinetyDegreeInt(tvb, offset, actx, tree, hf_index);
479
480   return offset;
481 }
482
483
484 static const value_string ieee1609dot2_OneEightyDegreeInt_vals[] = {
485   { -1799999999, "min" },
486   { 1800000000, "max" },
487   { 1800000001, "unknown" },
488   { 0, NULL }
489 };
490
491
492 static int
493 dissect_ieee1609dot2_OneEightyDegreeInt(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
494   offset = dissect_oer_constrained_integer(tvb, offset, actx, tree, hf_index,
495                                                             -1799999999, 1800000001U, NULL, FALSE);
496
497   return offset;
498 }
499
500
501
502 static int
503 dissect_ieee1609dot2_Longitude(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
504   offset = dissect_ieee1609dot2_OneEightyDegreeInt(tvb, offset, actx, tree, hf_index);
505
506   return offset;
507 }
508
509
510 static const oer_sequence_t TwoDLocation_sequence[] = {
511   { &hf_ieee1609dot2_latitude, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Latitude },
512   { &hf_ieee1609dot2_longitude, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Longitude },
513   { NULL, 0, 0, NULL }
514 };
515
516 static int
517 dissect_ieee1609dot2_TwoDLocation(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
518   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
519                                    ett_ieee1609dot2_TwoDLocation, TwoDLocation_sequence);
520
521   return offset;
522 }
523
524
525 static const oer_sequence_t CircularRegion_sequence[] = {
526   { &hf_ieee1609dot2_center , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_TwoDLocation },
527   { &hf_ieee1609dot2_radius , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Uint16 },
528   { NULL, 0, 0, NULL }
529 };
530
531 static int
532 dissect_ieee1609dot2_CircularRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
533   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
534                                    ett_ieee1609dot2_CircularRegion, CircularRegion_sequence);
535
536   return offset;
537 }
538
539
540 static const oer_sequence_t RectangularRegion_sequence[] = {
541   { &hf_ieee1609dot2_northWest, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_TwoDLocation },
542   { &hf_ieee1609dot2_southEast, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_TwoDLocation },
543   { NULL, 0, 0, NULL }
544 };
545
546 static int
547 dissect_ieee1609dot2_RectangularRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
548   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
549                                    ett_ieee1609dot2_RectangularRegion, RectangularRegion_sequence);
550
551   return offset;
552 }
553
554
555 static const oer_sequence_t SequenceOfRectangularRegion_sequence_of[1] = {
556   { &hf_ieee1609dot2_SequenceOfRectangularRegion_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_RectangularRegion },
557 };
558
559 static int
560 dissect_ieee1609dot2_SequenceOfRectangularRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
561   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
562                                       ett_ieee1609dot2_SequenceOfRectangularRegion, SequenceOfRectangularRegion_sequence_of);
563
564   return offset;
565 }
566
567
568 static const oer_sequence_t PolygonalRegion_sequence_of[1] = {
569   { &hf_ieee1609dot2_PolygonalRegion_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_TwoDLocation },
570 };
571
572 static int
573 dissect_ieee1609dot2_PolygonalRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
574   offset = dissect_oer_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
575                                                   ett_ieee1609dot2_PolygonalRegion, PolygonalRegion_sequence_of,
576                                                   3, NO_BOUND, FALSE);
577
578   return offset;
579 }
580
581
582
583 static int
584 dissect_ieee1609dot2_CountryOnly(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
585   offset = dissect_ieee1609dot2_Uint16(tvb, offset, actx, tree, hf_index);
586
587   return offset;
588 }
589
590
591 static const oer_sequence_t CountryAndRegions_sequence[] = {
592   { &hf_ieee1609dot2_countryOnly, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_CountryOnly },
593   { &hf_ieee1609dot2_regions, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SequenceOfUint8 },
594   { NULL, 0, 0, NULL }
595 };
596
597 static int
598 dissect_ieee1609dot2_CountryAndRegions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
599   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
600                                    ett_ieee1609dot2_CountryAndRegions, CountryAndRegions_sequence);
601
602   return offset;
603 }
604
605
606 static const oer_sequence_t RegionAndSubregions_sequence[] = {
607   { &hf_ieee1609dot2_region , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Uint8 },
608   { &hf_ieee1609dot2_subregions, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SequenceOfUint16 },
609   { NULL, 0, 0, NULL }
610 };
611
612 static int
613 dissect_ieee1609dot2_RegionAndSubregions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
614   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
615                                    ett_ieee1609dot2_RegionAndSubregions, RegionAndSubregions_sequence);
616
617   return offset;
618 }
619
620
621 static const oer_sequence_t SequenceOfRegionAndSubregions_sequence_of[1] = {
622   { &hf_ieee1609dot2_SequenceOfRegionAndSubregions_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_RegionAndSubregions },
623 };
624
625 static int
626 dissect_ieee1609dot2_SequenceOfRegionAndSubregions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
627   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
628                                       ett_ieee1609dot2_SequenceOfRegionAndSubregions, SequenceOfRegionAndSubregions_sequence_of);
629
630   return offset;
631 }
632
633
634 static const oer_sequence_t CountryAndSubregions_sequence[] = {
635   { &hf_ieee1609dot2_country, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_CountryOnly },
636   { &hf_ieee1609dot2_regionAndSubregions, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SequenceOfRegionAndSubregions },
637   { NULL, 0, 0, NULL }
638 };
639
640 static int
641 dissect_ieee1609dot2_CountryAndSubregions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
642   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
643                                    ett_ieee1609dot2_CountryAndSubregions, CountryAndSubregions_sequence);
644
645   return offset;
646 }
647
648
649 static const value_string ieee1609dot2_IdentifiedRegion_vals[] = {
650   {   0, "countryOnly" },
651   {   1, "countryAndRegions" },
652   {   2, "countryAndSubregions" },
653   { 0, NULL }
654 };
655
656 static const oer_choice_t IdentifiedRegion_choice[] = {
657   {   0, &hf_ieee1609dot2_countryOnly, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_CountryOnly },
658   {   1, &hf_ieee1609dot2_countryAndRegions, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_CountryAndRegions },
659   {   2, &hf_ieee1609dot2_countryAndSubregions, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_CountryAndSubregions },
660   { 0, NULL, 0, NULL }
661 };
662
663 static int
664 dissect_ieee1609dot2_IdentifiedRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
665   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
666                                  ett_ieee1609dot2_IdentifiedRegion, IdentifiedRegion_choice,
667                                  NULL);
668
669   return offset;
670 }
671
672
673 static const oer_sequence_t SequenceOfIdentifiedRegion_sequence_of[1] = {
674   { &hf_ieee1609dot2_SequenceOfIdentifiedRegion_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_IdentifiedRegion },
675 };
676
677 static int
678 dissect_ieee1609dot2_SequenceOfIdentifiedRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
679   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
680                                       ett_ieee1609dot2_SequenceOfIdentifiedRegion, SequenceOfIdentifiedRegion_sequence_of);
681
682   return offset;
683 }
684
685
686 static const value_string ieee1609dot2_GeographicRegion_vals[] = {
687   {   0, "circularRegion" },
688   {   1, "rectangularRegion" },
689   {   2, "polygonalRegion" },
690   {   3, "identifiedRegion" },
691   { 0, NULL }
692 };
693
694 static const oer_choice_t GeographicRegion_choice[] = {
695   {   0, &hf_ieee1609dot2_circularRegion, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_CircularRegion },
696   {   1, &hf_ieee1609dot2_rectangularRegion, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_SequenceOfRectangularRegion },
697   {   2, &hf_ieee1609dot2_polygonalRegion, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_PolygonalRegion },
698   {   3, &hf_ieee1609dot2_identifiedRegion, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_SequenceOfIdentifiedRegion },
699   { 0, NULL, 0, NULL }
700 };
701
702 static int
703 dissect_ieee1609dot2_GeographicRegion(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
704   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
705                                  ett_ieee1609dot2_GeographicRegion, GeographicRegion_choice,
706                                  NULL);
707
708   return offset;
709 }
710
711
712
713 static int
714 dissect_ieee1609dot2_ElevInt(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
715   offset = dissect_ieee1609dot2_Uint16(tvb, offset, actx, tree, hf_index);
716
717   return offset;
718 }
719
720
721
722 static int
723 dissect_ieee1609dot2_Elevation(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
724   offset = dissect_ieee1609dot2_ElevInt(tvb, offset, actx, tree, hf_index);
725
726   return offset;
727 }
728
729
730 static const oer_sequence_t ThreeDLocation_sequence[] = {
731   { &hf_ieee1609dot2_latitude, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Latitude },
732   { &hf_ieee1609dot2_longitude, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Longitude },
733   { &hf_ieee1609dot2_elevation, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Elevation },
734   { NULL, 0, 0, NULL }
735 };
736
737 static int
738 dissect_ieee1609dot2_ThreeDLocation(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
739   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
740                                    ett_ieee1609dot2_ThreeDLocation, ThreeDLocation_sequence);
741
742   return offset;
743 }
744
745
746
747 static int
748 dissect_ieee1609dot2_OCTET_STRING_SIZE_32(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
749   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
750                                        32, 32, FALSE, NULL);
751
752   return offset;
753 }
754
755
756
757 static int
758 dissect_ieee1609dot2_NULL(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
759   offset = dissect_oer_null(tvb, offset, actx, tree, hf_index);
760
761   return offset;
762 }
763
764
765 static const oer_sequence_t T_uncompressed_sequence[] = {
766   { &hf_ieee1609dot2_x      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
767   { &hf_ieee1609dot2_y      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
768   { NULL, 0, 0, NULL }
769 };
770
771 static int
772 dissect_ieee1609dot2_T_uncompressed(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
773   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
774                                    ett_ieee1609dot2_T_uncompressed, T_uncompressed_sequence);
775
776   return offset;
777 }
778
779
780 static const value_string ieee1609dot2_EccP256CurvePoint_vals[] = {
781   {   0, "x-only" },
782   {   1, "fill" },
783   {   2, "compressed-y-0" },
784   {   3, "compressed-y-1" },
785   {   4, "uncompressed" },
786   { 0, NULL }
787 };
788
789 static const oer_choice_t EccP256CurvePoint_choice[] = {
790   {   0, &hf_ieee1609dot2_x_only , ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
791   {   1, &hf_ieee1609dot2_fill   , ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_NULL },
792   {   2, &hf_ieee1609dot2_compressed_y_0, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
793   {   3, &hf_ieee1609dot2_compressed_y_1, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
794   {   4, &hf_ieee1609dot2_uncompressed, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_T_uncompressed },
795   { 0, NULL, 0, NULL }
796 };
797
798 static int
799 dissect_ieee1609dot2_EccP256CurvePoint(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
800   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
801                                  ett_ieee1609dot2_EccP256CurvePoint, EccP256CurvePoint_choice,
802                                  NULL);
803
804   return offset;
805 }
806
807
808 static const oer_sequence_t EcdsaP256Signature_sequence[] = {
809   { &hf_ieee1609dot2_r      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_EccP256CurvePoint },
810   { &hf_ieee1609dot2_s      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
811   { NULL, 0, 0, NULL }
812 };
813
814 static int
815 dissect_ieee1609dot2_EcdsaP256Signature(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
816   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
817                                    ett_ieee1609dot2_EcdsaP256Signature, EcdsaP256Signature_sequence);
818
819   return offset;
820 }
821
822
823 static const value_string ieee1609dot2_Signature_vals[] = {
824   {   0, "ecdsaNistP256Signature" },
825   {   1, "ecdsaBrainpoolP256r1Signature" },
826   { 0, NULL }
827 };
828
829 static const oer_choice_t Signature_choice[] = {
830   {   0, &hf_ieee1609dot2_ecdsaNistP256Signature, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EcdsaP256Signature },
831   {   1, &hf_ieee1609dot2_ecdsaBrainpoolP256r1Signature, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EcdsaP256Signature },
832   { 0, NULL, 0, NULL }
833 };
834
835 static int
836 dissect_ieee1609dot2_Signature(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
837   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
838                                  ett_ieee1609dot2_Signature, Signature_choice,
839                                  NULL);
840
841   return offset;
842 }
843
844
845 static const value_string ieee1609dot2_SymmAlgorithm_vals[] = {
846   {   0, "aes128Ccm" },
847   { 0, NULL }
848 };
849
850
851 static int
852 dissect_ieee1609dot2_SymmAlgorithm(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
853   offset = dissect_oer_enumerated(tvb, offset, actx, tree, hf_index,
854                                      1, NULL, TRUE, 0, NULL);
855
856   return offset;
857 }
858
859
860 static const value_string ieee1609dot2_HashAlgorithm_vals[] = {
861   {   0, "sha256" },
862   { 0, NULL }
863 };
864
865
866 static int
867 dissect_ieee1609dot2_HashAlgorithm(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
868   offset = dissect_oer_enumerated(tvb, offset, actx, tree, hf_index,
869                                      1, NULL, TRUE, 0, NULL);
870
871   return offset;
872 }
873
874
875
876 static int
877 dissect_ieee1609dot2_OCTET_STRING_SIZE_16(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
878   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
879                                        16, 16, FALSE, NULL);
880
881   return offset;
882 }
883
884
885 static const oer_sequence_t EciesP256EncryptedKey_sequence[] = {
886   { &hf_ieee1609dot2_v      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_EccP256CurvePoint },
887   { &hf_ieee1609dot2_c      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_16 },
888   { &hf_ieee1609dot2_t      , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_16 },
889   { NULL, 0, 0, NULL }
890 };
891
892 static int
893 dissect_ieee1609dot2_EciesP256EncryptedKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
894   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
895                                    ett_ieee1609dot2_EciesP256EncryptedKey, EciesP256EncryptedKey_sequence);
896
897   return offset;
898 }
899
900
901 static const value_string ieee1609dot2_BasePublicEncryptionKey_vals[] = {
902   {   0, "eciesNistP256" },
903   {   1, "eciesBrainpoolP256r1" },
904   { 0, NULL }
905 };
906
907 static const oer_choice_t BasePublicEncryptionKey_choice[] = {
908   {   0, &hf_ieee1609dot2_eciesNistP256, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EccP256CurvePoint },
909   {   1, &hf_ieee1609dot2_eciesBrainpoolP256r1, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EccP256CurvePoint },
910   { 0, NULL, 0, NULL }
911 };
912
913 static int
914 dissect_ieee1609dot2_BasePublicEncryptionKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
915   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
916                                  ett_ieee1609dot2_BasePublicEncryptionKey, BasePublicEncryptionKey_choice,
917                                  NULL);
918
919   return offset;
920 }
921
922
923 static const oer_sequence_t PublicEncryptionKey_sequence[] = {
924   { &hf_ieee1609dot2_supportedSymmAlg, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SymmAlgorithm },
925   { &hf_ieee1609dot2_publicKey, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_BasePublicEncryptionKey },
926   { NULL, 0, 0, NULL }
927 };
928
929 static int
930 dissect_ieee1609dot2_PublicEncryptionKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
931   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
932                                    ett_ieee1609dot2_PublicEncryptionKey, PublicEncryptionKey_sequence);
933
934   return offset;
935 }
936
937
938 static const value_string ieee1609dot2_SymmetricEncryptionKey_vals[] = {
939   {   0, "aes128Ccm" },
940   { 0, NULL }
941 };
942
943 static const oer_choice_t SymmetricEncryptionKey_choice[] = {
944   {   0, &hf_ieee1609dot2_aes128Ccm, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_OCTET_STRING_SIZE_16 },
945   { 0, NULL, 0, NULL }
946 };
947
948 static int
949 dissect_ieee1609dot2_SymmetricEncryptionKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
950   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
951                                  ett_ieee1609dot2_SymmetricEncryptionKey, SymmetricEncryptionKey_choice,
952                                  NULL);
953
954   return offset;
955 }
956
957
958 static const value_string ieee1609dot2_EncryptionKey_vals[] = {
959   {   0, "public" },
960   {   1, "symmetric" },
961   { 0, NULL }
962 };
963
964 static const oer_choice_t EncryptionKey_choice[] = {
965   {   0, &hf_ieee1609dot2_public , ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_PublicEncryptionKey },
966   {   1, &hf_ieee1609dot2_symmetric, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_SymmetricEncryptionKey },
967   { 0, NULL, 0, NULL }
968 };
969
970 static int
971 dissect_ieee1609dot2_EncryptionKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
972   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
973                                  ett_ieee1609dot2_EncryptionKey, EncryptionKey_choice,
974                                  NULL);
975
976   return offset;
977 }
978
979
980 static const value_string ieee1609dot2_PublicVerificationKey_vals[] = {
981   {   0, "ecdsaNistP256" },
982   {   1, "ecdsaBrainpoolP256r1" },
983   { 0, NULL }
984 };
985
986 static const oer_choice_t PublicVerificationKey_choice[] = {
987   {   0, &hf_ieee1609dot2_ecdsaNistP256, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EccP256CurvePoint },
988   {   1, &hf_ieee1609dot2_ecdsaBrainpoolP256r1, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EccP256CurvePoint },
989   { 0, NULL, 0, NULL }
990 };
991
992 static int
993 dissect_ieee1609dot2_PublicVerificationKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
994   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
995                                  ett_ieee1609dot2_PublicVerificationKey, PublicVerificationKey_choice,
996                                  NULL);
997
998   return offset;
999 }
1000
1001
1002 const val64_string ieee1609dot2_Psid_vals[] = {
1003   { psid_system, "psid-system" },
1004   { psid_electronic_fee_collection, "psid-electronic-fee-collection" },
1005   { psid_freight_fleet_management, "psid-freight-fleet-management" },
1006   { psid_public_transport, "psid-public-transport" },
1007   { psid_traffic_traveller_information, "psid-traffic-traveller-information" },
1008   { psid_traffic_control, "psid-traffic-control" },
1009   { psid_parking_management, "psid-parking-management" },
1010   { psid_geographic_road_database, "psid-geographic-road-database" },
1011   { psid_medium_range_preinformation, "psid-medium-range-preinformation" },
1012   { psid_man_machine_interface, "psid-man-machine-interface" },
1013   { psid_intersystem_interface, "psid-intersystem-interface" },
1014   { psid_automatic_vehicle_identification, "psid-automatic-vehicle-identification" },
1015   { psid_emergency_warning, "psid-emergency-warning" },
1016   { psid_private, "psid-private" },
1017   { psid_multi_purpose_payment, "psid-multi-purpose-payment" },
1018   { psid_dsrc_resource_manager, "psid-dsrc-resource-manager" },
1019   { psid_after_theft_systems, "psid-after-theft-systems" },
1020   { psid_cruise_assist_highway_system, "psid-cruise-assist-highway-system" },
1021   { psid_multi_purpose_information_system, "psid-multi-purpose-information-system" },
1022   { psid_multi_mobile_information_system, "psid-multi-mobile-information-system" },
1023   { psid_efc_compliance_check_communication_applications, "psid-efc-compliance-check-communication-applications" },
1024   { psid_efc_localisation_augmentation_communication_applications, "psid-efc-localisation-augmentation-communication-applications" },
1025   { psid_iso_cen_dsrc_applications_0x16, "psid-iso-cen-dsrc-applications-0x16" },
1026   { psid_iso_cen_dsrc_applications_0x17, "psid-iso-cen-dsrc-applications-0x17" },
1027   { psid_iso_cen_dsrc_applications_0x18, "psid-iso-cen-dsrc-applications-0x18" },
1028   { psid_iso_cen_dsrc_applications_0x19, "psid-iso-cen-dsrc-applications-0x19" },
1029   { psid_iso_cen_dsrc_applications_0x1a, "psid-iso-cen-dsrc-applications-0x1a" },
1030   { psid_iso_cen_dsrc_applications_0x1b, "psid-iso-cen-dsrc-applications-0x1b" },
1031   { psid_iso_cen_dsrc_applications_0x1c, "psid-iso-cen-dsrc-applications-0x1c" },
1032   { psid_private_use_0x1d, "psid-private-use-0x1d" },
1033   { psid_private_use_0x1e, "psid-private-use-0x1e" },
1034   { psid_iso_cen_dsrc_applications_0x1f, "psid-iso-cen-dsrc-applications-0x1f" },
1035   { psid_vehicle_to_vehicle_safety_and_awarenesss, "psid-vehicle-to-vehicle-safety-and-awarenesss" },
1036   { psid_limited_sensor_vehicle_to_vehicle_safety_and_awarenesss, "psid-limited-sensor-vehicle-to-vehicle-safety-and-awarenesss" },
1037   { psid_tracked_vehicle_safety_and_awarenesss, "psid-tracked-vehicle-safety-and-awarenesss" },
1038   { psid_wave_security_managements, "psid-wave-security-managements" },
1039   { psid_ca_basic_services, "psid-ca-basic-services" },
1040   { psid_den_basic_services, "psid-den-basic-services" },
1041   { psid_misbehavior_reporting_for_common_applications, "psid-misbehavior-reporting-for-common-applications" },
1042   { psid_vulnerable_road_users_safety_applications, "psid-vulnerable-road-users-safety-applications" },
1043   { psid_testings, "psid-testings" },
1044   { psid_differential_gps_corrections_uncompressed, "psid-differential-gps-corrections-uncompressed" },
1045   { psid_differential_gps_corrections_compressed, "psid-differential-gps-corrections-compressed" },
1046   { psid_intersection_safety_and_awareness, "psid-intersection-safety-and-awareness" },
1047   { psid_traveller_information_and_roadside_signage, "psid-traveller-information-and-roadside-signage" },
1048   { psid_mobile_probe_exchanges, "psid-mobile-probe-exchanges" },
1049   { psid_emergency_and_erratic_vehicles_present_in_roadway, "psid-emergency-and-erratic-vehicles-present-in-roadway" },
1050   { psid_remote_management_protocol_execution, "psid-remote-management-protocol-execution" },
1051   { psid_wave_service_advertisement, "psid-wave-service-advertisement" },
1052   { psid_peer_to_peer_distribution_of_security_management_information, "psid-peer-to-peer-distribution-of-security-management-information" },
1053   { psid_traffic_light_manoeuver_service, "psid-traffic-light-manoeuver-service" },
1054   { psid_road_and_lane_topology_service, "psid-road-and-lane-topology-service" },
1055   { psid_infrastructure_to_vehicle_information_service, "psid-infrastructure-to-vehicle-information-service" },
1056   { psid_traffic_light_control_service, "psid-traffic-light-control-service" },
1057   { psid_geonetworking_management_communications, "psid-geonetworking-management-communications" },
1058   { psid_certificate_revocation_list_application, "psid-certificate-revocation-list-application" },
1059   { psid_vehicle_initiated_distress_notivication, "psid-vehicle-initiated-distress-notivication" },
1060   { psid_fast_service_advertisement_protocol, "psid-fast-service-advertisement-protocol" },
1061   { psid_its_station_internal_management_communications_protocol, "psid-its-station-internal-management-communications-protocol" },
1062   { psid_veniam_delay_tolerant_networking, "psid-veniam-delay-tolerant-networking" },
1063   { psid_transcore_software_update, "psid-transcore-software-update" },
1064   { psid_sra_private_applications_0x204084, "psid-sra-private-applications-0x204084" },
1065   { psid_sra_private_applications_0x204085, "psid-sra-private-applications-0x204085" },
1066   { psid_sra_private_applications_0x204086, "psid-sra-private-applications-0x204086" },
1067   { psid_sra_private_applications_0x204087, "psid-sra-private-applications-0x204087" },
1068   { psid_ipv6_routing, "psid-ipv6-routing" },
1069   { 0, NULL }
1070 };
1071
1072
1073 static int
1074 dissect_ieee1609dot2_Psid(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1075   offset = dissect_oer_constrained_integer_64b_no_ub(tvb, offset, actx, tree, hf_index,
1076                                                             0U, NO_BOUND, NULL, FALSE);
1077
1078   return offset;
1079 }
1080
1081
1082
1083 static int
1084 dissect_ieee1609dot2_T_psid(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1085 #line 84 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
1086   offset = dissect_oer_constrained_integer_64b_no_ub(tvb, offset, actx, tree, hf_index,
1087                                                0U, NO_BOUND, &((ieee1609_private_data_t*)actx->private_data)->psidssp, FALSE);
1088
1089
1090
1091   return offset;
1092 }
1093
1094
1095
1096 static int
1097 dissect_ieee1609dot2_T_opaque(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1098 #line 88 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
1099   tvbuff_t *ssp;
1100   ieee1609_private_data_t *my_private_data = (ieee1609_private_data_t*)actx->private_data;
1101
1102   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1103                                        0, NO_BOUND, FALSE, &ssp);
1104   if (ssp) {
1105     // Create subtree
1106     proto_tree *subtree = proto_item_add_subtree(actx->created_item, ett_ieee1609dot2_ssp);
1107     /* Call next dissector here */
1108     dissector_try_uint(ssp_subdissector_table, (guint32) my_private_data->psidssp, ssp, actx->pinfo, subtree);
1109   }
1110
1111
1112   return offset;
1113 }
1114
1115
1116 static const value_string ieee1609dot2_ServiceSpecificPermissions_vals[] = {
1117   {   0, "opaque" },
1118   { 0, NULL }
1119 };
1120
1121 static const oer_choice_t ServiceSpecificPermissions_choice[] = {
1122   {   0, &hf_ieee1609dot2_opaque , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_T_opaque },
1123   { 0, NULL, 0, NULL }
1124 };
1125
1126 static int
1127 dissect_ieee1609dot2_ServiceSpecificPermissions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1128   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1129                                  ett_ieee1609dot2_ServiceSpecificPermissions, ServiceSpecificPermissions_choice,
1130                                  NULL);
1131
1132   return offset;
1133 }
1134
1135
1136 static const oer_sequence_t PsidSsp_sequence[] = {
1137   { &hf_ieee1609dot2_psid   , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_T_psid },
1138   { &hf_ieee1609dot2_ssp    , ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_ServiceSpecificPermissions },
1139   { NULL, 0, 0, NULL }
1140 };
1141
1142 static int
1143 dissect_ieee1609dot2_PsidSsp(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1144   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1145                                    ett_ieee1609dot2_PsidSsp, PsidSsp_sequence);
1146
1147   return offset;
1148 }
1149
1150
1151 static const oer_sequence_t SequenceOfPsidSsp_sequence_of[1] = {
1152   { &hf_ieee1609dot2_SequenceOfPsidSsp_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_PsidSsp },
1153 };
1154
1155 static int
1156 dissect_ieee1609dot2_SequenceOfPsidSsp(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1157   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
1158                                       ett_ieee1609dot2_SequenceOfPsidSsp, SequenceOfPsidSsp_sequence_of);
1159
1160   return offset;
1161 }
1162
1163
1164
1165 static int
1166 dissect_ieee1609dot2_OCTET_STRING_SIZE_0_MAX(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1167   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1168                                        0, NO_BOUND, FALSE, NULL);
1169
1170   return offset;
1171 }
1172
1173
1174 static const oer_sequence_t SequenceOfOctetString_sequence_of[1] = {
1175   { &hf_ieee1609dot2_SequenceOfOctetString_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_0_MAX },
1176 };
1177
1178 static int
1179 dissect_ieee1609dot2_SequenceOfOctetString(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1180   offset = dissect_oer_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
1181                                                   ett_ieee1609dot2_SequenceOfOctetString, SequenceOfOctetString_sequence_of,
1182                                                   0, NO_BOUND, FALSE);
1183
1184   return offset;
1185 }
1186
1187
1188 static const value_string ieee1609dot2_SspRange_vals[] = {
1189   {   0, "opaque" },
1190   {   1, "all" },
1191   { 0, NULL }
1192 };
1193
1194 static const oer_choice_t SspRange_choice[] = {
1195   {   0, &hf_ieee1609dot2_opaque_01, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_SequenceOfOctetString },
1196   {   1, &hf_ieee1609dot2_all    , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_NULL },
1197   { 0, NULL, 0, NULL }
1198 };
1199
1200 static int
1201 dissect_ieee1609dot2_SspRange(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1202   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1203                                  ett_ieee1609dot2_SspRange, SspRange_choice,
1204                                  NULL);
1205
1206   return offset;
1207 }
1208
1209
1210 static const oer_sequence_t PsidSspRange_sequence[] = {
1211   { &hf_ieee1609dot2_psid_01, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Psid },
1212   { &hf_ieee1609dot2_sspRange, ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_SspRange },
1213   { NULL, 0, 0, NULL }
1214 };
1215
1216 static int
1217 dissect_ieee1609dot2_PsidSspRange(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1218   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1219                                    ett_ieee1609dot2_PsidSspRange, PsidSspRange_sequence);
1220
1221   return offset;
1222 }
1223
1224
1225 static const oer_sequence_t SequenceOfPsidSspRange_sequence_of[1] = {
1226   { &hf_ieee1609dot2_SequenceOfPsidSspRange_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_PsidSspRange },
1227 };
1228
1229 static int
1230 dissect_ieee1609dot2_SequenceOfPsidSspRange(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1231   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
1232                                       ett_ieee1609dot2_SequenceOfPsidSspRange, SequenceOfPsidSspRange_sequence_of);
1233
1234   return offset;
1235 }
1236
1237
1238
1239 static int
1240 dissect_ieee1609dot2_SubjectAssurance(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1241   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1242                                        1, 1, FALSE, NULL);
1243
1244   return offset;
1245 }
1246
1247
1248
1249 static int
1250 dissect_ieee1609dot2_CrlSeries(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1251   offset = dissect_ieee1609dot2_Uint16(tvb, offset, actx, tree, hf_index);
1252
1253   return offset;
1254 }
1255
1256
1257
1258 static int
1259 dissect_ieee1609dot2_IValue(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1260   offset = dissect_ieee1609dot2_Uint16(tvb, offset, actx, tree, hf_index);
1261
1262   return offset;
1263 }
1264
1265
1266
1267 static int
1268 dissect_ieee1609dot2_Hostname(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1269   offset = dissect_oer_UTF8String(tvb, offset, actx, tree, hf_index,
1270                                           0, 255, FALSE);
1271
1272   return offset;
1273 }
1274
1275
1276
1277 static int
1278 dissect_ieee1609dot2_LinkageValue(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1279   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1280                                        9, 9, FALSE, NULL);
1281
1282   return offset;
1283 }
1284
1285
1286
1287 static int
1288 dissect_ieee1609dot2_OCTET_STRING_SIZE_4(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1289   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1290                                        4, 4, FALSE, NULL);
1291
1292   return offset;
1293 }
1294
1295
1296
1297 static int
1298 dissect_ieee1609dot2_OCTET_STRING_SIZE_9(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1299   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1300                                        9, 9, FALSE, NULL);
1301
1302   return offset;
1303 }
1304
1305
1306 static const oer_sequence_t GroupLinkageValue_sequence[] = {
1307   { &hf_ieee1609dot2_jValue , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_4 },
1308   { &hf_ieee1609dot2_value  , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_9 },
1309   { NULL, 0, 0, NULL }
1310 };
1311
1312 static int
1313 dissect_ieee1609dot2_GroupLinkageValue(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1314   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1315                                    ett_ieee1609dot2_GroupLinkageValue, GroupLinkageValue_sequence);
1316
1317   return offset;
1318 }
1319
1320
1321
1322 static int
1323 dissect_ieee1609dot2_T_unsecuredData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1324 #line 51 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
1325   ieee1609_private_data_t *my_private_data = (ieee1609_private_data_t*)actx->private_data;
1326
1327   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1328                                        NO_BOUND, NO_BOUND, FALSE, &my_private_data->unsecured_data);
1329
1330   if (my_private_data->unsecured_data) {
1331     // psid may also be provided in HeaderInfo
1332     guint32 *psid = (guint32*)p_get_proto_data(wmem_file_scope(), actx->pinfo, proto_ieee1609dot2, 0);
1333     if (psid) {
1334       /* Call next dissector here */
1335       dissector_try_uint(unsecured_data_subdissector_table, *psid, my_private_data->unsecured_data, actx->pinfo, tree);
1336       my_private_data->unsecured_data = NULL;
1337     }
1338     // else: wait for the HeaderInfo for a second chance to dissect the content
1339   }
1340
1341
1342
1343   return offset;
1344 }
1345
1346
1347
1348 static int
1349 dissect_ieee1609dot2_T_psid_01(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1350 #line 70 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
1351   guint64 psid;
1352   ieee1609_private_data_t *my_private_data = (ieee1609_private_data_t*)actx->private_data;
1353
1354   offset = dissect_oer_constrained_integer_64b_no_ub(tvb, offset, actx, tree, hf_index,
1355                                                             0U, NO_BOUND, &psid, FALSE);
1356   if (my_private_data->unsecured_data) {
1357     /* Call next dissector here */
1358     dissector_try_uint(unsecured_data_subdissector_table, (guint32) psid, my_private_data->unsecured_data, actx->pinfo, tree);
1359     my_private_data->unsecured_data = NULL;
1360   }
1361
1362
1363
1364   return offset;
1365 }
1366
1367
1368 static const oer_sequence_t MissingCrlIdentifier_sequence[] = {
1369   { &hf_ieee1609dot2_cracaId, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_HashedId3 },
1370   { &hf_ieee1609dot2_crlSeries, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_CrlSeries },
1371   { NULL, 0, 0, NULL }
1372 };
1373
1374 static int
1375 dissect_ieee1609dot2_MissingCrlIdentifier(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1376   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1377                                    ett_ieee1609dot2_MissingCrlIdentifier, MissingCrlIdentifier_sequence);
1378
1379   return offset;
1380 }
1381
1382
1383 static const oer_sequence_t HeaderInfo_sequence[] = {
1384   { &hf_ieee1609dot2_psid_02, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_T_psid_01 },
1385   { &hf_ieee1609dot2_generationTime, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_Time64 },
1386   { &hf_ieee1609dot2_expiryTime, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_Time64 },
1387   { &hf_ieee1609dot2_generationLocation, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_ThreeDLocation },
1388   { &hf_ieee1609dot2_p2pcdLearningRequest, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_HashedId3 },
1389   { &hf_ieee1609dot2_missingCrlIdentifier, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_MissingCrlIdentifier },
1390   { &hf_ieee1609dot2_encryptionKey, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_EncryptionKey },
1391   { NULL, 0, 0, NULL }
1392 };
1393
1394 static int
1395 dissect_ieee1609dot2_HeaderInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1396   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1397                                    ett_ieee1609dot2_HeaderInfo, HeaderInfo_sequence);
1398
1399   return offset;
1400 }
1401
1402
1403 static const oer_sequence_t ToBeSignedData_sequence[] = {
1404   { &hf_ieee1609dot2_payload, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SignedDataPayload },
1405   { &hf_ieee1609dot2_headerInfo, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_HeaderInfo },
1406   { NULL, 0, 0, NULL }
1407 };
1408
1409 static int
1410 dissect_ieee1609dot2_ToBeSignedData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1411   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1412                                    ett_ieee1609dot2_ToBeSignedData, ToBeSignedData_sequence);
1413
1414   return offset;
1415 }
1416
1417
1418 static const value_string ieee1609dot2_CertificateType_vals[] = {
1419   {   0, "explicit" },
1420   {   1, "implicit" },
1421   { 0, NULL }
1422 };
1423
1424
1425 static int
1426 dissect_ieee1609dot2_CertificateType(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1427   offset = dissect_oer_enumerated(tvb, offset, actx, tree, hf_index,
1428                                      2, NULL, TRUE, 0, NULL);
1429
1430   return offset;
1431 }
1432
1433
1434 static const value_string ieee1609dot2_IssuerIdentifier_vals[] = {
1435   {   0, "sha256AndDigest" },
1436   {   1, "self" },
1437   { 0, NULL }
1438 };
1439
1440 static const oer_choice_t IssuerIdentifier_choice[] = {
1441   {   0, &hf_ieee1609dot2_sha256AndDigest, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_HashedId8 },
1442   {   1, &hf_ieee1609dot2_self_01, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_HashAlgorithm },
1443   { 0, NULL, 0, NULL }
1444 };
1445
1446 static int
1447 dissect_ieee1609dot2_IssuerIdentifier(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1448   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1449                                  ett_ieee1609dot2_IssuerIdentifier, IssuerIdentifier_choice,
1450                                  NULL);
1451
1452   return offset;
1453 }
1454
1455
1456 static const oer_sequence_t LinkageData_sequence[] = {
1457   { &hf_ieee1609dot2_iCert  , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_IValue },
1458   { &hf_ieee1609dot2_linkage_value, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_LinkageValue },
1459   { &hf_ieee1609dot2_group_linkage_value, ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_GroupLinkageValue },
1460   { NULL, 0, 0, NULL }
1461 };
1462
1463 static int
1464 dissect_ieee1609dot2_LinkageData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1465   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1466                                    ett_ieee1609dot2_LinkageData, LinkageData_sequence);
1467
1468   return offset;
1469 }
1470
1471
1472
1473 static int
1474 dissect_ieee1609dot2_OCTET_STRING_SIZE_1_64(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1475   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1476                                        1, 64, FALSE, NULL);
1477
1478   return offset;
1479 }
1480
1481
1482 static const value_string ieee1609dot2_CertificateId_vals[] = {
1483   {   0, "linkageData" },
1484   {   1, "name" },
1485   {   2, "binaryId" },
1486   {   3, "none" },
1487   { 0, NULL }
1488 };
1489
1490 static const oer_choice_t CertificateId_choice[] = {
1491   {   0, &hf_ieee1609dot2_linkageData, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_LinkageData },
1492   {   1, &hf_ieee1609dot2_name   , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_Hostname },
1493   {   2, &hf_ieee1609dot2_binaryId, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_OCTET_STRING_SIZE_1_64 },
1494   {   3, &hf_ieee1609dot2_none   , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_NULL },
1495   { 0, NULL, 0, NULL }
1496 };
1497
1498 static int
1499 dissect_ieee1609dot2_CertificateId(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1500   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1501                                  ett_ieee1609dot2_CertificateId, CertificateId_choice,
1502                                  NULL);
1503
1504   return offset;
1505 }
1506
1507
1508 static const value_string ieee1609dot2_SubjectPermissions_vals[] = {
1509   {   0, "explicit" },
1510   {   1, "all" },
1511   { 0, NULL }
1512 };
1513
1514 static const oer_choice_t SubjectPermissions_choice[] = {
1515   {   0, &hf_ieee1609dot2_explicit, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_SequenceOfPsidSspRange },
1516   {   1, &hf_ieee1609dot2_all    , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_NULL },
1517   { 0, NULL, 0, NULL }
1518 };
1519
1520 static int
1521 dissect_ieee1609dot2_SubjectPermissions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1522   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1523                                  ett_ieee1609dot2_SubjectPermissions, SubjectPermissions_choice,
1524                                  NULL);
1525
1526   return offset;
1527 }
1528
1529
1530
1531 static int
1532 dissect_ieee1609dot2_INTEGER(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1533   offset = dissect_oer_integer(tvb, offset, actx, tree, hf_index, NULL);
1534
1535   return offset;
1536 }
1537
1538
1539
1540 static int
1541 dissect_ieee1609dot2_EndEntityType(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1542   offset = dissect_oer_bit_string(tvb, offset, actx, tree, hf_index,
1543                                      8, 8, FALSE, NULL, NULL);
1544
1545   return offset;
1546 }
1547
1548
1549 static const oer_sequence_t PsidGroupPermissions_sequence[] = {
1550   { &hf_ieee1609dot2_appPermissions_01, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SubjectPermissions },
1551   { &hf_ieee1609dot2_minChainDepth, ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_INTEGER },
1552   { &hf_ieee1609dot2_chainDepthRange, ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_INTEGER },
1553   { &hf_ieee1609dot2_eeType , ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_EndEntityType },
1554   { NULL, 0, 0, NULL }
1555 };
1556
1557 static int
1558 dissect_ieee1609dot2_PsidGroupPermissions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1559   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1560                                    ett_ieee1609dot2_PsidGroupPermissions, PsidGroupPermissions_sequence);
1561
1562   return offset;
1563 }
1564
1565
1566 static const oer_sequence_t SequenceOfPsidGroupPermissions_sequence_of[1] = {
1567   { &hf_ieee1609dot2_SequenceOfPsidGroupPermissions_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_PsidGroupPermissions },
1568 };
1569
1570 static int
1571 dissect_ieee1609dot2_SequenceOfPsidGroupPermissions(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1572   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
1573                                       ett_ieee1609dot2_SequenceOfPsidGroupPermissions, SequenceOfPsidGroupPermissions_sequence_of);
1574
1575   return offset;
1576 }
1577
1578
1579 static const value_string ieee1609dot2_VerificationKeyIndicator_vals[] = {
1580   {   0, "verificationKey" },
1581   {   1, "reconstructionValue" },
1582   { 0, NULL }
1583 };
1584
1585 static const oer_choice_t VerificationKeyIndicator_choice[] = {
1586   {   0, &hf_ieee1609dot2_verificationKey, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_PublicVerificationKey },
1587   {   1, &hf_ieee1609dot2_reconstructionValue, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EccP256CurvePoint },
1588   { 0, NULL, 0, NULL }
1589 };
1590
1591 static int
1592 dissect_ieee1609dot2_VerificationKeyIndicator(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1593   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1594                                  ett_ieee1609dot2_VerificationKeyIndicator, VerificationKeyIndicator_choice,
1595                                  NULL);
1596
1597   return offset;
1598 }
1599
1600
1601 static const oer_sequence_t ToBeSignedCertificate_sequence[] = {
1602   { &hf_ieee1609dot2_id     , ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_CertificateId },
1603   { &hf_ieee1609dot2_cracaId, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_HashedId3 },
1604   { &hf_ieee1609dot2_crlSeries, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_CrlSeries },
1605   { &hf_ieee1609dot2_validityPeriod, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_ValidityPeriod },
1606   { &hf_ieee1609dot2_region_01, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_GeographicRegion },
1607   { &hf_ieee1609dot2_assuranceLevel, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_SubjectAssurance },
1608   { &hf_ieee1609dot2_appPermissions, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_SequenceOfPsidSsp },
1609   { &hf_ieee1609dot2_certIssuePermissions, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_SequenceOfPsidGroupPermissions },
1610   { &hf_ieee1609dot2_certRequestPermissions, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_SequenceOfPsidGroupPermissions },
1611   { &hf_ieee1609dot2_canRequestRollover, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_NULL },
1612   { &hf_ieee1609dot2_encryptionKey_01, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_PublicEncryptionKey },
1613   { &hf_ieee1609dot2_verifyKeyIndicator, ASN1_EXTENSION_ROOT    , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_VerificationKeyIndicator },
1614   { NULL, 0, 0, NULL }
1615 };
1616
1617 static int
1618 dissect_ieee1609dot2_ToBeSignedCertificate(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1619   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1620                                    ett_ieee1609dot2_ToBeSignedCertificate, ToBeSignedCertificate_sequence);
1621
1622   return offset;
1623 }
1624
1625
1626 static const oer_sequence_t CertificateBase_sequence[] = {
1627   { &hf_ieee1609dot2_version, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Uint8 },
1628   { &hf_ieee1609dot2_type   , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_CertificateType },
1629   { &hf_ieee1609dot2_issuer , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_IssuerIdentifier },
1630   { &hf_ieee1609dot2_toBeSigned, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_ToBeSignedCertificate },
1631   { &hf_ieee1609dot2_signature, ASN1_NO_EXTENSIONS     , ASN1_OPTIONAL    , dissect_ieee1609dot2_Signature },
1632   { NULL, 0, 0, NULL }
1633 };
1634
1635 static int
1636 dissect_ieee1609dot2_CertificateBase(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1637   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1638                                    ett_ieee1609dot2_CertificateBase, CertificateBase_sequence);
1639
1640   return offset;
1641 }
1642
1643
1644
1645 static int
1646 dissect_ieee1609dot2_Certificate(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1647   offset = dissect_ieee1609dot2_CertificateBase(tvb, offset, actx, tree, hf_index);
1648
1649   return offset;
1650 }
1651
1652
1653 static const oer_sequence_t SequenceOfCertificate_sequence_of[1] = {
1654   { &hf_ieee1609dot2_SequenceOfCertificate_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Certificate },
1655 };
1656
1657 static int
1658 dissect_ieee1609dot2_SequenceOfCertificate(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1659   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
1660                                       ett_ieee1609dot2_SequenceOfCertificate, SequenceOfCertificate_sequence_of);
1661
1662   return offset;
1663 }
1664
1665
1666 static const value_string ieee1609dot2_SignerIdentifier_vals[] = {
1667   {   0, "digest" },
1668   {   1, "certificate" },
1669   {   2, "self" },
1670   { 0, NULL }
1671 };
1672
1673 static const oer_choice_t SignerIdentifier_choice[] = {
1674   {   0, &hf_ieee1609dot2_digest , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_HashedId8 },
1675   {   1, &hf_ieee1609dot2_certificate, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_SequenceOfCertificate },
1676   {   2, &hf_ieee1609dot2_self   , ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_NULL },
1677   { 0, NULL, 0, NULL }
1678 };
1679
1680 static int
1681 dissect_ieee1609dot2_SignerIdentifier(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1682   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1683                                  ett_ieee1609dot2_SignerIdentifier, SignerIdentifier_choice,
1684                                  NULL);
1685
1686   return offset;
1687 }
1688
1689
1690 static const oer_sequence_t SignedData_sequence[] = {
1691   { &hf_ieee1609dot2_hashId , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_HashAlgorithm },
1692   { &hf_ieee1609dot2_tbsData, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_ToBeSignedData },
1693   { &hf_ieee1609dot2_signer , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SignerIdentifier },
1694   { &hf_ieee1609dot2_signature, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Signature },
1695   { NULL, 0, 0, NULL }
1696 };
1697
1698 static int
1699 dissect_ieee1609dot2_SignedData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1700   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1701                                    ett_ieee1609dot2_SignedData, SignedData_sequence);
1702
1703   return offset;
1704 }
1705
1706
1707
1708 static int
1709 dissect_ieee1609dot2_PreSharedKeyRecipientInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1710   offset = dissect_ieee1609dot2_HashedId8(tvb, offset, actx, tree, hf_index);
1711
1712   return offset;
1713 }
1714
1715
1716
1717 static int
1718 dissect_ieee1609dot2_OCTET_STRING_SIZE_12(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1719   offset = dissect_oer_octet_string(tvb, offset, actx, tree, hf_index,
1720                                        12, 12, FALSE, NULL);
1721
1722   return offset;
1723 }
1724
1725
1726 static const oer_sequence_t AesCcmCiphertext_sequence[] = {
1727   { &hf_ieee1609dot2_nonce  , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_OCTET_STRING_SIZE_12 },
1728   { &hf_ieee1609dot2_ccmCiphertext, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Opaque },
1729   { NULL, 0, 0, NULL }
1730 };
1731
1732 static int
1733 dissect_ieee1609dot2_AesCcmCiphertext(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1734   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1735                                    ett_ieee1609dot2_AesCcmCiphertext, AesCcmCiphertext_sequence);
1736
1737   return offset;
1738 }
1739
1740
1741 static const value_string ieee1609dot2_SymmetricCiphertext_vals[] = {
1742   {   0, "aes128ccm" },
1743   { 0, NULL }
1744 };
1745
1746 static const oer_choice_t SymmetricCiphertext_choice[] = {
1747   {   0, &hf_ieee1609dot2_aes128ccm, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_AesCcmCiphertext },
1748   { 0, NULL, 0, NULL }
1749 };
1750
1751 static int
1752 dissect_ieee1609dot2_SymmetricCiphertext(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1753   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1754                                  ett_ieee1609dot2_SymmetricCiphertext, SymmetricCiphertext_choice,
1755                                  NULL);
1756
1757   return offset;
1758 }
1759
1760
1761 static const oer_sequence_t SymmRecipientInfo_sequence[] = {
1762   { &hf_ieee1609dot2_recipientId, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_HashedId8 },
1763   { &hf_ieee1609dot2_encKey , ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SymmetricCiphertext },
1764   { NULL, 0, 0, NULL }
1765 };
1766
1767 static int
1768 dissect_ieee1609dot2_SymmRecipientInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1769   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1770                                    ett_ieee1609dot2_SymmRecipientInfo, SymmRecipientInfo_sequence);
1771
1772   return offset;
1773 }
1774
1775
1776 static const value_string ieee1609dot2_EncryptedDataEncryptionKey_vals[] = {
1777   {   0, "eciesNistP256" },
1778   {   1, "eciesBrainpoolP256r1" },
1779   { 0, NULL }
1780 };
1781
1782 static const oer_choice_t EncryptedDataEncryptionKey_choice[] = {
1783   {   0, &hf_ieee1609dot2_eciesNistP256_01, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EciesP256EncryptedKey },
1784   {   1, &hf_ieee1609dot2_eciesBrainpoolP256r1_01, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EciesP256EncryptedKey },
1785   { 0, NULL, 0, NULL }
1786 };
1787
1788 static int
1789 dissect_ieee1609dot2_EncryptedDataEncryptionKey(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1790   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1791                                  ett_ieee1609dot2_EncryptedDataEncryptionKey, EncryptedDataEncryptionKey_choice,
1792                                  NULL);
1793
1794   return offset;
1795 }
1796
1797
1798 static const oer_sequence_t PKRecipientInfo_sequence[] = {
1799   { &hf_ieee1609dot2_recipientId, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_HashedId8 },
1800   { &hf_ieee1609dot2_encKey_01, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_EncryptedDataEncryptionKey },
1801   { NULL, 0, 0, NULL }
1802 };
1803
1804 static int
1805 dissect_ieee1609dot2_PKRecipientInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1806   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1807                                    ett_ieee1609dot2_PKRecipientInfo, PKRecipientInfo_sequence);
1808
1809   return offset;
1810 }
1811
1812
1813 static const value_string ieee1609dot2_RecipientInfo_vals[] = {
1814   {   0, "pskRecipInfo" },
1815   {   1, "symmRecipInfo" },
1816   {   2, "certRecipInfo" },
1817   {   3, "signedDataRecipInfo" },
1818   {   4, "rekRecipInfo" },
1819   { 0, NULL }
1820 };
1821
1822 static const oer_choice_t RecipientInfo_choice[] = {
1823   {   0, &hf_ieee1609dot2_pskRecipInfo, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_PreSharedKeyRecipientInfo },
1824   {   1, &hf_ieee1609dot2_symmRecipInfo, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_SymmRecipientInfo },
1825   {   2, &hf_ieee1609dot2_certRecipInfo, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_PKRecipientInfo },
1826   {   3, &hf_ieee1609dot2_signedDataRecipInfo, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_PKRecipientInfo },
1827   {   4, &hf_ieee1609dot2_rekRecipInfo, ASN1_NO_EXTENSIONS     , dissect_ieee1609dot2_PKRecipientInfo },
1828   { 0, NULL, 0, NULL }
1829 };
1830
1831 static int
1832 dissect_ieee1609dot2_RecipientInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1833   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1834                                  ett_ieee1609dot2_RecipientInfo, RecipientInfo_choice,
1835                                  NULL);
1836
1837   return offset;
1838 }
1839
1840
1841 static const oer_sequence_t SequenceOfRecipientInfo_sequence_of[1] = {
1842   { &hf_ieee1609dot2_SequenceOfRecipientInfo_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_RecipientInfo },
1843 };
1844
1845 static int
1846 dissect_ieee1609dot2_SequenceOfRecipientInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1847   offset = dissect_oer_sequence_of(tvb, offset, actx, tree, hf_index,
1848                                       ett_ieee1609dot2_SequenceOfRecipientInfo, SequenceOfRecipientInfo_sequence_of);
1849
1850   return offset;
1851 }
1852
1853
1854 static const oer_sequence_t EncryptedData_sequence[] = {
1855   { &hf_ieee1609dot2_recipients, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SequenceOfRecipientInfo },
1856   { &hf_ieee1609dot2_ciphertext, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_SymmetricCiphertext },
1857   { NULL, 0, 0, NULL }
1858 };
1859
1860 static int
1861 dissect_ieee1609dot2_EncryptedData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1862   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1863                                    ett_ieee1609dot2_EncryptedData, EncryptedData_sequence);
1864
1865   return offset;
1866 }
1867
1868
1869 static const value_string ieee1609dot2_Ieee1609Dot2Content_vals[] = {
1870   {   0, "unsecuredData" },
1871   {   1, "signedData" },
1872   {   2, "encryptedData" },
1873   {   3, "signedCertificateRequest" },
1874   { 0, NULL }
1875 };
1876
1877 static const oer_choice_t Ieee1609Dot2Content_choice[] = {
1878   {   0, &hf_ieee1609dot2_unsecuredData, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_T_unsecuredData },
1879   {   1, &hf_ieee1609dot2_signedData, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_SignedData },
1880   {   2, &hf_ieee1609dot2_encryptedData, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_EncryptedData },
1881   {   3, &hf_ieee1609dot2_signedCertificateRequest, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_Opaque },
1882   { 0, NULL, 0, NULL }
1883 };
1884
1885 static int
1886 dissect_ieee1609dot2_Ieee1609Dot2Content(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1887   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1888                                  ett_ieee1609dot2_Ieee1609Dot2Content, Ieee1609Dot2Content_choice,
1889                                  NULL);
1890
1891   return offset;
1892 }
1893
1894
1895 static const oer_sequence_t Ieee1609Dot2Data_sequence[] = {
1896   { &hf_ieee1609dot2_protocolVersion, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Uint8 },
1897   { &hf_ieee1609dot2_content, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_ieee1609dot2_Ieee1609Dot2Content },
1898   { NULL, 0, 0, NULL }
1899 };
1900
1901 static int
1902 dissect_ieee1609dot2_Ieee1609Dot2Data(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1903 #line 47 "./asn1/ieee1609dot2/ieee1609dot2.cnf"
1904   actx->private_data = (void*)wmem_new0(wmem_packet_scope(), ieee1609_private_data_t);
1905
1906   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1907                                    ett_ieee1609dot2_Ieee1609Dot2Data, Ieee1609Dot2Data_sequence);
1908
1909   return offset;
1910 }
1911
1912
1913 static const value_string ieee1609dot2_HashedData_vals[] = {
1914   {   0, "sha256HashedData" },
1915   { 0, NULL }
1916 };
1917
1918 static const oer_choice_t HashedData_choice[] = {
1919   {   0, &hf_ieee1609dot2_sha256HashedData, ASN1_EXTENSION_ROOT    , dissect_ieee1609dot2_OCTET_STRING_SIZE_32 },
1920   { 0, NULL, 0, NULL }
1921 };
1922
1923 static int
1924 dissect_ieee1609dot2_HashedData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1925   offset = dissect_oer_choice(tvb, offset, actx, tree, hf_index,
1926                                  ett_ieee1609dot2_HashedData, HashedData_choice,
1927                                  NULL);
1928
1929   return offset;
1930 }
1931
1932
1933 static const oer_sequence_t SignedDataPayload_sequence[] = {
1934   { &hf_ieee1609dot2_data   , ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_Ieee1609Dot2Data },
1935   { &hf_ieee1609dot2_extDataHash, ASN1_EXTENSION_ROOT    , ASN1_OPTIONAL    , dissect_ieee1609dot2_HashedData },
1936   { NULL, 0, 0, NULL }
1937 };
1938
1939 static int
1940 dissect_ieee1609dot2_SignedDataPayload(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1941   offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index,
1942                                    ett_ieee1609dot2_SignedDataPayload, SignedDataPayload_sequence);
1943
1944   return offset;
1945 }
1946
1947 /*--- PDUs ---*/
1948
1949 static int dissect_Ieee1609Dot2Data_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1950   int offset = 0;
1951   asn1_ctx_t asn1_ctx;
1952   asn1_ctx_init(&asn1_ctx, ASN1_ENC_OER, TRUE, pinfo);
1953   offset = dissect_ieee1609dot2_Ieee1609Dot2Data(tvb, offset, &asn1_ctx, tree, hf_ieee1609dot2_Ieee1609Dot2Data_PDU);
1954   return offset;
1955 }
1956
1957
1958 /*--- End of included file: packet-ieee1609dot2-fn.c ---*/
1959 #line 59 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
1960
1961
1962 /*--- proto_register_ieee1609dot2 ----------------------------------------------*/
1963 void proto_register_ieee1609dot2(void) {
1964
1965   /* List of fields */
1966   static hf_register_info hf[] = {
1967
1968 /*--- Included file: packet-ieee1609dot2-hfarr.c ---*/
1969 #line 1 "./asn1/ieee1609dot2/packet-ieee1609dot2-hfarr.c"
1970     { &hf_ieee1609dot2_Ieee1609Dot2Data_PDU,
1971       { "Ieee1609Dot2Data", "ieee1609dot2.Ieee1609Dot2Data_element",
1972         FT_NONE, BASE_NONE, NULL, 0,
1973         NULL, HFILL }},
1974     { &hf_ieee1609dot2_SequenceOfUint8_item,
1975       { "Uint8", "ieee1609dot2.Uint8",
1976         FT_UINT32, BASE_DEC, NULL, 0,
1977         NULL, HFILL }},
1978     { &hf_ieee1609dot2_SequenceOfUint16_item,
1979       { "Uint16", "ieee1609dot2.Uint16",
1980         FT_UINT32, BASE_DEC, NULL, 0,
1981         NULL, HFILL }},
1982     { &hf_ieee1609dot2_start,
1983       { "start", "ieee1609dot2.start",
1984         FT_UINT32, BASE_DEC, NULL, 0,
1985         "Time32", HFILL }},
1986     { &hf_ieee1609dot2_duration,
1987       { "duration", "ieee1609dot2.duration",
1988         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_Duration_vals), 0,
1989         NULL, HFILL }},
1990     { &hf_ieee1609dot2_microseconds,
1991       { "microseconds", "ieee1609dot2.microseconds",
1992         FT_UINT32, BASE_DEC, NULL, 0,
1993         "Uint16", HFILL }},
1994     { &hf_ieee1609dot2_milliseconds,
1995       { "milliseconds", "ieee1609dot2.milliseconds",
1996         FT_UINT32, BASE_DEC, NULL, 0,
1997         "Uint16", HFILL }},
1998     { &hf_ieee1609dot2_seconds,
1999       { "seconds", "ieee1609dot2.seconds",
2000         FT_UINT32, BASE_DEC, NULL, 0,
2001         "Uint16", HFILL }},
2002     { &hf_ieee1609dot2_minutes,
2003       { "minutes", "ieee1609dot2.minutes",
2004         FT_UINT32, BASE_DEC, NULL, 0,
2005         "Uint16", HFILL }},
2006     { &hf_ieee1609dot2_hours,
2007       { "hours", "ieee1609dot2.hours",
2008         FT_UINT32, BASE_DEC, NULL, 0,
2009         "Uint16", HFILL }},
2010     { &hf_ieee1609dot2_sixtyHours,
2011       { "sixtyHours", "ieee1609dot2.sixtyHours",
2012         FT_UINT32, BASE_DEC, NULL, 0,
2013         "Uint16", HFILL }},
2014     { &hf_ieee1609dot2_years,
2015       { "years", "ieee1609dot2.years",
2016         FT_UINT32, BASE_DEC, NULL, 0,
2017         "Uint16", HFILL }},
2018     { &hf_ieee1609dot2_circularRegion,
2019       { "circularRegion", "ieee1609dot2.circularRegion_element",
2020         FT_NONE, BASE_NONE, NULL, 0,
2021         NULL, HFILL }},
2022     { &hf_ieee1609dot2_rectangularRegion,
2023       { "rectangularRegion", "ieee1609dot2.rectangularRegion",
2024         FT_UINT32, BASE_DEC, NULL, 0,
2025         "SequenceOfRectangularRegion", HFILL }},
2026     { &hf_ieee1609dot2_polygonalRegion,
2027       { "polygonalRegion", "ieee1609dot2.polygonalRegion",
2028         FT_UINT32, BASE_DEC, NULL, 0,
2029         NULL, HFILL }},
2030     { &hf_ieee1609dot2_identifiedRegion,
2031       { "identifiedRegion", "ieee1609dot2.identifiedRegion",
2032         FT_UINT32, BASE_DEC, NULL, 0,
2033         "SequenceOfIdentifiedRegion", HFILL }},
2034     { &hf_ieee1609dot2_center,
2035       { "center", "ieee1609dot2.center_element",
2036         FT_NONE, BASE_NONE, NULL, 0,
2037         "TwoDLocation", HFILL }},
2038     { &hf_ieee1609dot2_radius,
2039       { "radius", "ieee1609dot2.radius",
2040         FT_UINT32, BASE_DEC, NULL, 0,
2041         "Uint16", HFILL }},
2042     { &hf_ieee1609dot2_northWest,
2043       { "northWest", "ieee1609dot2.northWest_element",
2044         FT_NONE, BASE_NONE, NULL, 0,
2045         "TwoDLocation", HFILL }},
2046     { &hf_ieee1609dot2_southEast,
2047       { "southEast", "ieee1609dot2.southEast_element",
2048         FT_NONE, BASE_NONE, NULL, 0,
2049         "TwoDLocation", HFILL }},
2050     { &hf_ieee1609dot2_SequenceOfRectangularRegion_item,
2051       { "RectangularRegion", "ieee1609dot2.RectangularRegion_element",
2052         FT_NONE, BASE_NONE, NULL, 0,
2053         NULL, HFILL }},
2054     { &hf_ieee1609dot2_PolygonalRegion_item,
2055       { "TwoDLocation", "ieee1609dot2.TwoDLocation_element",
2056         FT_NONE, BASE_NONE, NULL, 0,
2057         NULL, HFILL }},
2058     { &hf_ieee1609dot2_latitude,
2059       { "latitude", "ieee1609dot2.latitude",
2060         FT_INT32, BASE_DEC, VALS(ieee1609dot2_NinetyDegreeInt_vals), 0,
2061         NULL, HFILL }},
2062     { &hf_ieee1609dot2_longitude,
2063       { "longitude", "ieee1609dot2.longitude",
2064         FT_INT32, BASE_DEC, VALS(ieee1609dot2_OneEightyDegreeInt_vals), 0,
2065         NULL, HFILL }},
2066     { &hf_ieee1609dot2_countryOnly,
2067       { "countryOnly", "ieee1609dot2.countryOnly",
2068         FT_UINT32, BASE_DEC, NULL, 0,
2069         NULL, HFILL }},
2070     { &hf_ieee1609dot2_countryAndRegions,
2071       { "countryAndRegions", "ieee1609dot2.countryAndRegions_element",
2072         FT_NONE, BASE_NONE, NULL, 0,
2073         NULL, HFILL }},
2074     { &hf_ieee1609dot2_countryAndSubregions,
2075       { "countryAndSubregions", "ieee1609dot2.countryAndSubregions_element",
2076         FT_NONE, BASE_NONE, NULL, 0,
2077         NULL, HFILL }},
2078     { &hf_ieee1609dot2_SequenceOfIdentifiedRegion_item,
2079       { "IdentifiedRegion", "ieee1609dot2.IdentifiedRegion",
2080         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_IdentifiedRegion_vals), 0,
2081         NULL, HFILL }},
2082     { &hf_ieee1609dot2_regions,
2083       { "regions", "ieee1609dot2.regions",
2084         FT_UINT32, BASE_DEC, NULL, 0,
2085         "SequenceOfUint8", HFILL }},
2086     { &hf_ieee1609dot2_country,
2087       { "country", "ieee1609dot2.country",
2088         FT_UINT32, BASE_DEC, NULL, 0,
2089         "CountryOnly", HFILL }},
2090     { &hf_ieee1609dot2_regionAndSubregions,
2091       { "regionAndSubregions", "ieee1609dot2.regionAndSubregions",
2092         FT_UINT32, BASE_DEC, NULL, 0,
2093         "SequenceOfRegionAndSubregions", HFILL }},
2094     { &hf_ieee1609dot2_region,
2095       { "region", "ieee1609dot2.region",
2096         FT_UINT32, BASE_DEC, NULL, 0,
2097         "Uint8", HFILL }},
2098     { &hf_ieee1609dot2_subregions,
2099       { "subregions", "ieee1609dot2.subregions",
2100         FT_UINT32, BASE_DEC, NULL, 0,
2101         "SequenceOfUint16", HFILL }},
2102     { &hf_ieee1609dot2_SequenceOfRegionAndSubregions_item,
2103       { "RegionAndSubregions", "ieee1609dot2.RegionAndSubregions_element",
2104         FT_NONE, BASE_NONE, NULL, 0,
2105         NULL, HFILL }},
2106     { &hf_ieee1609dot2_elevation,
2107       { "elevation", "ieee1609dot2.elevation",
2108         FT_UINT32, BASE_DEC, NULL, 0,
2109         NULL, HFILL }},
2110     { &hf_ieee1609dot2_ecdsaNistP256Signature,
2111       { "ecdsaNistP256Signature", "ieee1609dot2.ecdsaNistP256Signature_element",
2112         FT_NONE, BASE_NONE, NULL, 0,
2113         "EcdsaP256Signature", HFILL }},
2114     { &hf_ieee1609dot2_ecdsaBrainpoolP256r1Signature,
2115       { "ecdsaBrainpoolP256r1Signature", "ieee1609dot2.ecdsaBrainpoolP256r1Signature_element",
2116         FT_NONE, BASE_NONE, NULL, 0,
2117         "EcdsaP256Signature", HFILL }},
2118     { &hf_ieee1609dot2_r,
2119       { "r", "ieee1609dot2.r",
2120         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2121         "EccP256CurvePoint", HFILL }},
2122     { &hf_ieee1609dot2_s,
2123       { "s", "ieee1609dot2.s",
2124         FT_BYTES, BASE_NONE, NULL, 0,
2125         "OCTET_STRING_SIZE_32", HFILL }},
2126     { &hf_ieee1609dot2_x_only,
2127       { "x-only", "ieee1609dot2.x_only",
2128         FT_BYTES, BASE_NONE, NULL, 0,
2129         "OCTET_STRING_SIZE_32", HFILL }},
2130     { &hf_ieee1609dot2_fill,
2131       { "fill", "ieee1609dot2.fill_element",
2132         FT_NONE, BASE_NONE, NULL, 0,
2133         NULL, HFILL }},
2134     { &hf_ieee1609dot2_compressed_y_0,
2135       { "compressed-y-0", "ieee1609dot2.compressed_y_0",
2136         FT_BYTES, BASE_NONE, NULL, 0,
2137         "OCTET_STRING_SIZE_32", HFILL }},
2138     { &hf_ieee1609dot2_compressed_y_1,
2139       { "compressed-y-1", "ieee1609dot2.compressed_y_1",
2140         FT_BYTES, BASE_NONE, NULL, 0,
2141         "OCTET_STRING_SIZE_32", HFILL }},
2142     { &hf_ieee1609dot2_uncompressed,
2143       { "uncompressed", "ieee1609dot2.uncompressed_element",
2144         FT_NONE, BASE_NONE, NULL, 0,
2145         NULL, HFILL }},
2146     { &hf_ieee1609dot2_x,
2147       { "x", "ieee1609dot2.x",
2148         FT_BYTES, BASE_NONE, NULL, 0,
2149         "OCTET_STRING_SIZE_32", HFILL }},
2150     { &hf_ieee1609dot2_y,
2151       { "y", "ieee1609dot2.y",
2152         FT_BYTES, BASE_NONE, NULL, 0,
2153         "OCTET_STRING_SIZE_32", HFILL }},
2154     { &hf_ieee1609dot2_v,
2155       { "v", "ieee1609dot2.v",
2156         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2157         "EccP256CurvePoint", HFILL }},
2158     { &hf_ieee1609dot2_c,
2159       { "c", "ieee1609dot2.c",
2160         FT_BYTES, BASE_NONE, NULL, 0,
2161         "OCTET_STRING_SIZE_16", HFILL }},
2162     { &hf_ieee1609dot2_t,
2163       { "t", "ieee1609dot2.t",
2164         FT_BYTES, BASE_NONE, NULL, 0,
2165         "OCTET_STRING_SIZE_16", HFILL }},
2166     { &hf_ieee1609dot2_public,
2167       { "public", "ieee1609dot2.public_element",
2168         FT_NONE, BASE_NONE, NULL, 0,
2169         "PublicEncryptionKey", HFILL }},
2170     { &hf_ieee1609dot2_symmetric,
2171       { "symmetric", "ieee1609dot2.symmetric",
2172         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SymmetricEncryptionKey_vals), 0,
2173         "SymmetricEncryptionKey", HFILL }},
2174     { &hf_ieee1609dot2_supportedSymmAlg,
2175       { "supportedSymmAlg", "ieee1609dot2.supportedSymmAlg",
2176         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SymmAlgorithm_vals), 0,
2177         "SymmAlgorithm", HFILL }},
2178     { &hf_ieee1609dot2_publicKey,
2179       { "publicKey", "ieee1609dot2.publicKey",
2180         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_BasePublicEncryptionKey_vals), 0,
2181         "BasePublicEncryptionKey", HFILL }},
2182     { &hf_ieee1609dot2_eciesNistP256,
2183       { "eciesNistP256", "ieee1609dot2.eciesNistP256",
2184         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2185         "EccP256CurvePoint", HFILL }},
2186     { &hf_ieee1609dot2_eciesBrainpoolP256r1,
2187       { "eciesBrainpoolP256r1", "ieee1609dot2.eciesBrainpoolP256r1",
2188         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2189         "EccP256CurvePoint", HFILL }},
2190     { &hf_ieee1609dot2_ecdsaNistP256,
2191       { "ecdsaNistP256", "ieee1609dot2.ecdsaNistP256",
2192         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2193         "EccP256CurvePoint", HFILL }},
2194     { &hf_ieee1609dot2_ecdsaBrainpoolP256r1,
2195       { "ecdsaBrainpoolP256r1", "ieee1609dot2.ecdsaBrainpoolP256r1",
2196         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2197         "EccP256CurvePoint", HFILL }},
2198     { &hf_ieee1609dot2_aes128Ccm,
2199       { "aes128Ccm", "ieee1609dot2.aes128Ccm",
2200         FT_BYTES, BASE_NONE, NULL, 0,
2201         "OCTET_STRING_SIZE_16", HFILL }},
2202     { &hf_ieee1609dot2_psid,
2203       { "psid", "ieee1609dot2.psid",
2204         FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(ieee1609dot2_Psid_vals), 0,
2205         NULL, HFILL }},
2206     { &hf_ieee1609dot2_ssp,
2207       { "ssp", "ieee1609dot2.ssp",
2208         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_ServiceSpecificPermissions_vals), 0,
2209         "ServiceSpecificPermissions", HFILL }},
2210     { &hf_ieee1609dot2_SequenceOfPsidSsp_item,
2211       { "PsidSsp", "ieee1609dot2.PsidSsp_element",
2212         FT_NONE, BASE_NONE, NULL, 0,
2213         NULL, HFILL }},
2214     { &hf_ieee1609dot2_opaque,
2215       { "opaque", "ieee1609dot2.opaque",
2216         FT_BYTES, BASE_NONE, NULL, 0,
2217         NULL, HFILL }},
2218     { &hf_ieee1609dot2_psid_01,
2219       { "psid", "ieee1609dot2.psid",
2220         FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(ieee1609dot2_Psid_vals), 0,
2221         NULL, HFILL }},
2222     { &hf_ieee1609dot2_sspRange,
2223       { "sspRange", "ieee1609dot2.sspRange",
2224         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SspRange_vals), 0,
2225         NULL, HFILL }},
2226     { &hf_ieee1609dot2_SequenceOfPsidSspRange_item,
2227       { "PsidSspRange", "ieee1609dot2.PsidSspRange_element",
2228         FT_NONE, BASE_NONE, NULL, 0,
2229         NULL, HFILL }},
2230     { &hf_ieee1609dot2_opaque_01,
2231       { "opaque", "ieee1609dot2.opaque",
2232         FT_UINT32, BASE_DEC, NULL, 0,
2233         "SequenceOfOctetString", HFILL }},
2234     { &hf_ieee1609dot2_all,
2235       { "all", "ieee1609dot2.all_element",
2236         FT_NONE, BASE_NONE, NULL, 0,
2237         NULL, HFILL }},
2238     { &hf_ieee1609dot2_SequenceOfOctetString_item,
2239       { "SequenceOfOctetString item", "ieee1609dot2.SequenceOfOctetString_item",
2240         FT_BYTES, BASE_NONE, NULL, 0,
2241         "OCTET_STRING_SIZE_0_MAX", HFILL }},
2242     { &hf_ieee1609dot2_jValue,
2243       { "jValue", "ieee1609dot2.jValue",
2244         FT_BYTES, BASE_NONE, NULL, 0,
2245         "OCTET_STRING_SIZE_4", HFILL }},
2246     { &hf_ieee1609dot2_value,
2247       { "value", "ieee1609dot2.value",
2248         FT_BYTES, BASE_NONE, NULL, 0,
2249         "OCTET_STRING_SIZE_9", HFILL }},
2250     { &hf_ieee1609dot2_data,
2251       { "data", "ieee1609dot2.data_element",
2252         FT_NONE, BASE_NONE, NULL, 0,
2253         "Ieee1609Dot2Data", HFILL }},
2254     { &hf_ieee1609dot2_extDataHash,
2255       { "extDataHash", "ieee1609dot2.extDataHash",
2256         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_HashedData_vals), 0,
2257         "HashedData", HFILL }},
2258     { &hf_ieee1609dot2_protocolVersion,
2259       { "protocolVersion", "ieee1609dot2.protocolVersion",
2260         FT_UINT32, BASE_DEC, NULL, 0,
2261         "Uint8", HFILL }},
2262     { &hf_ieee1609dot2_content,
2263       { "content", "ieee1609dot2.content",
2264         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_Ieee1609Dot2Content_vals), 0,
2265         "Ieee1609Dot2Content", HFILL }},
2266     { &hf_ieee1609dot2_unsecuredData,
2267       { "unsecuredData", "ieee1609dot2.unsecuredData",
2268         FT_BYTES, BASE_NONE, NULL, 0,
2269         NULL, HFILL }},
2270     { &hf_ieee1609dot2_signedData,
2271       { "signedData", "ieee1609dot2.signedData_element",
2272         FT_NONE, BASE_NONE, NULL, 0,
2273         NULL, HFILL }},
2274     { &hf_ieee1609dot2_encryptedData,
2275       { "encryptedData", "ieee1609dot2.encryptedData_element",
2276         FT_NONE, BASE_NONE, NULL, 0,
2277         NULL, HFILL }},
2278     { &hf_ieee1609dot2_signedCertificateRequest,
2279       { "signedCertificateRequest", "ieee1609dot2.signedCertificateRequest",
2280         FT_BYTES, BASE_NONE, NULL, 0,
2281         "Opaque", HFILL }},
2282     { &hf_ieee1609dot2_hashId,
2283       { "hashId", "ieee1609dot2.hashId",
2284         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_HashAlgorithm_vals), 0,
2285         "HashAlgorithm", HFILL }},
2286     { &hf_ieee1609dot2_tbsData,
2287       { "tbsData", "ieee1609dot2.tbsData_element",
2288         FT_NONE, BASE_NONE, NULL, 0,
2289         "ToBeSignedData", HFILL }},
2290     { &hf_ieee1609dot2_signer,
2291       { "signer", "ieee1609dot2.signer",
2292         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SignerIdentifier_vals), 0,
2293         "SignerIdentifier", HFILL }},
2294     { &hf_ieee1609dot2_signature,
2295       { "signature", "ieee1609dot2.signature",
2296         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_Signature_vals), 0,
2297         NULL, HFILL }},
2298     { &hf_ieee1609dot2_digest,
2299       { "digest", "ieee1609dot2.digest",
2300         FT_BYTES, BASE_NONE, NULL, 0,
2301         "HashedId8", HFILL }},
2302     { &hf_ieee1609dot2_certificate,
2303       { "certificate", "ieee1609dot2.certificate",
2304         FT_UINT32, BASE_DEC, NULL, 0,
2305         "SequenceOfCertificate", HFILL }},
2306     { &hf_ieee1609dot2_self,
2307       { "self", "ieee1609dot2.self_element",
2308         FT_NONE, BASE_NONE, NULL, 0,
2309         NULL, HFILL }},
2310     { &hf_ieee1609dot2_payload,
2311       { "payload", "ieee1609dot2.payload_element",
2312         FT_NONE, BASE_NONE, NULL, 0,
2313         "SignedDataPayload", HFILL }},
2314     { &hf_ieee1609dot2_headerInfo,
2315       { "headerInfo", "ieee1609dot2.headerInfo_element",
2316         FT_NONE, BASE_NONE, NULL, 0,
2317         NULL, HFILL }},
2318     { &hf_ieee1609dot2_sha256HashedData,
2319       { "sha256HashedData", "ieee1609dot2.sha256HashedData",
2320         FT_BYTES, BASE_NONE, NULL, 0,
2321         "OCTET_STRING_SIZE_32", HFILL }},
2322     { &hf_ieee1609dot2_psid_02,
2323       { "psid", "ieee1609dot2.psid",
2324         FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(ieee1609dot2_Psid_vals), 0,
2325         "T_psid_01", HFILL }},
2326     { &hf_ieee1609dot2_generationTime,
2327       { "generationTime", "ieee1609dot2.generationTime",
2328         FT_UINT64, BASE_DEC, NULL, 0,
2329         "Time64", HFILL }},
2330     { &hf_ieee1609dot2_expiryTime,
2331       { "expiryTime", "ieee1609dot2.expiryTime",
2332         FT_UINT64, BASE_DEC, NULL, 0,
2333         "Time64", HFILL }},
2334     { &hf_ieee1609dot2_generationLocation,
2335       { "generationLocation", "ieee1609dot2.generationLocation_element",
2336         FT_NONE, BASE_NONE, NULL, 0,
2337         "ThreeDLocation", HFILL }},
2338     { &hf_ieee1609dot2_p2pcdLearningRequest,
2339       { "p2pcdLearningRequest", "ieee1609dot2.p2pcdLearningRequest",
2340         FT_BYTES, BASE_NONE, NULL, 0,
2341         "HashedId3", HFILL }},
2342     { &hf_ieee1609dot2_missingCrlIdentifier,
2343       { "missingCrlIdentifier", "ieee1609dot2.missingCrlIdentifier_element",
2344         FT_NONE, BASE_NONE, NULL, 0,
2345         NULL, HFILL }},
2346     { &hf_ieee1609dot2_encryptionKey,
2347       { "encryptionKey", "ieee1609dot2.encryptionKey",
2348         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EncryptionKey_vals), 0,
2349         NULL, HFILL }},
2350     { &hf_ieee1609dot2_cracaId,
2351       { "cracaId", "ieee1609dot2.cracaId",
2352         FT_BYTES, BASE_NONE, NULL, 0,
2353         "HashedId3", HFILL }},
2354     { &hf_ieee1609dot2_crlSeries,
2355       { "crlSeries", "ieee1609dot2.crlSeries",
2356         FT_UINT32, BASE_DEC, NULL, 0,
2357         NULL, HFILL }},
2358     { &hf_ieee1609dot2_recipients,
2359       { "recipients", "ieee1609dot2.recipients",
2360         FT_UINT32, BASE_DEC, NULL, 0,
2361         "SequenceOfRecipientInfo", HFILL }},
2362     { &hf_ieee1609dot2_ciphertext,
2363       { "ciphertext", "ieee1609dot2.ciphertext",
2364         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SymmetricCiphertext_vals), 0,
2365         "SymmetricCiphertext", HFILL }},
2366     { &hf_ieee1609dot2_pskRecipInfo,
2367       { "pskRecipInfo", "ieee1609dot2.pskRecipInfo",
2368         FT_BYTES, BASE_NONE, NULL, 0,
2369         "PreSharedKeyRecipientInfo", HFILL }},
2370     { &hf_ieee1609dot2_symmRecipInfo,
2371       { "symmRecipInfo", "ieee1609dot2.symmRecipInfo_element",
2372         FT_NONE, BASE_NONE, NULL, 0,
2373         "SymmRecipientInfo", HFILL }},
2374     { &hf_ieee1609dot2_certRecipInfo,
2375       { "certRecipInfo", "ieee1609dot2.certRecipInfo_element",
2376         FT_NONE, BASE_NONE, NULL, 0,
2377         "PKRecipientInfo", HFILL }},
2378     { &hf_ieee1609dot2_signedDataRecipInfo,
2379       { "signedDataRecipInfo", "ieee1609dot2.signedDataRecipInfo_element",
2380         FT_NONE, BASE_NONE, NULL, 0,
2381         "PKRecipientInfo", HFILL }},
2382     { &hf_ieee1609dot2_rekRecipInfo,
2383       { "rekRecipInfo", "ieee1609dot2.rekRecipInfo_element",
2384         FT_NONE, BASE_NONE, NULL, 0,
2385         "PKRecipientInfo", HFILL }},
2386     { &hf_ieee1609dot2_SequenceOfRecipientInfo_item,
2387       { "RecipientInfo", "ieee1609dot2.RecipientInfo",
2388         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_RecipientInfo_vals), 0,
2389         NULL, HFILL }},
2390     { &hf_ieee1609dot2_recipientId,
2391       { "recipientId", "ieee1609dot2.recipientId",
2392         FT_BYTES, BASE_NONE, NULL, 0,
2393         "HashedId8", HFILL }},
2394     { &hf_ieee1609dot2_encKey,
2395       { "encKey", "ieee1609dot2.encKey",
2396         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SymmetricCiphertext_vals), 0,
2397         "SymmetricCiphertext", HFILL }},
2398     { &hf_ieee1609dot2_encKey_01,
2399       { "encKey", "ieee1609dot2.encKey",
2400         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EncryptedDataEncryptionKey_vals), 0,
2401         "EncryptedDataEncryptionKey", HFILL }},
2402     { &hf_ieee1609dot2_eciesNistP256_01,
2403       { "eciesNistP256", "ieee1609dot2.eciesNistP256_element",
2404         FT_NONE, BASE_NONE, NULL, 0,
2405         "EciesP256EncryptedKey", HFILL }},
2406     { &hf_ieee1609dot2_eciesBrainpoolP256r1_01,
2407       { "eciesBrainpoolP256r1", "ieee1609dot2.eciesBrainpoolP256r1_element",
2408         FT_NONE, BASE_NONE, NULL, 0,
2409         "EciesP256EncryptedKey", HFILL }},
2410     { &hf_ieee1609dot2_aes128ccm,
2411       { "aes128ccm", "ieee1609dot2.aes128ccm_element",
2412         FT_NONE, BASE_NONE, NULL, 0,
2413         "AesCcmCiphertext", HFILL }},
2414     { &hf_ieee1609dot2_nonce,
2415       { "nonce", "ieee1609dot2.nonce",
2416         FT_BYTES, BASE_NONE, NULL, 0,
2417         "OCTET_STRING_SIZE_12", HFILL }},
2418     { &hf_ieee1609dot2_ccmCiphertext,
2419       { "ccmCiphertext", "ieee1609dot2.ccmCiphertext",
2420         FT_BYTES, BASE_NONE, NULL, 0,
2421         "Opaque", HFILL }},
2422     { &hf_ieee1609dot2_SequenceOfCertificate_item,
2423       { "Certificate", "ieee1609dot2.Certificate_element",
2424         FT_NONE, BASE_NONE, NULL, 0,
2425         NULL, HFILL }},
2426     { &hf_ieee1609dot2_version,
2427       { "version", "ieee1609dot2.version",
2428         FT_UINT32, BASE_DEC, NULL, 0,
2429         "Uint8", HFILL }},
2430     { &hf_ieee1609dot2_type,
2431       { "type", "ieee1609dot2.type",
2432         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_CertificateType_vals), 0,
2433         "CertificateType", HFILL }},
2434     { &hf_ieee1609dot2_issuer,
2435       { "issuer", "ieee1609dot2.issuer",
2436         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_IssuerIdentifier_vals), 0,
2437         "IssuerIdentifier", HFILL }},
2438     { &hf_ieee1609dot2_toBeSigned,
2439       { "toBeSigned", "ieee1609dot2.toBeSigned_element",
2440         FT_NONE, BASE_NONE, NULL, 0,
2441         "ToBeSignedCertificate", HFILL }},
2442     { &hf_ieee1609dot2_sha256AndDigest,
2443       { "sha256AndDigest", "ieee1609dot2.sha256AndDigest",
2444         FT_BYTES, BASE_NONE, NULL, 0,
2445         "HashedId8", HFILL }},
2446     { &hf_ieee1609dot2_self_01,
2447       { "self", "ieee1609dot2.self",
2448         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_HashAlgorithm_vals), 0,
2449         "HashAlgorithm", HFILL }},
2450     { &hf_ieee1609dot2_id,
2451       { "id", "ieee1609dot2.id",
2452         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_CertificateId_vals), 0,
2453         "CertificateId", HFILL }},
2454     { &hf_ieee1609dot2_validityPeriod,
2455       { "validityPeriod", "ieee1609dot2.validityPeriod_element",
2456         FT_NONE, BASE_NONE, NULL, 0,
2457         NULL, HFILL }},
2458     { &hf_ieee1609dot2_region_01,
2459       { "region", "ieee1609dot2.region",
2460         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_GeographicRegion_vals), 0,
2461         "GeographicRegion", HFILL }},
2462     { &hf_ieee1609dot2_assuranceLevel,
2463       { "assuranceLevel", "ieee1609dot2.assuranceLevel",
2464         FT_BYTES, BASE_NONE, NULL, 0,
2465         "SubjectAssurance", HFILL }},
2466     { &hf_ieee1609dot2_appPermissions,
2467       { "appPermissions", "ieee1609dot2.appPermissions",
2468         FT_UINT32, BASE_DEC, NULL, 0,
2469         "SequenceOfPsidSsp", HFILL }},
2470     { &hf_ieee1609dot2_certIssuePermissions,
2471       { "certIssuePermissions", "ieee1609dot2.certIssuePermissions",
2472         FT_UINT32, BASE_DEC, NULL, 0,
2473         "SequenceOfPsidGroupPermissions", HFILL }},
2474     { &hf_ieee1609dot2_certRequestPermissions,
2475       { "certRequestPermissions", "ieee1609dot2.certRequestPermissions",
2476         FT_UINT32, BASE_DEC, NULL, 0,
2477         "SequenceOfPsidGroupPermissions", HFILL }},
2478     { &hf_ieee1609dot2_canRequestRollover,
2479       { "canRequestRollover", "ieee1609dot2.canRequestRollover_element",
2480         FT_NONE, BASE_NONE, NULL, 0,
2481         NULL, HFILL }},
2482     { &hf_ieee1609dot2_encryptionKey_01,
2483       { "encryptionKey", "ieee1609dot2.encryptionKey_element",
2484         FT_NONE, BASE_NONE, NULL, 0,
2485         "PublicEncryptionKey", HFILL }},
2486     { &hf_ieee1609dot2_verifyKeyIndicator,
2487       { "verifyKeyIndicator", "ieee1609dot2.verifyKeyIndicator",
2488         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_VerificationKeyIndicator_vals), 0,
2489         "VerificationKeyIndicator", HFILL }},
2490     { &hf_ieee1609dot2_linkageData,
2491       { "linkageData", "ieee1609dot2.linkageData_element",
2492         FT_NONE, BASE_NONE, NULL, 0,
2493         NULL, HFILL }},
2494     { &hf_ieee1609dot2_name,
2495       { "name", "ieee1609dot2.name",
2496         FT_STRING, BASE_NONE, NULL, 0,
2497         "Hostname", HFILL }},
2498     { &hf_ieee1609dot2_binaryId,
2499       { "binaryId", "ieee1609dot2.binaryId",
2500         FT_BYTES, BASE_NONE, NULL, 0,
2501         "OCTET_STRING_SIZE_1_64", HFILL }},
2502     { &hf_ieee1609dot2_none,
2503       { "none", "ieee1609dot2.none_element",
2504         FT_NONE, BASE_NONE, NULL, 0,
2505         NULL, HFILL }},
2506     { &hf_ieee1609dot2_iCert,
2507       { "iCert", "ieee1609dot2.iCert",
2508         FT_UINT32, BASE_DEC, NULL, 0,
2509         "IValue", HFILL }},
2510     { &hf_ieee1609dot2_linkage_value,
2511       { "linkage-value", "ieee1609dot2.linkage_value",
2512         FT_BYTES, BASE_NONE, NULL, 0,
2513         "LinkageValue", HFILL }},
2514     { &hf_ieee1609dot2_group_linkage_value,
2515       { "group-linkage-value", "ieee1609dot2.group_linkage_value_element",
2516         FT_NONE, BASE_NONE, NULL, 0,
2517         "GroupLinkageValue", HFILL }},
2518     { &hf_ieee1609dot2_appPermissions_01,
2519       { "appPermissions", "ieee1609dot2.appPermissions",
2520         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_SubjectPermissions_vals), 0,
2521         "SubjectPermissions", HFILL }},
2522     { &hf_ieee1609dot2_minChainDepth,
2523       { "minChainDepth", "ieee1609dot2.minChainDepth",
2524         FT_INT32, BASE_DEC, NULL, 0,
2525         "INTEGER", HFILL }},
2526     { &hf_ieee1609dot2_chainDepthRange,
2527       { "chainDepthRange", "ieee1609dot2.chainDepthRange",
2528         FT_INT32, BASE_DEC, NULL, 0,
2529         "INTEGER", HFILL }},
2530     { &hf_ieee1609dot2_eeType,
2531       { "eeType", "ieee1609dot2.eeType",
2532         FT_BYTES, BASE_NONE, NULL, 0,
2533         "EndEntityType", HFILL }},
2534     { &hf_ieee1609dot2_SequenceOfPsidGroupPermissions_item,
2535       { "PsidGroupPermissions", "ieee1609dot2.PsidGroupPermissions_element",
2536         FT_NONE, BASE_NONE, NULL, 0,
2537         NULL, HFILL }},
2538     { &hf_ieee1609dot2_explicit,
2539       { "explicit", "ieee1609dot2.explicit",
2540         FT_UINT32, BASE_DEC, NULL, 0,
2541         "SequenceOfPsidSspRange", HFILL }},
2542     { &hf_ieee1609dot2_verificationKey,
2543       { "verificationKey", "ieee1609dot2.verificationKey",
2544         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_PublicVerificationKey_vals), 0,
2545         "PublicVerificationKey", HFILL }},
2546     { &hf_ieee1609dot2_reconstructionValue,
2547       { "reconstructionValue", "ieee1609dot2.reconstructionValue",
2548         FT_UINT32, BASE_DEC, VALS(ieee1609dot2_EccP256CurvePoint_vals), 0,
2549         "EccP256CurvePoint", HFILL }},
2550     { &hf_ieee1609dot2_EndEntityType_app,
2551       { "app", "ieee1609dot2.app",
2552         FT_BOOLEAN, 8, NULL, 0x80,
2553         NULL, HFILL }},
2554     { &hf_ieee1609dot2_EndEntityType_enrol,
2555       { "enrol", "ieee1609dot2.enrol",
2556         FT_BOOLEAN, 8, NULL, 0x40,
2557         NULL, HFILL }},
2558
2559 /*--- End of included file: packet-ieee1609dot2-hfarr.c ---*/
2560 #line 67 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
2561   };
2562
2563   /* List of subtrees */
2564   static gint *ett[] = {
2565
2566 /*--- Included file: packet-ieee1609dot2-ettarr.c ---*/
2567 #line 1 "./asn1/ieee1609dot2/packet-ieee1609dot2-ettarr.c"
2568     &ett_ieee1609dot2_SequenceOfUint8,
2569     &ett_ieee1609dot2_SequenceOfUint16,
2570     &ett_ieee1609dot2_ValidityPeriod,
2571     &ett_ieee1609dot2_Duration,
2572     &ett_ieee1609dot2_GeographicRegion,
2573     &ett_ieee1609dot2_CircularRegion,
2574     &ett_ieee1609dot2_RectangularRegion,
2575     &ett_ieee1609dot2_SequenceOfRectangularRegion,
2576     &ett_ieee1609dot2_PolygonalRegion,
2577     &ett_ieee1609dot2_TwoDLocation,
2578     &ett_ieee1609dot2_IdentifiedRegion,
2579     &ett_ieee1609dot2_SequenceOfIdentifiedRegion,
2580     &ett_ieee1609dot2_CountryAndRegions,
2581     &ett_ieee1609dot2_CountryAndSubregions,
2582     &ett_ieee1609dot2_RegionAndSubregions,
2583     &ett_ieee1609dot2_SequenceOfRegionAndSubregions,
2584     &ett_ieee1609dot2_ThreeDLocation,
2585     &ett_ieee1609dot2_Signature,
2586     &ett_ieee1609dot2_EcdsaP256Signature,
2587     &ett_ieee1609dot2_EccP256CurvePoint,
2588     &ett_ieee1609dot2_T_uncompressed,
2589     &ett_ieee1609dot2_EciesP256EncryptedKey,
2590     &ett_ieee1609dot2_EncryptionKey,
2591     &ett_ieee1609dot2_PublicEncryptionKey,
2592     &ett_ieee1609dot2_BasePublicEncryptionKey,
2593     &ett_ieee1609dot2_PublicVerificationKey,
2594     &ett_ieee1609dot2_SymmetricEncryptionKey,
2595     &ett_ieee1609dot2_PsidSsp,
2596     &ett_ieee1609dot2_SequenceOfPsidSsp,
2597     &ett_ieee1609dot2_ServiceSpecificPermissions,
2598     &ett_ieee1609dot2_PsidSspRange,
2599     &ett_ieee1609dot2_SequenceOfPsidSspRange,
2600     &ett_ieee1609dot2_SspRange,
2601     &ett_ieee1609dot2_SequenceOfOctetString,
2602     &ett_ieee1609dot2_GroupLinkageValue,
2603     &ett_ieee1609dot2_SignedDataPayload,
2604     &ett_ieee1609dot2_Ieee1609Dot2Data,
2605     &ett_ieee1609dot2_Ieee1609Dot2Content,
2606     &ett_ieee1609dot2_SignedData,
2607     &ett_ieee1609dot2_SignerIdentifier,
2608     &ett_ieee1609dot2_ToBeSignedData,
2609     &ett_ieee1609dot2_HashedData,
2610     &ett_ieee1609dot2_HeaderInfo,
2611     &ett_ieee1609dot2_MissingCrlIdentifier,
2612     &ett_ieee1609dot2_EncryptedData,
2613     &ett_ieee1609dot2_RecipientInfo,
2614     &ett_ieee1609dot2_SequenceOfRecipientInfo,
2615     &ett_ieee1609dot2_SymmRecipientInfo,
2616     &ett_ieee1609dot2_PKRecipientInfo,
2617     &ett_ieee1609dot2_EncryptedDataEncryptionKey,
2618     &ett_ieee1609dot2_SymmetricCiphertext,
2619     &ett_ieee1609dot2_AesCcmCiphertext,
2620     &ett_ieee1609dot2_SequenceOfCertificate,
2621     &ett_ieee1609dot2_CertificateBase,
2622     &ett_ieee1609dot2_IssuerIdentifier,
2623     &ett_ieee1609dot2_ToBeSignedCertificate,
2624     &ett_ieee1609dot2_CertificateId,
2625     &ett_ieee1609dot2_LinkageData,
2626     &ett_ieee1609dot2_EndEntityType,
2627     &ett_ieee1609dot2_PsidGroupPermissions,
2628     &ett_ieee1609dot2_SequenceOfPsidGroupPermissions,
2629     &ett_ieee1609dot2_SubjectPermissions,
2630     &ett_ieee1609dot2_VerificationKeyIndicator,
2631
2632 /*--- End of included file: packet-ieee1609dot2-ettarr.c ---*/
2633 #line 72 "./asn1/ieee1609dot2/packet-ieee1609dot2-template.c"
2634         &ett_ieee1609dot2_ssp,
2635   };
2636
2637   /* Register protocol */
2638   proto_ieee1609dot2 = proto_register_protocol(PNAME, PSNAME, PFNAME);
2639
2640   /* Register fields and subtrees */
2641   proto_register_field_array(proto_ieee1609dot2, hf, array_length(hf));
2642   proto_register_subtree_array(ett, array_length(ett));
2643
2644   register_dissector("ieee1609dot2.data", dissect_Ieee1609Dot2Data_PDU, proto_ieee1609dot2);
2645
2646   // See TS17419_ITS-AID_AssignedNumbers
2647   unsecured_data_subdissector_table = register_dissector_table("ieee1609dot2.psid",
2648         "ATS-AID/PSID based dissector for unsecured/signed data", proto_ieee1609dot2, FT_UINT32, BASE_HEX);
2649   ssp_subdissector_table = register_dissector_table("ieee1609dot2.ssp",
2650         "ATS-AID/PSID based dissector for Service Specific Permissions (SSP)", proto_ieee1609dot2, FT_UINT32, BASE_HEX);
2651 }
2652
2653 void
2654 proto_reg_handoff_IEEE1609dot2(void)
2655 {
2656
2657 }