• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (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))
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))
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))
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))
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))
72         return 1;
73     else
74         return 0;
75 }
76 
PKCS12_get_attr_gen(const STACK_OF (X509_ATTRIBUTE)* attrs,int attr_nid)77 ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs,
78                                int attr_nid)
79 {
80     X509_ATTRIBUTE *attrib;
81     int i;
82     i = X509at_get_attr_by_NID(attrs, attr_nid, -1);
83     attrib = X509at_get_attr(attrs, i);
84     return X509_ATTRIBUTE_get0_type(attrib, 0);
85 }
86 
PKCS12_get_friendlyname(PKCS12_SAFEBAG * bag)87 char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag)
88 {
89     const ASN1_TYPE *atype;
90 
91     if ((atype = PKCS12_SAFEBAG_get0_attr(bag, NID_friendlyName)) == NULL)
92         return NULL;
93     if (atype->type != V_ASN1_BMPSTRING)
94         return NULL;
95     return OPENSSL_uni2utf8(atype->value.bmpstring->data,
96                             atype->value.bmpstring->length);
97 }
98 
STACK_OF(X509_ATTRIBUTE)99 const STACK_OF(X509_ATTRIBUTE) *
100 PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag)
101 {
102     return bag->attrib;
103 }
104