diff options
Diffstat (limited to 'openssl/trunk/crypto/x509v3/v3_addr.c')
-rw-r--r-- | openssl/trunk/crypto/x509v3/v3_addr.c | 88 |
1 files changed, 83 insertions, 5 deletions
diff --git a/openssl/trunk/crypto/x509v3/v3_addr.c b/openssl/trunk/crypto/x509v3/v3_addr.c index 58ec113d..8ca5cb32 100644 --- a/openssl/trunk/crypto/x509v3/v3_addr.c +++ b/openssl/trunk/crypto/x509v3/v3_addr.c @@ -23,6 +23,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include <assert.h> #include "cryptlib.h" #include <openssl/conf.h> @@ -477,7 +478,6 @@ static void *v2i_IPAddrBlocks(struct v3_ext_method *method, STACK_OF(CONF_VALUE) *values) { IPAddrBlocks *addr = NULL; - char *s; int i; if ((addr = sk_IPAddressFamily_new(IPAddressFamily_cmp)) == NULL) { @@ -487,12 +487,90 @@ static void *v2i_IPAddrBlocks(struct v3_ext_method *method, for (i = 0; i < sk_CONF_VALUE_num(values); i++) { CONF_VALUE *val = sk_CONF_VALUE_value(values, i); + unsigned afi, safi, prefixlen, has_safi = 0; + unsigned char min[ADDR_RAW_BUF_LEN], max[ADDR_RAW_BUF_LEN]; + char *s = val->value; + int af; + + if ( !strcmp(val->name, "ipv4")) { + afi = IANA_AFI_IPV4; + } else if (!strcmp(val->name, "ipv6")) { + afi = IANA_AFI_IPV6; + } else if (!strcmp(val->name, "ipv4-safi")) { + afi = IANA_AFI_IPV4; + has_safi = 1; + } else if (!strcmp(val->name, "ipv6-safi")) { + afi = IANA_AFI_IPV6; + has_safi = 1; + } else { + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_EXTENSION_NAME_ERROR); + X509V3_conf_err(val); + goto err; + } - /* - * Parsing stuff itself goes here. - */ + if (has_safi) { + safi = strtoul(val->value, &s, 0); + s += strspn(s, " \t"); + if (safi > 0xFF || *s++ != ':') { + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_EXTENSION_VALUE_ERROR); + X509V3_conf_err(val); + goto err; + } + s += strspn(s, " \t"); + } -#error not finished + if (!strcmp(s, "inherit")) { + if (addr_add_inherit(addr, afi, has_safi, safi)) + continue; + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_INVALID_INHERITANCE); + X509V3_conf_err(val); + goto err; + } + + switch (afi) { + case IANA_AFI_IPV4: + af = AF_INET; + break; + case IANA_AFI_IPV6: + af = AF_INET6; + break; + } + +#warning some of the following errors might be memory, not config + + if (inet_pton(af, s, min) != 1) { + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_EXTENSION_VALUE_ERROR); + X509V3_conf_err(val); + goto err; + } + + if ((s = strpbrk(s, "-/")) == NULL) { + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_EXTENSION_VALUE_ERROR); + X509V3_conf_err(val); + goto err; + } + + switch (*s++) { + case '/': + prefixlen = strtoul(s, &s, 10); + if (*(s + strspn(s, " \t")) != '\0' || + !addr_add_prefix(addr, afi, has_safi, safi, min, prefixlen)) { + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_EXTENSION_VALUE_ERROR); + X509V3_conf_err(val); + goto err; + } + break; + case '-': + s += strspn(s, " \t"); + if (inet_pton(af, s, max) != 1 || + *(s + strspn(s, " \t")) != '\0' || + !addr_add_prefix(addr, afi, has_safi, safi, min, max)) { + X509V3err(X509V3_F_V2I_IPAddrBlocks, X509V3_R_EXTENSION_VALUE_ERROR); + X509V3_conf_err(val); + goto err; + } + break; + } } /* |