aboutsummaryrefslogtreecommitdiff
path: root/openssl/trunk/crypto/x509v3/v3_addr.c
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2006-08-26 19:14:06 +0000
committerRob Austein <sra@hactrn.net>2006-08-26 19:14:06 +0000
commit52dacdd430e0b0d70ffabf33380b044b0132347a (patch)
treeb10079b095d4ef3975eb1b25805dc93d3b246852 /openssl/trunk/crypto/x509v3/v3_addr.c
parent99b382d77e50198e59869fbb9c3cb52f0bf79ff5 (diff)
Add inheritance and subset tests.
svn path=/openssl/README; revision=233
Diffstat (limited to 'openssl/trunk/crypto/x509v3/v3_addr.c')
-rw-r--r--openssl/trunk/crypto/x509v3/v3_addr.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/openssl/trunk/crypto/x509v3/v3_addr.c b/openssl/trunk/crypto/x509v3/v3_addr.c
index 70911805..78f60ed4 100644
--- a/openssl/trunk/crypto/x509v3/v3_addr.c
+++ b/openssl/trunk/crypto/x509v3/v3_addr.c
@@ -999,7 +999,7 @@ X509V3_EXT_METHOD v3_addr = {
/*
* Figure out whether extension sues inheritance.
*/
-static int addr_inherits(IPAddrBlocks *addr)
+int v3_addr_inherits(IPAddrBlocks *addr)
{
int i;
if (addr == NULL)
@@ -1012,7 +1012,6 @@ static int addr_inherits(IPAddrBlocks *addr)
return 0;
}
-
/*
* Figure out whether parent contains child.
*/
@@ -1050,6 +1049,29 @@ static int addr_contains(IPAddressOrRanges *parent,
}
/*
+ * Test whether a is a subset of b.
+ */
+int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b)
+{
+ int i;
+ if (a == NULL || a == b)
+ return 1;
+ if (b == NULL || v3_addr_inherits(a) || v3_addr_inherits(b))
+ return 0;
+ sk_IPAddressFamily_set_cmp_func(b, IPAddressFamily_cmp);
+ for (i = 0; i < sk_IPAddressFamily_num(a); i++) {
+ IPAddressFamily *fa = sk_IPAddressFamily_value(a, i);
+ int j = sk_IPAddressFamily_find(b, fa);
+ IPAddressFamily *fb = sk_IPAddressFamily_value(b, j);
+ if (!addr_contains(fb->ipAddressChoice->u.addressesOrRanges,
+ fa->ipAddressChoice->u.addressesOrRanges,
+ length_from_afi(afi_from_addressfamily(fb))))
+ return 0;
+ }
+ return 1;
+}
+
+/*
* Validation error handling via callback.
*/
#define validation_err(_err_) \
@@ -1186,7 +1208,7 @@ int v3_addr_validate_resource_set(STACK_OF(X509) *chain,
return 1;
if (chain == NULL || sk_X509_num(chain) == 0)
return 0;
- if (!allow_inheritance && addr_inherits(ext))
+ if (!allow_inheritance && v3_addr_inherits(ext))
return 0;
return v3_addr_validate_path_internal(NULL, chain, ext);
}