Annotation of embedaddon/strongswan/src/libstrongswan/plugins/pkcs7/pkcs7_generic.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2012 Martin Willi
                      3:  * Copyright (C) 2012 revosec AG
                      4:  * Copyright (C) 2012 Tobias Brunner
                      5:  * Copyright (C) 2002-2008 Andreas Steffen
                      6:  * Copyright (C) 2005 Jan Hutter, Martin Willi
                      7:  * HSR Hochschule fuer Technik Rapperswil
                      8:  *
                      9:  * This program is free software; you can redistribute it and/or modify it
                     10:  * under the terms of the GNU General Public License as published by the
                     11:  * Free Software Foundation; either version 2 of the License, or (at your
                     12:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     13:  *
                     14:  * This program is distributed in the hope that it will be useful, but
                     15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     16:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     17:  * for more details.
                     18:  */
                     19: 
                     20: #include "pkcs7_generic.h"
                     21: #include "pkcs7_data.h"
                     22: #include "pkcs7_signed_data.h"
                     23: #include "pkcs7_encrypted_data.h"
                     24: #include "pkcs7_enveloped_data.h"
                     25: 
                     26: #include <utils/debug.h>
                     27: #include <asn1/oid.h>
                     28: #include <asn1/asn1.h>
                     29: #include <asn1/asn1_parser.h>
                     30: 
                     31: /**
                     32:  * ASN.1 definition of the PKCS#7 ContentInfo type
                     33:  */
                     34: static const asn1Object_t contentInfoObjects[] = {
                     35:        { 0, "contentInfo",             ASN1_SEQUENCE,          ASN1_NONE }, /* 0 */
                     36:        { 1,   "contentType",   ASN1_OID,                       ASN1_BODY }, /* 1 */
                     37:        { 1,   "content",               ASN1_CONTEXT_C_0,       ASN1_OPT |
                     38:                                                                                                ASN1_BODY }, /* 2 */
                     39:        { 1,   "end opt",               ASN1_EOC,                       ASN1_END  }, /* 3 */
                     40:        { 0, "exit",                    ASN1_EOC,                       ASN1_EXIT }
                     41: };
                     42: #define PKCS7_INFO_TYPE                1
                     43: #define PKCS7_INFO_CONTENT     2
                     44: 
                     45: /**
                     46:  * Parse PKCS#7 contentInfo object
                     47:  */
                     48: static pkcs7_t* parse_contentInfo(chunk_t blob)
                     49: {
                     50:        asn1_parser_t *parser;
                     51:        chunk_t object, content = chunk_empty;
                     52:        int objectID, type = OID_UNKNOWN;
                     53:        bool success = FALSE;
                     54: 
                     55:        parser = asn1_parser_create(contentInfoObjects, blob);
                     56:        parser->set_top_level(parser, 0);
                     57: 
                     58:        while (parser->iterate(parser, &objectID, &object))
                     59:        {
                     60:                if (objectID == PKCS7_INFO_TYPE)
                     61:                {
                     62:                        type = asn1_known_oid(object);
                     63:                        if (type < OID_PKCS7_DATA || type > OID_PKCS7_ENCRYPTED_DATA)
                     64:                        {
                     65:                                DBG1(DBG_ASN, "unknown pkcs7 content type");
                     66:                                goto end;
                     67:                        }
                     68:                }
                     69:                else if (objectID == PKCS7_INFO_CONTENT)
                     70:                {
                     71:                        content = object;
                     72:                }
                     73:        }
                     74:        success = parser->success(parser);
                     75: 
                     76: end:
                     77:        parser->destroy(parser);
                     78: 
                     79:        if (success)
                     80:        {
                     81:                switch (type)
                     82:                {
                     83:                        case OID_PKCS7_DATA:
                     84:                                return pkcs7_data_load(blob, content);
                     85:                        case OID_PKCS7_SIGNED_DATA:
                     86:                                return pkcs7_signed_data_load(blob, content);
                     87:                        case OID_PKCS7_ENVELOPED_DATA:
                     88:                                return pkcs7_enveloped_data_load(blob, content);
                     89:                        case OID_PKCS7_ENCRYPTED_DATA:
                     90:                                return pkcs7_encrypted_data_load(blob, content);
                     91:                        default:
                     92:                                DBG1(DBG_ASN, "pkcs7 content type %d not supported", type);
                     93:                                return NULL;
                     94:                }
                     95:        }
                     96:        return NULL;
                     97: }
                     98: 
                     99: 
                    100: pkcs7_t *pkcs7_generic_load(container_type_t type, va_list args)
                    101: {
                    102:        chunk_t blob = chunk_empty;
                    103: 
                    104:        while (TRUE)
                    105:        {
                    106:                switch (va_arg(args, builder_part_t))
                    107:                {
                    108:                        case BUILD_BLOB_ASN1_DER:
                    109:                                blob = va_arg(args, chunk_t);
                    110:                                continue;
                    111:                        case BUILD_END:
                    112:                                break;
                    113:                        default:
                    114:                                return NULL;
                    115:                }
                    116:                break;
                    117:        }
                    118:        if (blob.len)
                    119:        {
                    120:                if (blob.len >= 2 &&
                    121:                        blob.ptr[0] == ASN1_SEQUENCE && blob.ptr[1] == 0x80)
                    122:                {       /* looks like infinite length BER encoding, but we can't handle it.
                    123:                         * ignore silently, our openssl backend can handle it */
                    124:                        return NULL;
                    125:                }
                    126:                return parse_contentInfo(blob);
                    127:        }
                    128:        return NULL;
                    129: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>