~ubuntu-branches/ubuntu/precise/openssl098/precise

« back to all changes in this revision

Viewing changes to crypto/pkcs12/p12_add.c

  • Committer: Bazaar Package Importer
  • Author(s): Kurt Roeckx
  • Date: 2011-03-23 19:50:31 UTC
  • Revision ID: james.westby@ubuntu.com-20110323195031-6h9crj4bymhhr8b8
Tags: upstream-0.9.8o
ImportĀ upstreamĀ versionĀ 0.9.8o

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* p12_add.c */
 
2
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 
3
 * project 1999.
 
4
 */
 
5
/* ====================================================================
 
6
 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 *
 
12
 * 1. Redistributions of source code must retain the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer. 
 
14
 *
 
15
 * 2. Redistributions in binary form must reproduce the above copyright
 
16
 *    notice, this list of conditions and the following disclaimer in
 
17
 *    the documentation and/or other materials provided with the
 
18
 *    distribution.
 
19
 *
 
20
 * 3. All advertising materials mentioning features or use of this
 
21
 *    software must display the following acknowledgment:
 
22
 *    "This product includes software developed by the OpenSSL Project
 
23
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 
24
 *
 
25
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 
26
 *    endorse or promote products derived from this software without
 
27
 *    prior written permission. For written permission, please contact
 
28
 *    licensing@OpenSSL.org.
 
29
 *
 
30
 * 5. Products derived from this software may not be called "OpenSSL"
 
31
 *    nor may "OpenSSL" appear in their names without prior written
 
32
 *    permission of the OpenSSL Project.
 
33
 *
 
34
 * 6. Redistributions of any form whatsoever must retain the following
 
35
 *    acknowledgment:
 
36
 *    "This product includes software developed by the OpenSSL Project
 
37
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 
38
 *
 
39
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 
40
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
41
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
42
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 
43
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
44
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
45
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
46
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
47
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
48
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
49
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 
50
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 
51
 * ====================================================================
 
52
 *
 
53
 * This product includes cryptographic software written by Eric Young
 
54
 * (eay@cryptsoft.com).  This product includes software written by Tim
 
55
 * Hudson (tjh@cryptsoft.com).
 
56
 *
 
57
 */
 
58
 
 
59
#include <stdio.h>
 
60
#include "cryptlib.h"
 
61
#include <openssl/pkcs12.h>
 
62
 
 
63
/* Pack an object into an OCTET STRING and turn into a safebag */
 
64
 
 
65
PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1,
 
66
             int nid2)
 
67
{
 
68
        PKCS12_BAGS *bag;
 
69
        PKCS12_SAFEBAG *safebag;
 
70
        if (!(bag = PKCS12_BAGS_new())) {
 
71
                PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
 
72
                return NULL;
 
73
        }
 
74
        bag->type = OBJ_nid2obj(nid1);
 
75
        if (!ASN1_item_pack(obj, it, &bag->value.octet)) {
 
76
                PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
 
77
                return NULL;
 
78
        }
 
79
        if (!(safebag = PKCS12_SAFEBAG_new())) {
 
80
                PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
 
81
                return NULL;
 
82
        }
 
83
        safebag->value.bag = bag;
 
84
        safebag->type = OBJ_nid2obj(nid2);
 
85
        return safebag;
 
86
}
 
87
 
 
88
/* Turn PKCS8 object into a keybag */
 
89
 
 
90
PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8)
 
91
{
 
92
        PKCS12_SAFEBAG *bag;
 
93
        if (!(bag = PKCS12_SAFEBAG_new())) {
 
94
                PKCS12err(PKCS12_F_PKCS12_MAKE_KEYBAG,ERR_R_MALLOC_FAILURE);
 
95
                return NULL;
 
96
        }
 
97
        bag->type = OBJ_nid2obj(NID_keyBag);
 
98
        bag->value.keybag = p8;
 
99
        return bag;
 
100
}
 
101
 
 
102
/* Turn PKCS8 object into a shrouded keybag */
 
103
 
 
104
PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass,
 
105
             int passlen, unsigned char *salt, int saltlen, int iter,
 
106
             PKCS8_PRIV_KEY_INFO *p8)
 
107
{
 
108
        PKCS12_SAFEBAG *bag;
 
109
 
 
110
        /* Set up the safe bag */
 
111
        if (!(bag = PKCS12_SAFEBAG_new())) {
 
112
                PKCS12err(PKCS12_F_PKCS12_MAKE_SHKEYBAG, ERR_R_MALLOC_FAILURE);
 
113
                return NULL;
 
114
        }
 
115
 
 
116
        bag->type = OBJ_nid2obj(NID_pkcs8ShroudedKeyBag);
 
117
        if (!(bag->value.shkeybag = 
 
118
          PKCS8_encrypt(pbe_nid, NULL, pass, passlen, salt, saltlen, iter,
 
119
                                                                         p8))) {
 
120
                PKCS12err(PKCS12_F_PKCS12_MAKE_SHKEYBAG, ERR_R_MALLOC_FAILURE);
 
121
                return NULL;
 
122
        }
 
123
 
 
124
        return bag;
 
125
}
 
126
 
 
127
/* Turn a stack of SAFEBAGS into a PKCS#7 data Contentinfo */
 
128
PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk)
 
129
{
 
130
        PKCS7 *p7;
 
131
        if (!(p7 = PKCS7_new())) {
 
132
                PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, ERR_R_MALLOC_FAILURE);
 
133
                return NULL;
 
134
        }
 
135
        p7->type = OBJ_nid2obj(NID_pkcs7_data);
 
136
        if (!(p7->d.data = M_ASN1_OCTET_STRING_new())) {
 
137
                PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, ERR_R_MALLOC_FAILURE);
 
138
                return NULL;
 
139
        }
 
140
        
 
141
        if (!ASN1_item_pack(sk, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), &p7->d.data)) {
 
142
                PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, PKCS12_R_CANT_PACK_STRUCTURE);
 
143
                return NULL;
 
144
        }
 
145
        return p7;
 
146
}
 
147
 
 
148
/* Unpack SAFEBAGS from PKCS#7 data ContentInfo */
 
149
STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7)
 
150
{
 
151
        if(!PKCS7_type_is_data(p7))
 
152
                {
 
153
                PKCS12err(PKCS12_F_PKCS12_UNPACK_P7DATA,PKCS12_R_CONTENT_TYPE_NOT_DATA);
 
154
                return NULL;
 
155
                }
 
156
        return ASN1_item_unpack(p7->d.data, ASN1_ITEM_rptr(PKCS12_SAFEBAGS));
 
157
}
 
158
 
 
159
/* Turn a stack of SAFEBAGS into a PKCS#7 encrypted data ContentInfo */
 
160
 
 
161
PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
 
162
                              unsigned char *salt, int saltlen, int iter,
 
163
                              STACK_OF(PKCS12_SAFEBAG) *bags)
 
164
{
 
165
        PKCS7 *p7;
 
166
        X509_ALGOR *pbe;
 
167
        if (!(p7 = PKCS7_new())) {
 
168
                PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, ERR_R_MALLOC_FAILURE);
 
169
                return NULL;
 
170
        }
 
171
        if(!PKCS7_set_type(p7, NID_pkcs7_encrypted)) {
 
172
                PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA,
 
173
                                PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE);
 
174
                return NULL;
 
175
        }
 
176
        if (!(pbe = PKCS5_pbe_set(pbe_nid, iter, salt, saltlen))) {
 
177
                PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, ERR_R_MALLOC_FAILURE);
 
178
                return NULL;
 
179
        }
 
180
        X509_ALGOR_free(p7->d.encrypted->enc_data->algorithm);
 
181
        p7->d.encrypted->enc_data->algorithm = pbe;
 
182
        M_ASN1_OCTET_STRING_free(p7->d.encrypted->enc_data->enc_data);
 
183
        if (!(p7->d.encrypted->enc_data->enc_data =
 
184
        PKCS12_item_i2d_encrypt(pbe, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), pass, passlen,
 
185
                                 bags, 1))) {
 
186
                PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, PKCS12_R_ENCRYPT_ERROR);
 
187
                return NULL;
 
188
        }
 
189
 
 
190
        return p7;
 
191
}
 
192
 
 
193
STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, int passlen)
 
194
{
 
195
        if(!PKCS7_type_is_encrypted(p7)) return NULL;
 
196
        return PKCS12_item_decrypt_d2i(p7->d.encrypted->enc_data->algorithm,
 
197
                                   ASN1_ITEM_rptr(PKCS12_SAFEBAGS),
 
198
                                   pass, passlen,
 
199
                                   p7->d.encrypted->enc_data->enc_data, 1);
 
200
}
 
201
 
 
202
PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, const char *pass,
 
203
                                                                int passlen)
 
204
{
 
205
        return PKCS8_decrypt(bag->value.shkeybag, pass, passlen);
 
206
}
 
207
 
 
208
int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes) 
 
209
{
 
210
        if(ASN1_item_pack(safes, ASN1_ITEM_rptr(PKCS12_AUTHSAFES),
 
211
                &p12->authsafes->d.data)) 
 
212
                        return 1;
 
213
        return 0;
 
214
}
 
215
 
 
216
STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12)
 
217
{
 
218
        if (!PKCS7_type_is_data(p12->authsafes))
 
219
                {
 
220
                PKCS12err(PKCS12_F_PKCS12_UNPACK_AUTHSAFES,PKCS12_R_CONTENT_TYPE_NOT_DATA);
 
221
                return NULL;
 
222
                }
 
223
        return ASN1_item_unpack(p12->authsafes->d.data, ASN1_ITEM_rptr(PKCS12_AUTHSAFES));
 
224
}