/src/wireshark/epan/dissectors/packet-mikey.c
Line | Count | Source |
1 | | /* packet-mikey.c |
2 | | * Routines for Multimedia Internet KEYing dissection |
3 | | * Copyright 2007, Mikael Magnusson <mikma@users.sourceforge.net> |
4 | | * |
5 | | * Wireshark - Network traffic analyzer |
6 | | * By Gerald Combs <gerald@wireshark.org> |
7 | | * Copyright 1998 Gerald Combs |
8 | | * |
9 | | * |
10 | | * SPDX-License-Identifier: GPL-2.0-or-later |
11 | | * |
12 | | * Ref: |
13 | | * https://tools.ietf.org/html/rfc3830 MIKEY |
14 | | * https://tools.ietf.org/html/rfc6043 MIKEY-TICKET (ID role required for SAKKE) |
15 | | * https://tools.ietf.org/html/rfc6509 MIKEY-SAKKE |
16 | | */ |
17 | | |
18 | | /* |
19 | | * TODO |
20 | | * tvbuff offset in 32-bit variable. |
21 | | * Support CHASH |
22 | | * Decode Mikey-PK and Mikey-RSA-R with NULL encryption |
23 | | */ |
24 | | |
25 | | |
26 | | #include "config.h" |
27 | | |
28 | | #include <epan/packet.h> |
29 | | #include <epan/asn1.h> |
30 | | #include <epan/proto_data.h> |
31 | | #include <epan/tfs.h> |
32 | | #include <wsutil/array.h> |
33 | | #include "packet-x509af.h" |
34 | | |
35 | | void proto_register_mikey(void); |
36 | | void proto_reg_handoff_mikey(void); |
37 | | |
38 | 28 | #define PORT_MIKEY 2269 |
39 | | |
40 | | static const value_string on_off_vals[] = { |
41 | | { 0, "Off" }, |
42 | | { 1, "On" }, |
43 | | { 0, NULL } |
44 | | }; |
45 | | |
46 | | enum data_type_t { |
47 | | MIKEY_TYPE_PSK_INIT = 0, |
48 | | MIKEY_TYPE_PSK_RESP, |
49 | | MIKEY_TYPE_PK_INIT, |
50 | | MIKEY_TYPE_PK_RESP, |
51 | | MIKEY_TYPE_DH_INIT, |
52 | | MIKEY_TYPE_DH_RESP, |
53 | | MIKEY_TYPE_ERROR, |
54 | | MIKEY_TYPE_DHHMAC_INIT, |
55 | | MIKEY_TYPE_DHHMAC_RESP, |
56 | | MIKEY_TYPE_RSA_R_INIT, |
57 | | MIKEY_TYPE_RSA_R_RESP, |
58 | | MIKEY_TYPE_SAKKE_INIT = 26, |
59 | | MIKEY_TYPE_SAKKE_RESP |
60 | | }; |
61 | | |
62 | | static const value_string data_type_vals[] = { |
63 | | { MIKEY_TYPE_PSK_INIT, "Pre-shared" }, |
64 | | { MIKEY_TYPE_PSK_RESP, "PSK ver msg" }, |
65 | | { MIKEY_TYPE_PK_INIT, "Public key" }, |
66 | | { MIKEY_TYPE_PK_RESP, "PK ver msg" }, |
67 | | { MIKEY_TYPE_DH_INIT, "D-H init" }, |
68 | | { MIKEY_TYPE_DH_RESP, "D-H resp" }, |
69 | | { MIKEY_TYPE_ERROR, "Error" }, |
70 | | { MIKEY_TYPE_DHHMAC_INIT, "DHHMAC init" }, |
71 | | { MIKEY_TYPE_DHHMAC_RESP, "DHHMAC resp" }, |
72 | | { MIKEY_TYPE_RSA_R_INIT, "RSA-R I_MSG" }, |
73 | | { MIKEY_TYPE_RSA_R_RESP, "RSA-R R_MSG" }, |
74 | | { MIKEY_TYPE_SAKKE_INIT, "SAKKE" }, |
75 | | { MIKEY_TYPE_SAKKE_RESP, "CS Id map Update" }, |
76 | | { 0, NULL } |
77 | | }; |
78 | | static value_string_ext data_type_vals_ext = VALUE_STRING_EXT_INIT(data_type_vals); |
79 | | |
80 | | enum cs_id_map_t { |
81 | | CS_ID_SRTP = 0 |
82 | | }; |
83 | | |
84 | | static const value_string cs_id_map_vals[] = { |
85 | | { CS_ID_SRTP, "SRTP-ID" }, |
86 | | { 0, NULL } |
87 | | }; |
88 | | |
89 | | enum payload_t { |
90 | | PL_HDR = -1, |
91 | | PL_LAST, |
92 | | PL_KEMAC, |
93 | | PL_PKE, |
94 | | PL_DH, |
95 | | PL_SIGN, |
96 | | PL_T, |
97 | | PL_ID, |
98 | | PL_CERT, |
99 | | PL_CHASH, |
100 | | PL_V, |
101 | | PL_SP, |
102 | | PL_RAND, |
103 | | PL_ERR, |
104 | | PL_TR = 13, /* MIKEY-TICKET (6043) */ |
105 | | PL_IDR, |
106 | | PL_RANDR, |
107 | | PL_TP, |
108 | | PL_TICKET, |
109 | | PL_KEY_DATA = 20, |
110 | | PL_GENERAL_EXT, |
111 | | PL_SAKKE = 26, |
112 | | PL_MAX |
113 | | }; |
114 | | |
115 | 14 | #define PL_HDR_TEXT "Common Header (HDR)" |
116 | | #define PL_LAST_TEXT "Last payload" |
117 | 14 | #define PL_KEMAC_TEXT "Key Data Transport (KEMAC)" |
118 | 14 | #define PL_PKE_TEXT "Envelope Data (PKE)" |
119 | 14 | #define PL_DH_TEXT "DH Data (DH)" |
120 | 14 | #define PL_SIGN_TEXT "Signature (SIGN)" |
121 | 14 | #define PL_T_TEXT "Timestamp (T)" |
122 | 14 | #define PL_ID_TEXT "ID" |
123 | 14 | #define PL_CERT_TEXT "Certificate (CERT)" |
124 | 14 | #define PL_CHASH_TEXT "CHASH" |
125 | 14 | #define PL_V_TEXT "Ver msg (V)" |
126 | 14 | #define PL_SP_TEXT "Security Policy (SP)" |
127 | 14 | #define PL_RAND_TEXT "RAND" |
128 | 14 | #define PL_ERR_TEXT "Error (ERR)" |
129 | 14 | #define PL_KEY_DATA_TEXT "Key data (KEY)" |
130 | 14 | #define PL_IDR_TEXT "IDR" |
131 | 14 | #define PL_GENERAL_EXT_TEXT "General Extension (EXT)" |
132 | 14 | #define PL_SAKKE_TEXT "SAKKE Encapsulated Data (SAKKE)" |
133 | | |
134 | | static const value_string payload_vals[] = { |
135 | | { PL_HDR, PL_HDR_TEXT }, |
136 | | { PL_LAST, PL_LAST_TEXT }, |
137 | | { PL_KEMAC, PL_KEMAC_TEXT }, |
138 | | { PL_PKE, PL_PKE_TEXT }, |
139 | | { PL_DH, PL_DH_TEXT }, |
140 | | { PL_SIGN, PL_SIGN_TEXT }, |
141 | | { PL_T, PL_T_TEXT }, |
142 | | { PL_ID, PL_ID_TEXT }, |
143 | | { PL_CERT, PL_CERT_TEXT }, |
144 | | { PL_CHASH, PL_CHASH_TEXT }, |
145 | | { PL_V, PL_V_TEXT }, |
146 | | { PL_SP, PL_SP_TEXT }, |
147 | | { PL_RAND, PL_RAND_TEXT }, |
148 | | { PL_ERR, PL_ERR_TEXT }, |
149 | | { PL_IDR, PL_IDR_TEXT }, |
150 | | { PL_KEY_DATA, PL_KEY_DATA_TEXT }, |
151 | | { PL_GENERAL_EXT, PL_GENERAL_EXT_TEXT }, |
152 | | { PL_SAKKE, PL_SAKKE_TEXT }, |
153 | | { 0, NULL } |
154 | | }; |
155 | | #if 0 /* First entry (PL_HDR) is -1 and there are gaps so this doesn't work */ |
156 | | static value_string_ext payload_vals_ext = VALUE_STRING_EXT_INIT(payload_vals); |
157 | | #endif |
158 | | |
159 | | enum ts_type_t { |
160 | | T_NTP_UTC = 0, |
161 | | T_NTP, |
162 | | T_COUNTER |
163 | | }; |
164 | | |
165 | | static const value_string ts_type_vals[] = { |
166 | | { T_NTP_UTC, "NTP-UTC" }, |
167 | | { T_NTP, "NTP" }, |
168 | | { T_COUNTER, "COUNTER" }, |
169 | | { 0, NULL } |
170 | | }; |
171 | | |
172 | | enum encr_alg_t { |
173 | | ENCR_NULL = 0, |
174 | | ENCR_AES_CM_128, |
175 | | ENCR_AES_KW_128 |
176 | | }; |
177 | | |
178 | | static const value_string encr_alg_vals[] = { |
179 | | { ENCR_NULL, "NULL" }, |
180 | | { ENCR_AES_CM_128, "AES-CM-128" }, |
181 | | { ENCR_AES_KW_128, "AES-KW-128" }, |
182 | | { 0, NULL } |
183 | | }; |
184 | | |
185 | | enum oakley_t { |
186 | | DH_OAKLEY_5 = 0, |
187 | | DH_OAKLEY_1, |
188 | | DH_OAKLEY_2 |
189 | | }; |
190 | | |
191 | | static const value_string oakley_vals[] = { |
192 | | { DH_OAKLEY_5, "OAKLEY 5" }, |
193 | | { DH_OAKLEY_1, "OAKLEY 1" }, |
194 | | { DH_OAKLEY_2, "OAKLEY 2" }, |
195 | | { 0, NULL } |
196 | | }; |
197 | | |
198 | | enum mac_alg_t { |
199 | | MAC_NULL = 0, |
200 | | MAC_HMAC_SHA_1_160 |
201 | | }; |
202 | | |
203 | | static const value_string mac_alg_vals[] = { |
204 | | { MAC_NULL, "NULL" }, |
205 | | { MAC_HMAC_SHA_1_160, "HMAC-SHA-1-160" }, |
206 | | { 0, NULL } |
207 | | }; |
208 | | |
209 | | enum pke_c_t { |
210 | | PKE_C_NO_CACHE = 0, |
211 | | PKE_C_CACHE, |
212 | | PKE_C_CACHE_CSB |
213 | | }; |
214 | | |
215 | | static const value_string pke_c_vals[] = { |
216 | | { PKE_C_NO_CACHE, "No cache" }, |
217 | | { PKE_C_CACHE, "Cache" }, |
218 | | { PKE_C_CACHE_CSB, "Cache for CSB" }, |
219 | | { 0, NULL } |
220 | | }; |
221 | | |
222 | | enum sign_s_t { |
223 | | SIGN_S_PKCS1 = 0, |
224 | | SIGN_S_PSS, |
225 | | SIGN_S_ECCSI |
226 | | }; |
227 | | |
228 | | static const value_string sign_s_vals[] = { |
229 | | { SIGN_S_PKCS1, "RSA/PKCS#1/1.5" }, |
230 | | { SIGN_S_PSS, "RSA/PSS" }, |
231 | | { SIGN_S_ECCSI, "ECCSI" }, |
232 | | { 0, NULL } |
233 | | }; |
234 | | |
235 | | enum id_type_t { |
236 | | ID_TYPE_NAI = 0, |
237 | | ID_TYPE_URI, |
238 | | ID_TYPE_BYTE_STRING |
239 | | }; |
240 | | |
241 | | static const value_string id_type_vals[] = { |
242 | | { ID_TYPE_NAI, "NAI" }, |
243 | | { ID_TYPE_URI, "URI" }, |
244 | | { ID_TYPE_BYTE_STRING, "Byte string" }, |
245 | | { 0, NULL } |
246 | | }; |
247 | | |
248 | | enum id_role_t { |
249 | | ID_ROLE_RESERVED = 0, |
250 | | ID_ROLE_INIT, |
251 | | ID_ROLE_RESP, |
252 | | ID_ROLE_KMS, |
253 | | ID_ROLE_PSK, |
254 | | ID_ROLE_APP, |
255 | | ID_ROLE_INIT_KMS, |
256 | | ID_ROLE_RESP_KMS |
257 | | }; |
258 | | |
259 | | static const value_string id_role_vals[] = { |
260 | | { ID_ROLE_RESERVED, "Reserved" }, |
261 | | { ID_ROLE_INIT, "Initiator (IDRi)" }, |
262 | | { ID_ROLE_RESP, "Responder (IDRr)" }, |
263 | | { ID_ROLE_KMS, "KMS (IDRkms)" }, |
264 | | { ID_ROLE_PSK, "Pre-Shared Key (IDRpsk)" }, |
265 | | { ID_ROLE_APP, "Application (IDRapp)" }, |
266 | | { ID_ROLE_INIT_KMS, "Initiator's KMS (IDRkmsi)" }, |
267 | | { ID_ROLE_RESP_KMS, "Responder's KMS (IDRkmsr)" }, |
268 | | { 0, NULL } |
269 | | }; |
270 | | |
271 | | enum cert_type_t { |
272 | | CERT_TYPE_X509V3 = 0, |
273 | | CERT_TYPE_X509V3_URL, |
274 | | CERT_TYPE_X509V3_SIGN, |
275 | | CERT_TYPE_X509V3_ENCR |
276 | | }; |
277 | | |
278 | | static const value_string cert_type_vals[] = { |
279 | | { CERT_TYPE_X509V3, "X.509v3" }, |
280 | | { CERT_TYPE_X509V3_URL, "X.509v3 URL" }, |
281 | | { CERT_TYPE_X509V3_SIGN, "X.509v3 Sign" }, |
282 | | { CERT_TYPE_X509V3_ENCR, "X.509v3 Encr" }, |
283 | | { 0, NULL } |
284 | | }; |
285 | | |
286 | | enum srtp_policy_type_t { |
287 | | SP_ENCR_ALG, |
288 | | SP_ENCR_LEN, |
289 | | SP_AUTH_ALG, |
290 | | SP_AUTH_KEY_LEN, |
291 | | SP_SALT_LEN, |
292 | | SP_PRF, |
293 | | SP_KD_RATE, |
294 | | SP_SRTP_ENCR, |
295 | | SP_SRTCP_ENCR, |
296 | | SP_FEC, |
297 | | SP_SRTP_AUTH, |
298 | | SP_AUTH_TAG_LEN, |
299 | | SP_SRTP_PREFIX, |
300 | | SP_MAX |
301 | | }; |
302 | | |
303 | 14 | #define SP_TEXT_ENCR_ALG "Encryption algorithm" |
304 | 14 | #define SP_TEXT_ENCR_LEN "Session Encr. key length" |
305 | 14 | #define SP_TEXT_AUTH_ALG "Authentication algorithm" |
306 | 14 | #define SP_TEXT_AUTH_KEY_LEN "Session Auth. key length" |
307 | 14 | #define SP_TEXT_SALT_LEN "Session Salt key length" |
308 | 14 | #define SP_TEXT_PRF "SRTP Pseudo Random Function" |
309 | 14 | #define SP_TEXT_KD_RATE "Key derivation rate" |
310 | 14 | #define SP_TEXT_SRTP_ENCR "SRTP encryption" |
311 | 14 | #define SP_TEXT_SRTCP_ENCR "SRTCP encryption" |
312 | 14 | #define SP_TEXT_FEC "Sender's FEC order" |
313 | 14 | #define SP_TEXT_SRTP_AUTH "SRTP authentication" |
314 | 14 | #define SP_TEXT_AUTH_TAG_LEN "Authentication tag length" |
315 | 14 | #define SP_TEXT_SRTP_PREFIX "SRTP prefix length" |
316 | | |
317 | | #if 0 |
318 | | static const value_string srtp_policy_type_vals[] = { |
319 | | { SP_ENCR_ALG, SP_TEXT_ENCR_ALG }, |
320 | | { SP_ENCR_LEN, SP_TEXT_ENCR_LEN }, |
321 | | { SP_AUTH_ALG, SP_TEXT_AUTH_ALG }, |
322 | | { SP_AUTH_KEY_LEN, SP_TEXT_AUTH_KEY_LEN }, |
323 | | { SP_SALT_LEN, SP_TEXT_SALT_LEN }, |
324 | | { SP_PRF, SP_TEXT_PRF }, |
325 | | { SP_KD_RATE, SP_TEXT_KD_RATE }, |
326 | | { SP_SRTP_ENCR, SP_TEXT_SRTP_ENCR }, |
327 | | { SP_SRTCP_ENCR, SP_TEXT_SRTCP_ENCR }, |
328 | | { SP_FEC, SP_TEXT_FEC }, |
329 | | { SP_SRTP_AUTH, SP_TEXT_SRTP_AUTH }, |
330 | | { SP_AUTH_TAG_LEN, SP_TEXT_AUTH_TAG_LEN }, |
331 | | { SP_SRTP_PREFIX, SP_TEXT_SRTP_PREFIX }, |
332 | | { 0, NULL } |
333 | | }; |
334 | | #endif |
335 | | |
336 | | enum sp_encr_alg_t { |
337 | | SP_ENCR_NULL = 0, |
338 | | SP_ENCR_AES_CM, |
339 | | SP_ENCR_AES_F8 |
340 | | }; |
341 | | |
342 | | static const value_string sp_encr_alg_vals[] = { |
343 | | { SP_ENCR_NULL, "NULL" }, |
344 | | { SP_ENCR_AES_CM, "AES-CM" }, |
345 | | { SP_ENCR_AES_F8, "AES-F8" }, |
346 | | { 0, NULL } |
347 | | }; |
348 | | |
349 | | enum sp_auth_alg_t { |
350 | | SP_AUTH_NULL = 0, |
351 | | SP_AUTH_HMAC_SHA_1 |
352 | | }; |
353 | | |
354 | | static const value_string sp_auth_alg_vals[] = { |
355 | | { SP_AUTH_NULL, "NULL" }, |
356 | | { SP_AUTH_HMAC_SHA_1, "HMAC-SHA-1" }, |
357 | | { 0, NULL } |
358 | | }; |
359 | | |
360 | | enum sp_prf_t { |
361 | | SP_PRF_AES_CM = 0 |
362 | | }; |
363 | | |
364 | | static const value_string sp_prf_vals[] = { |
365 | | { SP_PRF_AES_CM, "AES-CM" }, |
366 | | { 0, NULL } |
367 | | }; |
368 | | |
369 | | enum sp_fec_t { |
370 | | SP_FEC_SRTP = 0 |
371 | | }; |
372 | | |
373 | | static const value_string sp_fec_vals[] = { |
374 | | { SP_FEC_SRTP, "FEC-SRTP" }, |
375 | | { 0, NULL } |
376 | | }; |
377 | | |
378 | | enum sp_prot_t { |
379 | | SP_PROT_TYPE_SRTP = 0 |
380 | | }; |
381 | | |
382 | | static const value_string sp_prot_type_vals[] = { |
383 | | { SP_PROT_TYPE_SRTP, "SRTP" }, |
384 | | { 0, NULL } |
385 | | }; |
386 | | |
387 | | enum prf_func_t { |
388 | | PRF_FUNC_MIKEY_1 = 0 |
389 | | }; |
390 | | |
391 | | static const value_string prf_func_vals[] = { |
392 | | { PRF_FUNC_MIKEY_1, "MIKEY-1" }, |
393 | | { 0, NULL } |
394 | | }; |
395 | | |
396 | | enum kv_t { |
397 | | KV_NULL = 0, |
398 | | KV_SPI, |
399 | | KV_INTERVAL |
400 | | }; |
401 | | |
402 | | static const value_string kv_vals[] = { |
403 | | { KV_NULL, "Null" }, |
404 | | { KV_SPI, "SPI/MKI" }, |
405 | | { KV_INTERVAL, "Interval" }, |
406 | | { 0, NULL } |
407 | | }; |
408 | | |
409 | | enum kd_t { |
410 | | KD_TGK = 0, |
411 | | KD_TGK_SALT, |
412 | | KD_TEK, |
413 | | KD_TEK_SALT |
414 | | }; |
415 | | |
416 | | static const value_string kd_vals[] = { |
417 | | { KD_TGK, "TGK" }, |
418 | | { KD_TGK_SALT, "TGK+SALT" }, |
419 | | { KD_TEK, "TEK" }, |
420 | | { KD_TEK_SALT, "TEK+SALT" }, |
421 | | { 0, NULL } |
422 | | }; |
423 | | |
424 | | enum err_t { |
425 | | ERR_AUTH_FAILURE = 0, |
426 | | ERR_INVALID_TS, |
427 | | ERR_INVALID_PRF, |
428 | | ERR_INVALID_MAC, |
429 | | ERR_INVALID_EA, |
430 | | ERR_INVALID_HA, |
431 | | ERR_INVALID_DH, |
432 | | ERR_INVALID_ID, |
433 | | ERR_INVALID_CERT, |
434 | | ERR_INVALID_SP, |
435 | | ERR_INVALID_SPPAR, |
436 | | ERR_INVALID_DT, |
437 | | ERR_UNKNOWN |
438 | | }; |
439 | | |
440 | | static const value_string err_vals[] = { |
441 | | { ERR_AUTH_FAILURE, "Authentication failure" }, |
442 | | { ERR_INVALID_TS, "Invalid timestamp" }, |
443 | | { ERR_INVALID_PRF, "PRF function not supported" }, |
444 | | { ERR_INVALID_MAC, "MAC algorithm not supported" }, |
445 | | { ERR_INVALID_EA, "Encryption algorithm not supported" }, |
446 | | { ERR_INVALID_HA, "Hash function not supported" }, |
447 | | { ERR_INVALID_DH, "DH group not supported" }, |
448 | | { ERR_INVALID_ID, "ID not supported" }, |
449 | | { ERR_INVALID_CERT, "Certificate not supported" }, |
450 | | { ERR_INVALID_SP, "SP type not supported" }, |
451 | | { ERR_INVALID_SPPAR, "SP parameters not supported" }, |
452 | | { ERR_INVALID_DT, "Data type not supported" }, |
453 | | { ERR_UNKNOWN, "Unspecified error" }, |
454 | | { 0, NULL } |
455 | | }; |
456 | | static value_string_ext err_vals_ext = VALUE_STRING_EXT_INIT(err_vals); |
457 | | |
458 | | enum genext_t { |
459 | | GEN_EXT_VENDOR_ID = 0, |
460 | | GEN_EXT_SDP_ID |
461 | | }; |
462 | | |
463 | | static const value_string genext_type_vals[] = { |
464 | | { GEN_EXT_VENDOR_ID, "Vendor-ID" }, |
465 | | { GEN_EXT_SDP_ID, "SDP-IDs" }, |
466 | | { 0, NULL } |
467 | | }; |
468 | | |
469 | | enum { |
470 | | /* HDR */ |
471 | | POS_HDR_VERSION=0, |
472 | | POS_HDR_DATA_TYPE, |
473 | | POS_HDR_V, |
474 | | POS_HDR_PRF_FUNC, |
475 | | POS_HDR_CSB_ID, |
476 | | POS_HDR_CS_COUNT, |
477 | | POS_HDR_CS_ID_MAP_TYPE, |
478 | | POS_ID_SRTP, |
479 | | POS_ID_SRTP_NO, |
480 | | POS_ID_SRTP_SSRC, |
481 | | POS_ID_SRTP_ROC, |
482 | | |
483 | | /* KEMAC */ |
484 | | POS_KEMAC_ENCR_ALG, |
485 | | POS_KEMAC_ENCR_DATA_LEN, |
486 | | POS_KEMAC_ENCR_DATA, |
487 | | POS_KEMAC_MAC_ALG, |
488 | | POS_KEMAC_MAC, |
489 | | |
490 | | /* PKE */ |
491 | | POS_PKE_C, |
492 | | POS_PKE_DATA_LEN, |
493 | | POS_PKE_DATA, |
494 | | |
495 | | /* DH */ |
496 | | POS_DH_GROUP, |
497 | | POS_DH_VALUE, |
498 | | POS_DH_RESERV, |
499 | | POS_DH_KV, |
500 | | |
501 | | /* SIGN */ |
502 | | POS_SIGNATURE_LEN, |
503 | | POS_SIGNATURE, |
504 | | POS_SIGN_S_TYPE, |
505 | | |
506 | | /* T */ |
507 | | POS_TS_TYPE, |
508 | | POS_TS_NTP, |
509 | | |
510 | | /* ID/IDR */ |
511 | | POS_ID_ROLE, |
512 | | POS_ID_TYPE, |
513 | | POS_ID_LEN, |
514 | | POS_ID, |
515 | | |
516 | | /* CERT */ |
517 | | POS_CERT_TYPE, |
518 | | POS_CERT_LEN, |
519 | | POS_CERTIFICATE, |
520 | | |
521 | | /* V */ |
522 | | POS_V_AUTH_ALG, |
523 | | POS_V_DATA, |
524 | | |
525 | | /* SP */ |
526 | | POS_SP_NO, |
527 | | POS_SP_TYPE, |
528 | | POS_SP_PARAM_LEN, |
529 | | /* POS_SP_PARAM, */ |
530 | | |
531 | | /* SP param */ |
532 | | POS_SP_PARAM_F, |
533 | | POS_SP_PARAM_F_TYPE, |
534 | | POS_SP_PARAM_F_LEN, |
535 | | POS_SP_PARAM_F_VALUE, |
536 | | |
537 | | /* RAND */ |
538 | | POS_RAND_LEN, |
539 | | POS_RAND, |
540 | | |
541 | | /* Error */ |
542 | | POS_ERR_NO, |
543 | | POS_ERR_RESERVED, |
544 | | |
545 | | /* Key data */ |
546 | | POS_KEY_DATA_TYPE, |
547 | | POS_KEY_DATA_KV, |
548 | | POS_KEY_DATA_LEN, |
549 | | POS_KEY_DATA, |
550 | | POS_KEY_SALT_LEN, |
551 | | POS_KEY_SALT, |
552 | | POS_KEY_KV_FROM_LEN, |
553 | | POS_KEY_KV_FROM, |
554 | | POS_KEY_KV_TO_LEN, |
555 | | POS_KEY_KV_TO, |
556 | | POS_KEY_KV_SPI_LEN, |
557 | | POS_KEY_KV_SPI, |
558 | | |
559 | | /* General Ext. */ |
560 | | POS_GENERAL_EXT_TYPE, |
561 | | POS_GENERAL_EXT_LEN, |
562 | | POS_GENERAL_EXT_DATA, |
563 | | POS_GENERAL_EXT_VALUE, |
564 | | |
565 | | /* SAKKE */ |
566 | | POS_SAKKE_PARAMS, |
567 | | POS_SAKKE_ID_SCHEME, |
568 | | POS_SAKKE_LEN, |
569 | | POS_SAKKE_DATA, |
570 | | |
571 | | /* MIKEY */ |
572 | | POS_PAYLOAD_STR, |
573 | | POS_NEXT_PAYLOAD, |
574 | | |
575 | | /* Unused */ |
576 | | /* POS_PAYLOAD, */ |
577 | | |
578 | | MAX_POS |
579 | | }; |
580 | | |
581 | | typedef struct tag_mikey_t { |
582 | | uint8_t type; |
583 | | } mikey_t; |
584 | | |
585 | | typedef int (*mikey_dissector_t)(mikey_t *, tvbuff_t *, packet_info *, proto_tree *); |
586 | | struct mikey_dissector_entry { |
587 | | int type; |
588 | | mikey_dissector_t dissector; |
589 | | }; |
590 | | |
591 | | /* Forward declaration we need below */ |
592 | | static int dissect_payload(int payload, mikey_t *mikey, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); |
593 | | |
594 | | |
595 | | /* Initialize the protocol and registered fields */ |
596 | | static int proto_mikey; |
597 | | static int hf_mikey[MAX_POS+1]; |
598 | | static int hf_mikey_sp_param[SP_MAX+1]; |
599 | | static int hf_mikey_pl[PL_MAX]; |
600 | | |
601 | | /* Initialize the subtree pointers */ |
602 | | static int ett_mikey; |
603 | | static int ett_mikey_payload; |
604 | | static int ett_mikey_sp_param; |
605 | | static int ett_mikey_hdr_id; |
606 | | static int ett_mikey_enc_data; |
607 | | |
608 | | static dissector_handle_t mikey_handle; |
609 | | |
610 | | static const struct mikey_dissector_entry * |
611 | | mikey_dissector_lookup(const struct mikey_dissector_entry *map, int type) |
612 | 991 | { |
613 | 991 | unsigned int i; |
614 | 2.14k | for (i = 0; map[i].dissector != NULL; i++) { |
615 | 1.26k | if (map[i].type == type) { |
616 | 110 | return &map[i]; |
617 | 110 | } |
618 | 1.26k | } |
619 | | |
620 | 881 | return NULL; |
621 | 991 | } |
622 | | |
623 | | static void |
624 | | add_next_payload(tvbuff_t *tvb, proto_tree *tree, int offset) |
625 | 49 | { |
626 | 49 | proto_tree_add_item(tree, hf_mikey[POS_NEXT_PAYLOAD], tvb, offset, 1, ENC_BIG_ENDIAN); |
627 | 49 | } |
628 | | |
629 | | |
630 | | static int |
631 | | dissect_payload_cs_id_srtp(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
632 | 61 | { |
633 | 61 | if (tree) { |
634 | 61 | proto_item *id_ti; |
635 | 61 | proto_tree *id_tree; |
636 | 61 | uint8_t no; |
637 | 61 | uint32_t ssrc; |
638 | 61 | uint32_t roc; |
639 | | |
640 | 61 | no = tvb_get_uint8(tvb, 0); |
641 | 61 | ssrc = tvb_get_ntohl(tvb, 1); |
642 | 61 | roc = tvb_get_ntohl(tvb, 5); |
643 | | |
644 | 61 | id_ti = proto_tree_add_none_format(tree, hf_mikey[POS_ID_SRTP], tvb, 0, 9, |
645 | 61 | "SRTP ID: Policy: %d, SSRC: 0x%x, ROC: 0x%x", no, ssrc, roc); |
646 | 61 | id_tree = proto_item_add_subtree(id_ti, ett_mikey_hdr_id); |
647 | | |
648 | 61 | proto_tree_add_item(id_tree, hf_mikey[POS_ID_SRTP_NO], tvb, 0, 1, ENC_BIG_ENDIAN); |
649 | 61 | proto_tree_add_item(id_tree, hf_mikey[POS_ID_SRTP_SSRC], tvb, 1, 4, ENC_BIG_ENDIAN); |
650 | 61 | proto_tree_add_item(id_tree, hf_mikey[POS_ID_SRTP_ROC], tvb, 5, 4, ENC_BIG_ENDIAN); |
651 | 61 | } |
652 | 61 | return 9; |
653 | 61 | } |
654 | | |
655 | | static const struct mikey_dissector_entry cs_id_map[] = { |
656 | | { CS_ID_SRTP, dissect_payload_cs_id_srtp }, |
657 | | { 0, NULL } |
658 | | }; |
659 | | |
660 | | static int |
661 | | dissect_payload_cs_id(int type, mikey_t *mikey, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) |
662 | 941 | { |
663 | 941 | const struct mikey_dissector_entry *entry; |
664 | | |
665 | 941 | entry = mikey_dissector_lookup(cs_id_map, type); |
666 | | |
667 | 941 | if (!entry || !entry->dissector) { |
668 | 880 | return 0; |
669 | 880 | } |
670 | | |
671 | 61 | return entry->dissector(mikey, tvb, pinfo, tree); |
672 | | |
673 | 941 | } |
674 | | |
675 | | static int |
676 | | dissect_payload_hdr(mikey_t *mikey, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) |
677 | 23 | { |
678 | 23 | int offset = 0; |
679 | 23 | uint8_t cs_id_map_type; |
680 | 23 | uint8_t ncs; |
681 | 23 | int i; |
682 | | |
683 | 23 | tvb_ensure_bytes_exist(tvb, offset, 10); |
684 | 23 | mikey->type = tvb_get_uint8(tvb, offset+1); |
685 | 23 | ncs = tvb_get_uint8(tvb, offset+8); |
686 | 23 | cs_id_map_type = tvb_get_uint8(tvb, offset+9); |
687 | | |
688 | 23 | if (tree) { |
689 | 23 | proto_item* parent; |
690 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_VERSION], |
691 | 23 | tvb, offset+0, 1, ENC_BIG_ENDIAN); |
692 | | |
693 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_DATA_TYPE], tvb, offset+1, 1, ENC_BIG_ENDIAN); |
694 | 23 | parent = proto_tree_get_parent(tree); |
695 | 23 | proto_item_append_text(parent, " Type: %s", |
696 | 23 | val_to_str_ext_const(mikey->type, &data_type_vals_ext, "Unknown")); |
697 | | |
698 | 23 | add_next_payload(tvb, tree, offset+2); |
699 | | |
700 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_V], tvb, offset+3, 1, ENC_BIG_ENDIAN); |
701 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_PRF_FUNC], tvb, offset+3, 1, ENC_BIG_ENDIAN); |
702 | | |
703 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_CSB_ID], tvb, offset+4, 4, ENC_BIG_ENDIAN); |
704 | | |
705 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_CS_COUNT], tvb, offset+8, 1, ENC_BIG_ENDIAN); |
706 | 23 | proto_tree_add_item(tree, hf_mikey[POS_HDR_CS_ID_MAP_TYPE], tvb, offset+9, 1, ENC_BIG_ENDIAN); |
707 | 23 | } |
708 | | |
709 | 23 | offset += 10; |
710 | 964 | for (i=0; i < ncs; i++) { |
711 | 941 | tvbuff_t *sub_tvb; |
712 | 941 | int len; |
713 | | |
714 | 941 | sub_tvb = tvb_new_subset_remaining(tvb, offset); |
715 | 941 | len = dissect_payload_cs_id(cs_id_map_type, mikey, sub_tvb, pinfo, tree); |
716 | | |
717 | 941 | if (len < 0) |
718 | 0 | return 0; |
719 | | |
720 | 941 | offset += len; |
721 | 941 | } |
722 | | |
723 | 23 | return offset; |
724 | 23 | } |
725 | | |
726 | | static int |
727 | | dissect_payload_kemac(mikey_t *mikey, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) |
728 | 1 | { |
729 | 1 | int offset = 0; |
730 | 1 | uint8_t encr_alg; |
731 | 1 | uint16_t encr_length; |
732 | 1 | uint16_t mac_length; |
733 | 1 | uint8_t mac_alg; |
734 | | |
735 | 1 | encr_alg = tvb_get_uint8(tvb, offset+1); |
736 | 1 | encr_length = tvb_get_ntohs(tvb, offset+2); |
737 | 1 | tvb_ensure_bytes_exist(tvb, offset+4, encr_length+1); |
738 | 1 | mac_alg = tvb_get_uint8(tvb, offset+4+encr_length); |
739 | | |
740 | 1 | if (tree) { |
741 | 0 | tvbuff_t *sub_tvb; |
742 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEMAC_ENCR_ALG], tvb, 1, 1, ENC_BIG_ENDIAN); |
743 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEMAC_ENCR_DATA_LEN], tvb, 2, 2, ENC_BIG_ENDIAN); |
744 | | /* TODO: Add key decode for MIKEY_TYPE_PK_INIT and MIKEY_TYPE_RSA_R_RESP with NULL encryption */ |
745 | 0 | if ((encr_alg == ENCR_NULL) && (mikey->type == MIKEY_TYPE_PSK_INIT) && (encr_length > 0)) { |
746 | 0 | proto_item *key_data_item; |
747 | 0 | proto_tree *key_data_tree; |
748 | | /* We can decode easily the Key Data if NULL encryption is used */ |
749 | 0 | key_data_item = proto_tree_add_item(tree, hf_mikey_pl[PL_KEY_DATA], tvb, 4, encr_length, ENC_NA); |
750 | 0 | key_data_tree = proto_item_add_subtree(key_data_item, ett_mikey_enc_data); |
751 | |
|
752 | 0 | sub_tvb = tvb_new_subset_length(tvb, offset+4, encr_length); |
753 | 0 | dissect_payload(PL_KEY_DATA, mikey, sub_tvb, pinfo, key_data_tree); |
754 | 0 | } else { |
755 | | /* If Key Data is encrypted, show only the encr_data */ |
756 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEMAC_ENCR_DATA], tvb, 4, encr_length, ENC_NA); |
757 | 0 | } |
758 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEMAC_MAC_ALG], tvb, 4+encr_length, 1, ENC_BIG_ENDIAN); |
759 | 0 | } |
760 | | |
761 | 1 | switch (mac_alg) { |
762 | 0 | case MAC_NULL: |
763 | 0 | mac_length = 0; |
764 | 0 | break; |
765 | 0 | case MAC_HMAC_SHA_1_160: |
766 | 0 | mac_length = 160/8; |
767 | 0 | break; |
768 | 0 | default: |
769 | 0 | return 0; |
770 | 1 | } |
771 | | |
772 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEMAC_MAC], tvb, 4+encr_length+1, mac_length, ENC_NA); |
773 | |
|
774 | 0 | return 4+encr_length+1+mac_length; |
775 | 1 | } |
776 | | |
777 | | static int |
778 | | dissect_payload_pke(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
779 | 1 | { |
780 | 1 | int offset = 0; |
781 | 1 | uint16_t length; |
782 | | |
783 | 1 | length = tvb_get_ntohs(tvb, offset+1) &0x3ff; |
784 | | |
785 | 1 | if (tree) { |
786 | 1 | proto_tree_add_item(tree, hf_mikey[POS_PKE_C], tvb, 1, 2, ENC_BIG_ENDIAN); |
787 | | |
788 | 1 | proto_tree_add_item(tree, hf_mikey[POS_PKE_DATA_LEN], tvb, 1, 2, ENC_BIG_ENDIAN); |
789 | 1 | } |
790 | | |
791 | 1 | proto_tree_add_item(tree, hf_mikey[POS_PKE_DATA], tvb, 3, length, ENC_NA); |
792 | 1 | return 3 + length; |
793 | 1 | } |
794 | | |
795 | | static int |
796 | | dissect_payload_dh(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
797 | 0 | { |
798 | 0 | int offset = 0; |
799 | 0 | uint8_t dh_group; |
800 | 0 | int dh_length; |
801 | 0 | uint8_t kv; |
802 | |
|
803 | 0 | dh_group = tvb_get_uint8(tvb, offset+1); |
804 | |
|
805 | 0 | switch (dh_group) { |
806 | 0 | case DH_OAKLEY_5: |
807 | 0 | dh_length = 1536/8; |
808 | 0 | break; |
809 | 0 | case DH_OAKLEY_1: |
810 | 0 | dh_length = 768/8; |
811 | 0 | break; |
812 | 0 | case DH_OAKLEY_2: |
813 | 0 | dh_length = 1024/8; |
814 | 0 | break; |
815 | 0 | default: |
816 | 0 | return 0; |
817 | 0 | } |
818 | | |
819 | 0 | kv = tvb_get_uint8(tvb, offset+2+dh_length) & 0x0f; |
820 | |
|
821 | 0 | if (tree) { |
822 | 0 | proto_tree_add_item(tree, hf_mikey[POS_DH_GROUP], tvb, 1, 1, ENC_BIG_ENDIAN); |
823 | 0 | proto_tree_add_item(tree, hf_mikey[POS_DH_VALUE], tvb, 2, dh_length, ENC_NA); |
824 | 0 | proto_tree_add_item(tree, hf_mikey[POS_DH_RESERV], tvb, 2+dh_length, 1, ENC_BIG_ENDIAN); |
825 | 0 | proto_tree_add_item(tree, hf_mikey[POS_DH_KV], tvb, 2+dh_length, 1, ENC_BIG_ENDIAN); |
826 | 0 | } |
827 | |
|
828 | 0 | if (kv != 0) { |
829 | 0 | return 0; |
830 | 0 | } |
831 | | |
832 | 0 | return 2 + dh_length + 1; |
833 | 0 | } |
834 | | |
835 | | static int |
836 | | dissect_payload_sign(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
837 | 1 | { |
838 | 1 | int offset = 0; |
839 | 1 | uint16_t length; |
840 | | |
841 | 1 | length = ((tvb_get_uint8(tvb, offset+0) & 0x0f) << 8) + tvb_get_uint8(tvb, offset+1); |
842 | | |
843 | 1 | if (tree) { |
844 | 1 | proto_tree_add_item(tree, hf_mikey[POS_SIGN_S_TYPE], tvb, 0, 2, ENC_BIG_ENDIAN); |
845 | 1 | proto_tree_add_uint(tree, hf_mikey[POS_SIGNATURE_LEN], tvb, 0, 2, length); |
846 | 1 | } |
847 | | |
848 | 1 | proto_tree_add_item(tree, hf_mikey[POS_SIGNATURE], tvb, 2, length, ENC_NA); |
849 | 1 | return 2 + length; |
850 | 1 | } |
851 | | |
852 | | static int |
853 | | dissect_payload_t(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
854 | 0 | { |
855 | 0 | uint8_t ts_type; |
856 | 0 | int offset = 0; |
857 | 0 | int len = 0; |
858 | |
|
859 | 0 | ts_type = tvb_get_uint8(tvb, offset+1); |
860 | |
|
861 | 0 | if (tree) { |
862 | 0 | proto_tree *parent; |
863 | 0 | parent = proto_tree_get_parent(tree); |
864 | 0 | proto_item_append_text(parent, " Type: %s", val_to_str_const(ts_type, ts_type_vals, "Unknown")); |
865 | 0 | proto_tree_add_item(tree, hf_mikey[POS_TS_TYPE], tvb, offset+1, 1, ENC_BIG_ENDIAN); |
866 | 0 | } |
867 | |
|
868 | 0 | switch (ts_type) { |
869 | 0 | case T_NTP: |
870 | 0 | case T_NTP_UTC: |
871 | 0 | proto_tree_add_item(tree, hf_mikey[POS_TS_NTP], tvb, offset+2, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN); |
872 | 0 | len = 10; |
873 | 0 | break; |
874 | 0 | case T_COUNTER: |
875 | 0 | len = 6; |
876 | 0 | break; |
877 | 0 | default: |
878 | 0 | len = 0; |
879 | 0 | break; |
880 | 0 | } |
881 | | |
882 | 0 | return len; |
883 | 0 | } |
884 | | |
885 | | static int |
886 | | dissect_payload_id(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
887 | 0 | { |
888 | 0 | int offset = 0; |
889 | 0 | uint8_t type; |
890 | 0 | uint16_t length; |
891 | |
|
892 | 0 | type = tvb_get_uint8(tvb, offset+1); |
893 | 0 | length = tvb_get_ntohs(tvb, offset+2); |
894 | 0 | if (tree) { |
895 | 0 | proto_tree_add_item(tree, hf_mikey[POS_ID_TYPE], tvb, 1, 1, ENC_BIG_ENDIAN); |
896 | 0 | proto_tree_add_item(tree, hf_mikey[POS_ID_LEN], tvb, 2, 2, ENC_BIG_ENDIAN); |
897 | 0 | } |
898 | |
|
899 | 0 | if (tree) { |
900 | 0 | proto_item* parent; |
901 | 0 | const uint8_t* pos_id; |
902 | 0 | proto_tree_add_item_ret_string(tree, hf_mikey[POS_ID], tvb, 4, length, ENC_ASCII|ENC_NA, pinfo->pool, &pos_id); |
903 | |
|
904 | 0 | parent = proto_tree_get_parent(tree); |
905 | 0 | proto_item_append_text(parent, " %s: %s", val_to_str_const(type, id_type_vals, "Unknown"), pos_id); |
906 | 0 | } |
907 | |
|
908 | 0 | return 4 + length; |
909 | 0 | } |
910 | | |
911 | | static int |
912 | | dissect_payload_idr(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
913 | 0 | { |
914 | 0 | int offset = 0; |
915 | 0 | uint8_t type; |
916 | 0 | uint16_t length; |
917 | |
|
918 | 0 | type = tvb_get_uint8(tvb, offset+2); |
919 | 0 | length = tvb_get_ntohs(tvb, offset+3); |
920 | 0 | if (tree) { |
921 | 0 | proto_tree_add_item(tree, hf_mikey[POS_ID_ROLE], tvb, 1, 1, ENC_BIG_ENDIAN); |
922 | 0 | proto_tree_add_item(tree, hf_mikey[POS_ID_TYPE], tvb, 2, 1, ENC_BIG_ENDIAN); |
923 | 0 | proto_tree_add_item(tree, hf_mikey[POS_ID_LEN], tvb, 3, 2, ENC_BIG_ENDIAN); |
924 | 0 | } |
925 | |
|
926 | 0 | if (tree) { |
927 | 0 | proto_item *parent; |
928 | 0 | const uint8_t* pos_id; |
929 | 0 | proto_tree_add_item_ret_string(tree, hf_mikey[POS_ID], tvb, 5, length, ENC_ASCII|ENC_NA, pinfo->pool, &pos_id); |
930 | |
|
931 | 0 | parent = proto_tree_get_parent(tree); |
932 | 0 | proto_item_append_text(parent, " %s: %s", val_to_str_const(type, id_type_vals, "Unknown"), pos_id); |
933 | 0 | } |
934 | |
|
935 | 0 | return 5 + length; |
936 | 0 | } |
937 | | |
938 | | static int |
939 | | dissect_payload_cert(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) |
940 | 0 | { |
941 | 0 | int offset = 0; |
942 | 0 | uint8_t type; |
943 | 0 | uint16_t length; |
944 | 0 | tvbuff_t *subtvb; |
945 | 0 | asn1_ctx_t asn1_ctx; |
946 | |
|
947 | 0 | asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo); |
948 | |
|
949 | 0 | type = tvb_get_uint8(tvb, offset+1); |
950 | 0 | length = tvb_get_ntohs(tvb, offset+2); |
951 | |
|
952 | 0 | tvb_ensure_bytes_exist(tvb, offset+4, length); |
953 | |
|
954 | 0 | if (tree) { |
955 | 0 | proto_item *parent; |
956 | 0 | parent = proto_tree_get_parent(tree); |
957 | 0 | proto_tree_add_item(tree, hf_mikey[POS_CERT_TYPE], tvb, 1, 1, ENC_BIG_ENDIAN); |
958 | 0 | proto_tree_add_item(tree, hf_mikey[POS_CERT_LEN], tvb, 1, 2, ENC_BIG_ENDIAN); |
959 | |
|
960 | 0 | proto_item_append_text(parent, " Type: %s", val_to_str_const(type, cert_type_vals, "Unknown")); |
961 | 0 | } |
962 | |
|
963 | 0 | subtvb = tvb_new_subset_length(tvb, offset+4, length); |
964 | 0 | dissect_x509af_Certificate(false, subtvb, 0, &asn1_ctx, tree, hf_mikey[POS_CERTIFICATE]); |
965 | |
|
966 | 0 | return 4 + length; |
967 | 0 | } |
968 | | |
969 | | static int |
970 | | dissect_payload_v(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
971 | 0 | { |
972 | 0 | int offset = 0; |
973 | 0 | uint16_t length; |
974 | 0 | uint8_t alg; |
975 | |
|
976 | 0 | alg = tvb_get_uint8(tvb, offset+1); |
977 | |
|
978 | 0 | proto_tree_add_item(tree, hf_mikey[POS_V_AUTH_ALG], tvb, 1, 1, ENC_BIG_ENDIAN); |
979 | |
|
980 | 0 | switch (alg) { |
981 | 0 | case MAC_NULL: |
982 | 0 | length = 0; |
983 | 0 | break; |
984 | 0 | case MAC_HMAC_SHA_1_160: |
985 | 0 | length = 160/8; |
986 | 0 | break; |
987 | 0 | default: |
988 | 0 | return 0; |
989 | 0 | } |
990 | | |
991 | 0 | proto_tree_add_item(tree, hf_mikey[POS_V_DATA], tvb, 2, length, ENC_NA); |
992 | |
|
993 | 0 | return 2 + length; |
994 | 0 | } |
995 | | |
996 | | static int |
997 | | dissect_payload_sp_param(enum sp_prot_t proto, tvbuff_t *tvb, proto_tree *tree) |
998 | 0 | { |
999 | 0 | int offset = 0; |
1000 | 0 | uint8_t type; |
1001 | 0 | uint8_t length; |
1002 | 0 | int hfindex; |
1003 | |
|
1004 | 0 | type = tvb_get_uint8(tvb, offset+0); |
1005 | 0 | length = tvb_get_uint8(tvb, offset+1); |
1006 | | |
1007 | | /* Default */ |
1008 | 0 | hfindex = hf_mikey[POS_SP_PARAM_F]; |
1009 | |
|
1010 | 0 | switch(proto) { |
1011 | 0 | case SP_PROT_TYPE_SRTP: |
1012 | 0 | if (type < array_length(hf_mikey_sp_param)) |
1013 | 0 | hfindex = hf_mikey_sp_param[type]; |
1014 | 0 | break; |
1015 | 0 | } |
1016 | | |
1017 | 0 | if (tree) { |
1018 | 0 | proto_item *param_ti; |
1019 | 0 | proto_tree *param_tree; |
1020 | | /* |
1021 | | * All the parameters in question are either FT_BYTES, |
1022 | | * in which case the byte order is inapplicable, or |
1023 | | * FT_UINT8, in which case it could be given as |
1024 | | * FT_BIG_ENDIAN as per bigger FT_UINT values, but |
1025 | | * ENC_NA also works, as there's only one byte. |
1026 | | */ |
1027 | 0 | param_ti = proto_tree_add_item(tree, hfindex, tvb, 2, length, ENC_NA); |
1028 | 0 | param_tree = proto_item_add_subtree(param_ti, ett_mikey_sp_param); |
1029 | |
|
1030 | 0 | proto_tree_add_item(param_tree, hf_mikey[POS_SP_PARAM_F_TYPE], tvb, 0, 1, ENC_BIG_ENDIAN); |
1031 | 0 | proto_tree_add_item(param_tree, hf_mikey[POS_SP_PARAM_F_LEN], tvb, 1, 1, ENC_BIG_ENDIAN); |
1032 | 0 | proto_tree_add_item(param_tree, hf_mikey[POS_SP_PARAM_F_VALUE], tvb, 2, length, ENC_NA); |
1033 | 0 | } |
1034 | |
|
1035 | 0 | return 2+length; |
1036 | 0 | } |
1037 | | |
1038 | | static int |
1039 | | dissect_payload_sp(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
1040 | 0 | { |
1041 | 0 | int offset = 0; |
1042 | 0 | uint16_t length; |
1043 | 0 | int sub_pos; |
1044 | 0 | uint8_t no; |
1045 | 0 | enum sp_prot_t type; |
1046 | |
|
1047 | 0 | length = tvb_get_ntohs(tvb, offset+3); |
1048 | 0 | no = tvb_get_uint8(tvb, offset+1); |
1049 | 0 | type = (enum sp_prot_t)tvb_get_uint8(tvb, offset+2); |
1050 | |
|
1051 | 0 | if (tree) { |
1052 | 0 | proto_item *parent; |
1053 | 0 | parent = proto_tree_get_parent(tree); |
1054 | 0 | proto_tree_add_item(tree, hf_mikey[POS_SP_NO], tvb, 1, 1, ENC_BIG_ENDIAN); |
1055 | 0 | proto_tree_add_item(tree, hf_mikey[POS_SP_TYPE], tvb, 2, 1, ENC_BIG_ENDIAN); |
1056 | 0 | proto_tree_add_item(tree, hf_mikey[POS_SP_PARAM_LEN], tvb, 3, 2, ENC_BIG_ENDIAN); |
1057 | |
|
1058 | 0 | proto_item_append_text(parent, " No: %d, Type: %s", no, |
1059 | 0 | val_to_str_const(type, sp_prot_type_vals, "Unknown")); |
1060 | 0 | } |
1061 | |
|
1062 | 0 | tvb_ensure_bytes_exist(tvb, offset+5, length); |
1063 | | /* proto_tree_add_item(tree, hf_mikey[POS_SP_PARAM], tvb, 5, length, ENC_NA); */ |
1064 | |
|
1065 | 0 | offset += 5; |
1066 | 0 | sub_pos = 0; |
1067 | |
|
1068 | 0 | while (sub_pos < length) { |
1069 | 0 | int param_len; |
1070 | 0 | tvbuff_t *subtvb; |
1071 | |
|
1072 | 0 | subtvb = tvb_new_subset_length(tvb, offset+sub_pos, length-sub_pos); |
1073 | 0 | param_len = dissect_payload_sp_param(type, subtvb, tree); |
1074 | |
|
1075 | 0 | if (param_len < 0) |
1076 | 0 | return 0; |
1077 | | |
1078 | 0 | sub_pos += param_len; |
1079 | 0 | } |
1080 | | |
1081 | 0 | return 5 + length; |
1082 | 0 | } |
1083 | | |
1084 | | static int |
1085 | | dissect_payload_rand(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
1086 | 10 | { |
1087 | 10 | int offset = 0; |
1088 | 10 | uint16_t length; |
1089 | | |
1090 | 10 | length = tvb_get_uint8(tvb, offset+1); |
1091 | | |
1092 | 10 | proto_tree_add_item(tree, hf_mikey[POS_RAND_LEN], tvb, 1, 1, ENC_BIG_ENDIAN); |
1093 | 10 | proto_tree_add_item(tree, hf_mikey[POS_RAND], tvb, 2, length, ENC_NA); |
1094 | | |
1095 | 10 | return 2 + length; |
1096 | 10 | } |
1097 | | |
1098 | | static int |
1099 | | dissect_payload_err(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
1100 | 11 | { |
1101 | 11 | if (tree) { |
1102 | 11 | proto_item *parent; |
1103 | 11 | uint8_t err_no; |
1104 | 11 | err_no = tvb_get_uint8(tvb, 1); |
1105 | 11 | proto_tree_add_item(tree, hf_mikey[POS_ERR_NO], tvb, 1, 1, ENC_BIG_ENDIAN); |
1106 | 11 | proto_tree_add_item(tree, hf_mikey[POS_ERR_RESERVED], tvb, 2, 2, ENC_NA); |
1107 | 11 | parent = proto_tree_get_parent(tree); |
1108 | 11 | proto_item_append_text(parent, ": %s", val_to_str_ext_const(err_no, &err_vals_ext, "Unknown")); |
1109 | 11 | } |
1110 | | |
1111 | 11 | return 4; |
1112 | 11 | } |
1113 | | |
1114 | | static int |
1115 | | dissect_payload_keydata(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
1116 | 1 | { |
1117 | 1 | uint16_t offset; |
1118 | 1 | uint16_t data_len; |
1119 | 1 | uint8_t key_type; |
1120 | 1 | uint8_t kv_type; |
1121 | | |
1122 | 1 | offset = 0; |
1123 | 1 | key_type = tvb_get_uint8(tvb, 1) >> 4; |
1124 | 1 | kv_type = tvb_get_uint8(tvb, 1) & 0x0f; |
1125 | 1 | data_len = tvb_get_ntohs(tvb, 2); |
1126 | | |
1127 | 1 | offset += 4; |
1128 | | |
1129 | 1 | if (tree) { |
1130 | 0 | proto_item *parent; |
1131 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_DATA_TYPE], tvb, 1, 1, ENC_BIG_ENDIAN); |
1132 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_DATA_KV], tvb, 1, 1, ENC_BIG_ENDIAN); |
1133 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_DATA_LEN], tvb, 2, 2, ENC_BIG_ENDIAN); |
1134 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_DATA], tvb, 4, data_len, ENC_NA); |
1135 | |
|
1136 | 0 | parent = proto_tree_get_parent(tree); |
1137 | 0 | proto_item_append_text(parent, " Type: %s", val_to_str_const(key_type, kd_vals, "Unknown")); |
1138 | 0 | } |
1139 | | |
1140 | 1 | offset += data_len; |
1141 | | |
1142 | | /* Dissect SALT key */ |
1143 | 1 | if ((key_type == KD_TGK_SALT) || (key_type == KD_TEK_SALT)) { |
1144 | 0 | uint16_t salt_len; |
1145 | 0 | salt_len = tvb_get_ntohs(tvb, offset); |
1146 | 0 | if (salt_len > 0) { |
1147 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_SALT_LEN], tvb, offset, 2, ENC_BIG_ENDIAN); |
1148 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_SALT], tvb, offset+2, salt_len, ENC_NA); |
1149 | 0 | } |
1150 | 0 | offset += 2+salt_len; |
1151 | 0 | } |
1152 | | |
1153 | | /* Dissect Key Validity */ |
1154 | 1 | if (kv_type == KV_INTERVAL) { |
1155 | 0 | uint16_t kv_from_len; |
1156 | 0 | uint16_t kv_to_len; |
1157 | |
|
1158 | 0 | kv_from_len = tvb_get_uint8(tvb, offset); |
1159 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_KV_FROM_LEN], tvb, offset, 1, ENC_BIG_ENDIAN); |
1160 | 0 | if (kv_from_len > 0) { |
1161 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_KV_FROM], tvb, offset+1, kv_from_len, ENC_NA); |
1162 | 0 | } |
1163 | 0 | offset += 1+kv_from_len; |
1164 | |
|
1165 | 0 | kv_to_len = tvb_get_uint8(tvb, offset); |
1166 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_KV_TO_LEN], tvb, offset, 1, ENC_BIG_ENDIAN); |
1167 | 0 | if (kv_to_len > 0) { |
1168 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_KV_TO], tvb, offset+1, kv_to_len, ENC_NA); |
1169 | 0 | } |
1170 | 0 | offset += 1+kv_to_len; |
1171 | 1 | } else if (kv_type == KV_SPI) { |
1172 | 0 | uint16_t kv_spi_len; |
1173 | |
|
1174 | 0 | kv_spi_len = tvb_get_uint8(tvb, offset); |
1175 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_KV_SPI_LEN], tvb, offset, 1, ENC_BIG_ENDIAN); |
1176 | 0 | if (kv_spi_len > 0) { |
1177 | 0 | proto_tree_add_item(tree, hf_mikey[POS_KEY_KV_SPI], tvb, offset+1, kv_spi_len, ENC_NA); |
1178 | 0 | } |
1179 | 0 | offset += 1+kv_spi_len; |
1180 | 0 | } |
1181 | | |
1182 | 1 | return offset; |
1183 | 1 | } |
1184 | | |
1185 | | static int |
1186 | | dissect_payload_general_ext(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
1187 | 0 | { |
1188 | 0 | int offset = 0; |
1189 | 0 | uint8_t type; |
1190 | 0 | uint16_t data_len; |
1191 | |
|
1192 | 0 | type = tvb_get_uint8(tvb, offset+1); |
1193 | 0 | data_len = tvb_get_ntohs(tvb, offset+2); |
1194 | |
|
1195 | 0 | if (tree) { |
1196 | 0 | proto_tree_add_item(tree, hf_mikey[POS_GENERAL_EXT_TYPE], tvb, 1, 1, ENC_BIG_ENDIAN); |
1197 | 0 | proto_tree_add_item(tree, hf_mikey[POS_GENERAL_EXT_LEN], tvb, 2, 2, ENC_BIG_ENDIAN); |
1198 | 0 | } |
1199 | |
|
1200 | 0 | if (tree) { |
1201 | 0 | proto_item *parent; |
1202 | |
|
1203 | 0 | parent = proto_tree_get_parent(tree); |
1204 | 0 | if (type == 1) { |
1205 | | /* For SDP-IDs, show a string instead of raw bytes */ |
1206 | 0 | proto_tree_add_item(tree, hf_mikey[POS_GENERAL_EXT_VALUE], tvb, 4, data_len, ENC_ASCII); |
1207 | 0 | } else { |
1208 | 0 | proto_tree_add_item(tree, hf_mikey[POS_GENERAL_EXT_DATA], tvb, 4, data_len, ENC_NA); |
1209 | 0 | } |
1210 | 0 | proto_item_append_text(parent, " Type: %s", val_to_str_const(type, genext_type_vals, "Unknown")); |
1211 | 0 | } |
1212 | 0 | return 4 + data_len; |
1213 | 0 | } |
1214 | | |
1215 | | static int |
1216 | | dissect_payload_sakke(mikey_t *mikey _U_, tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree) |
1217 | 1 | { |
1218 | 1 | int offset = 0; |
1219 | 1 | uint16_t data_len; |
1220 | | |
1221 | 1 | data_len = tvb_get_ntohs(tvb, offset+3); |
1222 | | |
1223 | 1 | if (tree) { |
1224 | 1 | proto_tree_add_item(tree, hf_mikey[POS_SAKKE_PARAMS], tvb, 1, 1, ENC_BIG_ENDIAN); |
1225 | 1 | proto_tree_add_item(tree, hf_mikey[POS_SAKKE_ID_SCHEME], tvb, 2, 1, ENC_BIG_ENDIAN); |
1226 | 1 | proto_tree_add_item(tree, hf_mikey[POS_SAKKE_LEN], tvb, 3, 2, ENC_BIG_ENDIAN); |
1227 | 1 | } |
1228 | | |
1229 | 1 | proto_tree_add_item(tree, hf_mikey[POS_SAKKE_DATA], tvb, 5, data_len, ENC_NA); |
1230 | 1 | return 5 + data_len; |
1231 | 1 | } |
1232 | | |
1233 | | static const struct mikey_dissector_entry payload_map[] = { |
1234 | | { PL_HDR, dissect_payload_hdr }, |
1235 | | { PL_KEMAC, dissect_payload_kemac }, |
1236 | | { PL_PKE, dissect_payload_pke }, |
1237 | | { PL_DH, dissect_payload_dh }, |
1238 | | { PL_SIGN, dissect_payload_sign }, |
1239 | | { PL_T, dissect_payload_t }, |
1240 | | { PL_ID, dissect_payload_id }, |
1241 | | { PL_CERT, dissect_payload_cert }, |
1242 | | { PL_V, dissect_payload_v }, |
1243 | | { PL_SP, dissect_payload_sp }, |
1244 | | { PL_RAND, dissect_payload_rand }, |
1245 | | { PL_ERR, dissect_payload_err }, |
1246 | | { PL_IDR, dissect_payload_idr }, |
1247 | | { PL_KEY_DATA, dissect_payload_keydata }, |
1248 | | { PL_GENERAL_EXT, dissect_payload_general_ext }, |
1249 | | { PL_SAKKE, dissect_payload_sakke }, |
1250 | | { 0, NULL } |
1251 | | }; |
1252 | | |
1253 | | static int |
1254 | | dissect_payload(int payload, mikey_t *mikey, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) |
1255 | 50 | { |
1256 | 50 | const struct mikey_dissector_entry *entry; |
1257 | | |
1258 | 50 | entry = mikey_dissector_lookup(payload_map, payload); |
1259 | | |
1260 | 50 | if (!entry || !entry->dissector) { |
1261 | 1 | return 0; |
1262 | 1 | } |
1263 | | |
1264 | 49 | return entry->dissector(mikey, tvb, pinfo, tree); |
1265 | 50 | } |
1266 | | |
1267 | | /* MIKEY dissector */ |
1268 | | static int |
1269 | | dissect_mikey(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) |
1270 | 25 | { |
1271 | 25 | proto_item *ti = NULL; |
1272 | 25 | proto_tree *mikey_tree = NULL; |
1273 | 25 | int offset = 0; |
1274 | 25 | int next_payload_offset; |
1275 | 25 | int payload; |
1276 | 25 | mikey_t *mikey; |
1277 | 25 | tvbuff_t* real_data_tvb; |
1278 | | /* Check the version byte at index 0, should be 0x01. Otherwise it is probably base 64 encoded */ |
1279 | 25 | if (tvb_get_uint8(tvb, 0) == 0x01) { |
1280 | 19 | real_data_tvb = tvb; |
1281 | 19 | } else { |
1282 | 6 | real_data_tvb = base64_tvb_to_new_tvb(tvb, 0, tvb_reported_length(tvb)); |
1283 | 6 | } |
1284 | | |
1285 | 25 | mikey = (mikey_t *)p_get_proto_data(wmem_file_scope(), pinfo, proto_mikey, 0); |
1286 | | |
1287 | 25 | if (!mikey) { |
1288 | 25 | mikey = wmem_new0(wmem_file_scope(), mikey_t); |
1289 | 25 | mikey->type = -1; |
1290 | 25 | p_add_proto_data(wmem_file_scope(), pinfo, proto_mikey, 0, mikey); |
1291 | 25 | } |
1292 | | |
1293 | | |
1294 | 25 | tvb_ensure_bytes_exist(real_data_tvb, offset, 3); |
1295 | 25 | next_payload_offset = offset + 2; |
1296 | 25 | payload = -1; |
1297 | | |
1298 | 25 | if (tree) { |
1299 | 23 | ti = proto_tree_add_item(tree, proto_mikey, real_data_tvb, 0, -1, ENC_NA); |
1300 | 23 | mikey_tree = proto_item_add_subtree(ti, ett_mikey); |
1301 | 23 | } |
1302 | | |
1303 | 74 | while (payload != 0) { |
1304 | 55 | int len; |
1305 | 55 | proto_item *sub_ti = NULL; |
1306 | 55 | proto_tree *mikey_payload_tree = NULL; |
1307 | 55 | int next_payload; |
1308 | 55 | tvbuff_t *subtvb; |
1309 | | |
1310 | 55 | next_payload = tvb_get_uint8(real_data_tvb, next_payload_offset); |
1311 | 55 | subtvb = tvb_new_subset_remaining(real_data_tvb, offset); |
1312 | | |
1313 | 55 | if (mikey_tree) { |
1314 | 55 | int hf = payload; |
1315 | | |
1316 | 55 | if (hf >= PL_MAX) |
1317 | 5 | return -1; |
1318 | | |
1319 | 50 | if (hf == -1) |
1320 | 23 | hf = 0; |
1321 | | |
1322 | 50 | if (hf_mikey_pl[hf] == 0) |
1323 | 0 | return -1; |
1324 | | |
1325 | 50 | sub_ti = proto_tree_add_item(mikey_tree, hf_mikey_pl[hf], subtvb, 0, -1, ENC_NA); |
1326 | | |
1327 | 50 | mikey_payload_tree = proto_item_add_subtree(sub_ti, ett_mikey_payload); |
1328 | 50 | if ((payload != PL_HDR) && (payload != PL_SIGN)) |
1329 | 26 | add_next_payload(real_data_tvb, mikey_payload_tree, next_payload_offset); |
1330 | 50 | } |
1331 | | |
1332 | 50 | len = dissect_payload(payload, mikey, subtvb, pinfo, mikey_payload_tree); |
1333 | 50 | if (len <= 0) { |
1334 | | /* protocol violation or invalid data, stop dissecting |
1335 | | * but accept the data retrieved so far */ |
1336 | 1 | return tvb_captured_length(real_data_tvb); |
1337 | 1 | } |
1338 | | |
1339 | 49 | if (sub_ti) |
1340 | 33 | proto_item_set_len(sub_ti, len); |
1341 | | |
1342 | 49 | if (payload == PL_SIGN) |
1343 | 0 | break; |
1344 | | |
1345 | 49 | payload = next_payload; |
1346 | 49 | offset += len; |
1347 | 49 | next_payload_offset = offset; |
1348 | 49 | } |
1349 | | |
1350 | 19 | if (ti) { |
1351 | 1 | proto_item_append_text(ti, ": %s", |
1352 | 1 | val_to_str_ext_const(mikey->type, &data_type_vals_ext, "Unknown")); |
1353 | 1 | } |
1354 | | |
1355 | 19 | col_append_str(pinfo->cinfo, COL_PROTOCOL, "/MIKEY"); |
1356 | | |
1357 | 19 | col_append_fstr(pinfo->cinfo, COL_INFO, ", Mikey: %s", |
1358 | 19 | val_to_str_ext_const(mikey->type, &data_type_vals_ext, "Unknown")); |
1359 | | |
1360 | | /* Return the amount of data this dissector was able to dissect */ |
1361 | 19 | return tvb_captured_length(tvb); |
1362 | 25 | } |
1363 | | |
1364 | | |
1365 | | /* Register the protocol with Wireshark */ |
1366 | | |
1367 | | void |
1368 | | proto_register_mikey(void) |
1369 | 14 | { |
1370 | | |
1371 | | /* Setup list of header fields */ |
1372 | 14 | static hf_register_info hf[] = { |
1373 | | /* Payload types */ |
1374 | 14 | { &hf_mikey_pl[PL_HDR+1], |
1375 | 14 | { PL_HDR_TEXT, "mikey.hdr", |
1376 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1377 | 14 | NULL, HFILL }}, |
1378 | 14 | { &hf_mikey_pl[PL_KEMAC], |
1379 | 14 | { PL_KEMAC_TEXT, "mikey.kemac", |
1380 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1381 | 14 | NULL, HFILL }}, |
1382 | 14 | { &hf_mikey_pl[PL_PKE], |
1383 | 14 | { PL_PKE_TEXT, "mikey.pke", |
1384 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1385 | 14 | NULL, HFILL }}, |
1386 | 14 | { &hf_mikey_pl[PL_DH], |
1387 | 14 | { PL_DH_TEXT, "mikey.dh", |
1388 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1389 | 14 | NULL, HFILL }}, |
1390 | 14 | { &hf_mikey_pl[PL_SIGN], |
1391 | 14 | { PL_SIGN_TEXT, "mikey.sign", |
1392 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1393 | 14 | NULL, HFILL }}, |
1394 | 14 | { &hf_mikey_pl[PL_T], |
1395 | 14 | { PL_T_TEXT, "mikey.t", |
1396 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1397 | 14 | NULL, HFILL }}, |
1398 | 14 | { &hf_mikey_pl[PL_ID], |
1399 | 14 | { PL_ID_TEXT, "mikey.id", |
1400 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1401 | 14 | NULL, HFILL }}, |
1402 | 14 | { &hf_mikey_pl[PL_CERT], |
1403 | 14 | { PL_CERT_TEXT, "mikey.cert", |
1404 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1405 | 14 | NULL, HFILL }}, |
1406 | 14 | { &hf_mikey_pl[PL_CHASH], |
1407 | 14 | { PL_CHASH_TEXT, "mikey.chash", |
1408 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1409 | 14 | NULL, HFILL }}, |
1410 | 14 | { &hf_mikey_pl[PL_V], |
1411 | 14 | { PL_V_TEXT, "mikey.v", |
1412 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1413 | 14 | NULL, HFILL }}, |
1414 | 14 | { &hf_mikey_pl[PL_SP], |
1415 | 14 | { PL_SP_TEXT, "mikey.sp", |
1416 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1417 | 14 | NULL, HFILL }}, |
1418 | 14 | { &hf_mikey_pl[PL_RAND], |
1419 | 14 | { PL_RAND_TEXT, "mikey.rand", |
1420 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1421 | 14 | NULL, HFILL }}, |
1422 | 14 | { &hf_mikey_pl[PL_ERR], |
1423 | 14 | { PL_ERR_TEXT, "mikey.err", |
1424 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1425 | 14 | NULL, HFILL }}, |
1426 | 14 | { &hf_mikey_pl[PL_IDR], |
1427 | 14 | { PL_IDR_TEXT, "mikey.idr", |
1428 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1429 | 14 | NULL, HFILL }}, |
1430 | 14 | { &hf_mikey_pl[PL_KEY_DATA], |
1431 | 14 | { PL_KEY_DATA_TEXT, "mikey.key", |
1432 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1433 | 14 | NULL, HFILL }}, |
1434 | 14 | { &hf_mikey_pl[PL_GENERAL_EXT], |
1435 | 14 | { PL_GENERAL_EXT_TEXT, "mikey.ext", |
1436 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1437 | 14 | NULL, HFILL }}, |
1438 | 14 | { &hf_mikey_pl[PL_SAKKE], |
1439 | 14 | { PL_SAKKE_TEXT, "mikey.sakke", |
1440 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1441 | 14 | NULL, HFILL }}, |
1442 | | |
1443 | | /* Common Header payload (HDR) */ |
1444 | 14 | { &hf_mikey[POS_HDR_VERSION], |
1445 | 14 | { "Version", "mikey.version", |
1446 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1447 | 14 | NULL, HFILL }}, |
1448 | 14 | { &hf_mikey[POS_HDR_DATA_TYPE], |
1449 | 14 | { "Data Type", "mikey.type", |
1450 | 14 | FT_UINT8, BASE_DEC|BASE_EXT_STRING, &data_type_vals_ext, 0x0, |
1451 | 14 | NULL, HFILL }}, |
1452 | 14 | { &hf_mikey[POS_NEXT_PAYLOAD], |
1453 | 14 | { "Next Payload", "mikey.next_payload", |
1454 | 14 | FT_UINT8, BASE_DEC, VALS(payload_vals), 0x0, |
1455 | 14 | NULL, HFILL }}, |
1456 | 14 | { &hf_mikey[POS_HDR_V], |
1457 | 14 | { "V", "mikey.v.set", |
1458 | 14 | FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80, |
1459 | 14 | NULL, HFILL }}, |
1460 | 14 | { &hf_mikey[POS_HDR_PRF_FUNC], |
1461 | 14 | { "PRF func", "mikey.prf_func", |
1462 | 14 | FT_UINT8, BASE_DEC, VALS(prf_func_vals), 0x7f, |
1463 | 14 | NULL, HFILL }}, |
1464 | 14 | { &hf_mikey[POS_HDR_CSB_ID], |
1465 | 14 | { "CSB ID", "mikey.csb_id", |
1466 | 14 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1467 | 14 | NULL, HFILL }}, |
1468 | 14 | { &hf_mikey[POS_HDR_CS_COUNT], |
1469 | 14 | { "#CS", "mikey.cs_count", |
1470 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1471 | 14 | NULL, HFILL }}, |
1472 | 14 | { &hf_mikey[POS_HDR_CS_ID_MAP_TYPE], |
1473 | 14 | { "CS ID map type", "mikey.cs_id_map_type", |
1474 | 14 | FT_UINT8, BASE_DEC, VALS(cs_id_map_vals), 0x0, |
1475 | 14 | NULL, HFILL }}, |
1476 | | |
1477 | | /* SRTP ID */ |
1478 | 14 | { &hf_mikey[POS_ID_SRTP], |
1479 | 14 | { "SRTP ID", "mikey.srtp_id", |
1480 | 14 | FT_NONE, BASE_NONE, NULL, 0x0, |
1481 | 14 | NULL, HFILL }}, |
1482 | 14 | { &hf_mikey[POS_ID_SRTP_NO], |
1483 | 14 | { "Policy No", "mikey.srtp_id.policy_no", |
1484 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1485 | 14 | NULL, HFILL }}, |
1486 | 14 | { &hf_mikey[POS_ID_SRTP_SSRC], |
1487 | 14 | { "SSRC", "mikey.srtp_id.ssrc", |
1488 | 14 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1489 | 14 | NULL, HFILL }}, |
1490 | 14 | { &hf_mikey[POS_ID_SRTP_ROC], |
1491 | 14 | { "ROC", "mikey.srtp_id.roc", |
1492 | 14 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1493 | 14 | NULL, HFILL }}, |
1494 | | |
1495 | | /* Key Data Transport payload (KEMAC) */ |
1496 | 14 | { &hf_mikey[POS_KEMAC_ENCR_ALG], |
1497 | 14 | { "Encr alg", "mikey.kemac.encr_alg", |
1498 | 14 | FT_UINT8, BASE_DEC, VALS(encr_alg_vals), 0x0, |
1499 | 14 | NULL, HFILL }}, |
1500 | 14 | { &hf_mikey[POS_KEMAC_ENCR_DATA_LEN], |
1501 | 14 | { "Key data len", "mikey.kemac.key_data_len", |
1502 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1503 | 14 | NULL, HFILL }}, |
1504 | 14 | { &hf_mikey[POS_KEMAC_ENCR_DATA], |
1505 | 14 | { "Key data", "mikey.kemac.key_data", |
1506 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1507 | 14 | NULL, HFILL }}, |
1508 | 14 | { &hf_mikey[POS_KEMAC_MAC_ALG], |
1509 | 14 | { "Mac alg", "mikey.kemac.mac_alg", |
1510 | 14 | FT_UINT8, BASE_DEC, VALS(mac_alg_vals), 0x0, |
1511 | 14 | NULL, HFILL }}, |
1512 | 14 | { &hf_mikey[POS_KEMAC_MAC], |
1513 | 14 | { "MAC", "mikey.kemac.mac", |
1514 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1515 | 14 | NULL, HFILL }}, |
1516 | | |
1517 | | /* Envelope Data payload (PKE) */ |
1518 | 14 | { &hf_mikey[POS_PKE_C], |
1519 | 14 | { "C", "mikey.pke.c", |
1520 | 14 | FT_UINT16, BASE_DEC, VALS(pke_c_vals), 0xc000, |
1521 | 14 | NULL, HFILL }}, |
1522 | 14 | { &hf_mikey[POS_PKE_DATA_LEN], |
1523 | 14 | { "Data len", "mikey.pke.len", |
1524 | 14 | FT_UINT16, BASE_DEC, NULL, 0x3fff, |
1525 | 14 | NULL, HFILL }}, |
1526 | 14 | { &hf_mikey[POS_PKE_DATA], |
1527 | 14 | { "Data", "mikey.pke.data", |
1528 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1529 | 14 | NULL, HFILL }}, |
1530 | | |
1531 | | /* DH data payload (DH) */ |
1532 | 14 | { &hf_mikey[POS_DH_GROUP], |
1533 | 14 | { "DH-Group", "mikey.dh.group", |
1534 | 14 | FT_UINT8, BASE_DEC, VALS(oakley_vals), 0x0, |
1535 | 14 | NULL, HFILL }}, |
1536 | 14 | { &hf_mikey[POS_DH_VALUE], |
1537 | 14 | { "DH-Value", "mikey.dh.value", |
1538 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1539 | 14 | NULL, HFILL }}, |
1540 | 14 | { &hf_mikey[POS_DH_RESERV], |
1541 | 14 | { "Reserv", "mikey.dh.reserv", |
1542 | 14 | FT_UINT8, BASE_HEX, NULL, 0xf0, |
1543 | 14 | NULL, HFILL }}, |
1544 | 14 | { &hf_mikey[POS_DH_KV], |
1545 | 14 | { "KV", "mikey.dh.kv", |
1546 | 14 | FT_UINT8, BASE_DEC, VALS(kv_vals), 0x0f, |
1547 | 14 | NULL, HFILL }}, |
1548 | | |
1549 | | /* Signature payload (SIGN) */ |
1550 | 14 | { &hf_mikey[POS_SIGN_S_TYPE], |
1551 | 14 | { "Signature type", "mikey.sign.type", |
1552 | 14 | FT_UINT16, BASE_DEC, VALS(sign_s_vals), 0xf000, |
1553 | 14 | NULL, HFILL }}, |
1554 | 14 | { &hf_mikey[POS_SIGNATURE_LEN], |
1555 | 14 | { "Signature len", "mikey.sign.len", |
1556 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0fff, |
1557 | 14 | NULL, HFILL }}, |
1558 | 14 | { &hf_mikey[POS_SIGNATURE], |
1559 | 14 | { "Signature", "mikey.sign.data", |
1560 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1561 | 14 | NULL, HFILL }}, |
1562 | | |
1563 | | /* Timestamp payload (T) */ |
1564 | 14 | { &hf_mikey[POS_TS_TYPE], |
1565 | 14 | { "TS type", "mikey.t.ts_type", |
1566 | 14 | FT_UINT8, BASE_DEC, VALS(ts_type_vals), 0x0, |
1567 | 14 | NULL, HFILL }}, |
1568 | 14 | { &hf_mikey[POS_TS_NTP], |
1569 | 14 | { "NTP timestamp", "mikey.t.ntp", |
1570 | 14 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, |
1571 | 14 | NULL, HFILL }}, |
1572 | | |
1573 | 14 | { &hf_mikey[POS_PAYLOAD_STR], |
1574 | 14 | { "Payload", "mikey.payload", |
1575 | 14 | FT_STRING, BASE_NONE, NULL, 0x0, |
1576 | 14 | NULL, HFILL }}, |
1577 | | |
1578 | | /* ID payload (ID) */ |
1579 | 14 | { &hf_mikey[POS_ID_TYPE], |
1580 | 14 | { "ID type", "mikey.id.type", |
1581 | 14 | FT_UINT8, BASE_DEC, VALS(id_type_vals), 0x0, |
1582 | 14 | NULL, HFILL }}, |
1583 | 14 | { &hf_mikey[POS_ID_LEN], |
1584 | 14 | { "ID len", "mikey.id.len", |
1585 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1586 | 14 | NULL, HFILL }}, |
1587 | 14 | { &hf_mikey[POS_ID], |
1588 | 14 | { "ID", "mikey.id.data", |
1589 | 14 | FT_STRING, BASE_NONE, NULL, 0x0, |
1590 | 14 | NULL, HFILL }}, |
1591 | | |
1592 | | /* Certificate payload (CERT) */ |
1593 | 14 | { &hf_mikey[POS_CERT_LEN], |
1594 | 14 | { "Certificate len", "mikey.cert.len", |
1595 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1596 | 14 | NULL, HFILL }}, |
1597 | 14 | { &hf_mikey[POS_CERT_TYPE], |
1598 | 14 | { "Certificate type", "mikey.cert.type", |
1599 | 14 | FT_UINT8, BASE_DEC, VALS(cert_type_vals), 0x0, |
1600 | 14 | NULL, HFILL }}, |
1601 | 14 | { &hf_mikey[POS_CERTIFICATE], |
1602 | 14 | { "Certificate", "mikey.cert.data", |
1603 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1604 | 14 | NULL, HFILL }}, |
1605 | | |
1606 | | /* Ver msg payload (V) */ |
1607 | 14 | { &hf_mikey[POS_V_AUTH_ALG], |
1608 | 14 | { "Auth alg", "mikey.v.auth_alg", |
1609 | 14 | FT_UINT8, BASE_DEC, VALS(mac_alg_vals), 0x0, |
1610 | 14 | NULL, HFILL }}, |
1611 | 14 | { &hf_mikey[POS_V_DATA], |
1612 | 14 | { "Ver data", "mikey.v.ver_data", |
1613 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1614 | 14 | NULL, HFILL }}, |
1615 | | |
1616 | | /* Security Policy payload (SP) */ |
1617 | 14 | { &hf_mikey[POS_SP_NO], |
1618 | 14 | { "Policy No", "mikey.sp.no", |
1619 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1620 | 14 | NULL, HFILL }}, |
1621 | 14 | { &hf_mikey[POS_SP_TYPE], |
1622 | 14 | { "Protocol type", "mikey.sp.proto_type", |
1623 | 14 | FT_UINT8, BASE_DEC, VALS(sp_prot_type_vals), 0x0, |
1624 | 14 | NULL, HFILL }}, |
1625 | 14 | { &hf_mikey[POS_SP_PARAM_LEN], |
1626 | 14 | { "Policy param length", "mikey.sp.param_len", |
1627 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1628 | 14 | NULL, HFILL }}, |
1629 | | |
1630 | | /* Security Policy param */ |
1631 | 14 | { &hf_mikey[POS_SP_PARAM_F], |
1632 | 14 | { "Policy param", "mikey.sp.param", |
1633 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1634 | 14 | NULL, HFILL }}, |
1635 | 14 | { &hf_mikey[POS_SP_PARAM_F_TYPE], |
1636 | 14 | { "Type", "mikey.sp.param.type", |
1637 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1638 | 14 | NULL, HFILL }}, |
1639 | 14 | { &hf_mikey[POS_SP_PARAM_F_LEN], |
1640 | 14 | { "Length", "mikey.sp.param.len", |
1641 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1642 | 14 | NULL, HFILL }}, |
1643 | 14 | { &hf_mikey[POS_SP_PARAM_F_VALUE], |
1644 | 14 | { "Value", "mikey.sp.patam.value", |
1645 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1646 | 14 | NULL, HFILL }}, |
1647 | | |
1648 | | /* SRTP policy param */ |
1649 | 14 | { &hf_mikey_sp_param[SP_ENCR_ALG], |
1650 | 14 | { SP_TEXT_ENCR_ALG, "mikey.sp.encr_alg", |
1651 | 14 | FT_UINT8, BASE_DEC, VALS(sp_encr_alg_vals), 0x0, |
1652 | 14 | NULL, HFILL }}, |
1653 | 14 | { &hf_mikey_sp_param[SP_ENCR_LEN], |
1654 | 14 | { SP_TEXT_ENCR_LEN, "mikey.sp.encr_len", |
1655 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1656 | 14 | NULL, HFILL }}, |
1657 | 14 | { &hf_mikey_sp_param[SP_AUTH_ALG], |
1658 | 14 | { SP_TEXT_AUTH_ALG, "mikey.sp.auth_alg", |
1659 | 14 | FT_UINT8, BASE_DEC, VALS(sp_auth_alg_vals), 0x0, |
1660 | 14 | NULL, HFILL }}, |
1661 | 14 | { &hf_mikey_sp_param[SP_AUTH_KEY_LEN], |
1662 | 14 | { SP_TEXT_AUTH_KEY_LEN, "mikey.sp.auth_key_len", |
1663 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1664 | 14 | NULL, HFILL }}, |
1665 | 14 | { &hf_mikey_sp_param[SP_SALT_LEN], |
1666 | 14 | { SP_TEXT_SALT_LEN, "mikey.sp.salt_len", |
1667 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1668 | 14 | NULL, HFILL }}, |
1669 | 14 | { &hf_mikey_sp_param[SP_PRF], |
1670 | 14 | { SP_TEXT_PRF, "mikey.sp.prf", |
1671 | 14 | FT_UINT8, BASE_DEC, VALS(sp_prf_vals), 0x0, |
1672 | 14 | NULL, HFILL }}, |
1673 | 14 | { &hf_mikey_sp_param[SP_KD_RATE], |
1674 | 14 | { SP_TEXT_KD_RATE, "mikey.sp.kd_rate", |
1675 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1676 | 14 | NULL, HFILL }}, |
1677 | 14 | { &hf_mikey_sp_param[SP_SRTP_ENCR], |
1678 | 14 | { SP_TEXT_SRTP_ENCR, "mikey.sp.srtp_encr", |
1679 | 14 | FT_UINT8, BASE_DEC, VALS(on_off_vals), 0x0, |
1680 | 14 | NULL, HFILL }}, |
1681 | 14 | { &hf_mikey_sp_param[SP_SRTCP_ENCR], |
1682 | 14 | { SP_TEXT_SRTCP_ENCR, "mikey.sp.srtcp_encr", |
1683 | 14 | FT_UINT8, BASE_DEC, VALS(on_off_vals), 0x0, |
1684 | 14 | NULL, HFILL }}, |
1685 | 14 | { &hf_mikey_sp_param[SP_FEC], |
1686 | 14 | { SP_TEXT_FEC, "mikey.sp.fec", |
1687 | 14 | FT_UINT8, BASE_DEC, VALS(sp_fec_vals), 0x0, |
1688 | 14 | NULL, HFILL }}, |
1689 | 14 | { &hf_mikey_sp_param[SP_SRTP_AUTH], |
1690 | 14 | { SP_TEXT_SRTP_AUTH, "mikey.sp.srtp_auth", |
1691 | 14 | FT_UINT8, BASE_DEC, VALS(on_off_vals), 0x0, |
1692 | 14 | NULL, HFILL }}, |
1693 | 14 | { &hf_mikey_sp_param[SP_AUTH_TAG_LEN], |
1694 | 14 | { SP_TEXT_AUTH_TAG_LEN, "mikey.sp.auth_tag_len", |
1695 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1696 | 14 | NULL, HFILL }}, |
1697 | 14 | { &hf_mikey_sp_param[SP_SRTP_PREFIX], |
1698 | 14 | { SP_TEXT_SRTP_PREFIX, "mikey.sp.srtp_prefix", |
1699 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1700 | 14 | NULL, HFILL }}, |
1701 | | |
1702 | | /* RAND payload (RAND) */ |
1703 | 14 | { &hf_mikey[POS_RAND_LEN], |
1704 | 14 | { "RAND len", "mikey.rand.len", |
1705 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1706 | 14 | NULL, HFILL }}, |
1707 | 14 | { &hf_mikey[POS_RAND], |
1708 | 14 | { "RAND", "mikey.rand.data", |
1709 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1710 | 14 | NULL, HFILL }}, |
1711 | | |
1712 | | /* Error payload (ERR) */ |
1713 | 14 | { &hf_mikey[POS_ERR_NO], |
1714 | 14 | { "Error no.", "mikey.err.no", |
1715 | 14 | FT_UINT8, BASE_DEC|BASE_EXT_STRING, &err_vals_ext, 0x0, |
1716 | 14 | NULL, HFILL }}, |
1717 | 14 | { &hf_mikey[POS_ERR_RESERVED], |
1718 | 14 | { "Reserved", "mikey.err.reserved", |
1719 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1720 | 14 | NULL, HFILL }}, |
1721 | | |
1722 | | /* IDR */ |
1723 | 14 | { &hf_mikey[POS_ID_ROLE], |
1724 | 14 | { "ID role", "mikey.id.role", |
1725 | 14 | FT_UINT8, BASE_DEC, VALS(id_role_vals), 0x0, |
1726 | 14 | NULL, HFILL }}, |
1727 | | |
1728 | | /* Key data sub-payload */ |
1729 | 14 | { &hf_mikey[POS_KEY_DATA_TYPE], |
1730 | 14 | { "Type", "mikey.key.type", |
1731 | 14 | FT_UINT8, BASE_DEC, VALS(kd_vals), 0xf0, |
1732 | 14 | NULL, HFILL }}, |
1733 | 14 | { &hf_mikey[POS_KEY_DATA_KV], |
1734 | 14 | { "KV", "mikey.key.kv", |
1735 | 14 | FT_UINT8, BASE_DEC, VALS(kv_vals), 0x0f, |
1736 | 14 | NULL, HFILL }}, |
1737 | 14 | { &hf_mikey[POS_KEY_DATA_LEN], |
1738 | 14 | { "Key len", "mikey.key.data.len", |
1739 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1740 | 14 | NULL, HFILL }}, |
1741 | 14 | { &hf_mikey[POS_KEY_DATA], |
1742 | 14 | { "Key", "mikey.key.data", |
1743 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1744 | 14 | NULL, HFILL }}, |
1745 | 14 | { &hf_mikey[POS_KEY_SALT_LEN], |
1746 | 14 | { "Salt key len", "mikey.key.salt.len", |
1747 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1748 | 14 | NULL, HFILL }}, |
1749 | 14 | { &hf_mikey[POS_KEY_SALT], |
1750 | 14 | { "Salt key", "mikey.key.salt", |
1751 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1752 | 14 | NULL, HFILL }}, |
1753 | 14 | { &hf_mikey[POS_KEY_KV_FROM_LEN], |
1754 | 14 | { "Valid from len", "mikey.key.kv.from.len", |
1755 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1756 | 14 | NULL, HFILL }}, |
1757 | 14 | { &hf_mikey[POS_KEY_KV_FROM], |
1758 | 14 | { "Valid from", "mikey.key.kv.from", |
1759 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1760 | 14 | NULL, HFILL }}, |
1761 | 14 | { &hf_mikey[POS_KEY_KV_TO_LEN], |
1762 | 14 | { "Valid to len", "mikey.key.kv.to.len", |
1763 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1764 | 14 | NULL, HFILL }}, |
1765 | 14 | { &hf_mikey[POS_KEY_KV_TO], |
1766 | 14 | { "Valid to", "mikey.key.kv.to", |
1767 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1768 | 14 | NULL, HFILL }}, |
1769 | 14 | { &hf_mikey[POS_KEY_KV_SPI_LEN], |
1770 | 14 | { "Valid SPI len", "mikey.key.kv.spi.len", |
1771 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1772 | 14 | NULL, HFILL }}, |
1773 | 14 | { &hf_mikey[POS_KEY_KV_SPI], |
1774 | 14 | { "Valid SPI", "mikey.key.kv.spi", |
1775 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1776 | 14 | NULL, HFILL }}, |
1777 | | |
1778 | | /* General Extension payload (GENERAL_EXT) */ |
1779 | 14 | { &hf_mikey[POS_GENERAL_EXT_TYPE], |
1780 | 14 | { "Extension type", "mikey.ext.type", |
1781 | 14 | FT_UINT8, BASE_DEC, VALS(genext_type_vals), 0x0, |
1782 | 14 | NULL, HFILL }}, |
1783 | 14 | { &hf_mikey[POS_GENERAL_EXT_LEN], |
1784 | 14 | { "Length", "mikey.ext.len", |
1785 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1786 | 14 | NULL, HFILL }}, |
1787 | 14 | { &hf_mikey[POS_GENERAL_EXT_DATA], |
1788 | 14 | { "Data", "mikey.ext.data", |
1789 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1790 | 14 | NULL, HFILL }}, |
1791 | 14 | { &hf_mikey[POS_GENERAL_EXT_VALUE], |
1792 | 14 | { "Value", "mikey.ext.value", |
1793 | 14 | FT_STRING, BASE_NONE, NULL, 0x0, |
1794 | 14 | NULL, HFILL }}, |
1795 | | |
1796 | | /* SAKKE */ |
1797 | 14 | { &hf_mikey[POS_SAKKE_PARAMS], |
1798 | 14 | { "SAKKE params", "mikey.sakke.params", |
1799 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1800 | 14 | NULL, HFILL }}, |
1801 | 14 | { &hf_mikey[POS_SAKKE_ID_SCHEME], |
1802 | 14 | { "ID scheme", "mikey.sakke.idscheme", |
1803 | 14 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1804 | 14 | NULL, HFILL }}, |
1805 | 14 | { &hf_mikey[POS_SAKKE_LEN], |
1806 | 14 | { "SAKKE data length", "mikey.sakke.len", |
1807 | 14 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1808 | 14 | NULL, HFILL }}, |
1809 | 14 | { &hf_mikey[POS_SAKKE_DATA], |
1810 | 14 | { "SAKKE data", "mikey.sakke.data", |
1811 | 14 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1812 | 14 | NULL, HFILL }}, |
1813 | | |
1814 | | /* |
1815 | | { &hf_mikey[POS_SP_PARAM], |
1816 | | { "Policy param", "mikey.policy_param", |
1817 | | FT_BYTES, BASE_NONE, NULL, 0x0, |
1818 | | NULL, HFILL }}, |
1819 | | |
1820 | | { &hf_mikey[POS_PAYLOAD], |
1821 | | { "Payload", "mikey.payload", |
1822 | | FT_BYTES, BASE_HEX, NULL, 0x0, |
1823 | | NULL, HFILL }}, |
1824 | | */ |
1825 | 14 | }; |
1826 | | |
1827 | | /* Setup protocol subtree array */ |
1828 | 14 | static int *ett[] = { |
1829 | 14 | &ett_mikey, |
1830 | 14 | &ett_mikey_payload, |
1831 | 14 | &ett_mikey_sp_param, |
1832 | 14 | &ett_mikey_hdr_id, |
1833 | 14 | &ett_mikey_enc_data |
1834 | 14 | }; |
1835 | | |
1836 | | /* Register the protocol name and description */ |
1837 | 14 | proto_mikey = proto_register_protocol("Multimedia Internet KEYing", "MIKEY", "mikey"); |
1838 | | |
1839 | 14 | mikey_handle = register_dissector("mikey", dissect_mikey, proto_mikey); |
1840 | | |
1841 | | /* Required function calls to register the header fields and subtrees used */ |
1842 | 14 | proto_register_field_array(proto_mikey, hf, array_length(hf)); |
1843 | 14 | proto_register_subtree_array(ett, array_length(ett)); |
1844 | 14 | } |
1845 | | |
1846 | | |
1847 | | void |
1848 | | proto_reg_handoff_mikey(void) |
1849 | 14 | { |
1850 | 14 | dissector_add_string("key_mgmt", "mikey", mikey_handle); |
1851 | 14 | dissector_add_uint_with_preference("tcp.port", PORT_MIKEY, mikey_handle); |
1852 | 14 | dissector_add_uint_with_preference("udp.port", PORT_MIKEY, mikey_handle); |
1853 | 14 | dissector_add_string("media_type", "application/mikey", mikey_handle); |
1854 | 14 | } |
1855 | | /* |
1856 | | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
1857 | | * |
1858 | | * Local variables: |
1859 | | * c-basic-offset: 8 |
1860 | | * tab-width: 8 |
1861 | | * indent-tabs-mode: t |
1862 | | * End: |
1863 | | * |
1864 | | * vi: set shiftwidth=8 tabstop=8 noexpandtab: |
1865 | | * :indentSize=8:tabSize=8:noTabs=false: |
1866 | | */ |