Copyright consolidation 04/10
[openssl.git] / crypto / pem / pem_lib.c
1 /*
2  * Copyright 1995-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 <ctype.h>
12 #include "internal/cryptlib.h"
13 #include <openssl/buffer.h>
14 #include <openssl/objects.h>
15 #include <openssl/evp.h>
16 #include <openssl/rand.h>
17 #include <openssl/x509.h>
18 #include <openssl/pem.h>
19 #include <openssl/pkcs12.h>
20 #include "internal/asn1_int.h"
21 #include <openssl/des.h>
22 #include <openssl/engine.h>
23
24 #define MIN_LENGTH      4
25
26 static int load_iv(char **fromp, unsigned char *to, int num);
27 static int check_pem(const char *nm, const char *name);
28 int pem_check_suffix(const char *pem_str, const char *suffix);
29
30 int PEM_def_callback(char *buf, int num, int w, void *key)
31 {
32 #if defined(OPENSSL_NO_STDIO) || defined(OPENSSL_NO_UI)
33     /*
34      * We should not ever call the default callback routine from windows.
35      */
36     PEMerr(PEM_F_PEM_DEF_CALLBACK, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
37     return (-1);
38 #else
39     int i, j;
40     const char *prompt;
41     if (key) {
42         i = strlen(key);
43         i = (i > num) ? num : i;
44         memcpy(buf, key, i);
45         return (i);
46     }
47
48     prompt = EVP_get_pw_prompt();
49     if (prompt == NULL)
50         prompt = "Enter PEM pass phrase:";
51
52     for (;;) {
53         /*
54          * We assume that w == 0 means decryption,
55          * while w == 1 means encryption
56          */
57         int min_len = w ? MIN_LENGTH : 0;
58
59         i = EVP_read_pw_string_min(buf, min_len, num, prompt, w);
60         if (i != 0) {
61             PEMerr(PEM_F_PEM_DEF_CALLBACK, PEM_R_PROBLEMS_GETTING_PASSWORD);
62             memset(buf, 0, (unsigned int)num);
63             return (-1);
64         }
65         j = strlen(buf);
66         if (min_len && j < min_len) {
67             fprintf(stderr,
68                     "phrase is too short, needs to be at least %d chars\n",
69                     min_len);
70         } else
71             break;
72     }
73     return (j);
74 #endif
75 }
76
77 void PEM_proc_type(char *buf, int type)
78 {
79     const char *str;
80
81     if (type == PEM_TYPE_ENCRYPTED)
82         str = "ENCRYPTED";
83     else if (type == PEM_TYPE_MIC_CLEAR)
84         str = "MIC-CLEAR";
85     else if (type == PEM_TYPE_MIC_ONLY)
86         str = "MIC-ONLY";
87     else
88         str = "BAD-TYPE";
89
90     OPENSSL_strlcat(buf, "Proc-Type: 4,", PEM_BUFSIZE);
91     OPENSSL_strlcat(buf, str, PEM_BUFSIZE);
92     OPENSSL_strlcat(buf, "\n", PEM_BUFSIZE);
93 }
94
95 void PEM_dek_info(char *buf, const char *type, int len, char *str)
96 {
97     static const unsigned char map[17] = "0123456789ABCDEF";
98     long i;
99     int j;
100
101     OPENSSL_strlcat(buf, "DEK-Info: ", PEM_BUFSIZE);
102     OPENSSL_strlcat(buf, type, PEM_BUFSIZE);
103     OPENSSL_strlcat(buf, ",", PEM_BUFSIZE);
104     j = strlen(buf);
105     if (j + (len * 2) + 1 > PEM_BUFSIZE)
106         return;
107     for (i = 0; i < len; i++) {
108         buf[j + i * 2] = map[(str[i] >> 4) & 0x0f];
109         buf[j + i * 2 + 1] = map[(str[i]) & 0x0f];
110     }
111     buf[j + i * 2] = '\n';
112     buf[j + i * 2 + 1] = '\0';
113 }
114
115 #ifndef OPENSSL_NO_STDIO
116 void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x,
117                     pem_password_cb *cb, void *u)
118 {
119     BIO *b;
120     void *ret;
121
122     if ((b = BIO_new(BIO_s_file())) == NULL) {
123         PEMerr(PEM_F_PEM_ASN1_READ, ERR_R_BUF_LIB);
124         return (0);
125     }
126     BIO_set_fp(b, fp, BIO_NOCLOSE);
127     ret = PEM_ASN1_read_bio(d2i, name, b, x, cb, u);
128     BIO_free(b);
129     return (ret);
130 }
131 #endif
132
133 static int check_pem(const char *nm, const char *name)
134 {
135     /* Normal matching nm and name */
136     if (strcmp(nm, name) == 0)
137         return 1;
138
139     /* Make PEM_STRING_EVP_PKEY match any private key */
140
141     if (strcmp(name, PEM_STRING_EVP_PKEY) == 0) {
142         int slen;
143         const EVP_PKEY_ASN1_METHOD *ameth;
144         if (strcmp(nm, PEM_STRING_PKCS8) == 0)
145             return 1;
146         if (strcmp(nm, PEM_STRING_PKCS8INF) == 0)
147             return 1;
148         slen = pem_check_suffix(nm, "PRIVATE KEY");
149         if (slen > 0) {
150             /*
151              * NB: ENGINE implementations wont contain a deprecated old
152              * private key decode function so don't look for them.
153              */
154             ameth = EVP_PKEY_asn1_find_str(NULL, nm, slen);
155             if (ameth && ameth->old_priv_decode)
156                 return 1;
157         }
158         return 0;
159     }
160
161     if (strcmp(name, PEM_STRING_PARAMETERS) == 0) {
162         int slen;
163         const EVP_PKEY_ASN1_METHOD *ameth;
164         slen = pem_check_suffix(nm, "PARAMETERS");
165         if (slen > 0) {
166             ENGINE *e;
167             ameth = EVP_PKEY_asn1_find_str(&e, nm, slen);
168             if (ameth) {
169                 int r;
170                 if (ameth->param_decode)
171                     r = 1;
172                 else
173                     r = 0;
174 #ifndef OPENSSL_NO_ENGINE
175                 ENGINE_finish(e);
176 #endif
177                 return r;
178             }
179         }
180         return 0;
181     }
182     /* If reading DH parameters handle X9.42 DH format too */
183     if (strcmp(nm, PEM_STRING_DHXPARAMS) == 0
184         && strcmp(name, PEM_STRING_DHPARAMS) == 0)
185         return 1;
186
187     /* Permit older strings */
188
189     if (strcmp(nm, PEM_STRING_X509_OLD) == 0
190         && strcmp(name, PEM_STRING_X509) == 0)
191         return 1;
192
193     if (strcmp(nm, PEM_STRING_X509_REQ_OLD) == 0
194         && strcmp(name, PEM_STRING_X509_REQ) == 0)
195         return 1;
196
197     /* Allow normal certs to be read as trusted certs */
198     if (strcmp(nm, PEM_STRING_X509) == 0
199         && strcmp(name, PEM_STRING_X509_TRUSTED) == 0)
200         return 1;
201
202     if (strcmp(nm, PEM_STRING_X509_OLD) == 0
203         && strcmp(name, PEM_STRING_X509_TRUSTED) == 0)
204         return 1;
205
206     /* Some CAs use PKCS#7 with CERTIFICATE headers */
207     if (strcmp(nm, PEM_STRING_X509) == 0
208         && strcmp(name, PEM_STRING_PKCS7) == 0)
209         return 1;
210
211     if (strcmp(nm, PEM_STRING_PKCS7_SIGNED) == 0
212         && strcmp(name, PEM_STRING_PKCS7) == 0)
213         return 1;
214
215 #ifndef OPENSSL_NO_CMS
216     if (strcmp(nm, PEM_STRING_X509) == 0
217         && strcmp(name, PEM_STRING_CMS) == 0)
218         return 1;
219     /* Allow CMS to be read from PKCS#7 headers */
220     if (strcmp(nm, PEM_STRING_PKCS7) == 0
221         && strcmp(name, PEM_STRING_CMS) == 0)
222         return 1;
223 #endif
224
225     return 0;
226 }
227
228 int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm,
229                        const char *name, BIO *bp, pem_password_cb *cb,
230                        void *u)
231 {
232     EVP_CIPHER_INFO cipher;
233     char *nm = NULL, *header = NULL;
234     unsigned char *data = NULL;
235     long len;
236     int ret = 0;
237
238     for (;;) {
239         if (!PEM_read_bio(bp, &nm, &header, &data, &len)) {
240             if (ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE)
241                 ERR_add_error_data(2, "Expecting: ", name);
242             return 0;
243         }
244         if (check_pem(nm, name))
245             break;
246         OPENSSL_free(nm);
247         OPENSSL_free(header);
248         OPENSSL_free(data);
249     }
250     if (!PEM_get_EVP_CIPHER_INFO(header, &cipher))
251         goto err;
252     if (!PEM_do_header(&cipher, data, &len, cb, u))
253         goto err;
254
255     *pdata = data;
256     *plen = len;
257
258     if (pnm)
259         *pnm = nm;
260
261     ret = 1;
262
263  err:
264     if (!ret || !pnm)
265         OPENSSL_free(nm);
266     OPENSSL_free(header);
267     if (!ret)
268         OPENSSL_free(data);
269     return ret;
270 }
271
272 #ifndef OPENSSL_NO_STDIO
273 int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp,
274                    void *x, const EVP_CIPHER *enc, unsigned char *kstr,
275                    int klen, pem_password_cb *callback, void *u)
276 {
277     BIO *b;
278     int ret;
279
280     if ((b = BIO_new(BIO_s_file())) == NULL) {
281         PEMerr(PEM_F_PEM_ASN1_WRITE, ERR_R_BUF_LIB);
282         return (0);
283     }
284     BIO_set_fp(b, fp, BIO_NOCLOSE);
285     ret = PEM_ASN1_write_bio(i2d, name, b, x, enc, kstr, klen, callback, u);
286     BIO_free(b);
287     return (ret);
288 }
289 #endif
290
291 int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp,
292                        void *x, const EVP_CIPHER *enc, unsigned char *kstr,
293                        int klen, pem_password_cb *callback, void *u)
294 {
295     EVP_CIPHER_CTX *ctx = NULL;
296     int dsize = 0, i = 0, j = 0, ret = 0;
297     unsigned char *p, *data = NULL;
298     const char *objstr = NULL;
299     char buf[PEM_BUFSIZE];
300     unsigned char key[EVP_MAX_KEY_LENGTH];
301     unsigned char iv[EVP_MAX_IV_LENGTH];
302
303     if (enc != NULL) {
304         objstr = OBJ_nid2sn(EVP_CIPHER_nid(enc));
305         if (objstr == NULL || EVP_CIPHER_iv_length(enc) == 0) {
306             PEMerr(PEM_F_PEM_ASN1_WRITE_BIO, PEM_R_UNSUPPORTED_CIPHER);
307             goto err;
308         }
309     }
310
311     if ((dsize = i2d(x, NULL)) < 0) {
312         PEMerr(PEM_F_PEM_ASN1_WRITE_BIO, ERR_R_ASN1_LIB);
313         dsize = 0;
314         goto err;
315     }
316     /* dzise + 8 bytes are needed */
317     /* actually it needs the cipher block size extra... */
318     data = OPENSSL_malloc((unsigned int)dsize + 20);
319     if (data == NULL) {
320         PEMerr(PEM_F_PEM_ASN1_WRITE_BIO, ERR_R_MALLOC_FAILURE);
321         goto err;
322     }
323     p = data;
324     i = i2d(x, &p);
325
326     if (enc != NULL) {
327         if (kstr == NULL) {
328             if (callback == NULL)
329                 klen = PEM_def_callback(buf, PEM_BUFSIZE, 1, u);
330             else
331                 klen = (*callback) (buf, PEM_BUFSIZE, 1, u);
332             if (klen <= 0) {
333                 PEMerr(PEM_F_PEM_ASN1_WRITE_BIO, PEM_R_READ_KEY);
334                 goto err;
335             }
336 #ifdef CHARSET_EBCDIC
337             /* Convert the pass phrase from EBCDIC */
338             ebcdic2ascii(buf, buf, klen);
339 #endif
340             kstr = (unsigned char *)buf;
341         }
342         RAND_add(data, i, 0);   /* put in the RSA key. */
343         OPENSSL_assert(EVP_CIPHER_iv_length(enc) <= (int)sizeof(iv));
344         if (RAND_bytes(iv, EVP_CIPHER_iv_length(enc)) <= 0) /* Generate a salt */
345             goto err;
346         /*
347          * The 'iv' is used as the iv and as a salt.  It is NOT taken from
348          * the BytesToKey function
349          */
350         if (!EVP_BytesToKey(enc, EVP_md5(), iv, kstr, klen, 1, key, NULL))
351             goto err;
352
353         if (kstr == (unsigned char *)buf)
354             OPENSSL_cleanse(buf, PEM_BUFSIZE);
355
356         OPENSSL_assert(strlen(objstr) + 23 + 2 * EVP_CIPHER_iv_length(enc) + 13
357                        <= sizeof buf);
358
359         buf[0] = '\0';
360         PEM_proc_type(buf, PEM_TYPE_ENCRYPTED);
361         PEM_dek_info(buf, objstr, EVP_CIPHER_iv_length(enc), (char *)iv);
362         /* k=strlen(buf); */
363
364         ret = 1;
365         if ((ctx = EVP_CIPHER_CTX_new()) == NULL
366             || !EVP_EncryptInit_ex(ctx, enc, NULL, key, iv)
367             || !EVP_EncryptUpdate(ctx, data, &j, data, i)
368             || !EVP_EncryptFinal_ex(ctx, &(data[j]), &i))
369             ret = 0;
370         if (ret == 0)
371             goto err;
372         i += j;
373     } else {
374         ret = 1;
375         buf[0] = '\0';
376     }
377     i = PEM_write_bio(bp, name, buf, data, i);
378     if (i <= 0)
379         ret = 0;
380  err:
381     OPENSSL_cleanse(key, sizeof(key));
382     OPENSSL_cleanse(iv, sizeof(iv));
383     EVP_CIPHER_CTX_free(ctx);
384     OPENSSL_cleanse(buf, PEM_BUFSIZE);
385     OPENSSL_clear_free(data, (unsigned int)dsize);
386     return (ret);
387 }
388
389 int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen,
390                   pem_password_cb *callback, void *u)
391 {
392     int i = 0, j, o, klen;
393     long len;
394     EVP_CIPHER_CTX *ctx;
395     unsigned char key[EVP_MAX_KEY_LENGTH];
396     char buf[PEM_BUFSIZE];
397
398     len = *plen;
399
400     if (cipher->cipher == NULL)
401         return (1);
402     if (callback == NULL)
403         klen = PEM_def_callback(buf, PEM_BUFSIZE, 0, u);
404     else
405         klen = callback(buf, PEM_BUFSIZE, 0, u);
406     if (klen <= 0) {
407         PEMerr(PEM_F_PEM_DO_HEADER, PEM_R_BAD_PASSWORD_READ);
408         return (0);
409     }
410 #ifdef CHARSET_EBCDIC
411     /* Convert the pass phrase from EBCDIC */
412     ebcdic2ascii(buf, buf, klen);
413 #endif
414
415     if (!EVP_BytesToKey(cipher->cipher, EVP_md5(), &(cipher->iv[0]),
416                         (unsigned char *)buf, klen, 1, key, NULL))
417         return 0;
418
419     j = (int)len;
420     ctx = EVP_CIPHER_CTX_new();
421     if (ctx == NULL)
422         return 0;
423     o = EVP_DecryptInit_ex(ctx, cipher->cipher, NULL, key, &(cipher->iv[0]));
424     if (o)
425         o = EVP_DecryptUpdate(ctx, data, &i, data, j);
426     if (o)
427         o = EVP_DecryptFinal_ex(ctx, &(data[i]), &j);
428     EVP_CIPHER_CTX_free(ctx);
429     OPENSSL_cleanse((char *)buf, sizeof(buf));
430     OPENSSL_cleanse((char *)key, sizeof(key));
431     if (o)
432         j += i;
433     else {
434         PEMerr(PEM_F_PEM_DO_HEADER, PEM_R_BAD_DECRYPT);
435         return (0);
436     }
437     *plen = j;
438     return (1);
439 }
440
441 int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher)
442 {
443     const EVP_CIPHER *enc = NULL;
444     char *dekinfostart, c;
445
446     cipher->cipher = NULL;
447     if ((header == NULL) || (*header == '\0') || (*header == '\n'))
448         return (1);
449     if (strncmp(header, "Proc-Type: ", 11) != 0) {
450         PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO, PEM_R_NOT_PROC_TYPE);
451         return (0);
452     }
453     header += 11;
454     if (*header != '4')
455         return (0);
456     header++;
457     if (*header != ',')
458         return (0);
459     header++;
460     if (strncmp(header, "ENCRYPTED", 9) != 0) {
461         PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO, PEM_R_NOT_ENCRYPTED);
462         return (0);
463     }
464     for (; (*header != '\n') && (*header != '\0'); header++) ;
465     if (*header == '\0') {
466         PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO, PEM_R_SHORT_HEADER);
467         return (0);
468     }
469     header++;
470     if (strncmp(header, "DEK-Info: ", 10) != 0) {
471         PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO, PEM_R_NOT_DEK_INFO);
472         return (0);
473     }
474     header += 10;
475
476     dekinfostart = header;
477     for (;;) {
478         c = *header;
479 #ifndef CHARSET_EBCDIC
480         if (!(((c >= 'A') && (c <= 'Z')) || (c == '-') ||
481               ((c >= '0') && (c <= '9'))))
482             break;
483 #else
484         if (!(isupper(c) || (c == '-') || isdigit(c)))
485             break;
486 #endif
487         header++;
488     }
489     *header = '\0';
490     cipher->cipher = enc = EVP_get_cipherbyname(dekinfostart);
491     *header++ = c;
492
493     if (enc == NULL) {
494         PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO, PEM_R_UNSUPPORTED_ENCRYPTION);
495         return (0);
496     }
497     if (!load_iv(&header, cipher->iv, EVP_CIPHER_iv_length(enc)))
498         return (0);
499
500     return (1);
501 }
502
503 static int load_iv(char **fromp, unsigned char *to, int num)
504 {
505     int v, i;
506     char *from;
507
508     from = *fromp;
509     for (i = 0; i < num; i++)
510         to[i] = 0;
511     num *= 2;
512     for (i = 0; i < num; i++) {
513         v = OPENSSL_hexchar2int(*from);
514         if (v < 0) {
515             PEMerr(PEM_F_LOAD_IV, PEM_R_BAD_IV_CHARS);
516             return (0);
517         }
518         from++;
519         to[i / 2] |= v << (long)((!(i & 1)) * 4);
520     }
521
522     *fromp = from;
523     return (1);
524 }
525
526 #ifndef OPENSSL_NO_STDIO
527 int PEM_write(FILE *fp, const char *name, const char *header,
528               const unsigned char *data, long len)
529 {
530     BIO *b;
531     int ret;
532
533     if ((b = BIO_new(BIO_s_file())) == NULL) {
534         PEMerr(PEM_F_PEM_WRITE, ERR_R_BUF_LIB);
535         return (0);
536     }
537     BIO_set_fp(b, fp, BIO_NOCLOSE);
538     ret = PEM_write_bio(b, name, header, data, len);
539     BIO_free(b);
540     return (ret);
541 }
542 #endif
543
544 int PEM_write_bio(BIO *bp, const char *name, const char *header,
545                   const unsigned char *data, long len)
546 {
547     int nlen, n, i, j, outl;
548     unsigned char *buf = NULL;
549     EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
550     int reason = ERR_R_BUF_LIB;
551
552     if (ctx == NULL) {
553         reason = ERR_R_MALLOC_FAILURE;
554         goto err;
555     }
556
557     EVP_EncodeInit(ctx);
558     nlen = strlen(name);
559
560     if ((BIO_write(bp, "-----BEGIN ", 11) != 11) ||
561         (BIO_write(bp, name, nlen) != nlen) ||
562         (BIO_write(bp, "-----\n", 6) != 6))
563         goto err;
564
565     i = strlen(header);
566     if (i > 0) {
567         if ((BIO_write(bp, header, i) != i) || (BIO_write(bp, "\n", 1) != 1))
568             goto err;
569     }
570
571     buf = OPENSSL_malloc(PEM_BUFSIZE * 8);
572     if (buf == NULL) {
573         reason = ERR_R_MALLOC_FAILURE;
574         goto err;
575     }
576
577     i = j = 0;
578     while (len > 0) {
579         n = (int)((len > (PEM_BUFSIZE * 5)) ? (PEM_BUFSIZE * 5) : len);
580         EVP_EncodeUpdate(ctx, buf, &outl, &(data[j]), n);
581         if ((outl) && (BIO_write(bp, (char *)buf, outl) != outl))
582             goto err;
583         i += outl;
584         len -= n;
585         j += n;
586     }
587     EVP_EncodeFinal(ctx, buf, &outl);
588     if ((outl > 0) && (BIO_write(bp, (char *)buf, outl) != outl))
589         goto err;
590     if ((BIO_write(bp, "-----END ", 9) != 9) ||
591         (BIO_write(bp, name, nlen) != nlen) ||
592         (BIO_write(bp, "-----\n", 6) != 6))
593         goto err;
594     OPENSSL_clear_free(buf, PEM_BUFSIZE * 8);
595     EVP_ENCODE_CTX_free(ctx);
596     return (i + outl);
597  err:
598     OPENSSL_clear_free(buf, PEM_BUFSIZE * 8);
599     EVP_ENCODE_CTX_free(ctx);
600     PEMerr(PEM_F_PEM_WRITE_BIO, reason);
601     return (0);
602 }
603
604 #ifndef OPENSSL_NO_STDIO
605 int PEM_read(FILE *fp, char **name, char **header, unsigned char **data,
606              long *len)
607 {
608     BIO *b;
609     int ret;
610
611     if ((b = BIO_new(BIO_s_file())) == NULL) {
612         PEMerr(PEM_F_PEM_READ, ERR_R_BUF_LIB);
613         return (0);
614     }
615     BIO_set_fp(b, fp, BIO_NOCLOSE);
616     ret = PEM_read_bio(b, name, header, data, len);
617     BIO_free(b);
618     return (ret);
619 }
620 #endif
621
622 int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data,
623                  long *len)
624 {
625     EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
626     int end = 0, i, k, bl = 0, hl = 0, nohead = 0;
627     char buf[256];
628     BUF_MEM *nameB;
629     BUF_MEM *headerB;
630     BUF_MEM *dataB, *tmpB;
631
632     if (ctx == NULL) {
633         PEMerr(PEM_F_PEM_READ_BIO, ERR_R_MALLOC_FAILURE);
634         return (0);
635     }
636
637     nameB = BUF_MEM_new();
638     headerB = BUF_MEM_new();
639     dataB = BUF_MEM_new();
640     if ((nameB == NULL) || (headerB == NULL) || (dataB == NULL)) {
641         goto err;
642     }
643
644     buf[254] = '\0';
645     for (;;) {
646         i = BIO_gets(bp, buf, 254);
647
648         if (i <= 0) {
649             PEMerr(PEM_F_PEM_READ_BIO, PEM_R_NO_START_LINE);
650             goto err;
651         }
652
653         while ((i >= 0) && (buf[i] <= ' '))
654             i--;
655         buf[++i] = '\n';
656         buf[++i] = '\0';
657
658         if (strncmp(buf, "-----BEGIN ", 11) == 0) {
659             i = strlen(&(buf[11]));
660
661             if (strncmp(&(buf[11 + i - 6]), "-----\n", 6) != 0)
662                 continue;
663             if (!BUF_MEM_grow(nameB, i + 9)) {
664                 PEMerr(PEM_F_PEM_READ_BIO, ERR_R_MALLOC_FAILURE);
665                 goto err;
666             }
667             memcpy(nameB->data, &(buf[11]), i - 6);
668             nameB->data[i - 6] = '\0';
669             break;
670         }
671     }
672     hl = 0;
673     if (!BUF_MEM_grow(headerB, 256)) {
674         PEMerr(PEM_F_PEM_READ_BIO, ERR_R_MALLOC_FAILURE);
675         goto err;
676     }
677     headerB->data[0] = '\0';
678     for (;;) {
679         i = BIO_gets(bp, buf, 254);
680         if (i <= 0)
681             break;
682
683         while ((i >= 0) && (buf[i] <= ' '))
684             i--;
685         buf[++i] = '\n';
686         buf[++i] = '\0';
687
688         if (buf[0] == '\n')
689             break;
690         if (!BUF_MEM_grow(headerB, hl + i + 9)) {
691             PEMerr(PEM_F_PEM_READ_BIO, ERR_R_MALLOC_FAILURE);
692             goto err;
693         }
694         if (strncmp(buf, "-----END ", 9) == 0) {
695             nohead = 1;
696             break;
697         }
698         memcpy(&(headerB->data[hl]), buf, i);
699         headerB->data[hl + i] = '\0';
700         hl += i;
701     }
702
703     bl = 0;
704     if (!BUF_MEM_grow(dataB, 1024)) {
705         PEMerr(PEM_F_PEM_READ_BIO, ERR_R_MALLOC_FAILURE);
706         goto err;
707     }
708     dataB->data[0] = '\0';
709     if (!nohead) {
710         for (;;) {
711             i = BIO_gets(bp, buf, 254);
712             if (i <= 0)
713                 break;
714
715             while ((i >= 0) && (buf[i] <= ' '))
716                 i--;
717             buf[++i] = '\n';
718             buf[++i] = '\0';
719
720             if (i != 65)
721                 end = 1;
722             if (strncmp(buf, "-----END ", 9) == 0)
723                 break;
724             if (i > 65)
725                 break;
726             if (!BUF_MEM_grow_clean(dataB, i + bl + 9)) {
727                 PEMerr(PEM_F_PEM_READ_BIO, ERR_R_MALLOC_FAILURE);
728                 goto err;
729             }
730             memcpy(&(dataB->data[bl]), buf, i);
731             dataB->data[bl + i] = '\0';
732             bl += i;
733             if (end) {
734                 buf[0] = '\0';
735                 i = BIO_gets(bp, buf, 254);
736                 if (i <= 0)
737                     break;
738
739                 while ((i >= 0) && (buf[i] <= ' '))
740                     i--;
741                 buf[++i] = '\n';
742                 buf[++i] = '\0';
743
744                 break;
745             }
746         }
747     } else {
748         tmpB = headerB;
749         headerB = dataB;
750         dataB = tmpB;
751         bl = hl;
752     }
753     i = strlen(nameB->data);
754     if ((strncmp(buf, "-----END ", 9) != 0) ||
755         (strncmp(nameB->data, &(buf[9]), i) != 0) ||
756         (strncmp(&(buf[9 + i]), "-----\n", 6) != 0)) {
757         PEMerr(PEM_F_PEM_READ_BIO, PEM_R_BAD_END_LINE);
758         goto err;
759     }
760
761     EVP_DecodeInit(ctx);
762     i = EVP_DecodeUpdate(ctx,
763                          (unsigned char *)dataB->data, &bl,
764                          (unsigned char *)dataB->data, bl);
765     if (i < 0) {
766         PEMerr(PEM_F_PEM_READ_BIO, PEM_R_BAD_BASE64_DECODE);
767         goto err;
768     }
769     i = EVP_DecodeFinal(ctx, (unsigned char *)&(dataB->data[bl]), &k);
770     if (i < 0) {
771         PEMerr(PEM_F_PEM_READ_BIO, PEM_R_BAD_BASE64_DECODE);
772         goto err;
773     }
774     bl += k;
775
776     if (bl == 0)
777         goto err;
778     *name = nameB->data;
779     *header = headerB->data;
780     *data = (unsigned char *)dataB->data;
781     *len = bl;
782     OPENSSL_free(nameB);
783     OPENSSL_free(headerB);
784     OPENSSL_free(dataB);
785     EVP_ENCODE_CTX_free(ctx);
786     return (1);
787  err:
788     BUF_MEM_free(nameB);
789     BUF_MEM_free(headerB);
790     BUF_MEM_free(dataB);
791     EVP_ENCODE_CTX_free(ctx);
792     return (0);
793 }
794
795 /*
796  * Check pem string and return prefix length. If for example the pem_str ==
797  * "RSA PRIVATE KEY" and suffix = "PRIVATE KEY" the return value is 3 for the
798  * string "RSA".
799  */
800
801 int pem_check_suffix(const char *pem_str, const char *suffix)
802 {
803     int pem_len = strlen(pem_str);
804     int suffix_len = strlen(suffix);
805     const char *p;
806     if (suffix_len + 1 >= pem_len)
807         return 0;
808     p = pem_str + pem_len - suffix_len;
809     if (strcmp(p, suffix))
810         return 0;
811     p--;
812     if (*p != ' ')
813         return 0;
814     return p - pem_str;
815 }