summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/x509/x509_addr.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/lib/libcrypto/x509/x509_addr.c b/src/lib/libcrypto/x509/x509_addr.c
index b4ee92a14b..ef2f7e0889 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.94 2025/05/10 05:54:39 tb Exp $ */ 1/* $OpenBSD: x509_addr.c,v 1.95 2026/04/26 17:58:58 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").
@@ -961,18 +961,22 @@ trim_end_u8(CBS *cbs, uint8_t trim)
961 * RFC 3779, 2.1.2. 961 * RFC 3779, 2.1.2.
962 */ 962 */
963static int 963static int
964make_addressRange(IPAddressOrRange **out_aor, uint8_t *min, uint8_t *max, 964make_addressRange(IPAddressOrRange **out_aor, uint8_t *min, uint8_t *in_max,
965 uint32_t afi, int length) 965 uint32_t afi, int length)
966{ 966{
967 IPAddressOrRange *aor = NULL; 967 IPAddressOrRange *aor = NULL;
968 IPAddressRange *range; 968 IPAddressRange *range;
969 int prefix_len; 969 int prefix_len;
970 CBS cbs; 970 CBS cbs;
971 CBB cbb;
972 uint8_t max[ADDR_RAW_BUF_LEN];
971 size_t max_len, min_len; 973 size_t max_len, min_len;
972 uint8_t unused_bits_min, unused_bits_max; 974 uint8_t unused_bits_min, unused_bits_max;
973 uint8_t octet; 975 uint8_t octet;
974 976
975 if (memcmp(min, max, length) > 0) 977 memset(&cbb, 0, sizeof(cbb));
978
979 if (memcmp(min, in_max, length) > 0)
976 goto err; 980 goto err;
977 981
978 /* 982 /*
@@ -980,7 +984,7 @@ make_addressRange(IPAddressOrRange **out_aor, uint8_t *min, uint8_t *max,
980 * must be encoded as a prefix. 984 * must be encoded as a prefix.
981 */ 985 */
982 986
983 if ((prefix_len = range_should_be_prefix(min, max, length)) >= 0) 987 if ((prefix_len = range_should_be_prefix(min, in_max, length)) >= 0)
984 return make_addressPrefix(out_aor, min, afi, prefix_len); 988 return make_addressPrefix(out_aor, min, afi, prefix_len);
985 989
986 /* 990 /*
@@ -1008,18 +1012,30 @@ make_addressRange(IPAddressOrRange **out_aor, uint8_t *min, uint8_t *max,
1008 * the trailing ones of the last octet. 1012 * the trailing ones of the last octet.
1009 */ 1013 */
1010 1014
1011 CBS_init(&cbs, max, length); 1015 CBS_init(&cbs, in_max, length);
1016 if (!CBB_init_fixed(&cbb, max, sizeof(max)))
1017 goto err;
1012 1018
1013 if (!trim_end_u8(&cbs, 0xff)) 1019 if (!trim_end_u8(&cbs, 0xff))
1014 goto err; 1020 goto err;
1015 1021
1016 unused_bits_max = 0; 1022 unused_bits_max = 0;
1017 if ((max_len = CBS_len(&cbs)) > 0) { 1023 if ((max_len = CBS_len(&cbs)) > 0) {
1018 if (!CBS_peek_last_u8(&cbs, &octet)) 1024 if (!CBS_get_last_u8(&cbs, &octet))
1019 goto err; 1025 goto err;
1020 1026
1021 unused_bits_max = count_trailing_zeroes(octet + 1); 1027 unused_bits_max = count_trailing_zeroes(octet + 1);
1028 octet &= 0xff << unused_bits_max;
1029 }
1030
1031 if (!CBB_add_bytes(&cbb, CBS_data(&cbs), CBS_len(&cbs)))
1032 goto err;
1033 if (max_len > 0) {
1034 if (!CBB_add_u8(&cbb, octet))
1035 goto err;
1022 } 1036 }
1037 if (!CBB_finish(&cbb, NULL, NULL))
1038 goto err;
1023 1039
1024 /* 1040 /*
1025 * Populate IPAddressOrRange. 1041 * Populate IPAddressOrRange.
@@ -1048,6 +1064,7 @@ make_addressRange(IPAddressOrRange **out_aor, uint8_t *min, uint8_t *max,
1048 return 1; 1064 return 1;
1049 1065
1050 err: 1066 err:
1067 CBB_cleanup(&cbb);
1051 IPAddressOrRange_free(aor); 1068 IPAddressOrRange_free(aor);
1052 return 0; 1069 return 0;
1053} 1070}