summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2017-05-06 20:39:03 +0000
committerjsing <>2017-05-06 20:39:03 +0000
commit4b07231945fb22f051b25555dae5b5f56398eee0 (patch)
tree8675fa48eb199ef6c57a362417d36a3f092b586c
parent792684dc457d44526f35586cb1671d67604bf5b1 (diff)
downloadopenbsd-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.c316
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[] = {
361static int 361static int
362test_ssl_max_shared_version(void) 362test_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
415struct 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
423static 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
576static int
577test_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
415int 706int
416main(int argc, char **argv) 707main(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__);