xref: /openssl/crypto/pkcs12/p12_attr.c (revision 9eaf07ff)
1 /*
2  * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #include <stdio.h>
11 #include "internal/cryptlib.h"
12 #include <openssl/pkcs12.h>
13 #include "p12_local.h"
14 
15 /* Add a local keyid to a safebag */
16 
PKCS12_add_localkeyid(PKCS12_SAFEBAG * bag,unsigned char * name,int namelen)17 int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name,
18                           int namelen)
19 {
20     if (X509at_add1_attr_by_NID(&bag->attrib, NID_localKeyID,
21                                 V_ASN1_OCTET_STRING, name, namelen) != NULL)
22         return 1;
23     else
24         return 0;
25 }
26 
27 /* Add key usage to PKCS#8 structure */
28 
PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO * p8,int usage)29 int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage)
30 {
31     unsigned char us_val = (unsigned char)usage;
32     return PKCS8_pkey_add1_attr_by_NID(p8, NID_key_usage,
33                                        V_ASN1_BIT_STRING, &us_val, 1);
34 }
35 
36 /* Add a friendlyname to a safebag */
37 
PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG * bag,const char * name,int namelen)38 int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name,
39                                 int namelen)
40 {
41     if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
42                                 MBSTRING_ASC, (unsigned char *)name, namelen) != NULL)
43         return 1;
44     else
45         return 0;
46 }
47 
PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG * bag,const char * name,int namelen)48 int PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG *bag, const char *name,
49                                 int namelen)
50 {
51     if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
52                                 MBSTRING_UTF8, (unsigned char *)name, namelen) != NULL)
53         return 1;
54     else
55         return 0;
56 }
57 
PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG * bag,const unsigned char * name,int namelen)58 int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag,
59                                 const unsigned char *name, int namelen)
60 {
61     if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
62                                 MBSTRING_BMP, name, namelen) != NULL)
63         return 1;
64     else
65         return 0;
66 }
67 
PKCS12_add_CSPName_asc(PKCS12_SAFEBAG * bag,const char * name,int namelen)68 int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, int namelen)
69 {
70     if (X509at_add1_attr_by_NID(&bag->attrib, NID_ms_csp_name,
71                                 MBSTRING_ASC, (unsigned char *)name, namelen) != NULL)
72         return 1;
73     else
74         return 0;
75 }
76 
PKCS12_add1_attr_by_NID(PKCS12_SAFEBAG * bag,int nid,int type,const unsigned char * bytes,int len)77 int PKCS12_add1_attr_by_NID(PKCS12_SAFEBAG *bag, int nid, int type,
78                             const unsigned char *bytes, int len)
79 {
80     if (X509at_add1_attr_by_NID(&bag->attrib, nid, type, bytes, len) != NULL)
81         return 1;
82     else
83         return 0;
84 }
85 
PKCS12_add1_attr_by_txt(PKCS12_SAFEBAG * bag,const char * attrname,int type,const unsigned char * bytes,int len)86 int PKCS12_add1_attr_by_txt(PKCS12_SAFEBAG *bag, const char *attrname, int type,
87                             const unsigned char *bytes, int len)
88 {
89     if (X509at_add1_attr_by_txt(&bag->attrib, attrname, type, bytes, len) != NULL)
90         return 1;
91     else
92         return 0;
93 }
94 
PKCS12_get_attr_gen(const STACK_OF (X509_ATTRIBUTE)* attrs,int attr_nid)95 ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs,
96                                int attr_nid)
97 {
98     int i = X509at_get_attr_by_NID(attrs, attr_nid, -1);
99 
100     if (i < 0)
101         return NULL;
102     return X509_ATTRIBUTE_get0_type(X509at_get_attr(attrs, i), 0);
103 }
104 
PKCS12_get_friendlyname(PKCS12_SAFEBAG * bag)105 char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag)
106 {
107     const ASN1_TYPE *atype;
108 
109     if ((atype = PKCS12_SAFEBAG_get0_attr(bag, NID_friendlyName)) == NULL)
110         return NULL;
111     if (atype->type != V_ASN1_BMPSTRING)
112         return NULL;
113     return OPENSSL_uni2utf8(atype->value.bmpstring->data,
114                             atype->value.bmpstring->length);
115 }
116 
STACK_OF(X509_ATTRIBUTE)117 const STACK_OF(X509_ATTRIBUTE) *
118 PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag)
119 {
120     return bag->attrib;
121 }
122 
PKCS12_SAFEBAG_set0_attrs(PKCS12_SAFEBAG * bag,STACK_OF (X509_ATTRIBUTE)* attrs)123 void PKCS12_SAFEBAG_set0_attrs(PKCS12_SAFEBAG *bag, STACK_OF(X509_ATTRIBUTE) *attrs)
124 {
125     if (bag->attrib != attrs)
126        sk_X509_ATTRIBUTE_free(bag->attrib);
127 
128     bag->attrib = attrs;
129 }
130