diff options
Diffstat (limited to 'src/lib/libssl/t1_lib.c')
-rw-r--r-- | src/lib/libssl/t1_lib.c | 274 |
1 files changed, 158 insertions, 116 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index 9748901268..beaaae1eb0 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: t1_lib.c,v 1.190 2022/07/02 15:53:37 tb Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.191 2022/07/02 16:00:12 tb 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 | * |
@@ -150,12 +150,16 @@ tls1_clear(SSL *s) | |||
150 | s->version = s->method->version; | 150 | s->version = s->method->version; |
151 | } | 151 | } |
152 | 152 | ||
153 | struct curve { | 153 | struct supported_group { |
154 | int nid; | 154 | int nid; |
155 | int bits; | 155 | int bits; |
156 | }; | 156 | }; |
157 | 157 | ||
158 | static const struct curve nid_list[] = { | 158 | /* |
159 | * Supported groups (formerly known as named curves) | ||
160 | * https://www.iana.org/assignments/tls-parameters/#tls-parameters-8 | ||
161 | */ | ||
162 | static const struct supported_group nid_list[] = { | ||
159 | [1] = { | 163 | [1] = { |
160 | .nid = NID_sect163k1, | 164 | .nid = NID_sect163k1, |
161 | .bits = 80, | 165 | .bits = 80, |
@@ -274,6 +278,8 @@ static const struct curve nid_list[] = { | |||
274 | }, | 278 | }, |
275 | }; | 279 | }; |
276 | 280 | ||
281 | #define NID_LIST_LEN (sizeof(nid_list) / sizeof(nid_list[0])) | ||
282 | |||
277 | #if 0 | 283 | #if 0 |
278 | static const uint8_t ecformats_list[] = { | 284 | static const uint8_t ecformats_list[] = { |
279 | TLSEXT_ECPOINTFORMAT_uncompressed, | 285 | TLSEXT_ECPOINTFORMAT_uncompressed, |
@@ -287,7 +293,7 @@ static const uint8_t ecformats_default[] = { | |||
287 | }; | 293 | }; |
288 | 294 | ||
289 | #if 0 | 295 | #if 0 |
290 | static const uint16_t eccurves_list[] = { | 296 | static const uint16_t ecgroups_list[] = { |
291 | 29, /* X25519 (29) */ | 297 | 29, /* X25519 (29) */ |
292 | 14, /* sect571r1 (14) */ | 298 | 14, /* sect571r1 (14) */ |
293 | 13, /* sect571k1 (13) */ | 299 | 13, /* sect571k1 (13) */ |
@@ -320,116 +326,155 @@ static const uint16_t eccurves_list[] = { | |||
320 | }; | 326 | }; |
321 | #endif | 327 | #endif |
322 | 328 | ||
323 | static const uint16_t eccurves_client_default[] = { | 329 | static const uint16_t ecgroups_client_default[] = { |
324 | 29, /* X25519 (29) */ | 330 | 29, /* X25519 (29) */ |
325 | 23, /* secp256r1 (23) */ | 331 | 23, /* secp256r1 (23) */ |
326 | 24, /* secp384r1 (24) */ | 332 | 24, /* secp384r1 (24) */ |
327 | 25, /* secp521r1 (25) */ | 333 | 25, /* secp521r1 (25) */ |
328 | }; | 334 | }; |
329 | 335 | ||
330 | static const uint16_t eccurves_server_default[] = { | 336 | static const uint16_t ecgroups_server_default[] = { |
331 | 29, /* X25519 (29) */ | 337 | 29, /* X25519 (29) */ |
332 | 23, /* secp256r1 (23) */ | 338 | 23, /* secp256r1 (23) */ |
333 | 24, /* secp384r1 (24) */ | 339 | 24, /* secp384r1 (24) */ |
334 | }; | 340 | }; |
335 | 341 | ||
336 | int | 342 | int |
337 | tls1_ec_curve_id2nid(const uint16_t curve_id) | 343 | tls1_ec_group_id2nid(uint16_t group_id, int *out_nid) |
338 | { | 344 | { |
339 | const struct curve *curve; | 345 | const struct supported_group *group; |
340 | 346 | ||
341 | /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */ | 347 | if (group_id < 1 || group_id >= NID_LIST_LEN) |
342 | if ((curve_id < 1) || | 348 | return 0; |
343 | ((unsigned int)curve_id >= sizeof(nid_list) / sizeof(nid_list[0]))) | 349 | |
344 | return NID_undef; | 350 | if ((group = &nid_list[group_id]) == NULL) |
351 | return 0; | ||
345 | 352 | ||
346 | if ((curve = &nid_list[curve_id]) == NULL) | 353 | *out_nid = group->nid; |
347 | return NID_undef; | ||
348 | 354 | ||
349 | return curve->nid; | 355 | return 1; |
350 | } | 356 | } |
351 | 357 | ||
352 | int | 358 | int |
353 | tls1_ec_curve_id2bits(const uint16_t curve_id) | 359 | tls1_ec_group_id2bits(uint16_t group_id, int *out_bits) |
354 | { | 360 | { |
355 | const struct curve *curve; | 361 | const struct supported_group *group; |
356 | 362 | ||
357 | if ((curve_id < 1) || | 363 | if (group_id < 1 || group_id >= NID_LIST_LEN) |
358 | ((unsigned int)curve_id >= sizeof(nid_list) / sizeof(nid_list[0]))) | ||
359 | return 0; | 364 | return 0; |
360 | 365 | ||
361 | if ((curve = &nid_list[curve_id]) == NULL) | 366 | if ((group = &nid_list[group_id]) == NULL) |
362 | return 0; | 367 | return 0; |
363 | 368 | ||
364 | return curve->bits; | 369 | *out_bits = group->bits; |
370 | |||
371 | return 1; | ||
365 | } | 372 | } |
366 | 373 | ||
367 | uint16_t | 374 | int |
368 | tls1_ec_nid2curve_id(const int nid) | 375 | tls1_ec_nid2group_id(const int nid, uint16_t *out_group_id) |
369 | { | 376 | { |
370 | /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */ | 377 | uint16_t group_id; |
378 | |||
371 | switch (nid) { | 379 | switch (nid) { |
372 | case NID_sect163k1: /* sect163k1 (1) */ | 380 | case NID_sect163k1: |
373 | return 1; | 381 | group_id = 1; |
374 | case NID_sect163r1: /* sect163r1 (2) */ | 382 | break; |
375 | return 2; | 383 | case NID_sect163r1: |
376 | case NID_sect163r2: /* sect163r2 (3) */ | 384 | group_id = 2; |
377 | return 3; | 385 | break; |
378 | case NID_sect193r1: /* sect193r1 (4) */ | 386 | case NID_sect163r2: |
379 | return 4; | 387 | group_id = 3; |
380 | case NID_sect193r2: /* sect193r2 (5) */ | 388 | break; |
381 | return 5; | 389 | case NID_sect193r1: |
382 | case NID_sect233k1: /* sect233k1 (6) */ | 390 | group_id = 4; |
383 | return 6; | 391 | break; |
384 | case NID_sect233r1: /* sect233r1 (7) */ | 392 | case NID_sect193r2: |
385 | return 7; | 393 | group_id = 5; |
386 | case NID_sect239k1: /* sect239k1 (8) */ | 394 | break; |
387 | return 8; | 395 | case NID_sect233k1: |
388 | case NID_sect283k1: /* sect283k1 (9) */ | 396 | group_id = 6; |
389 | return 9; | 397 | break; |
390 | case NID_sect283r1: /* sect283r1 (10) */ | 398 | case NID_sect233r1: |
391 | return 10; | 399 | group_id = 7; |
392 | case NID_sect409k1: /* sect409k1 (11) */ | 400 | break; |
393 | return 11; | 401 | case NID_sect239k1: |
394 | case NID_sect409r1: /* sect409r1 (12) */ | 402 | group_id = 8; |
395 | return 12; | 403 | break; |
396 | case NID_sect571k1: /* sect571k1 (13) */ | 404 | case NID_sect283k1: |
397 | return 13; | 405 | group_id = 9; |
398 | case NID_sect571r1: /* sect571r1 (14) */ | 406 | break; |
399 | return 14; | 407 | case NID_sect283r1: |
400 | case NID_secp160k1: /* secp160k1 (15) */ | 408 | group_id = 10; |
401 | return 15; | 409 | break; |
402 | case NID_secp160r1: /* secp160r1 (16) */ | 410 | case NID_sect409k1: |
403 | return 16; | 411 | group_id = 11; |
404 | case NID_secp160r2: /* secp160r2 (17) */ | 412 | break; |
405 | return 17; | 413 | case NID_sect409r1: |
406 | case NID_secp192k1: /* secp192k1 (18) */ | 414 | group_id = 12; |
407 | return 18; | 415 | break; |
408 | case NID_X9_62_prime192v1: /* secp192r1 (19) */ | 416 | case NID_sect571k1: |
409 | return 19; | 417 | group_id = 13; |
410 | case NID_secp224k1: /* secp224k1 (20) */ | 418 | break; |
411 | return 20; | 419 | case NID_sect571r1: |
412 | case NID_secp224r1: /* secp224r1 (21) */ | 420 | group_id = 14; |
413 | return 21; | 421 | break; |
414 | case NID_secp256k1: /* secp256k1 (22) */ | 422 | case NID_secp160k1: |
415 | return 22; | 423 | group_id = 15; |
416 | case NID_X9_62_prime256v1: /* secp256r1 (23) */ | 424 | break; |
417 | return 23; | 425 | case NID_secp160r1: |
418 | case NID_secp384r1: /* secp384r1 (24) */ | 426 | group_id = 16; |
419 | return 24; | 427 | break; |
420 | case NID_secp521r1: /* secp521r1 (25) */ | 428 | case NID_secp160r2: |
421 | return 25; | 429 | group_id = 17; |
422 | case NID_brainpoolP256r1: /* brainpoolP256r1 (26) */ | 430 | break; |
423 | return 26; | 431 | case NID_secp192k1: |
424 | case NID_brainpoolP384r1: /* brainpoolP384r1 (27) */ | 432 | group_id = 18; |
425 | return 27; | 433 | break; |
426 | case NID_brainpoolP512r1: /* brainpoolP512r1 (28) */ | 434 | case NID_X9_62_prime192v1: /* aka secp192r1 */ |
427 | return 28; | 435 | group_id = 19; |
428 | case NID_X25519: /* X25519 (29) */ | 436 | break; |
429 | return 29; | 437 | case NID_secp224k1: |
438 | group_id = 20; | ||
439 | break; | ||
440 | case NID_secp224r1: | ||
441 | group_id = 21; | ||
442 | break; | ||
443 | case NID_secp256k1: | ||
444 | group_id = 22; | ||
445 | break; | ||
446 | case NID_X9_62_prime256v1: /* aka secp256r1 */ | ||
447 | group_id = 23; | ||
448 | break; | ||
449 | case NID_secp384r1: | ||
450 | group_id = 24; | ||
451 | break; | ||
452 | case NID_secp521r1: | ||
453 | group_id = 25; | ||
454 | break; | ||
455 | case NID_brainpoolP256r1: | ||
456 | group_id = 26; | ||
457 | break; | ||
458 | case NID_brainpoolP384r1: | ||
459 | group_id = 27; | ||
460 | break; | ||
461 | case NID_brainpoolP512r1: | ||
462 | group_id = 28; | ||
463 | break; | ||
464 | case NID_X25519: | ||
465 | group_id = 29; | ||
466 | break; | ||
430 | default: | 467 | default: |
431 | return 0; | 468 | group_id = 0; |
469 | break; | ||
432 | } | 470 | } |
471 | |||
472 | if (group_id == 0) | ||
473 | return 0; | ||
474 | |||
475 | *out_group_id = group_id; | ||
476 | |||
477 | return 1; | ||
433 | } | 478 | } |
434 | 479 | ||
435 | /* | 480 | /* |
@@ -476,11 +521,11 @@ tls1_get_group_list(SSL *s, int client_groups, const uint16_t **pgroups, | |||
476 | return; | 521 | return; |
477 | 522 | ||
478 | if (!s->server) { | 523 | if (!s->server) { |
479 | *pgroups = eccurves_client_default; | 524 | *pgroups = ecgroups_client_default; |
480 | *pgroupslen = sizeof(eccurves_client_default) / 2; | 525 | *pgroupslen = sizeof(ecgroups_client_default) / 2; |
481 | } else { | 526 | } else { |
482 | *pgroups = eccurves_server_default; | 527 | *pgroups = ecgroups_server_default; |
483 | *pgroupslen = sizeof(eccurves_server_default) / 2; | 528 | *pgroupslen = sizeof(ecgroups_server_default) / 2; |
484 | } | 529 | } |
485 | } | 530 | } |
486 | 531 | ||
@@ -491,13 +536,11 @@ tls1_set_groups(uint16_t **out_group_ids, size_t *out_group_ids_len, | |||
491 | uint16_t *group_ids; | 536 | uint16_t *group_ids; |
492 | size_t i; | 537 | size_t i; |
493 | 538 | ||
494 | group_ids = calloc(ngroups, sizeof(uint16_t)); | 539 | if ((group_ids = calloc(ngroups, sizeof(uint16_t))) == NULL) |
495 | if (group_ids == NULL) | ||
496 | return 0; | 540 | return 0; |
497 | 541 | ||
498 | for (i = 0; i < ngroups; i++) { | 542 | for (i = 0; i < ngroups; i++) { |
499 | group_ids[i] = tls1_ec_nid2curve_id(groups[i]); | 543 | if (!tls1_ec_nid2group_id(groups[i], &group_ids[i])) { |
500 | if (group_ids[i] == 0) { | ||
501 | free(group_ids); | 544 | free(group_ids); |
502 | return 0; | 545 | return 0; |
503 | } | 546 | } |
@@ -537,8 +580,7 @@ tls1_set_group_list(uint16_t **out_group_ids, size_t *out_group_ids_len, | |||
537 | goto err; | 580 | goto err; |
538 | group_ids = new_group_ids; | 581 | group_ids = new_group_ids; |
539 | 582 | ||
540 | group_ids[ngroups] = tls1_ec_nid2curve_id(nid); | 583 | if (!tls1_ec_nid2group_id(nid, &group_ids[ngroups])) |
541 | if (group_ids[ngroups] == 0) | ||
542 | goto err; | 584 | goto err; |
543 | 585 | ||
544 | ngroups++; | 586 | ngroups++; |
@@ -558,9 +600,9 @@ tls1_set_group_list(uint16_t **out_group_ids, size_t *out_group_ids_len, | |||
558 | return 0; | 600 | return 0; |
559 | } | 601 | } |
560 | 602 | ||
561 | /* Check that a curve is one of our preferences. */ | 603 | /* Check that a group is one of our preferences. */ |
562 | int | 604 | int |
563 | tls1_check_curve(SSL *s, const uint16_t curve_id) | 605 | tls1_check_group(SSL *s, uint16_t group_id) |
564 | { | 606 | { |
565 | const uint16_t *groups; | 607 | const uint16_t *groups; |
566 | size_t groupslen, i; | 608 | size_t groupslen, i; |
@@ -570,14 +612,14 @@ tls1_check_curve(SSL *s, const uint16_t curve_id) | |||
570 | for (i = 0; i < groupslen; i++) { | 612 | for (i = 0; i < groupslen; i++) { |
571 | if (!ssl_security_supported_group(s, groups[i])) | 613 | if (!ssl_security_supported_group(s, groups[i])) |
572 | continue; | 614 | continue; |
573 | if (groups[i] == curve_id) | 615 | if (groups[i] == group_id) |
574 | return (1); | 616 | return 1; |
575 | } | 617 | } |
576 | return (0); | 618 | return 0; |
577 | } | 619 | } |
578 | 620 | ||
579 | int | 621 | int |
580 | tls1_get_shared_curve(SSL *s) | 622 | tls1_get_supported_group(SSL *s, int *out_nid) |
581 | { | 623 | { |
582 | size_t preflen, supplen, i, j; | 624 | size_t preflen, supplen, i, j; |
583 | const uint16_t *pref, *supp; | 625 | const uint16_t *pref, *supp; |
@@ -585,9 +627,9 @@ tls1_get_shared_curve(SSL *s) | |||
585 | 627 | ||
586 | /* Cannot do anything on the client side. */ | 628 | /* Cannot do anything on the client side. */ |
587 | if (s->server == 0) | 629 | if (s->server == 0) |
588 | return (NID_undef); | 630 | return 0; |
589 | 631 | ||
590 | /* Return first preference shared curve. */ | 632 | /* Return first preference supported group. */ |
591 | server_pref = (s->internal->options & SSL_OP_CIPHER_SERVER_PREFERENCE); | 633 | server_pref = (s->internal->options & SSL_OP_CIPHER_SERVER_PREFERENCE); |
592 | tls1_get_group_list(s, (server_pref == 0), &pref, &preflen); | 634 | tls1_get_group_list(s, (server_pref == 0), &pref, &preflen); |
593 | tls1_get_group_list(s, (server_pref != 0), &supp, &supplen); | 635 | tls1_get_group_list(s, (server_pref != 0), &supp, &supplen); |
@@ -597,15 +639,15 @@ tls1_get_shared_curve(SSL *s) | |||
597 | continue; | 639 | continue; |
598 | for (j = 0; j < supplen; j++) { | 640 | for (j = 0; j < supplen; j++) { |
599 | if (pref[i] == supp[j]) | 641 | if (pref[i] == supp[j]) |
600 | return (tls1_ec_curve_id2nid(pref[i])); | 642 | return tls1_ec_group_id2nid(pref[i], out_nid); |
601 | } | 643 | } |
602 | } | 644 | } |
603 | return (NID_undef); | 645 | return 0; |
604 | } | 646 | } |
605 | 647 | ||
606 | /* For an EC key set TLS ID and required compression based on parameters. */ | 648 | /* For an EC key set TLS ID and required compression based on parameters. */ |
607 | static int | 649 | static int |
608 | tls1_set_ec_id(uint16_t *curve_id, uint8_t *comp_id, EC_KEY *ec) | 650 | tls1_set_ec_id(uint16_t *group_id, uint8_t *comp_id, EC_KEY *ec) |
609 | { | 651 | { |
610 | const EC_GROUP *grp; | 652 | const EC_GROUP *grp; |
611 | const EC_METHOD *meth; | 653 | const EC_METHOD *meth; |
@@ -615,18 +657,18 @@ tls1_set_ec_id(uint16_t *curve_id, uint8_t *comp_id, EC_KEY *ec) | |||
615 | if (ec == NULL) | 657 | if (ec == NULL) |
616 | return (0); | 658 | return (0); |
617 | 659 | ||
618 | /* Determine whether the curve is defined over a prime field. */ | 660 | /* Determine whether the group is defined over a prime field. */ |
619 | if ((grp = EC_KEY_get0_group(ec)) == NULL) | 661 | if ((grp = EC_KEY_get0_group(ec)) == NULL) |
620 | return (0); | 662 | return (0); |
621 | if ((meth = EC_GROUP_method_of(grp)) == NULL) | 663 | if ((meth = EC_GROUP_method_of(grp)) == NULL) |
622 | return (0); | 664 | return (0); |
623 | prime_field = (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field); | 665 | prime_field = (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field); |
624 | 666 | ||
625 | /* Determine curve ID - NID_undef results in a curve ID of zero. */ | 667 | /* Determine group ID. */ |
626 | nid = EC_GROUP_get_curve_name(grp); | 668 | nid = EC_GROUP_get_curve_name(grp); |
627 | /* If we have an ID set it, otherwise set arbitrary explicit curve. */ | 669 | /* If we have an ID set it, otherwise set arbitrary explicit group. */ |
628 | if ((*curve_id = tls1_ec_nid2curve_id(nid)) == 0) | 670 | if (!tls1_ec_nid2group_id(nid, group_id)) |
629 | *curve_id = prime_field ? 0xff01 : 0xff02; | 671 | *group_id = prime_field ? 0xff01 : 0xff02; |
630 | 672 | ||
631 | if (comp_id == NULL) | 673 | if (comp_id == NULL) |
632 | return (1); | 674 | return (1); |
@@ -646,7 +688,7 @@ tls1_set_ec_id(uint16_t *curve_id, uint8_t *comp_id, EC_KEY *ec) | |||
646 | 688 | ||
647 | /* Check that an EC key is compatible with extensions. */ | 689 | /* Check that an EC key is compatible with extensions. */ |
648 | static int | 690 | static int |
649 | tls1_check_ec_key(SSL *s, const uint16_t *curve_id, const uint8_t *comp_id) | 691 | tls1_check_ec_key(SSL *s, const uint16_t *group_id, const uint8_t *comp_id) |
650 | { | 692 | { |
651 | size_t groupslen, formatslen, i; | 693 | size_t groupslen, formatslen, i; |
652 | const uint16_t *groups; | 694 | const uint16_t *groups; |
@@ -667,12 +709,12 @@ tls1_check_ec_key(SSL *s, const uint16_t *curve_id, const uint8_t *comp_id) | |||
667 | } | 709 | } |
668 | 710 | ||
669 | /* | 711 | /* |
670 | * Check curve list if present, otherwise everything is supported. | 712 | * Check group list if present, otherwise everything is supported. |
671 | */ | 713 | */ |
672 | tls1_get_group_list(s, 1, &groups, &groupslen); | 714 | tls1_get_group_list(s, 1, &groups, &groupslen); |
673 | if (curve_id != NULL && groups != NULL) { | 715 | if (group_id != NULL && groups != NULL) { |
674 | for (i = 0; i < groupslen; i++) { | 716 | for (i = 0; i < groupslen; i++) { |
675 | if (groups[i] == *curve_id) | 717 | if (groups[i] == *group_id) |
676 | break; | 718 | break; |
677 | } | 719 | } |
678 | if (i == groupslen) | 720 | if (i == groupslen) |
@@ -687,7 +729,7 @@ int | |||
687 | tls1_check_ec_server_key(SSL *s) | 729 | tls1_check_ec_server_key(SSL *s) |
688 | { | 730 | { |
689 | SSL_CERT_PKEY *cpk = s->cert->pkeys + SSL_PKEY_ECC; | 731 | SSL_CERT_PKEY *cpk = s->cert->pkeys + SSL_PKEY_ECC; |
690 | uint16_t curve_id; | 732 | uint16_t group_id; |
691 | uint8_t comp_id; | 733 | uint8_t comp_id; |
692 | EC_KEY *eckey; | 734 | EC_KEY *eckey; |
693 | EVP_PKEY *pkey; | 735 | EVP_PKEY *pkey; |
@@ -698,10 +740,10 @@ tls1_check_ec_server_key(SSL *s) | |||
698 | return (0); | 740 | return (0); |
699 | if ((eckey = EVP_PKEY_get0_EC_KEY(pkey)) == NULL) | 741 | if ((eckey = EVP_PKEY_get0_EC_KEY(pkey)) == NULL) |
700 | return (0); | 742 | return (0); |
701 | if (!tls1_set_ec_id(&curve_id, &comp_id, eckey)) | 743 | if (!tls1_set_ec_id(&group_id, &comp_id, eckey)) |
702 | return (0); | 744 | return (0); |
703 | 745 | ||
704 | return tls1_check_ec_key(s, &curve_id, &comp_id); | 746 | return tls1_check_ec_key(s, &group_id, &comp_id); |
705 | } | 747 | } |
706 | 748 | ||
707 | int | 749 | int |