diff options
author | jsing <> | 2017-05-06 20:39:03 +0000 |
---|---|---|
committer | jsing <> | 2017-05-06 20:39:03 +0000 |
commit | 4b07231945fb22f051b25555dae5b5f56398eee0 (patch) | |
tree | 8675fa48eb199ef6c57a362417d36a3f092b586c | |
parent | 792684dc457d44526f35586cb1671d67604bf5b1 (diff) | |
download | openbsd-4b07231945fb22f051b25555dae5b5f56398eee0.tar.gz openbsd-4b07231945fb22f051b25555dae5b5f56398eee0.tar.bz2 openbsd-4b07231945fb22f051b25555dae5b5f56398eee0.zip |
Add regress coverage for SSL{,_CTX}_set_{min,max}_proto_version().
-rw-r--r-- | src/regress/lib/libssl/unit/ssl_versions.c | 316 |
1 files changed, 304 insertions, 12 deletions
diff --git a/src/regress/lib/libssl/unit/ssl_versions.c b/src/regress/lib/libssl/unit/ssl_versions.c index eace13e438..c12f115c19 100644 --- a/src/regress/lib/libssl/unit/ssl_versions.c +++ b/src/regress/lib/libssl/unit/ssl_versions.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* $OpenBSD: ssl_versions.c,v 1.3 2017/01/25 11:11:21 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_versions.c,v 1.4 2017/05/06 20:39:03 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
5 | * Permission to use, copy, modify, and distribute this software for any | 5 | * Permission to use, copy, modify, and distribute this software for any |
6 | * purpose with or without fee is hereby granted, provided that the above | 6 | * purpose with or without fee is hereby granted, provided that the above |
@@ -361,7 +361,7 @@ static struct shared_version_test shared_version_tests[] = { | |||
361 | static int | 361 | static int |
362 | test_ssl_max_shared_version(void) | 362 | test_ssl_max_shared_version(void) |
363 | { | 363 | { |
364 | struct shared_version_test *srt; | 364 | struct shared_version_test *svt; |
365 | SSL_CTX *ssl_ctx = NULL; | 365 | SSL_CTX *ssl_ctx = NULL; |
366 | SSL *ssl = NULL; | 366 | SSL *ssl = NULL; |
367 | uint16_t maxver; | 367 | uint16_t maxver; |
@@ -371,9 +371,9 @@ test_ssl_max_shared_version(void) | |||
371 | failed = 0; | 371 | failed = 0; |
372 | 372 | ||
373 | for (i = 0; i < N_SHARED_VERSION_TESTS; i++) { | 373 | for (i = 0; i < N_SHARED_VERSION_TESTS; i++) { |
374 | srt = &shared_version_tests[i]; | 374 | svt = &shared_version_tests[i]; |
375 | 375 | ||
376 | if ((ssl_ctx = SSL_CTX_new(srt->ssl_method())) == NULL) { | 376 | if ((ssl_ctx = SSL_CTX_new(svt->ssl_method())) == NULL) { |
377 | fprintf(stderr, "SSL_CTX_new() returned NULL\n"); | 377 | fprintf(stderr, "SSL_CTX_new() returned NULL\n"); |
378 | return 1; | 378 | return 1; |
379 | } | 379 | } |
@@ -384,24 +384,24 @@ test_ssl_max_shared_version(void) | |||
384 | 384 | ||
385 | SSL_clear_options(ssl, SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | | 385 | SSL_clear_options(ssl, SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | |
386 | SSL_OP_NO_TLSv1_2); | 386 | SSL_OP_NO_TLSv1_2); |
387 | SSL_set_options(ssl, srt->options); | 387 | SSL_set_options(ssl, svt->options); |
388 | 388 | ||
389 | maxver = 0; | 389 | maxver = 0; |
390 | ssl->internal->min_version = srt->minver; | 390 | ssl->internal->min_version = svt->minver; |
391 | ssl->internal->max_version = srt->maxver; | 391 | ssl->internal->max_version = svt->maxver; |
392 | 392 | ||
393 | if (ssl_max_shared_version(ssl, srt->peerver, &maxver) != 1) { | 393 | if (ssl_max_shared_version(ssl, svt->peerver, &maxver) != 1) { |
394 | if (srt->want_maxver != 0) { | 394 | if (svt->want_maxver != 0) { |
395 | fprintf(stderr, "FAIL: test %zu - failed but " | 395 | fprintf(stderr, "FAIL: test %zu - failed but " |
396 | "wanted non-zero shared version\n", i); | 396 | "wanted non-zero shared version\n", i); |
397 | failed++; | 397 | failed++; |
398 | } | 398 | } |
399 | continue; | 399 | continue; |
400 | } | 400 | } |
401 | if (maxver != srt->want_maxver) { | 401 | if (maxver != svt->want_maxver) { |
402 | fprintf(stderr, "FAIL: test %zu - got shared " | 402 | fprintf(stderr, "FAIL: test %zu - got shared " |
403 | "version %x, want %x\n", i, maxver, | 403 | "version %x, want %x\n", i, maxver, |
404 | srt->want_maxver); | 404 | svt->want_maxver); |
405 | failed++; | 405 | failed++; |
406 | } | 406 | } |
407 | 407 | ||
@@ -412,6 +412,297 @@ test_ssl_max_shared_version(void) | |||
412 | return (failed); | 412 | return (failed); |
413 | } | 413 | } |
414 | 414 | ||
415 | struct min_max_version_test { | ||
416 | const SSL_METHOD *(*ssl_method)(void); | ||
417 | const uint16_t minver; | ||
418 | const uint16_t maxver; | ||
419 | const uint16_t want_minver; | ||
420 | const uint16_t want_maxver; | ||
421 | }; | ||
422 | |||
423 | static struct min_max_version_test min_max_version_tests[] = { | ||
424 | { | ||
425 | .ssl_method = TLS_method, | ||
426 | .minver = 0, | ||
427 | .maxver = 0, | ||
428 | .want_minver = TLS1_VERSION, | ||
429 | .want_maxver = TLS1_2_VERSION, | ||
430 | }, | ||
431 | { | ||
432 | .ssl_method = TLS_method, | ||
433 | .minver = TLS1_VERSION, | ||
434 | .maxver = 0, | ||
435 | .want_minver = TLS1_VERSION, | ||
436 | .want_maxver = TLS1_2_VERSION, | ||
437 | }, | ||
438 | { | ||
439 | .ssl_method = TLS_method, | ||
440 | .minver = 0, | ||
441 | .maxver = TLS1_2_VERSION, | ||
442 | .want_minver = TLS1_VERSION, | ||
443 | .want_maxver = TLS1_2_VERSION, | ||
444 | }, | ||
445 | { | ||
446 | .ssl_method = TLS_method, | ||
447 | .minver = TLS1_VERSION, | ||
448 | .maxver = TLS1_2_VERSION, | ||
449 | .want_minver = TLS1_VERSION, | ||
450 | .want_maxver = TLS1_2_VERSION, | ||
451 | }, | ||
452 | { | ||
453 | .ssl_method = TLS_method, | ||
454 | .minver = TLS1_1_VERSION, | ||
455 | .maxver = 0, | ||
456 | .want_minver = TLS1_1_VERSION, | ||
457 | .want_maxver = TLS1_2_VERSION, | ||
458 | }, | ||
459 | { | ||
460 | .ssl_method = TLS_method, | ||
461 | .minver = TLS1_2_VERSION, | ||
462 | .maxver = 0, | ||
463 | .want_minver = TLS1_2_VERSION, | ||
464 | .want_maxver = TLS1_2_VERSION, | ||
465 | }, | ||
466 | { | ||
467 | .ssl_method = TLS_method, | ||
468 | .minver = 0x0300, | ||
469 | .maxver = 0, | ||
470 | .want_minver = TLS1_VERSION, | ||
471 | .want_maxver = TLS1_2_VERSION, | ||
472 | }, | ||
473 | { | ||
474 | .ssl_method = TLS_method, | ||
475 | .minver = 0x0305, | ||
476 | .maxver = 0, | ||
477 | .want_minver = 0, | ||
478 | .want_maxver = 0, | ||
479 | }, | ||
480 | { | ||
481 | .ssl_method = TLS_method, | ||
482 | .minver = 0, | ||
483 | .maxver = 0x0305, | ||
484 | .want_minver = TLS1_VERSION, | ||
485 | .want_maxver = TLS1_2_VERSION, | ||
486 | }, | ||
487 | { | ||
488 | .ssl_method = TLS_method, | ||
489 | .minver = 0, | ||
490 | .maxver = TLS1_1_VERSION, | ||
491 | .want_minver = TLS1_VERSION, | ||
492 | .want_maxver = TLS1_1_VERSION, | ||
493 | }, | ||
494 | { | ||
495 | .ssl_method = TLS_method, | ||
496 | .minver = 0, | ||
497 | .maxver = TLS1_VERSION, | ||
498 | .want_minver = TLS1_VERSION, | ||
499 | .want_maxver = TLS1_VERSION, | ||
500 | }, | ||
501 | { | ||
502 | .ssl_method = TLS_method, | ||
503 | .minver = 0, | ||
504 | .maxver = 0x0300, | ||
505 | .want_minver = 0, | ||
506 | .want_maxver = 0, | ||
507 | }, | ||
508 | { | ||
509 | .ssl_method = TLS_method, | ||
510 | .minver = TLS1_2_VERSION, | ||
511 | .maxver = TLS1_1_VERSION, | ||
512 | .want_minver = TLS1_2_VERSION, | ||
513 | .want_maxver = 0, | ||
514 | }, | ||
515 | { | ||
516 | .ssl_method = TLSv1_1_method, | ||
517 | .minver = 0, | ||
518 | .maxver = 0, | ||
519 | .want_minver = TLS1_1_VERSION, | ||
520 | .want_maxver = TLS1_1_VERSION, | ||
521 | }, | ||
522 | { | ||
523 | .ssl_method = TLSv1_1_method, | ||
524 | .minver = TLS1_VERSION, | ||
525 | .maxver = TLS1_2_VERSION, | ||
526 | .want_minver = TLS1_1_VERSION, | ||
527 | .want_maxver = TLS1_1_VERSION, | ||
528 | }, | ||
529 | { | ||
530 | .ssl_method = TLSv1_1_method, | ||
531 | .minver = TLS1_2_VERSION, | ||
532 | .maxver = 0, | ||
533 | .want_minver = 0, | ||
534 | .want_maxver = 0, | ||
535 | }, | ||
536 | { | ||
537 | .ssl_method = TLSv1_1_method, | ||
538 | .minver = 0, | ||
539 | .maxver = TLS1_VERSION, | ||
540 | .want_minver = 0, | ||
541 | .want_maxver = 0, | ||
542 | }, | ||
543 | { | ||
544 | .ssl_method = DTLSv1_method, | ||
545 | .minver = 0, | ||
546 | .maxver = 0, | ||
547 | .want_minver = DTLS1_VERSION, | ||
548 | .want_maxver = DTLS1_VERSION, | ||
549 | }, | ||
550 | { | ||
551 | .ssl_method = DTLSv1_method, | ||
552 | .minver = DTLS1_VERSION, | ||
553 | .maxver = 0, | ||
554 | .want_minver = DTLS1_VERSION, | ||
555 | .want_maxver = DTLS1_VERSION, | ||
556 | }, | ||
557 | { | ||
558 | .ssl_method = DTLSv1_method, | ||
559 | .minver = 0, | ||
560 | .maxver = DTLS1_VERSION, | ||
561 | .want_minver = DTLS1_VERSION, | ||
562 | .want_maxver = DTLS1_VERSION, | ||
563 | }, | ||
564 | { | ||
565 | .ssl_method = DTLSv1_method, | ||
566 | .minver = TLS1_VERSION, | ||
567 | .maxver = TLS1_2_VERSION, | ||
568 | .want_minver = 0, | ||
569 | .want_maxver = 0, | ||
570 | }, | ||
571 | }; | ||
572 | |||
573 | #define N_MIN_MAX_VERSION_TESTS \ | ||
574 | (sizeof(min_max_version_tests) / sizeof(*min_max_version_tests)) | ||
575 | |||
576 | static int | ||
577 | test_ssl_min_max_version(void) | ||
578 | { | ||
579 | struct min_max_version_test *mmvt; | ||
580 | SSL_CTX *ssl_ctx = NULL; | ||
581 | SSL *ssl = NULL; | ||
582 | int failed = 0; | ||
583 | size_t i; | ||
584 | |||
585 | failed = 0; | ||
586 | |||
587 | for (i = 0; i < N_SHARED_VERSION_TESTS; i++) { | ||
588 | mmvt = &min_max_version_tests[i]; | ||
589 | |||
590 | if ((ssl_ctx = SSL_CTX_new(mmvt->ssl_method())) == NULL) { | ||
591 | fprintf(stderr, "SSL_CTX_new() returned NULL\n"); | ||
592 | return 1; | ||
593 | } | ||
594 | |||
595 | if (SSL_CTX_set_min_proto_version(ssl_ctx, mmvt->minver) != 1) { | ||
596 | if (mmvt->want_minver != 0) { | ||
597 | fprintf(stderr, "FAIL: test %zu - failed to set " | ||
598 | "SSL_CTX min version\n", i); | ||
599 | failed++; | ||
600 | } | ||
601 | goto next; | ||
602 | } | ||
603 | if (SSL_CTX_set_max_proto_version(ssl_ctx, mmvt->maxver) != 1) { | ||
604 | if (mmvt->want_maxver != 0) { | ||
605 | fprintf(stderr, "FAIL: test %zu - failed to set " | ||
606 | "SSL_CTX min version\n", i); | ||
607 | failed++; | ||
608 | } | ||
609 | goto next; | ||
610 | } | ||
611 | |||
612 | if (mmvt->want_minver == 0) { | ||
613 | fprintf(stderr, "FAIL: test %zu - successfully set " | ||
614 | "SSL_CTX min version, should have failed\n", i); | ||
615 | goto next; | ||
616 | } | ||
617 | if (mmvt->want_maxver == 0) { | ||
618 | fprintf(stderr, "FAIL: test %zu - successfully set " | ||
619 | "SSL_CTX max version, should have failed\n", i); | ||
620 | goto next; | ||
621 | } | ||
622 | |||
623 | if (ssl_ctx->internal->min_version != mmvt->want_minver) { | ||
624 | fprintf(stderr, "FAIL: test %zu - got SSL_CTX min " | ||
625 | "version 0x%x, want 0x%x\n", i, | ||
626 | ssl_ctx->internal->min_version, mmvt->want_minver); | ||
627 | goto next; | ||
628 | } | ||
629 | if (ssl_ctx->internal->max_version != mmvt->want_maxver) { | ||
630 | fprintf(stderr, "FAIL: test %zu - got SSL_CTX max " | ||
631 | "version 0x%x, want 0x%x\n", i, | ||
632 | ssl_ctx->internal->max_version, mmvt->want_maxver); | ||
633 | goto next; | ||
634 | } | ||
635 | |||
636 | if ((ssl = SSL_new(ssl_ctx)) == NULL) { | ||
637 | fprintf(stderr, "SSL_new() returned NULL\n"); | ||
638 | return 1; | ||
639 | } | ||
640 | |||
641 | if (ssl->internal->min_version != mmvt->want_minver) { | ||
642 | fprintf(stderr, "FAIL: test %zu - initial SSL min " | ||
643 | "version 0x%x, want 0x%x\n", i, | ||
644 | ssl_ctx->internal->min_version, mmvt->want_minver); | ||
645 | goto next; | ||
646 | } | ||
647 | if (ssl->internal->max_version != mmvt->want_maxver) { | ||
648 | fprintf(stderr, "FAIL: test %zu - initial SSL max " | ||
649 | "version 0x%x, want 0x%x\n", i, | ||
650 | ssl_ctx->internal->max_version, mmvt->want_maxver); | ||
651 | goto next; | ||
652 | } | ||
653 | |||
654 | if (SSL_set_min_proto_version(ssl, mmvt->minver) != 1) { | ||
655 | if (mmvt->want_minver != 0) { | ||
656 | fprintf(stderr, "FAIL: test %zu - failed to set " | ||
657 | "SSL min version\n", i); | ||
658 | failed++; | ||
659 | } | ||
660 | goto next; | ||
661 | } | ||
662 | if (SSL_set_max_proto_version(ssl, mmvt->maxver) != 1) { | ||
663 | if (mmvt->want_maxver != 0) { | ||
664 | fprintf(stderr, "FAIL: test %zu - failed to set " | ||
665 | "SSL min version\n", i); | ||
666 | failed++; | ||
667 | } | ||
668 | goto next; | ||
669 | } | ||
670 | |||
671 | if (mmvt->want_minver == 0) { | ||
672 | fprintf(stderr, "FAIL: test %zu - successfully set SSL " | ||
673 | "min version, should have failed\n", i); | ||
674 | goto next; | ||
675 | } | ||
676 | if (mmvt->want_maxver == 0) { | ||
677 | fprintf(stderr, "FAIL: test %zu - successfully set SSL " | ||
678 | "max version, should have failed\n", i); | ||
679 | goto next; | ||
680 | } | ||
681 | |||
682 | if (ssl->internal->min_version != mmvt->want_minver) { | ||
683 | fprintf(stderr, "FAIL: test %zu - got SSL min " | ||
684 | "version 0x%x, want 0x%x\n", i, | ||
685 | ssl_ctx->internal->min_version, mmvt->want_minver); | ||
686 | goto next; | ||
687 | } | ||
688 | if (ssl->internal->max_version != mmvt->want_maxver) { | ||
689 | fprintf(stderr, "FAIL: test %zu - got SSL max " | ||
690 | "version 0x%x, want 0x%x\n", i, | ||
691 | ssl->internal->max_version, mmvt->want_maxver); | ||
692 | goto next; | ||
693 | } | ||
694 | |||
695 | next: | ||
696 | SSL_CTX_free(ssl_ctx); | ||
697 | SSL_free(ssl); | ||
698 | |||
699 | ssl_ctx = NULL; | ||
700 | ssl = NULL; | ||
701 | } | ||
702 | |||
703 | return (failed); | ||
704 | } | ||
705 | |||
415 | int | 706 | int |
416 | main(int argc, char **argv) | 707 | main(int argc, char **argv) |
417 | { | 708 | { |
@@ -421,6 +712,7 @@ main(int argc, char **argv) | |||
421 | 712 | ||
422 | failed |= test_ssl_enabled_version_range(); | 713 | failed |= test_ssl_enabled_version_range(); |
423 | failed |= test_ssl_max_shared_version(); | 714 | failed |= test_ssl_max_shared_version(); |
715 | failed |= test_ssl_min_max_version(); | ||
424 | 716 | ||
425 | if (failed == 0) | 717 | if (failed == 0) |
426 | printf("PASS %s\n", __FILE__); | 718 | printf("PASS %s\n", __FILE__); |