Fix return values when adding serverinfo fails.
[openssl.git] / ssl / ssl_rsa.c
1 /* ssl/ssl_rsa.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58
59 #include <stdio.h>
60 #include "ssl_locl.h"
61 #include <openssl/bio.h>
62 #include <openssl/objects.h>
63 #include <openssl/evp.h>
64 #include <openssl/x509.h>
65 #include <openssl/pem.h>
66
67 static int ssl_set_cert(CERT *c, X509 *x509);
68 static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey);
69 int SSL_use_certificate(SSL *ssl, X509 *x)
70 {
71     if (x == NULL) {
72         SSLerr(SSL_F_SSL_USE_CERTIFICATE, ERR_R_PASSED_NULL_PARAMETER);
73         return (0);
74     }
75     if (!ssl_cert_inst(&ssl->cert)) {
76         SSLerr(SSL_F_SSL_USE_CERTIFICATE, ERR_R_MALLOC_FAILURE);
77         return (0);
78     }
79     return (ssl_set_cert(ssl->cert, x));
80 }
81
82 #ifndef OPENSSL_NO_STDIO
83 int SSL_use_certificate_file(SSL *ssl, const char *file, int type)
84 {
85     int j;
86     BIO *in;
87     int ret = 0;
88     X509 *x = NULL;
89
90     in = BIO_new(BIO_s_file_internal());
91     if (in == NULL) {
92         SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE, ERR_R_BUF_LIB);
93         goto end;
94     }
95
96     if (BIO_read_filename(in, file) <= 0) {
97         SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE, ERR_R_SYS_LIB);
98         goto end;
99     }
100     if (type == SSL_FILETYPE_ASN1) {
101         j = ERR_R_ASN1_LIB;
102         x = d2i_X509_bio(in, NULL);
103     } else if (type == SSL_FILETYPE_PEM) {
104         j = ERR_R_PEM_LIB;
105         x = PEM_read_bio_X509(in, NULL, ssl->ctx->default_passwd_callback,
106                               ssl->ctx->default_passwd_callback_userdata);
107     } else {
108         SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE, SSL_R_BAD_SSL_FILETYPE);
109         goto end;
110     }
111
112     if (x == NULL) {
113         SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE, j);
114         goto end;
115     }
116
117     ret = SSL_use_certificate(ssl, x);
118  end:
119     if (x != NULL)
120         X509_free(x);
121     if (in != NULL)
122         BIO_free(in);
123     return (ret);
124 }
125 #endif
126
127 int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len)
128 {
129     X509 *x;
130     int ret;
131
132     x = d2i_X509(NULL, &d, (long)len);
133     if (x == NULL) {
134         SSLerr(SSL_F_SSL_USE_CERTIFICATE_ASN1, ERR_R_ASN1_LIB);
135         return (0);
136     }
137
138     ret = SSL_use_certificate(ssl, x);
139     X509_free(x);
140     return (ret);
141 }
142
143 #ifndef OPENSSL_NO_RSA
144 int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa)
145 {
146     EVP_PKEY *pkey;
147     int ret;
148
149     if (rsa == NULL) {
150         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY, ERR_R_PASSED_NULL_PARAMETER);
151         return (0);
152     }
153     if (!ssl_cert_inst(&ssl->cert)) {
154         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY, ERR_R_MALLOC_FAILURE);
155         return (0);
156     }
157     if ((pkey = EVP_PKEY_new()) == NULL) {
158         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY, ERR_R_EVP_LIB);
159         return (0);
160     }
161
162     RSA_up_ref(rsa);
163     EVP_PKEY_assign_RSA(pkey, rsa);
164
165     ret = ssl_set_pkey(ssl->cert, pkey);
166     EVP_PKEY_free(pkey);
167     return (ret);
168 }
169 #endif
170
171 static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
172 {
173     int i;
174     /*
175      * Special case for DH: check two DH certificate types for a match. This
176      * means for DH certificates we must set the certificate first.
177      */
178     if (pkey->type == EVP_PKEY_DH) {
179         X509 *x;
180         i = -1;
181         x = c->pkeys[SSL_PKEY_DH_RSA].x509;
182         if (x && X509_check_private_key(x, pkey))
183             i = SSL_PKEY_DH_RSA;
184         x = c->pkeys[SSL_PKEY_DH_DSA].x509;
185         if (i == -1 && x && X509_check_private_key(x, pkey))
186             i = SSL_PKEY_DH_DSA;
187         ERR_clear_error();
188     } else
189         i = ssl_cert_type(NULL, pkey);
190     if (i < 0) {
191         SSLerr(SSL_F_SSL_SET_PKEY, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
192         return (0);
193     }
194
195     if (c->pkeys[i].x509 != NULL) {
196         EVP_PKEY *pktmp;
197         pktmp = X509_get_pubkey(c->pkeys[i].x509);
198         EVP_PKEY_copy_parameters(pktmp, pkey);
199         EVP_PKEY_free(pktmp);
200         ERR_clear_error();
201
202 #ifndef OPENSSL_NO_RSA
203         /*
204          * Don't check the public/private key, this is mostly for smart
205          * cards.
206          */
207         if ((pkey->type == EVP_PKEY_RSA) &&
208             (RSA_flags(pkey->pkey.rsa) & RSA_METHOD_FLAG_NO_CHECK)) ;
209         else
210 #endif
211         if (!X509_check_private_key(c->pkeys[i].x509, pkey)) {
212             X509_free(c->pkeys[i].x509);
213             c->pkeys[i].x509 = NULL;
214             return 0;
215         }
216     }
217
218     if (c->pkeys[i].privatekey != NULL)
219         EVP_PKEY_free(c->pkeys[i].privatekey);
220     CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
221     c->pkeys[i].privatekey = pkey;
222     c->key = &(c->pkeys[i]);
223
224     c->valid = 0;
225     return (1);
226 }
227
228 #ifndef OPENSSL_NO_RSA
229 # ifndef OPENSSL_NO_STDIO
230 int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type)
231 {
232     int j, ret = 0;
233     BIO *in;
234     RSA *rsa = NULL;
235
236     in = BIO_new(BIO_s_file_internal());
237     if (in == NULL) {
238         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE, ERR_R_BUF_LIB);
239         goto end;
240     }
241
242     if (BIO_read_filename(in, file) <= 0) {
243         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE, ERR_R_SYS_LIB);
244         goto end;
245     }
246     if (type == SSL_FILETYPE_ASN1) {
247         j = ERR_R_ASN1_LIB;
248         rsa = d2i_RSAPrivateKey_bio(in, NULL);
249     } else if (type == SSL_FILETYPE_PEM) {
250         j = ERR_R_PEM_LIB;
251         rsa = PEM_read_bio_RSAPrivateKey(in, NULL,
252                                          ssl->ctx->default_passwd_callback,
253                                          ssl->
254                                          ctx->default_passwd_callback_userdata);
255     } else {
256         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE, SSL_R_BAD_SSL_FILETYPE);
257         goto end;
258     }
259     if (rsa == NULL) {
260         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_FILE, j);
261         goto end;
262     }
263     ret = SSL_use_RSAPrivateKey(ssl, rsa);
264     RSA_free(rsa);
265  end:
266     if (in != NULL)
267         BIO_free(in);
268     return (ret);
269 }
270 # endif
271
272 int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len)
273 {
274     int ret;
275     const unsigned char *p;
276     RSA *rsa;
277
278     p = d;
279     if ((rsa = d2i_RSAPrivateKey(NULL, &p, (long)len)) == NULL) {
280         SSLerr(SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1, ERR_R_ASN1_LIB);
281         return (0);
282     }
283
284     ret = SSL_use_RSAPrivateKey(ssl, rsa);
285     RSA_free(rsa);
286     return (ret);
287 }
288 #endif                          /* !OPENSSL_NO_RSA */
289
290 int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey)
291 {
292     int ret;
293
294     if (pkey == NULL) {
295         SSLerr(SSL_F_SSL_USE_PRIVATEKEY, ERR_R_PASSED_NULL_PARAMETER);
296         return (0);
297     }
298     if (!ssl_cert_inst(&ssl->cert)) {
299         SSLerr(SSL_F_SSL_USE_PRIVATEKEY, ERR_R_MALLOC_FAILURE);
300         return (0);
301     }
302     ret = ssl_set_pkey(ssl->cert, pkey);
303     return (ret);
304 }
305
306 #ifndef OPENSSL_NO_STDIO
307 int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type)
308 {
309     int j, ret = 0;
310     BIO *in;
311     EVP_PKEY *pkey = NULL;
312
313     in = BIO_new(BIO_s_file_internal());
314     if (in == NULL) {
315         SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE, ERR_R_BUF_LIB);
316         goto end;
317     }
318
319     if (BIO_read_filename(in, file) <= 0) {
320         SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE, ERR_R_SYS_LIB);
321         goto end;
322     }
323     if (type == SSL_FILETYPE_PEM) {
324         j = ERR_R_PEM_LIB;
325         pkey = PEM_read_bio_PrivateKey(in, NULL,
326                                        ssl->ctx->default_passwd_callback,
327                                        ssl->
328                                        ctx->default_passwd_callback_userdata);
329     } else if (type == SSL_FILETYPE_ASN1) {
330         j = ERR_R_ASN1_LIB;
331         pkey = d2i_PrivateKey_bio(in, NULL);
332     } else {
333         SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE, SSL_R_BAD_SSL_FILETYPE);
334         goto end;
335     }
336     if (pkey == NULL) {
337         SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE, j);
338         goto end;
339     }
340     ret = SSL_use_PrivateKey(ssl, pkey);
341     EVP_PKEY_free(pkey);
342  end:
343     if (in != NULL)
344         BIO_free(in);
345     return (ret);
346 }
347 #endif
348
349 int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const unsigned char *d,
350                             long len)
351 {
352     int ret;
353     const unsigned char *p;
354     EVP_PKEY *pkey;
355
356     p = d;
357     if ((pkey = d2i_PrivateKey(type, NULL, &p, (long)len)) == NULL) {
358         SSLerr(SSL_F_SSL_USE_PRIVATEKEY_ASN1, ERR_R_ASN1_LIB);
359         return (0);
360     }
361
362     ret = SSL_use_PrivateKey(ssl, pkey);
363     EVP_PKEY_free(pkey);
364     return (ret);
365 }
366
367 int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x)
368 {
369     if (x == NULL) {
370         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE, ERR_R_PASSED_NULL_PARAMETER);
371         return (0);
372     }
373     if (!ssl_cert_inst(&ctx->cert)) {
374         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE, ERR_R_MALLOC_FAILURE);
375         return (0);
376     }
377     return (ssl_set_cert(ctx->cert, x));
378 }
379
380 static int ssl_set_cert(CERT *c, X509 *x)
381 {
382     EVP_PKEY *pkey;
383     int i;
384
385     pkey = X509_get_pubkey(x);
386     if (pkey == NULL) {
387         SSLerr(SSL_F_SSL_SET_CERT, SSL_R_X509_LIB);
388         return (0);
389     }
390
391     i = ssl_cert_type(x, pkey);
392     if (i < 0) {
393         SSLerr(SSL_F_SSL_SET_CERT, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
394         EVP_PKEY_free(pkey);
395         return (0);
396     }
397
398     if (c->pkeys[i].privatekey != NULL) {
399         EVP_PKEY_copy_parameters(pkey, c->pkeys[i].privatekey);
400         ERR_clear_error();
401
402 #ifndef OPENSSL_NO_RSA
403         /*
404          * Don't check the public/private key, this is mostly for smart
405          * cards.
406          */
407         if ((c->pkeys[i].privatekey->type == EVP_PKEY_RSA) &&
408             (RSA_flags(c->pkeys[i].privatekey->pkey.rsa) &
409              RSA_METHOD_FLAG_NO_CHECK)) ;
410         else
411 #endif                          /* OPENSSL_NO_RSA */
412         if (!X509_check_private_key(x, c->pkeys[i].privatekey)) {
413             /*
414              * don't fail for a cert/key mismatch, just free current private
415              * key (when switching to a different cert & key, first this
416              * function should be used, then ssl_set_pkey
417              */
418             EVP_PKEY_free(c->pkeys[i].privatekey);
419             c->pkeys[i].privatekey = NULL;
420             /* clear error queue */
421             ERR_clear_error();
422         }
423     }
424
425     EVP_PKEY_free(pkey);
426
427     if (c->pkeys[i].x509 != NULL)
428         X509_free(c->pkeys[i].x509);
429     CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
430     c->pkeys[i].x509 = x;
431     c->key = &(c->pkeys[i]);
432
433     c->valid = 0;
434     return (1);
435 }
436
437 #ifndef OPENSSL_NO_STDIO
438 int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type)
439 {
440     int j;
441     BIO *in;
442     int ret = 0;
443     X509 *x = NULL;
444
445     in = BIO_new(BIO_s_file_internal());
446     if (in == NULL) {
447         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_BUF_LIB);
448         goto end;
449     }
450
451     if (BIO_read_filename(in, file) <= 0) {
452         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_SYS_LIB);
453         goto end;
454     }
455     if (type == SSL_FILETYPE_ASN1) {
456         j = ERR_R_ASN1_LIB;
457         x = d2i_X509_bio(in, NULL);
458     } else if (type == SSL_FILETYPE_PEM) {
459         j = ERR_R_PEM_LIB;
460         x = PEM_read_bio_X509(in, NULL, ctx->default_passwd_callback,
461                               ctx->default_passwd_callback_userdata);
462     } else {
463         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, SSL_R_BAD_SSL_FILETYPE);
464         goto end;
465     }
466
467     if (x == NULL) {
468         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, j);
469         goto end;
470     }
471
472     ret = SSL_CTX_use_certificate(ctx, x);
473  end:
474     if (x != NULL)
475         X509_free(x);
476     if (in != NULL)
477         BIO_free(in);
478     return (ret);
479 }
480 #endif
481
482 int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len,
483                                  const unsigned char *d)
484 {
485     X509 *x;
486     int ret;
487
488     x = d2i_X509(NULL, &d, (long)len);
489     if (x == NULL) {
490         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1, ERR_R_ASN1_LIB);
491         return (0);
492     }
493
494     ret = SSL_CTX_use_certificate(ctx, x);
495     X509_free(x);
496     return (ret);
497 }
498
499 #ifndef OPENSSL_NO_RSA
500 int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa)
501 {
502     int ret;
503     EVP_PKEY *pkey;
504
505     if (rsa == NULL) {
506         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY, ERR_R_PASSED_NULL_PARAMETER);
507         return (0);
508     }
509     if (!ssl_cert_inst(&ctx->cert)) {
510         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY, ERR_R_MALLOC_FAILURE);
511         return (0);
512     }
513     if ((pkey = EVP_PKEY_new()) == NULL) {
514         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY, ERR_R_EVP_LIB);
515         return (0);
516     }
517
518     RSA_up_ref(rsa);
519     EVP_PKEY_assign_RSA(pkey, rsa);
520
521     ret = ssl_set_pkey(ctx->cert, pkey);
522     EVP_PKEY_free(pkey);
523     return (ret);
524 }
525
526 # ifndef OPENSSL_NO_STDIO
527 int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type)
528 {
529     int j, ret = 0;
530     BIO *in;
531     RSA *rsa = NULL;
532
533     in = BIO_new(BIO_s_file_internal());
534     if (in == NULL) {
535         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE, ERR_R_BUF_LIB);
536         goto end;
537     }
538
539     if (BIO_read_filename(in, file) <= 0) {
540         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE, ERR_R_SYS_LIB);
541         goto end;
542     }
543     if (type == SSL_FILETYPE_ASN1) {
544         j = ERR_R_ASN1_LIB;
545         rsa = d2i_RSAPrivateKey_bio(in, NULL);
546     } else if (type == SSL_FILETYPE_PEM) {
547         j = ERR_R_PEM_LIB;
548         rsa = PEM_read_bio_RSAPrivateKey(in, NULL,
549                                          ctx->default_passwd_callback,
550                                          ctx->default_passwd_callback_userdata);
551     } else {
552         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE, SSL_R_BAD_SSL_FILETYPE);
553         goto end;
554     }
555     if (rsa == NULL) {
556         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE, j);
557         goto end;
558     }
559     ret = SSL_CTX_use_RSAPrivateKey(ctx, rsa);
560     RSA_free(rsa);
561  end:
562     if (in != NULL)
563         BIO_free(in);
564     return (ret);
565 }
566 # endif
567
568 int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d,
569                                    long len)
570 {
571     int ret;
572     const unsigned char *p;
573     RSA *rsa;
574
575     p = d;
576     if ((rsa = d2i_RSAPrivateKey(NULL, &p, (long)len)) == NULL) {
577         SSLerr(SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1, ERR_R_ASN1_LIB);
578         return (0);
579     }
580
581     ret = SSL_CTX_use_RSAPrivateKey(ctx, rsa);
582     RSA_free(rsa);
583     return (ret);
584 }
585 #endif                          /* !OPENSSL_NO_RSA */
586
587 int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey)
588 {
589     if (pkey == NULL) {
590         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY, ERR_R_PASSED_NULL_PARAMETER);
591         return (0);
592     }
593     if (!ssl_cert_inst(&ctx->cert)) {
594         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY, ERR_R_MALLOC_FAILURE);
595         return (0);
596     }
597     return (ssl_set_pkey(ctx->cert, pkey));
598 }
599
600 #ifndef OPENSSL_NO_STDIO
601 int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type)
602 {
603     int j, ret = 0;
604     BIO *in;
605     EVP_PKEY *pkey = NULL;
606
607     in = BIO_new(BIO_s_file_internal());
608     if (in == NULL) {
609         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE, ERR_R_BUF_LIB);
610         goto end;
611     }
612
613     if (BIO_read_filename(in, file) <= 0) {
614         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE, ERR_R_SYS_LIB);
615         goto end;
616     }
617     if (type == SSL_FILETYPE_PEM) {
618         j = ERR_R_PEM_LIB;
619         pkey = PEM_read_bio_PrivateKey(in, NULL,
620                                        ctx->default_passwd_callback,
621                                        ctx->default_passwd_callback_userdata);
622     } else if (type == SSL_FILETYPE_ASN1) {
623         j = ERR_R_ASN1_LIB;
624         pkey = d2i_PrivateKey_bio(in, NULL);
625     } else {
626         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE, SSL_R_BAD_SSL_FILETYPE);
627         goto end;
628     }
629     if (pkey == NULL) {
630         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE, j);
631         goto end;
632     }
633     ret = SSL_CTX_use_PrivateKey(ctx, pkey);
634     EVP_PKEY_free(pkey);
635  end:
636     if (in != NULL)
637         BIO_free(in);
638     return (ret);
639 }
640 #endif
641
642 int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx,
643                                 const unsigned char *d, long len)
644 {
645     int ret;
646     const unsigned char *p;
647     EVP_PKEY *pkey;
648
649     p = d;
650     if ((pkey = d2i_PrivateKey(type, NULL, &p, (long)len)) == NULL) {
651         SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1, ERR_R_ASN1_LIB);
652         return (0);
653     }
654
655     ret = SSL_CTX_use_PrivateKey(ctx, pkey);
656     EVP_PKEY_free(pkey);
657     return (ret);
658 }
659
660 #ifndef OPENSSL_NO_STDIO
661 /*
662  * Read a file that contains our certificate in "PEM" format, possibly
663  * followed by a sequence of CA certificates that should be sent to the peer
664  * in the Certificate message.
665  */
666 int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file)
667 {
668     BIO *in;
669     int ret = 0;
670     X509 *x = NULL;
671
672     ERR_clear_error();          /* clear error stack for
673                                  * SSL_CTX_use_certificate() */
674
675     in = BIO_new(BIO_s_file_internal());
676     if (in == NULL) {
677         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB);
678         goto end;
679     }
680
681     if (BIO_read_filename(in, file) <= 0) {
682         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_SYS_LIB);
683         goto end;
684     }
685
686     x = PEM_read_bio_X509_AUX(in, NULL, ctx->default_passwd_callback,
687                               ctx->default_passwd_callback_userdata);
688     if (x == NULL) {
689         SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_PEM_LIB);
690         goto end;
691     }
692
693     ret = SSL_CTX_use_certificate(ctx, x);
694
695     if (ERR_peek_error() != 0)
696         ret = 0;                /* Key/certificate mismatch doesn't imply
697                                  * ret==0 ... */
698     if (ret) {
699         /*
700          * If we could set up our certificate, now proceed to the CA
701          * certificates.
702          */
703         X509 *ca;
704         int r;
705         unsigned long err;
706
707         SSL_CTX_clear_chain_certs(ctx);
708
709         while ((ca = PEM_read_bio_X509(in, NULL,
710                                        ctx->default_passwd_callback,
711                                        ctx->default_passwd_callback_userdata))
712                != NULL) {
713             r = SSL_CTX_add0_chain_cert(ctx, ca);
714             if (!r) {
715                 X509_free(ca);
716                 ret = 0;
717                 goto end;
718             }
719             /*
720              * Note that we must not free r if it was successfully added to
721              * the chain (while we must free the main certificate, since its
722              * reference count is increased by SSL_CTX_use_certificate).
723              */
724         }
725         /* When the while loop ends, it's usually just EOF. */
726         err = ERR_peek_last_error();
727         if (ERR_GET_LIB(err) == ERR_LIB_PEM
728             && ERR_GET_REASON(err) == PEM_R_NO_START_LINE)
729             ERR_clear_error();
730         else
731             ret = 0;            /* some real error */
732     }
733
734  end:
735     if (x != NULL)
736         X509_free(x);
737     if (in != NULL)
738         BIO_free(in);
739     return (ret);
740 }
741 #endif
742
743 #ifndef OPENSSL_NO_TLSEXT
744 static int serverinfo_find_extension(const unsigned char *serverinfo,
745                                      size_t serverinfo_length,
746                                      unsigned int extension_type,
747                                      const unsigned char **extension_data,
748                                      size_t *extension_length)
749 {
750     *extension_data = NULL;
751     *extension_length = 0;
752     if (serverinfo == NULL || serverinfo_length == 0)
753         return -1;
754     for (;;) {
755         unsigned int type = 0;
756         size_t len = 0;
757
758         /* end of serverinfo */
759         if (serverinfo_length == 0)
760             return 0;           /* Extension not found */
761
762         /* read 2-byte type field */
763         if (serverinfo_length < 2)
764             return -1;          /* Error */
765         type = (serverinfo[0] << 8) + serverinfo[1];
766         serverinfo += 2;
767         serverinfo_length -= 2;
768
769         /* read 2-byte len field */
770         if (serverinfo_length < 2)
771             return -1;          /* Error */
772         len = (serverinfo[0] << 8) + serverinfo[1];
773         serverinfo += 2;
774         serverinfo_length -= 2;
775
776         if (len > serverinfo_length)
777             return -1;          /* Error */
778
779         if (type == extension_type) {
780             *extension_data = serverinfo;
781             *extension_length = len;
782             return 1;           /* Success */
783         }
784
785         serverinfo += len;
786         serverinfo_length -= len;
787     }
788     return 0;                   /* Error */
789 }
790
791 static int serverinfo_srv_parse_cb(SSL *s, unsigned int ext_type,
792                                    const unsigned char *in,
793                                    size_t inlen, int *al, void *arg)
794 {
795
796     if (inlen != 0) {
797         *al = SSL_AD_DECODE_ERROR;
798         return 0;
799     }
800
801     return 1;
802 }
803
804 static int serverinfo_srv_add_cb(SSL *s, unsigned int ext_type,
805                                  const unsigned char **out, size_t *outlen,
806                                  int *al, void *arg)
807 {
808     const unsigned char *serverinfo = NULL;
809     size_t serverinfo_length = 0;
810
811     /* Is there serverinfo data for the chosen server cert? */
812     if ((ssl_get_server_cert_serverinfo(s, &serverinfo,
813                                         &serverinfo_length)) != 0) {
814         /* Find the relevant extension from the serverinfo */
815         int retval = serverinfo_find_extension(serverinfo, serverinfo_length,
816                                                ext_type, out, outlen);
817         if (retval == -1) {
818             *al = SSL_AD_DECODE_ERROR;
819             return -1;          /* Error */
820         }
821         if (retval == 0)
822             return 0;           /* No extension found, don't send extension */
823         return 1;               /* Send extension */
824     }
825     return -1;                  /* No serverinfo data found, don't send
826                                  * extension */
827 }
828
829 /*
830  * With a NULL context, this function just checks that the serverinfo data
831  * parses correctly.  With a non-NULL context, it registers callbacks for
832  * the included extensions.
833  */
834 static int serverinfo_process_buffer(const unsigned char *serverinfo,
835                                      size_t serverinfo_length, SSL_CTX *ctx)
836 {
837     if (serverinfo == NULL || serverinfo_length == 0)
838         return 0;
839     for (;;) {
840         unsigned int ext_type = 0;
841         size_t len = 0;
842
843         /* end of serverinfo */
844         if (serverinfo_length == 0)
845             return 1;
846
847         /* read 2-byte type field */
848         if (serverinfo_length < 2)
849             return 0;
850         /* FIXME: check for types we understand explicitly? */
851
852         /* Register callbacks for extensions */
853         ext_type = (serverinfo[0] << 8) + serverinfo[1];
854         if (ctx && !SSL_CTX_add_server_custom_ext(ctx, ext_type,
855                                                   serverinfo_srv_add_cb,
856                                                   NULL, NULL,
857                                                   serverinfo_srv_parse_cb,
858                                                   NULL))
859             return 0;
860
861         serverinfo += 2;
862         serverinfo_length -= 2;
863
864         /* read 2-byte len field */
865         if (serverinfo_length < 2)
866             return 0;
867         len = (serverinfo[0] << 8) + serverinfo[1];
868         serverinfo += 2;
869         serverinfo_length -= 2;
870
871         if (len > serverinfo_length)
872             return 0;
873
874         serverinfo += len;
875         serverinfo_length -= len;
876     }
877 }
878
879 int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo,
880                            size_t serverinfo_length)
881 {
882     if (ctx == NULL || serverinfo == NULL || serverinfo_length == 0) {
883         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO, ERR_R_PASSED_NULL_PARAMETER);
884         return 0;
885     }
886     if (!serverinfo_process_buffer(serverinfo, serverinfo_length, NULL)) {
887         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO, SSL_R_INVALID_SERVERINFO_DATA);
888         return 0;
889     }
890     if (!ssl_cert_inst(&ctx->cert)) {
891         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO, ERR_R_MALLOC_FAILURE);
892         return 0;
893     }
894     if (ctx->cert->key == NULL) {
895         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO, ERR_R_INTERNAL_ERROR);
896         return 0;
897     }
898     ctx->cert->key->serverinfo = OPENSSL_realloc(ctx->cert->key->serverinfo,
899                                                  serverinfo_length);
900     if (ctx->cert->key->serverinfo == NULL) {
901         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO, ERR_R_MALLOC_FAILURE);
902         return 0;
903     }
904     memcpy(ctx->cert->key->serverinfo, serverinfo, serverinfo_length);
905     ctx->cert->key->serverinfo_length = serverinfo_length;
906
907     /*
908      * Now that the serverinfo is validated and stored, go ahead and
909      * register callbacks.
910      */
911     if (!serverinfo_process_buffer(serverinfo, serverinfo_length, ctx)) {
912         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO, SSL_R_INVALID_SERVERINFO_DATA);
913         return 0;
914     }
915     return 1;
916 }
917
918 # ifndef OPENSSL_NO_STDIO
919 int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file)
920 {
921     unsigned char *serverinfo = NULL;
922     size_t serverinfo_length = 0;
923     unsigned char *extension = 0;
924     long extension_length = 0;
925     char *name = NULL;
926     char *header = NULL;
927     char namePrefix[] = "SERVERINFO FOR ";
928     int ret = 0;
929     BIO *bin = NULL;
930     size_t num_extensions = 0;
931
932     if (ctx == NULL || file == NULL) {
933         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE,
934                ERR_R_PASSED_NULL_PARAMETER);
935         goto end;
936     }
937
938     bin = BIO_new(BIO_s_file_internal());
939     if (bin == NULL) {
940         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE, ERR_R_BUF_LIB);
941         goto end;
942     }
943     if (BIO_read_filename(bin, file) <= 0) {
944         SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE, ERR_R_SYS_LIB);
945         goto end;
946     }
947
948     for (num_extensions = 0;; num_extensions++) {
949         if (PEM_read_bio(bin, &name, &header, &extension, &extension_length)
950             == 0) {
951             /*
952              * There must be at least one extension in this file
953              */
954             if (num_extensions == 0) {
955                 SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE,
956                        SSL_R_NO_PEM_EXTENSIONS);
957                 goto end;
958             } else              /* End of file, we're done */
959                 break;
960         }
961         /* Check that PEM name starts with "BEGIN SERVERINFO FOR " */
962         if (strlen(name) < strlen(namePrefix)) {
963             SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE,
964                    SSL_R_PEM_NAME_TOO_SHORT);
965             goto end;
966         }
967         if (strncmp(name, namePrefix, strlen(namePrefix)) != 0) {
968             SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE,
969                    SSL_R_PEM_NAME_BAD_PREFIX);
970             goto end;
971         }
972         /*
973          * Check that the decoded PEM data is plausible (valid length field)
974          */
975         if (extension_length < 4
976             || (extension[2] << 8) + extension[3] != extension_length - 4) {
977             SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE, SSL_R_BAD_DATA);
978             goto end;
979         }
980         /* Append the decoded extension to the serverinfo buffer */
981         serverinfo =
982             OPENSSL_realloc(serverinfo, serverinfo_length + extension_length);
983         if (serverinfo == NULL) {
984             SSLerr(SSL_F_SSL_CTX_USE_SERVERINFO_FILE, ERR_R_MALLOC_FAILURE);
985             goto end;
986         }
987         memcpy(serverinfo + serverinfo_length, extension, extension_length);
988         serverinfo_length += extension_length;
989
990         OPENSSL_free(name);
991         name = NULL;
992         OPENSSL_free(header);
993         header = NULL;
994         OPENSSL_free(extension);
995         extension = NULL;
996     }
997
998     ret = SSL_CTX_use_serverinfo(ctx, serverinfo, serverinfo_length);
999  end:
1000     /* SSL_CTX_use_serverinfo makes a local copy of the serverinfo. */
1001     OPENSSL_free(name);
1002     OPENSSL_free(header);
1003     OPENSSL_free(extension);
1004     OPENSSL_free(serverinfo);
1005     if (bin != NULL)
1006         BIO_free(bin);
1007     return ret;
1008 }
1009 # endif                         /* OPENSSL_NO_STDIO */
1010 #endif                          /* OPENSSL_NO_TLSEXT */