Convert CKE construction to use the WPACKET API
[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     unsigned char *p;
271     unsigned long l = 3 + SSL_HM_HEADER_LENGTH(s);
272
273     if (!ssl_add_cert_chain(s, cpk, &l))
274         return 0;
275
276     l -= 3 + SSL_HM_HEADER_LENGTH(s);
277     p = ssl_handshake_start(s);
278     l2n3(l, p);
279     l += 3;
280
281     if (!ssl_set_handshake_header(s, SSL3_MT_CERTIFICATE, l)) {
282         SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN, ERR_R_INTERNAL_ERROR);
283         return 0;
284     }
285     return l + SSL_HM_HEADER_LENGTH(s);
286 }
287
288 WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst)
289 {
290     void (*cb) (const SSL *ssl, int type, int val) = NULL;
291
292 #ifndef OPENSSL_NO_SCTP
293     if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s))) {
294         WORK_STATE ret;
295         ret = dtls_wait_for_dry(s);
296         if (ret != WORK_FINISHED_CONTINUE)
297             return ret;
298     }
299 #endif
300
301     /* clean a few things up */
302     ssl3_cleanup_key_block(s);
303
304     if (!SSL_IS_DTLS(s)) {
305         /*
306          * We don't do this in DTLS because we may still need the init_buf
307          * in case there are any unexpected retransmits
308          */
309         BUF_MEM_free(s->init_buf);
310         s->init_buf = NULL;
311     }
312
313     ssl_free_wbio_buffer(s);
314
315     s->init_num = 0;
316
317     if (!s->server || s->renegotiate == 2) {
318         /* skipped if we just sent a HelloRequest */
319         s->renegotiate = 0;
320         s->new_session = 0;
321
322         if (s->server) {
323             ssl_update_cache(s, SSL_SESS_CACHE_SERVER);
324
325             s->ctx->stats.sess_accept_good++;
326             s->handshake_func = ossl_statem_accept;
327         } else {
328             ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
329             if (s->hit)
330                 s->ctx->stats.sess_hit++;
331
332             s->handshake_func = ossl_statem_connect;
333             s->ctx->stats.sess_connect_good++;
334         }
335
336         if (s->info_callback != NULL)
337             cb = s->info_callback;
338         else if (s->ctx->info_callback != NULL)
339             cb = s->ctx->info_callback;
340
341         if (cb != NULL)
342             cb(s, SSL_CB_HANDSHAKE_DONE, 1);
343
344         if (SSL_IS_DTLS(s)) {
345             /* done with handshaking */
346             s->d1->handshake_read_seq = 0;
347             s->d1->handshake_write_seq = 0;
348             s->d1->next_handshake_write_seq = 0;
349             dtls1_clear_received_buffer(s);
350         }
351     }
352
353     return WORK_FINISHED_STOP;
354 }
355
356 int tls_get_message_header(SSL *s, int *mt)
357 {
358     /* s->init_num < SSL3_HM_HEADER_LENGTH */
359     int skip_message, i, recvd_type, al;
360     unsigned char *p;
361     unsigned long l;
362
363     p = (unsigned char *)s->init_buf->data;
364
365     do {
366         while (s->init_num < SSL3_HM_HEADER_LENGTH) {
367             i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, &recvd_type,
368                                           &p[s->init_num],
369                                           SSL3_HM_HEADER_LENGTH - s->init_num,
370                                           0);
371             if (i <= 0) {
372                 s->rwstate = SSL_READING;
373                 return 0;
374             }
375             if (recvd_type == SSL3_RT_CHANGE_CIPHER_SPEC) {
376                 /*
377                  * A ChangeCipherSpec must be a single byte and may not occur
378                  * in the middle of a handshake message.
379                  */
380                 if (s->init_num != 0 || i != 1 || p[0] != SSL3_MT_CCS) {
381                     al = SSL_AD_UNEXPECTED_MESSAGE;
382                     SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER,
383                            SSL_R_BAD_CHANGE_CIPHER_SPEC);
384                     goto f_err;
385                 }
386                 s->s3->tmp.message_type = *mt = SSL3_MT_CHANGE_CIPHER_SPEC;
387                 s->init_num = i - 1;
388                 s->s3->tmp.message_size = i;
389                 return 1;
390             } else if (recvd_type != SSL3_RT_HANDSHAKE) {
391                 al = SSL_AD_UNEXPECTED_MESSAGE;
392                 SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, SSL_R_CCS_RECEIVED_EARLY);
393                 goto f_err;
394             }
395             s->init_num += i;
396         }
397
398         skip_message = 0;
399         if (!s->server)
400             if (p[0] == SSL3_MT_HELLO_REQUEST)
401                 /*
402                  * The server may always send 'Hello Request' messages --
403                  * we are doing a handshake anyway now, so ignore them if
404                  * their format is correct. Does not count for 'Finished'
405                  * MAC.
406                  */
407                 if (p[1] == 0 && p[2] == 0 && p[3] == 0) {
408                     s->init_num = 0;
409                     skip_message = 1;
410
411                     if (s->msg_callback)
412                         s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
413                                         p, SSL3_HM_HEADER_LENGTH, s,
414                                         s->msg_callback_arg);
415                 }
416     } while (skip_message);
417     /* s->init_num == SSL3_HM_HEADER_LENGTH */
418
419     *mt = *p;
420     s->s3->tmp.message_type = *(p++);
421
422     if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
423         /*
424          * Only happens with SSLv3+ in an SSLv2 backward compatible
425          * ClientHello
426          *
427          * Total message size is the remaining record bytes to read
428          * plus the SSL3_HM_HEADER_LENGTH bytes that we already read
429          */
430         l = RECORD_LAYER_get_rrec_length(&s->rlayer)
431             + SSL3_HM_HEADER_LENGTH;
432         if (l && !BUF_MEM_grow_clean(s->init_buf, (int)l)) {
433             SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, ERR_R_BUF_LIB);
434             goto err;
435         }
436         s->s3->tmp.message_size = l;
437
438         s->init_msg = s->init_buf->data;
439         s->init_num = SSL3_HM_HEADER_LENGTH;
440     } else {
441         n2l3(p, l);
442         /* BUF_MEM_grow takes an 'int' parameter */
443         if (l > (INT_MAX - SSL3_HM_HEADER_LENGTH)) {
444             al = SSL_AD_ILLEGAL_PARAMETER;
445             SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, SSL_R_EXCESSIVE_MESSAGE_SIZE);
446             goto f_err;
447         }
448         if (l && !BUF_MEM_grow_clean(s->init_buf,
449                                      (int)l + SSL3_HM_HEADER_LENGTH)) {
450             SSLerr(SSL_F_TLS_GET_MESSAGE_HEADER, ERR_R_BUF_LIB);
451             goto err;
452         }
453         s->s3->tmp.message_size = l;
454
455         s->init_msg = s->init_buf->data + SSL3_HM_HEADER_LENGTH;
456         s->init_num = 0;
457     }
458
459     return 1;
460  f_err:
461     ssl3_send_alert(s, SSL3_AL_FATAL, al);
462  err:
463     return 0;
464 }
465
466 int tls_get_message_body(SSL *s, unsigned long *len)
467 {
468     long n;
469     unsigned char *p;
470     int i;
471
472     if (s->s3->tmp.message_type == SSL3_MT_CHANGE_CIPHER_SPEC) {
473         /* We've already read everything in */
474         *len = (unsigned long)s->init_num;
475         return 1;
476     }
477
478     p = s->init_msg;
479     n = s->s3->tmp.message_size - s->init_num;
480     while (n > 0) {
481         i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, NULL,
482                                       &p[s->init_num], n, 0);
483         if (i <= 0) {
484             s->rwstate = SSL_READING;
485             *len = 0;
486             return 0;
487         }
488         s->init_num += i;
489         n -= i;
490     }
491
492 #ifndef OPENSSL_NO_NEXTPROTONEG
493     /*
494      * If receiving Finished, record MAC of prior handshake messages for
495      * Finished verification.
496      */
497     if (*s->init_buf->data == SSL3_MT_FINISHED)
498         ssl3_take_mac(s);
499 #endif
500
501     /* Feed this message into MAC computation. */
502     if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
503         if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
504                              s->init_num)) {
505             SSLerr(SSL_F_TLS_GET_MESSAGE_BODY, ERR_R_EVP_LIB);
506             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
507             *len = 0;
508             return 0;
509         }
510         if (s->msg_callback)
511             s->msg_callback(0, SSL2_VERSION, 0, s->init_buf->data,
512                             (size_t)s->init_num, s, s->msg_callback_arg);
513     } else {
514         if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
515                              s->init_num + SSL3_HM_HEADER_LENGTH)) {
516             SSLerr(SSL_F_TLS_GET_MESSAGE_BODY, ERR_R_EVP_LIB);
517             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
518             *len = 0;
519             return 0;
520         }
521         if (s->msg_callback)
522             s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data,
523                             (size_t)s->init_num + SSL3_HM_HEADER_LENGTH, s,
524                             s->msg_callback_arg);
525     }
526
527     /*
528      * init_num should never be negative...should probably be declared
529      * unsigned
530      */
531     if (s->init_num < 0) {
532         SSLerr(SSL_F_TLS_GET_MESSAGE_BODY, ERR_R_INTERNAL_ERROR);
533         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
534         *len = 0;
535         return 0;
536     }
537     *len = (unsigned long)s->init_num;
538     return 1;
539 }
540
541 int ssl_cert_type(const X509 *x, const EVP_PKEY *pk)
542 {
543     if (pk == NULL && (pk = X509_get0_pubkey(x)) == NULL)
544         return -1;
545
546     switch (EVP_PKEY_id(pk)) {
547     default:
548         return -1;
549     case EVP_PKEY_RSA:
550         return SSL_PKEY_RSA_ENC;
551     case EVP_PKEY_DSA:
552         return SSL_PKEY_DSA_SIGN;
553 #ifndef OPENSSL_NO_EC
554     case EVP_PKEY_EC:
555         return SSL_PKEY_ECC;
556 #endif
557 #ifndef OPENSSL_NO_GOST
558     case NID_id_GostR3410_2001:
559         return SSL_PKEY_GOST01;
560     case NID_id_GostR3410_2012_256:
561         return SSL_PKEY_GOST12_256;
562     case NID_id_GostR3410_2012_512:
563         return SSL_PKEY_GOST12_512;
564 #endif
565     }
566 }
567
568 int ssl_verify_alarm_type(long type)
569 {
570     int al;
571
572     switch (type) {
573     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
574     case X509_V_ERR_UNABLE_TO_GET_CRL:
575     case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
576         al = SSL_AD_UNKNOWN_CA;
577         break;
578     case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
579     case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
580     case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
581     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
582     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
583     case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
584     case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
585     case X509_V_ERR_CERT_NOT_YET_VALID:
586     case X509_V_ERR_CRL_NOT_YET_VALID:
587     case X509_V_ERR_CERT_UNTRUSTED:
588     case X509_V_ERR_CERT_REJECTED:
589     case X509_V_ERR_HOSTNAME_MISMATCH:
590     case X509_V_ERR_EMAIL_MISMATCH:
591     case X509_V_ERR_IP_ADDRESS_MISMATCH:
592     case X509_V_ERR_DANE_NO_MATCH:
593     case X509_V_ERR_EE_KEY_TOO_SMALL:
594     case X509_V_ERR_CA_KEY_TOO_SMALL:
595     case X509_V_ERR_CA_MD_TOO_WEAK:
596         al = SSL_AD_BAD_CERTIFICATE;
597         break;
598     case X509_V_ERR_CERT_SIGNATURE_FAILURE:
599     case X509_V_ERR_CRL_SIGNATURE_FAILURE:
600         al = SSL_AD_DECRYPT_ERROR;
601         break;
602     case X509_V_ERR_CERT_HAS_EXPIRED:
603     case X509_V_ERR_CRL_HAS_EXPIRED:
604         al = SSL_AD_CERTIFICATE_EXPIRED;
605         break;
606     case X509_V_ERR_CERT_REVOKED:
607         al = SSL_AD_CERTIFICATE_REVOKED;
608         break;
609     case X509_V_ERR_UNSPECIFIED:
610     case X509_V_ERR_OUT_OF_MEM:
611     case X509_V_ERR_INVALID_CALL:
612     case X509_V_ERR_STORE_LOOKUP:
613         al = SSL_AD_INTERNAL_ERROR;
614         break;
615     case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
616     case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
617     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
618     case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
619     case X509_V_ERR_CERT_CHAIN_TOO_LONG:
620     case X509_V_ERR_PATH_LENGTH_EXCEEDED:
621     case X509_V_ERR_INVALID_CA:
622         al = SSL_AD_UNKNOWN_CA;
623         break;
624     case X509_V_ERR_APPLICATION_VERIFICATION:
625         al = SSL_AD_HANDSHAKE_FAILURE;
626         break;
627     case X509_V_ERR_INVALID_PURPOSE:
628         al = SSL_AD_UNSUPPORTED_CERTIFICATE;
629         break;
630     default:
631         al = SSL_AD_CERTIFICATE_UNKNOWN;
632         break;
633     }
634     return (al);
635 }
636
637 int ssl_allow_compression(SSL *s)
638 {
639     if (s->options & SSL_OP_NO_COMPRESSION)
640         return 0;
641     return ssl_security(s, SSL_SECOP_COMPRESSION, 0, 0, NULL);
642 }
643
644 static int version_cmp(const SSL *s, int a, int b)
645 {
646     int dtls = SSL_IS_DTLS(s);
647
648     if (a == b)
649         return 0;
650     if (!dtls)
651         return a < b ? -1 : 1;
652     return DTLS_VERSION_LT(a, b) ? -1 : 1;
653 }
654
655 typedef struct {
656     int version;
657     const SSL_METHOD *(*cmeth) (void);
658     const SSL_METHOD *(*smeth) (void);
659 } version_info;
660
661 #if TLS_MAX_VERSION != TLS1_2_VERSION
662 # error Code needs update for TLS_method() support beyond TLS1_2_VERSION.
663 #endif
664
665 static const version_info tls_version_table[] = {
666 #ifndef OPENSSL_NO_TLS1_2
667     {TLS1_2_VERSION, tlsv1_2_client_method, tlsv1_2_server_method},
668 #else
669     {TLS1_2_VERSION, NULL, NULL},
670 #endif
671 #ifndef OPENSSL_NO_TLS1_1
672     {TLS1_1_VERSION, tlsv1_1_client_method, tlsv1_1_server_method},
673 #else
674     {TLS1_1_VERSION, NULL, NULL},
675 #endif
676 #ifndef OPENSSL_NO_TLS1
677     {TLS1_VERSION, tlsv1_client_method, tlsv1_server_method},
678 #else
679     {TLS1_VERSION, NULL, NULL},
680 #endif
681 #ifndef OPENSSL_NO_SSL3
682     {SSL3_VERSION, sslv3_client_method, sslv3_server_method},
683 #else
684     {SSL3_VERSION, NULL, NULL},
685 #endif
686     {0, NULL, NULL},
687 };
688
689 #if DTLS_MAX_VERSION != DTLS1_2_VERSION
690 # error Code needs update for DTLS_method() support beyond DTLS1_2_VERSION.
691 #endif
692
693 static const version_info dtls_version_table[] = {
694 #ifndef OPENSSL_NO_DTLS1_2
695     {DTLS1_2_VERSION, dtlsv1_2_client_method, dtlsv1_2_server_method},
696 #else
697     {DTLS1_2_VERSION, NULL, NULL},
698 #endif
699 #ifndef OPENSSL_NO_DTLS1
700     {DTLS1_VERSION, dtlsv1_client_method, dtlsv1_server_method},
701     {DTLS1_BAD_VER, dtls_bad_ver_client_method, NULL},
702 #else
703     {DTLS1_VERSION, NULL, NULL},
704     {DTLS1_BAD_VER, NULL, NULL},
705 #endif
706     {0, NULL, NULL},
707 };
708
709 /*
710  * ssl_method_error - Check whether an SSL_METHOD is enabled.
711  *
712  * @s: The SSL handle for the candidate method
713  * @method: the intended method.
714  *
715  * Returns 0 on success, or an SSL error reason on failure.
716  */
717 static int ssl_method_error(const SSL *s, const SSL_METHOD *method)
718 {
719     int version = method->version;
720
721     if ((s->min_proto_version != 0 &&
722          version_cmp(s, version, s->min_proto_version) < 0) ||
723         ssl_security(s, SSL_SECOP_VERSION, 0, version, NULL) == 0)
724         return SSL_R_VERSION_TOO_LOW;
725
726     if (s->max_proto_version != 0 &&
727         version_cmp(s, version, s->max_proto_version) > 0)
728         return SSL_R_VERSION_TOO_HIGH;
729
730     if ((s->options & method->mask) != 0)
731         return SSL_R_UNSUPPORTED_PROTOCOL;
732     if ((method->flags & SSL_METHOD_NO_SUITEB) != 0 && tls1_suiteb(s))
733         return SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE;
734     else if ((method->flags & SSL_METHOD_NO_FIPS) != 0 && FIPS_mode())
735         return SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE;
736
737     return 0;
738 }
739
740 /*
741  * ssl_version_supported - Check that the specified `version` is supported by
742  * `SSL *` instance
743  *
744  * @s: The SSL handle for the candidate method
745  * @version: Protocol version to test against
746  *
747  * Returns 1 when supported, otherwise 0
748  */
749 int ssl_version_supported(const SSL *s, int version)
750 {
751     const version_info *vent;
752     const version_info *table;
753
754     switch (s->method->version) {
755     default:
756         /* Version should match method version for non-ANY method */
757         return version_cmp(s, version, s->version) == 0;
758     case TLS_ANY_VERSION:
759         table = tls_version_table;
760         break;
761     case DTLS_ANY_VERSION:
762         table = dtls_version_table;
763         break;
764     }
765
766     for (vent = table;
767          vent->version != 0 && version_cmp(s, version, vent->version) <= 0;
768          ++vent) {
769         if (vent->cmeth != NULL &&
770             version_cmp(s, version, vent->version) == 0 &&
771             ssl_method_error(s, vent->cmeth()) == 0) {
772             return 1;
773         }
774     }
775     return 0;
776 }
777
778 /*
779  * ssl_check_version_downgrade - In response to RFC7507 SCSV version
780  * fallback indication from a client check whether we're using the highest
781  * supported protocol version.
782  *
783  * @s server SSL handle.
784  *
785  * Returns 1 when using the highest enabled version, 0 otherwise.
786  */
787 int ssl_check_version_downgrade(SSL *s)
788 {
789     const version_info *vent;
790     const version_info *table;
791
792     /*
793      * Check that the current protocol is the highest enabled version
794      * (according to s->ctx->method, as version negotiation may have changed
795      * s->method).
796      */
797     if (s->version == s->ctx->method->version)
798         return 1;
799
800     /*
801      * Apparently we're using a version-flexible SSL_METHOD (not at its
802      * highest protocol version).
803      */
804     if (s->ctx->method->version == TLS_method()->version)
805         table = tls_version_table;
806     else if (s->ctx->method->version == DTLS_method()->version)
807         table = dtls_version_table;
808     else {
809         /* Unexpected state; fail closed. */
810         return 0;
811     }
812
813     for (vent = table; vent->version != 0; ++vent) {
814         if (vent->smeth != NULL && ssl_method_error(s, vent->smeth()) == 0)
815             return s->version == vent->version;
816     }
817     return 0;
818 }
819
820 /*
821  * ssl_set_version_bound - set an upper or lower bound on the supported (D)TLS
822  * protocols, provided the initial (D)TLS method is version-flexible.  This
823  * function sanity-checks the proposed value and makes sure the method is
824  * version-flexible, then sets the limit if all is well.
825  *
826  * @method_version: The version of the current SSL_METHOD.
827  * @version: the intended limit.
828  * @bound: pointer to limit to be updated.
829  *
830  * Returns 1 on success, 0 on failure.
831  */
832 int ssl_set_version_bound(int method_version, int version, int *bound)
833 {
834     if (version == 0) {
835         *bound = version;
836         return 1;
837     }
838
839     /*-
840      * Restrict TLS methods to TLS protocol versions.
841      * Restrict DTLS methods to DTLS protocol versions.
842      * Note, DTLS version numbers are decreasing, use comparison macros.
843      *
844      * Note that for both lower-bounds we use explicit versions, not
845      * (D)TLS_MIN_VERSION.  This is because we don't want to break user
846      * configurations.  If the MIN (supported) version ever rises, the user's
847      * "floor" remains valid even if no longer available.  We don't expect the
848      * MAX ceiling to ever get lower, so making that variable makes sense.
849      */
850     switch (method_version) {
851     default:
852         /*
853          * XXX For fixed version methods, should we always fail and not set any
854          * bounds, always succeed and not set any bounds, or set the bounds and
855          * arrange to fail later if they are not met?  At present fixed-version
856          * methods are not subject to controls that disable individual protocol
857          * versions.
858          */
859         return 0;
860
861     case TLS_ANY_VERSION:
862         if (version < SSL3_VERSION || version > TLS_MAX_VERSION)
863             return 0;
864         break;
865
866     case DTLS_ANY_VERSION:
867         if (DTLS_VERSION_GT(version, DTLS_MAX_VERSION) ||
868             DTLS_VERSION_LT(version, DTLS1_BAD_VER))
869             return 0;
870         break;
871     }
872
873     *bound = version;
874     return 1;
875 }
876
877 /*
878  * ssl_choose_server_version - Choose server (D)TLS version.  Called when the
879  * client HELLO is received to select the final server protocol version and
880  * the version specific method.
881  *
882  * @s: server SSL handle.
883  *
884  * Returns 0 on success or an SSL error reason number on failure.
885  */
886 int ssl_choose_server_version(SSL *s)
887 {
888     /*-
889      * With version-flexible methods we have an initial state with:
890      *
891      *   s->method->version == (D)TLS_ANY_VERSION,
892      *   s->version == (D)TLS_MAX_VERSION.
893      *
894      * So we detect version-flexible methods via the method version, not the
895      * handle version.
896      */
897     int server_version = s->method->version;
898     int client_version = s->client_version;
899     const version_info *vent;
900     const version_info *table;
901     int disabled = 0;
902
903     switch (server_version) {
904     default:
905         if (version_cmp(s, client_version, s->version) < 0)
906             return SSL_R_WRONG_SSL_VERSION;
907         /*
908          * If this SSL handle is not from a version flexible method we don't
909          * (and never did) check min/max FIPS or Suite B constraints.  Hope
910          * that's OK.  It is up to the caller to not choose fixed protocol
911          * versions they don't want.  If not, then easy to fix, just return
912          * ssl_method_error(s, s->method)
913          */
914         return 0;
915     case TLS_ANY_VERSION:
916         table = tls_version_table;
917         break;
918     case DTLS_ANY_VERSION:
919         table = dtls_version_table;
920         break;
921     }
922
923     for (vent = table; vent->version != 0; ++vent) {
924         const SSL_METHOD *method;
925
926         if (vent->smeth == NULL ||
927             version_cmp(s, client_version, vent->version) < 0)
928             continue;
929         method = vent->smeth();
930         if (ssl_method_error(s, method) == 0) {
931             s->version = vent->version;
932             s->method = method;
933             return 0;
934         }
935         disabled = 1;
936     }
937     return disabled ? SSL_R_UNSUPPORTED_PROTOCOL : SSL_R_VERSION_TOO_LOW;
938 }
939
940 /*
941  * ssl_choose_client_version - Choose client (D)TLS version.  Called when the
942  * server HELLO is received to select the final client protocol version and
943  * the version specific method.
944  *
945  * @s: client SSL handle.
946  * @version: The proposed version from the server's HELLO.
947  *
948  * Returns 0 on success or an SSL error reason number on failure.
949  */
950 int ssl_choose_client_version(SSL *s, int version)
951 {
952     const version_info *vent;
953     const version_info *table;
954
955     switch (s->method->version) {
956     default:
957         if (version != s->version)
958             return SSL_R_WRONG_SSL_VERSION;
959         /*
960          * If this SSL handle is not from a version flexible method we don't
961          * (and never did) check min/max, FIPS or Suite B constraints.  Hope
962          * that's OK.  It is up to the caller to not choose fixed protocol
963          * versions they don't want.  If not, then easy to fix, just return
964          * ssl_method_error(s, s->method)
965          */
966         return 0;
967     case TLS_ANY_VERSION:
968         table = tls_version_table;
969         break;
970     case DTLS_ANY_VERSION:
971         table = dtls_version_table;
972         break;
973     }
974
975     for (vent = table; vent->version != 0; ++vent) {
976         const SSL_METHOD *method;
977         int err;
978
979         if (version != vent->version)
980             continue;
981         if (vent->cmeth == NULL)
982             break;
983         method = vent->cmeth();
984         err = ssl_method_error(s, method);
985         if (err != 0)
986             return err;
987         s->method = method;
988         s->version = version;
989         return 0;
990     }
991
992     return SSL_R_UNSUPPORTED_PROTOCOL;
993 }
994
995 /*
996  * ssl_get_client_min_max_version - get minimum and maximum client version
997  * @s: The SSL connection
998  * @min_version: The minimum supported version
999  * @max_version: The maximum supported version
1000  *
1001  * Work out what version we should be using for the initial ClientHello if the
1002  * version is initially (D)TLS_ANY_VERSION.  We apply any explicit SSL_OP_NO_xxx
1003  * options, the MinProtocol and MaxProtocol configuration commands, any Suite B
1004  * or FIPS_mode() constraints and any floor imposed by the security level here,
1005  * so we don't advertise the wrong protocol version to only reject the outcome later.
1006  *
1007  * Computing the right floor matters.  If, e.g., TLS 1.0 and 1.2 are enabled,
1008  * TLS 1.1 is disabled, but the security level, Suite-B  and/or MinProtocol
1009  * only allow TLS 1.2, we want to advertise TLS1.2, *not* TLS1.
1010  *
1011  * Returns 0 on success or an SSL error reason number on failure.  On failure
1012  * min_version and max_version will also be set to 0.
1013  */
1014 int ssl_get_client_min_max_version(const SSL *s, int *min_version,
1015                                    int *max_version)
1016 {
1017     int version;
1018     int hole;
1019     const SSL_METHOD *single = NULL;
1020     const SSL_METHOD *method;
1021     const version_info *table;
1022     const version_info *vent;
1023
1024     switch (s->method->version) {
1025     default:
1026         /*
1027          * If this SSL handle is not from a version flexible method we don't
1028          * (and never did) check min/max FIPS or Suite B constraints.  Hope
1029          * that's OK.  It is up to the caller to not choose fixed protocol
1030          * versions they don't want.  If not, then easy to fix, just return
1031          * ssl_method_error(s, s->method)
1032          */
1033         *min_version = *max_version = s->version;
1034         return 0;
1035     case TLS_ANY_VERSION:
1036         table = tls_version_table;
1037         break;
1038     case DTLS_ANY_VERSION:
1039         table = dtls_version_table;
1040         break;
1041     }
1042
1043     /*
1044      * SSL_OP_NO_X disables all protocols above X *if* there are some protocols
1045      * below X enabled. This is required in order to maintain the "version
1046      * capability" vector contiguous. Any versions with a NULL client method
1047      * (protocol version client is disabled at compile-time) is also a "hole".
1048      *
1049      * Our initial state is hole == 1, version == 0.  That is, versions above
1050      * the first version in the method table are disabled (a "hole" above
1051      * the valid protocol entries) and we don't have a selected version yet.
1052      *
1053      * Whenever "hole == 1", and we hit an enabled method, its version becomes
1054      * the selected version, and the method becomes a candidate "single"
1055      * method.  We're no longer in a hole, so "hole" becomes 0.
1056      *
1057      * If "hole == 0" and we hit an enabled method, then "single" is cleared,
1058      * as we support a contiguous range of at least two methods.  If we hit
1059      * a disabled method, then hole becomes true again, but nothing else
1060      * changes yet, because all the remaining methods may be disabled too.
1061      * If we again hit an enabled method after the new hole, it becomes
1062      * selected, as we start from scratch.
1063      */
1064     *min_version = version = 0;
1065     hole = 1;
1066     for (vent = table; vent->version != 0; ++vent) {
1067         /*
1068          * A table entry with a NULL client method is still a hole in the
1069          * "version capability" vector.
1070          */
1071         if (vent->cmeth == NULL) {
1072             hole = 1;
1073             continue;
1074         }
1075         method = vent->cmeth();
1076         if (ssl_method_error(s, method) != 0) {
1077             hole = 1;
1078         } else if (!hole) {
1079             single = NULL;
1080             *min_version = method->version;
1081         } else {
1082             version = (single = method)->version;
1083             *min_version = version;
1084             hole = 0;
1085         }
1086     }
1087
1088     *max_version = version;
1089
1090     /* Fail if everything is disabled */
1091     if (version == 0)
1092         return SSL_R_NO_PROTOCOLS_AVAILABLE;
1093
1094     return 0;
1095 }
1096
1097 /*
1098  * ssl_set_client_hello_version - Work out what version we should be using for
1099  * the initial ClientHello.
1100  *
1101  * @s: client SSL handle.
1102  *
1103  * Returns 0 on success or an SSL error reason number on failure.
1104  */
1105 int ssl_set_client_hello_version(SSL *s)
1106 {
1107     int ver_min, ver_max, ret;
1108
1109     ret = ssl_get_client_min_max_version(s, &ver_min, &ver_max);
1110
1111     if (ret != 0)
1112         return ret;
1113
1114     s->client_version = s->version = ver_max;
1115     return 0;
1116 }