p12_attr.c 3.0 KB
Newer Older
1
/*
R
Rich Salz 已提交
2
 * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
R
Rich Salz 已提交
4 5 6 7
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * 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 16

/* Add a local keyid to a safebag */

17
int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name,
18
                          int namelen)
19
{
20 21 22 23 24
    if (X509at_add1_attr_by_NID(&bag->attrib, NID_localKeyID,
                                V_ASN1_OCTET_STRING, name, namelen))
        return 1;
    else
        return 0;
25 26 27 28
}

/* Add key usage to PKCS#8 structure */

29
int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage)
30
{
31 32 33
    unsigned char us_val = (unsigned char)usage;
    return PKCS8_pkey_add1_attr_by_NID(p8, NID_key_usage,
                                       V_ASN1_BIT_STRING, &us_val, 1);
34 35 36 37
}

/* Add a friendlyname to a safebag */

38
int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name,
39
                                int namelen)
40
{
41 42 43 44 45
    if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
                                MBSTRING_ASC, (unsigned char *)name, namelen))
        return 1;
    else
        return 0;
46 47
}

A
Andy Polyakov 已提交
48 49 50 51 52 53 54 55 56 57
int PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG *bag, const char *name,
                                int namelen)
{
    if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
                                MBSTRING_UTF8, (unsigned char *)name, namelen))
        return 1;
    else
        return 0;
}

58
int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag,
59
                                const unsigned char *name, int namelen)
60
{
61 62 63 64 65
    if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
                                MBSTRING_BMP, name, namelen))
        return 1;
    else
        return 0;
66 67
}

68
int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, int namelen)
69
{
70 71 72 73 74
    if (X509at_add1_attr_by_NID(&bag->attrib, NID_ms_csp_name,
                                MBSTRING_ASC, (unsigned char *)name, namelen))
        return 1;
    else
        return 0;
75 76
}

77 78
ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs,
                               int attr_nid)
79
{
80 81
    X509_ATTRIBUTE *attrib;
    int i;
D
Dr. Stephen Henson 已提交
82 83 84
    i = X509at_get_attr_by_NID(attrs, attr_nid, -1);
    attrib = X509at_get_attr(attrs, i);
    return X509_ATTRIBUTE_get0_type(attrib, 0);
85 86
}

U
Ulf Möller 已提交
87
char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag)
88
{
89
    const ASN1_TYPE *atype;
90

D
Dr. Stephen Henson 已提交
91
    if ((atype = PKCS12_SAFEBAG_get0_attr(bag, NID_friendlyName)) == NULL)
92 93 94
        return NULL;
    if (atype->type != V_ASN1_BMPSTRING)
        return NULL;
A
Andy Polyakov 已提交
95 96
    return OPENSSL_uni2utf8(atype->value.bmpstring->data,
                            atype->value.bmpstring->length);
97
}
D
Dr. Stephen Henson 已提交
98

99 100
const STACK_OF(X509_ATTRIBUTE) *
PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag)
D
Dr. Stephen Henson 已提交
101 102 103
{
    return bag->attrib;
}