1 /* crypto/cms/cms_att.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 <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 */