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 17int 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 29int 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 38int 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 48int 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 58int 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 68int 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 77int 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 86int 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 95ASN1_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 105char *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 117const STACK_OF(X509_ATTRIBUTE) * 118PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag) 119{ 120 return bag->attrib; 121} 122