Home | History | Annotate | Download | only in cms
      1 /* crypto/cms/cms_att.c */
      2 /* Written by Dr Stephen N Henson (steve (at) 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 (at) 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 <openssl/asn1t.h>
     55 #include <openssl/pem.h>
     56 #include <openssl/x509v3.h>
     57 #include <openssl/err.h>
     58 #include "cms.h"
     59 #include "cms_lcl.h"
     60 
     61 /* CMS SignedData Attribute utilities */
     62 
     63 int CMS_signed_get_attr_count(const CMS_SignerInfo *si)
     64 {
     65 	return X509at_get_attr_count(si->signedAttrs);
     66 }
     67 
     68 int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid,
     69 			  int lastpos)
     70 {
     71 	return X509at_get_attr_by_NID(si->signedAttrs, nid, lastpos);
     72 }
     73 
     74 int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj,
     75 			  int lastpos)
     76 {
     77 	return X509at_get_attr_by_OBJ(si->signedAttrs, obj, lastpos);
     78 }
     79 
     80 X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc)
     81 {
     82 	return X509at_get_attr(si->signedAttrs, loc);
     83 }
     84 
     85 X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc)
     86 {
     87 	return X509at_delete_attr(si->signedAttrs, loc);
     88 }
     89 
     90 int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr)
     91 {
     92 	if(X509at_add1_attr(&si->signedAttrs, attr)) return 1;
     93 	return 0;
     94 }
     95 
     96 int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si,
     97 			const ASN1_OBJECT *obj, int type,
     98 			const void *bytes, int len)
     99 {
    100 	if(X509at_add1_attr_by_OBJ(&si->signedAttrs, obj,
    101 				type, bytes, len)) return 1;
    102 	return 0;
    103 }
    104 
    105 int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si,
    106 			int nid, int type,
    107 			const void *bytes, int len)
    108 {
    109 	if(X509at_add1_attr_by_NID(&si->signedAttrs, nid,
    110 				type, bytes, len)) return 1;
    111 	return 0;
    112 }
    113 
    114 int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si,
    115 			const char *attrname, int type,
    116 			const void *bytes, int len)
    117 {
    118 	if(X509at_add1_attr_by_txt(&si->signedAttrs, attrname,
    119 				type, bytes, len)) return 1;
    120 	return 0;
    121 }
    122 
    123 void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid,
    124 					int lastpos, int type)
    125 {
    126 	return X509at_get0_data_by_OBJ(si->signedAttrs, oid, lastpos, type);
    127 }
    128 
    129 int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si)
    130 {
    131 	return X509at_get_attr_count(si->unsignedAttrs);
    132 }
    133 
    134 int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid,
    135 			  int lastpos)
    136 {
    137 	return X509at_get_attr_by_NID(si->unsignedAttrs, nid, lastpos);
    138 }
    139 
    140 int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj,
    141 			  int lastpos)
    142 {
    143 	return X509at_get_attr_by_OBJ(si->unsignedAttrs, obj, lastpos);
    144 }
    145 
    146 X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc)
    147 {
    148 	return X509at_get_attr(si->unsignedAttrs, loc);
    149 }
    150 
    151 X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc)
    152 {
    153 	return X509at_delete_attr(si->unsignedAttrs, loc);
    154 }
    155 
    156 int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr)
    157 {
    158 	if(X509at_add1_attr(&si->unsignedAttrs, attr)) return 1;
    159 	return 0;
    160 }
    161 
    162 int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si,
    163 			const ASN1_OBJECT *obj, int type,
    164 			const void *bytes, int len)
    165 {
    166 	if(X509at_add1_attr_by_OBJ(&si->unsignedAttrs, obj,
    167 				type, bytes, len)) return 1;
    168 	return 0;
    169 }
    170 
    171 int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si,
    172 			int nid, int type,
    173 			const void *bytes, int len)
    174 {
    175 	if(X509at_add1_attr_by_NID(&si->unsignedAttrs, nid,
    176 				type, bytes, len)) return 1;
    177 	return 0;
    178 }
    179 
    180 int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si,
    181 			const char *attrname, int type,
    182 			const void *bytes, int len)
    183 {
    184 	if(X509at_add1_attr_by_txt(&si->unsignedAttrs, attrname,
    185 				type, bytes, len)) return 1;
    186 	return 0;
    187 }
    188 
    189 void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid,
    190 					int lastpos, int type)
    191 {
    192 	return X509at_get0_data_by_OBJ(si->unsignedAttrs, oid, lastpos, type);
    193 }
    194 
    195 /* Specific attribute cases */
    196