Copyright consolidation 09/10
[openssl.git] / crypto / pkcs12 / p12_sbag.c
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_lcl.h"
14
15 ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(PKCS12_SAFEBAG *bag, int attr_nid)
16 {
17     return PKCS12_get_attr_gen(bag->attrib, attr_nid);
18 }
19
20 ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid)
21 {
22     return PKCS12_get_attr_gen(PKCS8_pkey_get0_attrs(p8), attr_nid);
23 }
24
25 PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(PKCS12_SAFEBAG *bag)
26 {
27     if (PKCS12_SAFEBAG_get_nid(bag) != NID_keyBag)
28         return NULL;
29     return bag->value.keybag;
30 }
31
32 X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(PKCS12_SAFEBAG *bag)
33 {
34     if (OBJ_obj2nid(bag->type) != NID_pkcs8ShroudedKeyBag)
35         return NULL;
36     return bag->value.shkeybag;
37 }
38
39 STACK_OF(PKCS12_SAFEBAG) *PKCS12_SAFEBAG_get0_safes(PKCS12_SAFEBAG *bag)
40 {
41     if (OBJ_obj2nid(bag->type) != NID_safeContentsBag)
42         return NULL;
43     return bag->value.safes;
44 }
45
46 ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(PKCS12_SAFEBAG *bag)
47 {
48     return bag->type;
49 }
50
51 int PKCS12_SAFEBAG_get_nid(PKCS12_SAFEBAG *bag)
52 {
53     return OBJ_obj2nid(bag->type);
54 }
55
56 int PKCS12_SAFEBAG_get_bag_nid(PKCS12_SAFEBAG *bag)
57 {
58     int btype = PKCS12_SAFEBAG_get_nid(bag);
59
60     if (btype != NID_certBag && btype != NID_crlBag && btype != NID_secretBag)
61         return -1;
62     return OBJ_obj2nid(bag->value.bag->type);
63 }
64
65 X509 *PKCS12_SAFEBAG_get1_cert(PKCS12_SAFEBAG *bag)
66 {
67     if (PKCS12_SAFEBAG_get_nid(bag) != NID_certBag)
68         return NULL;
69     if (OBJ_obj2nid(bag->value.bag->type) != NID_x509Certificate)
70         return NULL;
71     return ASN1_item_unpack(bag->value.bag->value.octet,
72                             ASN1_ITEM_rptr(X509));
73 }
74
75 X509_CRL *PKCS12_SAFEBAG_get1_crl(PKCS12_SAFEBAG *bag)
76 {
77     if (PKCS12_SAFEBAG_get_nid(bag) != NID_crlBag)
78         return NULL;
79     if (OBJ_obj2nid(bag->value.bag->type) != NID_x509Crl)
80         return NULL;
81     return ASN1_item_unpack(bag->value.bag->value.octet,
82                             ASN1_ITEM_rptr(X509_CRL));
83 }
84
85 PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509)
86 {
87     return PKCS12_item_pack_safebag(x509, ASN1_ITEM_rptr(X509),
88                                     NID_x509Certificate, NID_certBag);
89 }
90
91 PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl)
92 {
93     return PKCS12_item_pack_safebag(crl, ASN1_ITEM_rptr(X509_CRL),
94                                     NID_x509Crl, NID_crlBag);
95 }
96
97 /* Turn PKCS8 object into a keybag */
98
99 PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8)
100 {
101     PKCS12_SAFEBAG *bag = PKCS12_SAFEBAG_new();
102
103     if (bag == NULL) {
104         PKCS12err(PKCS12_F_PKCS12_SAFEBAG_CREATE0_P8INF, ERR_R_MALLOC_FAILURE);
105         return NULL;
106     }
107     bag->type = OBJ_nid2obj(NID_keyBag);
108     bag->value.keybag = p8;
109     return bag;
110 }
111
112 /* Turn PKCS8 object into a shrouded keybag */
113
114 PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8)
115 {
116     PKCS12_SAFEBAG *bag = PKCS12_SAFEBAG_new();
117
118     /* Set up the safe bag */
119     if (bag == NULL) {
120         PKCS12err(PKCS12_F_PKCS12_SAFEBAG_CREATE0_PKCS8, ERR_R_MALLOC_FAILURE);
121         return NULL;
122     }
123     bag->type = OBJ_nid2obj(NID_pkcs8ShroudedKeyBag);
124     bag->value.shkeybag = p8;
125     return bag;
126 }
127
128 PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid,
129                                                     const char *pass,
130                                                     int passlen,
131                                                     unsigned char *salt,
132                                                     int saltlen, int iter,
133                                                     PKCS8_PRIV_KEY_INFO *p8inf)
134 {
135     PKCS12_SAFEBAG *bag;
136     const EVP_CIPHER *pbe_ciph;
137     X509_SIG *p8;
138
139     pbe_ciph = EVP_get_cipherbynid(pbe_nid);
140
141     if (pbe_ciph)
142         pbe_nid = -1;
143
144     p8 = PKCS8_encrypt(pbe_nid, pbe_ciph, pass, passlen, salt, saltlen, iter,
145                        p8inf);
146
147     if (p8 == NULL) {
148         PKCS12err(PKCS12_F_PKCS12_SAFEBAG_CREATE_PKCS8_ENCRYPT, ERR_R_MALLOC_FAILURE);
149         return NULL;
150     }
151
152     bag = PKCS12_SAFEBAG_create0_pkcs8(p8);
153
154     if (bag == NULL) {
155         PKCS12err(PKCS12_F_PKCS12_SAFEBAG_CREATE_PKCS8_ENCRYPT, ERR_R_MALLOC_FAILURE);
156         X509_SIG_free(p8);
157         return NULL;
158     }
159
160     return bag;
161 }