blob: 1cc481cc4966433ac940fd6bcedc46c5aa51cd0e [file] [log] [blame]
Rich Salz846e33c2016-05-17 14:18:30 -04001/*
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00003 *
Rich Salz846e33c2016-05-17 14:18:30 -04004 * 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
Bodo Möllerf1fd4542006-01-03 03:27:19 +00008 */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00009
10#include <stdio.h>
Emilia Kasperaa474d12016-02-19 17:24:44 +010011#include <stdlib.h>
Bodo Möllerec577821999-04-23 22:13:45 +000012#include <openssl/objects.h>
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +000013#include <openssl/evp.h>
14#include <openssl/hmac.h>
Dr. Stephen Henson67c8e7f2007-09-26 21:56:59 +000015#include <openssl/ocsp.h>
Matt Caswell5951e842016-04-20 16:38:29 +010016#include <openssl/conf.h>
17#include <openssl/x509v3.h>
Rich Salz3c272082016-03-18 14:30:20 -040018#include <openssl/dh.h>
19#include <openssl/bn.h>
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000020#include "ssl_locl.h"
Rich Salz3c272082016-03-18 14:30:20 -040021#include <openssl/ct.h>
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000022
Matt Caswelld736bc12016-10-04 21:22:19 +010023static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, size_t ticklen,
Matt Caswellec60ccc2016-10-04 20:31:19 +010024 const unsigned char *sess_id, size_t sesslen,
Matt Caswell0f113f32015-01-22 03:40:55 +000025 SSL_SESSION **psess);
Emilia Kasperaa474d12016-02-19 17:24:44 +010026static int ssl_check_serverhello_tlsext(SSL *s);
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +000027
Matt Caswell0f113f32015-01-22 03:40:55 +000028SSL3_ENC_METHOD const TLSv1_enc_data = {
29 tls1_enc,
30 tls1_mac,
31 tls1_setup_key_block,
32 tls1_generate_master_secret,
33 tls1_change_cipher_state,
34 tls1_final_finish_mac,
Matt Caswell0f113f32015-01-22 03:40:55 +000035 TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
36 TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
37 tls1_alert_code,
38 tls1_export_keying_material,
39 0,
Matt Caswella29fa982016-09-29 22:40:15 +010040 ssl3_set_handshake_header,
Matt Caswell2c7b4db2016-08-03 20:57:52 +010041 tls_close_construct_packet,
Matt Caswell0f113f32015-01-22 03:40:55 +000042 ssl3_handshake_write
43};
Dr. Stephen Henson173e72e2013-03-11 15:34:28 +000044
Matt Caswell0f113f32015-01-22 03:40:55 +000045SSL3_ENC_METHOD const TLSv1_1_enc_data = {
46 tls1_enc,
47 tls1_mac,
48 tls1_setup_key_block,
49 tls1_generate_master_secret,
50 tls1_change_cipher_state,
51 tls1_final_finish_mac,
Matt Caswell0f113f32015-01-22 03:40:55 +000052 TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
53 TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
54 tls1_alert_code,
55 tls1_export_keying_material,
56 SSL_ENC_FLAG_EXPLICIT_IV,
Matt Caswella29fa982016-09-29 22:40:15 +010057 ssl3_set_handshake_header,
Matt Caswell2c7b4db2016-08-03 20:57:52 +010058 tls_close_construct_packet,
Matt Caswell0f113f32015-01-22 03:40:55 +000059 ssl3_handshake_write
60};
Dr. Stephen Henson173e72e2013-03-11 15:34:28 +000061
Matt Caswell0f113f32015-01-22 03:40:55 +000062SSL3_ENC_METHOD const TLSv1_2_enc_data = {
63 tls1_enc,
64 tls1_mac,
65 tls1_setup_key_block,
66 tls1_generate_master_secret,
67 tls1_change_cipher_state,
68 tls1_final_finish_mac,
Matt Caswell0f113f32015-01-22 03:40:55 +000069 TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
70 TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
71 tls1_alert_code,
72 tls1_export_keying_material,
73 SSL_ENC_FLAG_EXPLICIT_IV | SSL_ENC_FLAG_SIGALGS | SSL_ENC_FLAG_SHA256_PRF
74 | SSL_ENC_FLAG_TLS1_2_CIPHERS,
Matt Caswella29fa982016-09-29 22:40:15 +010075 ssl3_set_handshake_header,
Matt Caswell2c7b4db2016-08-03 20:57:52 +010076 tls_close_construct_packet,
Matt Caswell0f113f32015-01-22 03:40:55 +000077 ssl3_handshake_write
78};
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000079
Matt Caswell582a17d2016-10-21 17:39:33 +010080SSL3_ENC_METHOD const TLSv1_3_enc_data = {
Matt Caswellbebc0c72016-11-17 18:00:17 +000081 tls13_enc,
Matt Caswell582a17d2016-10-21 17:39:33 +010082 tls1_mac,
Matt Caswell92760c22016-11-09 14:06:12 +000083 tls13_setup_key_block,
84 tls13_generate_master_secret,
85 tls13_change_cipher_state,
86 tls13_final_finish_mac,
Matt Caswell582a17d2016-10-21 17:39:33 +010087 TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE,
88 TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE,
89 tls1_alert_code,
90 tls1_export_keying_material,
Matt Caswellbebc0c72016-11-17 18:00:17 +000091 SSL_ENC_FLAG_SIGALGS | SSL_ENC_FLAG_SHA256_PRF,
Matt Caswell582a17d2016-10-21 17:39:33 +010092 ssl3_set_handshake_header,
93 tls_close_construct_packet,
94 ssl3_handshake_write
95};
96
Dr. Stephen Hensonf3b656b2005-08-05 23:56:11 +000097long tls1_default_timeout(void)
Matt Caswell0f113f32015-01-22 03:40:55 +000098{
99 /*
100 * 2 hours, the 24 hours mentioned in the TLSv1 spec is way too long for
101 * http, the cache would over fill
102 */
103 return (60 * 60 * 2);
104}
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000105
Ulf Möller6b691a51999-04-19 21:31:43 +0000106int tls1_new(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +0000107{
108 if (!ssl3_new(s))
109 return (0);
110 s->method->ssl_clear(s);
111 return (1);
112}
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000113
Ulf Möller6b691a51999-04-19 21:31:43 +0000114void tls1_free(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +0000115{
Rich Salzb548a1f2015-05-01 10:02:07 -0400116 OPENSSL_free(s->tlsext_session_ticket);
Matt Caswell0f113f32015-01-22 03:40:55 +0000117 ssl3_free(s);
118}
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000119
Ulf Möller6b691a51999-04-19 21:31:43 +0000120void tls1_clear(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +0000121{
122 ssl3_clear(s);
Viktor Dukhovni4fa52142015-12-29 03:24:17 -0500123 if (s->method->version == TLS_ANY_VERSION)
124 s->version = TLS_MAX_VERSION;
125 else
126 s->version = s->method->version;
Matt Caswell0f113f32015-01-22 03:40:55 +0000127}
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000128
Dr. Stephen Henson525de5d2007-08-12 23:59:05 +0000129#ifndef OPENSSL_NO_EC
Dr. Stephen Hensoneda37662011-05-30 17:58:13 +0000130
Matt Caswell0f113f32015-01-22 03:40:55 +0000131typedef struct {
132 int nid; /* Curve NID */
133 int secbits; /* Bits of security (from SP800-57) */
134 unsigned int flags; /* Flags: currently just field type */
135} tls_curve_info;
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +0000136
Dr. Stephen Henson2dc1aee2016-02-13 15:27:43 +0000137/*
138 * Table of curve information.
Rich Salzddb4c042016-01-03 13:24:32 -0500139 * Do not delete entries or reorder this array! It is used as a lookup
Dr. Stephen Henson2dc1aee2016-02-13 15:27:43 +0000140 * table: the index of each entry is one less than the TLS curve id.
141 */
Matt Caswell0f113f32015-01-22 03:40:55 +0000142static const tls_curve_info nid_list[] = {
143 {NID_sect163k1, 80, TLS_CURVE_CHAR2}, /* sect163k1 (1) */
144 {NID_sect163r1, 80, TLS_CURVE_CHAR2}, /* sect163r1 (2) */
145 {NID_sect163r2, 80, TLS_CURVE_CHAR2}, /* sect163r2 (3) */
146 {NID_sect193r1, 80, TLS_CURVE_CHAR2}, /* sect193r1 (4) */
147 {NID_sect193r2, 80, TLS_CURVE_CHAR2}, /* sect193r2 (5) */
148 {NID_sect233k1, 112, TLS_CURVE_CHAR2}, /* sect233k1 (6) */
149 {NID_sect233r1, 112, TLS_CURVE_CHAR2}, /* sect233r1 (7) */
150 {NID_sect239k1, 112, TLS_CURVE_CHAR2}, /* sect239k1 (8) */
151 {NID_sect283k1, 128, TLS_CURVE_CHAR2}, /* sect283k1 (9) */
152 {NID_sect283r1, 128, TLS_CURVE_CHAR2}, /* sect283r1 (10) */
153 {NID_sect409k1, 192, TLS_CURVE_CHAR2}, /* sect409k1 (11) */
154 {NID_sect409r1, 192, TLS_CURVE_CHAR2}, /* sect409r1 (12) */
155 {NID_sect571k1, 256, TLS_CURVE_CHAR2}, /* sect571k1 (13) */
156 {NID_sect571r1, 256, TLS_CURVE_CHAR2}, /* sect571r1 (14) */
157 {NID_secp160k1, 80, TLS_CURVE_PRIME}, /* secp160k1 (15) */
158 {NID_secp160r1, 80, TLS_CURVE_PRIME}, /* secp160r1 (16) */
159 {NID_secp160r2, 80, TLS_CURVE_PRIME}, /* secp160r2 (17) */
160 {NID_secp192k1, 80, TLS_CURVE_PRIME}, /* secp192k1 (18) */
161 {NID_X9_62_prime192v1, 80, TLS_CURVE_PRIME}, /* secp192r1 (19) */
162 {NID_secp224k1, 112, TLS_CURVE_PRIME}, /* secp224k1 (20) */
163 {NID_secp224r1, 112, TLS_CURVE_PRIME}, /* secp224r1 (21) */
164 {NID_secp256k1, 128, TLS_CURVE_PRIME}, /* secp256k1 (22) */
165 {NID_X9_62_prime256v1, 128, TLS_CURVE_PRIME}, /* secp256r1 (23) */
166 {NID_secp384r1, 192, TLS_CURVE_PRIME}, /* secp384r1 (24) */
167 {NID_secp521r1, 256, TLS_CURVE_PRIME}, /* secp521r1 (25) */
168 {NID_brainpoolP256r1, 128, TLS_CURVE_PRIME}, /* brainpoolP256r1 (26) */
169 {NID_brainpoolP384r1, 192, TLS_CURVE_PRIME}, /* brainpoolP384r1 (27) */
170 {NID_brainpoolP512r1, 256, TLS_CURVE_PRIME}, /* brainpool512r1 (28) */
Dr. Stephen Hensonec246302016-08-11 15:41:49 +0100171 {NID_X25519, 128, TLS_CURVE_CUSTOM}, /* X25519 (29) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000172};
Dr. Stephen Hensoneda37662011-05-30 17:58:13 +0000173
Matt Caswell0f113f32015-01-22 03:40:55 +0000174static const unsigned char ecformats_default[] = {
175 TLSEXT_ECPOINTFORMAT_uncompressed,
176 TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime,
177 TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2
178};
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000179
Kurt Roeckxfe6ef242015-12-04 22:30:36 +0100180/* The default curves */
181static const unsigned char eccurves_default[] = {
Dr. Stephen Henson1db31072016-02-25 17:46:14 +0000182 0, 29, /* X25519 (29) */
Emilia Kasperde57d232015-05-20 15:47:51 +0200183 0, 23, /* secp256r1 (23) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000184 0, 25, /* secp521r1 (25) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000185 0, 24, /* secp384r1 (24) */
Emilia Kasperde57d232015-05-20 15:47:51 +0200186};
187
188static const unsigned char eccurves_all[] = {
Dr. Stephen Henson1db31072016-02-25 17:46:14 +0000189 0, 29, /* X25519 (29) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000190 0, 23, /* secp256r1 (23) */
Emilia Kasperde57d232015-05-20 15:47:51 +0200191 0, 25, /* secp521r1 (25) */
Emilia Kasperde57d232015-05-20 15:47:51 +0200192 0, 24, /* secp384r1 (24) */
193 0, 26, /* brainpoolP256r1 (26) */
Rich Salzddb4c042016-01-03 13:24:32 -0500194 0, 27, /* brainpoolP384r1 (27) */
195 0, 28, /* brainpool512r1 (28) */
196
197 /*
198 * Remaining curves disabled by default but still permitted if set
199 * via an explicit callback or parameters.
200 */
Emilia Kasperde57d232015-05-20 15:47:51 +0200201 0, 22, /* secp256k1 (22) */
Emilia Kasperde57d232015-05-20 15:47:51 +0200202 0, 14, /* sect571r1 (14) */
203 0, 13, /* sect571k1 (13) */
204 0, 11, /* sect409k1 (11) */
205 0, 12, /* sect409r1 (12) */
206 0, 9, /* sect283k1 (9) */
207 0, 10, /* sect283r1 (10) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000208 0, 20, /* secp224k1 (20) */
209 0, 21, /* secp224r1 (21) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000210 0, 18, /* secp192k1 (18) */
211 0, 19, /* secp192r1 (19) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000212 0, 15, /* secp160k1 (15) */
213 0, 16, /* secp160r1 (16) */
214 0, 17, /* secp160r2 (17) */
Emilia Kasperde57d232015-05-20 15:47:51 +0200215 0, 8, /* sect239k1 (8) */
216 0, 6, /* sect233k1 (6) */
217 0, 7, /* sect233r1 (7) */
218 0, 4, /* sect193r1 (4) */
219 0, 5, /* sect193r2 (5) */
220 0, 1, /* sect163k1 (1) */
221 0, 2, /* sect163r1 (2) */
222 0, 3, /* sect163r2 (3) */
Matt Caswell0f113f32015-01-22 03:40:55 +0000223};
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000224
Matt Caswell0f113f32015-01-22 03:40:55 +0000225static const unsigned char suiteb_curves[] = {
226 0, TLSEXT_curve_P_256,
227 0, TLSEXT_curve_P_384
228};
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000229
Dr. Stephen Hensonec246302016-08-11 15:41:49 +0100230int tls1_ec_curve_id2nid(int curve_id, unsigned int *pflags)
Matt Caswell0f113f32015-01-22 03:40:55 +0000231{
Dr. Stephen Hensonec246302016-08-11 15:41:49 +0100232 const tls_curve_info *cinfo;
Matt Caswell0f113f32015-01-22 03:40:55 +0000233 /* ECC curves from RFC 4492 and RFC 7027 */
Dr. Stephen Hensonb6eb9822015-05-02 18:30:00 +0100234 if ((curve_id < 1) || ((unsigned int)curve_id > OSSL_NELEM(nid_list)))
Matt Caswell0f113f32015-01-22 03:40:55 +0000235 return 0;
Dr. Stephen Hensonec246302016-08-11 15:41:49 +0100236 cinfo = nid_list + curve_id - 1;
237 if (pflags)
238 *pflags = cinfo->flags;
239 return cinfo->nid;
Matt Caswell0f113f32015-01-22 03:40:55 +0000240}
Dr. Stephen Henson525de5d2007-08-12 23:59:05 +0000241
242int tls1_ec_nid2curve_id(int nid)
Matt Caswell0f113f32015-01-22 03:40:55 +0000243{
Dr. Stephen Henson2fa2d152016-02-13 15:28:25 +0000244 size_t i;
245 for (i = 0; i < OSSL_NELEM(nid_list); i++) {
246 if (nid_list[i].nid == nid)
Matt Caswell348240c2016-10-19 15:11:24 +0100247 return (int)(i + 1);
Matt Caswell0f113f32015-01-22 03:40:55 +0000248 }
Dr. Stephen Henson2fa2d152016-02-13 15:28:25 +0000249 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +0000250}
251
Emilia Kasper740580c2014-12-01 16:55:55 +0100252/*
253 * Get curves list, if "sess" is set return client curves otherwise
254 * preferred list.
255 * Sets |num_curves| to the number of curves in the list, i.e.,
256 * the length of |pcurves| is 2 * num_curves.
257 * Returns 1 on success and 0 if the client curves list has invalid format.
258 * The latter indicates an internal error: we should not be accepting such
259 * lists in the first place.
260 * TODO(emilia): we should really be storing the curves list in explicitly
261 * parsed form instead. (However, this would affect binary compatibility
262 * so cannot happen in the 1.0.x series.)
Dr. Stephen Hensonfd2b65c2012-04-04 14:41:01 +0000263 */
Matt Caswell6b473ac2016-11-24 16:59:48 +0000264int tls1_get_curvelist(SSL *s, int sess, const unsigned char **pcurves,
265 size_t *num_curves)
Matt Caswell0f113f32015-01-22 03:40:55 +0000266{
267 size_t pcurveslen = 0;
268 if (sess) {
Matt Caswellde4d7642016-11-09 14:51:06 +0000269 *pcurves = s->session->tlsext_supportedgroupslist;
270 pcurveslen = s->session->tlsext_supportedgroupslist_length;
Matt Caswell0f113f32015-01-22 03:40:55 +0000271 } else {
272 /* For Suite B mode only include P-256, P-384 */
273 switch (tls1_suiteb(s)) {
274 case SSL_CERT_FLAG_SUITEB_128_LOS:
275 *pcurves = suiteb_curves;
276 pcurveslen = sizeof(suiteb_curves);
277 break;
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000278
Matt Caswell0f113f32015-01-22 03:40:55 +0000279 case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
280 *pcurves = suiteb_curves;
281 pcurveslen = 2;
282 break;
Dr. Stephen Hensonb34aa492012-12-10 02:02:16 +0000283
Matt Caswell0f113f32015-01-22 03:40:55 +0000284 case SSL_CERT_FLAG_SUITEB_192_LOS:
285 *pcurves = suiteb_curves + 2;
286 pcurveslen = 2;
287 break;
288 default:
Matt Caswellde4d7642016-11-09 14:51:06 +0000289 *pcurves = s->tlsext_supportedgroupslist;
290 pcurveslen = s->tlsext_supportedgroupslist_length;
Matt Caswell0f113f32015-01-22 03:40:55 +0000291 }
292 if (!*pcurves) {
Kurt Roeckxfe6ef242015-12-04 22:30:36 +0100293 *pcurves = eccurves_default;
294 pcurveslen = sizeof(eccurves_default);
Matt Caswell0f113f32015-01-22 03:40:55 +0000295 }
296 }
Emilia Kasper740580c2014-12-01 16:55:55 +0100297
Matt Caswell0f113f32015-01-22 03:40:55 +0000298 /* We do not allow odd length arrays to enter the system. */
299 if (pcurveslen & 1) {
300 SSLerr(SSL_F_TLS1_GET_CURVELIST, ERR_R_INTERNAL_ERROR);
301 *num_curves = 0;
302 return 0;
303 } else {
304 *num_curves = pcurveslen / 2;
305 return 1;
306 }
307}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +0000308
309/* See if curve is allowed by security callback */
Matt Caswell6b473ac2016-11-24 16:59:48 +0000310int tls_curve_allowed(SSL *s, const unsigned char *curve, int op)
Matt Caswell0f113f32015-01-22 03:40:55 +0000311{
312 const tls_curve_info *cinfo;
313 if (curve[0])
314 return 1;
Dr. Stephen Hensonb6eb9822015-05-02 18:30:00 +0100315 if ((curve[1] < 1) || ((size_t)curve[1] > OSSL_NELEM(nid_list)))
Matt Caswell0f113f32015-01-22 03:40:55 +0000316 return 0;
317 cinfo = &nid_list[curve[1] - 1];
318# ifdef OPENSSL_NO_EC2M
319 if (cinfo->flags & TLS_CURVE_CHAR2)
320 return 0;
321# endif
322 return ssl_security(s, op, cinfo->secbits, cinfo->nid, (void *)curve);
323}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +0000324
Dr. Stephen Hensond18b7162012-07-24 13:47:40 +0000325/* Check a curve is one of our preferences */
326int tls1_check_curve(SSL *s, const unsigned char *p, size_t len)
Matt Caswell0f113f32015-01-22 03:40:55 +0000327{
328 const unsigned char *curves;
329 size_t num_curves, i;
330 unsigned int suiteb_flags = tls1_suiteb(s);
331 if (len != 3 || p[0] != NAMED_CURVE_TYPE)
332 return 0;
333 /* Check curve matches Suite B preferences */
334 if (suiteb_flags) {
335 unsigned long cid = s->s3->tmp.new_cipher->id;
336 if (p[1])
337 return 0;
338 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) {
339 if (p[2] != TLSEXT_curve_P_256)
340 return 0;
341 } else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) {
342 if (p[2] != TLSEXT_curve_P_384)
343 return 0;
344 } else /* Should never happen */
345 return 0;
346 }
347 if (!tls1_get_curvelist(s, 0, &curves, &num_curves))
348 return 0;
349 for (i = 0; i < num_curves; i++, curves += 2) {
350 if (p[1] == curves[0] && p[2] == curves[1])
351 return tls_curve_allowed(s, p + 1, SSL_SECOP_CURVE_CHECK);
352 }
353 return 0;
354}
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000355
Tim Hudson1d97c842014-12-28 12:48:40 +1000356/*-
Matt Caswellde4d7642016-11-09 14:51:06 +0000357 * For nmatch >= 0, return the NID of the |nmatch|th shared group or NID_undef
Kurt Roeckx6977e8e2015-12-04 22:25:11 +0100358 * if there is no match.
359 * For nmatch == -1, return number of matches
Matt Caswellde4d7642016-11-09 14:51:06 +0000360 * For nmatch == -2, return the NID of the group to use for
Emilia Kasper376e2ca2014-12-04 15:00:11 +0100361 * an EC tmp key, or NID_undef if there is no match.
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000362 */
Matt Caswellde4d7642016-11-09 14:51:06 +0000363int tls1_shared_group(SSL *s, int nmatch)
Matt Caswell0f113f32015-01-22 03:40:55 +0000364{
365 const unsigned char *pref, *supp;
366 size_t num_pref, num_supp, i, j;
367 int k;
368 /* Can't do anything on client side */
369 if (s->server == 0)
370 return -1;
371 if (nmatch == -2) {
372 if (tls1_suiteb(s)) {
373 /*
374 * For Suite B ciphersuite determines curve: we already know
375 * these are acceptable due to previous checks.
376 */
377 unsigned long cid = s->s3->tmp.new_cipher->id;
378 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
379 return NID_X9_62_prime256v1; /* P-256 */
380 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
381 return NID_secp384r1; /* P-384 */
382 /* Should never happen */
383 return NID_undef;
384 }
385 /* If not Suite B just return first preference shared curve */
386 nmatch = 0;
387 }
388 /*
389 * Avoid truncation. tls1_get_curvelist takes an int
390 * but s->options is a long...
391 */
392 if (!tls1_get_curvelist
393 (s, (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) != 0, &supp,
394 &num_supp))
395 /* In practice, NID_undef == 0 but let's be precise. */
396 return nmatch == -1 ? 0 : NID_undef;
397 if (!tls1_get_curvelist
Emilia Kaspera230b262016-08-05 19:03:17 +0200398 (s, !(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE), &pref, &num_pref))
Matt Caswell0f113f32015-01-22 03:40:55 +0000399 return nmatch == -1 ? 0 : NID_undef;
Kurt Roeckx3c065132015-05-30 19:20:12 +0200400
401 /*
402 * If the client didn't send the elliptic_curves extension all of them
403 * are allowed.
404 */
405 if (num_supp == 0 && (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) != 0) {
406 supp = eccurves_all;
407 num_supp = sizeof(eccurves_all) / 2;
408 } else if (num_pref == 0 &&
Emilia Kaspera230b262016-08-05 19:03:17 +0200409 (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) == 0) {
Kurt Roeckx3c065132015-05-30 19:20:12 +0200410 pref = eccurves_all;
411 num_pref = sizeof(eccurves_all) / 2;
412 }
413
Matt Caswell0f113f32015-01-22 03:40:55 +0000414 k = 0;
415 for (i = 0; i < num_pref; i++, pref += 2) {
416 const unsigned char *tsupp = supp;
417 for (j = 0; j < num_supp; j++, tsupp += 2) {
418 if (pref[0] == tsupp[0] && pref[1] == tsupp[1]) {
419 if (!tls_curve_allowed(s, pref, SSL_SECOP_CURVE_SHARED))
420 continue;
421 if (nmatch == k) {
422 int id = (pref[0] << 8) | pref[1];
Dr. Stephen Hensonec246302016-08-11 15:41:49 +0100423 return tls1_ec_curve_id2nid(id, NULL);
Matt Caswell0f113f32015-01-22 03:40:55 +0000424 }
425 k++;
426 }
427 }
428 }
429 if (nmatch == -1)
430 return k;
431 /* Out of range (nmatch > k). */
432 return NID_undef;
433}
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000434
Matt Caswellde4d7642016-11-09 14:51:06 +0000435int tls1_set_groups(unsigned char **pext, size_t *pextlen,
436 int *groups, size_t ngroups)
Matt Caswell0f113f32015-01-22 03:40:55 +0000437{
Matt Caswellde4d7642016-11-09 14:51:06 +0000438 unsigned char *glist, *p;
Matt Caswell0f113f32015-01-22 03:40:55 +0000439 size_t i;
440 /*
Matt Caswellde4d7642016-11-09 14:51:06 +0000441 * Bitmap of groups included to detect duplicates: only works while group
Matt Caswell0f113f32015-01-22 03:40:55 +0000442 * ids < 32
443 */
444 unsigned long dup_list = 0;
Matt Caswellde4d7642016-11-09 14:51:06 +0000445 glist = OPENSSL_malloc(ngroups * 2);
446 if (glist == NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +0000447 return 0;
Matt Caswellde4d7642016-11-09 14:51:06 +0000448 for (i = 0, p = glist; i < ngroups; i++) {
Matt Caswell0f113f32015-01-22 03:40:55 +0000449 unsigned long idmask;
450 int id;
Matt Caswellde4d7642016-11-09 14:51:06 +0000451 /* TODO(TLS1.3): Convert for DH groups */
452 id = tls1_ec_nid2curve_id(groups[i]);
Matt Caswell0f113f32015-01-22 03:40:55 +0000453 idmask = 1L << id;
454 if (!id || (dup_list & idmask)) {
Matt Caswellde4d7642016-11-09 14:51:06 +0000455 OPENSSL_free(glist);
Matt Caswell0f113f32015-01-22 03:40:55 +0000456 return 0;
457 }
458 dup_list |= idmask;
459 s2n(id, p);
460 }
Rich Salzb548a1f2015-05-01 10:02:07 -0400461 OPENSSL_free(*pext);
Matt Caswellde4d7642016-11-09 14:51:06 +0000462 *pext = glist;
463 *pextlen = ngroups * 2;
Matt Caswell0f113f32015-01-22 03:40:55 +0000464 return 1;
465}
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000466
Matt Caswell0f113f32015-01-22 03:40:55 +0000467# define MAX_CURVELIST 28
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000468
Matt Caswell0f113f32015-01-22 03:40:55 +0000469typedef struct {
470 size_t nidcnt;
471 int nid_arr[MAX_CURVELIST];
472} nid_cb_st;
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000473
474static int nid_cb(const char *elem, int len, void *arg)
Matt Caswell0f113f32015-01-22 03:40:55 +0000475{
476 nid_cb_st *narg = arg;
477 size_t i;
478 int nid;
479 char etmp[20];
Kurt Roeckx2747d732015-01-24 14:46:50 +0100480 if (elem == NULL)
481 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +0000482 if (narg->nidcnt == MAX_CURVELIST)
483 return 0;
484 if (len > (int)(sizeof(etmp) - 1))
485 return 0;
486 memcpy(etmp, elem, len);
487 etmp[len] = 0;
488 nid = EC_curve_nist2nid(etmp);
489 if (nid == NID_undef)
490 nid = OBJ_sn2nid(etmp);
491 if (nid == NID_undef)
492 nid = OBJ_ln2nid(etmp);
493 if (nid == NID_undef)
494 return 0;
495 for (i = 0; i < narg->nidcnt; i++)
496 if (narg->nid_arr[i] == nid)
497 return 0;
498 narg->nid_arr[narg->nidcnt++] = nid;
499 return 1;
500}
501
Matt Caswellde4d7642016-11-09 14:51:06 +0000502/* Set groups based on a colon separate list */
503int tls1_set_groups_list(unsigned char **pext, size_t *pextlen, const char *str)
Matt Caswell0f113f32015-01-22 03:40:55 +0000504{
505 nid_cb_st ncb;
506 ncb.nidcnt = 0;
507 if (!CONF_parse_list(str, ':', 1, nid_cb, &ncb))
508 return 0;
509 if (pext == NULL)
510 return 1;
Matt Caswellde4d7642016-11-09 14:51:06 +0000511 return tls1_set_groups(pext, pextlen, ncb.nid_arr, ncb.nidcnt);
Matt Caswell0f113f32015-01-22 03:40:55 +0000512}
513
Dr. Stephen Hensonfd2b65c2012-04-04 14:41:01 +0000514/* For an EC key set TLS id and required compression based on parameters */
515static int tls1_set_ec_id(unsigned char *curve_id, unsigned char *comp_id,
Matt Caswell0f113f32015-01-22 03:40:55 +0000516 EC_KEY *ec)
517{
Dr. Stephen Henson2235b7f2016-02-13 15:26:15 +0000518 int id;
Matt Caswell0f113f32015-01-22 03:40:55 +0000519 const EC_GROUP *grp;
Matt Caswell0f113f32015-01-22 03:40:55 +0000520 if (!ec)
521 return 0;
522 /* Determine if it is a prime field */
523 grp = EC_KEY_get0_group(ec);
524 if (!grp)
525 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +0000526 /* Determine curve ID */
527 id = EC_GROUP_get_curve_name(grp);
528 id = tls1_ec_nid2curve_id(id);
Dr. Stephen Henson2235b7f2016-02-13 15:26:15 +0000529 /* If no id return error: we don't support arbitrary explicit curves */
530 if (id == 0)
531 return 0;
532 curve_id[0] = 0;
533 curve_id[1] = (unsigned char)id;
Matt Caswell0f113f32015-01-22 03:40:55 +0000534 if (comp_id) {
535 if (EC_KEY_get0_public_key(ec) == NULL)
536 return 0;
Dr. Stephen Henson2235b7f2016-02-13 15:26:15 +0000537 if (EC_KEY_get_conv_form(ec) == POINT_CONVERSION_UNCOMPRESSED) {
538 *comp_id = TLSEXT_ECPOINTFORMAT_uncompressed;
539 } else {
540 if ((nid_list[id - 1].flags & TLS_CURVE_TYPE) == TLS_CURVE_PRIME)
Matt Caswell0f113f32015-01-22 03:40:55 +0000541 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
542 else
543 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
Dr. Stephen Henson2235b7f2016-02-13 15:26:15 +0000544 }
Matt Caswell0f113f32015-01-22 03:40:55 +0000545 }
546 return 1;
547}
548
Dr. Stephen Hensonfd2b65c2012-04-04 14:41:01 +0000549/* Check an EC key is compatible with extensions */
550static int tls1_check_ec_key(SSL *s,
Matt Caswell0f113f32015-01-22 03:40:55 +0000551 unsigned char *curve_id, unsigned char *comp_id)
552{
553 const unsigned char *pformats, *pcurves;
554 size_t num_formats, num_curves, i;
555 int j;
556 /*
557 * If point formats extension present check it, otherwise everything is
558 * supported (see RFC4492).
559 */
560 if (comp_id && s->session->tlsext_ecpointformatlist) {
561 pformats = s->session->tlsext_ecpointformatlist;
562 num_formats = s->session->tlsext_ecpointformatlist_length;
563 for (i = 0; i < num_formats; i++, pformats++) {
564 if (*comp_id == *pformats)
565 break;
566 }
567 if (i == num_formats)
568 return 0;
569 }
570 if (!curve_id)
571 return 1;
572 /* Check curve is consistent with client and server preferences */
573 for (j = 0; j <= 1; j++) {
574 if (!tls1_get_curvelist(s, j, &pcurves, &num_curves))
575 return 0;
Matt Caswellb79d2412015-03-20 15:10:16 +0000576 if (j == 1 && num_curves == 0) {
577 /*
578 * If we've not received any curves then skip this check.
579 * RFC 4492 does not require the supported elliptic curves extension
580 * so if it is not sent we can just choose any curve.
581 * It is invalid to send an empty list in the elliptic curves
582 * extension, so num_curves == 0 always means no extension.
583 */
584 break;
585 }
Matt Caswell0f113f32015-01-22 03:40:55 +0000586 for (i = 0; i < num_curves; i++, pcurves += 2) {
587 if (pcurves[0] == curve_id[0] && pcurves[1] == curve_id[1])
588 break;
589 }
590 if (i == num_curves)
591 return 0;
592 /* For clients can only check sent curve list */
593 if (!s->server)
594 break;
595 }
596 return 1;
597}
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +0000598
Dr. Stephen Henson5087afa2012-11-26 18:38:10 +0000599static void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
Matt Caswell0f113f32015-01-22 03:40:55 +0000600 size_t *num_formats)
601{
602 /*
603 * If we have a custom point format list use it otherwise use default
604 */
605 if (s->tlsext_ecpointformatlist) {
606 *pformats = s->tlsext_ecpointformatlist;
607 *num_formats = s->tlsext_ecpointformatlist_length;
608 } else {
609 *pformats = ecformats_default;
610 /* For Suite B we don't support char2 fields */
611 if (tls1_suiteb(s))
612 *num_formats = sizeof(ecformats_default) - 1;
613 else
614 *num_formats = sizeof(ecformats_default);
615 }
616}
Dr. Stephen Henson5087afa2012-11-26 18:38:10 +0000617
Matt Caswell0f113f32015-01-22 03:40:55 +0000618/*
619 * Check cert parameters compatible with extensions: currently just checks EC
620 * certificates have compatible curves and compression.
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +0000621 */
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000622static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
Matt Caswell0f113f32015-01-22 03:40:55 +0000623{
624 unsigned char comp_id, curve_id[2];
625 EVP_PKEY *pkey;
626 int rv;
Dr. Stephen Henson8382fd32015-12-20 00:32:36 +0000627 pkey = X509_get0_pubkey(x);
Matt Caswell0f113f32015-01-22 03:40:55 +0000628 if (!pkey)
629 return 0;
630 /* If not EC nothing to do */
Dr. Stephen Henson3aeb9342016-01-19 00:21:12 +0000631 if (EVP_PKEY_id(pkey) != EVP_PKEY_EC)
Matt Caswell0f113f32015-01-22 03:40:55 +0000632 return 1;
Dr. Stephen Henson3aeb9342016-01-19 00:21:12 +0000633 rv = tls1_set_ec_id(curve_id, &comp_id, EVP_PKEY_get0_EC_KEY(pkey));
Matt Caswell0f113f32015-01-22 03:40:55 +0000634 if (!rv)
635 return 0;
636 /*
637 * Can't check curve_id for client certs as we don't have a supported
638 * curves extension.
639 */
640 rv = tls1_check_ec_key(s, s->server ? curve_id : NULL, &comp_id);
641 if (!rv)
642 return 0;
643 /*
644 * Special case for suite B. We *MUST* sign using SHA256+P-256 or
645 * SHA384+P-384, adjust digest if necessary.
646 */
647 if (set_ee_md && tls1_suiteb(s)) {
648 int check_md;
649 size_t i;
650 CERT *c = s->cert;
651 if (curve_id[0])
652 return 0;
653 /* Check to see we have necessary signing algorithm */
654 if (curve_id[1] == TLSEXT_curve_P_256)
655 check_md = NID_ecdsa_with_SHA256;
656 else if (curve_id[1] == TLSEXT_curve_P_384)
657 check_md = NID_ecdsa_with_SHA384;
658 else
659 return 0; /* Should never happen */
660 for (i = 0; i < c->shared_sigalgslen; i++)
661 if (check_md == c->shared_sigalgs[i].signandhash_nid)
662 break;
663 if (i == c->shared_sigalgslen)
664 return 0;
665 if (set_ee_md == 2) {
666 if (check_md == NID_ecdsa_with_SHA256)
Dr. Stephen Hensond376e572015-05-12 18:56:39 +0100667 s->s3->tmp.md[SSL_PKEY_ECC] = EVP_sha256();
Matt Caswell0f113f32015-01-22 03:40:55 +0000668 else
Dr. Stephen Hensond376e572015-05-12 18:56:39 +0100669 s->s3->tmp.md[SSL_PKEY_ECC] = EVP_sha384();
Matt Caswell0f113f32015-01-22 03:40:55 +0000670 }
671 }
672 return rv;
673}
674
Rich Salz10bf4fc2015-03-10 19:09:27 -0400675# ifndef OPENSSL_NO_EC
Kurt Roeckx6977e8e2015-12-04 22:25:11 +0100676/*
FdaSilvaYY8483a002016-03-10 21:34:48 +0100677 * tls1_check_ec_tmp_key - Check EC temporary key compatibility
Kurt Roeckx6977e8e2015-12-04 22:25:11 +0100678 * @s: SSL connection
679 * @cid: Cipher ID we're considering using
680 *
681 * Checks that the kECDHE cipher suite we're considering using
682 * is compatible with the client extensions.
683 *
684 * Returns 0 when the cipher can't be used or 1 when it can.
685 */
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000686int tls1_check_ec_tmp_key(SSL *s, unsigned long cid)
Matt Caswell0f113f32015-01-22 03:40:55 +0000687{
Matt Caswell0f113f32015-01-22 03:40:55 +0000688 /*
689 * If Suite B, AES128 MUST use P-256 and AES256 MUST use P-384, no other
690 * curves permitted.
691 */
692 if (tls1_suiteb(s)) {
Kurt Roeckx6977e8e2015-12-04 22:25:11 +0100693 unsigned char curve_id[2];
Matt Caswell0f113f32015-01-22 03:40:55 +0000694 /* Curve to check determined by ciphersuite */
695 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
696 curve_id[1] = TLSEXT_curve_P_256;
697 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
698 curve_id[1] = TLSEXT_curve_P_384;
699 else
700 return 0;
701 curve_id[0] = 0;
702 /* Check this curve is acceptable */
703 if (!tls1_check_ec_key(s, curve_id, NULL))
704 return 0;
Kurt Roeckxfe6ef242015-12-04 22:30:36 +0100705 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +0000706 }
Kurt Roeckxfe6ef242015-12-04 22:30:36 +0100707 /* Need a shared curve */
Matt Caswellde4d7642016-11-09 14:51:06 +0000708 if (tls1_shared_group(s, 0))
Kurt Roeckxfe6ef242015-12-04 22:30:36 +0100709 return 1;
Kurt Roeckx6977e8e2015-12-04 22:25:11 +0100710 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +0000711}
Rich Salz10bf4fc2015-03-10 19:09:27 -0400712# endif /* OPENSSL_NO_EC */
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +0000713
Dr. Stephen Henson14536c82013-08-17 17:40:08 +0100714#else
715
716static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
Matt Caswell0f113f32015-01-22 03:40:55 +0000717{
718 return 1;
719}
Dr. Stephen Henson14536c82013-08-17 17:40:08 +0100720
Matt Caswell0f113f32015-01-22 03:40:55 +0000721#endif /* OPENSSL_NO_EC */
Bodo Möllerf1fd4542006-01-03 03:27:19 +0000722
Matt Caswell0f113f32015-01-22 03:40:55 +0000723/*
724 * List of supported signature algorithms and hashes. Should make this
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000725 * customisable at some point, for now include everything we support.
726 */
727
Matt Caswelle481f9b2015-05-15 10:49:56 +0100728#ifdef OPENSSL_NO_RSA
Emilia Kaspera230b262016-08-05 19:03:17 +0200729# define tlsext_sigalg_rsa(md) /* */
Matt Caswelle481f9b2015-05-15 10:49:56 +0100730#else
731# define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
732#endif
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000733
Matt Caswelle481f9b2015-05-15 10:49:56 +0100734#ifdef OPENSSL_NO_DSA
Emilia Kaspera230b262016-08-05 19:03:17 +0200735# define tlsext_sigalg_dsa(md) /* */
Matt Caswelle481f9b2015-05-15 10:49:56 +0100736#else
737# define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
738#endif
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000739
Matt Caswelle481f9b2015-05-15 10:49:56 +0100740#ifdef OPENSSL_NO_EC
Emilia Kaspera230b262016-08-05 19:03:17 +0200741# define tlsext_sigalg_ecdsa(md)/* */
Matt Caswelle481f9b2015-05-15 10:49:56 +0100742#else
743# define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
744#endif
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000745
Matt Caswelle481f9b2015-05-15 10:49:56 +0100746#define tlsext_sigalg(md) \
Matt Caswell0f113f32015-01-22 03:40:55 +0000747 tlsext_sigalg_rsa(md) \
748 tlsext_sigalg_dsa(md) \
749 tlsext_sigalg_ecdsa(md)
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000750
Cristian Rodríguezd97ed212014-04-20 18:41:15 -0300751static const unsigned char tls12_sigalgs[] = {
Matt Caswell0f113f32015-01-22 03:40:55 +0000752 tlsext_sigalg(TLSEXT_hash_sha512)
753 tlsext_sigalg(TLSEXT_hash_sha384)
Matt Caswell0f113f32015-01-22 03:40:55 +0000754 tlsext_sigalg(TLSEXT_hash_sha256)
755 tlsext_sigalg(TLSEXT_hash_sha224)
Matt Caswell0f113f32015-01-22 03:40:55 +0000756 tlsext_sigalg(TLSEXT_hash_sha1)
Dmitry Belyavskye44380a2015-11-17 15:32:30 +0000757#ifndef OPENSSL_NO_GOST
758 TLSEXT_hash_gostr3411, TLSEXT_signature_gostr34102001,
Emilia Kaspera230b262016-08-05 19:03:17 +0200759 TLSEXT_hash_gostr34112012_256, TLSEXT_signature_gostr34102012_256,
760 TLSEXT_hash_gostr34112012_512, TLSEXT_signature_gostr34102012_512
Dmitry Belyavskye44380a2015-11-17 15:32:30 +0000761#endif
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000762};
Matt Caswell0f113f32015-01-22 03:40:55 +0000763
Matt Caswelle481f9b2015-05-15 10:49:56 +0100764#ifndef OPENSSL_NO_EC
Cristian Rodríguezd97ed212014-04-20 18:41:15 -0300765static const unsigned char suiteb_sigalgs[] = {
Matt Caswell0f113f32015-01-22 03:40:55 +0000766 tlsext_sigalg_ecdsa(TLSEXT_hash_sha256)
767 tlsext_sigalg_ecdsa(TLSEXT_hash_sha384)
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000768};
Matt Caswelle481f9b2015-05-15 10:49:56 +0100769#endif
Dr. Stephen Hensonb7bfe692012-07-18 14:09:46 +0000770size_t tls12_get_psigalgs(SSL *s, const unsigned char **psigs)
Matt Caswell0f113f32015-01-22 03:40:55 +0000771{
772 /*
773 * If Suite B mode use Suite B sigalgs only, ignore any other
774 * preferences.
775 */
Matt Caswelle481f9b2015-05-15 10:49:56 +0100776#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +0000777 switch (tls1_suiteb(s)) {
778 case SSL_CERT_FLAG_SUITEB_128_LOS:
779 *psigs = suiteb_sigalgs;
780 return sizeof(suiteb_sigalgs);
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000781
Matt Caswell0f113f32015-01-22 03:40:55 +0000782 case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
783 *psigs = suiteb_sigalgs;
784 return 2;
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000785
Matt Caswell0f113f32015-01-22 03:40:55 +0000786 case SSL_CERT_FLAG_SUITEB_192_LOS:
787 *psigs = suiteb_sigalgs + 2;
788 return 2;
789 }
Matt Caswelle481f9b2015-05-15 10:49:56 +0100790#endif
Matt Caswell0f113f32015-01-22 03:40:55 +0000791 /* If server use client authentication sigalgs if not NULL */
792 if (s->server && s->cert->client_sigalgs) {
793 *psigs = s->cert->client_sigalgs;
794 return s->cert->client_sigalgslen;
795 } else if (s->cert->conf_sigalgs) {
796 *psigs = s->cert->conf_sigalgs;
797 return s->cert->conf_sigalgslen;
798 } else {
799 *psigs = tls12_sigalgs;
800 return sizeof(tls12_sigalgs);
801 }
802}
803
804/*
805 * Check signature algorithm is consistent with sent supported signature
Dr. Stephen Hensonec4a50b2012-07-24 18:11:27 +0000806 * algorithms and if so return relevant digest.
807 */
808int tls12_check_peer_sigalg(const EVP_MD **pmd, SSL *s,
Matt Caswell0f113f32015-01-22 03:40:55 +0000809 const unsigned char *sig, EVP_PKEY *pkey)
810{
811 const unsigned char *sent_sigs;
812 size_t sent_sigslen, i;
813 int sigalg = tls12_get_sigid(pkey);
814 /* Should never happen */
815 if (sigalg == -1)
816 return -1;
817 /* Check key type is consistent with signature */
818 if (sigalg != (int)sig[1]) {
819 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG, SSL_R_WRONG_SIGNATURE_TYPE);
820 return 0;
821 }
Matt Caswelle481f9b2015-05-15 10:49:56 +0100822#ifndef OPENSSL_NO_EC
Dr. Stephen Henson3aeb9342016-01-19 00:21:12 +0000823 if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
Matt Caswell0f113f32015-01-22 03:40:55 +0000824 unsigned char curve_id[2], comp_id;
825 /* Check compression and curve matches extensions */
Dr. Stephen Henson3aeb9342016-01-19 00:21:12 +0000826 if (!tls1_set_ec_id(curve_id, &comp_id, EVP_PKEY_get0_EC_KEY(pkey)))
Matt Caswell0f113f32015-01-22 03:40:55 +0000827 return 0;
828 if (!s->server && !tls1_check_ec_key(s, curve_id, &comp_id)) {
829 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG, SSL_R_WRONG_CURVE);
830 return 0;
831 }
832 /* If Suite B only P-384+SHA384 or P-256+SHA-256 allowed */
833 if (tls1_suiteb(s)) {
834 if (curve_id[0])
835 return 0;
836 if (curve_id[1] == TLSEXT_curve_P_256) {
837 if (sig[0] != TLSEXT_hash_sha256) {
838 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,
839 SSL_R_ILLEGAL_SUITEB_DIGEST);
840 return 0;
841 }
842 } else if (curve_id[1] == TLSEXT_curve_P_384) {
843 if (sig[0] != TLSEXT_hash_sha384) {
844 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,
845 SSL_R_ILLEGAL_SUITEB_DIGEST);
846 return 0;
847 }
848 } else
849 return 0;
850 }
851 } else if (tls1_suiteb(s))
852 return 0;
Matt Caswelle481f9b2015-05-15 10:49:56 +0100853#endif
Dr. Stephen Henson2ea80352012-08-15 15:15:05 +0000854
Matt Caswell0f113f32015-01-22 03:40:55 +0000855 /* Check signature matches a type we sent */
856 sent_sigslen = tls12_get_psigalgs(s, &sent_sigs);
857 for (i = 0; i < sent_sigslen; i += 2, sent_sigs += 2) {
858 if (sig[0] == sent_sigs[0] && sig[1] == sent_sigs[1])
859 break;
860 }
861 /* Allow fallback to SHA1 if not strict mode */
862 if (i == sent_sigslen
863 && (sig[0] != TLSEXT_hash_sha1
864 || s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)) {
865 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG, SSL_R_WRONG_SIGNATURE_TYPE);
866 return 0;
867 }
868 *pmd = tls12_get_hash(sig[0]);
869 if (*pmd == NULL) {
870 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG, SSL_R_UNKNOWN_DIGEST);
871 return 0;
872 }
873 /* Make sure security callback allows algorithm */
874 if (!ssl_security(s, SSL_SECOP_SIGALG_CHECK,
Emilia Kaspera230b262016-08-05 19:03:17 +0200875 EVP_MD_size(*pmd) * 4, EVP_MD_type(*pmd), (void *)sig)) {
Matt Caswell0f113f32015-01-22 03:40:55 +0000876 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG, SSL_R_WRONG_SIGNATURE_TYPE);
877 return 0;
878 }
879 /*
880 * Store the digest used so applications can retrieve it if they wish.
881 */
Dr. Stephen Hensond376e572015-05-12 18:56:39 +0100882 s->s3->tmp.peer_md = *pmd;
Matt Caswell0f113f32015-01-22 03:40:55 +0000883 return 1;
884}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +0000885
Matt Caswell0f113f32015-01-22 03:40:55 +0000886/*
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100887 * Set a mask of disabled algorithms: an algorithm is disabled if it isn't
888 * supported, doesn't appear in supported signature algorithms, isn't supported
889 * by the enabled protocol versions or by the security level.
890 *
891 * This function should only be used for checking which ciphers are supported
892 * by the client.
893 *
894 * Call ssl_cipher_disabled() to check that it's enabled or not.
Dr. Stephen Hensonb7bfe692012-07-18 14:09:46 +0000895 */
896void ssl_set_client_disabled(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +0000897{
Dr. Stephen Henson4d69f9e2015-05-18 23:29:57 +0100898 s->s3->tmp.mask_a = 0;
899 s->s3->tmp.mask_k = 0;
Dr. Stephen Henson4d69f9e2015-05-18 23:29:57 +0100900 ssl_set_sig_mask(&s->s3->tmp.mask_a, s, SSL_SECOP_SIGALG_MASK);
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100901 ssl_get_client_min_max_version(s, &s->s3->tmp.min_ver, &s->s3->tmp.max_ver);
Emilia Kaspera230b262016-08-05 19:03:17 +0200902#ifndef OPENSSL_NO_PSK
Matt Caswell0f113f32015-01-22 03:40:55 +0000903 /* with PSK there must be client callback set */
904 if (!s->psk_client_callback) {
Dr. Stephen Henson4d69f9e2015-05-18 23:29:57 +0100905 s->s3->tmp.mask_a |= SSL_aPSK;
Dr. Stephen Hensonfe5eef32015-06-28 17:01:07 +0100906 s->s3->tmp.mask_k |= SSL_PSK;
Matt Caswell0f113f32015-01-22 03:40:55 +0000907 }
Emilia Kaspera230b262016-08-05 19:03:17 +0200908#endif /* OPENSSL_NO_PSK */
Matt Caswelle481f9b2015-05-15 10:49:56 +0100909#ifndef OPENSSL_NO_SRP
Matt Caswell0f113f32015-01-22 03:40:55 +0000910 if (!(s->srp_ctx.srp_Mask & SSL_kSRP)) {
Dr. Stephen Henson4d69f9e2015-05-18 23:29:57 +0100911 s->s3->tmp.mask_a |= SSL_aSRP;
912 s->s3->tmp.mask_k |= SSL_kSRP;
Matt Caswell0f113f32015-01-22 03:40:55 +0000913 }
Matt Caswelle481f9b2015-05-15 10:49:56 +0100914#endif
Matt Caswell0f113f32015-01-22 03:40:55 +0000915}
Dr. Stephen Hensonfc101f82011-05-11 16:33:28 +0000916
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100917/*
918 * ssl_cipher_disabled - check that a cipher is disabled or not
919 * @s: SSL connection that you want to use the cipher on
920 * @c: cipher to check
921 * @op: Security check that you want to do
922 *
923 * Returns 1 when it's disabled, 0 when enabled.
924 */
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +0000925int ssl_cipher_disabled(SSL *s, const SSL_CIPHER *c, int op)
Matt Caswell0f113f32015-01-22 03:40:55 +0000926{
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100927 if (c->algorithm_mkey & s->s3->tmp.mask_k
Dr. Stephen Henson4d69f9e2015-05-18 23:29:57 +0100928 || c->algorithm_auth & s->s3->tmp.mask_a)
Matt Caswell0f113f32015-01-22 03:40:55 +0000929 return 1;
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100930 if (s->s3->tmp.max_ver == 0)
931 return 1;
932 if (!SSL_IS_DTLS(s) && ((c->min_tls > s->s3->tmp.max_ver)
Emilia Kaspera230b262016-08-05 19:03:17 +0200933 || (c->max_tls < s->s3->tmp.min_ver)))
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100934 return 1;
935 if (SSL_IS_DTLS(s) && (DTLS_VERSION_GT(c->min_dtls, s->s3->tmp.max_ver)
Emilia Kaspera230b262016-08-05 19:03:17 +0200936 || DTLS_VERSION_LT(c->max_dtls, s->s3->tmp.min_ver)))
Kurt Roeckx3eb2aff2016-02-07 20:17:07 +0100937 return 1;
938
Matt Caswell0f113f32015-01-22 03:40:55 +0000939 return !ssl_security(s, op, c->strength_bits, 0, (void *)c);
940}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +0000941
942static int tls_use_ticket(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +0000943{
Matt Caswellf5ca0b02016-11-21 12:10:35 +0000944 if ((s->options & SSL_OP_NO_TICKET) || SSL_IS_TLS13(s))
Matt Caswell0f113f32015-01-22 03:40:55 +0000945 return 0;
946 return ssl_security(s, SSL_SECOP_TICKET, 0, 0, NULL);
947}
Dr. Stephen Henson8b8e5be2014-01-14 14:55:21 +0000948
Emilia Kaspera230b262016-08-05 19:03:17 +0200949static int compare_uint(const void *p1, const void *p2)
950{
Emilia Kasperaa474d12016-02-19 17:24:44 +0100951 unsigned int u1 = *((const unsigned int *)p1);
952 unsigned int u2 = *((const unsigned int *)p2);
953 if (u1 < u2)
954 return -1;
955 else if (u1 > u2)
956 return 1;
957 else
958 return 0;
959}
960
961/*
962 * Per http://tools.ietf.org/html/rfc5246#section-7.4.1.4, there may not be
963 * more than one extension of the same type in a ClientHello or ServerHello.
964 * This function does an initial scan over the extensions block to filter those
965 * out. It returns 1 if all extensions are unique, and 0 if the extensions
966 * contain duplicates, could not be successfully parsed, or an internal error
967 * occurred.
968 */
Emilia Kaspera230b262016-08-05 19:03:17 +0200969static int tls1_check_duplicate_extensions(const PACKET *packet)
970{
Emilia Kasperaa474d12016-02-19 17:24:44 +0100971 PACKET extensions = *packet;
972 size_t num_extensions = 0, i = 0;
973 unsigned int *extension_types = NULL;
974 int ret = 0;
975
976 /* First pass: count the extensions. */
977 while (PACKET_remaining(&extensions) > 0) {
978 unsigned int type;
979 PACKET extension;
980 if (!PACKET_get_net_2(&extensions, &type) ||
981 !PACKET_get_length_prefixed_2(&extensions, &extension)) {
982 goto done;
983 }
984 num_extensions++;
985 }
986
987 if (num_extensions <= 1)
988 return 1;
989
990 extension_types = OPENSSL_malloc(sizeof(unsigned int) * num_extensions);
991 if (extension_types == NULL) {
992 SSLerr(SSL_F_TLS1_CHECK_DUPLICATE_EXTENSIONS, ERR_R_MALLOC_FAILURE);
993 goto done;
994 }
995
996 /* Second pass: gather the extension types. */
997 extensions = *packet;
998 for (i = 0; i < num_extensions; i++) {
999 PACKET extension;
1000 if (!PACKET_get_net_2(&extensions, &extension_types[i]) ||
1001 !PACKET_get_length_prefixed_2(&extensions, &extension)) {
1002 /* This should not happen. */
1003 SSLerr(SSL_F_TLS1_CHECK_DUPLICATE_EXTENSIONS, ERR_R_INTERNAL_ERROR);
1004 goto done;
1005 }
1006 }
1007
1008 if (PACKET_remaining(&extensions) != 0) {
1009 SSLerr(SSL_F_TLS1_CHECK_DUPLICATE_EXTENSIONS, ERR_R_INTERNAL_ERROR);
1010 goto done;
1011 }
1012 /* Sort the extensions and make sure there are no duplicates. */
1013 qsort(extension_types, num_extensions, sizeof(unsigned int), compare_uint);
1014 for (i = 1; i < num_extensions; i++) {
1015 if (extension_types[i - 1] == extension_types[i])
1016 goto done;
1017 }
1018 ret = 1;
1019 done:
1020 OPENSSL_free(extension_types);
1021 return ret;
1022}
1023
Matt Caswellae2f7b32016-09-05 17:34:04 +01001024int ssl_add_clienthello_tlsext(SSL *s, WPACKET *pkt, int *al)
Matt Caswell0f113f32015-01-22 03:40:55 +00001025{
Matt Caswelle481f9b2015-05-15 10:49:56 +01001026#ifndef OPENSSL_NO_EC
Matt Caswelld2c27a22016-10-31 14:49:52 +00001027 const unsigned char *pcurves = NULL;
1028 size_t num_curves = 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001029 int using_ecc = 0;
Matt Caswellc805f612016-11-21 13:24:50 +00001030 int min_version, max_version, reason;
Matt Caswelld2c27a22016-10-31 14:49:52 +00001031
1032 /* See if we support any ECC ciphersuites */
Matt Caswellc805f612016-11-21 13:24:50 +00001033 if ((s->version >= TLS1_VERSION && s->version <= TLS1_3_VERSION)
Matt Caswelld2c27a22016-10-31 14:49:52 +00001034 || SSL_IS_DTLS(s)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001035 int i;
1036 unsigned long alg_k, alg_a;
1037 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +00001038
Matt Caswell0f113f32015-01-22 03:40:55 +00001039 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++) {
Dr. Stephen Henson4a640fb2015-12-23 00:47:28 +00001040 const SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
Dr. Stephen Hensond0595f12012-03-28 15:05:04 +00001041
Matt Caswell0f113f32015-01-22 03:40:55 +00001042 alg_k = c->algorithm_mkey;
1043 alg_a = c->algorithm_auth;
Dr. Stephen Hensonce0c1f22016-02-11 18:19:27 +00001044 if ((alg_k & (SSL_kECDHE | SSL_kECDHEPSK))
Matt Caswellc805f612016-11-21 13:24:50 +00001045 || (alg_a & SSL_aECDSA)
1046 || c->min_tls >= TLS1_3_VERSION) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001047 using_ecc = 1;
1048 break;
1049 }
Dr. Stephen Henson5a3d8ee2014-11-03 17:47:11 +00001050 }
Matt Caswelld2c27a22016-10-31 14:49:52 +00001051 }
1052#else
Matt Caswell94ed2c62016-11-14 14:53:31 +00001053 if (SSL_IS_TLS13(s)) {
Matt Caswelld2c27a22016-10-31 14:49:52 +00001054 /* Shouldn't happen! */
1055 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1056 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001057 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001058#endif
Dr. Stephen Henson5a3d8ee2014-11-03 17:47:11 +00001059
Matt Caswell0f113f32015-01-22 03:40:55 +00001060 /* Add RI if renegotiating */
1061 if (s->renegotiate) {
Matt Caswell08029df2016-09-20 14:47:44 +01001062 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate)
Matt Caswell2f971922016-09-26 15:31:20 +01001063 || !WPACKET_start_sub_packet_u16(pkt)
1064 || !WPACKET_sub_memcpy_u8(pkt, s->s3->previous_client_finished,
1065 s->s3->previous_client_finished_len)
1066 || !WPACKET_close(pkt)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001067 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001068 return 0;
Dr. Stephen Henson860c3dd2009-11-11 14:51:19 +00001069 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001070 }
1071 /* Only add RI for SSLv3 */
1072 if (s->client_version == SSL3_VERSION)
1073 goto done;
Bodo Möller36ca4ba2006-03-11 23:46:37 +00001074
Matt Caswell0f113f32015-01-22 03:40:55 +00001075 if (s->tlsext_hostname != NULL) {
1076 /* Add TLS extension servername to the Client Hello message */
Matt Caswell08029df2016-09-20 14:47:44 +01001077 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001078 /* Sub-packet for server_name extension */
Matt Caswellde451852016-09-09 00:13:41 +01001079 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001080 /* Sub-packet for servername list (always 1 hostname)*/
Matt Caswellde451852016-09-09 00:13:41 +01001081 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswell08029df2016-09-20 14:47:44 +01001082 || !WPACKET_put_bytes_u8(pkt, TLSEXT_NAMETYPE_host_name)
Matt Caswellb2b30242016-09-13 11:32:52 +01001083 || !WPACKET_sub_memcpy_u16(pkt, s->tlsext_hostname,
1084 strlen(s->tlsext_hostname))
Matt Caswell0217dd12016-09-06 15:09:51 +01001085 || !WPACKET_close(pkt)
1086 || !WPACKET_close(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001087 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1088 return 0;
1089 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001090 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001091#ifndef OPENSSL_NO_SRP
Matt Caswell0f113f32015-01-22 03:40:55 +00001092 /* Add SRP username if there is one */
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001093 if (s->srp_ctx.login != NULL) {
Matt Caswell08029df2016-09-20 14:47:44 +01001094 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_srp)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001095 /* Sub-packet for SRP extension */
Matt Caswellde451852016-09-09 00:13:41 +01001096 || !WPACKET_start_sub_packet_u16(pkt)
1097 || !WPACKET_start_sub_packet_u8(pkt)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001098 /* login must not be zero...internal error if so */
Matt Caswellde451852016-09-09 00:13:41 +01001099 || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH)
Matt Caswell0217dd12016-09-06 15:09:51 +01001100 || !WPACKET_memcpy(pkt, s->srp_ctx.login,
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001101 strlen(s->srp_ctx.login))
Matt Caswell0217dd12016-09-06 15:09:51 +01001102 || !WPACKET_close(pkt)
1103 || !WPACKET_close(pkt)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001104 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001105 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001106 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001107 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001108#endif
Ben Laurie333f9262011-11-15 22:59:20 +00001109
Matt Caswelle481f9b2015-05-15 10:49:56 +01001110#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00001111 if (using_ecc) {
1112 /*
1113 * Add TLS extension ECPointFormats to the ClientHello message
1114 */
Matt Caswelld2c27a22016-10-31 14:49:52 +00001115 const unsigned char *pformats, *pcurvestmp;
1116 size_t num_formats;
Matt Caswell0f113f32015-01-22 03:40:55 +00001117 size_t i;
Ben Laurie333f9262011-11-15 22:59:20 +00001118
Matt Caswell0f113f32015-01-22 03:40:55 +00001119 tls1_get_formatlist(s, &pformats, &num_formats);
Ben Laurie333f9262011-11-15 22:59:20 +00001120
Matt Caswell08029df2016-09-20 14:47:44 +01001121 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001122 /* Sub-packet for formats extension */
Matt Caswellde451852016-09-09 00:13:41 +01001123 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswellb2b30242016-09-13 11:32:52 +01001124 || !WPACKET_sub_memcpy_u8(pkt, pformats, num_formats)
Matt Caswell0217dd12016-09-06 15:09:51 +01001125 || !WPACKET_close(pkt)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001126 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001127 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001128 }
Dr. Stephen Henson0e1dba92007-10-26 12:06:36 +00001129
Matt Caswell0f113f32015-01-22 03:40:55 +00001130 /*
Matt Caswellde4d7642016-11-09 14:51:06 +00001131 * Add TLS extension supported_groups to the ClientHello message
Matt Caswell0f113f32015-01-22 03:40:55 +00001132 */
Matt Caswellde4d7642016-11-09 14:51:06 +00001133 /* TODO(TLS1.3): Add support for DHE groups */
1134 pcurves = s->tlsext_supportedgroupslist;
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001135 if (!tls1_get_curvelist(s, 0, &pcurves, &num_curves)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001136 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001137 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001138 }
Matt Caswelld2c27a22016-10-31 14:49:52 +00001139 pcurvestmp = pcurves;
Dr. Stephen Henson48175042011-12-31 22:59:57 +00001140
Matt Caswellde4d7642016-11-09 14:51:06 +00001141 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
1142 /* Sub-packet for supported_groups extension */
Matt Caswellde451852016-09-09 00:13:41 +01001143 || !WPACKET_start_sub_packet_u16(pkt)
1144 || !WPACKET_start_sub_packet_u16(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001145 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1146 return 0;
1147 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001148 /* Copy curve ID if supported */
Matt Caswelld2c27a22016-10-31 14:49:52 +00001149 for (i = 0; i < num_curves; i++, pcurvestmp += 2) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001150 if (tls_curve_allowed(s, pcurves, SSL_SECOP_CURVE_SUPPORTED)) {
Matt Caswelld2c27a22016-10-31 14:49:52 +00001151 if (!WPACKET_put_bytes_u8(pkt, pcurvestmp[0])
1152 || !WPACKET_put_bytes_u8(pkt, pcurvestmp[1])) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001153 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
1154 ERR_R_INTERNAL_ERROR);
1155 return 0;
1156 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001157 }
1158 }
Matt Caswell0217dd12016-09-06 15:09:51 +01001159 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001160 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1161 return 0;
1162 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001163 }
Emilia Kaspera230b262016-08-05 19:03:17 +02001164#endif /* OPENSSL_NO_EC */
Adam Langley6f017a82013-04-15 18:07:47 -04001165
Matt Caswell0f113f32015-01-22 03:40:55 +00001166 if (tls_use_ticket(s)) {
Matt Caswell348240c2016-10-19 15:11:24 +01001167 size_t ticklen;
Matt Caswell0f113f32015-01-22 03:40:55 +00001168 if (!s->new_session && s->session && s->session->tlsext_tick)
1169 ticklen = s->session->tlsext_ticklen;
1170 else if (s->session && s->tlsext_session_ticket &&
1171 s->tlsext_session_ticket->data) {
1172 ticklen = s->tlsext_session_ticket->length;
1173 s->session->tlsext_tick = OPENSSL_malloc(ticklen);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001174 if (s->session->tlsext_tick == NULL) {
1175 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1176 return 0;
1177 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001178 memcpy(s->session->tlsext_tick,
1179 s->tlsext_session_ticket->data, ticklen);
1180 s->session->tlsext_ticklen = ticklen;
1181 } else
1182 ticklen = 0;
1183 if (ticklen == 0 && s->tlsext_session_ticket &&
1184 s->tlsext_session_ticket->data == NULL)
1185 goto skip_ext;
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001186
Matt Caswell08029df2016-09-20 14:47:44 +01001187 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
Matt Caswellb2b30242016-09-13 11:32:52 +01001188 || !WPACKET_sub_memcpy_u16(pkt, s->session->tlsext_tick,
1189 ticklen)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001190 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1191 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001192 }
1193 }
1194 skip_ext:
Adam Langley6f017a82013-04-15 18:07:47 -04001195
David Benjaminf7aa3182016-03-05 19:49:20 -05001196 if (SSL_CLIENT_USE_SIGALGS(s)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001197 size_t salglen;
1198 const unsigned char *salg;
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001199
Matt Caswell0f113f32015-01-22 03:40:55 +00001200 salglen = tls12_get_psigalgs(s, &salg);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001201
Matt Caswell08029df2016-09-20 14:47:44 +01001202 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signature_algorithms)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001203 /* Sub-packet for sig-algs extension */
Matt Caswellde451852016-09-09 00:13:41 +01001204 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001205 /* Sub-packet for the actual list */
Matt Caswellde451852016-09-09 00:13:41 +01001206 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswell0217dd12016-09-06 15:09:51 +01001207 || !tls12_copy_sigalgs(s, pkt, salg, salglen)
1208 || !WPACKET_close(pkt)
1209 || !WPACKET_close(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001210 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1211 return 0;
1212 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001213 }
Matt Caswell3e41ac32016-03-21 16:54:53 +00001214#ifndef OPENSSL_NO_OCSP
Matt Caswell0f113f32015-01-22 03:40:55 +00001215 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp) {
1216 int i;
Matt Caswell0f113f32015-01-22 03:40:55 +00001217
Matt Caswell08029df2016-09-20 14:47:44 +01001218 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001219 /* Sub-packet for status request extension */
Matt Caswellde451852016-09-09 00:13:41 +01001220 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswell08029df2016-09-20 14:47:44 +01001221 || !WPACKET_put_bytes_u8(pkt, TLSEXT_STATUSTYPE_ocsp)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001222 /* Sub-packet for the ids */
Matt Caswellde451852016-09-09 00:13:41 +01001223 || !WPACKET_start_sub_packet_u16(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001224 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1225 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001226 }
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001227 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) {
1228 unsigned char *idbytes;
1229 int idlen;
1230 OCSP_RESPID *id;
Matt Caswell0f113f32015-01-22 03:40:55 +00001231
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001232 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
1233 idlen = i2d_OCSP_RESPID(id, NULL);
1234 if (idlen <= 0
1235 /* Sub-packet for an individual id */
Matt Caswelldd8710d2016-09-13 23:59:11 +01001236 || !WPACKET_sub_allocate_bytes_u16(pkt, idlen, &idbytes)
Matt Caswellb2b30242016-09-13 11:32:52 +01001237 || i2d_OCSP_RESPID(id, &idbytes) != idlen) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001238 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1239 return 0;
1240 }
1241 }
Matt Caswell0217dd12016-09-06 15:09:51 +01001242 if (!WPACKET_close(pkt)
Matt Caswellde451852016-09-09 00:13:41 +01001243 || !WPACKET_start_sub_packet_u16(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001244 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1245 return 0;
1246 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001247 if (s->tlsext_ocsp_exts) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001248 unsigned char *extbytes;
1249 int extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
Matt Caswell0f113f32015-01-22 03:40:55 +00001250
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001251 if (extlen < 0) {
1252 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1253 return 0;
1254 }
Matt Caswell0217dd12016-09-06 15:09:51 +01001255 if (!WPACKET_allocate_bytes(pkt, extlen, &extbytes)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001256 || i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &extbytes)
1257 != extlen) {
1258 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1259 return 0;
1260 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001261 }
Matt Caswell0217dd12016-09-06 15:09:51 +01001262 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001263 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1264 return 0;
1265 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001266 }
Matt Caswell3e41ac32016-03-21 16:54:53 +00001267#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00001268
Matt Caswelle481f9b2015-05-15 10:49:56 +01001269#ifndef OPENSSL_NO_NEXTPROTONEG
Matt Caswell0f113f32015-01-22 03:40:55 +00001270 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len) {
1271 /*
FdaSilvaYY8483a002016-03-10 21:34:48 +01001272 * The client advertises an empty extension to indicate its support
Matt Caswell0f113f32015-01-22 03:40:55 +00001273 * for Next Protocol Negotiation
1274 */
Matt Caswell08029df2016-09-20 14:47:44 +01001275 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
1276 || !WPACKET_put_bytes_u16(pkt, 0)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001277 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1278 return 0;
1279 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001280 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001281#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00001282
Todd Short817cd0d2016-03-05 08:47:55 -05001283 /*
1284 * finish_md_len is non-zero during a renegotiation, so
1285 * this avoids sending ALPN during the renegotiation
1286 * (see longer comment below)
1287 */
Matt Caswell0f113f32015-01-22 03:40:55 +00001288 if (s->alpn_client_proto_list && !s->s3->tmp.finish_md_len) {
Matt Caswell08029df2016-09-20 14:47:44 +01001289 if (!WPACKET_put_bytes_u16(pkt,
1290 TLSEXT_TYPE_application_layer_protocol_negotiation)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001291 /* Sub-packet ALPN extension */
Matt Caswellde451852016-09-09 00:13:41 +01001292 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswellb2b30242016-09-13 11:32:52 +01001293 || !WPACKET_sub_memcpy_u16(pkt, s->alpn_client_proto_list,
1294 s->alpn_client_proto_list_len)
Matt Caswell0217dd12016-09-06 15:09:51 +01001295 || !WPACKET_close(pkt)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001296 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1297 return 0;
1298 }
Todd Short817cd0d2016-03-05 08:47:55 -05001299 s->s3->alpn_sent = 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00001300 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001301#ifndef OPENSSL_NO_SRTP
Matt Caswell0f113f32015-01-22 03:40:55 +00001302 if (SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s)) {
Matt Caswell7facdbd2016-09-28 13:33:41 +01001303 STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = SSL_get_srtp_profiles(s);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001304 SRTP_PROTECTION_PROFILE *prof;
1305 int i, ct;
Matt Caswell0f113f32015-01-22 03:40:55 +00001306
Matt Caswell08029df2016-09-20 14:47:44 +01001307 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001308 /* Sub-packet for SRTP extension */
Matt Caswellde451852016-09-09 00:13:41 +01001309 || !WPACKET_start_sub_packet_u16(pkt)
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001310 /* Sub-packet for the protection profile list */
Matt Caswellde451852016-09-09 00:13:41 +01001311 || !WPACKET_start_sub_packet_u16(pkt)) {
Matt Caswell69f68232015-03-06 14:37:17 +00001312 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001313 return 0;
Matt Caswell69f68232015-03-06 14:37:17 +00001314 }
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001315 ct = sk_SRTP_PROTECTION_PROFILE_num(clnt);
1316 for (i = 0; i < ct; i++) {
1317 prof = sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
Matt Caswell08029df2016-09-20 14:47:44 +01001318 if (prof == NULL || !WPACKET_put_bytes_u16(pkt, prof->id)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001319 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1320 return 0;
1321 }
1322 }
Matt Caswell7facdbd2016-09-28 13:33:41 +01001323 if (!WPACKET_close(pkt)
1324 /* Add an empty use_mki value */
1325 || !WPACKET_put_bytes_u8(pkt, 0)
1326 || !WPACKET_close(pkt)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001327 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001328 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001329 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001330 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001331#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00001332 custom_ext_init(&s->cert->cli_ext);
1333 /* Add custom TLS Extensions to ClientHello */
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001334 if (!custom_ext_add(s, 0, pkt, al)) {
1335 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1336 return 0;
1337 }
1338
David Woodhousecde61452016-10-14 00:26:38 +01001339 if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)) {
1340 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
Matt Caswell08029df2016-09-20 14:47:44 +01001341 || !WPACKET_put_bytes_u16(pkt, 0)) {
David Woodhousecde61452016-10-14 00:26:38 +01001342 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1343 return 0;
1344 }
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001345 }
1346
Rob Percivaled29e822016-03-03 16:19:23 +00001347#ifndef OPENSSL_NO_CT
1348 if (s->ct_validation_callback != NULL) {
Matt Caswell08029df2016-09-20 14:47:44 +01001349 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signed_certificate_timestamp)
1350 || !WPACKET_put_bytes_u16(pkt, 0)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001351 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1352 return 0;
1353 }
Rob Percivaled29e822016-03-03 16:19:23 +00001354 }
1355#endif
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001356
Matt Caswell08029df2016-09-20 14:47:44 +01001357 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
1358 || !WPACKET_put_bytes_u16(pkt, 0)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001359 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1360 return 0;
1361 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001362
Matt Caswellc805f612016-11-21 13:24:50 +00001363 reason = ssl_get_client_min_max_version(s, &min_version, &max_version);
1364 if (reason != 0) {
1365 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, reason);
1366 return 0;
1367 }
1368
Matt Caswelld2c27a22016-10-31 14:49:52 +00001369 /* TLS1.3 specific extensions */
Matt Caswellc805f612016-11-21 13:24:50 +00001370 if (!SSL_IS_DTLS(s) && max_version >= TLS1_3_VERSION) {
1371 int currv;
Matt Caswelld2c27a22016-10-31 14:49:52 +00001372 size_t i, sharessent = 0;
1373
1374 /* TODO(TLS1.3): Should we add this extension for versions < TLS1.3? */
1375 /* supported_versions extension */
Matt Caswellb5b253b2016-10-21 23:40:52 +01001376 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions)
1377 || !WPACKET_start_sub_packet_u16(pkt)
1378 || !WPACKET_start_sub_packet_u8(pkt)) {
1379 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1380 return 0;
1381 }
Matt Caswellc805f612016-11-21 13:24:50 +00001382
Matt Caswellf2342b72016-11-09 14:43:05 +00001383 /*
1384 * TODO(TLS1.3): There is some discussion on the TLS list as to wheter
1385 * we should include versions <TLS1.2. For the moment we do. To be
1386 * reviewed later.
1387 */
Matt Caswellb5b253b2016-10-21 23:40:52 +01001388 for (currv = max_version; currv >= min_version; currv--) {
1389 /* TODO(TLS1.3): Remove this first if clause prior to release!! */
1390 if (currv == TLS1_3_VERSION) {
1391 if (!WPACKET_put_bytes_u16(pkt, TLS1_3_VERSION_DRAFT)) {
1392 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
1393 ERR_R_INTERNAL_ERROR);
1394 return 0;
1395 }
1396 } else if (!WPACKET_put_bytes_u16(pkt, currv)) {
1397 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1398 return 0;
1399 }
1400 }
1401 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
1402 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1403 return 0;
1404 }
Matt Caswelld2c27a22016-10-31 14:49:52 +00001405
1406
1407 /* key_share extension */
1408 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1409 /* Extension data sub-packet */
1410 || !WPACKET_start_sub_packet_u16(pkt)
1411 /* KeyShare list sub-packet */
1412 || !WPACKET_start_sub_packet_u16(pkt)) {
1413 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1414 return 0;
1415 }
1416
1417 /*
1418 * TODO(TLS1.3): Make the number of key_shares sent configurable. For
1419 * now, just send one
1420 */
1421 for (i = 0; i < num_curves && sharessent < 1; i++, pcurves += 2) {
Matt Caswell94ed2c62016-11-14 14:53:31 +00001422 unsigned char *encodedPoint = NULL;
1423 unsigned int curve_id = 0;
1424 EVP_PKEY *key_share_key = NULL;
1425 size_t encodedlen;
Matt Caswelld2c27a22016-10-31 14:49:52 +00001426
Matt Caswell94ed2c62016-11-14 14:53:31 +00001427 if (!tls_curve_allowed(s, pcurves, SSL_SECOP_CURVE_SUPPORTED))
1428 continue;
Matt Caswelld2c27a22016-10-31 14:49:52 +00001429
Matt Caswell94ed2c62016-11-14 14:53:31 +00001430 if (s->s3->tmp.pkey != NULL) {
1431 /* Shouldn't happen! */
1432 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
1433 ERR_R_INTERNAL_ERROR);
1434 return 0;
Matt Caswelld2c27a22016-10-31 14:49:52 +00001435 }
Matt Caswell94ed2c62016-11-14 14:53:31 +00001436
1437 /* Generate a key for this key_share */
1438 curve_id = (pcurves[0] << 8) | pcurves[1];
1439 key_share_key = ssl_generate_pkey_curve(curve_id);
1440 if (key_share_key == NULL) {
1441 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_EVP_LIB);
1442 return 0;
1443 }
1444
1445 /* Encode the public key. */
1446 encodedlen = EVP_PKEY_get1_tls_encodedpoint(key_share_key,
1447 &encodedPoint);
1448 if (encodedlen == 0) {
1449 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_EC_LIB);
1450 EVP_PKEY_free(key_share_key);
1451 return 0;
1452 }
1453
1454 /* Create KeyShareEntry */
1455 if (!WPACKET_put_bytes_u16(pkt, curve_id)
1456 || !WPACKET_sub_memcpy_u16(pkt, encodedPoint, encodedlen)) {
1457 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT,
1458 ERR_R_INTERNAL_ERROR);
1459 EVP_PKEY_free(key_share_key);
1460 OPENSSL_free(encodedPoint);
1461 return 0;
1462 }
1463
1464 /*
1465 * TODO(TLS1.3): When changing to send more than one key_share we're
1466 * going to need to be able to save more than one EVP_PKEY. For now
1467 * we reuse the existing tmp.pkey
1468 */
1469 s->s3->group_id = curve_id;
1470 s->s3->tmp.pkey = key_share_key;
1471 sharessent++;
1472 OPENSSL_free(encodedPoint);
Matt Caswelld2c27a22016-10-31 14:49:52 +00001473 }
1474 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
1475 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1476 return 0;
1477 }
Matt Caswellb5b253b2016-10-21 23:40:52 +01001478 }
1479
Matt Caswell0f113f32015-01-22 03:40:55 +00001480 /*
1481 * Add padding to workaround bugs in F5 terminators. See
1482 * https://tools.ietf.org/html/draft-agl-tls-padding-03 NB: because this
1483 * code works out the length of all existing extensions it MUST always
1484 * appear last.
1485 */
1486 if (s->options & SSL_OP_TLSEXT_PADDING) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001487 unsigned char *padbytes;
1488 size_t hlen;
1489
Matt Caswellae2f7b32016-09-05 17:34:04 +01001490 if (!WPACKET_get_total_written(pkt, &hlen)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001491 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1492 return 0;
1493 }
Matt Caswella3680c82015-03-31 13:57:46 +01001494
Matt Caswell0f113f32015-01-22 03:40:55 +00001495 if (hlen > 0xff && hlen < 0x200) {
1496 hlen = 0x200 - hlen;
1497 if (hlen >= 4)
1498 hlen -= 4;
1499 else
1500 hlen = 0;
1501
Matt Caswell08029df2016-09-20 14:47:44 +01001502 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_padding)
Matt Caswellb2b30242016-09-13 11:32:52 +01001503 || !WPACKET_sub_allocate_bytes_u16(pkt, hlen, &padbytes)) {
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001504 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1505 return 0;
1506 }
1507 memset(padbytes, 0, hlen);
Matt Caswell0f113f32015-01-22 03:40:55 +00001508 }
1509 }
1510
1511 done:
Matt Caswell2c7b4db2016-08-03 20:57:52 +01001512 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00001513}
1514
Matt Caswell94ed2c62016-11-14 14:53:31 +00001515/*
1516 * Add the key_share extension.
1517 *
1518 * Returns 1 on success or 0 on failure.
1519 */
1520static int add_client_key_share_ext(SSL *s, WPACKET *pkt, int *al)
1521{
1522 unsigned char *encodedPoint;
1523 size_t encoded_pt_len = 0;
1524 EVP_PKEY *ckey = s->s3->peer_tmp, *skey = NULL;
1525
1526 if (ckey == NULL) {
1527 SSLerr(SSL_F_ADD_CLIENT_KEY_SHARE_EXT, ERR_R_INTERNAL_ERROR);
1528 return 0;
1529 }
1530
1531 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1532 || !WPACKET_start_sub_packet_u16(pkt)
1533 || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)) {
1534 SSLerr(SSL_F_ADD_CLIENT_KEY_SHARE_EXT, ERR_R_INTERNAL_ERROR);
1535 return 0;
1536 }
1537
1538 skey = ssl_generate_pkey(ckey);
Matt Caswell884a7902016-11-23 22:12:56 +00001539 if (skey == NULL) {
1540 SSLerr(SSL_F_ADD_CLIENT_KEY_SHARE_EXT, ERR_R_MALLOC_FAILURE);
1541 return 0;
1542 }
Matt Caswell94ed2c62016-11-14 14:53:31 +00001543
1544 /* Generate encoding of server key */
1545 encoded_pt_len = EVP_PKEY_get1_tls_encodedpoint(skey, &encodedPoint);
1546 if (encoded_pt_len == 0) {
1547 SSLerr(SSL_F_ADD_CLIENT_KEY_SHARE_EXT, ERR_R_EC_LIB);
1548 EVP_PKEY_free(skey);
1549 return 0;
1550 }
1551
1552 if (!WPACKET_sub_memcpy_u16(pkt, encodedPoint, encoded_pt_len)
1553 || !WPACKET_close(pkt)) {
1554 SSLerr(SSL_F_ADD_CLIENT_KEY_SHARE_EXT, ERR_R_INTERNAL_ERROR);
1555 EVP_PKEY_free(skey);
1556 OPENSSL_free(encodedPoint);
1557 return 0;
1558 }
1559 OPENSSL_free(encodedPoint);
1560
1561 /* This causes the crypto state to be updated based on the derived keys */
1562 s->s3->tmp.pkey = skey;
1563 if (ssl_derive(s, skey, ckey, 1) == 0) {
1564 *al = SSL_AD_INTERNAL_ERROR;
1565 SSLerr(SSL_F_ADD_CLIENT_KEY_SHARE_EXT, ERR_R_INTERNAL_ERROR);
1566 return 0;
1567 }
1568
1569 return 1;
1570}
1571
Matt Caswell8157d442016-09-28 11:13:48 +01001572int ssl_add_serverhello_tlsext(SSL *s, WPACKET *pkt, int *al)
Matt Caswell0f113f32015-01-22 03:40:55 +00001573{
Matt Caswelle481f9b2015-05-15 10:49:56 +01001574#ifndef OPENSSL_NO_NEXTPROTONEG
Matt Caswell0f113f32015-01-22 03:40:55 +00001575 int next_proto_neg_seen;
Matt Caswelle481f9b2015-05-15 10:49:56 +01001576#endif
1577#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00001578 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1579 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
Dr. Stephen Hensonce0c1f22016-02-11 18:19:27 +00001580 int using_ecc = (alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA);
Matt Caswell0f113f32015-01-22 03:40:55 +00001581 using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
Matt Caswelle481f9b2015-05-15 10:49:56 +01001582#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00001583
Matt Caswell8157d442016-09-28 11:13:48 +01001584 if (!WPACKET_start_sub_packet_u16(pkt)
1585 || !WPACKET_set_flags(pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH)) {
1586 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1587 return 0;
1588 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001589
Matt Caswell8157d442016-09-28 11:13:48 +01001590 if (s->s3->send_connection_binding &&
1591 !ssl_add_serverhello_renegotiate_ext(s, pkt)) {
1592 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1593 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001594 }
1595
1596 /* Only add RI for SSLv3 */
1597 if (s->version == SSL3_VERSION)
1598 goto done;
1599
1600 if (!s->hit && s->servername_done == 1
Matt Caswell8157d442016-09-28 11:13:48 +01001601 && s->session->tlsext_hostname != NULL) {
1602 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
1603 || !WPACKET_put_bytes_u16(pkt, 0)) {
1604 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1605 return 0;
1606 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001607 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001608#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00001609 if (using_ecc) {
1610 const unsigned char *plist;
1611 size_t plistlen;
1612 /*
1613 * Add TLS extension ECPointFormats to the ServerHello message
1614 */
Matt Caswell0f113f32015-01-22 03:40:55 +00001615 tls1_get_formatlist(s, &plist, &plistlen);
1616
Matt Caswell8157d442016-09-28 11:13:48 +01001617 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
1618 || !WPACKET_start_sub_packet_u16(pkt)
1619 || !WPACKET_sub_memcpy_u8(pkt, plist, plistlen)
1620 || !WPACKET_close(pkt)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001621 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell8157d442016-09-28 11:13:48 +01001622 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001623 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001624 }
1625 /*
1626 * Currently the server should not respond with a SupportedCurves
1627 * extension
1628 */
Emilia Kaspera230b262016-08-05 19:03:17 +02001629#endif /* OPENSSL_NO_EC */
Matt Caswell0f113f32015-01-22 03:40:55 +00001630
1631 if (s->tlsext_ticket_expected && tls_use_ticket(s)) {
Matt Caswell8157d442016-09-28 11:13:48 +01001632 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
1633 || !WPACKET_put_bytes_u16(pkt, 0)) {
1634 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1635 return 0;
1636 }
Todd Short5c753de2016-05-12 18:16:52 -04001637 } else {
Emilia Kaspera230b262016-08-05 19:03:17 +02001638 /*
1639 * if we don't add the above TLSEXT, we can't add a session ticket
1640 * later
1641 */
Todd Short5c753de2016-05-12 18:16:52 -04001642 s->tlsext_ticket_expected = 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001643 }
1644
1645 if (s->tlsext_status_expected) {
Matt Caswell8157d442016-09-28 11:13:48 +01001646 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
1647 || !WPACKET_put_bytes_u16(pkt, 0)) {
1648 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1649 return 0;
1650 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001651 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001652#ifndef OPENSSL_NO_SRTP
Matt Caswell0f113f32015-01-22 03:40:55 +00001653 if (SSL_IS_DTLS(s) && s->srtp_profile) {
Matt Caswell8157d442016-09-28 11:13:48 +01001654 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
1655 || !WPACKET_start_sub_packet_u16(pkt)
1656 || !WPACKET_put_bytes_u16(pkt, 2)
1657 || !WPACKET_put_bytes_u16(pkt, s->srtp_profile->id)
1658 || !WPACKET_put_bytes_u8(pkt, 0)
1659 || !WPACKET_close(pkt)) {
Matt Caswell69f68232015-03-06 14:37:17 +00001660 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
Matt Caswell8157d442016-09-28 11:13:48 +01001661 return 0;
Matt Caswell69f68232015-03-06 14:37:17 +00001662 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001663 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001664#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00001665
1666 if (((s->s3->tmp.new_cipher->id & 0xFFFF) == 0x80
1667 || (s->s3->tmp.new_cipher->id & 0xFFFF) == 0x81)
1668 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG)) {
1669 const unsigned char cryptopro_ext[36] = {
1670 0xfd, 0xe8, /* 65000 */
1671 0x00, 0x20, /* 32 bytes length */
1672 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
1673 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
1674 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
1675 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17
1676 };
Matt Caswell8157d442016-09-28 11:13:48 +01001677 if (!WPACKET_memcpy(pkt, cryptopro_ext, sizeof(cryptopro_ext))) {
1678 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1679 return 0;
1680 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001681 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001682
Matt Caswelle481f9b2015-05-15 10:49:56 +01001683#ifndef OPENSSL_NO_NEXTPROTONEG
Matt Caswell0f113f32015-01-22 03:40:55 +00001684 next_proto_neg_seen = s->s3->next_proto_neg_seen;
1685 s->s3->next_proto_neg_seen = 0;
1686 if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb) {
1687 const unsigned char *npa;
1688 unsigned int npalen;
1689 int r;
1690
1691 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen,
1692 s->
1693 ctx->next_protos_advertised_cb_arg);
1694 if (r == SSL_TLSEXT_ERR_OK) {
Matt Caswell8157d442016-09-28 11:13:48 +01001695 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
1696 || !WPACKET_sub_memcpy_u16(pkt, npa, npalen)) {
1697 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1698 return 0;
1699 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001700 s->s3->next_proto_neg_seen = 1;
1701 }
1702 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001703#endif
Matt Caswellbcec3352016-11-01 13:24:02 +00001704
Matt Caswell94ed2c62016-11-14 14:53:31 +00001705 if (SSL_IS_TLS13(s) && !s->hit && !add_client_key_share_ext(s, pkt, al))
1706 return 0;
Matt Caswellbcec3352016-11-01 13:24:02 +00001707
Matt Caswell8157d442016-09-28 11:13:48 +01001708 if (!custom_ext_add(s, 1, pkt, al)) {
1709 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1710 return 0;
1711 }
1712
Matt Caswell0f113f32015-01-22 03:40:55 +00001713 if (s->s3->flags & TLS1_FLAGS_ENCRYPT_THEN_MAC) {
1714 /*
1715 * Don't use encrypt_then_mac if AEAD or RC4 might want to disable
1716 * for other cases too.
1717 */
1718 if (s->s3->tmp.new_cipher->algorithm_mac == SSL_AEAD
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00001719 || s->s3->tmp.new_cipher->algorithm_enc == SSL_RC4
1720 || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT
1721 || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT12)
Matt Caswell0f113f32015-01-22 03:40:55 +00001722 s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;
1723 else {
Matt Caswell8157d442016-09-28 11:13:48 +01001724 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
1725 || !WPACKET_put_bytes_u16(pkt, 0)) {
1726 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1727 return 0;
1728 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001729 }
1730 }
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00001731 if (s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) {
Matt Caswell8157d442016-09-28 11:13:48 +01001732 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
1733 || !WPACKET_put_bytes_u16(pkt, 0)) {
1734 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1735 return 0;
1736 }
Dr. Stephen Hensonddc06b32015-01-23 02:45:13 +00001737 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001738
Todd Short817cd0d2016-03-05 08:47:55 -05001739 if (s->s3->alpn_selected != NULL) {
Matt Caswell8157d442016-09-28 11:13:48 +01001740 if (!WPACKET_put_bytes_u16(pkt,
1741 TLSEXT_TYPE_application_layer_protocol_negotiation)
1742 || !WPACKET_start_sub_packet_u16(pkt)
1743 || !WPACKET_start_sub_packet_u16(pkt)
1744 || !WPACKET_sub_memcpy_u8(pkt, s->s3->alpn_selected,
1745 s->s3->alpn_selected_len)
1746 || !WPACKET_close(pkt)
1747 || !WPACKET_close(pkt)) {
1748 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1749 return 0;
1750 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001751 }
1752
1753 done:
Matt Caswell8157d442016-09-28 11:13:48 +01001754 if (!WPACKET_close(pkt)) {
1755 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
1756 return 0;
1757 }
1758 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00001759}
1760
1761/*
Todd Short817cd0d2016-03-05 08:47:55 -05001762 * Process the ALPN extension in a ClientHello.
Todd Short817cd0d2016-03-05 08:47:55 -05001763 * al: a pointer to the alert value to send in the event of a failure.
Emilia Kasper70c22882016-07-04 20:32:28 +02001764 * returns 1 on success, 0 on error.
Todd Short817cd0d2016-03-05 08:47:55 -05001765 */
Emilia Kasper70c22882016-07-04 20:32:28 +02001766static int tls1_alpn_handle_client_hello_late(SSL *s, int *al)
Todd Short817cd0d2016-03-05 08:47:55 -05001767{
1768 const unsigned char *selected = NULL;
1769 unsigned char selected_len = 0;
1770
1771 if (s->ctx->alpn_select_cb != NULL && s->s3->alpn_proposed != NULL) {
1772 int r = s->ctx->alpn_select_cb(s, &selected, &selected_len,
1773 s->s3->alpn_proposed,
Matt Caswell348240c2016-10-19 15:11:24 +01001774 (unsigned int)s->s3->alpn_proposed_len,
Todd Short817cd0d2016-03-05 08:47:55 -05001775 s->ctx->alpn_select_cb_arg);
1776
1777 if (r == SSL_TLSEXT_ERR_OK) {
1778 OPENSSL_free(s->s3->alpn_selected);
1779 s->s3->alpn_selected = OPENSSL_memdup(selected, selected_len);
1780 if (s->s3->alpn_selected == NULL) {
1781 *al = SSL_AD_INTERNAL_ERROR;
Todd Short817cd0d2016-03-05 08:47:55 -05001782 return 0;
1783 }
1784 s->s3->alpn_selected_len = selected_len;
Todd Short0351baa2016-03-12 09:14:05 -05001785#ifndef OPENSSL_NO_NEXTPROTONEG
1786 /* ALPN takes precedence over NPN. */
1787 s->s3->next_proto_neg_seen = 0;
1788#endif
Todd Short817cd0d2016-03-05 08:47:55 -05001789 } else {
1790 *al = SSL_AD_NO_APPLICATION_PROTOCOL;
Emilia Kasper06217862015-09-22 15:20:26 +02001791 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001792 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001793 }
Adam Langley6f017a82013-04-15 18:07:47 -04001794
Emilia Kasper06217862015-09-22 15:20:26 +02001795 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00001796}
Adam Langley6f017a82013-04-15 18:07:47 -04001797
Matt Caswelle481f9b2015-05-15 10:49:56 +01001798#ifndef OPENSSL_NO_NEXTPROTONEG
Matt Caswell0f113f32015-01-22 03:40:55 +00001799/*
1800 * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1801 * elements of zero length are allowed and the set of elements must exactly
1802 * fill the length of the block.
1803 */
Matt Caswell50932c42015-08-04 17:36:02 +01001804static char ssl_next_proto_validate(PACKET *pkt)
Matt Caswell0f113f32015-01-22 03:40:55 +00001805{
Kazuki Yamaguchib04f9472015-12-13 00:51:06 +09001806 PACKET tmp_protocol;
Ben Laurieee2ffc22010-07-28 10:06:55 +00001807
Matt Caswell50932c42015-08-04 17:36:02 +01001808 while (PACKET_remaining(pkt)) {
Kazuki Yamaguchib04f9472015-12-13 00:51:06 +09001809 if (!PACKET_get_length_prefixed_1(pkt, &tmp_protocol)
Emilia Kaspera230b262016-08-05 19:03:17 +02001810 || PACKET_remaining(&tmp_protocol) == 0)
Matt Caswell0f113f32015-01-22 03:40:55 +00001811 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00001812 }
Ben Laurieee2ffc22010-07-28 10:06:55 +00001813
Matt Caswell50932c42015-08-04 17:36:02 +01001814 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00001815}
Matt Caswelle481f9b2015-05-15 10:49:56 +01001816#endif
Ben Laurieee2ffc22010-07-28 10:06:55 +00001817
Matt Caswell50932c42015-08-04 17:36:02 +01001818static int ssl_scan_serverhello_tlsext(SSL *s, PACKET *pkt, int *al)
Matt Caswell0f113f32015-01-22 03:40:55 +00001819{
Matt Caswell50932c42015-08-04 17:36:02 +01001820 unsigned int length, type, size;
Matt Caswell0f113f32015-01-22 03:40:55 +00001821 int tlsext_servername = 0;
1822 int renegotiate_seen = 0;
Bodo Möllered3883d2006-01-02 23:14:37 +00001823
Matt Caswelle481f9b2015-05-15 10:49:56 +01001824#ifndef OPENSSL_NO_NEXTPROTONEG
Matt Caswell0f113f32015-01-22 03:40:55 +00001825 s->s3->next_proto_neg_seen = 0;
Matt Caswelle481f9b2015-05-15 10:49:56 +01001826#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00001827 s->tlsext_ticket_expected = 0;
Bodo Möller6f31dd72011-11-24 21:07:01 +00001828
Rich Salzb548a1f2015-05-01 10:02:07 -04001829 OPENSSL_free(s->s3->alpn_selected);
1830 s->s3->alpn_selected = NULL;
Adam Langley6f017a82013-04-15 18:07:47 -04001831
Matt Caswell0f113f32015-01-22 03:40:55 +00001832 s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;
Dr. Stephen Henson48175042011-12-31 22:59:57 +00001833
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00001834 s->s3->flags &= ~TLS1_FLAGS_RECEIVED_EXTMS;
1835
Matt Caswell50932c42015-08-04 17:36:02 +01001836 if (!PACKET_get_net_2(pkt, &length))
Matt Caswell0f113f32015-01-22 03:40:55 +00001837 goto ri_check;
Dr. Stephen Henson5e3ff622013-03-22 17:12:33 +00001838
Matt Caswell50932c42015-08-04 17:36:02 +01001839 if (PACKET_remaining(pkt) != length) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001840 *al = SSL_AD_DECODE_ERROR;
1841 return 0;
1842 }
Bodo Möllered3883d2006-01-02 23:14:37 +00001843
Emilia Kasperaa474d12016-02-19 17:24:44 +01001844 if (!tls1_check_duplicate_extensions(pkt)) {
1845 *al = SSL_AD_DECODE_ERROR;
1846 return 0;
1847 }
1848
Matt Caswell50932c42015-08-04 17:36:02 +01001849 while (PACKET_get_net_2(pkt, &type) && PACKET_get_net_2(pkt, &size)) {
Emilia Kasperb6981742016-02-01 15:26:18 +01001850 const unsigned char *data;
Matt Caswell50932c42015-08-04 17:36:02 +01001851 PACKET spkt;
Bodo Möllered3883d2006-01-02 23:14:37 +00001852
Matt Caswell50932c42015-08-04 17:36:02 +01001853 if (!PACKET_get_sub_packet(pkt, &spkt, size)
Emilia Kaspera230b262016-08-05 19:03:17 +02001854 || !PACKET_peek_bytes(&spkt, &data, size))
Matt Caswell0f113f32015-01-22 03:40:55 +00001855 goto ri_check;
Bodo Möllered3883d2006-01-02 23:14:37 +00001856
Matt Caswell0f113f32015-01-22 03:40:55 +00001857 if (s->tlsext_debug_cb)
1858 s->tlsext_debug_cb(s, 1, type, data, size, s->tlsext_debug_arg);
Bodo Möllered3883d2006-01-02 23:14:37 +00001859
Matt Caswell0f113f32015-01-22 03:40:55 +00001860 if (type == TLSEXT_TYPE_renegotiate) {
Matt Caswell50932c42015-08-04 17:36:02 +01001861 if (!ssl_parse_serverhello_renegotiate_ext(s, &spkt, al))
Matt Caswell0f113f32015-01-22 03:40:55 +00001862 return 0;
1863 renegotiate_seen = 1;
1864 } else if (s->version == SSL3_VERSION) {
1865 } else if (type == TLSEXT_TYPE_server_name) {
1866 if (s->tlsext_hostname == NULL || size > 0) {
1867 *al = TLS1_AD_UNRECOGNIZED_NAME;
1868 return 0;
1869 }
1870 tlsext_servername = 1;
1871 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001872#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00001873 else if (type == TLSEXT_TYPE_ec_point_formats) {
Matt Caswell50932c42015-08-04 17:36:02 +01001874 unsigned int ecpointformatlist_length;
1875 if (!PACKET_get_1(&spkt, &ecpointformatlist_length)
Emilia Kaspera230b262016-08-05 19:03:17 +02001876 || ecpointformatlist_length != size - 1) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001877 *al = TLS1_AD_DECODE_ERROR;
1878 return 0;
1879 }
1880 if (!s->hit) {
1881 s->session->tlsext_ecpointformatlist_length = 0;
Rich Salzb548a1f2015-05-01 10:02:07 -04001882 OPENSSL_free(s->session->tlsext_ecpointformatlist);
Matt Caswell0f113f32015-01-22 03:40:55 +00001883 if ((s->session->tlsext_ecpointformatlist =
1884 OPENSSL_malloc(ecpointformatlist_length)) == NULL) {
1885 *al = TLS1_AD_INTERNAL_ERROR;
1886 return 0;
1887 }
1888 s->session->tlsext_ecpointformatlist_length =
1889 ecpointformatlist_length;
Matt Caswell50932c42015-08-04 17:36:02 +01001890 if (!PACKET_copy_bytes(&spkt,
1891 s->session->tlsext_ecpointformatlist,
1892 ecpointformatlist_length)) {
1893 *al = TLS1_AD_DECODE_ERROR;
1894 return 0;
1895 }
1896
Matt Caswell0f113f32015-01-22 03:40:55 +00001897 }
Matt Caswell0f113f32015-01-22 03:40:55 +00001898 }
Emilia Kaspera230b262016-08-05 19:03:17 +02001899#endif /* OPENSSL_NO_EC */
Dr. Stephen Henson5a3d8ee2014-11-03 17:47:11 +00001900
Matt Caswell0f113f32015-01-22 03:40:55 +00001901 else if (type == TLSEXT_TYPE_session_ticket) {
1902 if (s->tls_session_ticket_ext_cb &&
1903 !s->tls_session_ticket_ext_cb(s, data, size,
1904 s->tls_session_ticket_ext_cb_arg))
1905 {
1906 *al = TLS1_AD_INTERNAL_ERROR;
1907 return 0;
1908 }
1909 if (!tls_use_ticket(s) || (size > 0)) {
1910 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1911 return 0;
1912 }
1913 s->tlsext_ticket_expected = 1;
Emilia Kaspera230b262016-08-05 19:03:17 +02001914 } else if (type == TLSEXT_TYPE_status_request) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001915 /*
1916 * MUST be empty and only sent if we've requested a status
1917 * request message.
1918 */
1919 if ((s->tlsext_status_type == -1) || (size > 0)) {
1920 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1921 return 0;
1922 }
1923 /* Set flag to expect CertificateStatus message */
1924 s->tlsext_status_expected = 1;
1925 }
Rob Percivaled29e822016-03-03 16:19:23 +00001926#ifndef OPENSSL_NO_CT
1927 /*
1928 * Only take it if we asked for it - i.e if there is no CT validation
1929 * callback set, then a custom extension MAY be processing it, so we
1930 * need to let control continue to flow to that.
1931 */
1932 else if (type == TLSEXT_TYPE_signed_certificate_timestamp &&
1933 s->ct_validation_callback != NULL) {
1934 /* Simply copy it off for later processing */
1935 if (s->tlsext_scts != NULL) {
1936 OPENSSL_free(s->tlsext_scts);
1937 s->tlsext_scts = NULL;
1938 }
1939 s->tlsext_scts_len = size;
1940 if (size > 0) {
1941 s->tlsext_scts = OPENSSL_malloc(size);
1942 if (s->tlsext_scts == NULL) {
1943 *al = TLS1_AD_INTERNAL_ERROR;
1944 return 0;
1945 }
1946 memcpy(s->tlsext_scts, data, size);
1947 }
1948 }
1949#endif
Matt Caswelle481f9b2015-05-15 10:49:56 +01001950#ifndef OPENSSL_NO_NEXTPROTONEG
Matt Caswell0f113f32015-01-22 03:40:55 +00001951 else if (type == TLSEXT_TYPE_next_proto_neg &&
1952 s->s3->tmp.finish_md_len == 0) {
1953 unsigned char *selected;
1954 unsigned char selected_len;
Matt Caswell0f113f32015-01-22 03:40:55 +00001955 /* We must have requested it. */
1956 if (s->ctx->next_proto_select_cb == NULL) {
1957 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1958 return 0;
1959 }
1960 /* The data must be valid */
Matt Caswell50932c42015-08-04 17:36:02 +01001961 if (!ssl_next_proto_validate(&spkt)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001962 *al = TLS1_AD_DECODE_ERROR;
1963 return 0;
1964 }
Emilia Kaspera230b262016-08-05 19:03:17 +02001965 if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data,
1966 size,
1967 s->
1968 ctx->next_proto_select_cb_arg) !=
Matt Caswell0f113f32015-01-22 03:40:55 +00001969 SSL_TLSEXT_ERR_OK) {
1970 *al = TLS1_AD_INTERNAL_ERROR;
1971 return 0;
1972 }
Matt Caswellc31dbed2016-09-09 10:53:39 +01001973 /*
1974 * Could be non-NULL if server has sent multiple NPN extensions in
1975 * a single Serverhello
1976 */
1977 OPENSSL_free(s->next_proto_negotiated);
Matt Caswell0f113f32015-01-22 03:40:55 +00001978 s->next_proto_negotiated = OPENSSL_malloc(selected_len);
Matt Caswella71edf32015-10-30 10:05:53 +00001979 if (s->next_proto_negotiated == NULL) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001980 *al = TLS1_AD_INTERNAL_ERROR;
1981 return 0;
1982 }
1983 memcpy(s->next_proto_negotiated, selected, selected_len);
1984 s->next_proto_negotiated_len = selected_len;
1985 s->s3->next_proto_neg_seen = 1;
1986 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01001987#endif
Bodo Möller761772d2007-09-21 06:54:24 +00001988
Matt Caswell0f113f32015-01-22 03:40:55 +00001989 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation) {
1990 unsigned len;
Matt Caswell0f113f32015-01-22 03:40:55 +00001991 /* We must have requested it. */
Todd Short817cd0d2016-03-05 08:47:55 -05001992 if (!s->s3->alpn_sent) {
Matt Caswell0f113f32015-01-22 03:40:55 +00001993 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1994 return 0;
1995 }
Matt Caswell50e735f2015-01-05 11:30:03 +00001996 /*-
1997 * The extension data consists of:
1998 * uint16 list_length
1999 * uint8 proto_length;
2000 * uint8 proto[proto_length];
2001 */
Matt Caswell50932c42015-08-04 17:36:02 +01002002 if (!PACKET_get_net_2(&spkt, &len)
Emilia Kaspera230b262016-08-05 19:03:17 +02002003 || PACKET_remaining(&spkt) != len || !PACKET_get_1(&spkt, &len)
2004 || PACKET_remaining(&spkt) != len) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002005 *al = TLS1_AD_DECODE_ERROR;
2006 return 0;
2007 }
Rich Salzb548a1f2015-05-01 10:02:07 -04002008 OPENSSL_free(s->s3->alpn_selected);
Matt Caswell0f113f32015-01-22 03:40:55 +00002009 s->s3->alpn_selected = OPENSSL_malloc(len);
Matt Caswella71edf32015-10-30 10:05:53 +00002010 if (s->s3->alpn_selected == NULL) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002011 *al = TLS1_AD_INTERNAL_ERROR;
2012 return 0;
2013 }
Matt Caswell50932c42015-08-04 17:36:02 +01002014 if (!PACKET_copy_bytes(&spkt, s->s3->alpn_selected, len)) {
2015 *al = TLS1_AD_DECODE_ERROR;
2016 return 0;
2017 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002018 s->s3->alpn_selected_len = len;
2019 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01002020#ifndef OPENSSL_NO_SRTP
Matt Caswell0f113f32015-01-22 03:40:55 +00002021 else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) {
Matt Caswell50932c42015-08-04 17:36:02 +01002022 if (ssl_parse_serverhello_use_srtp_ext(s, &spkt, al))
Matt Caswell0f113f32015-01-22 03:40:55 +00002023 return 0;
2024 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01002025#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00002026 else if (type == TLSEXT_TYPE_encrypt_then_mac) {
2027 /* Ignore if inappropriate ciphersuite */
David Woodhousecde61452016-10-14 00:26:38 +01002028 if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC) &&
2029 s->s3->tmp.new_cipher->algorithm_mac != SSL_AEAD
Matt Caswell0f113f32015-01-22 03:40:55 +00002030 && s->s3->tmp.new_cipher->algorithm_enc != SSL_RC4)
2031 s->s3->flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC;
Matt Caswell0f1e51e2016-11-02 15:03:56 +00002032 } else if (type == TLSEXT_TYPE_extended_master_secret &&
Matt Caswell94ed2c62016-11-14 14:53:31 +00002033 (SSL_IS_DTLS(s) || !SSL_IS_TLS13(s))) {
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00002034 s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS;
Dr. Stephen Hensonddc06b32015-01-23 02:45:13 +00002035 if (!s->hit)
2036 s->session->flags |= SSL_SESS_FLAG_EXTMS;
Matt Caswelld7c42d72016-11-01 14:09:19 +00002037 } else if (type == TLSEXT_TYPE_key_share
Matt Caswell94ed2c62016-11-14 14:53:31 +00002038 && SSL_IS_TLS13(s)) {
Matt Caswelld7c42d72016-11-01 14:09:19 +00002039 unsigned int group_id;
2040 PACKET encoded_pt;
2041 EVP_PKEY *ckey = s->s3->tmp.pkey, *skey = NULL;
2042
2043 /* Sanity check */
2044 if (ckey == NULL) {
2045 *al = SSL_AD_INTERNAL_ERROR;
2046 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
2047 return 0;
2048 }
2049
2050 if (!PACKET_get_net_2(&spkt, &group_id)) {
2051 *al = SSL_AD_HANDSHAKE_FAILURE;
2052 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT,
2053 SSL_R_LENGTH_MISMATCH);
2054 return 0;
2055 }
2056
2057 if (group_id != s->s3->group_id) {
2058 /*
2059 * This isn't for the group that we sent in the original
2060 * key_share!
2061 */
2062 *al = SSL_AD_HANDSHAKE_FAILURE;
2063 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT,
2064 SSL_R_BAD_KEY_SHARE);
2065 return 0;
2066 }
2067
Matt Caswell323f2122016-11-04 09:49:16 +00002068 if (!PACKET_as_length_prefixed_2(&spkt, &encoded_pt)
2069 || PACKET_remaining(&encoded_pt) == 0) {
Matt Caswelld7c42d72016-11-01 14:09:19 +00002070 *al = SSL_AD_DECODE_ERROR;
2071 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT,
2072 SSL_R_LENGTH_MISMATCH);
2073 return 0;
2074 }
2075
Matt Caswell94ed2c62016-11-14 14:53:31 +00002076 skey = ssl_generate_pkey(ckey);
Matt Caswell884a7902016-11-23 22:12:56 +00002077 if (skey == NULL) {
2078 *al = SSL_AD_INTERNAL_ERROR;
2079 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT, ERR_R_MALLOC_FAILURE);
2080 return 0;
2081 }
Matt Caswelld7c42d72016-11-01 14:09:19 +00002082 if (!EVP_PKEY_set1_tls_encodedpoint(skey, PACKET_data(&encoded_pt),
2083 PACKET_remaining(&encoded_pt))) {
2084 *al = SSL_AD_DECODE_ERROR;
2085 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT, SSL_R_BAD_ECPOINT);
2086 return 0;
2087 }
2088
Matt Caswell0f1e51e2016-11-02 15:03:56 +00002089 if (ssl_derive(s, ckey, skey, 1) == 0) {
2090 *al = SSL_AD_INTERNAL_ERROR;
2091 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
2092 EVP_PKEY_free(skey);
2093 return 0;
2094 }
Matt Caswelld7c42d72016-11-01 14:09:19 +00002095 EVP_PKEY_free(skey);
Matt Caswell0f113f32015-01-22 03:40:55 +00002096 /*
2097 * If this extension type was not otherwise handled, but matches a
2098 * custom_cli_ext_record, then send it to the c callback
2099 */
Matt Caswelld7c42d72016-11-01 14:09:19 +00002100 } else if (custom_ext_parse(s, 0, type, data, size, al) <= 0)
Matt Caswell0f113f32015-01-22 03:40:55 +00002101 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00002102 }
Adam Langley6f017a82013-04-15 18:07:47 -04002103
Matt Caswell50932c42015-08-04 17:36:02 +01002104 if (PACKET_remaining(pkt) != 0) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002105 *al = SSL_AD_DECODE_ERROR;
2106 return 0;
2107 }
Bodo Möllered3883d2006-01-02 23:14:37 +00002108
Matt Caswell0f113f32015-01-22 03:40:55 +00002109 if (!s->hit && tlsext_servername == 1) {
2110 if (s->tlsext_hostname) {
2111 if (s->session->tlsext_hostname == NULL) {
Emilia Kaspera230b262016-08-05 19:03:17 +02002112 s->session->tlsext_hostname =
2113 OPENSSL_strdup(s->tlsext_hostname);
Matt Caswell0f113f32015-01-22 03:40:55 +00002114 if (!s->session->tlsext_hostname) {
2115 *al = SSL_AD_UNRECOGNIZED_NAME;
2116 return 0;
2117 }
2118 } else {
2119 *al = SSL_AD_DECODE_ERROR;
2120 return 0;
2121 }
2122 }
2123 }
Bodo Möllered3883d2006-01-02 23:14:37 +00002124
Matt Caswell0f113f32015-01-22 03:40:55 +00002125 ri_check:
Dr. Stephen Hensonc27c9cb2009-12-14 13:56:04 +00002126
Matt Caswell0f113f32015-01-22 03:40:55 +00002127 /*
2128 * Determine if we need to see RI. Strictly speaking if we want to avoid
2129 * an attack we should *always* see RI even on initial server hello
2130 * because the client doesn't see any renegotiation during an attack.
2131 * However this would mean we could not connect to any server which
Matt Caswelle7653f32016-06-14 10:41:00 +01002132 * doesn't support RI so for the immediate future tolerate RI absence
Matt Caswell0f113f32015-01-22 03:40:55 +00002133 */
2134 if (!renegotiate_seen && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
2135 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) {
2136 *al = SSL_AD_HANDSHAKE_FAILURE;
2137 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT,
2138 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
2139 return 0;
2140 }
Dr. Stephen Hensonc27c9cb2009-12-14 13:56:04 +00002141
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00002142 if (s->hit) {
2143 /*
2144 * Check extended master secret extension is consistent with
2145 * original session.
2146 */
2147 if (!(s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) !=
2148 !(s->session->flags & SSL_SESS_FLAG_EXTMS)) {
2149 *al = SSL_AD_HANDSHAKE_FAILURE;
2150 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT, SSL_R_INCONSISTENT_EXTMS);
2151 return 0;
Emilia Kaspera230b262016-08-05 19:03:17 +02002152 }
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00002153 }
2154
Matt Caswell0f113f32015-01-22 03:40:55 +00002155 return 1;
2156}
Bodo Möllerb2172f42006-04-03 11:56:30 +00002157
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002158int ssl_prepare_clienthello_tlsext(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00002159{
Todd Short817cd0d2016-03-05 08:47:55 -05002160 s->s3->alpn_sent = 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00002161 return 1;
2162}
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002163
2164int ssl_prepare_serverhello_tlsext(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00002165{
2166 return 1;
2167}
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002168
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002169/* Initialise digests to default values */
Dr. Stephen Hensona0f63822015-11-24 00:08:35 +00002170void ssl_set_default_md(SSL *s)
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002171{
2172 const EVP_MD **pmd = s->s3->tmp.md;
2173#ifndef OPENSSL_NO_DSA
Dr. Stephen Henson152fbc22015-11-29 16:27:08 +00002174 pmd[SSL_PKEY_DSA_SIGN] = ssl_md(SSL_MD_SHA1_IDX);
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002175#endif
2176#ifndef OPENSSL_NO_RSA
Dr. Stephen Hensond18d31a2015-08-29 22:11:05 +01002177 if (SSL_USE_SIGALGS(s))
Dr. Stephen Henson152fbc22015-11-29 16:27:08 +00002178 pmd[SSL_PKEY_RSA_SIGN] = ssl_md(SSL_MD_SHA1_IDX);
Dr. Stephen Hensond18d31a2015-08-29 22:11:05 +01002179 else
Dr. Stephen Henson152fbc22015-11-29 16:27:08 +00002180 pmd[SSL_PKEY_RSA_SIGN] = ssl_md(SSL_MD_MD5_SHA1_IDX);
Dr. Stephen Hensond18d31a2015-08-29 22:11:05 +01002181 pmd[SSL_PKEY_RSA_ENC] = pmd[SSL_PKEY_RSA_SIGN];
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002182#endif
2183#ifndef OPENSSL_NO_EC
Dr. Stephen Henson152fbc22015-11-29 16:27:08 +00002184 pmd[SSL_PKEY_ECC] = ssl_md(SSL_MD_SHA1_IDX);
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002185#endif
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002186#ifndef OPENSSL_NO_GOST
Dr. Stephen Henson152fbc22015-11-29 16:27:08 +00002187 pmd[SSL_PKEY_GOST01] = ssl_md(SSL_MD_GOST94_IDX);
2188 pmd[SSL_PKEY_GOST12_256] = ssl_md(SSL_MD_GOST12_256_IDX);
2189 pmd[SSL_PKEY_GOST12_512] = ssl_md(SSL_MD_GOST12_512_IDX);
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002190#endif
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002191}
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002192
Dr. Stephen Hensone469af82014-11-17 16:52:59 +00002193int tls1_set_server_sigalgs(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00002194{
2195 int al;
2196 size_t i;
FdaSilvaYY8483a002016-03-10 21:34:48 +01002197
2198 /* Clear any shared signature algorithms */
Rich Salzb548a1f2015-05-01 10:02:07 -04002199 OPENSSL_free(s->cert->shared_sigalgs);
2200 s->cert->shared_sigalgs = NULL;
2201 s->cert->shared_sigalgslen = 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00002202 /* Clear certificate digests and validity flags */
2203 for (i = 0; i < SSL_PKEY_NUM; i++) {
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002204 s->s3->tmp.md[i] = NULL;
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01002205 s->s3->tmp.valid_flags[i] = 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00002206 }
Dr. Stephen Hensone469af82014-11-17 16:52:59 +00002207
Matt Caswell0f113f32015-01-22 03:40:55 +00002208 /* If sigalgs received process it. */
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01002209 if (s->s3->tmp.peer_sigalgs) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002210 if (!tls1_process_sigalgs(s)) {
2211 SSLerr(SSL_F_TLS1_SET_SERVER_SIGALGS, ERR_R_MALLOC_FAILURE);
2212 al = SSL_AD_INTERNAL_ERROR;
2213 goto err;
2214 }
2215 /* Fatal error is no shared signature algorithms */
2216 if (!s->cert->shared_sigalgs) {
2217 SSLerr(SSL_F_TLS1_SET_SERVER_SIGALGS,
FdaSilvaYYf430ba32016-06-19 19:39:01 +02002218 SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS);
Matt Caswell0f113f32015-01-22 03:40:55 +00002219 al = SSL_AD_ILLEGAL_PARAMETER;
2220 goto err;
2221 }
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002222 } else {
2223 ssl_set_default_md(s);
2224 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002225 return 1;
2226 err:
2227 ssl3_send_alert(s, SSL3_AL_FATAL, al);
2228 return 0;
2229}
Dr. Stephen Hensone469af82014-11-17 16:52:59 +00002230
Emilia Kasper70c22882016-07-04 20:32:28 +02002231/*
2232 * Upon success, returns 1.
2233 * Upon failure, returns 0 and sets |al| to the appropriate fatal alert.
2234 */
2235int ssl_check_clienthello_tlsext_late(SSL *s, int *al)
Matt Caswell0f113f32015-01-22 03:40:55 +00002236{
Emilia Kasper70c22882016-07-04 20:32:28 +02002237 s->tlsext_status_expected = 0;
Ben Laurie2daceb02012-09-11 12:57:46 +00002238
Matt Caswell0f113f32015-01-22 03:40:55 +00002239 /*
2240 * If status request then ask callback what to do. Note: this must be
2241 * called after servername callbacks in case the certificate has changed,
2242 * and must be called after the cipher has been chosen because this may
2243 * influence which certificate is sent
2244 */
2245 if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb) {
Emilia Kasper70c22882016-07-04 20:32:28 +02002246 int ret;
Matt Caswell0f113f32015-01-22 03:40:55 +00002247 CERT_PKEY *certpkey;
2248 certpkey = ssl_get_server_send_pkey(s);
2249 /* If no certificate can't return certificate status */
Emilia Kasper70c22882016-07-04 20:32:28 +02002250 if (certpkey != NULL) {
2251 /*
2252 * Set current certificate to one we will use so SSL_get_certificate
2253 * et al can pick it up.
2254 */
2255 s->cert->key = certpkey;
2256 ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2257 switch (ret) {
2258 /* We don't want to send a status request response */
2259 case SSL_TLSEXT_ERR_NOACK:
Matt Caswell0f113f32015-01-22 03:40:55 +00002260 s->tlsext_status_expected = 0;
Emilia Kasper70c22882016-07-04 20:32:28 +02002261 break;
2262 /* status request response should be sent */
2263 case SSL_TLSEXT_ERR_OK:
2264 if (s->tlsext_ocsp_resp)
2265 s->tlsext_status_expected = 1;
2266 break;
2267 /* something bad happened */
2268 case SSL_TLSEXT_ERR_ALERT_FATAL:
2269 default:
2270 *al = SSL_AD_INTERNAL_ERROR;
2271 return 0;
2272 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002273 }
Todd Short817cd0d2016-03-05 08:47:55 -05002274 }
2275
Emilia Kasper70c22882016-07-04 20:32:28 +02002276 if (!tls1_alpn_handle_client_hello_late(s, al)) {
2277 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00002278 }
Emilia Kasper70c22882016-07-04 20:32:28 +02002279
2280 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00002281}
Ben Laurie2daceb02012-09-11 12:57:46 +00002282
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002283int ssl_check_serverhello_tlsext(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00002284{
2285 int ret = SSL_TLSEXT_ERR_NOACK;
2286 int al = SSL_AD_UNRECOGNIZED_NAME;
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002287
Matt Caswelle481f9b2015-05-15 10:49:56 +01002288#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00002289 /*
2290 * If we are client and using an elliptic curve cryptography cipher
2291 * suite, then if server returns an EC point formats lists extension it
2292 * must contain uncompressed.
2293 */
2294 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
2295 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
2296 if ((s->tlsext_ecpointformatlist != NULL)
2297 && (s->tlsext_ecpointformatlist_length > 0)
2298 && (s->session->tlsext_ecpointformatlist != NULL)
2299 && (s->session->tlsext_ecpointformatlist_length > 0)
Dr. Stephen Hensonce0c1f22016-02-11 18:19:27 +00002300 && ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002301 /* we are using an ECC cipher */
2302 size_t i;
2303 unsigned char *list;
2304 int found_uncompressed = 0;
2305 list = s->session->tlsext_ecpointformatlist;
2306 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++) {
2307 if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed) {
2308 found_uncompressed = 1;
2309 break;
2310 }
2311 }
2312 if (!found_uncompressed) {
2313 SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,
2314 SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
2315 return -1;
2316 }
2317 }
2318 ret = SSL_TLSEXT_ERR_OK;
Emilia Kaspera230b262016-08-05 19:03:17 +02002319#endif /* OPENSSL_NO_EC */
Bodo Möller36ca4ba2006-03-11 23:46:37 +00002320
Matt Caswell0f113f32015-01-22 03:40:55 +00002321 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
2322 ret =
2323 s->ctx->tlsext_servername_callback(s, &al,
2324 s->ctx->tlsext_servername_arg);
2325 else if (s->initial_ctx != NULL
2326 && s->initial_ctx->tlsext_servername_callback != 0)
2327 ret =
2328 s->initial_ctx->tlsext_servername_callback(s, &al,
2329 s->
2330 initial_ctx->tlsext_servername_arg);
Bodo Möller241520e2006-01-11 06:10:40 +00002331
Matt Caswellb1931d42015-12-10 10:44:30 +00002332 /*
2333 * Ensure we get sensible values passed to tlsext_status_cb in the event
2334 * that we don't receive a status message
2335 */
Matt Caswellbb1aaab2015-11-05 14:31:11 +00002336 OPENSSL_free(s->tlsext_ocsp_resp);
2337 s->tlsext_ocsp_resp = NULL;
Matt Caswell8b0e9342016-10-06 19:17:54 +01002338 s->tlsext_ocsp_resplen = 0;
Bodo Möller58ece832006-01-13 09:21:10 +00002339
Matt Caswell0f113f32015-01-22 03:40:55 +00002340 switch (ret) {
2341 case SSL_TLSEXT_ERR_ALERT_FATAL:
2342 ssl3_send_alert(s, SSL3_AL_FATAL, al);
2343 return -1;
Bodo Möller33273722006-03-30 02:44:56 +00002344
Matt Caswell0f113f32015-01-22 03:40:55 +00002345 case SSL_TLSEXT_ERR_ALERT_WARNING:
2346 ssl3_send_alert(s, SSL3_AL_WARNING, al);
2347 return 1;
Dr. Stephen Henson09e4e4b2012-04-24 12:22:23 +00002348
Matt Caswell0f113f32015-01-22 03:40:55 +00002349 case SSL_TLSEXT_ERR_NOACK:
2350 s->servername_done = 0;
2351 default:
2352 return 1;
2353 }
2354}
2355
Matt Caswell50932c42015-08-04 17:36:02 +01002356int ssl_parse_serverhello_tlsext(SSL *s, PACKET *pkt)
Matt Caswell0f113f32015-01-22 03:40:55 +00002357{
2358 int al = -1;
2359 if (s->version < SSL3_VERSION)
2360 return 1;
Matt Caswell50932c42015-08-04 17:36:02 +01002361 if (ssl_scan_serverhello_tlsext(s, pkt, &al) <= 0) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002362 ssl3_send_alert(s, SSL3_AL_FATAL, al);
2363 return 0;
2364 }
2365
2366 if (ssl_check_serverhello_tlsext(s) <= 0) {
2367 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT, SSL_R_SERVERHELLO_TLSEXT);
2368 return 0;
2369 }
2370 return 1;
Dr. Stephen Henson09e4e4b2012-04-24 12:22:23 +00002371}
2372
Matt Caswell64386322016-10-31 16:36:30 +00002373/*
2374 * Given a list of extensions that we collected earlier, find one of a given
2375 * type and return it.
2376 *
2377 * |exts| is the set of extensions previously collected.
2378 * |numexts| is the number of extensions that we have.
2379 * |type| the type of the extension that we are looking for.
2380 *
2381 * Returns a pointer to the found RAW_EXTENSION data, or NULL if not found.
2382 */
Matt Caswellcd998832016-10-23 00:41:11 +01002383RAW_EXTENSION *tls_get_extension_by_type(RAW_EXTENSION *exts, size_t numexts,
2384 unsigned int type)
Matt Caswell1ab38362016-10-22 17:24:37 +01002385{
2386 size_t loop;
2387
2388 for (loop = 0; loop < numexts; loop++) {
2389 if (exts[loop].type == type)
2390 return &exts[loop];
2391 }
2392
2393 return NULL;
2394}
2395
Tim Hudson1d97c842014-12-28 12:48:40 +10002396/*-
Matt Caswell1ab38362016-10-22 17:24:37 +01002397 * Gets the ticket information supplied by the client if any.
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00002398 *
Matt Caswell1ab38362016-10-22 17:24:37 +01002399 * hello: The parsed ClientHello data
Bodo Möllerc519e892011-09-05 13:36:23 +00002400 * ret: (output) on return, if a ticket was decrypted, then this is set to
2401 * point to the resulting session.
2402 *
2403 * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
2404 * ciphersuite, in which case we have no use for session tickets and one will
2405 * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
2406 *
2407 * Returns:
2408 * -1: fatal error, either from parsing or decrypting the ticket.
2409 * 0: no ticket was found (or was ignored, based on settings).
2410 * 1: a zero length extension was found, indicating that the client supports
2411 * session tickets but doesn't currently have one to offer.
2412 * 2: either s->tls_session_secret_cb was set, or a ticket was offered but
2413 * couldn't be decrypted because of a non-fatal error.
2414 * 3: a ticket was successfully decrypted and *ret was set.
2415 *
2416 * Side effects:
2417 * Sets s->tlsext_ticket_expected to 1 if the server will have to issue
2418 * a new session ticket to the client because the client indicated support
2419 * (and s->tls_session_secret_cb is NULL) but the client either doesn't have
2420 * a session ticket or we couldn't use the one it gave us, or if
2421 * s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
2422 * Otherwise, s->tlsext_ticket_expected is set to 0.
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00002423 */
Matt Caswell1ab38362016-10-22 17:24:37 +01002424int tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
2425 SSL_SESSION **ret)
Matt Caswell0f113f32015-01-22 03:40:55 +00002426{
Matt Caswell1ab38362016-10-22 17:24:37 +01002427 int retv;
2428 const unsigned char *etick;
2429 size_t size;
2430 RAW_EXTENSION *ticketext;
Dr. Stephen Hensone7f0d922015-12-04 19:48:15 +00002431
Matt Caswell0f113f32015-01-22 03:40:55 +00002432 *ret = NULL;
2433 s->tlsext_ticket_expected = 0;
Dr. Stephen Hensone8da6a12008-09-03 22:17:11 +00002434
Matt Caswell0f113f32015-01-22 03:40:55 +00002435 /*
Matt Caswell9362c932016-11-08 16:10:21 +00002436 * If tickets disabled or not supported by the protocol version
2437 * (e.g. TLSv1.3) behave as if no ticket present to permit stateful
Matt Caswell0f113f32015-01-22 03:40:55 +00002438 * resumption.
2439 */
Matt Caswell1ab38362016-10-22 17:24:37 +01002440 if (s->version <= SSL3_VERSION || !tls_use_ticket(s))
Matt Caswell0f113f32015-01-22 03:40:55 +00002441 return 0;
Matt Caswell9ceb2422015-04-16 10:06:25 +01002442
Matt Caswellcd998832016-10-23 00:41:11 +01002443 ticketext = tls_get_extension_by_type(hello->pre_proc_exts,
2444 hello->num_extensions,
2445 TLSEXT_TYPE_session_ticket);
Matt Caswell1ab38362016-10-22 17:24:37 +01002446 if (ticketext == NULL)
2447 return 0;
2448
Matt Caswell6b473ac2016-11-24 16:59:48 +00002449 ticketext->parsed = 1;
2450
Matt Caswell1ab38362016-10-22 17:24:37 +01002451 size = PACKET_remaining(&ticketext->data);
2452 if (size == 0) {
2453 /*
2454 * The client will accept a ticket but doesn't currently have
2455 * one.
2456 */
2457 s->tlsext_ticket_expected = 1;
2458 return 1;
Matt Caswell9ceb2422015-04-16 10:06:25 +01002459 }
Matt Caswell1ab38362016-10-22 17:24:37 +01002460 if (s->tls_session_secret_cb) {
2461 /*
2462 * Indicate that the ticket couldn't be decrypted rather than
2463 * generating the session from ticket now, trigger
2464 * abbreviated handshake based on external mechanism to
2465 * calculate the master secret later.
2466 */
2467 return 2;
Matt Caswell0f113f32015-01-22 03:40:55 +00002468 }
Matt Caswell1ab38362016-10-22 17:24:37 +01002469 if (!PACKET_get_bytes(&ticketext->data, &etick, size)) {
2470 /* Shouldn't ever happen */
2471 return -1;
2472 }
2473 retv = tls_decrypt_ticket(s, etick, size, hello->session_id,
2474 hello->session_id_len, ret);
2475 switch (retv) {
2476 case 2: /* ticket couldn't be decrypted */
2477 s->tlsext_ticket_expected = 1;
2478 return 2;
2479
2480 case 3: /* ticket was decrypted */
2481 return 3;
2482
2483 case 4: /* ticket decrypted but need to renew */
2484 s->tlsext_ticket_expected = 1;
2485 return 3;
2486
2487 default: /* fatal error */
2488 return -1;
2489 }
2490}
2491
Tim Hudson1d97c842014-12-28 12:48:40 +10002492/*-
2493 * tls_decrypt_ticket attempts to decrypt a session ticket.
Bodo Möllerc519e892011-09-05 13:36:23 +00002494 *
2495 * etick: points to the body of the session ticket extension.
FdaSilvaYY8483a002016-03-10 21:34:48 +01002496 * eticklen: the length of the session tickets extension.
Bodo Möllerc519e892011-09-05 13:36:23 +00002497 * sess_id: points at the session ID.
2498 * sesslen: the length of the session ID.
2499 * psess: (output) on return, if a ticket was decrypted, then this is set to
2500 * point to the resulting session.
2501 *
2502 * Returns:
Richard Levittebf7c6812015-11-30 13:44:28 +01002503 * -2: fatal error, malloc failure.
Bodo Möllerc519e892011-09-05 13:36:23 +00002504 * -1: fatal error, either from parsing or decrypting the ticket.
2505 * 2: the ticket couldn't be decrypted.
2506 * 3: a ticket was successfully decrypted and *psess was set.
2507 * 4: same as 3, but the ticket needs to be renewed.
2508 */
Matt Caswell0f113f32015-01-22 03:40:55 +00002509static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
Matt Caswelld736bc12016-10-04 21:22:19 +01002510 size_t eticklen, const unsigned char *sess_id,
Matt Caswellec60ccc2016-10-04 20:31:19 +01002511 size_t sesslen, SSL_SESSION **psess)
Matt Caswell0f113f32015-01-22 03:40:55 +00002512{
2513 SSL_SESSION *sess;
2514 unsigned char *sdec;
2515 const unsigned char *p;
Matt Caswell348240c2016-10-19 15:11:24 +01002516 int slen, renew_ticket = 0, ret = -1, declen;
2517 size_t mlen;
Matt Caswell0f113f32015-01-22 03:40:55 +00002518 unsigned char tick_hmac[EVP_MAX_MD_SIZE];
Richard Levittebf7c6812015-11-30 13:44:28 +01002519 HMAC_CTX *hctx = NULL;
Richard Levitte846ec072015-12-13 22:08:41 +01002520 EVP_CIPHER_CTX *ctx;
Matt Caswell0f113f32015-01-22 03:40:55 +00002521 SSL_CTX *tctx = s->initial_ctx;
Dr. Stephen Hensone97763c2016-08-22 17:20:01 +01002522
Matt Caswell0f113f32015-01-22 03:40:55 +00002523 /* Initialize session ticket encryption and HMAC contexts */
Richard Levittebf7c6812015-11-30 13:44:28 +01002524 hctx = HMAC_CTX_new();
2525 if (hctx == NULL)
2526 return -2;
Richard Levitte846ec072015-12-13 22:08:41 +01002527 ctx = EVP_CIPHER_CTX_new();
Matt Caswell35b1a432016-02-13 23:22:45 +00002528 if (ctx == NULL) {
2529 ret = -2;
2530 goto err;
2531 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002532 if (tctx->tlsext_ticket_key_cb) {
2533 unsigned char *nctick = (unsigned char *)etick;
2534 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
Richard Levitte846ec072015-12-13 22:08:41 +01002535 ctx, hctx, 0);
Matt Caswell0f113f32015-01-22 03:40:55 +00002536 if (rv < 0)
Matt Caswell35b1a432016-02-13 23:22:45 +00002537 goto err;
2538 if (rv == 0) {
2539 ret = 2;
2540 goto err;
2541 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002542 if (rv == 2)
2543 renew_ticket = 1;
2544 } else {
2545 /* Check key name matches */
TJ Saunders4e2e1ec2016-02-27 19:36:00 +01002546 if (memcmp(etick, tctx->tlsext_tick_key_name,
2547 sizeof(tctx->tlsext_tick_key_name)) != 0) {
Matt Caswell35b1a432016-02-13 23:22:45 +00002548 ret = 2;
2549 goto err;
2550 }
TJ Saunders4e2e1ec2016-02-27 19:36:00 +01002551 if (HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key,
2552 sizeof(tctx->tlsext_tick_hmac_key),
Matt Caswell5f3d93e2015-11-06 16:31:21 +00002553 EVP_sha256(), NULL) <= 0
Emilia Kaspera230b262016-08-05 19:03:17 +02002554 || EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL,
2555 tctx->tlsext_tick_aes_key,
2556 etick + sizeof(tctx->tlsext_tick_key_name)) <=
2557 0) {
Matt Caswell5f3d93e2015-11-06 16:31:21 +00002558 goto err;
Emilia Kaspera230b262016-08-05 19:03:17 +02002559 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002560 }
2561 /*
2562 * Attempt to process session ticket, first conduct sanity and integrity
2563 * checks on ticket.
2564 */
Richard Levittebf7c6812015-11-30 13:44:28 +01002565 mlen = HMAC_size(hctx);
Matt Caswell348240c2016-10-19 15:11:24 +01002566 if (mlen == 0) {
Matt Caswell5f3d93e2015-11-06 16:31:21 +00002567 goto err;
Matt Caswell0f113f32015-01-22 03:40:55 +00002568 }
Dr. Stephen Hensone97763c2016-08-22 17:20:01 +01002569 /* Sanity check ticket length: must exceed keyname + IV + HMAC */
2570 if (eticklen <=
Matt Caswell348240c2016-10-19 15:11:24 +01002571 TLSEXT_KEYNAME_LENGTH + EVP_CIPHER_CTX_iv_length(ctx) + mlen) {
Dr. Stephen Hensone97763c2016-08-22 17:20:01 +01002572 ret = 2;
2573 goto err;
2574 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002575 eticklen -= mlen;
2576 /* Check HMAC of encrypted ticket */
Richard Levittebf7c6812015-11-30 13:44:28 +01002577 if (HMAC_Update(hctx, etick, eticklen) <= 0
Emilia Kaspera230b262016-08-05 19:03:17 +02002578 || HMAC_Final(hctx, tick_hmac, NULL) <= 0) {
Matt Caswell5f3d93e2015-11-06 16:31:21 +00002579 goto err;
2580 }
Richard Levittebf7c6812015-11-30 13:44:28 +01002581 HMAC_CTX_free(hctx);
Matt Caswell0f113f32015-01-22 03:40:55 +00002582 if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) {
Richard Levitte846ec072015-12-13 22:08:41 +01002583 EVP_CIPHER_CTX_free(ctx);
Matt Caswell0f113f32015-01-22 03:40:55 +00002584 return 2;
2585 }
2586 /* Attempt to decrypt session data */
2587 /* Move p after IV to start of encrypted ticket, update length */
Richard Levitte846ec072015-12-13 22:08:41 +01002588 p = etick + 16 + EVP_CIPHER_CTX_iv_length(ctx);
2589 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(ctx);
Matt Caswell0f113f32015-01-22 03:40:55 +00002590 sdec = OPENSSL_malloc(eticklen);
Matt Caswell348240c2016-10-19 15:11:24 +01002591 if (sdec == NULL || EVP_DecryptUpdate(ctx, sdec, &slen, p,
2592 (int)eticklen) <= 0) {
Richard Levitte846ec072015-12-13 22:08:41 +01002593 EVP_CIPHER_CTX_free(ctx);
Matt Caswelld1247df2016-03-15 11:38:56 +00002594 OPENSSL_free(sdec);
Matt Caswell0f113f32015-01-22 03:40:55 +00002595 return -1;
2596 }
Matt Caswell348240c2016-10-19 15:11:24 +01002597 if (EVP_DecryptFinal(ctx, sdec + slen, &declen) <= 0) {
Richard Levitte846ec072015-12-13 22:08:41 +01002598 EVP_CIPHER_CTX_free(ctx);
Matt Caswell0f113f32015-01-22 03:40:55 +00002599 OPENSSL_free(sdec);
2600 return 2;
2601 }
Matt Caswell348240c2016-10-19 15:11:24 +01002602 slen += declen;
Richard Levitte846ec072015-12-13 22:08:41 +01002603 EVP_CIPHER_CTX_free(ctx);
2604 ctx = NULL;
Matt Caswell0f113f32015-01-22 03:40:55 +00002605 p = sdec;
Bodo Möllerc519e892011-09-05 13:36:23 +00002606
Matt Caswell0f113f32015-01-22 03:40:55 +00002607 sess = d2i_SSL_SESSION(NULL, &p, slen);
2608 OPENSSL_free(sdec);
2609 if (sess) {
2610 /*
2611 * The session ID, if non-empty, is used by some clients to detect
2612 * that the ticket has been accepted. So we copy it to the session
2613 * structure. If it is empty set length to zero as required by
2614 * standard.
2615 */
2616 if (sesslen)
2617 memcpy(sess->session_id, sess_id, sesslen);
2618 sess->session_id_length = sesslen;
2619 *psess = sess;
2620 if (renew_ticket)
2621 return 4;
2622 else
2623 return 3;
2624 }
2625 ERR_clear_error();
2626 /*
2627 * For session parse failure, indicate that we need to send a new ticket.
2628 */
2629 return 2;
Emilia Kaspera230b262016-08-05 19:03:17 +02002630 err:
Richard Levitte846ec072015-12-13 22:08:41 +01002631 EVP_CIPHER_CTX_free(ctx);
Richard Levittebf7c6812015-11-30 13:44:28 +01002632 HMAC_CTX_free(hctx);
Matt Caswell35b1a432016-02-13 23:22:45 +00002633 return ret;
Matt Caswell0f113f32015-01-22 03:40:55 +00002634}
Dr. Stephen Henson6434abb2007-08-11 23:18:29 +00002635
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002636/* Tables to translate from NIDs to TLS v1.2 ids */
2637
Matt Caswell0f113f32015-01-22 03:40:55 +00002638typedef struct {
2639 int nid;
2640 int id;
2641} tls12_lookup;
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002642
Cristian Rodríguezd97ed212014-04-20 18:41:15 -03002643static const tls12_lookup tls12_md[] = {
Matt Caswell0f113f32015-01-22 03:40:55 +00002644 {NID_md5, TLSEXT_hash_md5},
2645 {NID_sha1, TLSEXT_hash_sha1},
2646 {NID_sha224, TLSEXT_hash_sha224},
2647 {NID_sha256, TLSEXT_hash_sha256},
2648 {NID_sha384, TLSEXT_hash_sha384},
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002649 {NID_sha512, TLSEXT_hash_sha512},
2650 {NID_id_GostR3411_94, TLSEXT_hash_gostr3411},
2651 {NID_id_GostR3411_2012_256, TLSEXT_hash_gostr34112012_256},
2652 {NID_id_GostR3411_2012_512, TLSEXT_hash_gostr34112012_512},
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002653};
2654
Cristian Rodríguezd97ed212014-04-20 18:41:15 -03002655static const tls12_lookup tls12_sig[] = {
Matt Caswell0f113f32015-01-22 03:40:55 +00002656 {EVP_PKEY_RSA, TLSEXT_signature_rsa},
2657 {EVP_PKEY_DSA, TLSEXT_signature_dsa},
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002658 {EVP_PKEY_EC, TLSEXT_signature_ecdsa},
2659 {NID_id_GostR3410_2001, TLSEXT_signature_gostr34102001},
2660 {NID_id_GostR3410_2012_256, TLSEXT_signature_gostr34102012_256},
2661 {NID_id_GostR3410_2012_512, TLSEXT_signature_gostr34102012_512}
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002662};
2663
Cristian Rodríguezd97ed212014-04-20 18:41:15 -03002664static int tls12_find_id(int nid, const tls12_lookup *table, size_t tlen)
Matt Caswell0f113f32015-01-22 03:40:55 +00002665{
2666 size_t i;
2667 for (i = 0; i < tlen; i++) {
2668 if (table[i].nid == nid)
2669 return table[i].id;
2670 }
2671 return -1;
2672}
Dr. Stephen Hensone7f8ff42012-03-06 14:28:21 +00002673
Cristian Rodríguezd97ed212014-04-20 18:41:15 -03002674static int tls12_find_nid(int id, const tls12_lookup *table, size_t tlen)
Matt Caswell0f113f32015-01-22 03:40:55 +00002675{
2676 size_t i;
2677 for (i = 0; i < tlen; i++) {
2678 if ((table[i].id) == id)
2679 return table[i].nid;
2680 }
2681 return NID_undef;
2682}
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002683
Matt Caswell6400f332016-09-14 11:10:37 +01002684int tls12_get_sigandhash(WPACKET *pkt, const EVP_PKEY *pk, const EVP_MD *md)
2685{
2686 int sig_id, md_id;
Matt Caswell418a18a2016-09-20 10:16:15 +01002687
2688 if (md == NULL)
Matt Caswell6400f332016-09-14 11:10:37 +01002689 return 0;
2690 md_id = tls12_find_id(EVP_MD_type(md), tls12_md, OSSL_NELEM(tls12_md));
2691 if (md_id == -1)
2692 return 0;
2693 sig_id = tls12_get_sigid(pk);
2694 if (sig_id == -1)
2695 return 0;
Matt Caswell08029df2016-09-20 14:47:44 +01002696 if (!WPACKET_put_bytes_u8(pkt, md_id) || !WPACKET_put_bytes_u8(pkt, sig_id))
Matt Caswell6400f332016-09-14 11:10:37 +01002697 return 0;
2698
2699 return 1;
2700}
2701
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002702int tls12_get_sigid(const EVP_PKEY *pk)
Matt Caswell0f113f32015-01-22 03:40:55 +00002703{
Dr. Stephen Henson3aeb9342016-01-19 00:21:12 +00002704 return tls12_find_id(EVP_PKEY_id(pk), tls12_sig, OSSL_NELEM(tls12_sig));
Matt Caswell0f113f32015-01-22 03:40:55 +00002705}
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002706
Matt Caswell0f113f32015-01-22 03:40:55 +00002707typedef struct {
2708 int nid;
2709 int secbits;
Dr. Stephen Henson7afd2312015-11-29 16:54:27 +00002710 int md_idx;
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002711 unsigned char tlsext_hash;
Matt Caswell0f113f32015-01-22 03:40:55 +00002712} tls12_hash_info;
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002713
2714static const tls12_hash_info tls12_md_info[] = {
Dr. Stephen Henson7afd2312015-11-29 16:54:27 +00002715 {NID_md5, 64, SSL_MD_MD5_IDX, TLSEXT_hash_md5},
2716 {NID_sha1, 80, SSL_MD_SHA1_IDX, TLSEXT_hash_sha1},
2717 {NID_sha224, 112, SSL_MD_SHA224_IDX, TLSEXT_hash_sha224},
2718 {NID_sha256, 128, SSL_MD_SHA256_IDX, TLSEXT_hash_sha256},
2719 {NID_sha384, 192, SSL_MD_SHA384_IDX, TLSEXT_hash_sha384},
2720 {NID_sha512, 256, SSL_MD_SHA512_IDX, TLSEXT_hash_sha512},
Emilia Kaspera230b262016-08-05 19:03:17 +02002721 {NID_id_GostR3411_94, 128, SSL_MD_GOST94_IDX, TLSEXT_hash_gostr3411},
2722 {NID_id_GostR3411_2012_256, 128, SSL_MD_GOST12_256_IDX,
2723 TLSEXT_hash_gostr34112012_256},
2724 {NID_id_GostR3411_2012_512, 256, SSL_MD_GOST12_512_IDX,
2725 TLSEXT_hash_gostr34112012_512},
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002726};
2727
2728static const tls12_hash_info *tls12_get_hash_info(unsigned char hash_alg)
Matt Caswell0f113f32015-01-22 03:40:55 +00002729{
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002730 unsigned int i;
Matt Caswell0f113f32015-01-22 03:40:55 +00002731 if (hash_alg == 0)
2732 return NULL;
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002733
Emilia Kaspera230b262016-08-05 19:03:17 +02002734 for (i = 0; i < OSSL_NELEM(tls12_md_info); i++) {
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002735 if (tls12_md_info[i].tlsext_hash == hash_alg)
2736 return tls12_md_info + i;
2737 }
2738
2739 return NULL;
Matt Caswell0f113f32015-01-22 03:40:55 +00002740}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002741
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002742const EVP_MD *tls12_get_hash(unsigned char hash_alg)
Matt Caswell0f113f32015-01-22 03:40:55 +00002743{
2744 const tls12_hash_info *inf;
2745 if (hash_alg == TLSEXT_hash_md5 && FIPS_mode())
2746 return NULL;
2747 inf = tls12_get_hash_info(hash_alg);
Dr. Stephen Henson7afd2312015-11-29 16:54:27 +00002748 if (!inf)
Matt Caswell0f113f32015-01-22 03:40:55 +00002749 return NULL;
Dr. Stephen Henson7afd2312015-11-29 16:54:27 +00002750 return ssl_md(inf->md_idx);
Matt Caswell0f113f32015-01-22 03:40:55 +00002751}
Dr. Stephen Hensona2f92002011-05-09 15:44:01 +00002752
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00002753static int tls12_get_pkey_idx(unsigned char sig_alg)
Matt Caswell0f113f32015-01-22 03:40:55 +00002754{
2755 switch (sig_alg) {
Matt Caswelle481f9b2015-05-15 10:49:56 +01002756#ifndef OPENSSL_NO_RSA
Matt Caswell0f113f32015-01-22 03:40:55 +00002757 case TLSEXT_signature_rsa:
2758 return SSL_PKEY_RSA_SIGN;
Matt Caswelle481f9b2015-05-15 10:49:56 +01002759#endif
2760#ifndef OPENSSL_NO_DSA
Matt Caswell0f113f32015-01-22 03:40:55 +00002761 case TLSEXT_signature_dsa:
2762 return SSL_PKEY_DSA_SIGN;
Matt Caswelle481f9b2015-05-15 10:49:56 +01002763#endif
2764#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00002765 case TLSEXT_signature_ecdsa:
2766 return SSL_PKEY_ECC;
Matt Caswelle481f9b2015-05-15 10:49:56 +01002767#endif
Emilia Kaspera230b262016-08-05 19:03:17 +02002768#ifndef OPENSSL_NO_GOST
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00002769 case TLSEXT_signature_gostr34102001:
2770 return SSL_PKEY_GOST01;
2771
2772 case TLSEXT_signature_gostr34102012_256:
2773 return SSL_PKEY_GOST12_256;
2774
2775 case TLSEXT_signature_gostr34102012_512:
2776 return SSL_PKEY_GOST12_512;
Emilia Kaspera230b262016-08-05 19:03:17 +02002777#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00002778 }
2779 return -1;
2780}
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00002781
2782/* Convert TLS 1.2 signature algorithm extension values into NIDs */
2783static void tls1_lookup_sigalg(int *phash_nid, int *psign_nid,
Matt Caswell0f113f32015-01-22 03:40:55 +00002784 int *psignhash_nid, const unsigned char *data)
2785{
Matt Caswell330dcb02015-11-11 10:44:07 +00002786 int sign_nid = NID_undef, hash_nid = NID_undef;
Matt Caswell0f113f32015-01-22 03:40:55 +00002787 if (!phash_nid && !psign_nid && !psignhash_nid)
2788 return;
2789 if (phash_nid || psignhash_nid) {
Dr. Stephen Hensonb6eb9822015-05-02 18:30:00 +01002790 hash_nid = tls12_find_nid(data[0], tls12_md, OSSL_NELEM(tls12_md));
Matt Caswell0f113f32015-01-22 03:40:55 +00002791 if (phash_nid)
2792 *phash_nid = hash_nid;
2793 }
2794 if (psign_nid || psignhash_nid) {
Dr. Stephen Hensonb6eb9822015-05-02 18:30:00 +01002795 sign_nid = tls12_find_nid(data[1], tls12_sig, OSSL_NELEM(tls12_sig));
Matt Caswell0f113f32015-01-22 03:40:55 +00002796 if (psign_nid)
2797 *psign_nid = sign_nid;
2798 }
2799 if (psignhash_nid) {
Matt Caswell330dcb02015-11-11 10:44:07 +00002800 if (sign_nid == NID_undef || hash_nid == NID_undef
Emilia Kaspera230b262016-08-05 19:03:17 +02002801 || OBJ_find_sigid_by_algs(psignhash_nid, hash_nid, sign_nid) <= 0)
Matt Caswell0f113f32015-01-22 03:40:55 +00002802 *psignhash_nid = NID_undef;
2803 }
2804}
2805
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002806/* Check to see if a signature algorithm is allowed */
2807static int tls12_sigalg_allowed(SSL *s, int op, const unsigned char *ptmp)
Matt Caswell0f113f32015-01-22 03:40:55 +00002808{
2809 /* See if we have an entry in the hash table and it is enabled */
2810 const tls12_hash_info *hinf = tls12_get_hash_info(ptmp[0]);
Dr. Stephen Henson7afd2312015-11-29 16:54:27 +00002811 if (hinf == NULL || ssl_md(hinf->md_idx) == NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +00002812 return 0;
2813 /* See if public key algorithm allowed */
2814 if (tls12_get_pkey_idx(ptmp[1]) == -1)
2815 return 0;
2816 /* Finally see if security callback allows it */
2817 return ssl_security(s, op, hinf->secbits, hinf->nid, (void *)ptmp);
2818}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002819
Matt Caswell0f113f32015-01-22 03:40:55 +00002820/*
2821 * Get a mask of disabled public key algorithms based on supported signature
2822 * algorithms. For example if no signature algorithm supports RSA then RSA is
2823 * disabled.
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002824 */
2825
Dr. Stephen Henson90d9e492015-11-05 16:14:17 +00002826void ssl_set_sig_mask(uint32_t *pmask_a, SSL *s, int op)
Matt Caswell0f113f32015-01-22 03:40:55 +00002827{
2828 const unsigned char *sigalgs;
2829 size_t i, sigalgslen;
2830 int have_rsa = 0, have_dsa = 0, have_ecdsa = 0;
2831 /*
2832 * Now go through all signature algorithms seeing if we support any for
2833 * RSA, DSA, ECDSA. Do this for all versions not just TLS 1.2. To keep
2834 * down calls to security callback only check if we have to.
2835 */
2836 sigalgslen = tls12_get_psigalgs(s, &sigalgs);
2837 for (i = 0; i < sigalgslen; i += 2, sigalgs += 2) {
2838 switch (sigalgs[1]) {
Matt Caswelle481f9b2015-05-15 10:49:56 +01002839#ifndef OPENSSL_NO_RSA
Matt Caswell0f113f32015-01-22 03:40:55 +00002840 case TLSEXT_signature_rsa:
2841 if (!have_rsa && tls12_sigalg_allowed(s, op, sigalgs))
2842 have_rsa = 1;
2843 break;
Matt Caswelle481f9b2015-05-15 10:49:56 +01002844#endif
2845#ifndef OPENSSL_NO_DSA
Matt Caswell0f113f32015-01-22 03:40:55 +00002846 case TLSEXT_signature_dsa:
2847 if (!have_dsa && tls12_sigalg_allowed(s, op, sigalgs))
2848 have_dsa = 1;
2849 break;
Matt Caswelle481f9b2015-05-15 10:49:56 +01002850#endif
2851#ifndef OPENSSL_NO_EC
Matt Caswell0f113f32015-01-22 03:40:55 +00002852 case TLSEXT_signature_ecdsa:
2853 if (!have_ecdsa && tls12_sigalg_allowed(s, op, sigalgs))
2854 have_ecdsa = 1;
2855 break;
Matt Caswelle481f9b2015-05-15 10:49:56 +01002856#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00002857 }
2858 }
2859 if (!have_rsa)
2860 *pmask_a |= SSL_aRSA;
2861 if (!have_dsa)
2862 *pmask_a |= SSL_aDSS;
2863 if (!have_ecdsa)
2864 *pmask_a |= SSL_aECDSA;
2865}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00002866
Matt Caswellae2f7b32016-09-05 17:34:04 +01002867int tls12_copy_sigalgs(SSL *s, WPACKET *pkt,
Matt Caswell2c7b4db2016-08-03 20:57:52 +01002868 const unsigned char *psig, size_t psiglen)
2869{
2870 size_t i;
Matt Caswellc0f9e232016-09-13 09:40:38 +01002871
Matt Caswell2c7b4db2016-08-03 20:57:52 +01002872 for (i = 0; i < psiglen; i += 2, psig += 2) {
2873 if (tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SUPPORTED, psig)) {
Matt Caswell08029df2016-09-20 14:47:44 +01002874 if (!WPACKET_put_bytes_u8(pkt, psig[0])
2875 || !WPACKET_put_bytes_u8(pkt, psig[1]))
Matt Caswell2c7b4db2016-08-03 20:57:52 +01002876 return 0;
2877 }
2878 }
2879 return 1;
2880}
2881
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00002882/* Given preference and allowed sigalgs set shared sigalgs */
Matt Caswell348240c2016-10-19 15:11:24 +01002883static size_t tls12_shared_sigalgs(SSL *s, TLS_SIGALGS *shsig,
2884 const unsigned char *pref, size_t preflen,
2885 const unsigned char *allow, size_t allowlen)
Matt Caswell0f113f32015-01-22 03:40:55 +00002886{
2887 const unsigned char *ptmp, *atmp;
2888 size_t i, j, nmatch = 0;
2889 for (i = 0, ptmp = pref; i < preflen; i += 2, ptmp += 2) {
2890 /* Skip disabled hashes or signature algorithms */
2891 if (!tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SHARED, ptmp))
2892 continue;
2893 for (j = 0, atmp = allow; j < allowlen; j += 2, atmp += 2) {
2894 if (ptmp[0] == atmp[0] && ptmp[1] == atmp[1]) {
2895 nmatch++;
2896 if (shsig) {
2897 shsig->rhash = ptmp[0];
2898 shsig->rsign = ptmp[1];
2899 tls1_lookup_sigalg(&shsig->hash_nid,
2900 &shsig->sign_nid,
2901 &shsig->signandhash_nid, ptmp);
2902 shsig++;
2903 }
2904 break;
2905 }
2906 }
2907 }
2908 return nmatch;
2909}
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00002910
2911/* Set shared signature algorithms for SSL structures */
2912static int tls1_set_shared_sigalgs(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00002913{
2914 const unsigned char *pref, *allow, *conf;
2915 size_t preflen, allowlen, conflen;
2916 size_t nmatch;
2917 TLS_SIGALGS *salgs = NULL;
2918 CERT *c = s->cert;
2919 unsigned int is_suiteb = tls1_suiteb(s);
Rich Salzb548a1f2015-05-01 10:02:07 -04002920
2921 OPENSSL_free(c->shared_sigalgs);
2922 c->shared_sigalgs = NULL;
2923 c->shared_sigalgslen = 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00002924 /* If client use client signature algorithms if not NULL */
2925 if (!s->server && c->client_sigalgs && !is_suiteb) {
2926 conf = c->client_sigalgs;
2927 conflen = c->client_sigalgslen;
2928 } else if (c->conf_sigalgs && !is_suiteb) {
2929 conf = c->conf_sigalgs;
2930 conflen = c->conf_sigalgslen;
2931 } else
2932 conflen = tls12_get_psigalgs(s, &conf);
2933 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || is_suiteb) {
2934 pref = conf;
2935 preflen = conflen;
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01002936 allow = s->s3->tmp.peer_sigalgs;
2937 allowlen = s->s3->tmp.peer_sigalgslen;
Matt Caswell0f113f32015-01-22 03:40:55 +00002938 } else {
2939 allow = conf;
2940 allowlen = conflen;
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01002941 pref = s->s3->tmp.peer_sigalgs;
2942 preflen = s->s3->tmp.peer_sigalgslen;
Matt Caswell0f113f32015-01-22 03:40:55 +00002943 }
2944 nmatch = tls12_shared_sigalgs(s, NULL, pref, preflen, allow, allowlen);
Dr. Stephen Henson34e3edb2015-03-03 13:20:57 +00002945 if (nmatch) {
2946 salgs = OPENSSL_malloc(nmatch * sizeof(TLS_SIGALGS));
Matt Caswella71edf32015-10-30 10:05:53 +00002947 if (salgs == NULL)
Dr. Stephen Henson34e3edb2015-03-03 13:20:57 +00002948 return 0;
2949 nmatch = tls12_shared_sigalgs(s, salgs, pref, preflen, allow, allowlen);
2950 } else {
2951 salgs = NULL;
2952 }
Matt Caswell0f113f32015-01-22 03:40:55 +00002953 c->shared_sigalgs = salgs;
2954 c->shared_sigalgslen = nmatch;
2955 return 1;
2956}
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00002957
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002958/* Set preferred digest for each key type */
2959
Matt Caswelld736bc12016-10-04 21:22:19 +01002960int tls1_save_sigalgs(SSL *s, const unsigned char *data, size_t dsize)
Matt Caswell0f113f32015-01-22 03:40:55 +00002961{
2962 CERT *c = s->cert;
2963 /* Extension ignored for inappropriate versions */
2964 if (!SSL_USE_SIGALGS(s))
2965 return 1;
2966 /* Should never happen */
2967 if (!c)
2968 return 0;
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002969
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01002970 OPENSSL_free(s->s3->tmp.peer_sigalgs);
2971 s->s3->tmp.peer_sigalgs = OPENSSL_malloc(dsize);
2972 if (s->s3->tmp.peer_sigalgs == NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +00002973 return 0;
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01002974 s->s3->tmp.peer_sigalgslen = dsize;
2975 memcpy(s->s3->tmp.peer_sigalgs, data, dsize);
Matt Caswell0f113f32015-01-22 03:40:55 +00002976 return 1;
2977}
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00002978
Dr. Stephen Hensonc800c272014-10-09 20:37:27 +01002979int tls1_process_sigalgs(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00002980{
2981 int idx;
2982 size_t i;
2983 const EVP_MD *md;
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002984 const EVP_MD **pmd = s->s3->tmp.md;
Dr. Stephen Hensonf7d53482015-07-14 23:19:11 +01002985 uint32_t *pvalid = s->s3->tmp.valid_flags;
Matt Caswell0f113f32015-01-22 03:40:55 +00002986 CERT *c = s->cert;
2987 TLS_SIGALGS *sigptr;
2988 if (!tls1_set_shared_sigalgs(s))
2989 return 0;
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00002990
Matt Caswell0f113f32015-01-22 03:40:55 +00002991 for (i = 0, sigptr = c->shared_sigalgs;
2992 i < c->shared_sigalgslen; i++, sigptr++) {
2993 idx = tls12_get_pkey_idx(sigptr->rsign);
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002994 if (idx > 0 && pmd[idx] == NULL) {
Matt Caswell0f113f32015-01-22 03:40:55 +00002995 md = tls12_get_hash(sigptr->rhash);
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01002996 pmd[idx] = md;
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01002997 pvalid[idx] = CERT_PKEY_EXPLICIT_SIGN;
Matt Caswell0f113f32015-01-22 03:40:55 +00002998 if (idx == SSL_PKEY_RSA_SIGN) {
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01002999 pvalid[SSL_PKEY_RSA_ENC] = CERT_PKEY_EXPLICIT_SIGN;
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01003000 pmd[SSL_PKEY_RSA_ENC] = md;
Matt Caswell0f113f32015-01-22 03:40:55 +00003001 }
3002 }
Dr. Stephen Henson6b7be582011-05-06 13:00:07 +00003003
Matt Caswell0f113f32015-01-22 03:40:55 +00003004 }
3005 /*
3006 * In strict mode leave unset digests as NULL to indicate we can't use
3007 * the certificate for signing.
3008 */
3009 if (!(s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)) {
3010 /*
3011 * Set any remaining keys to default values. NOTE: if alg is not
3012 * supported it stays as NULL.
3013 */
Matt Caswelle481f9b2015-05-15 10:49:56 +01003014#ifndef OPENSSL_NO_DSA
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01003015 if (pmd[SSL_PKEY_DSA_SIGN] == NULL)
3016 pmd[SSL_PKEY_DSA_SIGN] = EVP_sha1();
Matt Caswelle481f9b2015-05-15 10:49:56 +01003017#endif
3018#ifndef OPENSSL_NO_RSA
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01003019 if (pmd[SSL_PKEY_RSA_SIGN] == NULL) {
3020 pmd[SSL_PKEY_RSA_SIGN] = EVP_sha1();
3021 pmd[SSL_PKEY_RSA_ENC] = EVP_sha1();
Matt Caswell0f113f32015-01-22 03:40:55 +00003022 }
Matt Caswelle481f9b2015-05-15 10:49:56 +01003023#endif
3024#ifndef OPENSSL_NO_EC
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01003025 if (pmd[SSL_PKEY_ECC] == NULL)
3026 pmd[SSL_PKEY_ECC] = EVP_sha1();
Matt Caswelle481f9b2015-05-15 10:49:56 +01003027#endif
Emilia Kaspera230b262016-08-05 19:03:17 +02003028#ifndef OPENSSL_NO_GOST
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00003029 if (pmd[SSL_PKEY_GOST01] == NULL)
3030 pmd[SSL_PKEY_GOST01] = EVP_get_digestbynid(NID_id_GostR3411_94);
3031 if (pmd[SSL_PKEY_GOST12_256] == NULL)
Emilia Kaspera230b262016-08-05 19:03:17 +02003032 pmd[SSL_PKEY_GOST12_256] =
3033 EVP_get_digestbynid(NID_id_GostR3411_2012_256);
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00003034 if (pmd[SSL_PKEY_GOST12_512] == NULL)
Emilia Kaspera230b262016-08-05 19:03:17 +02003035 pmd[SSL_PKEY_GOST12_512] =
3036 EVP_get_digestbynid(NID_id_GostR3411_2012_512);
3037#endif
Matt Caswell0f113f32015-01-22 03:40:55 +00003038 }
3039 return 1;
3040}
Dr. Stephen Henson48175042011-12-31 22:59:57 +00003041
Dr. Stephen Hensone7f8ff42012-03-06 14:28:21 +00003042int SSL_get_sigalgs(SSL *s, int idx,
Matt Caswell0f113f32015-01-22 03:40:55 +00003043 int *psign, int *phash, int *psignhash,
3044 unsigned char *rsig, unsigned char *rhash)
3045{
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01003046 const unsigned char *psig = s->s3->tmp.peer_sigalgs;
Matt Caswell348240c2016-10-19 15:11:24 +01003047 size_t numsigalgs = s->s3->tmp.peer_sigalgslen / 2;
3048 if (psig == NULL || numsigalgs > INT_MAX)
Matt Caswell0f113f32015-01-22 03:40:55 +00003049 return 0;
3050 if (idx >= 0) {
3051 idx <<= 1;
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01003052 if (idx >= (int)s->s3->tmp.peer_sigalgslen)
Matt Caswell0f113f32015-01-22 03:40:55 +00003053 return 0;
3054 psig += idx;
3055 if (rhash)
3056 *rhash = psig[0];
3057 if (rsig)
3058 *rsig = psig[1];
3059 tls1_lookup_sigalg(phash, psign, psignhash, psig);
3060 }
Matt Caswell348240c2016-10-19 15:11:24 +01003061 return (int)numsigalgs;
Matt Caswell0f113f32015-01-22 03:40:55 +00003062}
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00003063
3064int SSL_get_shared_sigalgs(SSL *s, int idx,
Matt Caswell0f113f32015-01-22 03:40:55 +00003065 int *psign, int *phash, int *psignhash,
3066 unsigned char *rsig, unsigned char *rhash)
3067{
3068 TLS_SIGALGS *shsigalgs = s->cert->shared_sigalgs;
Matt Caswell348240c2016-10-19 15:11:24 +01003069 if (!shsigalgs || idx >= (int)s->cert->shared_sigalgslen
3070 || s->cert->shared_sigalgslen > INT_MAX)
Matt Caswell0f113f32015-01-22 03:40:55 +00003071 return 0;
3072 shsigalgs += idx;
3073 if (phash)
3074 *phash = shsigalgs->hash_nid;
3075 if (psign)
3076 *psign = shsigalgs->sign_nid;
3077 if (psignhash)
3078 *psignhash = shsigalgs->signandhash_nid;
3079 if (rsig)
3080 *rsig = shsigalgs->rsign;
3081 if (rhash)
3082 *rhash = shsigalgs->rhash;
Matt Caswell348240c2016-10-19 15:11:24 +01003083 return (int)s->cert->shared_sigalgslen;
Matt Caswell0f113f32015-01-22 03:40:55 +00003084}
Dr. Stephen Hensone7f8ff42012-03-06 14:28:21 +00003085
Matt Caswelle481f9b2015-05-15 10:49:56 +01003086#define MAX_SIGALGLEN (TLSEXT_hash_num * TLSEXT_signature_num * 2)
Matt Caswell0f113f32015-01-22 03:40:55 +00003087
3088typedef struct {
3089 size_t sigalgcnt;
3090 int sigalgs[MAX_SIGALGLEN];
3091} sig_cb_st;
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003092
Dr. Stephen Henson431f4582015-07-23 14:57:42 +01003093static void get_sigorhash(int *psig, int *phash, const char *str)
3094{
3095 if (strcmp(str, "RSA") == 0) {
3096 *psig = EVP_PKEY_RSA;
3097 } else if (strcmp(str, "DSA") == 0) {
3098 *psig = EVP_PKEY_DSA;
3099 } else if (strcmp(str, "ECDSA") == 0) {
3100 *psig = EVP_PKEY_EC;
3101 } else {
3102 *phash = OBJ_sn2nid(str);
3103 if (*phash == NID_undef)
3104 *phash = OBJ_ln2nid(str);
3105 }
3106}
3107
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003108static int sig_cb(const char *elem, int len, void *arg)
Matt Caswell0f113f32015-01-22 03:40:55 +00003109{
3110 sig_cb_st *sarg = arg;
3111 size_t i;
3112 char etmp[20], *p;
Dr. Stephen Henson431f4582015-07-23 14:57:42 +01003113 int sig_alg = NID_undef, hash_alg = NID_undef;
Kurt Roeckx2747d732015-01-24 14:46:50 +01003114 if (elem == NULL)
3115 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00003116 if (sarg->sigalgcnt == MAX_SIGALGLEN)
3117 return 0;
3118 if (len > (int)(sizeof(etmp) - 1))
3119 return 0;
3120 memcpy(etmp, elem, len);
3121 etmp[len] = 0;
3122 p = strchr(etmp, '+');
3123 if (!p)
3124 return 0;
3125 *p = 0;
3126 p++;
3127 if (!*p)
3128 return 0;
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003129
Dr. Stephen Henson431f4582015-07-23 14:57:42 +01003130 get_sigorhash(&sig_alg, &hash_alg, etmp);
3131 get_sigorhash(&sig_alg, &hash_alg, p);
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003132
Dr. Stephen Henson431f4582015-07-23 14:57:42 +01003133 if (sig_alg == NID_undef || hash_alg == NID_undef)
Matt Caswell0f113f32015-01-22 03:40:55 +00003134 return 0;
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003135
Matt Caswell0f113f32015-01-22 03:40:55 +00003136 for (i = 0; i < sarg->sigalgcnt; i += 2) {
3137 if (sarg->sigalgs[i] == sig_alg && sarg->sigalgs[i + 1] == hash_alg)
3138 return 0;
3139 }
3140 sarg->sigalgs[sarg->sigalgcnt++] = hash_alg;
3141 sarg->sigalgs[sarg->sigalgcnt++] = sig_alg;
3142 return 1;
3143}
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003144
Matt Caswell0f113f32015-01-22 03:40:55 +00003145/*
FdaSilvaYY9d226662016-06-28 22:39:55 +02003146 * Set supported signature algorithms based on a colon separated list of the
Matt Caswell0f113f32015-01-22 03:40:55 +00003147 * form sig+hash e.g. RSA+SHA512:DSA+SHA512
3148 */
Dr. Stephen Henson3dbc46d2012-07-03 12:51:14 +00003149int tls1_set_sigalgs_list(CERT *c, const char *str, int client)
Matt Caswell0f113f32015-01-22 03:40:55 +00003150{
3151 sig_cb_st sig;
3152 sig.sigalgcnt = 0;
3153 if (!CONF_parse_list(str, ':', 1, sig_cb, &sig))
3154 return 0;
3155 if (c == NULL)
3156 return 1;
3157 return tls1_set_sigalgs(c, sig.sigalgs, sig.sigalgcnt, client);
3158}
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003159
Emilia Kaspera230b262016-08-05 19:03:17 +02003160int tls1_set_sigalgs(CERT *c, const int *psig_nids, size_t salglen, int client)
Matt Caswell0f113f32015-01-22 03:40:55 +00003161{
3162 unsigned char *sigalgs, *sptr;
3163 int rhash, rsign;
3164 size_t i;
3165 if (salglen & 1)
3166 return 0;
3167 sigalgs = OPENSSL_malloc(salglen);
3168 if (sigalgs == NULL)
3169 return 0;
3170 for (i = 0, sptr = sigalgs; i < salglen; i += 2) {
Dr. Stephen Hensonb6eb9822015-05-02 18:30:00 +01003171 rhash = tls12_find_id(*psig_nids++, tls12_md, OSSL_NELEM(tls12_md));
3172 rsign = tls12_find_id(*psig_nids++, tls12_sig, OSSL_NELEM(tls12_sig));
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003173
Matt Caswell0f113f32015-01-22 03:40:55 +00003174 if (rhash == -1 || rsign == -1)
3175 goto err;
3176 *sptr++ = rhash;
3177 *sptr++ = rsign;
3178 }
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003179
Matt Caswell0f113f32015-01-22 03:40:55 +00003180 if (client) {
Rich Salzb548a1f2015-05-01 10:02:07 -04003181 OPENSSL_free(c->client_sigalgs);
Matt Caswell0f113f32015-01-22 03:40:55 +00003182 c->client_sigalgs = sigalgs;
3183 c->client_sigalgslen = salglen;
3184 } else {
Rich Salzb548a1f2015-05-01 10:02:07 -04003185 OPENSSL_free(c->conf_sigalgs);
Matt Caswell0f113f32015-01-22 03:40:55 +00003186 c->conf_sigalgs = sigalgs;
3187 c->conf_sigalgslen = salglen;
3188 }
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003189
Matt Caswell0f113f32015-01-22 03:40:55 +00003190 return 1;
Dr. Stephen Henson0f229cc2012-06-22 14:03:31 +00003191
Matt Caswell0f113f32015-01-22 03:40:55 +00003192 err:
3193 OPENSSL_free(sigalgs);
3194 return 0;
3195}
Dr. Stephen Henson4453cd82012-06-25 14:32:30 +00003196
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003197static int tls1_check_sig_alg(CERT *c, X509 *x, int default_nid)
Matt Caswell0f113f32015-01-22 03:40:55 +00003198{
3199 int sig_nid;
3200 size_t i;
3201 if (default_nid == -1)
3202 return 1;
3203 sig_nid = X509_get_signature_nid(x);
3204 if (default_nid)
3205 return sig_nid == default_nid ? 1 : 0;
3206 for (i = 0; i < c->shared_sigalgslen; i++)
3207 if (sig_nid == c->shared_sigalgs[i].signandhash_nid)
3208 return 1;
3209 return 0;
3210}
3211
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003212/* Check to see if a certificate issuer name matches list of CA names */
3213static int ssl_check_ca_name(STACK_OF(X509_NAME) *names, X509 *x)
Matt Caswell0f113f32015-01-22 03:40:55 +00003214{
3215 X509_NAME *nm;
3216 int i;
3217 nm = X509_get_issuer_name(x);
3218 for (i = 0; i < sk_X509_NAME_num(names); i++) {
3219 if (!X509_NAME_cmp(nm, sk_X509_NAME_value(names, i)))
3220 return 1;
3221 }
3222 return 0;
3223}
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003224
Matt Caswell0f113f32015-01-22 03:40:55 +00003225/*
3226 * Check certificate chain is consistent with TLS extensions and is usable by
3227 * server. This servers two purposes: it allows users to check chains before
3228 * passing them to the server and it allows the server to check chains before
3229 * attempting to use them.
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003230 */
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003231
3232/* Flags which need to be set for a certificate when stict mode not set */
3233
Matt Caswelle481f9b2015-05-15 10:49:56 +01003234#define CERT_PKEY_VALID_FLAGS \
Matt Caswell0f113f32015-01-22 03:40:55 +00003235 (CERT_PKEY_EE_SIGNATURE|CERT_PKEY_EE_PARAM)
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003236/* Strict mode flags */
Matt Caswelle481f9b2015-05-15 10:49:56 +01003237#define CERT_PKEY_STRICT_FLAGS \
Matt Caswell0f113f32015-01-22 03:40:55 +00003238 (CERT_PKEY_VALID_FLAGS|CERT_PKEY_CA_SIGNATURE|CERT_PKEY_CA_PARAM \
3239 | CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE)
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003240
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003241int tls1_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain,
Matt Caswell0f113f32015-01-22 03:40:55 +00003242 int idx)
3243{
3244 int i;
3245 int rv = 0;
3246 int check_flags = 0, strict_mode;
3247 CERT_PKEY *cpk = NULL;
3248 CERT *c = s->cert;
Dr. Stephen Hensonf7d53482015-07-14 23:19:11 +01003249 uint32_t *pvalid;
Matt Caswell0f113f32015-01-22 03:40:55 +00003250 unsigned int suiteb_flags = tls1_suiteb(s);
3251 /* idx == -1 means checking server chains */
3252 if (idx != -1) {
3253 /* idx == -2 means checking client certificate chains */
3254 if (idx == -2) {
3255 cpk = c->key;
Matt Caswell348240c2016-10-19 15:11:24 +01003256 idx = (int)(cpk - c->pkeys);
Matt Caswell0f113f32015-01-22 03:40:55 +00003257 } else
3258 cpk = c->pkeys + idx;
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01003259 pvalid = s->s3->tmp.valid_flags + idx;
Matt Caswell0f113f32015-01-22 03:40:55 +00003260 x = cpk->x509;
3261 pk = cpk->privatekey;
3262 chain = cpk->chain;
3263 strict_mode = c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT;
3264 /* If no cert or key, forget it */
3265 if (!x || !pk)
3266 goto end;
Matt Caswell0f113f32015-01-22 03:40:55 +00003267 } else {
3268 if (!x || !pk)
Matt Caswelld813f9e2015-03-11 17:01:38 +00003269 return 0;
Matt Caswell0f113f32015-01-22 03:40:55 +00003270 idx = ssl_cert_type(x, pk);
3271 if (idx == -1)
Matt Caswelld813f9e2015-03-11 17:01:38 +00003272 return 0;
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01003273 pvalid = s->s3->tmp.valid_flags + idx;
3274
Matt Caswell0f113f32015-01-22 03:40:55 +00003275 if (c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)
3276 check_flags = CERT_PKEY_STRICT_FLAGS;
3277 else
3278 check_flags = CERT_PKEY_VALID_FLAGS;
3279 strict_mode = 1;
3280 }
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003281
Matt Caswell0f113f32015-01-22 03:40:55 +00003282 if (suiteb_flags) {
3283 int ok;
3284 if (check_flags)
3285 check_flags |= CERT_PKEY_SUITEB;
3286 ok = X509_chain_check_suiteb(NULL, x, chain, suiteb_flags);
3287 if (ok == X509_V_OK)
3288 rv |= CERT_PKEY_SUITEB;
3289 else if (!check_flags)
3290 goto end;
3291 }
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003292
Matt Caswell0f113f32015-01-22 03:40:55 +00003293 /*
3294 * Check all signature algorithms are consistent with signature
3295 * algorithms extension if TLS 1.2 or later and strict mode.
3296 */
3297 if (TLS1_get_version(s) >= TLS1_2_VERSION && strict_mode) {
3298 int default_nid;
3299 unsigned char rsign = 0;
Dr. Stephen Henson76106e62015-05-12 17:17:37 +01003300 if (s->s3->tmp.peer_sigalgs)
Matt Caswell0f113f32015-01-22 03:40:55 +00003301 default_nid = 0;
3302 /* If no sigalgs extension use defaults from RFC5246 */
3303 else {
3304 switch (idx) {
3305 case SSL_PKEY_RSA_ENC:
3306 case SSL_PKEY_RSA_SIGN:
Matt Caswell0f113f32015-01-22 03:40:55 +00003307 rsign = TLSEXT_signature_rsa;
3308 default_nid = NID_sha1WithRSAEncryption;
3309 break;
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003310
Matt Caswell0f113f32015-01-22 03:40:55 +00003311 case SSL_PKEY_DSA_SIGN:
Matt Caswell0f113f32015-01-22 03:40:55 +00003312 rsign = TLSEXT_signature_dsa;
3313 default_nid = NID_dsaWithSHA1;
3314 break;
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003315
Matt Caswell0f113f32015-01-22 03:40:55 +00003316 case SSL_PKEY_ECC:
3317 rsign = TLSEXT_signature_ecdsa;
3318 default_nid = NID_ecdsa_with_SHA1;
3319 break;
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003320
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00003321 case SSL_PKEY_GOST01:
3322 rsign = TLSEXT_signature_gostr34102001;
3323 default_nid = NID_id_GostR3411_94_with_GostR3410_2001;
3324 break;
3325
3326 case SSL_PKEY_GOST12_256:
3327 rsign = TLSEXT_signature_gostr34102012_256;
3328 default_nid = NID_id_tc26_signwithdigest_gost3410_2012_256;
3329 break;
3330
3331 case SSL_PKEY_GOST12_512:
3332 rsign = TLSEXT_signature_gostr34102012_512;
3333 default_nid = NID_id_tc26_signwithdigest_gost3410_2012_512;
3334 break;
3335
Matt Caswell0f113f32015-01-22 03:40:55 +00003336 default:
3337 default_nid = -1;
3338 break;
3339 }
3340 }
3341 /*
3342 * If peer sent no signature algorithms extension and we have set
3343 * preferred signature algorithms check we support sha1.
3344 */
3345 if (default_nid > 0 && c->conf_sigalgs) {
3346 size_t j;
3347 const unsigned char *p = c->conf_sigalgs;
3348 for (j = 0; j < c->conf_sigalgslen; j += 2, p += 2) {
3349 if (p[0] == TLSEXT_hash_sha1 && p[1] == rsign)
3350 break;
3351 }
3352 if (j == c->conf_sigalgslen) {
3353 if (check_flags)
3354 goto skip_sigs;
3355 else
3356 goto end;
3357 }
3358 }
3359 /* Check signature algorithm of each cert in chain */
3360 if (!tls1_check_sig_alg(c, x, default_nid)) {
3361 if (!check_flags)
3362 goto end;
3363 } else
3364 rv |= CERT_PKEY_EE_SIGNATURE;
3365 rv |= CERT_PKEY_CA_SIGNATURE;
3366 for (i = 0; i < sk_X509_num(chain); i++) {
3367 if (!tls1_check_sig_alg(c, sk_X509_value(chain, i), default_nid)) {
3368 if (check_flags) {
3369 rv &= ~CERT_PKEY_CA_SIGNATURE;
3370 break;
3371 } else
3372 goto end;
3373 }
3374 }
3375 }
3376 /* Else not TLS 1.2, so mark EE and CA signing algorithms OK */
3377 else if (check_flags)
3378 rv |= CERT_PKEY_EE_SIGNATURE | CERT_PKEY_CA_SIGNATURE;
3379 skip_sigs:
3380 /* Check cert parameters are consistent */
3381 if (tls1_check_cert_param(s, x, check_flags ? 1 : 2))
3382 rv |= CERT_PKEY_EE_PARAM;
3383 else if (!check_flags)
3384 goto end;
3385 if (!s->server)
3386 rv |= CERT_PKEY_CA_PARAM;
3387 /* In strict mode check rest of chain too */
3388 else if (strict_mode) {
3389 rv |= CERT_PKEY_CA_PARAM;
3390 for (i = 0; i < sk_X509_num(chain); i++) {
3391 X509 *ca = sk_X509_value(chain, i);
3392 if (!tls1_check_cert_param(s, ca, 0)) {
3393 if (check_flags) {
3394 rv &= ~CERT_PKEY_CA_PARAM;
3395 break;
3396 } else
3397 goto end;
3398 }
3399 }
3400 }
3401 if (!s->server && strict_mode) {
3402 STACK_OF(X509_NAME) *ca_dn;
3403 int check_type = 0;
Dr. Stephen Henson3aeb9342016-01-19 00:21:12 +00003404 switch (EVP_PKEY_id(pk)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00003405 case EVP_PKEY_RSA:
3406 check_type = TLS_CT_RSA_SIGN;
3407 break;
3408 case EVP_PKEY_DSA:
3409 check_type = TLS_CT_DSS_SIGN;
3410 break;
3411 case EVP_PKEY_EC:
3412 check_type = TLS_CT_ECDSA_SIGN;
3413 break;
Matt Caswell0f113f32015-01-22 03:40:55 +00003414 }
3415 if (check_type) {
3416 const unsigned char *ctypes;
3417 int ctypelen;
3418 if (c->ctypes) {
3419 ctypes = c->ctypes;
3420 ctypelen = (int)c->ctype_num;
3421 } else {
3422 ctypes = (unsigned char *)s->s3->tmp.ctype;
3423 ctypelen = s->s3->tmp.ctype_num;
3424 }
3425 for (i = 0; i < ctypelen; i++) {
3426 if (ctypes[i] == check_type) {
3427 rv |= CERT_PKEY_CERT_TYPE;
3428 break;
3429 }
3430 }
3431 if (!(rv & CERT_PKEY_CERT_TYPE) && !check_flags)
3432 goto end;
3433 } else
3434 rv |= CERT_PKEY_CERT_TYPE;
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003435
Matt Caswell0f113f32015-01-22 03:40:55 +00003436 ca_dn = s->s3->tmp.ca_names;
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003437
Matt Caswell0f113f32015-01-22 03:40:55 +00003438 if (!sk_X509_NAME_num(ca_dn))
3439 rv |= CERT_PKEY_ISSUER_NAME;
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003440
Matt Caswell0f113f32015-01-22 03:40:55 +00003441 if (!(rv & CERT_PKEY_ISSUER_NAME)) {
3442 if (ssl_check_ca_name(ca_dn, x))
3443 rv |= CERT_PKEY_ISSUER_NAME;
3444 }
3445 if (!(rv & CERT_PKEY_ISSUER_NAME)) {
3446 for (i = 0; i < sk_X509_num(chain); i++) {
3447 X509 *xtmp = sk_X509_value(chain, i);
3448 if (ssl_check_ca_name(ca_dn, xtmp)) {
3449 rv |= CERT_PKEY_ISSUER_NAME;
3450 break;
3451 }
3452 }
3453 }
3454 if (!check_flags && !(rv & CERT_PKEY_ISSUER_NAME))
3455 goto end;
3456 } else
3457 rv |= CERT_PKEY_ISSUER_NAME | CERT_PKEY_CERT_TYPE;
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003458
Matt Caswell0f113f32015-01-22 03:40:55 +00003459 if (!check_flags || (rv & check_flags) == check_flags)
3460 rv |= CERT_PKEY_VALID;
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003461
Matt Caswell0f113f32015-01-22 03:40:55 +00003462 end:
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003463
Matt Caswell0f113f32015-01-22 03:40:55 +00003464 if (TLS1_get_version(s) >= TLS1_2_VERSION) {
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01003465 if (*pvalid & CERT_PKEY_EXPLICIT_SIGN)
Matt Caswell0f113f32015-01-22 03:40:55 +00003466 rv |= CERT_PKEY_EXPLICIT_SIGN | CERT_PKEY_SIGN;
Dr. Stephen Hensond376e572015-05-12 18:56:39 +01003467 else if (s->s3->tmp.md[idx] != NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +00003468 rv |= CERT_PKEY_SIGN;
3469 } else
3470 rv |= CERT_PKEY_SIGN | CERT_PKEY_EXPLICIT_SIGN;
Dr. Stephen Henson6dbb6212012-07-27 13:39:23 +00003471
Matt Caswell0f113f32015-01-22 03:40:55 +00003472 /*
3473 * When checking a CERT_PKEY structure all flags are irrelevant if the
3474 * chain is invalid.
3475 */
3476 if (!check_flags) {
3477 if (rv & CERT_PKEY_VALID)
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01003478 *pvalid = rv;
Matt Caswell0f113f32015-01-22 03:40:55 +00003479 else {
3480 /* Preserve explicit sign flag, clear rest */
Dr. Stephen Henson6383d312015-05-12 22:17:34 +01003481 *pvalid &= CERT_PKEY_EXPLICIT_SIGN;
Matt Caswell0f113f32015-01-22 03:40:55 +00003482 return 0;
3483 }
3484 }
3485 return rv;
3486}
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003487
3488/* Set validity of certificates in an SSL structure */
3489void tls1_set_cert_validity(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00003490{
Matt Caswell17dd65e2015-03-24 15:10:15 +00003491 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_ENC);
3492 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_SIGN);
3493 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DSA_SIGN);
Matt Caswell17dd65e2015-03-24 15:10:15 +00003494 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ECC);
Dmitry Belyavskye44380a2015-11-17 15:32:30 +00003495 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST01);
3496 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST12_256);
3497 tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST12_512);
Matt Caswell0f113f32015-01-22 03:40:55 +00003498}
3499
Dr. Stephen Henson18d71582012-06-29 14:24:42 +00003500/* User level utiity function to check a chain is suitable */
3501int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain)
Matt Caswell0f113f32015-01-22 03:40:55 +00003502{
3503 return tls1_check_chain(s, x, pk, chain, -1);
3504}
Dr. Stephen Hensond61ff832012-06-28 12:45:49 +00003505
Dr. Stephen Henson09599b52014-01-22 16:22:48 +00003506#ifndef OPENSSL_NO_DH
3507DH *ssl_get_auto_dh(SSL *s)
Matt Caswell0f113f32015-01-22 03:40:55 +00003508{
3509 int dh_secbits = 80;
3510 if (s->cert->dh_tmp_auto == 2)
3511 return DH_get_1024_160();
Dr. Stephen Hensonadc55062015-06-28 17:01:52 +01003512 if (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aPSK)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00003513 if (s->s3->tmp.new_cipher->strength_bits == 256)
3514 dh_secbits = 128;
3515 else
3516 dh_secbits = 80;
3517 } else {
3518 CERT_PKEY *cpk = ssl_get_server_send_pkey(s);
3519 dh_secbits = EVP_PKEY_security_bits(cpk->privatekey);
3520 }
Dr. Stephen Henson09599b52014-01-22 16:22:48 +00003521
Matt Caswell0f113f32015-01-22 03:40:55 +00003522 if (dh_secbits >= 128) {
3523 DH *dhp = DH_new();
Matt Caswell0aeddcf2016-04-06 17:49:48 +01003524 BIGNUM *p, *g;
Matt Caswella71edf32015-10-30 10:05:53 +00003525 if (dhp == NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +00003526 return NULL;
Matt Caswell0aeddcf2016-04-06 17:49:48 +01003527 g = BN_new();
3528 if (g != NULL)
3529 BN_set_word(g, 2);
Matt Caswell0f113f32015-01-22 03:40:55 +00003530 if (dh_secbits >= 192)
Rich Salz9021a5d2016-04-18 07:43:54 -04003531 p = BN_get_rfc3526_prime_8192(NULL);
Matt Caswell0f113f32015-01-22 03:40:55 +00003532 else
Rich Salz9021a5d2016-04-18 07:43:54 -04003533 p = BN_get_rfc3526_prime_3072(NULL);
Matt Caswell0aeddcf2016-04-06 17:49:48 +01003534 if (p == NULL || g == NULL || !DH_set0_pqg(dhp, p, NULL, g)) {
Matt Caswell0f113f32015-01-22 03:40:55 +00003535 DH_free(dhp);
Matt Caswell0aeddcf2016-04-06 17:49:48 +01003536 BN_free(p);
3537 BN_free(g);
Matt Caswell0f113f32015-01-22 03:40:55 +00003538 return NULL;
3539 }
3540 return dhp;
3541 }
3542 if (dh_secbits >= 112)
3543 return DH_get_2048_224();
3544 return DH_get_1024_160();
3545}
Dr. Stephen Henson09599b52014-01-22 16:22:48 +00003546#endif
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003547
3548static int ssl_security_cert_key(SSL *s, SSL_CTX *ctx, X509 *x, int op)
Matt Caswell0f113f32015-01-22 03:40:55 +00003549{
Dr. Stephen Henson72245f32015-12-30 13:34:53 +00003550 int secbits = -1;
Dr. Stephen Henson8382fd32015-12-20 00:32:36 +00003551 EVP_PKEY *pkey = X509_get0_pubkey(x);
Matt Caswell0f113f32015-01-22 03:40:55 +00003552 if (pkey) {
Dr. Stephen Henson72245f32015-12-30 13:34:53 +00003553 /*
3554 * If no parameters this will return -1 and fail using the default
3555 * security callback for any non-zero security level. This will
3556 * reject keys which omit parameters but this only affects DSA and
3557 * omission of parameters is never (?) done in practice.
3558 */
Matt Caswell0f113f32015-01-22 03:40:55 +00003559 secbits = EVP_PKEY_security_bits(pkey);
Dr. Stephen Henson72245f32015-12-30 13:34:53 +00003560 }
Matt Caswell0f113f32015-01-22 03:40:55 +00003561 if (s)
3562 return ssl_security(s, op, secbits, 0, x);
3563 else
3564 return ssl_ctx_security(ctx, op, secbits, 0, x);
3565}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003566
3567static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
Matt Caswell0f113f32015-01-22 03:40:55 +00003568{
3569 /* Lookup signature algorithm digest */
3570 int secbits = -1, md_nid = NID_undef, sig_nid;
Dr. Stephen Henson221c7b52016-02-11 15:25:11 +00003571 /* Don't check signature if self signed */
3572 if ((X509_get_extension_flags(x) & EXFLAG_SS) != 0)
3573 return 1;
Matt Caswell0f113f32015-01-22 03:40:55 +00003574 sig_nid = X509_get_signature_nid(x);
3575 if (sig_nid && OBJ_find_sigid_algs(sig_nid, &md_nid, NULL)) {
3576 const EVP_MD *md;
3577 if (md_nid && (md = EVP_get_digestbynid(md_nid)))
3578 secbits = EVP_MD_size(md) * 4;
3579 }
3580 if (s)
3581 return ssl_security(s, op, secbits, md_nid, x);
3582 else
3583 return ssl_ctx_security(ctx, op, secbits, md_nid, x);
3584}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003585
3586int ssl_security_cert(SSL *s, SSL_CTX *ctx, X509 *x, int vfy, int is_ee)
Matt Caswell0f113f32015-01-22 03:40:55 +00003587{
3588 if (vfy)
3589 vfy = SSL_SECOP_PEER;
3590 if (is_ee) {
3591 if (!ssl_security_cert_key(s, ctx, x, SSL_SECOP_EE_KEY | vfy))
3592 return SSL_R_EE_KEY_TOO_SMALL;
3593 } else {
3594 if (!ssl_security_cert_key(s, ctx, x, SSL_SECOP_CA_KEY | vfy))
3595 return SSL_R_CA_KEY_TOO_SMALL;
3596 }
3597 if (!ssl_security_cert_sig(s, ctx, x, SSL_SECOP_CA_MD | vfy))
3598 return SSL_R_CA_MD_TOO_WEAK;
3599 return 1;
3600}
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003601
Matt Caswell0f113f32015-01-22 03:40:55 +00003602/*
3603 * Check security of a chain, if sk includes the end entity certificate then
3604 * x is NULL. If vfy is 1 then we are verifying a peer chain and not sending
3605 * one to the peer. Return values: 1 if ok otherwise error code to use
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003606 */
3607
3608int ssl_security_cert_chain(SSL *s, STACK_OF(X509) *sk, X509 *x, int vfy)
Matt Caswell0f113f32015-01-22 03:40:55 +00003609{
3610 int rv, start_idx, i;
3611 if (x == NULL) {
3612 x = sk_X509_value(sk, 0);
3613 start_idx = 1;
3614 } else
3615 start_idx = 0;
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003616
Matt Caswell0f113f32015-01-22 03:40:55 +00003617 rv = ssl_security_cert(s, NULL, x, vfy, 1);
3618 if (rv != 1)
3619 return rv;
Dr. Stephen Hensonb362cca2013-12-15 13:32:24 +00003620
Matt Caswell0f113f32015-01-22 03:40:55 +00003621 for (i = start_idx; i < sk_X509_num(sk); i++) {
3622 x = sk_X509_value(sk, i);
3623 rv = ssl_security_cert(s, NULL, x, vfy, 0);
3624 if (rv != 1)
3625 return rv;
3626 }
3627 return 1;
3628}