summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/t1_enc.c')
-rw-r--r--src/lib/libssl/t1_enc.c82
1 files changed, 1 insertions, 81 deletions
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index 66a7aea2f5..dc627c5a8b 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_enc.c,v 1.155 2022/10/02 16:36:41 jsing Exp $ */ 1/* $OpenBSD: t1_enc.c,v 1.156 2022/11/07 11:58:45 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -413,83 +413,3 @@ tls1_setup_key_block(SSL *s)
413 413
414 return (ret); 414 return (ret);
415} 415}
416
417int
418tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
419 const char *label, size_t llen, const unsigned char *context,
420 size_t contextlen, int use_context)
421{
422 unsigned char *val = NULL;
423 size_t vallen, currentvalpos;
424 int rv;
425
426 if (!SSL_is_init_finished(s)) {
427 SSLerror(s, SSL_R_BAD_STATE);
428 return 0;
429 }
430
431 /* construct PRF arguments
432 * we construct the PRF argument ourself rather than passing separate
433 * values into the TLS PRF to ensure that the concatenation of values
434 * does not create a prohibited label.
435 */
436 vallen = llen + SSL3_RANDOM_SIZE * 2;
437 if (use_context) {
438 vallen += 2 + contextlen;
439 }
440
441 val = malloc(vallen);
442 if (val == NULL)
443 goto err2;
444 currentvalpos = 0;
445 memcpy(val + currentvalpos, (unsigned char *) label, llen);
446 currentvalpos += llen;
447 memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE);
448 currentvalpos += SSL3_RANDOM_SIZE;
449 memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
450 currentvalpos += SSL3_RANDOM_SIZE;
451
452 if (use_context) {
453 val[currentvalpos] = (contextlen >> 8) & 0xff;
454 currentvalpos++;
455 val[currentvalpos] = contextlen & 0xff;
456 currentvalpos++;
457 if ((contextlen > 0) || (context != NULL)) {
458 memcpy(val + currentvalpos, context, contextlen);
459 }
460 }
461
462 /* disallow prohibited labels
463 * note that SSL3_RANDOM_SIZE > max(prohibited label len) =
464 * 15, so size of val > max(prohibited label len) = 15 and the
465 * comparisons won't have buffer overflow
466 */
467 if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
468 TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0)
469 goto err1;
470 if (memcmp(val, TLS_MD_SERVER_FINISH_CONST,
471 TLS_MD_SERVER_FINISH_CONST_SIZE) == 0)
472 goto err1;
473 if (memcmp(val, TLS_MD_MASTER_SECRET_CONST,
474 TLS_MD_MASTER_SECRET_CONST_SIZE) == 0)
475 goto err1;
476 if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
477 TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0)
478 goto err1;
479
480 rv = tls1_PRF(s, s->session->master_key, s->session->master_key_length,
481 val, vallen, NULL, 0, NULL, 0, NULL, 0, NULL, 0, out, olen);
482
483 goto ret;
484 err1:
485 SSLerror(s, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
486 rv = 0;
487 goto ret;
488 err2:
489 SSLerror(s, ERR_R_MALLOC_FAILURE);
490 rv = 0;
491 ret:
492 free(val);
493
494 return (rv);
495}