wsgcrypt.h checks internally if we HAVE_LIBGCRYPT
[metze/wireshark/wip.git] / epan / dissectors / packet-pkcs12.c
1 /* Do not modify this file. Changes will be overwritten.                      */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler       */
3 /* packet-pkcs12.c                                                            */
4 /* ../../tools/asn2wrs.py -b -p pkcs12 -c ./pkcs12.cnf -s ./packet-pkcs12-template -D . -O ../../epan/dissectors pkcs12.asn */
5
6 /* Input file: packet-pkcs12-template.c */
7
8 #line 1 "../../asn1/pkcs12/packet-pkcs12-template.c"
9 /* packet-pkcs12.c
10  * Routines for PKCS#12: Personal Information Exchange packet dissection
11  * Graeme Lunt 2006
12  *
13  * See "PKCS #12 v1.1: Personal Information Exchange Syntax":
14  *
15  *    http://www.emc.com/emc-plus/rsa-labs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf
16  *
17  * Wireshark - Network traffic analyzer
18  * By Gerald Combs <gerald@wireshark.org>
19  * Copyright 1998 Gerald Combs
20  *
21  * This program is free software; you can redistribute it and/or
22  * modify it under the terms of the GNU General Public License
23  * as published by the Free Software Foundation; either version 2
24  * of the License, or (at your option) any later version.
25  *
26  * This program is distributed in the hope that it will be useful,
27  * but WITHOUT ANY WARRANTY; without even the implied warranty of
28  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29  * GNU General Public License for more details.
30  *
31  * You should have received a copy of the GNU General Public License
32  * along with this program; if not, write to the Free Software
33  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
34  */
35
36 #include "config.h"
37
38 #include <epan/packet.h>
39 #include <epan/expert.h>
40 #include <epan/oids.h>
41 #include <epan/asn1.h>
42 #include <epan/prefs.h>
43
44 #include "packet-ber.h"
45 #include "packet-pkcs12.h"
46 #include "packet-x509af.h"
47 #include "packet-x509if.h"
48 #include "packet-cms.h"
49
50 #include <wsutil/wsgcrypt.h>
51
52 #define PNAME  "PKCS#12: Personal Information Exchange"
53 #define PSNAME "PKCS12"
54 #define PFNAME "pkcs12"
55
56 #define PKCS12_PBE_ARCFOUR_SHA1_OID     "1.2.840.113549.1.12.1.1"
57 #define PKCS12_PBE_3DES_SHA1_OID        "1.2.840.113549.1.12.1.3"
58 #define PKCS12_PBE_RC2_40_SHA1_OID      "1.2.840.113549.1.12.1.6"
59
60 void proto_register_pkcs12(void);
61 void proto_reg_handoff_pkcs12(void);
62
63 /* Initialize the protocol and registered fields */
64 static int proto_pkcs12 = -1;
65
66 static int hf_pkcs12_X509Certificate_PDU = -1;
67 static int hf_pkcs12_AuthenticatedSafe_PDU = -1;  /* AuthenticatedSafe */
68 static gint ett_decrypted_pbe = -1;
69
70 static expert_field ei_pkcs12_octet_string_expected = EI_INIT;
71
72
73 static const char *object_identifier_id = NULL;
74 static int iteration_count = 0;
75 static tvbuff_t *salt = NULL;
76 static const char *password = NULL;
77 static gboolean try_null_password = FALSE;
78
79 static void dissect_AuthenticatedSafe_OCTETSTRING_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
80 static void dissect_SafeContents_OCTETSTRING_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
81 static int dissect_PrivateKeyInfo_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data);
82
83
84 /*--- Included file: packet-pkcs12-hf.c ---*/
85 #line 1 "../../asn1/pkcs12/packet-pkcs12-hf.c"
86 static int hf_pkcs12_PFX_PDU = -1;                /* PFX */
87 static int hf_pkcs12_SafeContents_PDU = -1;       /* SafeContents */
88 static int hf_pkcs12_KeyBag_PDU = -1;             /* KeyBag */
89 static int hf_pkcs12_PKCS8ShroudedKeyBag_PDU = -1;  /* PKCS8ShroudedKeyBag */
90 static int hf_pkcs12_CertBag_PDU = -1;            /* CertBag */
91 static int hf_pkcs12_CRLBag_PDU = -1;             /* CRLBag */
92 static int hf_pkcs12_SecretBag_PDU = -1;          /* SecretBag */
93 static int hf_pkcs12_PrivateKeyInfo_PDU = -1;     /* PrivateKeyInfo */
94 static int hf_pkcs12_EncryptedPrivateKeyInfo_PDU = -1;  /* EncryptedPrivateKeyInfo */
95 static int hf_pkcs12_PBEParameter_PDU = -1;       /* PBEParameter */
96 static int hf_pkcs12_PBKDF2Params_PDU = -1;       /* PBKDF2Params */
97 static int hf_pkcs12_PBES2Params_PDU = -1;        /* PBES2Params */
98 static int hf_pkcs12_PBMAC1Params_PDU = -1;       /* PBMAC1Params */
99 static int hf_pkcs12_version = -1;                /* T_version */
100 static int hf_pkcs12_authSafe = -1;               /* ContentInfo */
101 static int hf_pkcs12_macData = -1;                /* MacData */
102 static int hf_pkcs12_mac = -1;                    /* DigestInfo */
103 static int hf_pkcs12_macSalt = -1;                /* OCTET_STRING */
104 static int hf_pkcs12_iterations = -1;             /* INTEGER */
105 static int hf_pkcs12_digestAlgorithm = -1;        /* DigestAlgorithmIdentifier */
106 static int hf_pkcs12_digest = -1;                 /* Digest */
107 static int hf_pkcs12_AuthenticatedSafe_item = -1;  /* ContentInfo */
108 static int hf_pkcs12_SafeContents_item = -1;      /* SafeBag */
109 static int hf_pkcs12_bagId = -1;                  /* T_bagId */
110 static int hf_pkcs12_bagValue = -1;               /* T_bagValue */
111 static int hf_pkcs12_bagAttributes = -1;          /* SET_OF_PKCS12Attribute */
112 static int hf_pkcs12_bagAttributes_item = -1;     /* PKCS12Attribute */
113 static int hf_pkcs12_certId = -1;                 /* T_certId */
114 static int hf_pkcs12_certValue = -1;              /* T_certValue */
115 static int hf_pkcs12_crlId = -1;                  /* T_crlId */
116 static int hf_pkcs12_crlValue = -1;               /* T_crlValue */
117 static int hf_pkcs12_secretTypeId = -1;           /* T_secretTypeId */
118 static int hf_pkcs12_secretValue = -1;            /* T_secretValue */
119 static int hf_pkcs12_attrId = -1;                 /* T_attrId */
120 static int hf_pkcs12_attrValues = -1;             /* T_attrValues */
121 static int hf_pkcs12_attrValues_item = -1;        /* T_attrValues_item */
122 static int hf_pkcs12_privateKeyVersion = -1;      /* Version */
123 static int hf_pkcs12_privateKeyAlgorithm = -1;    /* AlgorithmIdentifier */
124 static int hf_pkcs12_privateKey = -1;             /* PrivateKey */
125 static int hf_pkcs12_attributes = -1;             /* Attributes */
126 static int hf_pkcs12_Attributes_item = -1;        /* Attribute */
127 static int hf_pkcs12_encryptionAlgorithm = -1;    /* AlgorithmIdentifier */
128 static int hf_pkcs12_encryptedData = -1;          /* EncryptedData */
129 static int hf_pkcs12_salt = -1;                   /* OCTET_STRING */
130 static int hf_pkcs12_iterationCount = -1;         /* INTEGER */
131 static int hf_pkcs12_saltChoice = -1;             /* T_saltChoice */
132 static int hf_pkcs12_specified = -1;              /* OCTET_STRING */
133 static int hf_pkcs12_otherSource = -1;            /* AlgorithmIdentifier */
134 static int hf_pkcs12_keyLength = -1;              /* INTEGER_1_MAX */
135 static int hf_pkcs12_prf = -1;                    /* AlgorithmIdentifier */
136 static int hf_pkcs12_keyDerivationFunc = -1;      /* AlgorithmIdentifier */
137 static int hf_pkcs12_encryptionScheme = -1;       /* AlgorithmIdentifier */
138 static int hf_pkcs12_messageAuthScheme = -1;      /* AlgorithmIdentifier */
139
140 /*--- End of included file: packet-pkcs12-hf.c ---*/
141 #line 76 "../../asn1/pkcs12/packet-pkcs12-template.c"
142
143 /* Initialize the subtree pointers */
144
145 /*--- Included file: packet-pkcs12-ett.c ---*/
146 #line 1 "../../asn1/pkcs12/packet-pkcs12-ett.c"
147 static gint ett_pkcs12_PFX = -1;
148 static gint ett_pkcs12_MacData = -1;
149 static gint ett_pkcs12_DigestInfo = -1;
150 static gint ett_pkcs12_AuthenticatedSafe = -1;
151 static gint ett_pkcs12_SafeContents = -1;
152 static gint ett_pkcs12_SafeBag = -1;
153 static gint ett_pkcs12_SET_OF_PKCS12Attribute = -1;
154 static gint ett_pkcs12_CertBag = -1;
155 static gint ett_pkcs12_CRLBag = -1;
156 static gint ett_pkcs12_SecretBag = -1;
157 static gint ett_pkcs12_PKCS12Attribute = -1;
158 static gint ett_pkcs12_T_attrValues = -1;
159 static gint ett_pkcs12_PrivateKeyInfo = -1;
160 static gint ett_pkcs12_Attributes = -1;
161 static gint ett_pkcs12_EncryptedPrivateKeyInfo = -1;
162 static gint ett_pkcs12_PBEParameter = -1;
163 static gint ett_pkcs12_PBKDF2Params = -1;
164 static gint ett_pkcs12_T_saltChoice = -1;
165 static gint ett_pkcs12_PBES2Params = -1;
166 static gint ett_pkcs12_PBMAC1Params = -1;
167
168 /*--- End of included file: packet-pkcs12-ett.c ---*/
169 #line 79 "../../asn1/pkcs12/packet-pkcs12-template.c"
170
171 static void append_oid(proto_tree *tree, const char *oid)
172 {
173         const char *name = NULL;
174
175         name = oid_resolved_from_string(wmem_packet_scope(), oid);
176         proto_item_append_text(tree, " (%s)", name ? name : oid);
177 }
178
179 #ifdef HAVE_LIBGCRYPT
180
181 static int
182 generate_key_or_iv(unsigned int id, tvbuff_t *salt_tvb, unsigned int iter,
183                        const char *pw, unsigned int req_keylen, char * keybuf)
184 {
185   int rc;
186   unsigned int i, j;
187   gcry_md_hd_t md;
188   gcry_mpi_t num_b1 = NULL;
189   size_t pwlen;
190   char hash[20], buf_b[64], buf_i[128], *p;
191   char *salt_p;
192   int salt_size;
193   size_t cur_keylen;
194   size_t n;
195   gcry_error_t  err;
196
197   cur_keylen = 0;
198
199   salt_size = tvb_captured_length(salt_tvb);
200   salt_p = (char *)tvb_memdup(wmem_packet_scope(), salt_tvb, 0, salt_size);
201
202   if (pw == NULL)
203     pwlen = 0;
204   else
205     pwlen = strlen(pw);
206
207   if (pwlen > 63 / 2)
208     {
209       return FALSE;
210     }
211
212   /* Store salt and password in BUF_I */
213   p = buf_i;
214   for (i = 0; i < 64; i++)
215     *p++ = salt_p[i % salt_size];
216   if (pw)
217     {
218       for (i = j = 0; i < 64; i += 2)
219         {
220           *p++ = 0;
221           *p++ = pw[j];
222           if (++j > pwlen)      /* Note, that we include the trailing zero */
223             j = 0;
224         }
225     }
226   else
227     memset (p, 0, 64);
228
229   for (;;) {
230       err = gcry_md_open(&md, GCRY_MD_SHA1, 0);
231       if (gcry_err_code(err))
232         {
233           return FALSE;
234         }
235       for (i = 0; i < 64; i++)
236         {
237           unsigned char lid = id & 0xFF;
238           gcry_md_write (md, &lid, 1);
239         }
240
241       gcry_md_write(md, buf_i, pw ? 128 : 64);
242
243       gcry_md_final (md);
244       memcpy (hash, gcry_md_read (md, 0), 20);
245
246       gcry_md_close (md);
247
248       for (i = 1; i < iter; i++)
249         gcry_md_hash_buffer (GCRY_MD_SHA1, hash, hash, 20);
250
251       for (i = 0; i < 20 && cur_keylen < req_keylen; i++)
252         keybuf[cur_keylen++] = hash[i];
253
254       if (cur_keylen == req_keylen)
255       {
256         gcry_mpi_release (num_b1);
257         return TRUE;            /* ready */
258       }
259
260       /* need more bytes. */
261       for (i = 0; i < 64; i++)
262         buf_b[i] = hash[i % 20];
263
264       n = 64;
265
266       rc = gcry_mpi_scan (&num_b1, GCRYMPI_FMT_USG, buf_b, n, &n);
267
268       if (rc != 0)
269         {
270           return FALSE;
271         }
272
273       gcry_mpi_add_ui (num_b1, num_b1, 1);
274
275       for (i = 0; i < 128; i += 64)
276         {
277           gcry_mpi_t num_ij;
278
279           n = 64;
280           rc = gcry_mpi_scan (&num_ij, GCRYMPI_FMT_USG, buf_i + i, n, &n);
281
282           if (rc != 0)
283             {
284               return FALSE;
285             }
286
287           gcry_mpi_add (num_ij, num_ij, num_b1);
288           gcry_mpi_clear_highbit (num_ij, 64 * 8);
289
290           n = 64;
291
292           rc = gcry_mpi_print (GCRYMPI_FMT_USG, buf_i + i, n, &n, num_ij);
293           if (rc != 0)
294             {
295               return FALSE;
296             }
297
298           gcry_mpi_release (num_ij);
299         }
300   }
301 }
302
303 #endif
304
305 void PBE_reset_parameters(void)
306 {
307         iteration_count = 0;
308         salt = NULL;
309 }
310
311 int PBE_decrypt_data(const char *object_identifier_id_param _U_, tvbuff_t *encrypted_tvb _U_, asn1_ctx_t *actx _U_, proto_item *item _U_)
312 {
313 #ifdef HAVE_LIBGCRYPT
314         const char      *encryption_algorithm;
315         gcry_cipher_hd_t cipher;
316         gcry_error_t    err;
317         int             algo;
318         int             mode;
319         int             ivlen = 0;
320         int             keylen = 0;
321         int             datalen = 0;
322         char            *key = NULL;
323         char            *iv = NULL;
324         char            *clear_data = NULL;
325         tvbuff_t        *clear_tvb = NULL;
326         const gchar     *oidname;
327         GString         *name;
328         proto_tree      *tree;
329         char            byte;
330         gboolean        decrypt_ok = TRUE;
331
332         if(((password == NULL) || (*password == '\0')) && (try_null_password == FALSE)) {
333                 /* we are not configured to decrypt */
334                 return FALSE;
335         }
336
337         encryption_algorithm = x509af_get_last_algorithm_id();
338
339         /* these are the only encryption schemes we understand for now */
340         if(!strcmp(encryption_algorithm, PKCS12_PBE_3DES_SHA1_OID)) {
341                 ivlen = 8;
342                 keylen = 24;
343                 algo = GCRY_CIPHER_3DES;
344                 mode = GCRY_CIPHER_MODE_CBC;
345         } else if(!strcmp(encryption_algorithm, PKCS12_PBE_ARCFOUR_SHA1_OID)) {
346                 ivlen = 0;
347                 keylen = 16;
348                 algo = GCRY_CIPHER_ARCFOUR;
349                 mode = GCRY_CIPHER_MODE_NONE;
350         } else if(!strcmp(encryption_algorithm, PKCS12_PBE_RC2_40_SHA1_OID)) {
351                 ivlen = 8;
352                 keylen = 5;
353                 algo = GCRY_CIPHER_RFC2268_40;
354                 mode = GCRY_CIPHER_MODE_CBC;
355         } else {
356                 /* we don't know how to decrypt this */
357
358                 proto_item_append_text(item, " [Unsupported encryption algorithm]");
359                 return FALSE;
360         }
361
362         if((iteration_count == 0) || (salt == NULL)) {
363                 proto_item_append_text(item, " [Insufficient parameters]");
364                 return FALSE;
365         }
366
367         /* allocate buffers */
368         key = (char *)wmem_alloc(wmem_packet_scope(), keylen);
369
370         if(!generate_key_or_iv(1 /*LEY */, salt, iteration_count, password, keylen, key))
371                 return FALSE;
372
373         if(ivlen) {
374
375                 iv = (char *)wmem_alloc(wmem_packet_scope(), ivlen);
376
377                 if(!generate_key_or_iv(2 /* IV */, salt, iteration_count, password, ivlen, iv))
378                         return FALSE;
379         }
380
381         /* now try an internal function */
382         err = gcry_cipher_open(&cipher, algo, mode, 0);
383         if (gcry_err_code (err))
384                         return FALSE;
385
386         err = gcry_cipher_setkey (cipher, key, keylen);
387         if (gcry_err_code (err)) {
388                         gcry_cipher_close (cipher);
389                         return FALSE;
390         }
391
392         if(ivlen) {
393                   err = gcry_cipher_setiv (cipher, iv, ivlen);
394                   if (gcry_err_code (err)) {
395                           gcry_cipher_close (cipher);
396                           return FALSE;
397                   }
398         }
399
400         datalen = tvb_captured_length(encrypted_tvb);
401         clear_data = (char *)g_malloc(datalen);
402
403         err = gcry_cipher_decrypt (cipher, clear_data, datalen, (char *)tvb_memdup(wmem_packet_scope(), encrypted_tvb, 0, datalen), datalen);
404         if (gcry_err_code (err)) {
405
406                 proto_item_append_text(item, " [Failed to decrypt with password preference]");
407
408                 gcry_cipher_close (cipher);
409                 g_free(clear_data);
410                 return FALSE;
411         }
412
413         gcry_cipher_close (cipher);
414
415         /* We don't know if we have successfully decrypted the data or not so we:
416                 a) check the trailing bytes
417                 b) see if we start with a sequence or a set (is this too constraining?
418                 */
419
420         /* first the trailing bytes */
421         byte = clear_data[datalen-1];
422         if(byte <= 0x08) {
423                 int i;
424
425                 for(i = (int)byte; i > 0 ; i--) {
426                         if(clear_data[datalen - i] != byte) {
427                                 decrypt_ok = FALSE;
428                                 break;
429                         }
430                 }
431         } else {
432                 /* XXX: is this a failure? */
433         }
434
435         /* we assume the result is ASN.1 - check it is a SET or SEQUENCE */
436         byte = clear_data[0];
437         if((byte != 0x30) && (byte != 0x31)) { /* do we need more here? OCTET STRING? */
438                 decrypt_ok = FALSE;
439         }
440
441         if(!decrypt_ok) {
442                 g_free(clear_data);
443                 proto_item_append_text(item, " [Failed to decrypt with supplied password]");
444
445                 return FALSE;
446         }
447
448         proto_item_append_text(item, " [Decrypted successfully]");
449
450         tree = proto_item_add_subtree(item, ett_decrypted_pbe);
451
452         /* OK - so now clear_data contains the decrypted data */
453
454         clear_tvb = tvb_new_child_real_data(encrypted_tvb,(const guint8 *)clear_data, datalen, datalen);
455         tvb_set_free_cb(clear_tvb, g_free);
456
457         name = g_string_new("");
458         oidname = oid_resolved_from_string(wmem_packet_scope(), object_identifier_id_param);
459         g_string_printf(name, "Decrypted %s", oidname ? oidname : object_identifier_id_param);
460
461         /* add it as a new source */
462         add_new_data_source(actx->pinfo, clear_tvb, name->str);
463
464         g_string_free(name, TRUE);
465
466         /* now try and decode it */
467         call_ber_oid_callback(object_identifier_id_param, clear_tvb, 0, actx->pinfo, tree, NULL);
468
469         return TRUE;
470 #else
471         /* we cannot decrypt */
472         return FALSE;
473
474 #endif
475 }
476
477
478 /*--- Included file: packet-pkcs12-fn.c ---*/
479 #line 1 "../../asn1/pkcs12/packet-pkcs12-fn.c"
480
481 static const value_string pkcs12_T_version_vals[] = {
482   {   3, "v3" },
483   { 0, NULL }
484 };
485
486
487 static int
488 dissect_pkcs12_T_version(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
489   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
490                                                 NULL);
491
492   return offset;
493 }
494
495
496 static const ber_sequence_t DigestInfo_sequence[] = {
497   { &hf_pkcs12_digestAlgorithm, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_cms_DigestAlgorithmIdentifier },
498   { &hf_pkcs12_digest       , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_cms_Digest },
499   { NULL, 0, 0, 0, NULL }
500 };
501
502 static int
503 dissect_pkcs12_DigestInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
504   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
505                                    DigestInfo_sequence, hf_index, ett_pkcs12_DigestInfo);
506
507   return offset;
508 }
509
510
511
512 static int
513 dissect_pkcs12_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
514   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
515                                        (hf_index == hf_pkcs12_salt ? &salt : NULL));
516
517   return offset;
518 }
519
520
521
522 static int
523 dissect_pkcs12_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
524   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
525                                                 (hf_index == hf_pkcs12_iterationCount ? &iteration_count : NULL));
526
527   return offset;
528 }
529
530
531 static const ber_sequence_t MacData_sequence[] = {
532   { &hf_pkcs12_mac          , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_pkcs12_DigestInfo },
533   { &hf_pkcs12_macSalt      , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_pkcs12_OCTET_STRING },
534   { &hf_pkcs12_iterations   , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_pkcs12_INTEGER },
535   { NULL, 0, 0, 0, NULL }
536 };
537
538 static int
539 dissect_pkcs12_MacData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
540   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
541                                    MacData_sequence, hf_index, ett_pkcs12_MacData);
542
543   return offset;
544 }
545
546
547 static const ber_sequence_t PFX_sequence[] = {
548   { &hf_pkcs12_version      , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_version },
549   { &hf_pkcs12_authSafe     , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_cms_ContentInfo },
550   { &hf_pkcs12_macData      , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_pkcs12_MacData },
551   { NULL, 0, 0, 0, NULL }
552 };
553
554 static int
555 dissect_pkcs12_PFX(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
556 #line 58 "../../asn1/pkcs12/pkcs12.cnf"
557         dissector_handle_t dissector_handle;
558
559         /* we change the CMS id-data dissector to dissect as AuthenticatedSafe
560            not sure why PKCS#12 couldn't have used its own content type OID for AuthenticatedSafe */
561         dissector_handle=create_dissector_handle(dissect_AuthenticatedSafe_OCTETSTRING_PDU, proto_pkcs12);
562         dissector_change_string("ber.oid", "1.2.840.113549.1.7.1", dissector_handle);
563
564           offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
565                                    PFX_sequence, hf_index, ett_pkcs12_PFX);
566
567
568         /* restore the original dissector */
569         dissector_reset_string("ber.oid", "1.2.840.113549.1.7.1");
570
571
572
573   return offset;
574 }
575
576
577 static const ber_sequence_t AuthenticatedSafe_sequence_of[1] = {
578   { &hf_pkcs12_AuthenticatedSafe_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_cms_ContentInfo },
579 };
580
581 static int
582 dissect_pkcs12_AuthenticatedSafe(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
583 #line 71 "../../asn1/pkcs12/pkcs12.cnf"
584         dissector_handle_t dissector_handle;
585
586         /* we change the CMS id-data dissector to dissect as SafeContents */
587         dissector_handle=create_dissector_handle(dissect_SafeContents_OCTETSTRING_PDU, proto_pkcs12);
588         dissector_change_string("ber.oid", "1.2.840.113549.1.7.1", dissector_handle);
589
590           offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
591                                       AuthenticatedSafe_sequence_of, hf_index, ett_pkcs12_AuthenticatedSafe);
592
593
594         /* restore the original dissector */
595         dissector_reset_string("ber.oid", "1.2.840.113549.1.7.1");
596
597
598
599   return offset;
600 }
601
602
603
604 static int
605 dissect_pkcs12_T_bagId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
606   offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &object_identifier_id);
607
608 #line 84 "../../asn1/pkcs12/pkcs12.cnf"
609   append_oid(tree, object_identifier_id);
610
611   return offset;
612 }
613
614
615
616 static int
617 dissect_pkcs12_T_bagValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
618 #line 108 "../../asn1/pkcs12/pkcs12.cnf"
619         if(object_identifier_id)
620                 offset = call_ber_oid_callback(object_identifier_id, tvb, offset, actx->pinfo, tree, NULL);
621
622
623
624   return offset;
625 }
626
627
628
629 static int
630 dissect_pkcs12_T_attrId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
631   offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &object_identifier_id);
632
633 #line 104 "../../asn1/pkcs12/pkcs12.cnf"
634   append_oid(tree, object_identifier_id);
635
636   return offset;
637 }
638
639
640
641 static int
642 dissect_pkcs12_T_attrValues_item(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
643 #line 112 "../../asn1/pkcs12/pkcs12.cnf"
644         if(object_identifier_id)
645                 offset = call_ber_oid_callback(object_identifier_id, tvb, offset, actx->pinfo, tree, NULL);
646
647
648
649   return offset;
650 }
651
652
653 static const ber_sequence_t T_attrValues_set_of[1] = {
654   { &hf_pkcs12_attrValues_item, BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_attrValues_item },
655 };
656
657 static int
658 dissect_pkcs12_T_attrValues(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
659   offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
660                                  T_attrValues_set_of, hf_index, ett_pkcs12_T_attrValues);
661
662   return offset;
663 }
664
665
666 static const ber_sequence_t PKCS12Attribute_sequence[] = {
667   { &hf_pkcs12_attrId       , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_attrId },
668   { &hf_pkcs12_attrValues   , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_attrValues },
669   { NULL, 0, 0, 0, NULL }
670 };
671
672 static int
673 dissect_pkcs12_PKCS12Attribute(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
674   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
675                                    PKCS12Attribute_sequence, hf_index, ett_pkcs12_PKCS12Attribute);
676
677   return offset;
678 }
679
680
681 static const ber_sequence_t SET_OF_PKCS12Attribute_set_of[1] = {
682   { &hf_pkcs12_bagAttributes_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_pkcs12_PKCS12Attribute },
683 };
684
685 static int
686 dissect_pkcs12_SET_OF_PKCS12Attribute(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
687   offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
688                                  SET_OF_PKCS12Attribute_set_of, hf_index, ett_pkcs12_SET_OF_PKCS12Attribute);
689
690   return offset;
691 }
692
693
694 static const ber_sequence_t SafeBag_sequence[] = {
695   { &hf_pkcs12_bagId        , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_bagId },
696   { &hf_pkcs12_bagValue     , BER_CLASS_CON, 0, 0, dissect_pkcs12_T_bagValue },
697   { &hf_pkcs12_bagAttributes, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_pkcs12_SET_OF_PKCS12Attribute },
698   { NULL, 0, 0, 0, NULL }
699 };
700
701 static int
702 dissect_pkcs12_SafeBag(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
703   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
704                                    SafeBag_sequence, hf_index, ett_pkcs12_SafeBag);
705
706   return offset;
707 }
708
709
710 static const ber_sequence_t SafeContents_sequence_of[1] = {
711   { &hf_pkcs12_SafeContents_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_pkcs12_SafeBag },
712 };
713
714 static int
715 dissect_pkcs12_SafeContents(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
716   offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
717                                       SafeContents_sequence_of, hf_index, ett_pkcs12_SafeContents);
718
719   return offset;
720 }
721
722
723 static const value_string pkcs12_Version_vals[] = {
724   {   0, "v1" },
725   { 0, NULL }
726 };
727
728
729 static int
730 dissect_pkcs12_Version(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
731   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
732                                                 NULL);
733
734   return offset;
735 }
736
737
738
739 static int
740 dissect_pkcs12_PrivateKey(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
741   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
742                                        NULL);
743
744   return offset;
745 }
746
747
748 static const ber_sequence_t Attributes_set_of[1] = {
749   { &hf_pkcs12_Attributes_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509if_Attribute },
750 };
751
752 static int
753 dissect_pkcs12_Attributes(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
754   offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
755                                  Attributes_set_of, hf_index, ett_pkcs12_Attributes);
756
757   return offset;
758 }
759
760
761 static const ber_sequence_t PrivateKeyInfo_sequence[] = {
762   { &hf_pkcs12_privateKeyVersion, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_pkcs12_Version },
763   { &hf_pkcs12_privateKeyAlgorithm, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
764   { &hf_pkcs12_privateKey   , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_pkcs12_PrivateKey },
765   { &hf_pkcs12_attributes   , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pkcs12_Attributes },
766   { NULL, 0, 0, 0, NULL }
767 };
768
769 static int
770 dissect_pkcs12_PrivateKeyInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
771   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
772                                    PrivateKeyInfo_sequence, hf_index, ett_pkcs12_PrivateKeyInfo);
773
774   return offset;
775 }
776
777
778
779 static int
780 dissect_pkcs12_KeyBag(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
781   offset = dissect_pkcs12_PrivateKeyInfo(implicit_tag, tvb, offset, actx, tree, hf_index);
782
783   return offset;
784 }
785
786
787
788 static int
789 dissect_pkcs12_EncryptedData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
790 #line 139 "../../asn1/pkcs12/pkcs12.cnf"
791         tvbuff_t *encrypted_tvb;
792         dissector_handle_t dissector_handle;
793
794
795   offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
796                                        &encrypted_tvb);
797
798 #line 145 "../../asn1/pkcs12/pkcs12.cnf"
799
800
801
802         dissector_handle=new_create_dissector_handle(dissect_PrivateKeyInfo_PDU, proto_pkcs12);
803         dissector_change_string("ber.oid", object_identifier_id, dissector_handle);
804
805         PBE_decrypt_data(object_identifier_id, encrypted_tvb, actx, actx->created_item);
806
807         /* restore the original dissector */
808         dissector_reset_string("ber.oid", object_identifier_id);
809
810
811   return offset;
812 }
813
814
815 static const ber_sequence_t EncryptedPrivateKeyInfo_sequence[] = {
816   { &hf_pkcs12_encryptionAlgorithm, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
817   { &hf_pkcs12_encryptedData, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_pkcs12_EncryptedData },
818   { NULL, 0, 0, 0, NULL }
819 };
820
821 static int
822 dissect_pkcs12_EncryptedPrivateKeyInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
823   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
824                                    EncryptedPrivateKeyInfo_sequence, hf_index, ett_pkcs12_EncryptedPrivateKeyInfo);
825
826   return offset;
827 }
828
829
830
831 static int
832 dissect_pkcs12_PKCS8ShroudedKeyBag(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
833   offset = dissect_pkcs12_EncryptedPrivateKeyInfo(implicit_tag, tvb, offset, actx, tree, hf_index);
834
835   return offset;
836 }
837
838
839
840 static int
841 dissect_pkcs12_T_certId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
842   offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &object_identifier_id);
843
844 #line 89 "../../asn1/pkcs12/pkcs12.cnf"
845   append_oid(tree, object_identifier_id);
846
847   return offset;
848 }
849
850
851
852 static int
853 dissect_pkcs12_T_certValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
854 #line 116 "../../asn1/pkcs12/pkcs12.cnf"
855         if(object_identifier_id)
856                 offset = call_ber_oid_callback(object_identifier_id, tvb, offset, actx->pinfo, tree, NULL);
857
858
859
860   return offset;
861 }
862
863
864 static const ber_sequence_t CertBag_sequence[] = {
865   { &hf_pkcs12_certId       , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_certId },
866   { &hf_pkcs12_certValue    , BER_CLASS_CON, 0, 0, dissect_pkcs12_T_certValue },
867   { NULL, 0, 0, 0, NULL }
868 };
869
870 static int
871 dissect_pkcs12_CertBag(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
872   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
873                                    CertBag_sequence, hf_index, ett_pkcs12_CertBag);
874
875   return offset;
876 }
877
878
879
880 static int
881 dissect_pkcs12_T_crlId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
882   offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &object_identifier_id);
883
884 #line 94 "../../asn1/pkcs12/pkcs12.cnf"
885   append_oid(tree, object_identifier_id);
886
887   return offset;
888 }
889
890
891
892 static int
893 dissect_pkcs12_T_crlValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
894 #line 120 "../../asn1/pkcs12/pkcs12.cnf"
895         if(object_identifier_id)
896                 offset = call_ber_oid_callback(object_identifier_id, tvb, offset, actx->pinfo, tree, NULL);
897
898
899
900   return offset;
901 }
902
903
904 static const ber_sequence_t CRLBag_sequence[] = {
905   { &hf_pkcs12_crlId        , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_crlId },
906   { &hf_pkcs12_crlValue     , BER_CLASS_CON, 0, 0, dissect_pkcs12_T_crlValue },
907   { NULL, 0, 0, 0, NULL }
908 };
909
910 static int
911 dissect_pkcs12_CRLBag(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
912   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
913                                    CRLBag_sequence, hf_index, ett_pkcs12_CRLBag);
914
915   return offset;
916 }
917
918
919
920 static int
921 dissect_pkcs12_T_secretTypeId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
922   offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &object_identifier_id);
923
924 #line 99 "../../asn1/pkcs12/pkcs12.cnf"
925   append_oid(tree, object_identifier_id);
926
927   return offset;
928 }
929
930
931
932 static int
933 dissect_pkcs12_T_secretValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
934 #line 124 "../../asn1/pkcs12/pkcs12.cnf"
935         if(object_identifier_id)
936                 offset = call_ber_oid_callback(object_identifier_id, tvb, offset, actx->pinfo, tree, NULL);
937
938
939
940   return offset;
941 }
942
943
944 static const ber_sequence_t SecretBag_sequence[] = {
945   { &hf_pkcs12_secretTypeId , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_pkcs12_T_secretTypeId },
946   { &hf_pkcs12_secretValue  , BER_CLASS_CON, 0, 0, dissect_pkcs12_T_secretValue },
947   { NULL, 0, 0, 0, NULL }
948 };
949
950 static int
951 dissect_pkcs12_SecretBag(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
952   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
953                                    SecretBag_sequence, hf_index, ett_pkcs12_SecretBag);
954
955   return offset;
956 }
957
958
959 static const ber_sequence_t PBEParameter_sequence[] = {
960   { &hf_pkcs12_salt         , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_pkcs12_OCTET_STRING },
961   { &hf_pkcs12_iterationCount, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_pkcs12_INTEGER },
962   { NULL, 0, 0, 0, NULL }
963 };
964
965 static int
966 dissect_pkcs12_PBEParameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
967 #line 128 "../../asn1/pkcs12/pkcs12.cnf"
968         /* initialise the encryption parameters */
969         PBE_reset_parameters();
970
971
972   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
973                                    PBEParameter_sequence, hf_index, ett_pkcs12_PBEParameter);
974
975   return offset;
976 }
977
978
979 static const value_string pkcs12_T_saltChoice_vals[] = {
980   {   0, "specified" },
981   {   1, "otherSource" },
982   { 0, NULL }
983 };
984
985 static const ber_choice_t T_saltChoice_choice[] = {
986   {   0, &hf_pkcs12_specified    , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_pkcs12_OCTET_STRING },
987   {   1, &hf_pkcs12_otherSource  , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
988   { 0, NULL, 0, 0, 0, NULL }
989 };
990
991 static int
992 dissect_pkcs12_T_saltChoice(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
993   offset = dissect_ber_choice(actx, tree, tvb, offset,
994                                  T_saltChoice_choice, hf_index, ett_pkcs12_T_saltChoice,
995                                  NULL);
996
997   return offset;
998 }
999
1000
1001
1002 static int
1003 dissect_pkcs12_INTEGER_1_MAX(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1004   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1005                                                 NULL);
1006
1007   return offset;
1008 }
1009
1010
1011 static const ber_sequence_t PBKDF2Params_sequence[] = {
1012   { &hf_pkcs12_saltChoice   , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_pkcs12_T_saltChoice },
1013   { &hf_pkcs12_iterationCount, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_pkcs12_INTEGER },
1014   { &hf_pkcs12_keyLength    , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_pkcs12_INTEGER_1_MAX },
1015   { &hf_pkcs12_prf          , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1016   { NULL, 0, 0, 0, NULL }
1017 };
1018
1019 static int
1020 dissect_pkcs12_PBKDF2Params(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1021   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1022                                    PBKDF2Params_sequence, hf_index, ett_pkcs12_PBKDF2Params);
1023
1024   return offset;
1025 }
1026
1027
1028 static const ber_sequence_t PBES2Params_sequence[] = {
1029   { &hf_pkcs12_keyDerivationFunc, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1030   { &hf_pkcs12_encryptionScheme, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1031   { NULL, 0, 0, 0, NULL }
1032 };
1033
1034 static int
1035 dissect_pkcs12_PBES2Params(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1036   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1037                                    PBES2Params_sequence, hf_index, ett_pkcs12_PBES2Params);
1038
1039   return offset;
1040 }
1041
1042
1043 static const ber_sequence_t PBMAC1Params_sequence[] = {
1044   { &hf_pkcs12_keyDerivationFunc, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1045   { &hf_pkcs12_messageAuthScheme, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1046   { NULL, 0, 0, 0, NULL }
1047 };
1048
1049 static int
1050 dissect_pkcs12_PBMAC1Params(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1051   offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1052                                    PBMAC1Params_sequence, hf_index, ett_pkcs12_PBMAC1Params);
1053
1054   return offset;
1055 }
1056
1057 /*--- PDUs ---*/
1058
1059 static int dissect_PFX_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1060   int offset = 0;
1061   asn1_ctx_t asn1_ctx;
1062   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1063   offset = dissect_pkcs12_PFX(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PFX_PDU);
1064   return offset;
1065 }
1066 static int dissect_SafeContents_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1067   int offset = 0;
1068   asn1_ctx_t asn1_ctx;
1069   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1070   offset = dissect_pkcs12_SafeContents(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_SafeContents_PDU);
1071   return offset;
1072 }
1073 static int dissect_KeyBag_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1074   int offset = 0;
1075   asn1_ctx_t asn1_ctx;
1076   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1077   offset = dissect_pkcs12_KeyBag(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_KeyBag_PDU);
1078   return offset;
1079 }
1080 static int dissect_PKCS8ShroudedKeyBag_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1081   int offset = 0;
1082   asn1_ctx_t asn1_ctx;
1083   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1084   offset = dissect_pkcs12_PKCS8ShroudedKeyBag(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PKCS8ShroudedKeyBag_PDU);
1085   return offset;
1086 }
1087 static int dissect_CertBag_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1088   int offset = 0;
1089   asn1_ctx_t asn1_ctx;
1090   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1091   offset = dissect_pkcs12_CertBag(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_CertBag_PDU);
1092   return offset;
1093 }
1094 static int dissect_CRLBag_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1095   int offset = 0;
1096   asn1_ctx_t asn1_ctx;
1097   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1098   offset = dissect_pkcs12_CRLBag(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_CRLBag_PDU);
1099   return offset;
1100 }
1101 static int dissect_SecretBag_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1102   int offset = 0;
1103   asn1_ctx_t asn1_ctx;
1104   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1105   offset = dissect_pkcs12_SecretBag(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_SecretBag_PDU);
1106   return offset;
1107 }
1108 static int dissect_PrivateKeyInfo_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1109   int offset = 0;
1110   asn1_ctx_t asn1_ctx;
1111   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1112   offset = dissect_pkcs12_PrivateKeyInfo(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PrivateKeyInfo_PDU);
1113   return offset;
1114 }
1115 static int dissect_EncryptedPrivateKeyInfo_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1116   int offset = 0;
1117   asn1_ctx_t asn1_ctx;
1118   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1119   offset = dissect_pkcs12_EncryptedPrivateKeyInfo(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_EncryptedPrivateKeyInfo_PDU);
1120   return offset;
1121 }
1122 static int dissect_PBEParameter_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1123   int offset = 0;
1124   asn1_ctx_t asn1_ctx;
1125   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1126   offset = dissect_pkcs12_PBEParameter(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PBEParameter_PDU);
1127   return offset;
1128 }
1129 static int dissect_PBKDF2Params_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1130   int offset = 0;
1131   asn1_ctx_t asn1_ctx;
1132   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1133   offset = dissect_pkcs12_PBKDF2Params(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PBKDF2Params_PDU);
1134   return offset;
1135 }
1136 static int dissect_PBES2Params_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1137   int offset = 0;
1138   asn1_ctx_t asn1_ctx;
1139   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1140   offset = dissect_pkcs12_PBES2Params(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PBES2Params_PDU);
1141   return offset;
1142 }
1143 static int dissect_PBMAC1Params_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1144   int offset = 0;
1145   asn1_ctx_t asn1_ctx;
1146   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1147   offset = dissect_pkcs12_PBMAC1Params(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_PBMAC1Params_PDU);
1148   return offset;
1149 }
1150
1151
1152 /*--- End of included file: packet-pkcs12-fn.c ---*/
1153 #line 387 "../../asn1/pkcs12/packet-pkcs12-template.c"
1154
1155 static int strip_octet_string(tvbuff_t *tvb)
1156 {
1157   gint8 ber_class;
1158   gboolean pc, ind;
1159   gint32 tag;
1160   guint32 len;
1161   int offset = 0;
1162
1163   /* PKCS#7 encodes the content as OCTET STRING, whereas CMS is just any ANY */
1164   /* if we use CMS (rather than PKCS#7) - which we are - we need to strip the OCTET STRING tag */
1165   /* before proceeding */
1166
1167   offset = get_ber_identifier(tvb, 0, &ber_class, &pc, &tag);
1168   offset = get_ber_length(tvb, offset, &len, &ind);
1169
1170   if((ber_class == BER_CLASS_UNI) && (tag == BER_UNI_TAG_OCTETSTRING))
1171     return offset;
1172
1173   return 0;
1174
1175 }
1176
1177 static void dissect_AuthenticatedSafe_OCTETSTRING_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
1178   int offset = 0;
1179   asn1_ctx_t asn1_ctx;
1180   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1181
1182   if((offset = strip_octet_string(tvb)) > 0)
1183     dissect_pkcs12_AuthenticatedSafe(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_AuthenticatedSafe_PDU);
1184   else
1185     proto_tree_add_expert(tree, pinfo, &ei_pkcs12_octet_string_expected, tvb, 0, 1);
1186 }
1187
1188 static void dissect_SafeContents_OCTETSTRING_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1189 {
1190   int offset = 0;
1191   asn1_ctx_t asn1_ctx;
1192   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1193
1194   offset = strip_octet_string(tvb);
1195
1196   dissect_pkcs12_SafeContents(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_SafeContents_PDU);
1197 }
1198
1199 static void dissect_X509Certificate_OCTETSTRING_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1200 {
1201   int offset = 0;
1202   asn1_ctx_t asn1_ctx;
1203   asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
1204
1205   if((offset = strip_octet_string(tvb)) > 0)
1206         dissect_x509af_Certificate(FALSE, tvb, offset, &asn1_ctx, tree, hf_pkcs12_X509Certificate_PDU);
1207   else
1208         proto_tree_add_expert(tree, pinfo, &ei_pkcs12_octet_string_expected, tvb, 0, 1);
1209 }
1210
1211 /*--- proto_register_pkcs12 ----------------------------------------------*/
1212 void proto_register_pkcs12(void) {
1213
1214   /* List of fields */
1215   static hf_register_info hf[] = {
1216     { &hf_pkcs12_X509Certificate_PDU,
1217       { "X509Certificate", "pkcs12.X509Certificate",
1218         FT_NONE, BASE_NONE, NULL, 0,
1219         "pkcs12.X509Certificate", HFILL }},
1220     { &hf_pkcs12_AuthenticatedSafe_PDU,
1221       { "AuthenticatedSafe", "pkcs12.AuthenticatedSafe",
1222         FT_UINT32, BASE_DEC, NULL, 0,
1223         NULL, HFILL }},
1224
1225
1226 /*--- Included file: packet-pkcs12-hfarr.c ---*/
1227 #line 1 "../../asn1/pkcs12/packet-pkcs12-hfarr.c"
1228     { &hf_pkcs12_PFX_PDU,
1229       { "PFX", "pkcs12.PFX_element",
1230         FT_NONE, BASE_NONE, NULL, 0,
1231         NULL, HFILL }},
1232     { &hf_pkcs12_SafeContents_PDU,
1233       { "SafeContents", "pkcs12.SafeContents",
1234         FT_UINT32, BASE_DEC, NULL, 0,
1235         NULL, HFILL }},
1236     { &hf_pkcs12_KeyBag_PDU,
1237       { "KeyBag", "pkcs12.KeyBag_element",
1238         FT_NONE, BASE_NONE, NULL, 0,
1239         NULL, HFILL }},
1240     { &hf_pkcs12_PKCS8ShroudedKeyBag_PDU,
1241       { "PKCS8ShroudedKeyBag", "pkcs12.PKCS8ShroudedKeyBag_element",
1242         FT_NONE, BASE_NONE, NULL, 0,
1243         NULL, HFILL }},
1244     { &hf_pkcs12_CertBag_PDU,
1245       { "CertBag", "pkcs12.CertBag_element",
1246         FT_NONE, BASE_NONE, NULL, 0,
1247         NULL, HFILL }},
1248     { &hf_pkcs12_CRLBag_PDU,
1249       { "CRLBag", "pkcs12.CRLBag_element",
1250         FT_NONE, BASE_NONE, NULL, 0,
1251         NULL, HFILL }},
1252     { &hf_pkcs12_SecretBag_PDU,
1253       { "SecretBag", "pkcs12.SecretBag_element",
1254         FT_NONE, BASE_NONE, NULL, 0,
1255         NULL, HFILL }},
1256     { &hf_pkcs12_PrivateKeyInfo_PDU,
1257       { "PrivateKeyInfo", "pkcs12.PrivateKeyInfo_element",
1258         FT_NONE, BASE_NONE, NULL, 0,
1259         NULL, HFILL }},
1260     { &hf_pkcs12_EncryptedPrivateKeyInfo_PDU,
1261       { "EncryptedPrivateKeyInfo", "pkcs12.EncryptedPrivateKeyInfo_element",
1262         FT_NONE, BASE_NONE, NULL, 0,
1263         NULL, HFILL }},
1264     { &hf_pkcs12_PBEParameter_PDU,
1265       { "PBEParameter", "pkcs12.PBEParameter_element",
1266         FT_NONE, BASE_NONE, NULL, 0,
1267         NULL, HFILL }},
1268     { &hf_pkcs12_PBKDF2Params_PDU,
1269       { "PBKDF2Params", "pkcs12.PBKDF2Params_element",
1270         FT_NONE, BASE_NONE, NULL, 0,
1271         NULL, HFILL }},
1272     { &hf_pkcs12_PBES2Params_PDU,
1273       { "PBES2Params", "pkcs12.PBES2Params_element",
1274         FT_NONE, BASE_NONE, NULL, 0,
1275         NULL, HFILL }},
1276     { &hf_pkcs12_PBMAC1Params_PDU,
1277       { "PBMAC1Params", "pkcs12.PBMAC1Params_element",
1278         FT_NONE, BASE_NONE, NULL, 0,
1279         NULL, HFILL }},
1280     { &hf_pkcs12_version,
1281       { "version", "pkcs12.version",
1282         FT_UINT32, BASE_DEC, VALS(pkcs12_T_version_vals), 0,
1283         NULL, HFILL }},
1284     { &hf_pkcs12_authSafe,
1285       { "authSafe", "pkcs12.authSafe_element",
1286         FT_NONE, BASE_NONE, NULL, 0,
1287         "ContentInfo", HFILL }},
1288     { &hf_pkcs12_macData,
1289       { "macData", "pkcs12.macData_element",
1290         FT_NONE, BASE_NONE, NULL, 0,
1291         NULL, HFILL }},
1292     { &hf_pkcs12_mac,
1293       { "mac", "pkcs12.mac_element",
1294         FT_NONE, BASE_NONE, NULL, 0,
1295         "DigestInfo", HFILL }},
1296     { &hf_pkcs12_macSalt,
1297       { "macSalt", "pkcs12.macSalt",
1298         FT_BYTES, BASE_NONE, NULL, 0,
1299         "OCTET_STRING", HFILL }},
1300     { &hf_pkcs12_iterations,
1301       { "iterations", "pkcs12.iterations",
1302         FT_INT32, BASE_DEC, NULL, 0,
1303         "INTEGER", HFILL }},
1304     { &hf_pkcs12_digestAlgorithm,
1305       { "digestAlgorithm", "pkcs12.digestAlgorithm_element",
1306         FT_NONE, BASE_NONE, NULL, 0,
1307         "DigestAlgorithmIdentifier", HFILL }},
1308     { &hf_pkcs12_digest,
1309       { "digest", "pkcs12.digest",
1310         FT_BYTES, BASE_NONE, NULL, 0,
1311         NULL, HFILL }},
1312     { &hf_pkcs12_AuthenticatedSafe_item,
1313       { "ContentInfo", "pkcs12.ContentInfo_element",
1314         FT_NONE, BASE_NONE, NULL, 0,
1315         NULL, HFILL }},
1316     { &hf_pkcs12_SafeContents_item,
1317       { "SafeBag", "pkcs12.SafeBag_element",
1318         FT_NONE, BASE_NONE, NULL, 0,
1319         NULL, HFILL }},
1320     { &hf_pkcs12_bagId,
1321       { "bagId", "pkcs12.bagId",
1322         FT_OID, BASE_NONE, NULL, 0,
1323         NULL, HFILL }},
1324     { &hf_pkcs12_bagValue,
1325       { "bagValue", "pkcs12.bagValue_element",
1326         FT_NONE, BASE_NONE, NULL, 0,
1327         NULL, HFILL }},
1328     { &hf_pkcs12_bagAttributes,
1329       { "bagAttributes", "pkcs12.bagAttributes",
1330         FT_UINT32, BASE_DEC, NULL, 0,
1331         "SET_OF_PKCS12Attribute", HFILL }},
1332     { &hf_pkcs12_bagAttributes_item,
1333       { "PKCS12Attribute", "pkcs12.PKCS12Attribute_element",
1334         FT_NONE, BASE_NONE, NULL, 0,
1335         NULL, HFILL }},
1336     { &hf_pkcs12_certId,
1337       { "certId", "pkcs12.certId",
1338         FT_OID, BASE_NONE, NULL, 0,
1339         NULL, HFILL }},
1340     { &hf_pkcs12_certValue,
1341       { "certValue", "pkcs12.certValue_element",
1342         FT_NONE, BASE_NONE, NULL, 0,
1343         NULL, HFILL }},
1344     { &hf_pkcs12_crlId,
1345       { "crlId", "pkcs12.crlId",
1346         FT_OID, BASE_NONE, NULL, 0,
1347         NULL, HFILL }},
1348     { &hf_pkcs12_crlValue,
1349       { "crlValue", "pkcs12.crlValue_element",
1350         FT_NONE, BASE_NONE, NULL, 0,
1351         NULL, HFILL }},
1352     { &hf_pkcs12_secretTypeId,
1353       { "secretTypeId", "pkcs12.secretTypeId",
1354         FT_OID, BASE_NONE, NULL, 0,
1355         NULL, HFILL }},
1356     { &hf_pkcs12_secretValue,
1357       { "secretValue", "pkcs12.secretValue_element",
1358         FT_NONE, BASE_NONE, NULL, 0,
1359         NULL, HFILL }},
1360     { &hf_pkcs12_attrId,
1361       { "attrId", "pkcs12.attrId",
1362         FT_OID, BASE_NONE, NULL, 0,
1363         NULL, HFILL }},
1364     { &hf_pkcs12_attrValues,
1365       { "attrValues", "pkcs12.attrValues",
1366         FT_UINT32, BASE_DEC, NULL, 0,
1367         NULL, HFILL }},
1368     { &hf_pkcs12_attrValues_item,
1369       { "attrValues item", "pkcs12.attrValues_item_element",
1370         FT_NONE, BASE_NONE, NULL, 0,
1371         NULL, HFILL }},
1372     { &hf_pkcs12_privateKeyVersion,
1373       { "version", "pkcs12.version",
1374         FT_UINT32, BASE_DEC, VALS(pkcs12_Version_vals), 0,
1375         NULL, HFILL }},
1376     { &hf_pkcs12_privateKeyAlgorithm,
1377       { "privateKeyAlgorithm", "pkcs12.privateKeyAlgorithm_element",
1378         FT_NONE, BASE_NONE, NULL, 0,
1379         "AlgorithmIdentifier", HFILL }},
1380     { &hf_pkcs12_privateKey,
1381       { "privateKey", "pkcs12.privateKey",
1382         FT_BYTES, BASE_NONE, NULL, 0,
1383         NULL, HFILL }},
1384     { &hf_pkcs12_attributes,
1385       { "attributes", "pkcs12.attributes",
1386         FT_UINT32, BASE_DEC, NULL, 0,
1387         NULL, HFILL }},
1388     { &hf_pkcs12_Attributes_item,
1389       { "Attribute", "pkcs12.Attribute_element",
1390         FT_NONE, BASE_NONE, NULL, 0,
1391         NULL, HFILL }},
1392     { &hf_pkcs12_encryptionAlgorithm,
1393       { "encryptionAlgorithm", "pkcs12.encryptionAlgorithm_element",
1394         FT_NONE, BASE_NONE, NULL, 0,
1395         "AlgorithmIdentifier", HFILL }},
1396     { &hf_pkcs12_encryptedData,
1397       { "encryptedData", "pkcs12.encryptedData",
1398         FT_BYTES, BASE_NONE, NULL, 0,
1399         NULL, HFILL }},
1400     { &hf_pkcs12_salt,
1401       { "salt", "pkcs12.salt",
1402         FT_BYTES, BASE_NONE, NULL, 0,
1403         "OCTET_STRING", HFILL }},
1404     { &hf_pkcs12_iterationCount,
1405       { "iterationCount", "pkcs12.iterationCount",
1406         FT_INT32, BASE_DEC, NULL, 0,
1407         "INTEGER", HFILL }},
1408     { &hf_pkcs12_saltChoice,
1409       { "salt", "pkcs12.salt",
1410         FT_UINT32, BASE_DEC, VALS(pkcs12_T_saltChoice_vals), 0,
1411         "T_saltChoice", HFILL }},
1412     { &hf_pkcs12_specified,
1413       { "specified", "pkcs12.specified",
1414         FT_BYTES, BASE_NONE, NULL, 0,
1415         "OCTET_STRING", HFILL }},
1416     { &hf_pkcs12_otherSource,
1417       { "otherSource", "pkcs12.otherSource_element",
1418         FT_NONE, BASE_NONE, NULL, 0,
1419         "AlgorithmIdentifier", HFILL }},
1420     { &hf_pkcs12_keyLength,
1421       { "keyLength", "pkcs12.keyLength",
1422         FT_UINT32, BASE_DEC, NULL, 0,
1423         "INTEGER_1_MAX", HFILL }},
1424     { &hf_pkcs12_prf,
1425       { "prf", "pkcs12.prf_element",
1426         FT_NONE, BASE_NONE, NULL, 0,
1427         "AlgorithmIdentifier", HFILL }},
1428     { &hf_pkcs12_keyDerivationFunc,
1429       { "keyDerivationFunc", "pkcs12.keyDerivationFunc_element",
1430         FT_NONE, BASE_NONE, NULL, 0,
1431         "AlgorithmIdentifier", HFILL }},
1432     { &hf_pkcs12_encryptionScheme,
1433       { "encryptionScheme", "pkcs12.encryptionScheme_element",
1434         FT_NONE, BASE_NONE, NULL, 0,
1435         "AlgorithmIdentifier", HFILL }},
1436     { &hf_pkcs12_messageAuthScheme,
1437       { "messageAuthScheme", "pkcs12.messageAuthScheme_element",
1438         FT_NONE, BASE_NONE, NULL, 0,
1439         "AlgorithmIdentifier", HFILL }},
1440
1441 /*--- End of included file: packet-pkcs12-hfarr.c ---*/
1442 #line 459 "../../asn1/pkcs12/packet-pkcs12-template.c"
1443   };
1444
1445   /* List of subtrees */
1446   static gint *ett[] = {
1447           &ett_decrypted_pbe,
1448
1449 /*--- Included file: packet-pkcs12-ettarr.c ---*/
1450 #line 1 "../../asn1/pkcs12/packet-pkcs12-ettarr.c"
1451     &ett_pkcs12_PFX,
1452     &ett_pkcs12_MacData,
1453     &ett_pkcs12_DigestInfo,
1454     &ett_pkcs12_AuthenticatedSafe,
1455     &ett_pkcs12_SafeContents,
1456     &ett_pkcs12_SafeBag,
1457     &ett_pkcs12_SET_OF_PKCS12Attribute,
1458     &ett_pkcs12_CertBag,
1459     &ett_pkcs12_CRLBag,
1460     &ett_pkcs12_SecretBag,
1461     &ett_pkcs12_PKCS12Attribute,
1462     &ett_pkcs12_T_attrValues,
1463     &ett_pkcs12_PrivateKeyInfo,
1464     &ett_pkcs12_Attributes,
1465     &ett_pkcs12_EncryptedPrivateKeyInfo,
1466     &ett_pkcs12_PBEParameter,
1467     &ett_pkcs12_PBKDF2Params,
1468     &ett_pkcs12_T_saltChoice,
1469     &ett_pkcs12_PBES2Params,
1470     &ett_pkcs12_PBMAC1Params,
1471
1472 /*--- End of included file: packet-pkcs12-ettarr.c ---*/
1473 #line 465 "../../asn1/pkcs12/packet-pkcs12-template.c"
1474   };
1475   static ei_register_info ei[] = {
1476       { &ei_pkcs12_octet_string_expected, { "pkcs12.octet_string_expected", PI_PROTOCOL, PI_WARN, "BER Error: OCTET STRING expected", EXPFILL }},
1477   };
1478
1479   module_t *pkcs12_module;
1480   expert_module_t* expert_pkcs12;
1481
1482   /* Register protocol */
1483   proto_pkcs12 = proto_register_protocol(PNAME, PSNAME, PFNAME);
1484
1485   /* Register fields and subtrees */
1486   proto_register_field_array(proto_pkcs12, hf, array_length(hf));
1487   proto_register_subtree_array(ett, array_length(ett));
1488   expert_pkcs12 = expert_register_protocol(proto_pkcs12);
1489   expert_register_field_array(expert_pkcs12, ei, array_length(ei));
1490
1491   /* Register preferences */
1492   pkcs12_module = prefs_register_protocol(proto_pkcs12, NULL);
1493
1494   prefs_register_string_preference(pkcs12_module, "password",
1495         "Password to decrypt the file with",
1496         "The password to used to decrypt the encrypted elements within"
1497         " the PKCS#12 file", &password);
1498
1499   prefs_register_bool_preference(pkcs12_module, "try_null_password",
1500         "Try to decrypt with a empty password",
1501         "Whether to try and decrypt the encrypted data within the"
1502         " PKCS#12 with a NULL password", &try_null_password);
1503
1504   new_register_ber_syntax_dissector("PKCS#12", proto_pkcs12, dissect_PFX_PDU);
1505   register_ber_oid_syntax(".p12", NULL, "PKCS#12");
1506   register_ber_oid_syntax(".pfx", NULL, "PKCS#12");
1507 }
1508
1509
1510 /*--- proto_reg_handoff_pkcs12 -------------------------------------------*/
1511 void proto_reg_handoff_pkcs12(void) {
1512
1513 /*--- Included file: packet-pkcs12-dis-tab.c ---*/
1514 #line 1 "../../asn1/pkcs12/packet-pkcs12-dis-tab.c"
1515   new_register_ber_oid_dissector("1.2.840.113549.1.12.10.1.1", dissect_KeyBag_PDU, proto_pkcs12, "keyBag");
1516   new_register_ber_oid_dissector("1.2.840.113549.1.12.10.1.2", dissect_PKCS8ShroudedKeyBag_PDU, proto_pkcs12, "pkcs8ShroudedKeyBag");
1517   new_register_ber_oid_dissector("1.2.840.113549.1.12.10.1.3", dissect_CertBag_PDU, proto_pkcs12, "certBag");
1518   new_register_ber_oid_dissector("1.2.840.113549.1.12.10.1.4", dissect_SecretBag_PDU, proto_pkcs12, "secretBag");
1519   new_register_ber_oid_dissector("1.2.840.113549.1.12.10.1.5", dissect_CRLBag_PDU, proto_pkcs12, "crlBag");
1520   new_register_ber_oid_dissector("1.2.840.113549.1.12.10.1.6", dissect_SafeContents_PDU, proto_pkcs12, "safeContentsBag");
1521   new_register_ber_oid_dissector("2.16.840.1.113730.3.1.216", dissect_PFX_PDU, proto_pkcs12, "pkcs-9-at-PKCS12");
1522   new_register_ber_oid_dissector("1.2.840.113549.1.9.25.2", dissect_EncryptedPrivateKeyInfo_PDU, proto_pkcs12, "pkcs-9-at-encryptedPrivateKeyInfo");
1523   new_register_ber_oid_dissector("1.2.840.113549.1.12.1.1", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHAAnd128BitRC4");
1524   new_register_ber_oid_dissector("1.2.840.113549.1.12.1.2", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHAAnd40BitRC4");
1525   new_register_ber_oid_dissector("1.2.840.113549.1.12.1.3", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHAAnd3-KeyTripleDES-CBC");
1526   new_register_ber_oid_dissector("1.2.840.113549.1.12.1.4", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHAAnd2-KeyTripleDES-CBC");
1527   new_register_ber_oid_dissector("1.2.840.113549.1.12.1.5", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHAAnd128BitRC2-CBC");
1528   new_register_ber_oid_dissector("1.2.840.113549.1.12.1.6", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHAAnd40BitRC2-CBC");
1529   new_register_ber_oid_dissector("1.2.840.113549.1.5.1", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithMD2AndDES-CBC");
1530   new_register_ber_oid_dissector("1.2.840.113549.1.5.3", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithMD5AndDES-CBC");
1531   new_register_ber_oid_dissector("1.2.840.113549.1.5.4", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithMD2AndRC2-CBC");
1532   new_register_ber_oid_dissector("1.2.840.113549.1.5.6", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithMD5AndRC2-CBC");
1533   new_register_ber_oid_dissector("1.2.840.113549.1.5.10", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHA1AndDES-CBC");
1534   new_register_ber_oid_dissector("1.2.840.113549.1.5.11", dissect_PBEParameter_PDU, proto_pkcs12, "pbeWithSHA1AndRC2-CBC");
1535   new_register_ber_oid_dissector("1.2.840.113549.1.5.12", dissect_PBKDF2Params_PDU, proto_pkcs12, "id-PBKDF2");
1536   new_register_ber_oid_dissector("1.2.840.113549.1.5.13", dissect_PBES2Params_PDU, proto_pkcs12, "id-PBES2");
1537   new_register_ber_oid_dissector("1.2.840.113549.1.5.14", dissect_PBMAC1Params_PDU, proto_pkcs12, "id-PBMAC1");
1538
1539
1540 /*--- End of included file: packet-pkcs12-dis-tab.c ---*/
1541 #line 504 "../../asn1/pkcs12/packet-pkcs12-template.c"
1542
1543         register_ber_oid_dissector("1.2.840.113549.1.9.22.1", dissect_X509Certificate_OCTETSTRING_PDU, proto_pkcs12, "x509Certificate");
1544
1545 }
1546