1 /*
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 OR GPL-2.0-or-later
13 */
14
eap_tls_key_derivation(void * p_expkey,mbedtls_ssl_key_export_type secret_type,const unsigned char * secret,size_t secret_len,const unsigned char client_random[32],const unsigned char server_random[32],mbedtls_tls_prf_types tls_prf_type)15 void eap_tls_key_derivation(void *p_expkey,
16 mbedtls_ssl_key_export_type secret_type,
17 const unsigned char *secret,
18 size_t secret_len,
19 const unsigned char client_random[32],
20 const unsigned char server_random[32],
21 mbedtls_tls_prf_types tls_prf_type)
22 {
23 eap_tls_keys *keys = (eap_tls_keys *) p_expkey;
24
25 /* We're only interested in the TLS 1.2 master secret */
26 if (secret_type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET) {
27 return;
28 }
29 if (secret_len != sizeof(keys->master_secret)) {
30 return;
31 }
32
33 memcpy(keys->master_secret, secret, sizeof(keys->master_secret));
34 memcpy(keys->randbytes, client_random, 32);
35 memcpy(keys->randbytes + 32, server_random, 32);
36 keys->tls_prf_type = tls_prf_type;
37 }
38
nss_keylog_export(void * p_expkey,mbedtls_ssl_key_export_type secret_type,const unsigned char * secret,size_t secret_len,const unsigned char client_random[32],const unsigned char server_random[32],mbedtls_tls_prf_types tls_prf_type)39 void nss_keylog_export(void *p_expkey,
40 mbedtls_ssl_key_export_type secret_type,
41 const unsigned char *secret,
42 size_t secret_len,
43 const unsigned char client_random[32],
44 const unsigned char server_random[32],
45 mbedtls_tls_prf_types tls_prf_type)
46 {
47 char nss_keylog_line[200];
48 size_t const client_random_len = 32;
49 size_t len = 0;
50 size_t j;
51
52 /* We're only interested in the TLS 1.2 master secret */
53 if (secret_type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET) {
54 return;
55 }
56
57 ((void) p_expkey);
58 ((void) server_random);
59 ((void) tls_prf_type);
60
61 len += sprintf(nss_keylog_line + len,
62 "%s", "CLIENT_RANDOM ");
63
64 for (j = 0; j < client_random_len; j++) {
65 len += sprintf(nss_keylog_line + len,
66 "%02x", client_random[j]);
67 }
68
69 len += sprintf(nss_keylog_line + len, " ");
70
71 for (j = 0; j < secret_len; j++) {
72 len += sprintf(nss_keylog_line + len,
73 "%02x", secret[j]);
74 }
75
76 len += sprintf(nss_keylog_line + len, "\n");
77 nss_keylog_line[len] = '\0';
78
79 mbedtls_printf("\n");
80 mbedtls_printf("---------------- NSS KEYLOG -----------------\n");
81 mbedtls_printf("%s", nss_keylog_line);
82 mbedtls_printf("---------------------------------------------\n");
83
84 if (opt.nss_keylog_file != NULL) {
85 FILE *f;
86
87 if ((f = fopen(opt.nss_keylog_file, "a")) == NULL) {
88 goto exit;
89 }
90
91 /* Ensure no stdio buffering of secrets, as such buffers cannot be
92 * wiped. */
93 mbedtls_setbuf(f, NULL);
94
95 if (fwrite(nss_keylog_line, 1, len, f) != len) {
96 fclose(f);
97 goto exit;
98 }
99
100 fclose(f);
101 }
102
103 exit:
104 mbedtls_platform_zeroize(nss_keylog_line,
105 sizeof(nss_keylog_line));
106 }
107
108 #if defined(MBEDTLS_SSL_DTLS_SRTP)
dtls_srtp_key_derivation(void * p_expkey,mbedtls_ssl_key_export_type secret_type,const unsigned char * secret,size_t secret_len,const unsigned char client_random[32],const unsigned char server_random[32],mbedtls_tls_prf_types tls_prf_type)109 void dtls_srtp_key_derivation(void *p_expkey,
110 mbedtls_ssl_key_export_type secret_type,
111 const unsigned char *secret,
112 size_t secret_len,
113 const unsigned char client_random[32],
114 const unsigned char server_random[32],
115 mbedtls_tls_prf_types tls_prf_type)
116 {
117 dtls_srtp_keys *keys = (dtls_srtp_keys *) p_expkey;
118
119 /* We're only interested in the TLS 1.2 master secret */
120 if (secret_type != MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET) {
121 return;
122 }
123 if (secret_len != sizeof(keys->master_secret)) {
124 return;
125 }
126
127 memcpy(keys->master_secret, secret, sizeof(keys->master_secret));
128 memcpy(keys->randbytes, client_random, 32);
129 memcpy(keys->randbytes + 32, server_random, 32);
130 keys->tls_prf_type = tls_prf_type;
131 }
132 #endif /* MBEDTLS_SSL_DTLS_SRTP */
133
ssl_check_record(mbedtls_ssl_context const * ssl,unsigned char const * buf,size_t len)134 int ssl_check_record(mbedtls_ssl_context const *ssl,
135 unsigned char const *buf, size_t len)
136 {
137 int my_ret = 0, ret_cr1, ret_cr2;
138 unsigned char *tmp_buf;
139
140 /* Record checking may modify the input buffer,
141 * so make a copy. */
142 tmp_buf = mbedtls_calloc(1, len);
143 if (tmp_buf == NULL) {
144 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
145 }
146 memcpy(tmp_buf, buf, len);
147
148 ret_cr1 = mbedtls_ssl_check_record(ssl, tmp_buf, len);
149 if (ret_cr1 != MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE) {
150 /* Test-only: Make sure that mbedtls_ssl_check_record()
151 * doesn't alter state. */
152 memcpy(tmp_buf, buf, len); /* Restore buffer */
153 ret_cr2 = mbedtls_ssl_check_record(ssl, tmp_buf, len);
154 if (ret_cr2 != ret_cr1) {
155 mbedtls_printf("mbedtls_ssl_check_record() returned inconsistent results.\n");
156 my_ret = -1;
157 goto cleanup;
158 }
159
160 switch (ret_cr1) {
161 case 0:
162 break;
163
164 case MBEDTLS_ERR_SSL_INVALID_RECORD:
165 if (opt.debug_level > 1) {
166 mbedtls_printf("mbedtls_ssl_check_record() detected invalid record.\n");
167 }
168 break;
169
170 case MBEDTLS_ERR_SSL_INVALID_MAC:
171 if (opt.debug_level > 1) {
172 mbedtls_printf("mbedtls_ssl_check_record() detected unauthentic record.\n");
173 }
174 break;
175
176 case MBEDTLS_ERR_SSL_UNEXPECTED_RECORD:
177 if (opt.debug_level > 1) {
178 mbedtls_printf("mbedtls_ssl_check_record() detected unexpected record.\n");
179 }
180 break;
181
182 default:
183 mbedtls_printf("mbedtls_ssl_check_record() failed fatally with -%#04x.\n",
184 (unsigned int) -ret_cr1);
185 my_ret = -1;
186 goto cleanup;
187 }
188
189 /* Regardless of the outcome, forward the record to the stack. */
190 }
191
192 cleanup:
193 mbedtls_free(tmp_buf);
194
195 return my_ret;
196 }
197
recv_cb(void * ctx,unsigned char * buf,size_t len)198 int recv_cb(void *ctx, unsigned char *buf, size_t len)
199 {
200 io_ctx_t *io_ctx = (io_ctx_t *) ctx;
201 size_t recv_len;
202 int ret;
203
204 if (opt.nbio == 2) {
205 ret = delayed_recv(io_ctx->net, buf, len);
206 } else {
207 ret = mbedtls_net_recv(io_ctx->net, buf, len);
208 }
209 if (ret < 0) {
210 return ret;
211 }
212 recv_len = (size_t) ret;
213
214 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
215 /* Here's the place to do any datagram/record checking
216 * in between receiving the packet from the underlying
217 * transport and passing it on to the TLS stack. */
218 if (ssl_check_record(io_ctx->ssl, buf, recv_len) != 0) {
219 return -1;
220 }
221 }
222
223 return (int) recv_len;
224 }
225
recv_timeout_cb(void * ctx,unsigned char * buf,size_t len,uint32_t timeout)226 int recv_timeout_cb(void *ctx, unsigned char *buf, size_t len,
227 uint32_t timeout)
228 {
229 io_ctx_t *io_ctx = (io_ctx_t *) ctx;
230 int ret;
231 size_t recv_len;
232
233 ret = mbedtls_net_recv_timeout(io_ctx->net, buf, len, timeout);
234 if (ret < 0) {
235 return ret;
236 }
237 recv_len = (size_t) ret;
238
239 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
240 /* Here's the place to do any datagram/record checking
241 * in between receiving the packet from the underlying
242 * transport and passing it on to the TLS stack. */
243 if (ssl_check_record(io_ctx->ssl, buf, recv_len) != 0) {
244 return -1;
245 }
246 }
247
248 return (int) recv_len;
249 }
250
send_cb(void * ctx,unsigned char const * buf,size_t len)251 int send_cb(void *ctx, unsigned char const *buf, size_t len)
252 {
253 io_ctx_t *io_ctx = (io_ctx_t *) ctx;
254
255 if (opt.nbio == 2) {
256 return delayed_send(io_ctx->net, buf, len);
257 }
258
259 return mbedtls_net_send(io_ctx->net, buf, len);
260 }
261
262 #if defined(MBEDTLS_X509_CRT_PARSE_C)
263 #if defined(MBEDTLS_PK_CAN_ECDSA_SOME) && defined(MBEDTLS_RSA_C)
264 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
265 /*
266 * When GnuTLS/Openssl server is configured in TLS 1.2 mode with a certificate
267 * declaring an RSA public key and Mbed TLS is configured in hybrid mode, if
268 * `rsa_pss_rsae_*` algorithms are before `rsa_pkcs1_*` ones in this list then
269 * the GnuTLS/Openssl server chooses an `rsa_pss_rsae_*` signature algorithm
270 * for its signature in the key exchange message. As Mbed TLS 1.2 does not
271 * support them, the handshake fails.
272 */
273 #define MBEDTLS_SSL_SIG_ALG(hash) ((hash << 8) | MBEDTLS_SSL_SIG_ECDSA), \
274 ((hash << 8) | MBEDTLS_SSL_SIG_RSA), \
275 (0x800 | hash),
276 #else
277 #define MBEDTLS_SSL_SIG_ALG(hash) ((hash << 8) | MBEDTLS_SSL_SIG_ECDSA), \
278 ((hash << 8) | MBEDTLS_SSL_SIG_RSA),
279 #endif
280 #elif defined(MBEDTLS_PK_CAN_ECDSA_SOME)
281 #define MBEDTLS_SSL_SIG_ALG(hash) ((hash << 8) | MBEDTLS_SSL_SIG_ECDSA),
282 #elif defined(MBEDTLS_RSA_C)
283 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
284 /* See above */
285 #define MBEDTLS_SSL_SIG_ALG(hash) ((hash << 8) | MBEDTLS_SSL_SIG_RSA), \
286 (0x800 | hash),
287 #else
288 #define MBEDTLS_SSL_SIG_ALG(hash) ((hash << 8) | MBEDTLS_SSL_SIG_RSA),
289 #endif
290 #else
291 #define MBEDTLS_SSL_SIG_ALG(hash)
292 #endif
293
294 uint16_t ssl_sig_algs_for_test[] = {
295 #if defined(MBEDTLS_MD_CAN_SHA512)
296 MBEDTLS_SSL_SIG_ALG(MBEDTLS_SSL_HASH_SHA512)
297 #endif
298 #if defined(MBEDTLS_MD_CAN_SHA384)
299 MBEDTLS_SSL_SIG_ALG(MBEDTLS_SSL_HASH_SHA384)
300 #endif
301 #if defined(MBEDTLS_MD_CAN_SHA256)
302 MBEDTLS_SSL_SIG_ALG(MBEDTLS_SSL_HASH_SHA256)
303 #endif
304 #if defined(MBEDTLS_MD_CAN_SHA224)
305 MBEDTLS_SSL_SIG_ALG(MBEDTLS_SSL_HASH_SHA224)
306 #endif
307 #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_MD_CAN_SHA256)
308 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
309 #endif /* MBEDTLS_RSA_C && MBEDTLS_MD_CAN_SHA256 */
310 #if defined(MBEDTLS_MD_CAN_SHA1)
311 /* Allow SHA-1 as we use it extensively in tests. */
312 MBEDTLS_SSL_SIG_ALG(MBEDTLS_SSL_HASH_SHA1)
313 #endif
314 MBEDTLS_TLS1_3_SIG_NONE
315 };
316 #endif /* MBEDTLS_X509_CRT_PARSE_C */
317
318 #if defined(MBEDTLS_X509_CRT_PARSE_C)
319 /** Functionally equivalent to mbedtls_x509_crt_verify_info, see that function
320 * for more info.
321 */
x509_crt_verify_info(char * buf,size_t size,const char * prefix,uint32_t flags)322 int x509_crt_verify_info(char *buf, size_t size, const char *prefix,
323 uint32_t flags)
324 {
325 #if !defined(MBEDTLS_X509_REMOVE_INFO)
326 return mbedtls_x509_crt_verify_info(buf, size, prefix, flags);
327
328 #else /* !MBEDTLS_X509_REMOVE_INFO */
329 int ret;
330 char *p = buf;
331 size_t n = size;
332
333 #define X509_CRT_ERROR_INFO(err, err_str, info) \
334 if ((flags & err) != 0) \
335 { \
336 ret = mbedtls_snprintf(p, n, "%s%s\n", prefix, info); \
337 MBEDTLS_X509_SAFE_SNPRINTF; \
338 flags ^= err; \
339 }
340
341 MBEDTLS_X509_CRT_ERROR_INFO_LIST
342 #undef X509_CRT_ERROR_INFO
343
344 if (flags != 0) {
345 ret = mbedtls_snprintf(p, n, "%sUnknown reason "
346 "(this should not happen)\n", prefix);
347 MBEDTLS_X509_SAFE_SNPRINTF;
348 }
349
350 return (int) (size - n);
351 #endif /* MBEDTLS_X509_REMOVE_INFO */
352 }
353 #endif /* MBEDTLS_X509_CRT_PARSE_C */
354
mbedtls_print_supported_sig_algs(void)355 void mbedtls_print_supported_sig_algs(void)
356 {
357 mbedtls_printf("supported signature algorithms:\n");
358 mbedtls_printf("\trsa_pkcs1_sha256 ");
359 mbedtls_printf("rsa_pkcs1_sha384 ");
360 mbedtls_printf("rsa_pkcs1_sha512\n");
361 mbedtls_printf("\tecdsa_secp256r1_sha256 ");
362 mbedtls_printf("ecdsa_secp384r1_sha384 ");
363 mbedtls_printf("ecdsa_secp521r1_sha512\n");
364 mbedtls_printf("\trsa_pss_rsae_sha256 ");
365 mbedtls_printf("rsa_pss_rsae_sha384 ");
366 mbedtls_printf("rsa_pss_rsae_sha512\n");
367 mbedtls_printf("\trsa_pss_pss_sha256 ");
368 mbedtls_printf("rsa_pss_pss_sha384 ");
369 mbedtls_printf("rsa_pss_pss_sha512\n");
370 mbedtls_printf("\ted25519 ");
371 mbedtls_printf("ed448 ");
372 mbedtls_printf("rsa_pkcs1_sha1 ");
373 mbedtls_printf("ecdsa_sha1\n");
374 mbedtls_printf("\n");
375 }
376