blob: 164c7b3cec171f23e0c62b0408bf366e1516de4f [file] [log] [blame]
Gilles Peskine0d980b82021-01-05 23:34:27 +01001/*
2 * Common source code for SSL test programs. This file is included by
3 * both ssl_client2.c and ssl_server2.c and is intended for source
4 * code that is textually identical in both programs, but that cannot be
5 * compiled separately because it refers to types or macros that are
6 * different in the two programs, or because it would have an incomplete
7 * type.
8 *
9 * This file is meant to be #include'd and cannot be compiled separately.
10 *
11 * Copyright The Mbed TLS Contributors
12 * SPDX-License-Identifier: Apache-2.0
13 *
14 * Licensed under the Apache License, Version 2.0 (the "License"); you may
15 * not use this file except in compliance with the License.
16 * You may obtain a copy of the License at
17 *
18 * http://www.apache.org/licenses/LICENSE-2.0
19 *
20 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
22 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 * See the License for the specific language governing permissions and
24 * limitations under the License.
25 */
Gilles Peskine504c1a32021-01-05 23:40:14 +010026
27#if defined(MBEDTLS_SSL_EXPORT_KEYS)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020028void eap_tls_key_derivation(void *p_expkey,
29 mbedtls_ssl_key_export_type secret_type,
30 const unsigned char *secret,
31 size_t secret_len,
32 const unsigned char client_random[32],
33 const unsigned char server_random[32],
34 mbedtls_tls_prf_types tls_prf_type)
Gilles Peskine504c1a32021-01-05 23:40:14 +010035{
36 eap_tls_keys *keys = (eap_tls_keys *)p_expkey;
37
Hanno Beckerc4c38ca2021-05-24 10:57:07 +010038 /* We're only interested in the TLS 1.2 master secret */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020039 if (secret_type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET)
Hanno Becker296fefe2021-06-21 09:32:27 +010040 return;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020041 if (secret_len != sizeof(keys->master_secret))
Hanno Becker296fefe2021-06-21 09:32:27 +010042 return;
Hanno Beckerc4c38ca2021-05-24 10:57:07 +010043
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020044 memcpy(keys->master_secret, secret, sizeof(keys->master_secret));
45 memcpy(keys->randbytes, client_random, 32);
46 memcpy(keys->randbytes + 32, server_random, 32);
Gilles Peskine504c1a32021-01-05 23:40:14 +010047 keys->tls_prf_type = tls_prf_type;
Gilles Peskine504c1a32021-01-05 23:40:14 +010048}
49
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020050void nss_keylog_export(void *p_expkey,
51 mbedtls_ssl_key_export_type secret_type,
52 const unsigned char *secret,
53 size_t secret_len,
54 const unsigned char client_random[32],
55 const unsigned char server_random[32],
56 mbedtls_tls_prf_types tls_prf_type)
Gilles Peskine504c1a32021-01-05 23:40:14 +010057{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020058 char nss_keylog_line[200];
Gilles Peskine504c1a32021-01-05 23:40:14 +010059 size_t const client_random_len = 32;
Gilles Peskine504c1a32021-01-05 23:40:14 +010060 size_t len = 0;
61 size_t j;
Gilles Peskine504c1a32021-01-05 23:40:14 +010062
Hanno Beckerc4c38ca2021-05-24 10:57:07 +010063 /* We're only interested in the TLS 1.2 master secret */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020064 if (secret_type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET)
Hanno Becker296fefe2021-06-21 09:32:27 +010065 return;
Hanno Beckerc4c38ca2021-05-24 10:57:07 +010066
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020067 ((void)p_expkey);
68 ((void)server_random);
69 ((void)tls_prf_type);
Gilles Peskine504c1a32021-01-05 23:40:14 +010070
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020071 len += sprintf(nss_keylog_line + len, "%s", "CLIENT_RANDOM ");
Gilles Peskine504c1a32021-01-05 23:40:14 +010072
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020073 for (j = 0; j < client_random_len; j++) {
74 len += sprintf(nss_keylog_line + len, "%02x", client_random[j]);
Gilles Peskine504c1a32021-01-05 23:40:14 +010075 }
76
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020077 len += sprintf(nss_keylog_line + len, " ");
Gilles Peskine504c1a32021-01-05 23:40:14 +010078
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020079 for (j = 0; j < secret_len; j++) {
80 len += sprintf(nss_keylog_line + len, "%02x", secret[j]);
Gilles Peskine504c1a32021-01-05 23:40:14 +010081 }
82
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020083 len += sprintf(nss_keylog_line + len, "\n");
84 nss_keylog_line[len] = '\0';
Gilles Peskine504c1a32021-01-05 23:40:14 +010085
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020086 mbedtls_printf("\n");
87 mbedtls_printf("---------------- NSS KEYLOG -----------------\n");
88 mbedtls_printf("%s", nss_keylog_line);
89 mbedtls_printf("---------------------------------------------\n");
Gilles Peskine504c1a32021-01-05 23:40:14 +010090
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020091 if (opt.nss_keylog_file != NULL) {
Gilles Peskine504c1a32021-01-05 23:40:14 +010092 FILE *f;
93
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020094 if ((f = fopen(opt.nss_keylog_file, "a")) == NULL) {
Gilles Peskine504c1a32021-01-05 23:40:14 +010095 goto exit;
96 }
97
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020098 if (fwrite(nss_keylog_line, 1, len, f) != len) {
99 fclose(f);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100100 goto exit;
101 }
102
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200103 fclose(f);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100104 }
105
106exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200107 mbedtls_platform_zeroize(nss_keylog_line, sizeof(nss_keylog_line));
Gilles Peskine504c1a32021-01-05 23:40:14 +0100108}
109
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200110# if defined(MBEDTLS_SSL_DTLS_SRTP)
111void dtls_srtp_key_derivation(void *p_expkey,
112 mbedtls_ssl_key_export_type secret_type,
113 const unsigned char *secret,
114 size_t secret_len,
115 const unsigned char client_random[32],
116 const unsigned char server_random[32],
117 mbedtls_tls_prf_types tls_prf_type)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100118{
119 dtls_srtp_keys *keys = (dtls_srtp_keys *)p_expkey;
120
Hanno Beckerc4c38ca2021-05-24 10:57:07 +0100121 /* We're only interested in the TLS 1.2 master secret */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200122 if (secret_type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET)
Hanno Becker296fefe2021-06-21 09:32:27 +0100123 return;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200124 if (secret_len != sizeof(keys->master_secret))
Hanno Becker296fefe2021-06-21 09:32:27 +0100125 return;
Hanno Beckerc4c38ca2021-05-24 10:57:07 +0100126
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200127 memcpy(keys->master_secret, secret, sizeof(keys->master_secret));
128 memcpy(keys->randbytes, client_random, 32);
129 memcpy(keys->randbytes + 32, server_random, 32);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100130 keys->tls_prf_type = tls_prf_type;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100131}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200132# endif /* MBEDTLS_SSL_DTLS_SRTP */
Gilles Peskine504c1a32021-01-05 23:40:14 +0100133
134#endif /* MBEDTLS_SSL_EXPORT_KEYS */
135
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200136int ssl_check_record(mbedtls_ssl_context const *ssl,
137 unsigned char const *buf,
138 size_t len)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100139{
Manuel Pégourié-Gonnarde5306f62021-07-07 10:48:26 +0200140 int my_ret = 0, ret_cr1, ret_cr2;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100141 unsigned char *tmp_buf;
142
143 /* Record checking may modify the input buffer,
144 * so make a copy. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200145 tmp_buf = mbedtls_calloc(1, len);
146 if (tmp_buf == NULL)
147 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
148 memcpy(tmp_buf, buf, len);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100149
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200150 ret_cr1 = mbedtls_ssl_check_record(ssl, tmp_buf, len);
151 if (ret_cr1 != MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE) {
Gilles Peskine504c1a32021-01-05 23:40:14 +0100152 /* Test-only: Make sure that mbedtls_ssl_check_record()
153 * doesn't alter state. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200154 memcpy(tmp_buf, buf, len); /* Restore buffer */
155 ret_cr2 = mbedtls_ssl_check_record(ssl, tmp_buf, len);
156 if (ret_cr2 != ret_cr1) {
157 mbedtls_printf(
158 "mbedtls_ssl_check_record() returned inconsistent results.\n");
Manuel Pégourié-Gonnarde5306f62021-07-07 10:48:26 +0200159 my_ret = -1;
Manuel Pégourié-Gonnard69c10a42021-07-06 12:05:23 +0200160 goto cleanup;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100161 }
162
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200163 switch (ret_cr1) {
Gilles Peskine504c1a32021-01-05 23:40:14 +0100164 case 0:
165 break;
166
167 case MBEDTLS_ERR_SSL_INVALID_RECORD:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200168 if (opt.debug_level > 1)
169 mbedtls_printf(
170 "mbedtls_ssl_check_record() detected invalid record.\n");
Gilles Peskine504c1a32021-01-05 23:40:14 +0100171 break;
172
173 case MBEDTLS_ERR_SSL_INVALID_MAC:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200174 if (opt.debug_level > 1)
175 mbedtls_printf(
176 "mbedtls_ssl_check_record() detected unauthentic record.\n");
Gilles Peskine504c1a32021-01-05 23:40:14 +0100177 break;
178
179 case MBEDTLS_ERR_SSL_UNEXPECTED_RECORD:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200180 if (opt.debug_level > 1)
181 mbedtls_printf(
182 "mbedtls_ssl_check_record() detected unexpected record.\n");
Gilles Peskine504c1a32021-01-05 23:40:14 +0100183 break;
184
185 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200186 mbedtls_printf(
187 "mbedtls_ssl_check_record() failed fatally with -%#04x.\n",
188 (unsigned int)-ret_cr1);
Manuel Pégourié-Gonnarde5306f62021-07-07 10:48:26 +0200189 my_ret = -1;
Manuel Pégourié-Gonnard69c10a42021-07-06 12:05:23 +0200190 goto cleanup;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100191 }
192
193 /* Regardless of the outcome, forward the record to the stack. */
194 }
195
Manuel Pégourié-Gonnard69c10a42021-07-06 12:05:23 +0200196cleanup:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200197 mbedtls_free(tmp_buf);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100198
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200199 return my_ret;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100200}
Gilles Peskine504c1a32021-01-05 23:40:14 +0100201
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200202int recv_cb(void *ctx, unsigned char *buf, size_t len)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100203{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200204 io_ctx_t *io_ctx = (io_ctx_t *)ctx;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100205 size_t recv_len;
206 int ret;
207
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200208 if (opt.nbio == 2)
209 ret = delayed_recv(io_ctx->net, buf, len);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100210 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200211 ret = mbedtls_net_recv(io_ctx->net, buf, len);
212 if (ret < 0)
213 return ret;
214 recv_len = (size_t)ret;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100215
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200216 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Gilles Peskine504c1a32021-01-05 23:40:14 +0100217 /* Here's the place to do any datagram/record checking
218 * in between receiving the packet from the underlying
219 * transport and passing it on to the TLS stack. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200220 if (ssl_check_record(io_ctx->ssl, buf, recv_len) != 0)
221 return -1;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100222 }
223
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200224 return (int)recv_len;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100225}
226
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200227int recv_timeout_cb(void *ctx, unsigned char *buf, size_t len, uint32_t timeout)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100228{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200229 io_ctx_t *io_ctx = (io_ctx_t *)ctx;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100230 int ret;
231 size_t recv_len;
232
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200233 ret = mbedtls_net_recv_timeout(io_ctx->net, buf, len, timeout);
234 if (ret < 0)
235 return ret;
236 recv_len = (size_t)ret;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100237
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200238 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Gilles Peskine504c1a32021-01-05 23:40:14 +0100239 /* Here's the place to do any datagram/record checking
240 * in between receiving the packet from the underlying
241 * transport and passing it on to the TLS stack. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200242 if (ssl_check_record(io_ctx->ssl, buf, recv_len) != 0)
243 return -1;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100244 }
245
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200246 return (int)recv_len;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100247}
248
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200249int send_cb(void *ctx, unsigned char const *buf, size_t len)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100250{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200251 io_ctx_t *io_ctx = (io_ctx_t *)ctx;
Gilles Peskine504c1a32021-01-05 23:40:14 +0100252
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200253 if (opt.nbio == 2)
254 return delayed_send(io_ctx->net, buf, len);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100255
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200256 return mbedtls_net_send(io_ctx->net, buf, len);
Gilles Peskine504c1a32021-01-05 23:40:14 +0100257}
258
259#if defined(MBEDTLS_X509_CRT_PARSE_C)
260int ssl_sig_hashes_for_test[] = {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200261# if defined(MBEDTLS_SHA512_C)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100262 MBEDTLS_MD_SHA512,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200263# endif
264# if defined(MBEDTLS_SHA384_C)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100265 MBEDTLS_MD_SHA384,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200266# endif
267# if defined(MBEDTLS_SHA256_C)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100268 MBEDTLS_MD_SHA256,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200269# endif
270# if defined(MBEDTLS_SHA224_C)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100271 MBEDTLS_MD_SHA224,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200272# endif
273# if defined(MBEDTLS_SHA1_C)
Gilles Peskine504c1a32021-01-05 23:40:14 +0100274 /* Allow SHA-1 as we use it extensively in tests. */
275 MBEDTLS_MD_SHA1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200276# endif
Gilles Peskine504c1a32021-01-05 23:40:14 +0100277 MBEDTLS_MD_NONE
278};
279#endif /* MBEDTLS_X509_CRT_PARSE_C */
Chris Jonese383fa62021-04-27 14:50:43 +0100280
281#if defined(MBEDTLS_X509_CRT_PARSE_C)
Chris Jonese383fa62021-04-27 14:50:43 +0100282/** Functionally equivalent to mbedtls_x509_crt_verify_info, see that function
283 * for more info.
284 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200285int x509_crt_verify_info(char *buf,
286 size_t size,
287 const char *prefix,
288 uint32_t flags)
Chris Jonese383fa62021-04-27 14:50:43 +0100289{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200290# if !defined(MBEDTLS_X509_REMOVE_INFO)
291 return mbedtls_x509_crt_verify_info(buf, size, prefix, flags);
Chris Jonese383fa62021-04-27 14:50:43 +0100292
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200293# else /* !MBEDTLS_X509_REMOVE_INFO */
Chris Jonese383fa62021-04-27 14:50:43 +0100294 int ret;
295 char *p = buf;
296 size_t n = size;
297
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200298# define X509_CRT_ERROR_INFO(err, err_str, info) \
299 if ((flags & err) != 0) { \
300 ret = mbedtls_snprintf(p, n, "%s%s\n", prefix, info); \
301 MBEDTLS_X509_SAFE_SNPRINTF; \
302 flags ^= err; \
303 }
Chris Jonese383fa62021-04-27 14:50:43 +0100304
305 MBEDTLS_X509_CRT_ERROR_INFO_LIST
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200306# undef X509_CRT_ERROR_INFO
Chris Jonese383fa62021-04-27 14:50:43 +0100307
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200308 if (flags != 0) {
309 ret = mbedtls_snprintf(p, n,
310 "%sUnknown reason "
311 "(this should not happen)\n",
312 prefix);
Chris Jonese383fa62021-04-27 14:50:43 +0100313 MBEDTLS_X509_SAFE_SNPRINTF;
314 }
315
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200316 return ((int)(size - n));
317# endif /* MBEDTLS_X509_REMOVE_INFO */
Chris Jonese383fa62021-04-27 14:50:43 +0100318}
319#endif /* MBEDTLS_X509_CRT_PARSE_C */