diff options
Diffstat (limited to 'openssl/trunk/crypto/x509v3/v3_addr.c')
-rw-r--r-- | openssl/trunk/crypto/x509v3/v3_addr.c | 118 |
1 files changed, 60 insertions, 58 deletions
diff --git a/openssl/trunk/crypto/x509v3/v3_addr.c b/openssl/trunk/crypto/x509v3/v3_addr.c index 880b5d8c..abb59d78 100644 --- a/openssl/trunk/crypto/x509v3/v3_addr.c +++ b/openssl/trunk/crypto/x509v3/v3_addr.c @@ -51,7 +51,8 @@ ASN1_SEQUENCE(IPAddressFamily) = { } ASN1_SEQUENCE_END(IPAddressFamily) ASN1_ITEM_TEMPLATE(IPAddrBlocks) = - ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, IPAddrBlocks, IPAddressFamily) + ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, + IPAddrBlocks, IPAddressFamily) ASN1_ITEM_TEMPLATE_END(IPAddrBlocks) IMPLEMENT_ASN1_FUNCTIONS(IPAddressRange) @@ -84,79 +85,80 @@ static const char *safi_table[] = { #define safi_index(x) \ (x > 0 && x < sizeof(safi_table)/sizeof(*safi_table) ? x : 0) -static int bitstring_to_address(unsigned char *addr, int len, unsigned char fill, ASN1_BIT_STRING *bs) +static int i2r_address(BIO *out, int afi, unsigned char fill, + ASN1_BIT_STRING *bs) { - if (bs->length > len) - return 0; - memset(addr, fill, len); - if (bs->length == 0) - return 1; - memcpy(addr, bs->data, bs->length); - if ((bs->flags & 7) != 0) - addr[bs->length - 1] |= fill >> (8 - (bs->flags & 7)); + if (afi_index(afi)) { + /* + * Known AFI, we can fill and format this properly. + */ + int length = afi_table[afi_index(afi)].length; + int af = afi_table[afi_index(afi)].af; + unsigned char addr[16]; + char buf[48]; + + assert(sizeof(addr) >= length); + if (bs->length > length) + return 0; + memset(addr, fill, length); + if (bs->length > 0) { + memcpy(addr, bs->data, bs->length); + if ((bs->flags & 7) != 0) + addr[bs->length - 1] |= fill >> (8 - (bs->flags & 7)); + } + if (inet_ntop(af, addr, buf, sizeof(buf)) == NULL) + return 0; + BIO_puts(out, buf); + } else { + /* + * Unknown AFI, dump as hex. + */ + int i; + for (i = 0; i < bs->length; i++) + BIO_printf(out, "%s%02x", (i > 0 ? ":" : ""), bs->data[i]); + BIO_printf(out, "[%d]", bs->flags & 7); + } return 1; } -static void i2r_unknown_afi_bitstring(BIO *out, ASN1_BIT_STRING *bs) +static int i2r_IPAddressOrRange(BIO *out, int indent, + IPAddressOrRanges *aors, int afi) { int i; - for (i = 0; i < bs->length; i++) { - if (i > 0) - BIO_puts(out, ":"); - BIO_printf(out, "%02x", bs->data[i]); - } - BIO_printf(out, "[%d]", bs->flags & 7); -} - -static int i2r_IPAddressOrRange(BIO *out, int indent, IPAddressOrRange *aor, int afi) -{ - int af = afi_table[afi_index(afi)].af, length = afi_table[afi_index(afi)].length; - unsigned char addr[16]; - char buf[48]; - - assert(sizeof(addr) >= length); - BIO_printf(out, "%*s", indent, ""); - switch (aor->type) { - case IPAddressOrRange_addressPrefix: - if (afi_index(afi)) { - if (!bitstring_to_address(addr, length, 0x00, aor->addressPrefix) || - inet_ntop(af, addr, buf, sizeof(buf)) == NULL) + for (i = 0; i < sk_IPAddressOrRange_num(aors); i++) { + IPAddressOrRange *aor = sk_IPAddressOrRange_num(aors, i); + BIO_printf(out, "%*s", indent, ""); + switch (aor->type) { + case IPAddressOrRange_addressPrefix: + if (!i2r_address(out, afi, 0x00, aor->addressPrefix)) return 0; - BIO_printf(out, "%s/%d\n", buf, - aor->addressPrefix->length * 8 - (aor->addressPrefix->flags & 7)); - } else { - i2r_unknown_afi_bitstring(out, aor->addressPrefix); - BIO_puts(out, "\n"); - } - return 1; - case IPAddressOrRange_addressRange: - if (afi_index(afi)) { - if (!bitstring_to_address(addr, length, 0x00, aor->addressRange->min) || - inet_ntop(af, addr, buf, sizeof(buf)) == NULL) - return 0; - BIO_puts(out, buf); - if (!bitstring_to_address(addr, length, 0xFF, aor->addressRange->max) || - inet_ntop(af, addr, buf, sizeof(buf)) == NULL) + BIO_printf(out, "/%d\n", + aor->addressPrefix->length * 8 - + (aor->addressPrefix->flags & 7)); + continue; + case IPAddressOrRange_addressRange: + if (!i2r_address(out, afi, 0x00, aor->addressRange->min)) return 0; - BIO_printf(out, "-%s\n", buf); - } else { - i2r_unknown_afi_bitstring(out, aor->addressRange->min); BIO_puts(out, "-"); - i2r_unknown_afi_bitstring(out, aor->addressRange->max); + if (!i2r_address(out, afi, 0xFF, aor->addressRange->max)) + return 0; BIO_puts(out, "\n"); - } - return 1; + continue; + } } + return 1; } -static int i2r_IPAddrBlocks(X509V3_EXT_METHOD *method, void *ext, BIO *out, int indent) +static int i2r_IPAddrBlocks(X509V3_EXT_METHOD *method, + void *ext, BIO *out, int indent) { int i, j; for (i = 0; i < sk_IPAddrBlocks_num(ext); i++) { IPAddressFamily *f = sk_IPAddrBlocks_value(ext, i); int afi = (f->addressFamily->data[0] << 8) | f->addressFamily->data[1]; if (afi_index(afi)) - BIO_printf(out, "%*s%s", indent, "", afi_table[afi_index(afi)].description); + BIO_printf(out, "%*s%s", indent, "", + afi_table[afi_index(afi)].description); else BIO_printf(out, "%*sUnknown AFI %i", indent, "", afi); if (f->addressFamily->length > 2) { @@ -172,9 +174,9 @@ static int i2r_IPAddrBlocks(X509V3_EXT_METHOD *method, void *ext, BIO *out, int break; case IPAddressChoice_addressesOrRanges: BIO_puts(out, ":\n"); - for (j = 0; j < sk_IPAddressOrRange_num(f->ipAddressChoice->u.asIdsOrRanges); j++) - if (!i2r_IPAddressOrRange(out, indent + 2, sk_IPAddressOrRange_num(f->ipAddressChoice->u.asIdsOrRanges, j), afi)) - return 0; + if (!i2r_IPAddressOrRanges(out, indent + 2, + f->ipAddressChoice->u.asIdsOrRanges, afi)) + return 0; break; } } |