882e150b3b056263dcac32f579fefe1b5390a53d
[openssl.git] / ssl / statem / statem_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 /* ====================================================================
11  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
12  * ECC cipher suite support in OpenSSL originally developed by
13  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
14  */
15
16 #include <limits.h>
17 #include <string.h>
18 #include <stdio.h>
19 #include "../ssl_locl.h"
20 #include "statem_locl.h"
21 #include <openssl/buffer.h>
22 #include <openssl/objects.h>
23 #include <openssl/evp.h>
24 #include <openssl/x509.h>
25
26 /*
27  * send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or
28  * SSL3_RT_CHANGE_CIPHER_SPEC)
29  */
30 int ssl3_do_write(SSL *s, int type)
31 {
32     int ret;
33
34     ret = ssl3_write_bytes(s, type, &s->init_buf->data[s->init_off],
35                            s->init_num);
36     if (ret < 0)
37         return (-1);
38     if (type == SSL3_RT_HANDSHAKE)
39         /*
40          * should not be done for 'Hello Request's, but in that case we'll
41          * ignore the result anyway
42          */
43         if (!ssl3_finish_mac(s,
44                              (unsigned char *)&s->init_buf->data[s->init_off],
45                              ret))
46             return -1;
47
48     if (ret == s->init_num) {
49         if (s->msg_callback)
50             s->msg_callback(1, s->version, type, s->init_buf->data,
51                             (size_t)(s->init_off + s->init_num), s,
52                             s->msg_callback_arg);
53         return (1);
54     }
55     s->init_off += ret;
56     s->init_num -= ret;
57     return (0);
58 }
59
60 int tls_close_construct_packet(SSL *s, WPACKET *pkt)
61 {
62     size_t msglen;
63
64     if (!WPACKET_close(pkt)
65             || !WPACKET_get_length(pkt, &msglen)
66             || msglen > INT_MAX
67             || !WPACKET_finish(pkt))
68         return 0;
69     s->init_num = (int)msglen;
70     s->init_off = 0;
71
72     return 1;
73 }
74
75 int tls_construct_finished(SSL *s, const char *sender, int slen)
76 {
77     unsigned char *p;
78     int i;
79     unsigned long l;
80
81     p = ssl_handshake_start(s);
82
83     i = s->method->ssl3_enc->final_finish_mac(s,
84                                               sender, slen,
85                                               s->s3->tmp.finish_md);
86     if (i <= 0)
87         return 0;
88     s->s3->tmp.finish_md_len = i;
89     memcpy(p, s->s3->tmp.finish_md, i);
90     l = i;
91
92     /*
93      * Copy the finished so we can use it for renegotiation checks
94      */
95     if (!s->server) {
96         OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
97         memcpy(s->s3->previous_client_finished, s->s3->tmp.finish_md, i);
98         s->s3->previous_client_finished_len = i;
99     } else {
100         OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
101         memcpy(s->s3->previous_server_finished, s->s3->tmp.finish_md, i);
102         s->s3->previous_server_finished_len = i;
103     }
104
105     if (!ssl_set_handshake_header(s, SSL3_MT_FINISHED, l)) {
106         SSLerr(SSL_F_TLS_CONSTRUCT_FINISHED, ERR_R_INTERNAL_ERROR);
107         return 0;
108     }
109
110     return 1;
111 }
112
113 #ifndef OPENSSL_NO_NEXTPROTONEG
114 /*
115  * ssl3_take_mac calculates the Finished MAC for the handshakes messages seen
116  * to far.
117  */
118 static void ssl3_take_mac(SSL *s)
119 {
120     const char *sender;
121     int slen;
122     /*
123      * If no new cipher setup return immediately: other functions will set
124      * the appropriate error.
125      */
126     if (s->s3->tmp.new_cipher == NULL)
127         return;
128     if (!s->server) {
129         sender = s->method->ssl3_enc->server_finished_label;
130         slen = s->method->ssl3_enc->server_finished_label_len;
131     } else {
132         sender = s->method->ssl3_enc->client_finished_label;
133         slen = s->method->ssl3_enc->client_finished_label_len;
134     }
135
136     s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
137                                                                           sender,
138                                                                           slen,
139                                                                           s->s3->tmp.peer_finish_md);
140 }
141 #endif
142
143 MSG_PROCESS_RETURN tls_process_change_cipher_spec(SSL *s, PACKET *pkt)
144 {
145     int al;
146     long remain;
147
148     remain = PACKET_remaining(pkt);
149     /*
150      * 'Change Cipher Spec' is just a single byte, which should already have
151      * been consumed by ssl_get_message() so there should be no bytes left,
152      * unless we're using DTLS1_BAD_VER, which has an extra 2 bytes
153      */
154     if (SSL_IS_DTLS(s)) {
155         if ((s->version == DTLS1_BAD_VER
156              && remain != DTLS1_CCS_HEADER_LENGTH + 1)
157             || (s->version != DTLS1_BAD_VER
158                 && remain != DTLS1_CCS_HEADER_LENGTH - 1)) {
159             al = SSL_AD_ILLEGAL_PARAMETER;
160             SSLerr(SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC,
161                    SSL_R_BAD_CHANGE_CIPHER_SPEC);
162             goto f_err;
163         }
164     } else {
165         if (remain != 0) {
166             al = SSL_AD_ILLEGAL_PARAMETER;
167             SSLerr(SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC,
168                    SSL_R_BAD_CHANGE_CIPHER_SPEC);
169             goto f_err;
170         }
171     }
172
173     /* Check we have a cipher to change to */
174     if (s->s3->tmp.new_cipher == NULL) {
175         al = SSL_AD_UNEXPECTED_MESSAGE;
176         SSLerr(SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, SSL_R_CCS_RECEIVED_EARLY);
177         goto f_err;
178     }
179
180     s->s3->change_cipher_spec = 1;
181     if (!ssl3_do_change_cipher_spec(s)) {
182         al = SSL_AD_INTERNAL_ERROR;
183         SSLerr(SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
184         goto f_err;
185     }
186
187     if (SSL_IS_DTLS(s)) {
188         dtls1_reset_seq_numbers(s, SSL3_CC_READ);
189
190         if (s->version == DTLS1_BAD_VER)
191             s->d1->handshake_read_seq++;
192
193 #ifndef OPENSSL_NO_SCTP
194         /*
195          * Remember that a CCS has been received, so that an old key of
196          * SCTP-Auth can be deleted when a CCS is sent. Will be ignored if no
197          * SCTP is used
198          */
199         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD, 1, NULL);
200 #endif
201     }
202
203     return MSG_PROCESS_CONTINUE_READING;
204  f_err:
205     ssl3_send_alert(s, SSL3_AL_FATAL, al);
206     ossl_statem_set_error(s);
207     return MSG_PROCESS_ERROR;
208 }
209
210 MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt)
211 {
212     int al, i;
213
214     /* If this occurs, we have missed a message */
215     if (!s->s3->change_cipher_spec) {
216         al = SSL_AD_UNEXPECTED_MESSAGE;
217         SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_GOT_A_FIN_BEFORE_A_CCS);
218         goto f_err;
219     }
220     s->s3->change_cipher_spec = 0;
221
222     i = s->s3->tmp.peer_finish_md_len;
223
224     if ((unsigned long)i != PACKET_remaining(pkt)) {
225         al = SSL_AD_DECODE_ERROR;
226         SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_BAD_DIGEST_LENGTH);
227         goto f_err;
228     }
229
230     if (CRYPTO_memcmp(PACKET_data(pkt), s->s3->tmp.peer_finish_md, i) != 0) {
231         al = SSL_AD_DECRYPT_ERROR;
232         SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_DIGEST_CHECK_FAILED);
233         goto f_err;
234     }
235
236     /*
237      * Copy the finished so we can use it for renegotiation checks
238      */
239     if (s->server) {
240         OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
241         memcpy(s->s3->previous_client_finished, s->s3->tmp.peer_finish_md, i);
242         s->s3->previous_client_finished_len = i;
243     } else {
244         OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
245         memcpy(s->s3->previous_server_finished, s->s3->tmp.peer_finish_md, i);
246         s->s3->previous_server_finished_len = i;
247     }
248
249     return MSG_PROCESS_FINISHED_READING;
250  f_err:
251     ssl3_send_alert(s, SSL3_AL_FATAL, al);
252     ossl_statem_set_error(s);
253     return MSG_PROCESS_ERROR;
254 }
255
256 int tls_construct_change_cipher_spec(SSL *s)
257 {
258     unsigned char *p;
259
260     p = (unsigned char *)s->init_buf->data;
261     *p = SSL3_MT_CCS;
262     s->init_num = 1;
263     s->init_off = 0;
264
265     return 1;
266 }
267
268 unsigned long ssl3_output_cert_chain(SSL *s, CERT_PKEY *cpk)
269 {
270     WPACKET pkt;
271
272     if (!WPACKET_init(&pkt, s->init_buf)) {
273         /* Should not happen */
274         SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_INTERNAL_ERROR);
275         goto err;
276     }
277
278     if (!ssl_set_handshake_header2(s, &pkt, SSL3_MT_CERTIFICATE)
279             || !WPACKET_start_sub_packet_u24(&pkt)) {
280         SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_INTERNAL_ERROR);
281         goto err;
282     }
283
284     if (!ssl_add_cert_chain(s, &pkt, cpk))
285         goto err;
286
287     if (!WPACKET_close(&pkt) || !ssl_close_construct_packet(s, &pkt)) {
288         SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_INTERNAL_ERROR);
289         goto err;
290     }
291     return 1;
292  err:
293     WPACKET_cleanup(&pkt);
294     return 0;
295 }
296
297 WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst)
298 {
299     void (*cb) (const SSL *ssl, int type, int val) = NULL;
300
301 #ifndef OPENSSL_NO_SCTP
302     if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s))) {
303         WORK_STATE ret;
304         ret = dtls_wait_for_dry(s);
305         if (ret != WORK_FINISHED_CONTINUE)
306             return ret;
307     }
308 #endif
309
310     /* clean a few things up */
311     ssl3_cleanup_key_block(s);
312
313     if (!SSL_IS_DTLS(s)) {
314         /*
315          * We don't do this in DTLS because we may still need the init_buf
316          * in case there are any unexpected retransmits
317          */
318         BUF_MEM_free(s->init_buf);
319         s->init_buf = NULL;
320     }
321
322     ssl_free_wbio_buffer(s);
323
324     s->init_num = 0;
325
326     if (!s->server || s->renegotiate == 2) {
327         /* skipped if we just sent a HelloRequest */
328         s->renegotiate = 0;
329         s->new_session = 0;
330
331         if (s->server) {
332             ssl_update_cache(s, SSL_SESS_CACHE_SERVER);
333
334             s->ctx->stats.sess_accept_good++;
335             s->handshake_func = ossl_statem_accept;
336         } else {
337             ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
338             if (s->hit)
339                 s->ctx->stats.sess_hit++;
340
341             s->handshake_func = ossl_statem_connect;
342             s->ctx->stats.sess_connect_good++;
343         }
344
345         if (s->info_callback != NULL)
346             cb = s->info_callback;
347         else if (s->ctx->info_callback != NULL)
348             cb = s->ctx->info_callback;
349
350         if (cb != NULL)
351             cb(s, SSL_CB_HANDSHAKE_DONE, 1);
352
353         if (SSL_IS_DTLS(s)) {
354             /* done with handshaking */
355             s->d1->handshake_read_seq = 0;
356             s->d1->handshake_write_seq = 0;
357             s->d1->next_handshake_write_seq = 0;
358             dtls1_clear_received_buffer(s);
359         }
360     }
361
362     return WORK_FINISHED_STOP;
363 }
364
365 int tls_get_message_header(SSL *s, int *mt)
366 {
367     /* s->init_num < SSL3_HM_HEADER_LENGTH */
368     int skip_message, i, recvd_type, al;
369     unsigned char *p;
370     unsigned long l;
371
372     p = (unsigned char *)s->init_buf->data;
373
374     do {
375         while (s->init_num < SSL3_HM_HEADER_LENGTH) {
376             i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, &recvd_type,
377                                           &p[s->init_num],
378                                           SSL3_HM_HEADER_LENGTH - s->init_num,
379                                           0);
380             if (i <= 0) {
381                 s->rwstate = SSL_READING;
382                 return 0;
383             }
384             if (recvd_type == SSL3_RT_CHANGE_CIPHER_SPEC) {
385                 /*
386                  * A ChangeCipherSpec must be a single byte and may not occur
387                  * in the middle of a handshake message.
388                  */
389                 if (s->init_num != 0 || i != 1 || p[0] != SSL3_MT_CCS) {
390                     al = SSL_AD_UNEXPECTED_MESSAGE;
391                     SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER,
392                            SSL_R_BAD_CHANGE_CIPHER_SPEC);
393                     goto f_err;
394                 }
395                 s->s3->tmp.message_type = *mt = SSL3_MT_CHANGE_CIPHER_SPEC;
396                 s->init_num = i - 1;
397                 s->s3->tmp.message_size = i;
398                 return 1;
399             } else if (recvd_type != SSL3_RT_HANDSHAKE) {
400                 al = SSL_AD_UNEXPECTED_MESSAGE;
401                 SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, SSL_R_CCS_RECEIVED_EARLY);
402                 goto f_err;
403             }
404             s->init_num += i;
405         }
406
407         skip_message = 0;
408         if (!s->server)
409             if (p[0] == SSL3_MT_HELLO_REQUEST)
410                 /*
411                  * The server may always send 'Hello Request' messages --
412                  * we are doing a handshake anyway now, so ignore them if
413                  * their format is correct. Does not count for 'Finished'
414                  * MAC.
415                  */
416                 if (p[1] == 0 && p[2] == 0 && p[3] == 0) {
417                     s->init_num = 0;
418                     skip_message = 1;
419
420                     if (s->msg_callback)
421                         s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
422                                         p, SSL3_HM_HEADER_LENGTH, s,
423                                         s->msg_callback_arg);
424                 }
425     } while (skip_message);
426     /* s->init_num == SSL3_HM_HEADER_LENGTH */
427
428     *mt = *p;
429     s->s3->tmp.message_type = *(p++);
430
431     if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
432         /*
433          * Only happens with SSLv3+ in an SSLv2 backward compatible
434          * ClientHello
435          *
436          * Total message size is the remaining record bytes to read
437          * plus the SSL3_HM_HEADER_LENGTH bytes that we already read
438          */
439         l = RECORD_LAYER_get_rrec_length(&s->rlayer)
440             + SSL3_HM_HEADER_LENGTH;
441         if (l && !BUF_MEM_grow_clean(s->init_buf, (int)l)) {
442             SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, ERR_R_BUF_LIB);
443             goto err;
444         }
445         s->s3->tmp.message_size = l;
446
447         s->init_msg = s->init_buf->data;
448         s->init_num = SSL3_HM_HEADER_LENGTH;
449     } else {
450         n2l3(p, l);
451         /* BUF_MEM_grow takes an 'int' parameter */
452         if (l > (INT_MAX - SSL3_HM_HEADER_LENGTH)) {
453             al = SSL_AD_ILLEGAL_PARAMETER;
454             SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, SSL_R_EXCESSIVE_MESSAGE_SIZE);
455             goto f_err;
456         }
457         if (l && !BUF_MEM_grow_clean(s->init_buf,
458                                      (int)l + SSL3_HM_HEADER_LENGTH)) {
459             SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, ERR_R_BUF_LIB);
460             goto err;
461         }
462         s->s3->tmp.message_size = l;
463
464         s->init_msg = s->init_buf->data + SSL3_HM_HEADER_LENGTH;
465         s->init_num = 0;
466     }
467
468     return 1;
469  f_err:
470     ssl3_send_alert(s, SSL3_AL_FATAL, al);
471  err:
472     return 0;
473 }
474
475 int tls_get_message_body(SSL *s, unsigned long *len)
476 {
477     long n;
478     unsigned char *p;
479     int i;
480
481     if (s->s3->tmp.message_type == SSL3_MT_CHANGE_CIPHER_SPEC) {
482         /* We've already read everything in */
483         *len = (unsigned long)s->init_num;
484         return 1;
485     }
486
487     p = s->init_msg;
488     n = s->s3->tmp.message_size - s->init_num;
489     while (n > 0) {
490         i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, NULL,
491                                       &p[s->init_num], n, 0);
492         if (i <= 0) {
493             s->rwstate = SSL_READING;
494             *len = 0;
495             return 0;
496         }
497         s->init_num += i;
498         n -= i;
499     }
500
501 #ifndef OPENSSL_NO_NEXTPROTONEG
502     /*
503      * If receiving Finished, record MAC of prior handshake messages for
504      * Finished verification.
505      */
506     if (*s->init_buf->data == SSL3_MT_FINISHED)
507         ssl3_take_mac(s);
508 #endif
509
510     /* Feed this message into MAC computation. */
511     if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
512         if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
513                              s->init_num)) {
514             SSLerr(SSL_F_TLS_GET_MESSAGE_BODY, ERR_R_EVP_LIB);
515             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
516             *len = 0;
517             return 0;
518         }
519         if (s->msg_callback)
520             s->msg_callback(0, SSL2_VERSION, 0, s->init_buf->data,
521                             (size_t)s->init_num, s, s->msg_callback_arg);
522     } else {
523         if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
524                              s->init_num + SSL3_HM_HEADER_LENGTH)) {
525             SSLerr(SSL_F_TLS_GET_MESSAGE_BODY, ERR_R_EVP_LIB);
526             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
527             *len = 0;
528             return 0;
529         }
530         if (s->msg_callback)
531             s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data,
532                             (size_t)s->init_num + SSL3_HM_HEADER_LENGTH, s,
533                             s->msg_callback_arg);
534     }
535
536     /*
537      * init_num should never be negative...should probably be declared
538      * unsigned
539      */
540     if (s->init_num < 0) {
541         SSLerr(SSL_F_TLS_GET_MESSAGE_BODY, ERR_R_INTERNAL_ERROR);
542         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
543         *len = 0;
544         return 0;
545     }
546     *len = (unsigned long)s->init_num;
547     return 1;
548 }
549
550 int ssl_cert_type(const X509 *x, const EVP_PKEY *pk)
551 {
552     if (pk == NULL && (pk = X509_get0_pubkey(x)) == NULL)
553         return -1;
554
555     switch (EVP_PKEY_id(pk)) {
556     default:
557         return -1;
558     case EVP_PKEY_RSA:
559         return SSL_PKEY_RSA_ENC;
560     case EVP_PKEY_DSA:
561         return SSL_PKEY_DSA_SIGN;
562 #ifndef OPENSSL_NO_EC
563     case EVP_PKEY_EC:
564         return SSL_PKEY_ECC;
565 #endif
566 #ifndef OPENSSL_NO_GOST
567     case NID_id_GostR3410_2001:
568         return SSL_PKEY_GOST01;
569     case NID_id_GostR3410_2012_256:
570         return SSL_PKEY_GOST12_256;
571     case NID_id_GostR3410_2012_512:
572         return SSL_PKEY_GOST12_512;
573 #endif
574     }
575 }
576
577 int ssl_verify_alarm_type(long type)
578 {
579     int al;
580
581     switch (type) {
582     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
583     case X509_V_ERR_UNABLE_TO_GET_CRL:
584     case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
585         al = SSL_AD_UNKNOWN_CA;
586         break;
587     case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
588     case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
589     case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
590     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
591     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
592     case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
593     case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
594     case X509_V_ERR_CERT_NOT_YET_VALID:
595     case X509_V_ERR_CRL_NOT_YET_VALID:
596     case X509_V_ERR_CERT_UNTRUSTED:
597     case X509_V_ERR_CERT_REJECTED:
598     case X509_V_ERR_HOSTNAME_MISMATCH:
599     case X509_V_ERR_EMAIL_MISMATCH:
600     case X509_V_ERR_IP_ADDRESS_MISMATCH:
601     case X509_V_ERR_DANE_NO_MATCH:
602     case X509_V_ERR_EE_KEY_TOO_SMALL:
603     case X509_V_ERR_CA_KEY_TOO_SMALL:
604     case X509_V_ERR_CA_MD_TOO_WEAK:
605         al = SSL_AD_BAD_CERTIFICATE;
606         break;
607     case X509_V_ERR_CERT_SIGNATURE_FAILURE:
608     case X509_V_ERR_CRL_SIGNATURE_FAILURE:
609         al = SSL_AD_DECRYPT_ERROR;
610         break;
611     case X509_V_ERR_CERT_HAS_EXPIRED:
612     case X509_V_ERR_CRL_HAS_EXPIRED:
613         al = SSL_AD_CERTIFICATE_EXPIRED;
614         break;
615     case X509_V_ERR_CERT_REVOKED:
616         al = SSL_AD_CERTIFICATE_REVOKED;
617         break;
618     case X509_V_ERR_UNSPECIFIED:
619     case X509_V_ERR_OUT_OF_MEM:
620     case X509_V_ERR_INVALID_CALL:
621     case X509_V_ERR_STORE_LOOKUP:
622         al = SSL_AD_INTERNAL_ERROR;
623         break;
624     case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
625     case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
626     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
627     case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
628     case X509_V_ERR_CERT_CHAIN_TOO_LONG:
629     case X509_V_ERR_PATH_LENGTH_EXCEEDED:
630     case X509_V_ERR_INVALID_CA:
631         al = SSL_AD_UNKNOWN_CA;
632         break;
633     case X509_V_ERR_APPLICATION_VERIFICATION:
634         al = SSL_AD_HANDSHAKE_FAILURE;
635         break;
636     case X509_V_ERR_INVALID_PURPOSE:
637         al = SSL_AD_UNSUPPORTED_CERTIFICATE;
638         break;
639     default:
640         al = SSL_AD_CERTIFICATE_UNKNOWN;
641         break;
642     }
643     return (al);
644 }
645
646 int ssl_allow_compression(SSL *s)
647 {
648     if (s->options & SSL_OP_NO_COMPRESSION)
649         return 0;
650     return ssl_security(s, SSL_SECOP_COMPRESSION, 0, 0, NULL);
651 }
652
653 static int version_cmp(const SSL *s, int a, int b)
654 {
655     int dtls = SSL_IS_DTLS(s);
656
657     if (a == b)
658         return 0;
659     if (!dtls)
660         return a < b ? -1 : 1;
661     return DTLS_VERSION_LT(a, b) ? -1 : 1;
662 }
663
664 typedef struct {
665     int version;
666     const SSL_METHOD *(*cmeth) (void);
667     const SSL_METHOD *(*smeth) (void);
668 } version_info;
669
670 #if TLS_MAX_VERSION != TLS1_2_VERSION
671 # error Code needs update for TLS_method() support beyond TLS1_2_VERSION.
672 #endif
673
674 static const version_info tls_version_table[] = {
675 #ifndef OPENSSL_NO_TLS1_2
676     {TLS1_2_VERSION, tlsv1_2_client_method, tlsv1_2_server_method},
677 #else
678     {TLS1_2_VERSION, NULL, NULL},
679 #endif
680 #ifndef OPENSSL_NO_TLS1_1
681     {TLS1_1_VERSION, tlsv1_1_client_method, tlsv1_1_server_method},
682 #else
683     {TLS1_1_VERSION, NULL, NULL},
684 #endif
685 #ifndef OPENSSL_NO_TLS1
686     {TLS1_VERSION, tlsv1_client_method, tlsv1_server_method},
687 #else
688     {TLS1_VERSION, NULL, NULL},
689 #endif
690 #ifndef OPENSSL_NO_SSL3
691     {SSL3_VERSION, sslv3_client_method, sslv3_server_method},
692 #else
693     {SSL3_VERSION, NULL, NULL},
694 #endif
695     {0, NULL, NULL},
696 };
697
698 #if DTLS_MAX_VERSION != DTLS1_2_VERSION
699 # error Code needs update for DTLS_method() support beyond DTLS1_2_VERSION.
700 #endif
701
702 static const version_info dtls_version_table[] = {
703 #ifndef OPENSSL_NO_DTLS1_2
704     {DTLS1_2_VERSION, dtlsv1_2_client_method, dtlsv1_2_server_method},
705 #else
706     {DTLS1_2_VERSION, NULL, NULL},
707 #endif
708 #ifndef OPENSSL_NO_DTLS1
709     {DTLS1_VERSION, dtlsv1_client_method, dtlsv1_server_method},
710     {DTLS1_BAD_VER, dtls_bad_ver_client_method, NULL},
711 #else
712     {DTLS1_VERSION, NULL, NULL},
713     {DTLS1_BAD_VER, NULL, NULL},
714 #endif
715     {0, NULL, NULL},
716 };
717
718 /*
719  * ssl_method_error - Check whether an SSL_METHOD is enabled.
720  *
721  * @s: The SSL handle for the candidate method
722  * @method: the intended method.
723  *
724  * Returns 0 on success, or an SSL error reason on failure.
725  */
726 static int ssl_method_error(const SSL *s, const SSL_METHOD *method)
727 {
728     int version = method->version;
729
730     if ((s->min_proto_version != 0 &&
731          version_cmp(s, version, s->min_proto_version) < 0) ||
732         ssl_security(s, SSL_SECOP_VERSION, 0, version, NULL) == 0)
733         return SSL_R_VERSION_TOO_LOW;
734
735     if (s->max_proto_version != 0 &&
736         version_cmp(s, version, s->max_proto_version) > 0)
737         return SSL_R_VERSION_TOO_HIGH;
738
739     if ((s->options & method->mask) != 0)
740         return SSL_R_UNSUPPORTED_PROTOCOL;
741     if ((method->flags & SSL_METHOD_NO_SUITEB) != 0 && tls1_suiteb(s))
742         return SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE;
743     else if ((method->flags & SSL_METHOD_NO_FIPS) != 0 && FIPS_mode())
744         return SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE;
745
746     return 0;
747 }
748
749 /*
750  * ssl_version_supported - Check that the specified `version` is supported by
751  * `SSL *` instance
752  *
753  * @s: The SSL handle for the candidate method
754  * @version: Protocol version to test against
755  *
756  * Returns 1 when supported, otherwise 0
757  */
758 int ssl_version_supported(const SSL *s, int version)
759 {
760     const version_info *vent;
761     const version_info *table;
762
763     switch (s->method->version) {
764     default:
765         /* Version should match method version for non-ANY method */
766         return version_cmp(s, version, s->version) == 0;
767     case TLS_ANY_VERSION:
768         table = tls_version_table;
769         break;
770     case DTLS_ANY_VERSION:
771         table = dtls_version_table;
772         break;
773     }
774
775     for (vent = table;
776          vent->version != 0 && version_cmp(s, version, vent->version) <= 0;
777          ++vent) {
778         if (vent->cmeth != NULL &&
779             version_cmp(s, version, vent->version) == 0 &&
780             ssl_method_error(s, vent->cmeth()) == 0) {
781             return 1;
782         }
783     }
784     return 0;
785 }
786
787 /*
788  * ssl_check_version_downgrade - In response to RFC7507 SCSV version
789  * fallback indication from a client check whether we're using the highest
790  * supported protocol version.
791  *
792  * @s server SSL handle.
793  *
794  * Returns 1 when using the highest enabled version, 0 otherwise.
795  */
796 int ssl_check_version_downgrade(SSL *s)
797 {
798     const version_info *vent;
799     const version_info *table;
800
801     /*
802      * Check that the current protocol is the highest enabled version
803      * (according to s->ctx->method, as version negotiation may have changed
804      * s->method).
805      */
806     if (s->version == s->ctx->method->version)
807         return 1;
808
809     /*
810      * Apparently we're using a version-flexible SSL_METHOD (not at its
811      * highest protocol version).
812      */
813     if (s->ctx->method->version == TLS_method()->version)
814         table = tls_version_table;
815     else if (s->ctx->method->version == DTLS_method()->version)
816         table = dtls_version_table;
817     else {
818         /* Unexpected state; fail closed. */
819         return 0;
820     }
821
822     for (vent = table; vent->version != 0; ++vent) {
823         if (vent->smeth != NULL && ssl_method_error(s, vent->smeth()) == 0)
824             return s->version == vent->version;
825     }
826     return 0;
827 }
828
829 /*
830  * ssl_set_version_bound - set an upper or lower bound on the supported (D)TLS
831  * protocols, provided the initial (D)TLS method is version-flexible.  This
832  * function sanity-checks the proposed value and makes sure the method is
833  * version-flexible, then sets the limit if all is well.
834  *
835  * @method_version: The version of the current SSL_METHOD.
836  * @version: the intended limit.
837  * @bound: pointer to limit to be updated.
838  *
839  * Returns 1 on success, 0 on failure.
840  */
841 int ssl_set_version_bound(int method_version, int version, int *bound)
842 {
843     if (version == 0) {
844         *bound = version;
845         return 1;
846     }
847
848     /*-
849      * Restrict TLS methods to TLS protocol versions.
850      * Restrict DTLS methods to DTLS protocol versions.
851      * Note, DTLS version numbers are decreasing, use comparison macros.
852      *
853      * Note that for both lower-bounds we use explicit versions, not
854      * (D)TLS_MIN_VERSION.  This is because we don't want to break user
855      * configurations.  If the MIN (supported) version ever rises, the user's
856      * "floor" remains valid even if no longer available.  We don't expect the
857      * MAX ceiling to ever get lower, so making that variable makes sense.
858      */
859     switch (method_version) {
860     default:
861         /*
862          * XXX For fixed version methods, should we always fail and not set any
863          * bounds, always succeed and not set any bounds, or set the bounds and
864          * arrange to fail later if they are not met?  At present fixed-version
865          * methods are not subject to controls that disable individual protocol
866          * versions.
867          */
868         return 0;
869
870     case TLS_ANY_VERSION:
871         if (version < SSL3_VERSION || version > TLS_MAX_VERSION)
872             return 0;
873         break;
874
875     case DTLS_ANY_VERSION:
876         if (DTLS_VERSION_GT(version, DTLS_MAX_VERSION) ||
877             DTLS_VERSION_LT(version, DTLS1_BAD_VER))
878             return 0;
879         break;
880     }
881
882     *bound = version;
883     return 1;
884 }
885
886 /*
887  * ssl_choose_server_version - Choose server (D)TLS version.  Called when the
888  * client HELLO is received to select the final server protocol version and
889  * the version specific method.
890  *
891  * @s: server SSL handle.
892  *
893  * Returns 0 on success or an SSL error reason number on failure.
894  */
895 int ssl_choose_server_version(SSL *s)
896 {
897     /*-
898      * With version-flexible methods we have an initial state with:
899      *
900      *   s->method->version == (D)TLS_ANY_VERSION,
901      *   s->version == (D)TLS_MAX_VERSION.
902      *
903      * So we detect version-flexible methods via the method version, not the
904      * handle version.
905      */
906     int server_version = s->method->version;
907     int client_version = s->client_version;
908     const version_info *vent;
909     const version_info *table;
910     int disabled = 0;
911
912     switch (server_version) {
913     default:
914         if (version_cmp(s, client_version, s->version) < 0)
915             return SSL_R_WRONG_SSL_VERSION;
916         /*
917          * If this SSL handle is not from a version flexible method we don't
918          * (and never did) check min/max FIPS or Suite B constraints.  Hope
919          * that's OK.  It is up to the caller to not choose fixed protocol
920          * versions they don't want.  If not, then easy to fix, just return
921          * ssl_method_error(s, s->method)
922          */
923         return 0;
924     case TLS_ANY_VERSION:
925         table = tls_version_table;
926         break;
927     case DTLS_ANY_VERSION:
928         table = dtls_version_table;
929         break;
930     }
931
932     for (vent = table; vent->version != 0; ++vent) {
933         const SSL_METHOD *method;
934
935         if (vent->smeth == NULL ||
936             version_cmp(s, client_version, vent->version) < 0)
937             continue;
938         method = vent->smeth();
939         if (ssl_method_error(s, method) == 0) {
940             s->version = vent->version;
941             s->method = method;
942             return 0;
943         }
944         disabled = 1;
945     }
946     return disabled ? SSL_R_UNSUPPORTED_PROTOCOL : SSL_R_VERSION_TOO_LOW;
947 }
948
949 /*
950  * ssl_choose_client_version - Choose client (D)TLS version.  Called when the
951  * server HELLO is received to select the final client protocol version and
952  * the version specific method.
953  *
954  * @s: client SSL handle.
955  * @version: The proposed version from the server's HELLO.
956  *
957  * Returns 0 on success or an SSL error reason number on failure.
958  */
959 int ssl_choose_client_version(SSL *s, int version)
960 {
961     const version_info *vent;
962     const version_info *table;
963
964     switch (s->method->version) {
965     default:
966         if (version != s->version)
967             return SSL_R_WRONG_SSL_VERSION;
968         /*
969          * If this SSL handle is not from a version flexible method we don't
970          * (and never did) check min/max, FIPS or Suite B constraints.  Hope
971          * that's OK.  It is up to the caller to not choose fixed protocol
972          * versions they don't want.  If not, then easy to fix, just return
973          * ssl_method_error(s, s->method)
974          */
975         return 0;
976     case TLS_ANY_VERSION:
977         table = tls_version_table;
978         break;
979     case DTLS_ANY_VERSION:
980         table = dtls_version_table;
981         break;
982     }
983
984     for (vent = table; vent->version != 0; ++vent) {
985         const SSL_METHOD *method;
986         int err;
987
988         if (version != vent->version)
989             continue;
990         if (vent->cmeth == NULL)
991             break;
992         method = vent->cmeth();
993         err = ssl_method_error(s, method);
994         if (err != 0)
995             return err;
996         s->method = method;
997         s->version = version;
998         return 0;
999     }
1000
1001     return SSL_R_UNSUPPORTED_PROTOCOL;
1002 }
1003
1004 /*
1005  * ssl_get_client_min_max_version - get minimum and maximum client version
1006  * @s: The SSL connection
1007  * @min_version: The minimum supported version
1008  * @max_version: The maximum supported version
1009  *
1010  * Work out what version we should be using for the initial ClientHello if the
1011  * version is initially (D)TLS_ANY_VERSION.  We apply any explicit SSL_OP_NO_xxx
1012  * options, the MinProtocol and MaxProtocol configuration commands, any Suite B
1013  * or FIPS_mode() constraints and any floor imposed by the security level here,
1014  * so we don't advertise the wrong protocol version to only reject the outcome later.
1015  *
1016  * Computing the right floor matters.  If, e.g., TLS 1.0 and 1.2 are enabled,
1017  * TLS 1.1 is disabled, but the security level, Suite-B  and/or MinProtocol
1018  * only allow TLS 1.2, we want to advertise TLS1.2, *not* TLS1.
1019  *
1020  * Returns 0 on success or an SSL error reason number on failure.  On failure
1021  * min_version and max_version will also be set to 0.
1022  */
1023 int ssl_get_client_min_max_version(const SSL *s, int *min_version,
1024                                    int *max_version)
1025 {
1026     int version;
1027     int hole;
1028     const SSL_METHOD *single = NULL;
1029     const SSL_METHOD *method;
1030     const version_info *table;
1031     const version_info *vent;
1032
1033     switch (s->method->version) {
1034     default:
1035         /*
1036          * If this SSL handle is not from a version flexible method we don't
1037          * (and never did) check min/max FIPS or Suite B constraints.  Hope
1038          * that's OK.  It is up to the caller to not choose fixed protocol
1039          * versions they don't want.  If not, then easy to fix, just return
1040          * ssl_method_error(s, s->method)
1041          */
1042         *min_version = *max_version = s->version;
1043         return 0;
1044     case TLS_ANY_VERSION:
1045         table = tls_version_table;
1046         break;
1047     case DTLS_ANY_VERSION:
1048         table = dtls_version_table;
1049         break;
1050     }
1051
1052     /*
1053      * SSL_OP_NO_X disables all protocols above X *if* there are some protocols
1054      * below X enabled. This is required in order to maintain the "version
1055      * capability" vector contiguous. Any versions with a NULL client method
1056      * (protocol version client is disabled at compile-time) is also a "hole".
1057      *
1058      * Our initial state is hole == 1, version == 0.  That is, versions above
1059      * the first version in the method table are disabled (a "hole" above
1060      * the valid protocol entries) and we don't have a selected version yet.
1061      *
1062      * Whenever "hole == 1", and we hit an enabled method, its version becomes
1063      * the selected version, and the method becomes a candidate "single"
1064      * method.  We're no longer in a hole, so "hole" becomes 0.
1065      *
1066      * If "hole == 0" and we hit an enabled method, then "single" is cleared,
1067      * as we support a contiguous range of at least two methods.  If we hit
1068      * a disabled method, then hole becomes true again, but nothing else
1069      * changes yet, because all the remaining methods may be disabled too.
1070      * If we again hit an enabled method after the new hole, it becomes
1071      * selected, as we start from scratch.
1072      */
1073     *min_version = version = 0;
1074     hole = 1;
1075     for (vent = table; vent->version != 0; ++vent) {
1076         /*
1077          * A table entry with a NULL client method is still a hole in the
1078          * "version capability" vector.
1079          */
1080         if (vent->cmeth == NULL) {
1081             hole = 1;
1082             continue;
1083         }
1084         method = vent->cmeth();
1085         if (ssl_method_error(s, method) != 0) {
1086             hole = 1;
1087         } else if (!hole) {
1088             single = NULL;
1089             *min_version = method->version;
1090         } else {
1091             version = (single = method)->version;
1092             *min_version = version;
1093             hole = 0;
1094         }
1095     }
1096
1097     *max_version = version;
1098
1099     /* Fail if everything is disabled */
1100     if (version == 0)
1101         return SSL_R_NO_PROTOCOLS_AVAILABLE;
1102
1103     return 0;
1104 }
1105
1106 /*
1107  * ssl_set_client_hello_version - Work out what version we should be using for
1108  * the initial ClientHello.
1109  *
1110  * @s: client SSL handle.
1111  *
1112  * Returns 0 on success or an SSL error reason number on failure.
1113  */
1114 int ssl_set_client_hello_version(SSL *s)
1115 {
1116     int ver_min, ver_max, ret;
1117
1118     ret = ssl_get_client_min_max_version(s, &ver_min, &ver_max);
1119
1120     if (ret != 0)
1121         return ret;
1122
1123     s->client_version = s->version = ver_max;
1124     return 0;
1125 }