change the signature that asn2wrs generates for functions to marm all parameters...
[obnox/wireshark/wip.git] / epan / dissectors / packet-cms.c
1 /* Do not modify this file.                                                   */
2 /* It is created automatically by the ASN.1 to Wireshark dissector compiler   */
3 /* ./packet-cms.c                                                             */
4 /* ../../tools/asn2wrs.py -b -e -p cms -c cms.cnf -s packet-cms-template CryptographicMessageSyntax.asn */
5
6 /* Input file: packet-cms-template.c */
7
8 #line 1 "packet-cms-template.c"
9 /* packet-cms.c
10  * Routines for RFC2630 Cryptographic Message Syntax packet dissection
11  *   Ronnie Sahlberg 2004
12  *
13  * $Id$
14  *
15  * Wireshark - Network traffic analyzer
16  * By Gerald Combs <gerald@wireshark.org>
17  * Copyright 1998 Gerald Combs
18  *
19  * This program is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU General Public License
21  * as published by the Free Software Foundation; either version 2
22  * of the License, or (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program; if not, write to the Free Software
31  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
32  */
33
34 #ifdef HAVE_CONFIG_H
35 # include "config.h"
36 #endif
37
38 #include <glib.h>
39 #include <epan/packet.h>
40 #include <epan/conversation.h>
41 #include <epan/oid_resolv.h>
42
43 #include <stdio.h>
44 #include <string.h>
45
46 #include "packet-ber.h"
47 #include "packet-cms.h"
48 #include "packet-x509af.h"
49 #include "packet-x509if.h"
50
51 #include <epan/crypt/crypt-sha1.h>
52 #include <epan/crypt/crypt-md5.h>
53
54 #define PNAME  "Cryptographic Message Syntax"
55 #define PSNAME "CMS"
56 #define PFNAME "cms"
57
58 /* Initialize the protocol and registered fields */
59 int proto_cms = -1;
60 static int hf_cms_ci_contentType = -1;
61
62 /*--- Included file: packet-cms-hf.c ---*/
63 #line 1 "packet-cms-hf.c"
64 static int hf_cms_ContentInfo_PDU = -1;           /* ContentInfo */
65 static int hf_cms_ContentType_PDU = -1;           /* ContentType */
66 static int hf_cms_SignedData_PDU = -1;            /* SignedData */
67 static int hf_cms_EnvelopedData_PDU = -1;         /* EnvelopedData */
68 static int hf_cms_DigestedData_PDU = -1;          /* DigestedData */
69 static int hf_cms_EncryptedData_PDU = -1;         /* EncryptedData */
70 static int hf_cms_AuthenticatedData_PDU = -1;     /* AuthenticatedData */
71 static int hf_cms_IssuerAndSerialNumber_PDU = -1;  /* IssuerAndSerialNumber */
72 static int hf_cms_MessageDigest_PDU = -1;         /* MessageDigest */
73 static int hf_cms_SigningTime_PDU = -1;           /* SigningTime */
74 static int hf_cms_Countersignature_PDU = -1;      /* Countersignature */
75 static int hf_cms_RC2WrapParameter_PDU = -1;      /* RC2WrapParameter */
76 static int hf_cms_SMIMECapabilities_PDU = -1;     /* SMIMECapabilities */
77 static int hf_cms_SMIMEEncryptionKeyPreference_PDU = -1;  /* SMIMEEncryptionKeyPreference */
78 static int hf_cms_RC2CBCParameters_PDU = -1;      /* RC2CBCParameters */
79 static int hf_cms_contentType = -1;               /* ContentType */
80 static int hf_cms_content = -1;                   /* T_content */
81 static int hf_cms_version = -1;                   /* CMSVersion */
82 static int hf_cms_digestAlgorithms = -1;          /* DigestAlgorithmIdentifiers */
83 static int hf_cms_encapContentInfo = -1;          /* EncapsulatedContentInfo */
84 static int hf_cms_certificates = -1;              /* CertificateSet */
85 static int hf_cms_crls = -1;                      /* CertificateRevocationLists */
86 static int hf_cms_signerInfos = -1;               /* SignerInfos */
87 static int hf_cms_DigestAlgorithmIdentifiers_item = -1;  /* DigestAlgorithmIdentifier */
88 static int hf_cms_SignerInfos_item = -1;          /* SignerInfo */
89 static int hf_cms_eContentType = -1;              /* ContentType */
90 static int hf_cms_eContent = -1;                  /* T_eContent */
91 static int hf_cms_sid = -1;                       /* SignerIdentifier */
92 static int hf_cms_digestAlgorithm = -1;           /* DigestAlgorithmIdentifier */
93 static int hf_cms_signedAttrs = -1;               /* SignedAttributes */
94 static int hf_cms_signatureAlgorithm = -1;        /* SignatureAlgorithmIdentifier */
95 static int hf_cms_signatureValue = -1;            /* SignatureValue */
96 static int hf_cms_unsignedAttrs = -1;             /* UnsignedAttributes */
97 static int hf_cms_issuerAndSerialNumber = -1;     /* IssuerAndSerialNumber */
98 static int hf_cms_subjectKeyIdentifier = -1;      /* SubjectKeyIdentifier */
99 static int hf_cms_SignedAttributes_item = -1;     /* Attribute */
100 static int hf_cms_UnsignedAttributes_item = -1;   /* Attribute */
101 static int hf_cms_attrType = -1;                  /* T_attrType */
102 static int hf_cms_attrValues = -1;                /* SET_OF_AttributeValue */
103 static int hf_cms_attrValues_item = -1;           /* AttributeValue */
104 static int hf_cms_originatorInfo = -1;            /* OriginatorInfo */
105 static int hf_cms_recipientInfos = -1;            /* RecipientInfos */
106 static int hf_cms_encryptedContentInfo = -1;      /* EncryptedContentInfo */
107 static int hf_cms_unprotectedAttrs = -1;          /* UnprotectedAttributes */
108 static int hf_cms_certs = -1;                     /* CertificateSet */
109 static int hf_cms_RecipientInfos_item = -1;       /* RecipientInfo */
110 static int hf_cms_encryptedContentType = -1;      /* ContentType */
111 static int hf_cms_contentEncryptionAlgorithm = -1;  /* ContentEncryptionAlgorithmIdentifier */
112 static int hf_cms_encryptedContent = -1;          /* EncryptedContent */
113 static int hf_cms_UnprotectedAttributes_item = -1;  /* Attribute */
114 static int hf_cms_ktri = -1;                      /* KeyTransRecipientInfo */
115 static int hf_cms_kari = -1;                      /* KeyAgreeRecipientInfo */
116 static int hf_cms_kekri = -1;                     /* KEKRecipientInfo */
117 static int hf_cms_rid = -1;                       /* RecipientIdentifier */
118 static int hf_cms_keyEncryptionAlgorithm = -1;    /* KeyEncryptionAlgorithmIdentifier */
119 static int hf_cms_encryptedKey = -1;              /* EncryptedKey */
120 static int hf_cms_originator = -1;                /* OriginatorIdentifierOrKey */
121 static int hf_cms_ukm = -1;                       /* UserKeyingMaterial */
122 static int hf_cms_recipientEncryptedKeys = -1;    /* RecipientEncryptedKeys */
123 static int hf_cms_originatorKey = -1;             /* OriginatorPublicKey */
124 static int hf_cms_algorithm = -1;                 /* AlgorithmIdentifier */
125 static int hf_cms_publicKey = -1;                 /* BIT_STRING */
126 static int hf_cms_RecipientEncryptedKeys_item = -1;  /* RecipientEncryptedKey */
127 static int hf_cms_rekRid = -1;                    /* KeyAgreeRecipientIdentifier */
128 static int hf_cms_rKeyId = -1;                    /* RecipientKeyIdentifier */
129 static int hf_cms_date = -1;                      /* GeneralizedTime */
130 static int hf_cms_other = -1;                     /* OtherKeyAttribute */
131 static int hf_cms_kekid = -1;                     /* KEKIdentifier */
132 static int hf_cms_keyIdentifier = -1;             /* OCTET_STRING */
133 static int hf_cms_digest = -1;                    /* Digest */
134 static int hf_cms_macAlgorithm = -1;              /* MessageAuthenticationCodeAlgorithm */
135 static int hf_cms_authenticatedAttributes = -1;   /* AuthAttributes */
136 static int hf_cms_mac = -1;                       /* MessageAuthenticationCode */
137 static int hf_cms_unauthenticatedAttributes = -1;  /* UnauthAttributes */
138 static int hf_cms_AuthAttributes_item = -1;       /* Attribute */
139 static int hf_cms_UnauthAttributes_item = -1;     /* Attribute */
140 static int hf_cms_CertificateRevocationLists_item = -1;  /* CertificateList */
141 static int hf_cms_certificate = -1;               /* Certificate */
142 static int hf_cms_extendedCertificate = -1;       /* ExtendedCertificate */
143 static int hf_cms_attrCert = -1;                  /* AttributeCertificate */
144 static int hf_cms_CertificateSet_item = -1;       /* CertificateChoices */
145 static int hf_cms_issuer = -1;                    /* Name */
146 static int hf_cms_serialNumber = -1;              /* CertificateSerialNumber */
147 static int hf_cms_keyAttrId = -1;                 /* T_keyAttrId */
148 static int hf_cms_keyAttr = -1;                   /* T_keyAttr */
149 static int hf_cms_utcTime = -1;                   /* UTCTime */
150 static int hf_cms_generalTime = -1;               /* GeneralizedTime */
151 static int hf_cms_rc2ParameterVersion = -1;       /* INTEGER */
152 static int hf_cms_iv = -1;                        /* OCTET_STRING */
153 static int hf_cms_extendedCertificateInfo = -1;   /* ExtendedCertificateInfo */
154 static int hf_cms_signature = -1;                 /* Signature */
155 static int hf_cms_attributes = -1;                /* UnauthAttributes */
156 static int hf_cms_SMIMECapabilities_item = -1;    /* SMIMECapability */
157 static int hf_cms_capability = -1;                /* T_capability */
158 static int hf_cms_parameters = -1;                /* T_parameters */
159 static int hf_cms_recipientKeyId = -1;            /* RecipientKeyIdentifier */
160 static int hf_cms_subjectAltKeyIdentifier = -1;   /* SubjectKeyIdentifier */
161 static int hf_cms_rc2WrapParameter = -1;          /* RC2WrapParameter */
162 static int hf_cms_rc2CBCParameter = -1;           /* RC2CBCParameter */
163
164 /*--- End of included file: packet-cms-hf.c ---*/
165 #line 54 "packet-cms-template.c"
166
167 /* Initialize the subtree pointers */
168
169 /*--- Included file: packet-cms-ett.c ---*/
170 #line 1 "packet-cms-ett.c"
171 static gint ett_cms_ContentInfo = -1;
172 static gint ett_cms_SignedData = -1;
173 static gint ett_cms_DigestAlgorithmIdentifiers = -1;
174 static gint ett_cms_SignerInfos = -1;
175 static gint ett_cms_EncapsulatedContentInfo = -1;
176 static gint ett_cms_SignerInfo = -1;
177 static gint ett_cms_SignerIdentifier = -1;
178 static gint ett_cms_SignedAttributes = -1;
179 static gint ett_cms_UnsignedAttributes = -1;
180 static gint ett_cms_Attribute = -1;
181 static gint ett_cms_SET_OF_AttributeValue = -1;
182 static gint ett_cms_EnvelopedData = -1;
183 static gint ett_cms_OriginatorInfo = -1;
184 static gint ett_cms_RecipientInfos = -1;
185 static gint ett_cms_EncryptedContentInfo = -1;
186 static gint ett_cms_UnprotectedAttributes = -1;
187 static gint ett_cms_RecipientInfo = -1;
188 static gint ett_cms_KeyTransRecipientInfo = -1;
189 static gint ett_cms_RecipientIdentifier = -1;
190 static gint ett_cms_KeyAgreeRecipientInfo = -1;
191 static gint ett_cms_OriginatorIdentifierOrKey = -1;
192 static gint ett_cms_OriginatorPublicKey = -1;
193 static gint ett_cms_RecipientEncryptedKeys = -1;
194 static gint ett_cms_RecipientEncryptedKey = -1;
195 static gint ett_cms_KeyAgreeRecipientIdentifier = -1;
196 static gint ett_cms_RecipientKeyIdentifier = -1;
197 static gint ett_cms_KEKRecipientInfo = -1;
198 static gint ett_cms_KEKIdentifier = -1;
199 static gint ett_cms_DigestedData = -1;
200 static gint ett_cms_EncryptedData = -1;
201 static gint ett_cms_AuthenticatedData = -1;
202 static gint ett_cms_AuthAttributes = -1;
203 static gint ett_cms_UnauthAttributes = -1;
204 static gint ett_cms_CertificateRevocationLists = -1;
205 static gint ett_cms_CertificateChoices = -1;
206 static gint ett_cms_CertificateSet = -1;
207 static gint ett_cms_IssuerAndSerialNumber = -1;
208 static gint ett_cms_OtherKeyAttribute = -1;
209 static gint ett_cms_Time = -1;
210 static gint ett_cms_RC2CBCParameter = -1;
211 static gint ett_cms_ExtendedCertificate = -1;
212 static gint ett_cms_ExtendedCertificateInfo = -1;
213 static gint ett_cms_SMIMECapabilities = -1;
214 static gint ett_cms_SMIMECapability = -1;
215 static gint ett_cms_SMIMEEncryptionKeyPreference = -1;
216 static gint ett_cms_RC2CBCParameters = -1;
217
218 /*--- End of included file: packet-cms-ett.c ---*/
219 #line 57 "packet-cms-template.c"
220
221 static int dissect_cms_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) ; /* XXX kill a compiler warning until asn2wrs stops generating these silly wrappers */
222
223
224 static const char *object_identifier_id;
225 static tvbuff_t *content_tvb = NULL;
226
227 static proto_tree *top_tree=NULL;
228 static proto_tree *cap_tree=NULL;
229
230 #define HASH_SHA1 "1.3.14.3.2.26"
231 #define SHA1_BUFFER_SIZE  20
232
233 #define HASH_MD5 "1.2.840.113549.2.5"
234 #define MD5_BUFFER_SIZE  16
235
236
237 /* SHA-2 variants */
238 #define HASH_SHA224 "2.16.840.1.101.3.4.2.4"
239 #define SHA224_BUFFER_SIZE  32 /* actually 28 */
240 #define HASH_SHA256 "2.16.840.1.101.3.4.2.1"
241 #define SHA256_BUFFER_SIZE  32
242
243 unsigned char digest_buf[MAX(SHA1_BUFFER_SIZE, MD5_BUFFER_SIZE)];
244
245 static void
246 cms_verify_msg_digest(proto_item *pi, tvbuff_t *content, const char *alg, tvbuff_t *tvb, int offset)
247 {
248   sha1_context sha1_ctx;
249   md5_state_t md5_ctx;
250   int i= 0, buffer_size = 0;
251
252   /* we only support two algorithms at the moment  - if we do add SHA2
253      we should add a registration process to use a registration process */
254
255   if(strcmp(alg, HASH_SHA1) == 0) {
256
257     sha1_starts(&sha1_ctx);
258
259     sha1_update(&sha1_ctx, tvb_get_ptr(content, 0, tvb_length(content)),
260                 tvb_length(content));
261
262     sha1_finish(&sha1_ctx, digest_buf);
263
264     buffer_size = SHA1_BUFFER_SIZE;
265
266   } else if(strcmp(alg, HASH_MD5) == 0) {
267
268     md5_init(&md5_ctx);
269
270     md5_append(&md5_ctx, tvb_get_ptr(content, 0, tvb_length(content)),
271                tvb_length(content));
272
273     md5_finish(&md5_ctx, digest_buf);
274
275     buffer_size = MD5_BUFFER_SIZE;
276   }
277
278   if(buffer_size) {
279     /* compare our computed hash with what we have received */
280
281     if(tvb_bytes_exist(tvb, offset, buffer_size) &&
282        (memcmp(tvb_get_ptr(tvb, offset, buffer_size), digest_buf, buffer_size) != 0)) {
283       proto_item_append_text(pi, " [incorrect, should be ");
284       for(i = 0; i < buffer_size; i++)
285         proto_item_append_text(pi, "%02X", digest_buf[i]);
286
287       proto_item_append_text(pi, "]");
288     }
289     else
290       proto_item_append_text(pi, " [correct]");
291   } else {
292     proto_item_append_text(pi, " [unable to verify]");
293   }
294
295 }
296
297
298 /*--- Included file: packet-cms-fn.c ---*/
299 #line 1 "packet-cms-fn.c"
300 /*--- Fields for imported types ---*/
301
302 static int dissect_algorithm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
303   return dissect_x509af_AlgorithmIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_algorithm);
304 }
305 static int dissect_CertificateRevocationLists_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
306   return dissect_x509af_CertificateList(FALSE, tvb, offset, pinfo, tree, hf_cms_CertificateRevocationLists_item);
307 }
308 static int dissect_certificate(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
309   return dissect_x509af_Certificate(FALSE, tvb, offset, pinfo, tree, hf_cms_certificate);
310 }
311 static int dissect_attrCert_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
312   return dissect_x509af_AttributeCertificate(TRUE, tvb, offset, pinfo, tree, hf_cms_attrCert);
313 }
314 static int dissect_issuer(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
315   return dissect_x509if_Name(FALSE, tvb, offset, pinfo, tree, hf_cms_issuer);
316 }
317 static int dissect_serialNumber(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
318   return dissect_x509af_CertificateSerialNumber(FALSE, tvb, offset, pinfo, tree, hf_cms_serialNumber);
319 }
320
321
322
323 int
324 dissect_cms_ContentType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
325 #line 69 "cms.cnf"
326         const char *name = NULL;
327
328           offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_index, &object_identifier_id);
329
330
331         if(object_identifier_id) {  
332                 name = get_oid_str_name(object_identifier_id);
333                 proto_item_append_text(tree, " (%s)", name ? name : object_identifier_id); 
334         }
335
336
337
338   return offset;
339 }
340 static int dissect_contentType(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
341   return dissect_cms_ContentType(FALSE, tvb, offset, pinfo, tree, hf_cms_contentType);
342 }
343 static int dissect_eContentType(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
344   return dissect_cms_ContentType(FALSE, tvb, offset, pinfo, tree, hf_cms_eContentType);
345 }
346 static int dissect_encryptedContentType(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
347   return dissect_cms_ContentType(FALSE, tvb, offset, pinfo, tree, hf_cms_encryptedContentType);
348 }
349
350
351
352 static int
353 dissect_cms_T_content(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
354 #line 79 "cms.cnf"
355   offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, tree);
356
357
358
359
360   return offset;
361 }
362 static int dissect_content(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
363   return dissect_cms_T_content(FALSE, tvb, offset, pinfo, tree, hf_cms_content);
364 }
365
366
367 static const ber_sequence_t ContentInfo_sequence[] = {
368   { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_contentType },
369   { BER_CLASS_CON, 0, 0, dissect_content },
370   { 0, 0, 0, NULL }
371 };
372
373 int
374 dissect_cms_ContentInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
375 #line 60 "cms.cnf"
376   top_tree = tree;
377     offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
378                                    ContentInfo_sequence, hf_index, ett_cms_ContentInfo);
379
380   content_tvb = NULL;
381   top_tree = NULL;
382
383
384
385   return offset;
386 }
387
388
389 static const value_string cms_CMSVersion_vals[] = {
390   {   0, "v0" },
391   {   1, "v1" },
392   {   2, "v2" },
393   {   3, "v3" },
394   {   4, "v4" },
395   { 0, NULL }
396 };
397
398
399 static int
400 dissect_cms_CMSVersion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
401   offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
402                                   NULL);
403
404   return offset;
405 }
406 static int dissect_version(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
407   return dissect_cms_CMSVersion(FALSE, tvb, offset, pinfo, tree, hf_cms_version);
408 }
409
410
411
412 int
413 dissect_cms_DigestAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
414   offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
415
416   return offset;
417 }
418 static int dissect_DigestAlgorithmIdentifiers_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
419   return dissect_cms_DigestAlgorithmIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_DigestAlgorithmIdentifiers_item);
420 }
421 static int dissect_digestAlgorithm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
422   return dissect_cms_DigestAlgorithmIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_digestAlgorithm);
423 }
424 static int dissect_digestAlgorithm_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
425   return dissect_cms_DigestAlgorithmIdentifier(TRUE, tvb, offset, pinfo, tree, hf_cms_digestAlgorithm);
426 }
427
428
429 static const ber_sequence_t DigestAlgorithmIdentifiers_set_of[1] = {
430   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_DigestAlgorithmIdentifiers_item },
431 };
432
433 int
434 dissect_cms_DigestAlgorithmIdentifiers(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
435   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
436                                  DigestAlgorithmIdentifiers_set_of, hf_index, ett_cms_DigestAlgorithmIdentifiers);
437
438   return offset;
439 }
440 static int dissect_digestAlgorithms(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
441   return dissect_cms_DigestAlgorithmIdentifiers(FALSE, tvb, offset, pinfo, tree, hf_cms_digestAlgorithms);
442 }
443
444
445
446 static int
447 dissect_cms_T_eContent(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
448 #line 83 "cms.cnf"
449   gint8 class;
450   gboolean pc, ind;
451   gint32 tag;
452   guint32 len;
453   int pdu_offset = offset;
454   int content_offset;
455
456   /* XXX Do we care about printing out the octet string? */
457   offset = dissect_cms_OCTET_STRING(FALSE, tvb, offset, pinfo, NULL, hf_cms_eContent);
458
459   pdu_offset = get_ber_identifier(tvb, pdu_offset, &class, &pc, &tag);
460   content_offset = pdu_offset = get_ber_length(tree, tvb, pdu_offset, &len, &ind);
461   pdu_offset = call_ber_oid_callback(object_identifier_id, tvb, pdu_offset, pinfo, top_tree ? top_tree : tree);
462   
463   /* save the content for checking the message digest */        
464   content_tvb = tvb_new_subset(tvb, content_offset, len, -1);
465
466
467
468   return offset;
469 }
470 static int dissect_eContent(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
471   return dissect_cms_T_eContent(FALSE, tvb, offset, pinfo, tree, hf_cms_eContent);
472 }
473
474
475 static const ber_sequence_t EncapsulatedContentInfo_sequence[] = {
476   { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_eContentType },
477   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_eContent },
478   { 0, 0, 0, NULL }
479 };
480
481 int
482 dissect_cms_EncapsulatedContentInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
483   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
484                                    EncapsulatedContentInfo_sequence, hf_index, ett_cms_EncapsulatedContentInfo);
485
486   return offset;
487 }
488 static int dissect_encapContentInfo(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
489   return dissect_cms_EncapsulatedContentInfo(FALSE, tvb, offset, pinfo, tree, hf_cms_encapContentInfo);
490 }
491
492
493
494 static int
495 dissect_cms_T_attrType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
496 #line 111 "cms.cnf"
497   const char *name = NULL;
498
499     offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_cms_attrType, &object_identifier_id);
500
501
502   if(object_identifier_id) {
503     name = get_oid_str_name(object_identifier_id);
504     proto_item_append_text(tree, " (%s)", name ? name : object_identifier_id); 
505   }
506
507
508
509   return offset;
510 }
511 static int dissect_attrType(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
512   return dissect_cms_T_attrType(FALSE, tvb, offset, pinfo, tree, hf_cms_attrType);
513 }
514
515
516
517 static int
518 dissect_cms_AttributeValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
519 #line 121 "cms.cnf"
520
521   offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, tree);
522
523
524
525   return offset;
526 }
527 static int dissect_attrValues_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
528   return dissect_cms_AttributeValue(FALSE, tvb, offset, pinfo, tree, hf_cms_attrValues_item);
529 }
530
531
532 static const ber_sequence_t SET_OF_AttributeValue_set_of[1] = {
533   { BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_attrValues_item },
534 };
535
536 static int
537 dissect_cms_SET_OF_AttributeValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
538   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
539                                  SET_OF_AttributeValue_set_of, hf_index, ett_cms_SET_OF_AttributeValue);
540
541   return offset;
542 }
543 static int dissect_attrValues(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
544   return dissect_cms_SET_OF_AttributeValue(FALSE, tvb, offset, pinfo, tree, hf_cms_attrValues);
545 }
546
547
548 static const ber_sequence_t Attribute_sequence[] = {
549   { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_attrType },
550   { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_attrValues },
551   { 0, 0, 0, NULL }
552 };
553
554 static int
555 dissect_cms_Attribute(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
556   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
557                                    Attribute_sequence, hf_index, ett_cms_Attribute);
558
559   return offset;
560 }
561 static int dissect_SignedAttributes_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
562   return dissect_cms_Attribute(FALSE, tvb, offset, pinfo, tree, hf_cms_SignedAttributes_item);
563 }
564 static int dissect_UnsignedAttributes_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
565   return dissect_cms_Attribute(FALSE, tvb, offset, pinfo, tree, hf_cms_UnsignedAttributes_item);
566 }
567 static int dissect_UnprotectedAttributes_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
568   return dissect_cms_Attribute(FALSE, tvb, offset, pinfo, tree, hf_cms_UnprotectedAttributes_item);
569 }
570 static int dissect_AuthAttributes_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
571   return dissect_cms_Attribute(FALSE, tvb, offset, pinfo, tree, hf_cms_AuthAttributes_item);
572 }
573 static int dissect_UnauthAttributes_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
574   return dissect_cms_Attribute(FALSE, tvb, offset, pinfo, tree, hf_cms_UnauthAttributes_item);
575 }
576
577
578 static const ber_sequence_t UnauthAttributes_set_of[1] = {
579   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_UnauthAttributes_item },
580 };
581
582 static int
583 dissect_cms_UnauthAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
584   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
585                                  UnauthAttributes_set_of, hf_index, ett_cms_UnauthAttributes);
586
587   return offset;
588 }
589 static int dissect_unauthenticatedAttributes_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
590   return dissect_cms_UnauthAttributes(TRUE, tvb, offset, pinfo, tree, hf_cms_unauthenticatedAttributes);
591 }
592 static int dissect_attributes(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
593   return dissect_cms_UnauthAttributes(FALSE, tvb, offset, pinfo, tree, hf_cms_attributes);
594 }
595
596
597 static const ber_sequence_t ExtendedCertificateInfo_sequence[] = {
598   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
599   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_certificate },
600   { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_attributes },
601   { 0, 0, 0, NULL }
602 };
603
604 static int
605 dissect_cms_ExtendedCertificateInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
606   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
607                                    ExtendedCertificateInfo_sequence, hf_index, ett_cms_ExtendedCertificateInfo);
608
609   return offset;
610 }
611 static int dissect_extendedCertificateInfo(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
612   return dissect_cms_ExtendedCertificateInfo(FALSE, tvb, offset, pinfo, tree, hf_cms_extendedCertificateInfo);
613 }
614
615
616
617 static int
618 dissect_cms_SignatureAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
619   offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
620
621   return offset;
622 }
623 static int dissect_signatureAlgorithm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
624   return dissect_cms_SignatureAlgorithmIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_signatureAlgorithm);
625 }
626
627
628
629 static int
630 dissect_cms_Signature(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
631   offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
632                                     NULL, hf_index, -1,
633                                     NULL);
634
635   return offset;
636 }
637 static int dissect_signature(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
638   return dissect_cms_Signature(FALSE, tvb, offset, pinfo, tree, hf_cms_signature);
639 }
640
641
642 static const ber_sequence_t ExtendedCertificate_sequence[] = {
643   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_extendedCertificateInfo },
644   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_signatureAlgorithm },
645   { BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_signature },
646   { 0, 0, 0, NULL }
647 };
648
649 static int
650 dissect_cms_ExtendedCertificate(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
651   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
652                                    ExtendedCertificate_sequence, hf_index, ett_cms_ExtendedCertificate);
653
654   return offset;
655 }
656 static int dissect_extendedCertificate_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
657   return dissect_cms_ExtendedCertificate(TRUE, tvb, offset, pinfo, tree, hf_cms_extendedCertificate);
658 }
659
660
661 static const value_string cms_CertificateChoices_vals[] = {
662   {   0, "certificate" },
663   {   1, "extendedCertificate" },
664   {   2, "attrCert" },
665   { 0, NULL }
666 };
667
668 static const ber_choice_t CertificateChoices_choice[] = {
669   {   0, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_certificate },
670   {   1, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_extendedCertificate_impl },
671   {   2, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_attrCert_impl },
672   { 0, 0, 0, 0, NULL }
673 };
674
675 static int
676 dissect_cms_CertificateChoices(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
677   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
678                                  CertificateChoices_choice, hf_index, ett_cms_CertificateChoices,
679                                  NULL);
680
681   return offset;
682 }
683 static int dissect_CertificateSet_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
684   return dissect_cms_CertificateChoices(FALSE, tvb, offset, pinfo, tree, hf_cms_CertificateSet_item);
685 }
686
687
688 static const ber_sequence_t CertificateSet_set_of[1] = {
689   { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_CertificateSet_item },
690 };
691
692 static int
693 dissect_cms_CertificateSet(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
694   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
695                                  CertificateSet_set_of, hf_index, ett_cms_CertificateSet);
696
697   return offset;
698 }
699 static int dissect_certificates_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
700   return dissect_cms_CertificateSet(TRUE, tvb, offset, pinfo, tree, hf_cms_certificates);
701 }
702 static int dissect_certs_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
703   return dissect_cms_CertificateSet(TRUE, tvb, offset, pinfo, tree, hf_cms_certs);
704 }
705
706
707 static const ber_sequence_t CertificateRevocationLists_set_of[1] = {
708   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_CertificateRevocationLists_item },
709 };
710
711 static int
712 dissect_cms_CertificateRevocationLists(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
713   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
714                                  CertificateRevocationLists_set_of, hf_index, ett_cms_CertificateRevocationLists);
715
716   return offset;
717 }
718 static int dissect_crls_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
719   return dissect_cms_CertificateRevocationLists(TRUE, tvb, offset, pinfo, tree, hf_cms_crls);
720 }
721
722
723 static const ber_sequence_t IssuerAndSerialNumber_sequence[] = {
724   { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_issuer },
725   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_serialNumber },
726   { 0, 0, 0, NULL }
727 };
728
729 int
730 dissect_cms_IssuerAndSerialNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
731   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
732                                    IssuerAndSerialNumber_sequence, hf_index, ett_cms_IssuerAndSerialNumber);
733
734   return offset;
735 }
736 static int dissect_issuerAndSerialNumber(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
737   return dissect_cms_IssuerAndSerialNumber(FALSE, tvb, offset, pinfo, tree, hf_cms_issuerAndSerialNumber);
738 }
739 static int dissect_issuerAndSerialNumber_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
740   return dissect_cms_IssuerAndSerialNumber(TRUE, tvb, offset, pinfo, tree, hf_cms_issuerAndSerialNumber);
741 }
742
743
744
745 static int
746 dissect_cms_SubjectKeyIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
747   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
748                                        NULL);
749
750   return offset;
751 }
752 static int dissect_subjectKeyIdentifier(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
753   return dissect_cms_SubjectKeyIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_subjectKeyIdentifier);
754 }
755 static int dissect_subjectKeyIdentifier_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
756   return dissect_cms_SubjectKeyIdentifier(TRUE, tvb, offset, pinfo, tree, hf_cms_subjectKeyIdentifier);
757 }
758 static int dissect_subjectAltKeyIdentifier_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
759   return dissect_cms_SubjectKeyIdentifier(TRUE, tvb, offset, pinfo, tree, hf_cms_subjectAltKeyIdentifier);
760 }
761
762
763 const value_string cms_SignerIdentifier_vals[] = {
764   {   0, "issuerAndSerialNumber" },
765   {   1, "subjectKeyIdentifier" },
766   { 0, NULL }
767 };
768
769 static const ber_choice_t SignerIdentifier_choice[] = {
770   {   0, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_issuerAndSerialNumber },
771   {   1, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_subjectKeyIdentifier_impl },
772   { 0, 0, 0, 0, NULL }
773 };
774
775 int
776 dissect_cms_SignerIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
777   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
778                                  SignerIdentifier_choice, hf_index, ett_cms_SignerIdentifier,
779                                  NULL);
780
781   return offset;
782 }
783 static int dissect_sid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
784   return dissect_cms_SignerIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_sid);
785 }
786
787
788 static const ber_sequence_t SignedAttributes_set_of[1] = {
789   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_SignedAttributes_item },
790 };
791
792 int
793 dissect_cms_SignedAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
794   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
795                                  SignedAttributes_set_of, hf_index, ett_cms_SignedAttributes);
796
797   return offset;
798 }
799 static int dissect_signedAttrs_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
800   return dissect_cms_SignedAttributes(TRUE, tvb, offset, pinfo, tree, hf_cms_signedAttrs);
801 }
802
803
804
805 int
806 dissect_cms_SignatureValue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
807   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
808                                        NULL);
809
810   return offset;
811 }
812 static int dissect_signatureValue(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
813   return dissect_cms_SignatureValue(FALSE, tvb, offset, pinfo, tree, hf_cms_signatureValue);
814 }
815
816
817 static const ber_sequence_t UnsignedAttributes_set_of[1] = {
818   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_UnsignedAttributes_item },
819 };
820
821 int
822 dissect_cms_UnsignedAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
823   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
824                                  UnsignedAttributes_set_of, hf_index, ett_cms_UnsignedAttributes);
825
826   return offset;
827 }
828 static int dissect_unsignedAttrs_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
829   return dissect_cms_UnsignedAttributes(TRUE, tvb, offset, pinfo, tree, hf_cms_unsignedAttrs);
830 }
831
832
833 static const ber_sequence_t SignerInfo_sequence[] = {
834   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
835   { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_sid },
836   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_digestAlgorithm },
837   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_signedAttrs_impl },
838   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_signatureAlgorithm },
839   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_signatureValue },
840   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_unsignedAttrs_impl },
841   { 0, 0, 0, NULL }
842 };
843
844 int
845 dissect_cms_SignerInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
846   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
847                                    SignerInfo_sequence, hf_index, ett_cms_SignerInfo);
848
849   return offset;
850 }
851 static int dissect_SignerInfos_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
852   return dissect_cms_SignerInfo(FALSE, tvb, offset, pinfo, tree, hf_cms_SignerInfos_item);
853 }
854
855
856 static const ber_sequence_t SignerInfos_set_of[1] = {
857   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_SignerInfos_item },
858 };
859
860 int
861 dissect_cms_SignerInfos(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
862   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
863                                  SignerInfos_set_of, hf_index, ett_cms_SignerInfos);
864
865   return offset;
866 }
867 static int dissect_signerInfos(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
868   return dissect_cms_SignerInfos(FALSE, tvb, offset, pinfo, tree, hf_cms_signerInfos);
869 }
870
871
872 static const ber_sequence_t SignedData_sequence[] = {
873   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
874   { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_digestAlgorithms },
875   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_encapContentInfo },
876   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_certificates_impl },
877   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_crls_impl },
878   { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_signerInfos },
879   { 0, 0, 0, NULL }
880 };
881
882 int
883 dissect_cms_SignedData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
884   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
885                                    SignedData_sequence, hf_index, ett_cms_SignedData);
886
887   return offset;
888 }
889
890
891 static const ber_sequence_t OriginatorInfo_sequence[] = {
892   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_certs_impl },
893   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_crls_impl },
894   { 0, 0, 0, NULL }
895 };
896
897 static int
898 dissect_cms_OriginatorInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
899   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
900                                    OriginatorInfo_sequence, hf_index, ett_cms_OriginatorInfo);
901
902   return offset;
903 }
904 static int dissect_originatorInfo_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
905   return dissect_cms_OriginatorInfo(TRUE, tvb, offset, pinfo, tree, hf_cms_originatorInfo);
906 }
907
908
909 static const value_string cms_RecipientIdentifier_vals[] = {
910   {   0, "issuerAndSerialNumber" },
911   {   1, "subjectKeyIdentifier" },
912   { 0, NULL }
913 };
914
915 static const ber_choice_t RecipientIdentifier_choice[] = {
916   {   0, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_issuerAndSerialNumber },
917   {   1, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_subjectKeyIdentifier_impl },
918   { 0, 0, 0, 0, NULL }
919 };
920
921 static int
922 dissect_cms_RecipientIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
923   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
924                                  RecipientIdentifier_choice, hf_index, ett_cms_RecipientIdentifier,
925                                  NULL);
926
927   return offset;
928 }
929 static int dissect_rid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
930   return dissect_cms_RecipientIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_rid);
931 }
932
933
934
935 static int
936 dissect_cms_KeyEncryptionAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
937   offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
938
939   return offset;
940 }
941 static int dissect_keyEncryptionAlgorithm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
942   return dissect_cms_KeyEncryptionAlgorithmIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_keyEncryptionAlgorithm);
943 }
944
945
946
947 static int
948 dissect_cms_EncryptedKey(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
949   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
950                                        NULL);
951
952   return offset;
953 }
954 static int dissect_encryptedKey(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
955   return dissect_cms_EncryptedKey(FALSE, tvb, offset, pinfo, tree, hf_cms_encryptedKey);
956 }
957
958
959 static const ber_sequence_t KeyTransRecipientInfo_sequence[] = {
960   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
961   { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_rid },
962   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_keyEncryptionAlgorithm },
963   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_encryptedKey },
964   { 0, 0, 0, NULL }
965 };
966
967 static int
968 dissect_cms_KeyTransRecipientInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
969   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
970                                    KeyTransRecipientInfo_sequence, hf_index, ett_cms_KeyTransRecipientInfo);
971
972   return offset;
973 }
974 static int dissect_ktri(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
975   return dissect_cms_KeyTransRecipientInfo(FALSE, tvb, offset, pinfo, tree, hf_cms_ktri);
976 }
977
978
979
980 static int
981 dissect_cms_BIT_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
982   offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
983                                     NULL, hf_index, -1,
984                                     NULL);
985
986   return offset;
987 }
988 static int dissect_publicKey(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
989   return dissect_cms_BIT_STRING(FALSE, tvb, offset, pinfo, tree, hf_cms_publicKey);
990 }
991
992
993 static const ber_sequence_t OriginatorPublicKey_sequence[] = {
994   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_algorithm },
995   { BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_publicKey },
996   { 0, 0, 0, NULL }
997 };
998
999 static int
1000 dissect_cms_OriginatorPublicKey(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1001   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1002                                    OriginatorPublicKey_sequence, hf_index, ett_cms_OriginatorPublicKey);
1003
1004   return offset;
1005 }
1006 static int dissect_originatorKey_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1007   return dissect_cms_OriginatorPublicKey(TRUE, tvb, offset, pinfo, tree, hf_cms_originatorKey);
1008 }
1009
1010
1011 static const value_string cms_OriginatorIdentifierOrKey_vals[] = {
1012   {   0, "issuerAndSerialNumber" },
1013   {   1, "subjectKeyIdentifier" },
1014   {   2, "originatorKey" },
1015   { 0, NULL }
1016 };
1017
1018 static const ber_choice_t OriginatorIdentifierOrKey_choice[] = {
1019   {   0, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_issuerAndSerialNumber },
1020   {   1, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_subjectKeyIdentifier_impl },
1021   {   2, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_originatorKey_impl },
1022   { 0, 0, 0, 0, NULL }
1023 };
1024
1025 static int
1026 dissect_cms_OriginatorIdentifierOrKey(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1027   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1028                                  OriginatorIdentifierOrKey_choice, hf_index, ett_cms_OriginatorIdentifierOrKey,
1029                                  NULL);
1030
1031   return offset;
1032 }
1033 static int dissect_originator(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1034   return dissect_cms_OriginatorIdentifierOrKey(FALSE, tvb, offset, pinfo, tree, hf_cms_originator);
1035 }
1036
1037
1038
1039 static int
1040 dissect_cms_UserKeyingMaterial(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1041   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1042                                        NULL);
1043
1044   return offset;
1045 }
1046 static int dissect_ukm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1047   return dissect_cms_UserKeyingMaterial(FALSE, tvb, offset, pinfo, tree, hf_cms_ukm);
1048 }
1049
1050
1051
1052 static int
1053 dissect_cms_GeneralizedTime(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1054   offset = dissect_ber_GeneralizedTime(implicit_tag, pinfo, tree, tvb, offset, hf_index);
1055
1056   return offset;
1057 }
1058 static int dissect_date(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1059   return dissect_cms_GeneralizedTime(FALSE, tvb, offset, pinfo, tree, hf_cms_date);
1060 }
1061 static int dissect_generalTime(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1062   return dissect_cms_GeneralizedTime(FALSE, tvb, offset, pinfo, tree, hf_cms_generalTime);
1063 }
1064
1065
1066
1067 static int
1068 dissect_cms_T_keyAttrId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1069   offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_cms_ci_contentType, &object_identifier_id);
1070
1071   return offset;
1072 }
1073 static int dissect_keyAttrId(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1074   return dissect_cms_T_keyAttrId(FALSE, tvb, offset, pinfo, tree, hf_cms_keyAttrId);
1075 }
1076
1077
1078
1079 static int
1080 dissect_cms_T_keyAttr(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1081 #line 104 "cms.cnf"
1082   offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, tree);
1083
1084
1085
1086
1087   return offset;
1088 }
1089 static int dissect_keyAttr(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1090   return dissect_cms_T_keyAttr(FALSE, tvb, offset, pinfo, tree, hf_cms_keyAttr);
1091 }
1092
1093
1094 static const ber_sequence_t OtherKeyAttribute_sequence[] = {
1095   { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_keyAttrId },
1096   { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_keyAttr },
1097   { 0, 0, 0, NULL }
1098 };
1099
1100 static int
1101 dissect_cms_OtherKeyAttribute(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1102   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1103                                    OtherKeyAttribute_sequence, hf_index, ett_cms_OtherKeyAttribute);
1104
1105   return offset;
1106 }
1107 static int dissect_other(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1108   return dissect_cms_OtherKeyAttribute(FALSE, tvb, offset, pinfo, tree, hf_cms_other);
1109 }
1110
1111
1112 static const ber_sequence_t RecipientKeyIdentifier_sequence[] = {
1113   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_subjectKeyIdentifier },
1114   { BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_date },
1115   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_other },
1116   { 0, 0, 0, NULL }
1117 };
1118
1119 static int
1120 dissect_cms_RecipientKeyIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1121   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1122                                    RecipientKeyIdentifier_sequence, hf_index, ett_cms_RecipientKeyIdentifier);
1123
1124   return offset;
1125 }
1126 static int dissect_rKeyId_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1127   return dissect_cms_RecipientKeyIdentifier(TRUE, tvb, offset, pinfo, tree, hf_cms_rKeyId);
1128 }
1129 static int dissect_recipientKeyId_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1130   return dissect_cms_RecipientKeyIdentifier(TRUE, tvb, offset, pinfo, tree, hf_cms_recipientKeyId);
1131 }
1132
1133
1134 static const value_string cms_KeyAgreeRecipientIdentifier_vals[] = {
1135   {   0, "issuerAndSerialNumber" },
1136   {   1, "rKeyId" },
1137   { 0, NULL }
1138 };
1139
1140 static const ber_choice_t KeyAgreeRecipientIdentifier_choice[] = {
1141   {   0, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_issuerAndSerialNumber },
1142   {   1, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_rKeyId_impl },
1143   { 0, 0, 0, 0, NULL }
1144 };
1145
1146 static int
1147 dissect_cms_KeyAgreeRecipientIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1148   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1149                                  KeyAgreeRecipientIdentifier_choice, hf_index, ett_cms_KeyAgreeRecipientIdentifier,
1150                                  NULL);
1151
1152   return offset;
1153 }
1154 static int dissect_rekRid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1155   return dissect_cms_KeyAgreeRecipientIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_rekRid);
1156 }
1157
1158
1159 static const ber_sequence_t RecipientEncryptedKey_sequence[] = {
1160   { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_rekRid },
1161   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_encryptedKey },
1162   { 0, 0, 0, NULL }
1163 };
1164
1165 static int
1166 dissect_cms_RecipientEncryptedKey(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1167   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1168                                    RecipientEncryptedKey_sequence, hf_index, ett_cms_RecipientEncryptedKey);
1169
1170   return offset;
1171 }
1172 static int dissect_RecipientEncryptedKeys_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1173   return dissect_cms_RecipientEncryptedKey(FALSE, tvb, offset, pinfo, tree, hf_cms_RecipientEncryptedKeys_item);
1174 }
1175
1176
1177 static const ber_sequence_t RecipientEncryptedKeys_sequence_of[1] = {
1178   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_RecipientEncryptedKeys_item },
1179 };
1180
1181 static int
1182 dissect_cms_RecipientEncryptedKeys(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1183   offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
1184                                       RecipientEncryptedKeys_sequence_of, hf_index, ett_cms_RecipientEncryptedKeys);
1185
1186   return offset;
1187 }
1188 static int dissect_recipientEncryptedKeys(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1189   return dissect_cms_RecipientEncryptedKeys(FALSE, tvb, offset, pinfo, tree, hf_cms_recipientEncryptedKeys);
1190 }
1191
1192
1193 static const ber_sequence_t KeyAgreeRecipientInfo_sequence[] = {
1194   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
1195   { BER_CLASS_CON, 0, BER_FLAGS_NOTCHKTAG, dissect_originator },
1196   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_ukm },
1197   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_keyEncryptionAlgorithm },
1198   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_recipientEncryptedKeys },
1199   { 0, 0, 0, NULL }
1200 };
1201
1202 static int
1203 dissect_cms_KeyAgreeRecipientInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1204   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1205                                    KeyAgreeRecipientInfo_sequence, hf_index, ett_cms_KeyAgreeRecipientInfo);
1206
1207   return offset;
1208 }
1209 static int dissect_kari_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1210   return dissect_cms_KeyAgreeRecipientInfo(TRUE, tvb, offset, pinfo, tree, hf_cms_kari);
1211 }
1212
1213
1214
1215 static int
1216 dissect_cms_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1217   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1218                                        NULL);
1219
1220   return offset;
1221 }
1222 static int dissect_keyIdentifier(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1223   return dissect_cms_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_cms_keyIdentifier);
1224 }
1225 static int dissect_iv(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1226   return dissect_cms_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_cms_iv);
1227 }
1228
1229
1230 static const ber_sequence_t KEKIdentifier_sequence[] = {
1231   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_keyIdentifier },
1232   { BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_date },
1233   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_other },
1234   { 0, 0, 0, NULL }
1235 };
1236
1237 static int
1238 dissect_cms_KEKIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1239   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1240                                    KEKIdentifier_sequence, hf_index, ett_cms_KEKIdentifier);
1241
1242   return offset;
1243 }
1244 static int dissect_kekid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1245   return dissect_cms_KEKIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_kekid);
1246 }
1247
1248
1249 static const ber_sequence_t KEKRecipientInfo_sequence[] = {
1250   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
1251   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_kekid },
1252   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_keyEncryptionAlgorithm },
1253   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_encryptedKey },
1254   { 0, 0, 0, NULL }
1255 };
1256
1257 static int
1258 dissect_cms_KEKRecipientInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1259   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1260                                    KEKRecipientInfo_sequence, hf_index, ett_cms_KEKRecipientInfo);
1261
1262   return offset;
1263 }
1264 static int dissect_kekri_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1265   return dissect_cms_KEKRecipientInfo(TRUE, tvb, offset, pinfo, tree, hf_cms_kekri);
1266 }
1267
1268
1269 static const value_string cms_RecipientInfo_vals[] = {
1270   {   0, "ktri" },
1271   {   1, "kari" },
1272   {   2, "kekri" },
1273   { 0, NULL }
1274 };
1275
1276 static const ber_choice_t RecipientInfo_choice[] = {
1277   {   0, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_ktri },
1278   {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_kari_impl },
1279   {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_kekri_impl },
1280   { 0, 0, 0, 0, NULL }
1281 };
1282
1283 static int
1284 dissect_cms_RecipientInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1285   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1286                                  RecipientInfo_choice, hf_index, ett_cms_RecipientInfo,
1287                                  NULL);
1288
1289   return offset;
1290 }
1291 static int dissect_RecipientInfos_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1292   return dissect_cms_RecipientInfo(FALSE, tvb, offset, pinfo, tree, hf_cms_RecipientInfos_item);
1293 }
1294
1295
1296 static const ber_sequence_t RecipientInfos_set_of[1] = {
1297   { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_RecipientInfos_item },
1298 };
1299
1300 static int
1301 dissect_cms_RecipientInfos(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1302   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
1303                                  RecipientInfos_set_of, hf_index, ett_cms_RecipientInfos);
1304
1305   return offset;
1306 }
1307 static int dissect_recipientInfos(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1308   return dissect_cms_RecipientInfos(FALSE, tvb, offset, pinfo, tree, hf_cms_recipientInfos);
1309 }
1310
1311
1312
1313 static int
1314 dissect_cms_ContentEncryptionAlgorithmIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1315   offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1316
1317   return offset;
1318 }
1319 static int dissect_contentEncryptionAlgorithm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1320   return dissect_cms_ContentEncryptionAlgorithmIdentifier(FALSE, tvb, offset, pinfo, tree, hf_cms_contentEncryptionAlgorithm);
1321 }
1322
1323
1324
1325 static int
1326 dissect_cms_EncryptedContent(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1327   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1328                                        NULL);
1329
1330   return offset;
1331 }
1332 static int dissect_encryptedContent_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1333   return dissect_cms_EncryptedContent(TRUE, tvb, offset, pinfo, tree, hf_cms_encryptedContent);
1334 }
1335
1336
1337 static const ber_sequence_t EncryptedContentInfo_sequence[] = {
1338   { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_encryptedContentType },
1339   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_contentEncryptionAlgorithm },
1340   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_encryptedContent_impl },
1341   { 0, 0, 0, NULL }
1342 };
1343
1344 static int
1345 dissect_cms_EncryptedContentInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1346   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1347                                    EncryptedContentInfo_sequence, hf_index, ett_cms_EncryptedContentInfo);
1348
1349   return offset;
1350 }
1351 static int dissect_encryptedContentInfo(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1352   return dissect_cms_EncryptedContentInfo(FALSE, tvb, offset, pinfo, tree, hf_cms_encryptedContentInfo);
1353 }
1354
1355
1356 static const ber_sequence_t UnprotectedAttributes_set_of[1] = {
1357   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_UnprotectedAttributes_item },
1358 };
1359
1360 static int
1361 dissect_cms_UnprotectedAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1362   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
1363                                  UnprotectedAttributes_set_of, hf_index, ett_cms_UnprotectedAttributes);
1364
1365   return offset;
1366 }
1367 static int dissect_unprotectedAttrs_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1368   return dissect_cms_UnprotectedAttributes(TRUE, tvb, offset, pinfo, tree, hf_cms_unprotectedAttrs);
1369 }
1370
1371
1372 static const ber_sequence_t EnvelopedData_sequence[] = {
1373   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
1374   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_originatorInfo_impl },
1375   { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_recipientInfos },
1376   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_encryptedContentInfo },
1377   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_unprotectedAttrs_impl },
1378   { 0, 0, 0, NULL }
1379 };
1380
1381 int
1382 dissect_cms_EnvelopedData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1383   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1384                                    EnvelopedData_sequence, hf_index, ett_cms_EnvelopedData);
1385
1386   return offset;
1387 }
1388
1389
1390
1391 int
1392 dissect_cms_Digest(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1393   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1394                                        NULL);
1395
1396   return offset;
1397 }
1398 static int dissect_digest(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1399   return dissect_cms_Digest(FALSE, tvb, offset, pinfo, tree, hf_cms_digest);
1400 }
1401
1402
1403 static const ber_sequence_t DigestedData_sequence[] = {
1404   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
1405   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_digestAlgorithm },
1406   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_encapContentInfo },
1407   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_digest },
1408   { 0, 0, 0, NULL }
1409 };
1410
1411 static int
1412 dissect_cms_DigestedData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1413   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1414                                    DigestedData_sequence, hf_index, ett_cms_DigestedData);
1415
1416   return offset;
1417 }
1418
1419
1420 static const ber_sequence_t EncryptedData_sequence[] = {
1421   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
1422   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_encryptedContentInfo },
1423   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_unprotectedAttrs_impl },
1424   { 0, 0, 0, NULL }
1425 };
1426
1427 static int
1428 dissect_cms_EncryptedData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1429   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1430                                    EncryptedData_sequence, hf_index, ett_cms_EncryptedData);
1431
1432   return offset;
1433 }
1434
1435
1436
1437 static int
1438 dissect_cms_MessageAuthenticationCodeAlgorithm(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1439   offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1440
1441   return offset;
1442 }
1443 static int dissect_macAlgorithm(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1444   return dissect_cms_MessageAuthenticationCodeAlgorithm(FALSE, tvb, offset, pinfo, tree, hf_cms_macAlgorithm);
1445 }
1446
1447
1448 static const ber_sequence_t AuthAttributes_set_of[1] = {
1449   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_AuthAttributes_item },
1450 };
1451
1452 static int
1453 dissect_cms_AuthAttributes(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1454   offset = dissect_ber_set_of(implicit_tag, pinfo, tree, tvb, offset,
1455                                  AuthAttributes_set_of, hf_index, ett_cms_AuthAttributes);
1456
1457   return offset;
1458 }
1459 static int dissect_authenticatedAttributes_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1460   return dissect_cms_AuthAttributes(TRUE, tvb, offset, pinfo, tree, hf_cms_authenticatedAttributes);
1461 }
1462
1463
1464
1465 static int
1466 dissect_cms_MessageAuthenticationCode(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1467   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1468                                        NULL);
1469
1470   return offset;
1471 }
1472 static int dissect_mac(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1473   return dissect_cms_MessageAuthenticationCode(FALSE, tvb, offset, pinfo, tree, hf_cms_mac);
1474 }
1475
1476
1477 static const ber_sequence_t AuthenticatedData_sequence[] = {
1478   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_version },
1479   { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_originatorInfo_impl },
1480   { BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_recipientInfos },
1481   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_macAlgorithm },
1482   { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_digestAlgorithm_impl },
1483   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_encapContentInfo },
1484   { BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_authenticatedAttributes_impl },
1485   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_mac },
1486   { BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_unauthenticatedAttributes_impl },
1487   { 0, 0, 0, NULL }
1488 };
1489
1490 static int
1491 dissect_cms_AuthenticatedData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1492   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1493                                    AuthenticatedData_sequence, hf_index, ett_cms_AuthenticatedData);
1494
1495   return offset;
1496 }
1497
1498
1499
1500 static int
1501 dissect_cms_MessageDigest(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1502 #line 125 "cms.cnf"
1503   proto_item *pi;
1504   int old_offset = offset;
1505
1506     offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1507                                        NULL);
1508
1509  
1510   pi = get_ber_last_created_item();
1511
1512   /* move past TLV */
1513   old_offset = get_ber_identifier(tvb, old_offset, NULL, NULL, NULL);
1514   old_offset = get_ber_length(tree, tvb, old_offset, NULL, NULL);
1515
1516   if(content_tvb) 
1517     cms_verify_msg_digest(pi, content_tvb, x509af_get_last_algorithm_id(), tvb, old_offset);
1518
1519
1520
1521   return offset;
1522 }
1523
1524
1525
1526 static int
1527 dissect_cms_UTCTime(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1528   offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_UTCTime,
1529                                             pinfo, tree, tvb, offset, hf_index,
1530                                             NULL);
1531
1532   return offset;
1533 }
1534 static int dissect_utcTime(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1535   return dissect_cms_UTCTime(FALSE, tvb, offset, pinfo, tree, hf_cms_utcTime);
1536 }
1537
1538
1539 static const value_string cms_Time_vals[] = {
1540   {   0, "utcTime" },
1541   {   1, "generalTime" },
1542   { 0, NULL }
1543 };
1544
1545 static const ber_choice_t Time_choice[] = {
1546   {   0, BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_utcTime },
1547   {   1, BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_NOOWNTAG, dissect_generalTime },
1548   { 0, 0, 0, 0, NULL }
1549 };
1550
1551 static int
1552 dissect_cms_Time(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1553   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1554                                  Time_choice, hf_index, ett_cms_Time,
1555                                  NULL);
1556
1557   return offset;
1558 }
1559
1560
1561
1562 static int
1563 dissect_cms_SigningTime(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1564   offset = dissect_cms_Time(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1565
1566   return offset;
1567 }
1568
1569
1570
1571 int
1572 dissect_cms_Countersignature(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1573   offset = dissect_cms_SignerInfo(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1574
1575   return offset;
1576 }
1577
1578
1579
1580 static int
1581 dissect_cms_KeyWrapAlgorithm(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1582   offset = dissect_x509af_AlgorithmIdentifier(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1583
1584   return offset;
1585 }
1586
1587
1588
1589 static int
1590 dissect_cms_RC2ParameterVersion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1591 #line 162 "cms.cnf"
1592   guint32 length = 0;
1593
1594     offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1595                                   &length);
1596
1597
1598   if(cap_tree != NULL) 
1599     proto_item_append_text(cap_tree, " (%d bits)", length); 
1600
1601
1602
1603   return offset;
1604 }
1605
1606
1607
1608 static int
1609 dissect_cms_RC2WrapParameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1610   offset = dissect_cms_RC2ParameterVersion(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1611
1612   return offset;
1613 }
1614 static int dissect_rc2WrapParameter(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1615   return dissect_cms_RC2WrapParameter(FALSE, tvb, offset, pinfo, tree, hf_cms_rc2WrapParameter);
1616 }
1617
1618
1619
1620 static int
1621 dissect_cms_IV(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1622   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1623                                        NULL);
1624
1625   return offset;
1626 }
1627
1628
1629
1630 static int
1631 dissect_cms_CBCParameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1632   offset = dissect_cms_IV(implicit_tag, tvb, offset, pinfo, tree, hf_index);
1633
1634   return offset;
1635 }
1636
1637
1638
1639 static int
1640 dissect_cms_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1641   offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
1642                                   NULL);
1643
1644   return offset;
1645 }
1646 static int dissect_rc2ParameterVersion(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1647   return dissect_cms_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_cms_rc2ParameterVersion);
1648 }
1649
1650
1651 static const ber_sequence_t RC2CBCParameter_sequence[] = {
1652   { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_rc2ParameterVersion },
1653   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_iv },
1654   { 0, 0, 0, NULL }
1655 };
1656
1657 static int
1658 dissect_cms_RC2CBCParameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1659   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1660                                    RC2CBCParameter_sequence, hf_index, ett_cms_RC2CBCParameter);
1661
1662   return offset;
1663 }
1664 static int dissect_rc2CBCParameter(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1665   return dissect_cms_RC2CBCParameter(FALSE, tvb, offset, pinfo, tree, hf_cms_rc2CBCParameter);
1666 }
1667
1668
1669
1670 static int
1671 dissect_cms_T_capability(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1672 #line 143 "cms.cnf"
1673   const char *name = NULL;
1674
1675     offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_cms_attrType, &object_identifier_id);
1676
1677
1678   if(object_identifier_id) {
1679     name = get_oid_str_name(object_identifier_id);
1680     proto_item_append_text(tree, " %s", name ? name : object_identifier_id); 
1681     cap_tree = tree;
1682   }
1683
1684
1685
1686   return offset;
1687 }
1688 static int dissect_capability(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1689   return dissect_cms_T_capability(FALSE, tvb, offset, pinfo, tree, hf_cms_capability);
1690 }
1691
1692
1693
1694 static int
1695 dissect_cms_T_parameters(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1696 #line 154 "cms.cnf"
1697
1698   offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, tree);
1699
1700
1701
1702
1703   return offset;
1704 }
1705 static int dissect_parameters(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1706   return dissect_cms_T_parameters(FALSE, tvb, offset, pinfo, tree, hf_cms_parameters);
1707 }
1708
1709
1710 static const ber_sequence_t SMIMECapability_sequence[] = {
1711   { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_capability },
1712   { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_parameters },
1713   { 0, 0, 0, NULL }
1714 };
1715
1716 static int
1717 dissect_cms_SMIMECapability(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1718   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
1719                                    SMIMECapability_sequence, hf_index, ett_cms_SMIMECapability);
1720
1721   return offset;
1722 }
1723 static int dissect_SMIMECapabilities_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
1724   return dissect_cms_SMIMECapability(FALSE, tvb, offset, pinfo, tree, hf_cms_SMIMECapabilities_item);
1725 }
1726
1727
1728 static const ber_sequence_t SMIMECapabilities_sequence_of[1] = {
1729   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_SMIMECapabilities_item },
1730 };
1731
1732 static int
1733 dissect_cms_SMIMECapabilities(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1734   offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
1735                                       SMIMECapabilities_sequence_of, hf_index, ett_cms_SMIMECapabilities);
1736
1737   return offset;
1738 }
1739
1740
1741 static const value_string cms_SMIMEEncryptionKeyPreference_vals[] = {
1742   {   0, "issuerAndSerialNumber" },
1743   {   1, "recipientKeyId" },
1744   {   2, "subjectAltKeyIdentifier" },
1745   { 0, NULL }
1746 };
1747
1748 static const ber_choice_t SMIMEEncryptionKeyPreference_choice[] = {
1749   {   0, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_issuerAndSerialNumber_impl },
1750   {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_recipientKeyId_impl },
1751   {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_subjectAltKeyIdentifier_impl },
1752   { 0, 0, 0, 0, NULL }
1753 };
1754
1755 static int
1756 dissect_cms_SMIMEEncryptionKeyPreference(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1757   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1758                                  SMIMEEncryptionKeyPreference_choice, hf_index, ett_cms_SMIMEEncryptionKeyPreference,
1759                                  NULL);
1760
1761   return offset;
1762 }
1763
1764
1765 static const value_string cms_RC2CBCParameters_vals[] = {
1766   {   0, "rc2WrapParameter" },
1767   {   1, "rc2CBCParameter" },
1768   { 0, NULL }
1769 };
1770
1771 static const ber_choice_t RC2CBCParameters_choice[] = {
1772   {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_rc2WrapParameter },
1773   {   1, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_rc2CBCParameter },
1774   { 0, 0, 0, 0, NULL }
1775 };
1776
1777 static int
1778 dissect_cms_RC2CBCParameters(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
1779   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
1780                                  RC2CBCParameters_choice, hf_index, ett_cms_RC2CBCParameters,
1781                                  NULL);
1782
1783   return offset;
1784 }
1785
1786 /*--- PDUs ---*/
1787
1788 static void dissect_ContentInfo_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1789   dissect_cms_ContentInfo(FALSE, tvb, 0, pinfo, tree, hf_cms_ContentInfo_PDU);
1790 }
1791 static void dissect_ContentType_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1792   dissect_cms_ContentType(FALSE, tvb, 0, pinfo, tree, hf_cms_ContentType_PDU);
1793 }
1794 static void dissect_SignedData_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1795   dissect_cms_SignedData(FALSE, tvb, 0, pinfo, tree, hf_cms_SignedData_PDU);
1796 }
1797 static void dissect_EnvelopedData_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1798   dissect_cms_EnvelopedData(FALSE, tvb, 0, pinfo, tree, hf_cms_EnvelopedData_PDU);
1799 }
1800 static void dissect_DigestedData_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1801   dissect_cms_DigestedData(FALSE, tvb, 0, pinfo, tree, hf_cms_DigestedData_PDU);
1802 }
1803 static void dissect_EncryptedData_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1804   dissect_cms_EncryptedData(FALSE, tvb, 0, pinfo, tree, hf_cms_EncryptedData_PDU);
1805 }
1806 static void dissect_AuthenticatedData_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1807   dissect_cms_AuthenticatedData(FALSE, tvb, 0, pinfo, tree, hf_cms_AuthenticatedData_PDU);
1808 }
1809 static void dissect_IssuerAndSerialNumber_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1810   dissect_cms_IssuerAndSerialNumber(FALSE, tvb, 0, pinfo, tree, hf_cms_IssuerAndSerialNumber_PDU);
1811 }
1812 static void dissect_MessageDigest_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1813   dissect_cms_MessageDigest(FALSE, tvb, 0, pinfo, tree, hf_cms_MessageDigest_PDU);
1814 }
1815 static void dissect_SigningTime_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1816   dissect_cms_SigningTime(FALSE, tvb, 0, pinfo, tree, hf_cms_SigningTime_PDU);
1817 }
1818 static void dissect_Countersignature_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1819   dissect_cms_Countersignature(FALSE, tvb, 0, pinfo, tree, hf_cms_Countersignature_PDU);
1820 }
1821 static void dissect_RC2WrapParameter_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1822   dissect_cms_RC2WrapParameter(FALSE, tvb, 0, pinfo, tree, hf_cms_RC2WrapParameter_PDU);
1823 }
1824 static void dissect_SMIMECapabilities_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1825   dissect_cms_SMIMECapabilities(FALSE, tvb, 0, pinfo, tree, hf_cms_SMIMECapabilities_PDU);
1826 }
1827 static void dissect_SMIMEEncryptionKeyPreference_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1828   dissect_cms_SMIMEEncryptionKeyPreference(FALSE, tvb, 0, pinfo, tree, hf_cms_SMIMEEncryptionKeyPreference_PDU);
1829 }
1830 static void dissect_RC2CBCParameters_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_) {
1831   dissect_cms_RC2CBCParameters(FALSE, tvb, 0, pinfo, tree, hf_cms_RC2CBCParameters_PDU);
1832 }
1833
1834
1835 /*--- End of included file: packet-cms-fn.c ---*/
1836 #line 135 "packet-cms-template.c"
1837
1838 /*--- proto_register_cms ----------------------------------------------*/
1839 void proto_register_cms(void) {
1840
1841   /* List of fields */
1842   static hf_register_info hf[] = {
1843     { &hf_cms_ci_contentType,
1844       { "contentType", "cms.contentInfo.contentType",
1845         FT_OID, BASE_NONE, NULL, 0,
1846         "ContentType", HFILL }},
1847
1848 /*--- Included file: packet-cms-hfarr.c ---*/
1849 #line 1 "packet-cms-hfarr.c"
1850     { &hf_cms_ContentInfo_PDU,
1851       { "ContentInfo", "cms.ContentInfo",
1852         FT_NONE, BASE_NONE, NULL, 0,
1853         "cms.ContentInfo", HFILL }},
1854     { &hf_cms_ContentType_PDU,
1855       { "ContentType", "cms.ContentType",
1856         FT_OID, BASE_NONE, NULL, 0,
1857         "cms.ContentType", HFILL }},
1858     { &hf_cms_SignedData_PDU,
1859       { "SignedData", "cms.SignedData",
1860         FT_NONE, BASE_NONE, NULL, 0,
1861         "cms.SignedData", HFILL }},
1862     { &hf_cms_EnvelopedData_PDU,
1863       { "EnvelopedData", "cms.EnvelopedData",
1864         FT_NONE, BASE_NONE, NULL, 0,
1865         "cms.EnvelopedData", HFILL }},
1866     { &hf_cms_DigestedData_PDU,
1867       { "DigestedData", "cms.DigestedData",
1868         FT_NONE, BASE_NONE, NULL, 0,
1869         "cms.DigestedData", HFILL }},
1870     { &hf_cms_EncryptedData_PDU,
1871       { "EncryptedData", "cms.EncryptedData",
1872         FT_NONE, BASE_NONE, NULL, 0,
1873         "cms.EncryptedData", HFILL }},
1874     { &hf_cms_AuthenticatedData_PDU,
1875       { "AuthenticatedData", "cms.AuthenticatedData",
1876         FT_NONE, BASE_NONE, NULL, 0,
1877         "cms.AuthenticatedData", HFILL }},
1878     { &hf_cms_IssuerAndSerialNumber_PDU,
1879       { "IssuerAndSerialNumber", "cms.IssuerAndSerialNumber",
1880         FT_NONE, BASE_NONE, NULL, 0,
1881         "cms.IssuerAndSerialNumber", HFILL }},
1882     { &hf_cms_MessageDigest_PDU,
1883       { "MessageDigest", "cms.MessageDigest",
1884         FT_BYTES, BASE_HEX, NULL, 0,
1885         "cms.MessageDigest", HFILL }},
1886     { &hf_cms_SigningTime_PDU,
1887       { "SigningTime", "cms.SigningTime",
1888         FT_UINT32, BASE_DEC, VALS(x509af_Time_vals), 0,
1889         "cms.SigningTime", HFILL }},
1890     { &hf_cms_Countersignature_PDU,
1891       { "Countersignature", "cms.Countersignature",
1892         FT_NONE, BASE_NONE, NULL, 0,
1893         "cms.Countersignature", HFILL }},
1894     { &hf_cms_RC2WrapParameter_PDU,
1895       { "RC2WrapParameter", "cms.RC2WrapParameter",
1896         FT_INT32, BASE_DEC, NULL, 0,
1897         "cms.RC2WrapParameter", HFILL }},
1898     { &hf_cms_SMIMECapabilities_PDU,
1899       { "SMIMECapabilities", "cms.SMIMECapabilities",
1900         FT_UINT32, BASE_DEC, NULL, 0,
1901         "cms.SMIMECapabilities", HFILL }},
1902     { &hf_cms_SMIMEEncryptionKeyPreference_PDU,
1903       { "SMIMEEncryptionKeyPreference", "cms.SMIMEEncryptionKeyPreference",
1904         FT_UINT32, BASE_DEC, VALS(cms_SMIMEEncryptionKeyPreference_vals), 0,
1905         "cms.SMIMEEncryptionKeyPreference", HFILL }},
1906     { &hf_cms_RC2CBCParameters_PDU,
1907       { "RC2CBCParameters", "cms.RC2CBCParameters",
1908         FT_UINT32, BASE_DEC, VALS(cms_RC2CBCParameters_vals), 0,
1909         "cms.RC2CBCParameters", HFILL }},
1910     { &hf_cms_contentType,
1911       { "contentType", "cms.contentType",
1912         FT_OID, BASE_NONE, NULL, 0,
1913         "cms.ContentType", HFILL }},
1914     { &hf_cms_content,
1915       { "content", "cms.content",
1916         FT_NONE, BASE_NONE, NULL, 0,
1917         "cms.T_content", HFILL }},
1918     { &hf_cms_version,
1919       { "version", "cms.version",
1920         FT_INT32, BASE_DEC, VALS(cms_CMSVersion_vals), 0,
1921         "cms.CMSVersion", HFILL }},
1922     { &hf_cms_digestAlgorithms,
1923       { "digestAlgorithms", "cms.digestAlgorithms",
1924         FT_UINT32, BASE_DEC, NULL, 0,
1925         "cms.DigestAlgorithmIdentifiers", HFILL }},
1926     { &hf_cms_encapContentInfo,
1927       { "encapContentInfo", "cms.encapContentInfo",
1928         FT_NONE, BASE_NONE, NULL, 0,
1929         "cms.EncapsulatedContentInfo", HFILL }},
1930     { &hf_cms_certificates,
1931       { "certificates", "cms.certificates",
1932         FT_UINT32, BASE_DEC, NULL, 0,
1933         "cms.CertificateSet", HFILL }},
1934     { &hf_cms_crls,
1935       { "crls", "cms.crls",
1936         FT_UINT32, BASE_DEC, NULL, 0,
1937         "cms.CertificateRevocationLists", HFILL }},
1938     { &hf_cms_signerInfos,
1939       { "signerInfos", "cms.signerInfos",
1940         FT_UINT32, BASE_DEC, NULL, 0,
1941         "cms.SignerInfos", HFILL }},
1942     { &hf_cms_DigestAlgorithmIdentifiers_item,
1943       { "Item", "cms.DigestAlgorithmIdentifiers_item",
1944         FT_NONE, BASE_NONE, NULL, 0,
1945         "cms.DigestAlgorithmIdentifier", HFILL }},
1946     { &hf_cms_SignerInfos_item,
1947       { "Item", "cms.SignerInfos_item",
1948         FT_NONE, BASE_NONE, NULL, 0,
1949         "cms.SignerInfo", HFILL }},
1950     { &hf_cms_eContentType,
1951       { "eContentType", "cms.eContentType",
1952         FT_OID, BASE_NONE, NULL, 0,
1953         "cms.ContentType", HFILL }},
1954     { &hf_cms_eContent,
1955       { "eContent", "cms.eContent",
1956         FT_BYTES, BASE_HEX, NULL, 0,
1957         "cms.T_eContent", HFILL }},
1958     { &hf_cms_sid,
1959       { "sid", "cms.sid",
1960         FT_UINT32, BASE_DEC, VALS(cms_SignerIdentifier_vals), 0,
1961         "cms.SignerIdentifier", HFILL }},
1962     { &hf_cms_digestAlgorithm,
1963       { "digestAlgorithm", "cms.digestAlgorithm",
1964         FT_NONE, BASE_NONE, NULL, 0,
1965         "cms.DigestAlgorithmIdentifier", HFILL }},
1966     { &hf_cms_signedAttrs,
1967       { "signedAttrs", "cms.signedAttrs",
1968         FT_UINT32, BASE_DEC, NULL, 0,
1969         "cms.SignedAttributes", HFILL }},
1970     { &hf_cms_signatureAlgorithm,
1971       { "signatureAlgorithm", "cms.signatureAlgorithm",
1972         FT_NONE, BASE_NONE, NULL, 0,
1973         "cms.SignatureAlgorithmIdentifier", HFILL }},
1974     { &hf_cms_signatureValue,
1975       { "signature", "cms.signature",
1976         FT_BYTES, BASE_HEX, NULL, 0,
1977         "cms.SignatureValue", HFILL }},
1978     { &hf_cms_unsignedAttrs,
1979       { "unsignedAttrs", "cms.unsignedAttrs",
1980         FT_UINT32, BASE_DEC, NULL, 0,
1981         "cms.UnsignedAttributes", HFILL }},
1982     { &hf_cms_issuerAndSerialNumber,
1983       { "issuerAndSerialNumber", "cms.issuerAndSerialNumber",
1984         FT_NONE, BASE_NONE, NULL, 0,
1985         "cms.IssuerAndSerialNumber", HFILL }},
1986     { &hf_cms_subjectKeyIdentifier,
1987       { "subjectKeyIdentifier", "cms.subjectKeyIdentifier",
1988         FT_BYTES, BASE_HEX, NULL, 0,
1989         "cms.SubjectKeyIdentifier", HFILL }},
1990     { &hf_cms_SignedAttributes_item,
1991       { "Item", "cms.SignedAttributes_item",
1992         FT_NONE, BASE_NONE, NULL, 0,
1993         "cms.Attribute", HFILL }},
1994     { &hf_cms_UnsignedAttributes_item,
1995       { "Item", "cms.UnsignedAttributes_item",
1996         FT_NONE, BASE_NONE, NULL, 0,
1997         "cms.Attribute", HFILL }},
1998     { &hf_cms_attrType,
1999       { "attrType", "cms.attrType",
2000         FT_OID, BASE_NONE, NULL, 0,
2001         "cms.T_attrType", HFILL }},
2002     { &hf_cms_attrValues,
2003       { "attrValues", "cms.attrValues",
2004         FT_UINT32, BASE_DEC, NULL, 0,
2005         "cms.SET_OF_AttributeValue", HFILL }},
2006     { &hf_cms_attrValues_item,
2007       { "Item", "cms.attrValues_item",
2008         FT_NONE, BASE_NONE, NULL, 0,
2009         "cms.AttributeValue", HFILL }},
2010     { &hf_cms_originatorInfo,
2011       { "originatorInfo", "cms.originatorInfo",
2012         FT_NONE, BASE_NONE, NULL, 0,
2013         "cms.OriginatorInfo", HFILL }},
2014     { &hf_cms_recipientInfos,
2015       { "recipientInfos", "cms.recipientInfos",
2016         FT_UINT32, BASE_DEC, NULL, 0,
2017         "cms.RecipientInfos", HFILL }},
2018     { &hf_cms_encryptedContentInfo,
2019       { "encryptedContentInfo", "cms.encryptedContentInfo",
2020         FT_NONE, BASE_NONE, NULL, 0,
2021         "cms.EncryptedContentInfo", HFILL }},
2022     { &hf_cms_unprotectedAttrs,
2023       { "unprotectedAttrs", "cms.unprotectedAttrs",
2024         FT_UINT32, BASE_DEC, NULL, 0,
2025         "cms.UnprotectedAttributes", HFILL }},
2026     { &hf_cms_certs,
2027       { "certs", "cms.certs",
2028         FT_UINT32, BASE_DEC, NULL, 0,
2029         "cms.CertificateSet", HFILL }},
2030     { &hf_cms_RecipientInfos_item,
2031       { "Item", "cms.RecipientInfos_item",
2032         FT_UINT32, BASE_DEC, VALS(cms_RecipientInfo_vals), 0,
2033         "cms.RecipientInfo", HFILL }},
2034     { &hf_cms_encryptedContentType,
2035       { "contentType", "cms.contentType",
2036         FT_OID, BASE_NONE, NULL, 0,
2037         "cms.ContentType", HFILL }},
2038     { &hf_cms_contentEncryptionAlgorithm,
2039       { "contentEncryptionAlgorithm", "cms.contentEncryptionAlgorithm",
2040         FT_NONE, BASE_NONE, NULL, 0,
2041         "cms.ContentEncryptionAlgorithmIdentifier", HFILL }},
2042     { &hf_cms_encryptedContent,
2043       { "encryptedContent", "cms.encryptedContent",
2044         FT_BYTES, BASE_HEX, NULL, 0,
2045         "cms.EncryptedContent", HFILL }},
2046     { &hf_cms_UnprotectedAttributes_item,
2047       { "Item", "cms.UnprotectedAttributes_item",
2048         FT_NONE, BASE_NONE, NULL, 0,
2049         "cms.Attribute", HFILL }},
2050     { &hf_cms_ktri,
2051       { "ktri", "cms.ktri",
2052         FT_NONE, BASE_NONE, NULL, 0,
2053         "cms.KeyTransRecipientInfo", HFILL }},
2054     { &hf_cms_kari,
2055       { "kari", "cms.kari",
2056         FT_NONE, BASE_NONE, NULL, 0,
2057         "cms.KeyAgreeRecipientInfo", HFILL }},
2058     { &hf_cms_kekri,
2059       { "kekri", "cms.kekri",
2060         FT_NONE, BASE_NONE, NULL, 0,
2061         "cms.KEKRecipientInfo", HFILL }},
2062     { &hf_cms_rid,
2063       { "rid", "cms.rid",
2064         FT_UINT32, BASE_DEC, VALS(cms_RecipientIdentifier_vals), 0,
2065         "cms.RecipientIdentifier", HFILL }},
2066     { &hf_cms_keyEncryptionAlgorithm,
2067       { "keyEncryptionAlgorithm", "cms.keyEncryptionAlgorithm",
2068         FT_NONE, BASE_NONE, NULL, 0,
2069         "cms.KeyEncryptionAlgorithmIdentifier", HFILL }},
2070     { &hf_cms_encryptedKey,
2071       { "encryptedKey", "cms.encryptedKey",
2072         FT_BYTES, BASE_HEX, NULL, 0,
2073         "cms.EncryptedKey", HFILL }},
2074     { &hf_cms_originator,
2075       { "originator", "cms.originator",
2076         FT_UINT32, BASE_DEC, VALS(cms_OriginatorIdentifierOrKey_vals), 0,
2077         "cms.OriginatorIdentifierOrKey", HFILL }},
2078     { &hf_cms_ukm,
2079       { "ukm", "cms.ukm",
2080         FT_BYTES, BASE_HEX, NULL, 0,
2081         "cms.UserKeyingMaterial", HFILL }},
2082     { &hf_cms_recipientEncryptedKeys,
2083       { "recipientEncryptedKeys", "cms.recipientEncryptedKeys",
2084         FT_UINT32, BASE_DEC, NULL, 0,
2085         "cms.RecipientEncryptedKeys", HFILL }},
2086     { &hf_cms_originatorKey,
2087       { "originatorKey", "cms.originatorKey",
2088         FT_NONE, BASE_NONE, NULL, 0,
2089         "cms.OriginatorPublicKey", HFILL }},
2090     { &hf_cms_algorithm,
2091       { "algorithm", "cms.algorithm",
2092         FT_NONE, BASE_NONE, NULL, 0,
2093         "x509af.AlgorithmIdentifier", HFILL }},
2094     { &hf_cms_publicKey,
2095       { "publicKey", "cms.publicKey",
2096         FT_BYTES, BASE_HEX, NULL, 0,
2097         "cms.BIT_STRING", HFILL }},
2098     { &hf_cms_RecipientEncryptedKeys_item,
2099       { "Item", "cms.RecipientEncryptedKeys_item",
2100         FT_NONE, BASE_NONE, NULL, 0,
2101         "cms.RecipientEncryptedKey", HFILL }},
2102     { &hf_cms_rekRid,
2103       { "rid", "cms.rid",
2104         FT_UINT32, BASE_DEC, VALS(cms_KeyAgreeRecipientIdentifier_vals), 0,
2105         "cms.KeyAgreeRecipientIdentifier", HFILL }},
2106     { &hf_cms_rKeyId,
2107       { "rKeyId", "cms.rKeyId",
2108         FT_NONE, BASE_NONE, NULL, 0,
2109         "cms.RecipientKeyIdentifier", HFILL }},
2110     { &hf_cms_date,
2111       { "date", "cms.date",
2112         FT_STRING, BASE_NONE, NULL, 0,
2113         "cms.GeneralizedTime", HFILL }},
2114     { &hf_cms_other,
2115       { "other", "cms.other",
2116         FT_NONE, BASE_NONE, NULL, 0,
2117         "cms.OtherKeyAttribute", HFILL }},
2118     { &hf_cms_kekid,
2119       { "kekid", "cms.kekid",
2120         FT_NONE, BASE_NONE, NULL, 0,
2121         "cms.KEKIdentifier", HFILL }},
2122     { &hf_cms_keyIdentifier,
2123       { "keyIdentifier", "cms.keyIdentifier",
2124         FT_BYTES, BASE_HEX, NULL, 0,
2125         "cms.OCTET_STRING", HFILL }},
2126     { &hf_cms_digest,
2127       { "digest", "cms.digest",
2128         FT_BYTES, BASE_HEX, NULL, 0,
2129         "cms.Digest", HFILL }},
2130     { &hf_cms_macAlgorithm,
2131       { "macAlgorithm", "cms.macAlgorithm",
2132         FT_NONE, BASE_NONE, NULL, 0,
2133         "cms.MessageAuthenticationCodeAlgorithm", HFILL }},
2134     { &hf_cms_authenticatedAttributes,
2135       { "authenticatedAttributes", "cms.authenticatedAttributes",
2136         FT_UINT32, BASE_DEC, NULL, 0,
2137         "cms.AuthAttributes", HFILL }},
2138     { &hf_cms_mac,
2139       { "mac", "cms.mac",
2140         FT_BYTES, BASE_HEX, NULL, 0,
2141         "cms.MessageAuthenticationCode", HFILL }},
2142     { &hf_cms_unauthenticatedAttributes,
2143       { "unauthenticatedAttributes", "cms.unauthenticatedAttributes",
2144         FT_UINT32, BASE_DEC, NULL, 0,
2145         "cms.UnauthAttributes", HFILL }},
2146     { &hf_cms_AuthAttributes_item,
2147       { "Item", "cms.AuthAttributes_item",
2148         FT_NONE, BASE_NONE, NULL, 0,
2149         "cms.Attribute", HFILL }},
2150     { &hf_cms_UnauthAttributes_item,
2151       { "Item", "cms.UnauthAttributes_item",
2152         FT_NONE, BASE_NONE, NULL, 0,
2153         "cms.Attribute", HFILL }},
2154     { &hf_cms_CertificateRevocationLists_item,
2155       { "Item", "cms.CertificateRevocationLists_item",
2156         FT_NONE, BASE_NONE, NULL, 0,
2157         "x509af.CertificateList", HFILL }},
2158     { &hf_cms_certificate,
2159       { "certificate", "cms.certificate",
2160         FT_NONE, BASE_NONE, NULL, 0,
2161         "x509af.Certificate", HFILL }},
2162     { &hf_cms_extendedCertificate,
2163       { "extendedCertificate", "cms.extendedCertificate",
2164         FT_NONE, BASE_NONE, NULL, 0,
2165         "cms.ExtendedCertificate", HFILL }},
2166     { &hf_cms_attrCert,
2167       { "attrCert", "cms.attrCert",
2168         FT_NONE, BASE_NONE, NULL, 0,
2169         "x509af.AttributeCertificate", HFILL }},
2170     { &hf_cms_CertificateSet_item,
2171       { "Item", "cms.CertificateSet_item",
2172         FT_UINT32, BASE_DEC, VALS(cms_CertificateChoices_vals), 0,
2173         "cms.CertificateChoices", HFILL }},
2174     { &hf_cms_issuer,
2175       { "issuer", "cms.issuer",
2176         FT_UINT32, BASE_DEC, VALS(x509if_Name_vals), 0,
2177         "x509if.Name", HFILL }},
2178     { &hf_cms_serialNumber,
2179       { "serialNumber", "cms.serialNumber",
2180         FT_INT32, BASE_DEC, NULL, 0,
2181         "x509af.CertificateSerialNumber", HFILL }},
2182     { &hf_cms_keyAttrId,
2183       { "keyAttrId", "cms.keyAttrId",
2184         FT_OID, BASE_NONE, NULL, 0,
2185         "cms.T_keyAttrId", HFILL }},
2186     { &hf_cms_keyAttr,
2187       { "keyAttr", "cms.keyAttr",
2188         FT_NONE, BASE_NONE, NULL, 0,
2189         "cms.T_keyAttr", HFILL }},
2190     { &hf_cms_utcTime,
2191       { "utcTime", "cms.utcTime",
2192         FT_STRING, BASE_NONE, NULL, 0,
2193         "cms.UTCTime", HFILL }},
2194     { &hf_cms_generalTime,
2195       { "generalTime", "cms.generalTime",
2196         FT_STRING, BASE_NONE, NULL, 0,
2197         "cms.GeneralizedTime", HFILL }},
2198     { &hf_cms_rc2ParameterVersion,
2199       { "rc2ParameterVersion", "cms.rc2ParameterVersion",
2200         FT_INT32, BASE_DEC, NULL, 0,
2201         "cms.INTEGER", HFILL }},
2202     { &hf_cms_iv,
2203       { "iv", "cms.iv",
2204         FT_BYTES, BASE_HEX, NULL, 0,
2205         "cms.OCTET_STRING", HFILL }},
2206     { &hf_cms_extendedCertificateInfo,
2207       { "extendedCertificateInfo", "cms.extendedCertificateInfo",
2208         FT_NONE, BASE_NONE, NULL, 0,
2209         "cms.ExtendedCertificateInfo", HFILL }},
2210     { &hf_cms_signature,
2211       { "signature", "cms.signature",
2212         FT_BYTES, BASE_HEX, NULL, 0,
2213         "cms.Signature", HFILL }},
2214     { &hf_cms_attributes,
2215       { "attributes", "cms.attributes",
2216         FT_UINT32, BASE_DEC, NULL, 0,
2217         "cms.UnauthAttributes", HFILL }},
2218     { &hf_cms_SMIMECapabilities_item,
2219       { "Item", "cms.SMIMECapabilities_item",
2220         FT_NONE, BASE_NONE, NULL, 0,
2221         "cms.SMIMECapability", HFILL }},
2222     { &hf_cms_capability,
2223       { "capability", "cms.capability",
2224         FT_OID, BASE_NONE, NULL, 0,
2225         "cms.T_capability", HFILL }},
2226     { &hf_cms_parameters,
2227       { "parameters", "cms.parameters",
2228         FT_NONE, BASE_NONE, NULL, 0,
2229         "cms.T_parameters", HFILL }},
2230     { &hf_cms_recipientKeyId,
2231       { "recipientKeyId", "cms.recipientKeyId",
2232         FT_NONE, BASE_NONE, NULL, 0,
2233         "cms.RecipientKeyIdentifier", HFILL }},
2234     { &hf_cms_subjectAltKeyIdentifier,
2235       { "subjectAltKeyIdentifier", "cms.subjectAltKeyIdentifier",
2236         FT_BYTES, BASE_HEX, NULL, 0,
2237         "cms.SubjectKeyIdentifier", HFILL }},
2238     { &hf_cms_rc2WrapParameter,
2239       { "rc2WrapParameter", "cms.rc2WrapParameter",
2240         FT_INT32, BASE_DEC, NULL, 0,
2241         "cms.RC2WrapParameter", HFILL }},
2242     { &hf_cms_rc2CBCParameter,
2243       { "rc2CBCParameter", "cms.rc2CBCParameter",
2244         FT_NONE, BASE_NONE, NULL, 0,
2245         "cms.RC2CBCParameter", HFILL }},
2246
2247 /*--- End of included file: packet-cms-hfarr.c ---*/
2248 #line 146 "packet-cms-template.c"
2249   };
2250
2251   /* List of subtrees */
2252   static gint *ett[] = {
2253
2254 /*--- Included file: packet-cms-ettarr.c ---*/
2255 #line 1 "packet-cms-ettarr.c"
2256     &ett_cms_ContentInfo,
2257     &ett_cms_SignedData,
2258     &ett_cms_DigestAlgorithmIdentifiers,
2259     &ett_cms_SignerInfos,
2260     &ett_cms_EncapsulatedContentInfo,
2261     &ett_cms_SignerInfo,
2262     &ett_cms_SignerIdentifier,
2263     &ett_cms_SignedAttributes,
2264     &ett_cms_UnsignedAttributes,
2265     &ett_cms_Attribute,
2266     &ett_cms_SET_OF_AttributeValue,
2267     &ett_cms_EnvelopedData,
2268     &ett_cms_OriginatorInfo,
2269     &ett_cms_RecipientInfos,
2270     &ett_cms_EncryptedContentInfo,
2271     &ett_cms_UnprotectedAttributes,
2272     &ett_cms_RecipientInfo,
2273     &ett_cms_KeyTransRecipientInfo,
2274     &ett_cms_RecipientIdentifier,
2275     &ett_cms_KeyAgreeRecipientInfo,
2276     &ett_cms_OriginatorIdentifierOrKey,
2277     &ett_cms_OriginatorPublicKey,
2278     &ett_cms_RecipientEncryptedKeys,
2279     &ett_cms_RecipientEncryptedKey,
2280     &ett_cms_KeyAgreeRecipientIdentifier,
2281     &ett_cms_RecipientKeyIdentifier,
2282     &ett_cms_KEKRecipientInfo,
2283     &ett_cms_KEKIdentifier,
2284     &ett_cms_DigestedData,
2285     &ett_cms_EncryptedData,
2286     &ett_cms_AuthenticatedData,
2287     &ett_cms_AuthAttributes,
2288     &ett_cms_UnauthAttributes,
2289     &ett_cms_CertificateRevocationLists,
2290     &ett_cms_CertificateChoices,
2291     &ett_cms_CertificateSet,
2292     &ett_cms_IssuerAndSerialNumber,
2293     &ett_cms_OtherKeyAttribute,
2294     &ett_cms_Time,
2295     &ett_cms_RC2CBCParameter,
2296     &ett_cms_ExtendedCertificate,
2297     &ett_cms_ExtendedCertificateInfo,
2298     &ett_cms_SMIMECapabilities,
2299     &ett_cms_SMIMECapability,
2300     &ett_cms_SMIMEEncryptionKeyPreference,
2301     &ett_cms_RC2CBCParameters,
2302
2303 /*--- End of included file: packet-cms-ettarr.c ---*/
2304 #line 151 "packet-cms-template.c"
2305   };
2306
2307   /* Register protocol */
2308   proto_cms = proto_register_protocol(PNAME, PSNAME, PFNAME);
2309
2310   /* Register fields and subtrees */
2311   proto_register_field_array(proto_cms, hf, array_length(hf));
2312   proto_register_subtree_array(ett, array_length(ett));
2313
2314   register_ber_syntax_dissector("ContentInfo", proto_cms, dissect_ContentInfo_PDU); 
2315   register_ber_oid_syntax(".p7s", NULL, "ContentInfo");
2316   register_ber_oid_syntax(".p7m", NULL, "ContentInfo");
2317   register_ber_oid_syntax(".p7c", NULL, "ContentInfo");
2318
2319
2320 }
2321
2322
2323 /*--- proto_reg_handoff_cms -------------------------------------------*/
2324 void proto_reg_handoff_cms(void) {
2325
2326 /*--- Included file: packet-cms-dis-tab.c ---*/
2327 #line 1 "packet-cms-dis-tab.c"
2328   register_ber_oid_dissector("1.2.840.113549.1.9.16.1.6", dissect_ContentInfo_PDU, proto_cms, "id-ct-contentInfo");
2329   register_ber_oid_dissector("1.2.840.113549.1.7.2", dissect_SignedData_PDU, proto_cms, "id-signedData");
2330   register_ber_oid_dissector("1.2.840.113549.1.7.3", dissect_EnvelopedData_PDU, proto_cms, "id-envelopedData");
2331   register_ber_oid_dissector("1.2.840.113549.1.7.5", dissect_DigestedData_PDU, proto_cms, "id-digestedData");
2332   register_ber_oid_dissector("1.2.840.113549.1.7.6", dissect_EncryptedData_PDU, proto_cms, "id-encryptedData");
2333   register_ber_oid_dissector("1.2.840.113549.1.9.16.1.2", dissect_AuthenticatedData_PDU, proto_cms, "id-ct-authenticatedData");
2334   register_ber_oid_dissector("1.2.840.113549.1.9.3", dissect_ContentType_PDU, proto_cms, "id-contentType");
2335   register_ber_oid_dissector("1.2.840.113549.1.9.4", dissect_MessageDigest_PDU, proto_cms, "id-messageDigest");
2336   register_ber_oid_dissector("1.2.840.113549.1.9.5", dissect_SigningTime_PDU, proto_cms, "id-signingTime");
2337   register_ber_oid_dissector("1.2.840.113549.1.9.6", dissect_Countersignature_PDU, proto_cms, "id-counterSignature");
2338   register_ber_oid_dissector("2.6.1.4.18", dissect_ContentInfo_PDU, proto_cms, "id-et-pkcs7");
2339   register_ber_oid_dissector("1.3.6.1.4.1.311.16.4", dissect_IssuerAndSerialNumber_PDU, proto_cms, "ms-oe-encryption-key-preference");
2340   register_ber_oid_dissector("1.2.840.113549.1.9.15", dissect_SMIMECapabilities_PDU, proto_cms, "id-smime-capabilities");
2341   register_ber_oid_dissector("1.2.840.113549.1.9.16.2.11", dissect_SMIMEEncryptionKeyPreference_PDU, proto_cms, "id-encryption-key-preference");
2342   register_ber_oid_dissector("1.2.840.113549.3.2", dissect_RC2CBCParameters_PDU, proto_cms, "id-alg-rc2-cbc");
2343   register_ber_oid_dissector("1.2.840.113549.1.9.16.3.7", dissect_RC2WrapParameter_PDU, proto_cms, "id-alg-cmsrc2-wrap");
2344
2345
2346 /*--- End of included file: packet-cms-dis-tab.c ---*/
2347 #line 172 "packet-cms-template.c"
2348
2349   add_oid_str_name("1.2.840.113549.1.7.1", "id-data");
2350   add_oid_str_name("1.2.840.113549.3.7", "id-alg-des-ede3-cbc");
2351   add_oid_str_name("1.3.14.3.2.7", "id-alg-des-cbc");
2352
2353 }
2354