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