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>