xref: /openbsd-src/lib/libcrypto/pkcs12/p12_attr.c (revision bd899a8c06a5c4b14db190e06ae43edc60740d18)
1*bd899a8cStb /* $OpenBSD: p12_attr.c,v 1.21 2024/03/24 06:48:03 tb Exp $ */
2e6841c1dSdjm /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
37695d5a3Sbeck  * project 1999.
47695d5a3Sbeck  */
57695d5a3Sbeck /* ====================================================================
67695d5a3Sbeck  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
77695d5a3Sbeck  *
87695d5a3Sbeck  * Redistribution and use in source and binary forms, with or without
97695d5a3Sbeck  * modification, are permitted provided that the following conditions
107695d5a3Sbeck  * are met:
117695d5a3Sbeck  *
127695d5a3Sbeck  * 1. Redistributions of source code must retain the above copyright
137695d5a3Sbeck  *    notice, this list of conditions and the following disclaimer.
147695d5a3Sbeck  *
157695d5a3Sbeck  * 2. Redistributions in binary form must reproduce the above copyright
167695d5a3Sbeck  *    notice, this list of conditions and the following disclaimer in
177695d5a3Sbeck  *    the documentation and/or other materials provided with the
187695d5a3Sbeck  *    distribution.
197695d5a3Sbeck  *
207695d5a3Sbeck  * 3. All advertising materials mentioning features or use of this
217695d5a3Sbeck  *    software must display the following acknowledgment:
227695d5a3Sbeck  *    "This product includes software developed by the OpenSSL Project
237695d5a3Sbeck  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
247695d5a3Sbeck  *
257695d5a3Sbeck  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
267695d5a3Sbeck  *    endorse or promote products derived from this software without
277695d5a3Sbeck  *    prior written permission. For written permission, please contact
287695d5a3Sbeck  *    licensing@OpenSSL.org.
297695d5a3Sbeck  *
307695d5a3Sbeck  * 5. Products derived from this software may not be called "OpenSSL"
317695d5a3Sbeck  *    nor may "OpenSSL" appear in their names without prior written
327695d5a3Sbeck  *    permission of the OpenSSL Project.
337695d5a3Sbeck  *
347695d5a3Sbeck  * 6. Redistributions of any form whatsoever must retain the following
357695d5a3Sbeck  *    acknowledgment:
367695d5a3Sbeck  *    "This product includes software developed by the OpenSSL Project
377695d5a3Sbeck  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
387695d5a3Sbeck  *
397695d5a3Sbeck  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
407695d5a3Sbeck  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
417695d5a3Sbeck  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
427695d5a3Sbeck  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
437695d5a3Sbeck  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
447695d5a3Sbeck  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
457695d5a3Sbeck  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
467695d5a3Sbeck  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
477695d5a3Sbeck  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
487695d5a3Sbeck  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
497695d5a3Sbeck  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
507695d5a3Sbeck  * OF THE POSSIBILITY OF SUCH DAMAGE.
517695d5a3Sbeck  * ====================================================================
527695d5a3Sbeck  *
537695d5a3Sbeck  * This product includes cryptographic software written by Eric Young
547695d5a3Sbeck  * (eay@cryptsoft.com).  This product includes software written by Tim
557695d5a3Sbeck  * Hudson (tjh@cryptsoft.com).
567695d5a3Sbeck  *
577695d5a3Sbeck  */
587695d5a3Sbeck 
597695d5a3Sbeck #include <stdio.h>
60b6ab114eSjsing 
617695d5a3Sbeck #include <openssl/pkcs12.h>
627695d5a3Sbeck 
63e4978644Stb #include "pkcs12_local.h"
64c9675a23Stb #include "x509_local.h"
65838f0b6dStb 
667695d5a3Sbeck /* Add a local keyid to a safebag */
677695d5a3Sbeck 
68d2af6916Sjsing int
PKCS12_add_localkeyid(PKCS12_SAFEBAG * bag,unsigned char * name,int namelen)69d2af6916Sjsing PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen)
707695d5a3Sbeck {
71da347917Sbeck 	if (X509at_add1_attr_by_NID(&bag->attrib, NID_localKeyID,
72da347917Sbeck 	    V_ASN1_OCTET_STRING, name, namelen))
737695d5a3Sbeck 		return 1;
74da347917Sbeck 	else
75da347917Sbeck 		return 0;
767695d5a3Sbeck }
777695d5a3Sbeck 
787695d5a3Sbeck /* Add key usage to PKCS#8 structure */
797695d5a3Sbeck 
80d2af6916Sjsing int
PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO * p8,int usage)81d2af6916Sjsing PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage)
827695d5a3Sbeck {
83e4a8fc54Stb 	unsigned char us_val = (unsigned char)usage;
84d2af6916Sjsing 
85e4a8fc54Stb 	return PKCS8_pkey_add1_attr_by_NID(p8, NID_key_usage, V_ASN1_BIT_STRING,
86e4a8fc54Stb 	    &us_val, 1);
877695d5a3Sbeck }
88cedac418Stb LCRYPTO_ALIAS(PKCS8_add_keyusage);
897695d5a3Sbeck 
907695d5a3Sbeck /* Add a friendlyname to a safebag */
917695d5a3Sbeck 
92d2af6916Sjsing int
PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG * bag,const char * name,int namelen)93d2af6916Sjsing PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, int namelen)
947695d5a3Sbeck {
95da347917Sbeck 	if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
96da347917Sbeck 	    MBSTRING_ASC, (unsigned char *)name, namelen))
97da347917Sbeck 		return 1;
98da347917Sbeck 	else
997695d5a3Sbeck 		return 0;
1007695d5a3Sbeck }
1017695d5a3Sbeck 
102d2af6916Sjsing int
PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG * bag,const unsigned char * name,int namelen)103d2af6916Sjsing PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, const unsigned char *name,
104d2af6916Sjsing     int namelen)
1057695d5a3Sbeck {
106da347917Sbeck 	if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
107da347917Sbeck 	    MBSTRING_BMP, name, namelen))
108da347917Sbeck 		return 1;
109da347917Sbeck 	else
1107695d5a3Sbeck 		return 0;
1117695d5a3Sbeck }
112da347917Sbeck 
113d2af6916Sjsing int
PKCS12_add_CSPName_asc(PKCS12_SAFEBAG * bag,const char * name,int namelen)114d2af6916Sjsing PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, int namelen)
115da347917Sbeck {
116da347917Sbeck 	if (X509at_add1_attr_by_NID(&bag->attrib, NID_ms_csp_name,
117da347917Sbeck 	    MBSTRING_ASC, (unsigned char *)name, namelen))
118da347917Sbeck 		return 1;
119da347917Sbeck 	else
1207695d5a3Sbeck 		return 0;
1217695d5a3Sbeck }
1227695d5a3Sbeck 
123d2af6916Sjsing ASN1_TYPE *
PKCS12_get_attr_gen(const STACK_OF (X509_ATTRIBUTE)* attrs,int attr_nid)12428836fe3Stb PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid)
1257695d5a3Sbeck {
1267695d5a3Sbeck 	X509_ATTRIBUTE *attrib;
1277695d5a3Sbeck 	int i;
128d2af6916Sjsing 
129d2af6916Sjsing 	if (!attrs)
130d2af6916Sjsing 		return NULL;
1317695d5a3Sbeck 	for (i = 0; i < sk_X509_ATTRIBUTE_num(attrs); i++) {
1327695d5a3Sbeck 		attrib = sk_X509_ATTRIBUTE_value(attrs, i);
133ab72b8b8Sjsing 		if (OBJ_obj2nid(attrib->object) == attr_nid)
134ab72b8b8Sjsing 			return sk_ASN1_TYPE_value(attrib->set, 0);
1357695d5a3Sbeck 	}
1367695d5a3Sbeck 	return NULL;
1377695d5a3Sbeck }
1387695d5a3Sbeck 
139d2af6916Sjsing char *
PKCS12_get_friendlyname(PKCS12_SAFEBAG * bag)140d2af6916Sjsing PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag)
1417695d5a3Sbeck {
142b9c7d6b6Stb 	const ASN1_TYPE *atype;
143d2af6916Sjsing 
144b9c7d6b6Stb 	if (!(atype = PKCS12_SAFEBAG_get0_attr(bag, NID_friendlyName)))
145d2af6916Sjsing 		return NULL;
146d2af6916Sjsing 	if (atype->type != V_ASN1_BMPSTRING)
147d2af6916Sjsing 		return NULL;
1480a5d6edeSdjm 	return OPENSSL_uni2asc(atype->value.bmpstring->data,
1497695d5a3Sbeck 	    atype->value.bmpstring->length);
1507695d5a3Sbeck }
151cedac418Stb LCRYPTO_ALIAS(PKCS12_get_friendlyname);
152b9c7d6b6Stb 
STACK_OF(X509_ATTRIBUTE)153b9c7d6b6Stb const STACK_OF(X509_ATTRIBUTE) *
154b9c7d6b6Stb PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag)
155b9c7d6b6Stb {
156b9c7d6b6Stb 	return bag->attrib;
157b9c7d6b6Stb }
158cedac418Stb LCRYPTO_ALIAS(PKCS12_SAFEBAG_get0_attrs);
159