diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/regress/lib/libcrypto/x509/x509_extensions_test.c | 266 |
1 files changed, 265 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/x509/x509_extensions_test.c b/src/regress/lib/libcrypto/x509/x509_extensions_test.c index 9005333fe7..2961b0612b 100644 --- a/src/regress/lib/libcrypto/x509/x509_extensions_test.c +++ b/src/regress/lib/libcrypto/x509/x509_extensions_test.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_extensions_test.c,v 1.2 2024/05/28 15:42:09 tb Exp $ */ | 1 | /* $OpenBSD: x509_extensions_test.c,v 1.3 2024/06/17 05:04:54 tb Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2024 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2024 Theo Buehler <tb@openbsd.org> |
@@ -27,6 +27,9 @@ | |||
27 | #define ASN1_BOOLEAN_TRUE 0xff | 27 | #define ASN1_BOOLEAN_TRUE 0xff |
28 | #define ASN1_BOOLEAN_FALSE 0x00 | 28 | #define ASN1_BOOLEAN_FALSE 0x00 |
29 | 29 | ||
30 | #define X509V3_EXT_CRITICAL 1 | ||
31 | #define X509V3_EXT_NONCRITICAL 0 | ||
32 | |||
30 | static BASIC_CONSTRAINTS * | 33 | static BASIC_CONSTRAINTS * |
31 | create_basic_constraints(int ca) | 34 | create_basic_constraints(int ca) |
32 | { | 35 | { |
@@ -40,6 +43,20 @@ create_basic_constraints(int ca) | |||
40 | return bc; | 43 | return bc; |
41 | } | 44 | } |
42 | 45 | ||
46 | static X509_EXTENSION * | ||
47 | ext_create_basic_constraints(int ca, int critical) | ||
48 | { | ||
49 | X509_EXTENSION *ext; | ||
50 | BASIC_CONSTRAINTS *bc; | ||
51 | |||
52 | bc = create_basic_constraints(ca); | ||
53 | if ((ext = X509V3_EXT_i2d(NID_basic_constraints, critical, bc)) == NULL) | ||
54 | errx(1, "X509V3_EXT_i2d"); | ||
55 | BASIC_CONSTRAINTS_free(bc); | ||
56 | |||
57 | return ext; | ||
58 | } | ||
59 | |||
43 | static int | 60 | static int |
44 | test_x509v3_add1_i2d_empty_stack(STACK_OF(X509_EXTENSION) **extensions) | 61 | test_x509v3_add1_i2d_empty_stack(STACK_OF(X509_EXTENSION) **extensions) |
45 | { | 62 | { |
@@ -644,12 +661,259 @@ test_x509v3_add1_i2d(void) | |||
644 | return failed; | 661 | return failed; |
645 | } | 662 | } |
646 | 663 | ||
664 | static int | ||
665 | test_x509v3_get_d2i_null(void) | ||
666 | { | ||
667 | X509_EXTENSION *ext; | ||
668 | int crit, idx; | ||
669 | int failed = 1; | ||
670 | |||
671 | if ((ext = X509V3_get_d2i(NULL, NID_undef, NULL, NULL)) != NULL) { | ||
672 | fprintf(stderr, "FAIL: %s: expected X509V3_get_d2i with three " | ||
673 | "NULL arguments to return NULL\n", __func__); | ||
674 | goto err; | ||
675 | } | ||
676 | |||
677 | idx = -5; | ||
678 | if (X509V3_get_d2i(NULL, NID_undef, &crit, &idx) != NULL) { | ||
679 | /* Leaks whatever garbage libcrypto decoded. What to do... */ | ||
680 | fprintf(stderr, "FAIL: %s: expected X509V3_get_d2i NULL stack" | ||
681 | "to return NULL\n", __func__); | ||
682 | goto err; | ||
683 | } | ||
684 | |||
685 | if (crit != -1 || idx != -1) { | ||
686 | fprintf(stderr, "FAIL: %s: crit: want: %d, got: %d; " | ||
687 | "idx: want: %d, got: %d\n", __func__, -1, crit, -1, idx); | ||
688 | goto err; | ||
689 | } | ||
690 | |||
691 | failed = 0; | ||
692 | |||
693 | err: | ||
694 | X509_EXTENSION_free(ext); | ||
695 | |||
696 | return failed; | ||
697 | } | ||
698 | |||
699 | static int | ||
700 | test_x509v3_get_d2i_multiple_basic_constraints(void) | ||
701 | { | ||
702 | STACK_OF(X509_EXTENSION) *exts = NULL; | ||
703 | ASN1_BIT_STRING *abs = NULL; | ||
704 | BASIC_CONSTRAINTS *bc = NULL; | ||
705 | X509_EXTENSION *ext; | ||
706 | int crit, idx; | ||
707 | int ca, nid; | ||
708 | int failed = 1; | ||
709 | |||
710 | /* | ||
711 | * Create extension stack containing three basic constraints extensions: | ||
712 | * 1. critical CA basic constraints, | ||
713 | * 2. non-critical CA basic constraints, | ||
714 | * 3. critical non-CA basic constraints. | ||
715 | */ | ||
716 | |||
717 | if ((exts = sk_X509_EXTENSION_new_null()) == NULL) | ||
718 | errx(1, "sk_X509_EXTENSION_new_null"); | ||
719 | |||
720 | ca = 1; | ||
721 | ext = ext_create_basic_constraints(ca, X509V3_EXT_CRITICAL); | ||
722 | |||
723 | if (sk_X509_EXTENSION_push(exts, ext) <= 0) | ||
724 | errx(1, "sk_X509_EXTENSION_push"); | ||
725 | ext = NULL; | ||
726 | |||
727 | ca = 1; | ||
728 | ext = ext_create_basic_constraints(ca, X509V3_EXT_NONCRITICAL); | ||
729 | |||
730 | if (sk_X509_EXTENSION_push(exts, ext) <= 0) | ||
731 | errx(1, "sk_X509_EXTENSION_push"); | ||
732 | ext = NULL; | ||
733 | |||
734 | ca = 0; | ||
735 | ext = ext_create_basic_constraints(ca, X509V3_EXT_CRITICAL); | ||
736 | |||
737 | if (sk_X509_EXTENSION_push(exts, ext) <= 0) | ||
738 | errx(1, "sk_X509_EXTENSION_push"); | ||
739 | ext = NULL; | ||
740 | |||
741 | /* | ||
742 | * There is no key usage in this stack, so we shouldn't find any. | ||
743 | */ | ||
744 | |||
745 | nid = NID_key_usage; | ||
746 | if ((abs = X509V3_get_d2i(exts, nid, &crit, NULL)) != NULL) { | ||
747 | fprintf(stderr, "FAIL: %s: found key usage extension\n", | ||
748 | __func__); | ||
749 | goto err; | ||
750 | } | ||
751 | if (crit != -1) { | ||
752 | fprintf(stderr, "FAIL: %s: key usage: crit: want %d, got %d\n", | ||
753 | __func__, -1, crit); | ||
754 | goto err; | ||
755 | } | ||
756 | |||
757 | /* | ||
758 | * If we pass no idx and look for basic constraints, | ||
759 | * we should fail with crit == -2. | ||
760 | */ | ||
761 | |||
762 | nid = NID_basic_constraints; | ||
763 | if ((bc = X509V3_get_d2i(exts, nid, &crit, NULL)) != NULL) { | ||
764 | fprintf(stderr, "FAIL: %s (NULL idx): did not expect to find " | ||
765 | "basic constraints\n", __func__); | ||
766 | goto err; | ||
767 | } | ||
768 | if (crit != -2) { | ||
769 | fprintf(stderr, "FAIL: %s: basic constraints, no idx: \n" | ||
770 | "crit: want %d, got %d\n", __func__, -2, crit); | ||
771 | goto err; | ||
772 | } | ||
773 | |||
774 | /* | ||
775 | * If we pass idx = -1 and look for basic constraints, we should find | ||
776 | * the first one: it is critical at idx = 0, with ca bit set to true. | ||
777 | */ | ||
778 | |||
779 | nid = NID_basic_constraints; | ||
780 | idx = -1; | ||
781 | if ((bc = X509V3_get_d2i(exts, nid, &crit, &idx)) == NULL) { | ||
782 | fprintf(stderr, "FAIL: %s (idx %d): expected to find" | ||
783 | "basic constraints\n", __func__, -1); | ||
784 | goto err; | ||
785 | } | ||
786 | if (crit != 1) { | ||
787 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
788 | "crit: want %d, got %d\n", __func__, -1, 1, crit); | ||
789 | goto err; | ||
790 | } | ||
791 | if (idx != 0) { | ||
792 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
793 | "idx: want %d, got %d\n", __func__, -1, 0, idx); | ||
794 | goto err; | ||
795 | } | ||
796 | if (bc->ca != ASN1_BOOLEAN_TRUE) { | ||
797 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
798 | "cA bit: want %x, got %x\n", __func__, -1, | ||
799 | ASN1_BOOLEAN_TRUE, bc->ca); | ||
800 | goto err; | ||
801 | } | ||
802 | BASIC_CONSTRAINTS_free(bc); | ||
803 | bc = NULL; | ||
804 | |||
805 | /* | ||
806 | * Now pass idx = 0 and look for basic constraints, we should find | ||
807 | * the second one: non-critical at idx = 1, with ca bit set to true. | ||
808 | */ | ||
809 | |||
810 | nid = NID_basic_constraints; | ||
811 | idx = 0; | ||
812 | if ((bc = X509V3_get_d2i(exts, nid, &crit, &idx)) == NULL) { | ||
813 | fprintf(stderr, "FAIL: %s (idx %d): expected to find" | ||
814 | "basic constraints\n", __func__, 0); | ||
815 | goto err; | ||
816 | } | ||
817 | if (crit != 0) { | ||
818 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
819 | "crit: want %d, got %d\n", __func__, 0, 0, crit); | ||
820 | goto err; | ||
821 | } | ||
822 | if (idx != 1) { | ||
823 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
824 | "idx: want %d, got %d\n", __func__, 0, 1, idx); | ||
825 | goto err; | ||
826 | } | ||
827 | if (bc->ca != ASN1_BOOLEAN_TRUE) { | ||
828 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
829 | "cA bit: want %x, got %x\n", __func__, 0, | ||
830 | ASN1_BOOLEAN_TRUE, bc->ca); | ||
831 | goto err; | ||
832 | } | ||
833 | BASIC_CONSTRAINTS_free(bc); | ||
834 | bc = NULL; | ||
835 | |||
836 | /* | ||
837 | * Now pass idx = 1 and look for basic constraints, we should find the | ||
838 | * third one: critical at idx = 2, with ca bit set to false. | ||
839 | */ | ||
840 | |||
841 | nid = NID_basic_constraints; | ||
842 | idx = 1; | ||
843 | if ((bc = X509V3_get_d2i(exts, nid, &crit, &idx)) == NULL) { | ||
844 | fprintf(stderr, "FAIL: %s (idx %d): expected to find" | ||
845 | "basic constraints\n", __func__, 1); | ||
846 | goto err; | ||
847 | } | ||
848 | if (crit != 1) { | ||
849 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
850 | "crit: want %d, got %d\n", __func__, 1, 0, crit); | ||
851 | goto err; | ||
852 | } | ||
853 | if (idx != 2) { | ||
854 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
855 | "idx: want %d, got %d\n", __func__, 1, 2, idx); | ||
856 | goto err; | ||
857 | } | ||
858 | if (bc->ca != ASN1_BOOLEAN_FALSE) { | ||
859 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
860 | "cA bit: want %x, got %x\n", __func__, 1, | ||
861 | ASN1_BOOLEAN_FALSE, bc->ca); | ||
862 | goto err; | ||
863 | } | ||
864 | BASIC_CONSTRAINTS_free(bc); | ||
865 | bc = NULL; | ||
866 | |||
867 | /* | ||
868 | * Finally, pass idx = 2 and we should find no basic constraints. | ||
869 | */ | ||
870 | |||
871 | nid = NID_basic_constraints; | ||
872 | idx = 2; | ||
873 | if ((bc = X509V3_get_d2i(exts, nid, &crit, &idx)) != NULL) { | ||
874 | fprintf(stderr, "FAIL: %s (idx %d): expected to find" | ||
875 | "no basic constraints\n", __func__, 2); | ||
876 | goto err; | ||
877 | } | ||
878 | if (crit != -1) { | ||
879 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
880 | "crit: want %d, got %d\n", __func__, 2, -1, crit); | ||
881 | goto err; | ||
882 | } | ||
883 | if (idx != -1) { | ||
884 | fprintf(stderr, "FAIL: %s: basic constraints (idx %d): " | ||
885 | "idx: want %d, got %d\n", __func__, 2, -1, idx); | ||
886 | goto err; | ||
887 | } | ||
888 | |||
889 | failed = 0; | ||
890 | |||
891 | err: | ||
892 | sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); | ||
893 | ASN1_BIT_STRING_free(abs); | ||
894 | BASIC_CONSTRAINTS_free(bc); | ||
895 | |||
896 | return failed; | ||
897 | } | ||
898 | |||
899 | static int | ||
900 | test_x509v3_get_d2i(void) | ||
901 | { | ||
902 | int failed = 0; | ||
903 | |||
904 | failed |= test_x509v3_get_d2i_null(); | ||
905 | failed |= test_x509v3_get_d2i_multiple_basic_constraints(); | ||
906 | |||
907 | return failed; | ||
908 | } | ||
909 | |||
647 | int | 910 | int |
648 | main(void) | 911 | main(void) |
649 | { | 912 | { |
650 | int failed = 0; | 913 | int failed = 0; |
651 | 914 | ||
652 | failed |= test_x509v3_add1_i2d(); | 915 | failed |= test_x509v3_add1_i2d(); |
916 | failed |= test_x509v3_get_d2i(); | ||
653 | 917 | ||
654 | return failed; | 918 | return failed; |
655 | } | 919 | } |