cms_cd.c revision 193770
1250661Sdavidcs/* crypto/cms/cms_cd.c */
2284741Sdavidcs/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3250661Sdavidcs * project.
4250661Sdavidcs */
5250661Sdavidcs/* ====================================================================
6250661Sdavidcs * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
7250661Sdavidcs *
8250661Sdavidcs * Redistribution and use in source and binary forms, with or without
9250661Sdavidcs * modification, are permitted provided that the following conditions
10250661Sdavidcs * are met:
11250661Sdavidcs *
12250661Sdavidcs * 1. Redistributions of source code must retain the above copyright
13250661Sdavidcs *    notice, this list of conditions and the following disclaimer.
14250661Sdavidcs *
15250661Sdavidcs * 2. Redistributions in binary form must reproduce the above copyright
16250661Sdavidcs *    notice, this list of conditions and the following disclaimer in
17250661Sdavidcs *    the documentation and/or other materials provided with the
18250661Sdavidcs *    distribution.
19250661Sdavidcs *
20250661Sdavidcs * 3. All advertising materials mentioning features or use of this
21250661Sdavidcs *    software must display the following acknowledgment:
22250661Sdavidcs *    "This product includes software developed by the OpenSSL Project
23250661Sdavidcs *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24250661Sdavidcs *
25250661Sdavidcs * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26250661Sdavidcs *    endorse or promote products derived from this software without
27250661Sdavidcs *    prior written permission. For written permission, please contact
28250661Sdavidcs *    licensing@OpenSSL.org.
29250661Sdavidcs *
30250661Sdavidcs * 5. Products derived from this software may not be called "OpenSSL"
31250661Sdavidcs *    nor may "OpenSSL" appear in their names without prior written
32250661Sdavidcs *    permission of the OpenSSL Project.
33250661Sdavidcs *
34250661Sdavidcs * 6. Redistributions of any form whatsoever must retain the following
35250661Sdavidcs *    acknowledgment:
36250661Sdavidcs *    "This product includes software developed by the OpenSSL Project
37250661Sdavidcs *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38250661Sdavidcs *
39250661Sdavidcs * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40250661Sdavidcs * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41250661Sdavidcs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42250661Sdavidcs * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43250661Sdavidcs * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44250661Sdavidcs * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45250661Sdavidcs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46250661Sdavidcs * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47250661Sdavidcs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48250661Sdavidcs * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49250661Sdavidcs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50250661Sdavidcs * OF THE POSSIBILITY OF SUCH DAMAGE.
51250661Sdavidcs * ====================================================================
52250661Sdavidcs */
53250661Sdavidcs
54250661Sdavidcs#include "cryptlib.h"
55250661Sdavidcs#include <openssl/asn1t.h>
56250661Sdavidcs#include <openssl/pem.h>
57250661Sdavidcs#include <openssl/x509v3.h>
58250661Sdavidcs#include <openssl/err.h>
59250661Sdavidcs#include <openssl/cms.h>
60250661Sdavidcs#include <openssl/bio.h>
61250661Sdavidcs#include <openssl/comp.h>
62250661Sdavidcs#include "cms_lcl.h"
63250661Sdavidcs
64250661SdavidcsDECLARE_ASN1_ITEM(CMS_CompressedData)
65250661Sdavidcs
66250661Sdavidcs#ifdef ZLIB
67250661Sdavidcs
68250661Sdavidcs/* CMS CompressedData Utilities */
69250661Sdavidcs
70250661SdavidcsCMS_ContentInfo *cms_CompressedData_create(int comp_nid)
71250661Sdavidcs	{
72250661Sdavidcs	CMS_ContentInfo *cms;
73250661Sdavidcs	CMS_CompressedData *cd;
74250661Sdavidcs	/* Will need something cleverer if there is ever more than one
75250661Sdavidcs	 * compression algorithm or parameters have some meaning...
76250661Sdavidcs	 */
77250661Sdavidcs	if (comp_nid != NID_zlib_compression)
78250661Sdavidcs		{
79250661Sdavidcs		CMSerr(CMS_F_CMS_COMPRESSEDDATA_CREATE,
80250661Sdavidcs				CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
81250661Sdavidcs		return NULL;
82250661Sdavidcs		}
83284741Sdavidcs	cms = CMS_ContentInfo_new();
84250661Sdavidcs	if (!cms)
85250661Sdavidcs		return NULL;
86250661Sdavidcs
87250661Sdavidcs	cd = M_ASN1_new_of(CMS_CompressedData);
88250661Sdavidcs
89250661Sdavidcs	if (!cd)
90250661Sdavidcs		goto err;
91250661Sdavidcs
92250661Sdavidcs	cms->contentType = OBJ_nid2obj(NID_id_smime_ct_compressedData);
93250661Sdavidcs	cms->d.compressedData = cd;
94250661Sdavidcs
95250661Sdavidcs	cd->version = 0;
96250661Sdavidcs
97250661Sdavidcs	X509_ALGOR_set0(cd->compressionAlgorithm,
98250661Sdavidcs			OBJ_nid2obj(NID_zlib_compression),
99250661Sdavidcs			V_ASN1_UNDEF, NULL);
100250661Sdavidcs
101250661Sdavidcs	cd->encapContentInfo->eContentType = OBJ_nid2obj(NID_pkcs7_data);
102250661Sdavidcs
103250661Sdavidcs	return cms;
104250661Sdavidcs
105250661Sdavidcs	err:
106250661Sdavidcs
107250661Sdavidcs	if (cms)
108250661Sdavidcs		CMS_ContentInfo_free(cms);
109250661Sdavidcs
110250661Sdavidcs	return NULL;
111250661Sdavidcs	}
112250661Sdavidcs
113250661SdavidcsBIO *cms_CompressedData_init_bio(CMS_ContentInfo *cms)
114250661Sdavidcs	{
115250661Sdavidcs	CMS_CompressedData *cd;
116250661Sdavidcs	ASN1_OBJECT *compoid;
117250661Sdavidcs	if (OBJ_obj2nid(cms->contentType) != NID_id_smime_ct_compressedData)
118250661Sdavidcs		{
119250661Sdavidcs		CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO,
120250661Sdavidcs				CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA);
121250661Sdavidcs		return NULL;
122250661Sdavidcs		}
123250661Sdavidcs	cd = cms->d.compressedData;
124284741Sdavidcs	X509_ALGOR_get0(&compoid, NULL, NULL, cd->compressionAlgorithm);
125250661Sdavidcs	if (OBJ_obj2nid(compoid) != NID_zlib_compression)
126250661Sdavidcs		{
127250661Sdavidcs		CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO,
128250661Sdavidcs				CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
129250661Sdavidcs		return NULL;
130250661Sdavidcs		}
131250661Sdavidcs	return BIO_new(BIO_f_zlib());
132250661Sdavidcs	}
133250661Sdavidcs
134250661Sdavidcs#endif
135250661Sdavidcs