summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2021-12-28 16:10:47 +0000
committertb <>2021-12-28 16:10:47 +0000
commit10bf2b260818e12ba8063556da5d7b74dde85775 (patch)
tree7a06f27d725169b1d0b56f1bc868a9152f89438e /src
parentaebd8f6e8a2e74237ea4e3ecf83287e5430484d5 (diff)
downloadopenbsd-10bf2b260818e12ba8063556da5d7b74dde85775.tar.gz
openbsd-10bf2b260818e12ba8063556da5d7b74dde85775.tar.bz2
openbsd-10bf2b260818e12ba8063556da5d7b74dde85775.zip
Convert make_IPAddressFamily to CBS/CBB
The IPAddrBlocks type, which represents the IPAddrBlocks extension, should have exactly one IPAddressFamily per AFI+SAFI combination to be delegated. make_IPAddressFamily() first builds up a search key from the afi and safi arguments and then looks for an existing IPAddressFamily with that key in the IPAddrBlocks that was passed in. It returns that if it finds it or allocates and adds a new one. This diff preserves the current behavior that the afi and *safi arguments are truncated to 2 and 1 bytes, respectively. This may change in the future. ok inoguchi jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/x509/x509_addr.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/lib/libcrypto/x509/x509_addr.c b/src/lib/libcrypto/x509/x509_addr.c
index a0c73bdee5..244eea1f23 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.31 2021/12/28 16:05:23 tb Exp $ */ 1/* $OpenBSD: x509_addr.c,v 1.32 2021/12/28 16:10:47 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").
@@ -764,25 +764,32 @@ static IPAddressFamily *
764make_IPAddressFamily(IPAddrBlocks *addr, const unsigned afi, 764make_IPAddressFamily(IPAddrBlocks *addr, const unsigned afi,
765 const unsigned *safi) 765 const unsigned *safi)
766{ 766{
767 IPAddressFamily *f; 767 IPAddressFamily *f = NULL;
768 unsigned char key[3]; 768 CBB cbb;
769 int keylen; 769 CBS cbs;
770 uint8_t *key = NULL;
771 size_t keylen;
770 int i; 772 int i;
771 773
772 key[0] = (afi >> 8) & 0xFF; 774 if (!CBB_init(&cbb, 0))
773 key[1] = afi & 0xFF; 775 goto err;
776
777 if (!CBB_add_u16(&cbb, afi))
778 goto err;
774 if (safi != NULL) { 779 if (safi != NULL) {
775 key[2] = *safi & 0xFF; 780 if (!CBB_add_u8(&cbb, *safi))
776 keylen = 3; 781 goto err;
777 } else {
778 keylen = 2;
779 } 782 }
780 783
784 if (!CBB_finish(&cbb, &key, &keylen))
785 goto err;
786
781 for (i = 0; i < sk_IPAddressFamily_num(addr); i++) { 787 for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
782 f = sk_IPAddressFamily_value(addr, i); 788 f = sk_IPAddressFamily_value(addr, i);
783 if (f->addressFamily->length == keylen && 789
784 !memcmp(f->addressFamily->data, key, keylen)) 790 CBS_init(&cbs, f->addressFamily->data, f->addressFamily->length);
785 return f; 791 if (CBS_mem_equal(&cbs, key, keylen))
792 goto done;
786 } 793 }
787 794
788 if ((f = IPAddressFamily_new()) == NULL) 795 if ((f = IPAddressFamily_new()) == NULL)
@@ -792,10 +799,16 @@ make_IPAddressFamily(IPAddrBlocks *addr, const unsigned afi,
792 if (!sk_IPAddressFamily_push(addr, f)) 799 if (!sk_IPAddressFamily_push(addr, f))
793 goto err; 800 goto err;
794 801
802 done:
803 free(key);
804
795 return f; 805 return f;
796 806
797 err: 807 err:
808 CBB_cleanup(&cbb);
809 free(key);
798 IPAddressFamily_free(f); 810 IPAddressFamily_free(f);
811
799 return NULL; 812 return NULL;
800} 813}
801 814