1*c701dc03Stb /* $OpenBSD: cms_att.c,v 1.13 2024/08/27 01:19:27 tb Exp $ */ 2b8b016bfSjsing /* 3f29d8588Sjsing * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 4f29d8588Sjsing * project. 5f29d8588Sjsing */ 6f29d8588Sjsing /* ==================================================================== 7f29d8588Sjsing * Copyright (c) 2008 The OpenSSL Project. All rights reserved. 8b8b016bfSjsing * 9f29d8588Sjsing * Redistribution and use in source and binary forms, with or without 10f29d8588Sjsing * modification, are permitted provided that the following conditions 11f29d8588Sjsing * are met: 12f29d8588Sjsing * 13f29d8588Sjsing * 1. Redistributions of source code must retain the above copyright 14f29d8588Sjsing * notice, this list of conditions and the following disclaimer. 15f29d8588Sjsing * 16f29d8588Sjsing * 2. Redistributions in binary form must reproduce the above copyright 17f29d8588Sjsing * notice, this list of conditions and the following disclaimer in 18f29d8588Sjsing * the documentation and/or other materials provided with the 19f29d8588Sjsing * distribution. 20f29d8588Sjsing * 21f29d8588Sjsing * 3. All advertising materials mentioning features or use of this 22f29d8588Sjsing * software must display the following acknowledgment: 23f29d8588Sjsing * "This product includes software developed by the OpenSSL Project 24f29d8588Sjsing * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25f29d8588Sjsing * 26f29d8588Sjsing * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27f29d8588Sjsing * endorse or promote products derived from this software without 28f29d8588Sjsing * prior written permission. For written permission, please contact 29f29d8588Sjsing * licensing@OpenSSL.org. 30f29d8588Sjsing * 31f29d8588Sjsing * 5. Products derived from this software may not be called "OpenSSL" 32f29d8588Sjsing * nor may "OpenSSL" appear in their names without prior written 33f29d8588Sjsing * permission of the OpenSSL Project. 34f29d8588Sjsing * 35f29d8588Sjsing * 6. Redistributions of any form whatsoever must retain the following 36f29d8588Sjsing * acknowledgment: 37f29d8588Sjsing * "This product includes software developed by the OpenSSL Project 38f29d8588Sjsing * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39f29d8588Sjsing * 40f29d8588Sjsing * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41f29d8588Sjsing * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42f29d8588Sjsing * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43f29d8588Sjsing * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44f29d8588Sjsing * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45f29d8588Sjsing * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46f29d8588Sjsing * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47f29d8588Sjsing * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48f29d8588Sjsing * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49f29d8588Sjsing * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50f29d8588Sjsing * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51f29d8588Sjsing * OF THE POSSIBILITY OF SUCH DAMAGE. 52f29d8588Sjsing * ==================================================================== 53b8b016bfSjsing */ 54b8b016bfSjsing 55*c701dc03Stb #include <openssl/asn1.h> 56b8b016bfSjsing #include <openssl/cms.h> 57*c701dc03Stb #include <openssl/x509.h> 58*c701dc03Stb 59c9675a23Stb #include "cms_local.h" 60*c701dc03Stb #include "x509_local.h" 61b8b016bfSjsing 62b8b016bfSjsing /* CMS SignedData Attribute utilities */ 63b8b016bfSjsing 6472419cc7Sjsing int 6572419cc7Sjsing CMS_signed_get_attr_count(const CMS_SignerInfo *si) 66b8b016bfSjsing { 676018a687Stb return sk_X509_ATTRIBUTE_num(si->signedAttrs); 68b8b016bfSjsing } 69ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_get_attr_count); 70b8b016bfSjsing 7172419cc7Sjsing int 7272419cc7Sjsing CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, int lastpos) 73b8b016bfSjsing { 74b8b016bfSjsing return X509at_get_attr_by_NID(si->signedAttrs, nid, lastpos); 75b8b016bfSjsing } 76ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_get_attr_by_NID); 77b8b016bfSjsing 7872419cc7Sjsing int 7972419cc7Sjsing CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, const ASN1_OBJECT *obj, 80b8b016bfSjsing int lastpos) 81b8b016bfSjsing { 82b8b016bfSjsing return X509at_get_attr_by_OBJ(si->signedAttrs, obj, lastpos); 83b8b016bfSjsing } 84ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_get_attr_by_OBJ); 85b8b016bfSjsing 8672419cc7Sjsing X509_ATTRIBUTE * 8772419cc7Sjsing CMS_signed_get_attr(const CMS_SignerInfo *si, int loc) 88b8b016bfSjsing { 896018a687Stb return sk_X509_ATTRIBUTE_value(si->signedAttrs, loc); 90b8b016bfSjsing } 91ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_get_attr); 92b8b016bfSjsing 9372419cc7Sjsing X509_ATTRIBUTE * 9472419cc7Sjsing CMS_signed_delete_attr(CMS_SignerInfo *si, int loc) 95b8b016bfSjsing { 966018a687Stb return sk_X509_ATTRIBUTE_delete(si->signedAttrs, loc); 97b8b016bfSjsing } 98ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_delete_attr); 99b8b016bfSjsing 10072419cc7Sjsing int 10172419cc7Sjsing CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr) 102b8b016bfSjsing { 103b8b016bfSjsing if (X509at_add1_attr(&si->signedAttrs, attr)) 104b8b016bfSjsing return 1; 105b8b016bfSjsing return 0; 106b8b016bfSjsing } 107ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_add1_attr); 108b8b016bfSjsing 10972419cc7Sjsing int 11072419cc7Sjsing CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *obj, int type, 111b8b016bfSjsing const void *bytes, int len) 112b8b016bfSjsing { 113b8b016bfSjsing if (X509at_add1_attr_by_OBJ(&si->signedAttrs, obj, type, bytes, len)) 114b8b016bfSjsing return 1; 115b8b016bfSjsing return 0; 116b8b016bfSjsing } 117ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_add1_attr_by_OBJ); 118b8b016bfSjsing 11972419cc7Sjsing int 12072419cc7Sjsing CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, int nid, int type, 12172419cc7Sjsing const void *bytes, int len) 122b8b016bfSjsing { 123b8b016bfSjsing if (X509at_add1_attr_by_NID(&si->signedAttrs, nid, type, bytes, len)) 124b8b016bfSjsing return 1; 125b8b016bfSjsing return 0; 126b8b016bfSjsing } 127ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_add1_attr_by_NID); 128b8b016bfSjsing 12972419cc7Sjsing int 13072419cc7Sjsing CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, const char *attrname, int type, 131b8b016bfSjsing const void *bytes, int len) 132b8b016bfSjsing { 133b8b016bfSjsing if (X509at_add1_attr_by_txt(&si->signedAttrs, attrname, type, bytes, len)) 134b8b016bfSjsing return 1; 135b8b016bfSjsing return 0; 136b8b016bfSjsing } 137ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_add1_attr_by_txt); 138b8b016bfSjsing 13972419cc7Sjsing void * 14072419cc7Sjsing CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *oid, 141b8b016bfSjsing int lastpos, int type) 142b8b016bfSjsing { 143b8b016bfSjsing return X509at_get0_data_by_OBJ(si->signedAttrs, oid, lastpos, type); 144b8b016bfSjsing } 145ead8f799Sbeck LCRYPTO_ALIAS(CMS_signed_get0_data_by_OBJ); 146b8b016bfSjsing 14772419cc7Sjsing int 14872419cc7Sjsing CMS_unsigned_get_attr_count(const CMS_SignerInfo *si) 149b8b016bfSjsing { 1506018a687Stb return sk_X509_ATTRIBUTE_num(si->unsignedAttrs); 151b8b016bfSjsing } 152ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_get_attr_count); 153b8b016bfSjsing 15472419cc7Sjsing int 15572419cc7Sjsing CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, int lastpos) 156b8b016bfSjsing { 157b8b016bfSjsing return X509at_get_attr_by_NID(si->unsignedAttrs, nid, lastpos); 158b8b016bfSjsing } 159ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_get_attr_by_NID); 160b8b016bfSjsing 16172419cc7Sjsing int 16272419cc7Sjsing CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, const ASN1_OBJECT *obj, 16372419cc7Sjsing int lastpos) 164b8b016bfSjsing { 165b8b016bfSjsing return X509at_get_attr_by_OBJ(si->unsignedAttrs, obj, lastpos); 166b8b016bfSjsing } 167ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_get_attr_by_OBJ); 168b8b016bfSjsing 16972419cc7Sjsing X509_ATTRIBUTE * 17072419cc7Sjsing CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc) 171b8b016bfSjsing { 1726018a687Stb return sk_X509_ATTRIBUTE_value(si->unsignedAttrs, loc); 173b8b016bfSjsing } 174ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_get_attr); 175b8b016bfSjsing 17672419cc7Sjsing X509_ATTRIBUTE * 17772419cc7Sjsing CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc) 178b8b016bfSjsing { 1796018a687Stb return sk_X509_ATTRIBUTE_delete(si->unsignedAttrs, loc); 180b8b016bfSjsing } 181ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_delete_attr); 182b8b016bfSjsing 18372419cc7Sjsing int 18472419cc7Sjsing CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr) 185b8b016bfSjsing { 186b8b016bfSjsing if (X509at_add1_attr(&si->unsignedAttrs, attr)) 187b8b016bfSjsing return 1; 188b8b016bfSjsing return 0; 189b8b016bfSjsing } 190ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_add1_attr); 191b8b016bfSjsing 19272419cc7Sjsing int 19372419cc7Sjsing CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *obj, 19472419cc7Sjsing int type, const void *bytes, int len) 195b8b016bfSjsing { 196b8b016bfSjsing if (X509at_add1_attr_by_OBJ(&si->unsignedAttrs, obj, type, bytes, len)) 197b8b016bfSjsing return 1; 198b8b016bfSjsing return 0; 199b8b016bfSjsing } 200ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_add1_attr_by_OBJ); 201b8b016bfSjsing 20272419cc7Sjsing int 20372419cc7Sjsing CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, int nid, int type, 204b8b016bfSjsing const void *bytes, int len) 205b8b016bfSjsing { 206b8b016bfSjsing if (X509at_add1_attr_by_NID(&si->unsignedAttrs, nid, type, bytes, len)) 207b8b016bfSjsing return 1; 208b8b016bfSjsing return 0; 209b8b016bfSjsing } 210ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_add1_attr_by_NID); 211b8b016bfSjsing 21272419cc7Sjsing int 21372419cc7Sjsing CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, const char *attrname, 21472419cc7Sjsing int type, const void *bytes, int len) 215b8b016bfSjsing { 21672419cc7Sjsing if (X509at_add1_attr_by_txt(&si->unsignedAttrs, attrname, type, 21772419cc7Sjsing bytes, len)) 218b8b016bfSjsing return 1; 219b8b016bfSjsing return 0; 220b8b016bfSjsing } 221ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_add1_attr_by_txt); 222b8b016bfSjsing 22372419cc7Sjsing void * 22472419cc7Sjsing CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, int lastpos, 22572419cc7Sjsing int type) 226b8b016bfSjsing { 227b8b016bfSjsing return X509at_get0_data_by_OBJ(si->unsignedAttrs, oid, lastpos, type); 228b8b016bfSjsing } 229ead8f799Sbeck LCRYPTO_ALIAS(CMS_unsigned_get0_data_by_OBJ); 230b8b016bfSjsing 231b8b016bfSjsing /* Specific attribute cases */ 232