1 /* crypto/cms/cms_cd.c */
   2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
   3  * project.
   4  */
   5 /* ====================================================================
   6  * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
   7  *
   8  * Redistribution and use in source and binary forms, with or without
   9  * modification, are permitted provided that the following conditions
  10  * are met:
  11  *
  12  * 1. Redistributions of source code must retain the above copyright
  13  *    notice, this list of conditions and the following disclaimer.
  14  *
  15  * 2. Redistributions in binary form must reproduce the above copyright
  16  *    notice, this list of conditions and the following disclaimer in
  17  *    the documentation and/or other materials provided with the
  18  *    distribution.
  19  *
  20  * 3. All advertising materials mentioning features or use of this
  21  *    software must display the following acknowledgment:
  22  *    "This product includes software developed by the OpenSSL Project
  23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  24  *
  25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  26  *    endorse or promote products derived from this software without
  27  *    prior written permission. For written permission, please contact
  28  *    licensing@OpenSSL.org.
  29  *
  30  * 5. Products derived from this software may not be called "OpenSSL"
  31  *    nor may "OpenSSL" appear in their names without prior written
  32  *    permission of the OpenSSL Project.
  33  *
  34  * 6. Redistributions of any form whatsoever must retain the following
  35  *    acknowledgment:
  36  *    "This product includes software developed by the OpenSSL Project
  37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  38  *
  39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
  43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  50  * OF THE POSSIBILITY OF SUCH DAMAGE.
  51  * ====================================================================
  52  */
  53 
  54 #include "cryptlib.h"
  55 #include <openssl/asn1t.h>
  56 #include <openssl/pem.h>
  57 #include <openssl/x509v3.h>
  58 #include <openssl/err.h>
  59 #include <openssl/cms.h>
  60 #include <openssl/bio.h>
  61 #ifndef OPENSSL_NO_COMP
  62 #include <openssl/comp.h>
  63 #endif
  64 #include "cms_lcl.h"
  65 
  66 DECLARE_ASN1_ITEM(CMS_CompressedData)
  67 
  68 #ifdef ZLIB
  69 
  70 /* CMS CompressedData Utilities */
  71 
  72 CMS_ContentInfo *cms_CompressedData_create(int comp_nid)
  73         {
  74         CMS_ContentInfo *cms;
  75         CMS_CompressedData *cd;
  76         /* Will need something cleverer if there is ever more than one
  77          * compression algorithm or parameters have some meaning...
  78          */
  79         if (comp_nid != NID_zlib_compression)
  80                 {
  81                 CMSerr(CMS_F_CMS_COMPRESSEDDATA_CREATE,
  82                                 CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
  83                 return NULL;
  84                 }
  85         cms = CMS_ContentInfo_new();
  86         if (!cms)
  87                 return NULL;
  88 
  89         cd = M_ASN1_new_of(CMS_CompressedData);
  90 
  91         if (!cd)
  92                 goto err;
  93 
  94         cms->contentType = OBJ_nid2obj(NID_id_smime_ct_compressedData);
  95         cms->d.compressedData = cd;
  96 
  97         cd->version = 0;
  98 
  99         X509_ALGOR_set0(cd->compressionAlgorithm,
 100                         OBJ_nid2obj(NID_zlib_compression),
 101                         V_ASN1_UNDEF, NULL);
 102 
 103         cd->encapContentInfo->eContentType = OBJ_nid2obj(NID_pkcs7_data);
 104 
 105         return cms;
 106 
 107         err:
 108 
 109         if (cms)
 110                 CMS_ContentInfo_free(cms);
 111 
 112         return NULL;
 113         }
 114 
 115 BIO *cms_CompressedData_init_bio(CMS_ContentInfo *cms)
 116         {
 117         CMS_CompressedData *cd;
 118         ASN1_OBJECT *compoid;
 119         if (OBJ_obj2nid(cms->contentType) != NID_id_smime_ct_compressedData)
 120                 {
 121                 CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO,
 122                                 CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA);
 123                 return NULL;
 124                 }
 125         cd = cms->d.compressedData;
 126         X509_ALGOR_get0(&compoid, NULL, NULL, cd->compressionAlgorithm);
 127         if (OBJ_obj2nid(compoid) != NID_zlib_compression)
 128                 {
 129                 CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO,
 130                                 CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
 131                 return NULL;
 132                 }
 133         return BIO_new(BIO_f_zlib());
 134         }
 135 
 136 #endif