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 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 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 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 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 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 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 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 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 95 ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, 96 int attr_nid) 97 { 98 X509_ATTRIBUTE *attrib; 99 int i; 100 i = X509at_get_attr_by_NID(attrs, attr_nid, -1); 101 attrib = X509at_get_attr(attrs, i); 102 return X509_ATTRIBUTE_get0_type(attrib, 0); 103 } 104 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 117 const STACK_OF(X509_ATTRIBUTE) * 118 PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag) 119 { 120 return bag->attrib; 121 } 122