summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pem/pem_info.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/pem/pem_info.c')
-rw-r--r--src/lib/libcrypto/pem/pem_info.c99
1 files changed, 49 insertions, 50 deletions
diff --git a/src/lib/libcrypto/pem/pem_info.c b/src/lib/libcrypto/pem/pem_info.c
index 4b69833b62..9a6dffb45c 100644
--- a/src/lib/libcrypto/pem/pem_info.c
+++ b/src/lib/libcrypto/pem/pem_info.c
@@ -58,20 +58,17 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "cryptlib.h" 60#include "cryptlib.h"
61#include "buffer.h" 61#include <openssl/buffer.h>
62#include "objects.h" 62#include <openssl/objects.h>
63#include "evp.h" 63#include <openssl/evp.h>
64#include "x509.h" 64#include <openssl/x509.h>
65#include "pem.h" 65#include <openssl/pem.h>
66 66
67#ifndef NO_FP_API 67#ifndef OPENSSL_NO_FP_API
68STACK *PEM_X509_INFO_read(fp,sk,cb) 68STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u)
69FILE *fp;
70STACK *sk;
71int (*cb)();
72 { 69 {
73 BIO *b; 70 BIO *b;
74 STACK *ret; 71 STACK_OF(X509_INFO) *ret;
75 72
76 if ((b=BIO_new(BIO_s_file())) == NULL) 73 if ((b=BIO_new(BIO_s_file())) == NULL)
77 { 74 {
@@ -79,29 +76,26 @@ int (*cb)();
79 return(0); 76 return(0);
80 } 77 }
81 BIO_set_fp(b,fp,BIO_NOCLOSE); 78 BIO_set_fp(b,fp,BIO_NOCLOSE);
82 ret=PEM_X509_INFO_read_bio(b,sk,cb); 79 ret=PEM_X509_INFO_read_bio(b,sk,cb,u);
83 BIO_free(b); 80 BIO_free(b);
84 return(ret); 81 return(ret);
85 } 82 }
86#endif 83#endif
87 84
88STACK *PEM_X509_INFO_read_bio(bp,sk,cb) 85STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u)
89BIO *bp;
90STACK *sk;
91int (*cb)();
92 { 86 {
93 X509_INFO *xi=NULL; 87 X509_INFO *xi=NULL;
94 char *name=NULL,*header=NULL,**pp; 88 char *name=NULL,*header=NULL,**pp;
95 unsigned char *data=NULL,*p; 89 unsigned char *data=NULL,*p;
96 long len,error=0; 90 long len,error=0;
97 int ok=0; 91 int ok=0;
98 STACK *ret=NULL; 92 STACK_OF(X509_INFO) *ret=NULL;
99 unsigned int i,raw; 93 unsigned int i,raw;
100 char *(*d2i)(); 94 char *(*d2i)();
101 95
102 if (sk == NULL) 96 if (sk == NULL)
103 { 97 {
104 if ((ret=sk_new_null()) == NULL) 98 if ((ret=sk_X509_INFO_new_null()) == NULL)
105 { 99 {
106 PEMerr(PEM_F_PEM_X509_INFO_READ_BIO,ERR_R_MALLOC_FAILURE); 100 PEMerr(PEM_F_PEM_X509_INFO_READ_BIO,ERR_R_MALLOC_FAILURE);
107 goto err; 101 goto err;
@@ -117,7 +111,7 @@ int (*cb)();
117 i=PEM_read_bio(bp,&name,&header,&data,&len); 111 i=PEM_read_bio(bp,&name,&header,&data,&len);
118 if (i == 0) 112 if (i == 0)
119 { 113 {
120 error=ERR_GET_REASON(ERR_peek_error()); 114 error=ERR_GET_REASON(ERR_peek_last_error());
121 if (error == PEM_R_NO_START_LINE) 115 if (error == PEM_R_NO_START_LINE)
122 { 116 {
123 ERR_clear_error(); 117 ERR_clear_error();
@@ -132,7 +126,18 @@ start:
132 d2i=(char *(*)())d2i_X509; 126 d2i=(char *(*)())d2i_X509;
133 if (xi->x509 != NULL) 127 if (xi->x509 != NULL)
134 { 128 {
135 if (!sk_push(ret,(char *)xi)) goto err; 129 if (!sk_X509_INFO_push(ret,xi)) goto err;
130 if ((xi=X509_INFO_new()) == NULL) goto err;
131 goto start;
132 }
133 pp=(char **)&(xi->x509);
134 }
135 else if ((strcmp(name,PEM_STRING_X509_TRUSTED) == 0))
136 {
137 d2i=(char *(*)())d2i_X509_AUX;
138 if (xi->x509 != NULL)
139 {
140 if (!sk_X509_INFO_push(ret,xi)) goto err;
136 if ((xi=X509_INFO_new()) == NULL) goto err; 141 if ((xi=X509_INFO_new()) == NULL) goto err;
137 goto start; 142 goto start;
138 } 143 }
@@ -143,20 +148,20 @@ start:
143 d2i=(char *(*)())d2i_X509_CRL; 148 d2i=(char *(*)())d2i_X509_CRL;
144 if (xi->crl != NULL) 149 if (xi->crl != NULL)
145 { 150 {
146 if (!sk_push(ret,(char *)xi)) goto err; 151 if (!sk_X509_INFO_push(ret,xi)) goto err;
147 if ((xi=X509_INFO_new()) == NULL) goto err; 152 if ((xi=X509_INFO_new()) == NULL) goto err;
148 goto start; 153 goto start;
149 } 154 }
150 pp=(char **)&(xi->crl); 155 pp=(char **)&(xi->crl);
151 } 156 }
152 else 157 else
153#ifndef NO_RSA 158#ifndef OPENSSL_NO_RSA
154 if (strcmp(name,PEM_STRING_RSA) == 0) 159 if (strcmp(name,PEM_STRING_RSA) == 0)
155 { 160 {
156 d2i=(char *(*)())d2i_RSAPrivateKey; 161 d2i=(char *(*)())d2i_RSAPrivateKey;
157 if (xi->x_pkey != NULL) 162 if (xi->x_pkey != NULL)
158 { 163 {
159 if (!sk_push(ret,(char *)xi)) goto err; 164 if (!sk_X509_INFO_push(ret,xi)) goto err;
160 if ((xi=X509_INFO_new()) == NULL) goto err; 165 if ((xi=X509_INFO_new()) == NULL) goto err;
161 goto start; 166 goto start;
162 } 167 }
@@ -174,13 +179,13 @@ start:
174 } 179 }
175 else 180 else
176#endif 181#endif
177#ifndef NO_DSA 182#ifndef OPENSSL_NO_DSA
178 if (strcmp(name,PEM_STRING_DSA) == 0) 183 if (strcmp(name,PEM_STRING_DSA) == 0)
179 { 184 {
180 d2i=(char *(*)())d2i_DSAPrivateKey; 185 d2i=(char *(*)())d2i_DSAPrivateKey;
181 if (xi->x_pkey != NULL) 186 if (xi->x_pkey != NULL)
182 { 187 {
183 if (!sk_push(ret,(char *)xi)) goto err; 188 if (!sk_X509_INFO_push(ret,xi)) goto err;
184 if ((xi=X509_INFO_new()) == NULL) goto err; 189 if ((xi=X509_INFO_new()) == NULL) goto err;
185 goto start; 190 goto start;
186 } 191 }
@@ -211,7 +216,7 @@ start:
211 216
212 if (!PEM_get_EVP_CIPHER_INFO(header,&cipher)) 217 if (!PEM_get_EVP_CIPHER_INFO(header,&cipher))
213 goto err; 218 goto err;
214 if (!PEM_do_header(&cipher,data,&len,cb)) 219 if (!PEM_do_header(&cipher,data,&len,cb,u))
215 goto err; 220 goto err;
216 p=data; 221 p=data;
217 if (d2i(pp,&p,len) == NULL) 222 if (d2i(pp,&p,len) == NULL)
@@ -232,9 +237,9 @@ start:
232 else { 237 else {
233 /* unknown */ 238 /* unknown */
234 } 239 }
235 if (name != NULL) Free(name); 240 if (name != NULL) OPENSSL_free(name);
236 if (header != NULL) Free(header); 241 if (header != NULL) OPENSSL_free(header);
237 if (data != NULL) Free(data); 242 if (data != NULL) OPENSSL_free(data);
238 name=NULL; 243 name=NULL;
239 header=NULL; 244 header=NULL;
240 data=NULL; 245 data=NULL;
@@ -246,7 +251,7 @@ start:
246 if ((xi->x509 != NULL) || (xi->crl != NULL) || 251 if ((xi->x509 != NULL) || (xi->crl != NULL) ||
247 (xi->x_pkey != NULL) || (xi->enc_data != NULL)) 252 (xi->x_pkey != NULL) || (xi->enc_data != NULL))
248 { 253 {
249 if (!sk_push(ret,(char *)xi)) goto err; 254 if (!sk_X509_INFO_push(ret,xi)) goto err;
250 xi=NULL; 255 xi=NULL;
251 } 256 }
252 ok=1; 257 ok=1;
@@ -254,36 +259,30 @@ err:
254 if (xi != NULL) X509_INFO_free(xi); 259 if (xi != NULL) X509_INFO_free(xi);
255 if (!ok) 260 if (!ok)
256 { 261 {
257 for (i=0; ((int)i)<sk_num(ret); i++) 262 for (i=0; ((int)i)<sk_X509_INFO_num(ret); i++)
258 { 263 {
259 xi=(X509_INFO *)sk_value(ret,i); 264 xi=sk_X509_INFO_value(ret,i);
260 X509_INFO_free(xi); 265 X509_INFO_free(xi);
261 } 266 }
262 if (ret != sk) sk_free(ret); 267 if (ret != sk) sk_X509_INFO_free(ret);
263 ret=NULL; 268 ret=NULL;
264 } 269 }
265 270
266 if (name != NULL) Free(name); 271 if (name != NULL) OPENSSL_free(name);
267 if (header != NULL) Free(header); 272 if (header != NULL) OPENSSL_free(header);
268 if (data != NULL) Free(data); 273 if (data != NULL) OPENSSL_free(data);
269 return(ret); 274 return(ret);
270 } 275 }
271 276
272 277
273/* A TJH addition */ 278/* A TJH addition */
274int PEM_X509_INFO_write_bio(bp,xi,enc,kstr,klen,cb) 279int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc,
275BIO *bp; 280 unsigned char *kstr, int klen, pem_password_cb *cb, void *u)
276X509_INFO *xi;
277EVP_CIPHER *enc;
278unsigned char *kstr;
279int klen;
280int (*cb)();
281 { 281 {
282 EVP_CIPHER_CTX ctx; 282 EVP_CIPHER_CTX ctx;
283 int i,ret=0; 283 int i,ret=0;
284 unsigned char *data=NULL; 284 unsigned char *data=NULL;
285 char *objstr=NULL; 285 const char *objstr=NULL;
286#define PEM_BUFSIZE 1024
287 char buf[PEM_BUFSIZE]; 286 char buf[PEM_BUFSIZE];
288 unsigned char *iv=NULL; 287 unsigned char *iv=NULL;
289 288
@@ -306,7 +305,7 @@ int (*cb)();
306 { 305 {
307 if ( (xi->enc_data!=NULL) && (xi->enc_len>0) ) 306 if ( (xi->enc_data!=NULL) && (xi->enc_len>0) )
308 { 307 {
309 /* copy from wierdo names into more normal things */ 308 /* copy from weirdo names into more normal things */
310 iv=xi->enc_cipher.iv; 309 iv=xi->enc_cipher.iv;
311 data=(unsigned char *)xi->enc_data; 310 data=(unsigned char *)xi->enc_data;
312 i=xi->enc_len; 311 i=xi->enc_len;
@@ -327,7 +326,7 @@ int (*cb)();
327 /* create the right magic header stuff */ 326 /* create the right magic header stuff */
328 buf[0]='\0'; 327 buf[0]='\0';
329 PEM_proc_type(buf,PEM_TYPE_ENCRYPTED); 328 PEM_proc_type(buf,PEM_TYPE_ENCRYPTED);
330 PEM_dek_info(buf,objstr,8,(char *)iv); 329 PEM_dek_info(buf,objstr,enc->iv_len,(char *)iv);
331 330
332 /* use the normal code to write things out */ 331 /* use the normal code to write things out */
333 i=PEM_write_bio(bp,PEM_STRING_RSA,buf,data,i); 332 i=PEM_write_bio(bp,PEM_STRING_RSA,buf,data,i);
@@ -336,18 +335,18 @@ int (*cb)();
336 else 335 else
337 { 336 {
338 /* Add DSA/DH */ 337 /* Add DSA/DH */
339#ifndef NO_RSA 338#ifndef OPENSSL_NO_RSA
340 /* normal optionally encrypted stuff */ 339 /* normal optionally encrypted stuff */
341 if (PEM_write_bio_RSAPrivateKey(bp, 340 if (PEM_write_bio_RSAPrivateKey(bp,
342 xi->x_pkey->dec_pkey->pkey.rsa, 341 xi->x_pkey->dec_pkey->pkey.rsa,
343 enc,kstr,klen,cb)<=0) 342 enc,kstr,klen,cb,u)<=0)
344 goto err; 343 goto err;
345#endif 344#endif
346 } 345 }
347 } 346 }
348 347
349 /* if we have a certificate then write it out now */ 348 /* if we have a certificate then write it out now */
350 if ((xi->x509 != NULL) || (PEM_write_bio_X509(bp,xi->x509) <= 0)) 349 if ((xi->x509 != NULL) && (PEM_write_bio_X509(bp,xi->x509) <= 0))
351 goto err; 350 goto err;
352 351
353 /* we are ignoring anything else that is loaded into the X509_INFO 352 /* we are ignoring anything else that is loaded into the X509_INFO