diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/x509/x509_addr.c | 119 |
1 files changed, 94 insertions, 25 deletions
diff --git a/src/lib/libcrypto/x509/x509_addr.c b/src/lib/libcrypto/x509/x509_addr.c index 038319087b..723890e436 100644 --- a/src/lib/libcrypto/x509/x509_addr.c +++ b/src/lib/libcrypto/x509/x509_addr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_addr.c,v 1.34 2021/12/28 16:26:53 tb Exp $ */ | 1 | /* $OpenBSD: x509_addr.c,v 1.35 2021/12/28 16:37:37 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Contributed to the OpenSSL Project by the American Registry for | 3 | * Contributed to the OpenSSL Project by the American Registry for |
4 | * Internet Numbers ("ARIN"). | 4 | * Internet Numbers ("ARIN"). |
@@ -78,6 +78,8 @@ | |||
78 | 78 | ||
79 | #ifndef OPENSSL_NO_RFC3779 | 79 | #ifndef OPENSSL_NO_RFC3779 |
80 | 80 | ||
81 | static int length_from_afi(const unsigned afi); | ||
82 | |||
81 | /* | 83 | /* |
82 | * OpenSSL ASN.1 template translation of RFC 3779 2.2.3. | 84 | * OpenSSL ASN.1 template translation of RFC 3779 2.2.3. |
83 | */ | 85 | */ |
@@ -309,6 +311,75 @@ IPAddressFamily_free(IPAddressFamily *a) | |||
309 | } | 311 | } |
310 | 312 | ||
311 | /* | 313 | /* |
314 | * Convenience accessors for IPAddressFamily. | ||
315 | */ | ||
316 | |||
317 | static int | ||
318 | IPAddressFamily_type(IPAddressFamily *f) | ||
319 | { | ||
320 | /* XXX - can f->ipAddressChoice == NULL actually happen? */ | ||
321 | if (f == NULL || f->ipAddressChoice == NULL) | ||
322 | return -1; | ||
323 | |||
324 | switch (f->ipAddressChoice->type) { | ||
325 | case IPAddressChoice_inherit: | ||
326 | case IPAddressChoice_addressesOrRanges: | ||
327 | return f->ipAddressChoice->type; | ||
328 | default: | ||
329 | return -1; | ||
330 | } | ||
331 | } | ||
332 | |||
333 | static IPAddressOrRanges * | ||
334 | IPAddressFamily_addressesOrRanges(IPAddressFamily *f) | ||
335 | { | ||
336 | if (IPAddressFamily_type(f) == IPAddressChoice_addressesOrRanges) | ||
337 | return f->ipAddressChoice->u.addressesOrRanges; | ||
338 | |||
339 | return NULL; | ||
340 | } | ||
341 | |||
342 | static ASN1_NULL * | ||
343 | IPAddressFamily_inheritance(IPAddressFamily *f) | ||
344 | { | ||
345 | if (IPAddressFamily_type(f) == IPAddressChoice_inherit) | ||
346 | return f->ipAddressChoice->u.inherit; | ||
347 | |||
348 | return NULL; | ||
349 | } | ||
350 | |||
351 | static int | ||
352 | IPAddressFamily_set_inheritance(IPAddressFamily *f) | ||
353 | { | ||
354 | if (IPAddressFamily_addressesOrRanges(f) != NULL) | ||
355 | return 0; | ||
356 | |||
357 | if (IPAddressFamily_inheritance(f) != NULL) | ||
358 | return 1; | ||
359 | |||
360 | if ((f->ipAddressChoice->u.inherit = ASN1_NULL_new()) == NULL) | ||
361 | return 0; | ||
362 | f->ipAddressChoice->type = IPAddressChoice_inherit; | ||
363 | |||
364 | return 1; | ||
365 | } | ||
366 | |||
367 | static int | ||
368 | IPAddressFamily_afi_length(const IPAddressFamily *f, int *out_length) | ||
369 | { | ||
370 | unsigned int afi; | ||
371 | |||
372 | *out_length = 0; | ||
373 | |||
374 | if ((afi = X509v3_addr_get_afi(f)) == 0) | ||
375 | return 0; | ||
376 | |||
377 | *out_length = length_from_afi(afi); | ||
378 | |||
379 | return 1; | ||
380 | } | ||
381 | |||
382 | /* | ||
312 | * How much buffer space do we need for a raw address? | 383 | * How much buffer space do we need for a raw address? |
313 | */ | 384 | */ |
314 | #define ADDR_RAW_BUF_LEN 16 | 385 | #define ADDR_RAW_BUF_LEN 16 |
@@ -532,14 +603,14 @@ i2r_IPAddrBlocks(const X509V3_EXT_METHOD *method, void *ext, BIO *out, | |||
532 | break; | 603 | break; |
533 | } | 604 | } |
534 | } | 605 | } |
535 | switch (f->ipAddressChoice->type) { | 606 | switch (IPAddressFamily_type(f)) { |
536 | case IPAddressChoice_inherit: | 607 | case IPAddressChoice_inherit: |
537 | BIO_puts(out, ": inherit\n"); | 608 | BIO_puts(out, ": inherit\n"); |
538 | break; | 609 | break; |
539 | case IPAddressChoice_addressesOrRanges: | 610 | case IPAddressChoice_addressesOrRanges: |
540 | BIO_puts(out, ":\n"); | 611 | BIO_puts(out, ":\n"); |
541 | if (!i2r_IPAddressOrRanges(out, indent + 2, | 612 | if (!i2r_IPAddressOrRanges(out, indent + 2, |
542 | f->ipAddressChoice->u.addressesOrRanges, afi)) | 613 | IPAddressFamily_addressesOrRanges(f), afi)) |
543 | return 0; | 614 | return 0; |
544 | break; | 615 | break; |
545 | } | 616 | } |
@@ -832,20 +903,12 @@ int | |||
832 | X509v3_addr_add_inherit(IPAddrBlocks *addr, const unsigned afi, | 903 | X509v3_addr_add_inherit(IPAddrBlocks *addr, const unsigned afi, |
833 | const unsigned *safi) | 904 | const unsigned *safi) |
834 | { | 905 | { |
835 | IPAddressFamily *f = make_IPAddressFamily(addr, afi, safi); | 906 | IPAddressFamily *f; |
836 | if (f == NULL || | 907 | |
837 | f->ipAddressChoice == NULL || | 908 | if ((f = make_IPAddressFamily(addr, afi, safi)) == NULL) |
838 | (f->ipAddressChoice->type == IPAddressChoice_addressesOrRanges && | ||
839 | f->ipAddressChoice->u.addressesOrRanges != NULL)) | ||
840 | return 0; | ||
841 | if (f->ipAddressChoice->type == IPAddressChoice_inherit && | ||
842 | f->ipAddressChoice->u.inherit != NULL) | ||
843 | return 1; | ||
844 | if (f->ipAddressChoice->u.inherit == NULL && | ||
845 | (f->ipAddressChoice->u.inherit = ASN1_NULL_new()) == NULL) | ||
846 | return 0; | 909 | return 0; |
847 | f->ipAddressChoice->type = IPAddressChoice_inherit; | 910 | |
848 | return 1; | 911 | return IPAddressFamily_set_inheritance(f); |
849 | } | 912 | } |
850 | 913 | ||
851 | /* | 914 | /* |
@@ -855,20 +918,21 @@ static IPAddressOrRanges * | |||
855 | make_prefix_or_range(IPAddrBlocks *addr, const unsigned afi, | 918 | make_prefix_or_range(IPAddrBlocks *addr, const unsigned afi, |
856 | const unsigned *safi) | 919 | const unsigned *safi) |
857 | { | 920 | { |
858 | IPAddressFamily *f = make_IPAddressFamily(addr, afi, safi); | 921 | IPAddressFamily *f; |
859 | IPAddressOrRanges *aors = NULL; | 922 | IPAddressOrRanges *aors = NULL; |
860 | 923 | ||
861 | if (f == NULL || | 924 | if ((f = make_IPAddressFamily(addr, afi, safi)) == NULL) |
862 | f->ipAddressChoice == NULL || | ||
863 | (f->ipAddressChoice->type == IPAddressChoice_inherit && | ||
864 | f->ipAddressChoice->u.inherit != NULL)) | ||
865 | return NULL; | 925 | return NULL; |
866 | if (f->ipAddressChoice->type == IPAddressChoice_addressesOrRanges) | 926 | |
867 | aors = f->ipAddressChoice->u.addressesOrRanges; | 927 | if (IPAddressFamily_inheritance(f) != NULL) |
868 | if (aors != NULL) | 928 | return NULL; |
929 | |||
930 | if ((aors = IPAddressFamily_addressesOrRanges(f)) != NULL) | ||
869 | return aors; | 931 | return aors; |
932 | |||
870 | if ((aors = sk_IPAddressOrRange_new_null()) == NULL) | 933 | if ((aors = sk_IPAddressOrRange_new_null()) == NULL) |
871 | return NULL; | 934 | return NULL; |
935 | |||
872 | switch (afi) { | 936 | switch (afi) { |
873 | case IANA_AFI_IPV4: | 937 | case IANA_AFI_IPV4: |
874 | sk_IPAddressOrRange_set_cmp_func(aors, v4IPAddressOrRange_cmp); | 938 | sk_IPAddressOrRange_set_cmp_func(aors, v4IPAddressOrRange_cmp); |
@@ -877,8 +941,10 @@ make_prefix_or_range(IPAddrBlocks *addr, const unsigned afi, | |||
877 | sk_IPAddressOrRange_set_cmp_func(aors, v6IPAddressOrRange_cmp); | 941 | sk_IPAddressOrRange_set_cmp_func(aors, v6IPAddressOrRange_cmp); |
878 | break; | 942 | break; |
879 | } | 943 | } |
944 | |||
880 | f->ipAddressChoice->type = IPAddressChoice_addressesOrRanges; | 945 | f->ipAddressChoice->type = IPAddressChoice_addressesOrRanges; |
881 | f->ipAddressChoice->u.addressesOrRanges = aors; | 946 | f->ipAddressChoice->u.addressesOrRanges = aors; |
947 | |||
882 | return aors; | 948 | return aors; |
883 | } | 949 | } |
884 | 950 | ||
@@ -1011,7 +1077,10 @@ X509v3_addr_is_canonical(IPAddrBlocks *addr) | |||
1011 | */ | 1077 | */ |
1012 | for (i = 0; i < sk_IPAddressFamily_num(addr); i++) { | 1078 | for (i = 0; i < sk_IPAddressFamily_num(addr); i++) { |
1013 | IPAddressFamily *f = sk_IPAddressFamily_value(addr, i); | 1079 | IPAddressFamily *f = sk_IPAddressFamily_value(addr, i); |
1014 | int length = length_from_afi(X509v3_addr_get_afi(f)); | 1080 | int length; |
1081 | |||
1082 | if (!IPAddressFamily_afi_length(f, &length)) | ||
1083 | return 0; | ||
1015 | 1084 | ||
1016 | /* | 1085 | /* |
1017 | * Inheritance is canonical. Anything other than inheritance | 1086 | * Inheritance is canonical. Anything other than inheritance |