2004-07-19 09:03:28 +00:00
/* packet-cms.c
2010-01-12 14:29:53 +00:00
* Routines for RFC5652 Cryptographic Message Syntax packet dissection
2004-11-22 03:36:26 +00:00
* Ronnie Sahlberg 2004
2010-01-12 14:29:53 +00:00
* Stig Bjorlykke 2010
2004-07-19 09:03:28 +00:00
*
2004-10-05 09:18:55 +00:00
* $ Id $
2004-07-19 09:03:28 +00:00
*
2006-05-21 05:12:17 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2004-07-19 09:03:28 +00:00
* Copyright 1998 Gerald Combs
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <glib.h>
# include <epan/packet.h>
2007-08-25 01:14:24 +00:00
# include <epan/oids.h>
2007-05-13 20:58:29 +00:00
# include <epan/asn1.h>
2004-07-19 09:03:28 +00:00
# include <string.h>
# include "packet-ber.h"
# include "packet-cms.h"
# include "packet-x509af.h"
2010-01-12 11:49:17 +00:00
# include "packet-x509ce.h"
2004-07-25 10:41:39 +00:00
# include "packet-x509if.h"
2010-01-12 11:49:17 +00:00
# include "packet-x509sat.h"
2007-08-17 19:14:39 +00:00
# include "packet-pkcs12.h"
2004-07-19 09:03:28 +00:00
2012-01-18 21:20:50 +00:00
# include <epan/crypt/sha1.h>
# include <epan/crypt/md5.h>
2005-11-16 07:13:12 +00:00
2004-07-19 09:03:28 +00:00
# define PNAME "Cryptographic Message Syntax"
# define PSNAME "CMS"
# define PFNAME "cms"
/* Initialize the protocol and registered fields */
2009-10-11 16:24:29 +00:00
static int proto_cms = - 1 ;
2004-09-16 08:31:01 +00:00
static int hf_cms_ci_contentType = - 1 ;
2004-07-19 09:03:28 +00:00
# include "packet-cms-hf.c"
/* Initialize the subtree pointers */
# include "packet-cms-ett.c"
2007-05-13 20:58:29 +00:00
static int dissect_cms_OCTET_STRING ( gboolean implicit_tag _U_ , tvbuff_t * tvb , int offset , asn1_ctx_t * actx , proto_tree * tree , int hf_index _U_ ) ; /* XXX kill a compiler warning until asn2wrs stops generating these silly wrappers */
2004-12-13 08:15:34 +00:00
2005-11-14 10:02:31 +00:00
static const char * object_identifier_id ;
2005-11-16 07:13:12 +00:00
static tvbuff_t * content_tvb = NULL ;
2004-07-25 10:34:07 +00:00
2005-11-16 07:13:12 +00:00
static proto_tree * top_tree = NULL ;
2007-01-28 10:20:51 +00:00
static proto_tree * cap_tree = NULL ;
2005-11-16 07:13:12 +00:00
# define HASH_SHA1 "1.3.14.3.2.26"
# define SHA1_BUFFER_SIZE 20
# define HASH_MD5 "1.2.840.113549.2.5"
# define MD5_BUFFER_SIZE 16
/* SHA-2 variants */
# define HASH_SHA224 "2.16.840.1.101.3.4.2.4"
# define SHA224_BUFFER_SIZE 32 /* actually 28 */
# define HASH_SHA256 "2.16.840.1.101.3.4.2.1"
# define SHA256_BUFFER_SIZE 32
unsigned char digest_buf [ MAX ( SHA1_BUFFER_SIZE , MD5_BUFFER_SIZE ) ] ;
static void
2005-11-17 11:50:36 +00:00
cms_verify_msg_digest ( proto_item * pi , tvbuff_t * content , const char * alg , tvbuff_t * tvb , int offset )
2005-11-16 07:13:12 +00:00
{
sha1_context sha1_ctx ;
md5_state_t md5_ctx ;
int i = 0 , buffer_size = 0 ;
/* we only support two algorithms at the moment - if we do add SHA2
we should add a registration process to use a registration process */
if ( strcmp ( alg , HASH_SHA1 ) = = 0 ) {
sha1_starts ( & sha1_ctx ) ;
2007-01-02 22:49:57 +00:00
sha1_update ( & sha1_ctx , tvb_get_ptr ( content , 0 , tvb_length ( content ) ) ,
2005-11-16 07:13:12 +00:00
tvb_length ( content ) ) ;
2004-07-19 09:03:28 +00:00
2005-11-16 07:13:12 +00:00
sha1_finish ( & sha1_ctx , digest_buf ) ;
buffer_size = SHA1_BUFFER_SIZE ;
} else if ( strcmp ( alg , HASH_MD5 ) = = 0 ) {
md5_init ( & md5_ctx ) ;
2007-01-02 22:49:57 +00:00
md5_append ( & md5_ctx , tvb_get_ptr ( content , 0 , tvb_length ( content ) ) ,
2005-11-16 07:13:12 +00:00
tvb_length ( content ) ) ;
2007-01-02 22:49:57 +00:00
2005-11-16 07:13:12 +00:00
md5_finish ( & md5_ctx , digest_buf ) ;
buffer_size = MD5_BUFFER_SIZE ;
}
if ( buffer_size ) {
2007-01-02 22:49:57 +00:00
/* compare our computed hash with what we have received */
2005-11-16 07:13:12 +00:00
if ( tvb_bytes_exist ( tvb , offset , buffer_size ) & &
2011-02-20 15:05:21 +00:00
( tvb_memeql ( tvb , offset , digest_buf , buffer_size ) ! = 0 ) ) {
2005-11-16 07:13:12 +00:00
proto_item_append_text ( pi , " [incorrect, should be " ) ;
for ( i = 0 ; i < buffer_size ; i + + )
proto_item_append_text ( pi , " %02X " , digest_buf [ i ] ) ;
proto_item_append_text ( pi , " ] " ) ;
}
else
proto_item_append_text ( pi , " [correct] " ) ;
} else {
proto_item_append_text ( pi , " [unable to verify] " ) ;
}
}
# include "packet-cms-fn.c"
2004-07-19 09:03:28 +00:00
/*--- proto_register_cms ----------------------------------------------*/
void proto_register_cms ( void ) {
/* List of fields */
static hf_register_info hf [ ] = {
2004-09-16 08:31:01 +00:00
{ & hf_cms_ci_contentType ,
{ " contentType " , " cms.contentInfo.contentType " ,
2006-05-10 19:50:54 +00:00
FT_OID , BASE_NONE , NULL , 0 ,
2010-09-23 21:46:31 +00:00
NULL , HFILL } } ,
2004-07-19 09:03:28 +00:00
# include "packet-cms-hfarr.c"
} ;
/* List of subtrees */
static gint * ett [ ] = {
# include "packet-cms-ettarr.c"
} ;
/* Register protocol */
proto_cms = proto_register_protocol ( PNAME , PSNAME , PFNAME ) ;
/* Register fields and subtrees */
proto_register_field_array ( proto_cms , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
2010-09-23 21:46:31 +00:00
register_ber_syntax_dissector ( " ContentInfo " , proto_cms , dissect_ContentInfo_PDU ) ;
register_ber_syntax_dissector ( " SignedData " , proto_cms , dissect_SignedData_PDU ) ;
2007-01-28 10:20:51 +00:00
register_ber_oid_syntax ( " .p7s " , NULL , " ContentInfo " ) ;
register_ber_oid_syntax ( " .p7m " , NULL , " ContentInfo " ) ;
register_ber_oid_syntax ( " .p7c " , NULL , " ContentInfo " ) ;
2004-07-19 09:03:28 +00:00
}
/*--- proto_reg_handoff_cms -------------------------------------------*/
void proto_reg_handoff_cms ( void ) {
2004-10-26 13:54:09 +00:00
# include "packet-cms-dis-tab.c"
2007-01-13 15:26:13 +00:00
2007-10-31 08:26:52 +00:00
oid_add_from_string ( " id-data " , " 1.2.840.113549.1.7.1 " ) ;
oid_add_from_string ( " id-alg-des-ede3-cbc " , " 1.2.840.113549.3.7 " ) ;
oid_add_from_string ( " id-alg-des-cbc " , " 1.3.14.3.2.7 " ) ;
2007-01-13 15:26:13 +00:00
2004-07-19 09:03:28 +00:00
}