xref: /openbsd-src/lib/libcrypto/cms/cms_att.c (revision c701dc035b6e1c3f81192022ebfce58e985bac65)
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