Fix hostname validation in the command-line tool to honour negative return values.
authorEmilia Kasper <emilia@openssl.org>
Thu, 5 Feb 2015 15:38:54 +0000 (16:38 +0100)
committerEmilia Kasper <emilia@openssl.org>
Tue, 10 Feb 2015 14:36:03 +0000 (15:36 +0100)
Specifically, an ASN.1 NumericString in the certificate CN will fail UTF-8 conversion
and result in a negative return value, which the "x509 -checkhost" command-line option
incorrectly interpreted as success.

Also update X509_check_host docs to reflect reality.

Thanks to Sean Burford (Google) for reporting this issue.

Reviewed-by: Richard Levitte <levitte@openssl.org>
(cherry picked from commit 0923e7df9eafec6db9c75405d7085ec8581f01bd)

apps/apps.c
crypto/x509v3/v3_utl.c
doc/crypto/X509_check_host.pod

index e6bb48f085d667bdb97491937da22a16401d6e78..ef5d087eb6200ce052ca110adfcac418ea421e89 100644 (file)
@@ -2775,7 +2775,7 @@ void print_cert_checks(BIO *bio, X509 *x,
         return;
     if (checkhost) {
         BIO_printf(bio, "Hostname %s does%s match certificate\n",
-                   checkhost, X509_check_host(x, checkhost, 0, 0, NULL)
+                   checkhost, X509_check_host(x, checkhost, 0, 0, NULL) == 1
                    ? "" : " NOT");
     }
 
index f65323be05405b5cd15c62d8674b5f7fc75d27f5..ed6099e120b2610e6a450022fe0c9ab51b43bb66 100644 (file)
@@ -901,8 +901,13 @@ static int do_check_string(ASN1_STRING *a, int cmp_type, equal_fn equal,
         int astrlen;
         unsigned char *astr;
         astrlen = ASN1_STRING_to_UTF8(&astr, a);
-        if (astrlen < 0)
+        if (astrlen < 0) {
+            /*
+             * -1 could be an internal malloc failure or a decoding error from
+             * malformed input; we can't distinguish.
+             */
             return -1;
+        }
         rv = equal(astr, astrlen, (unsigned char *)b, blen, flags);
         if (rv > 0 && peername)
             *peername = BUF_strndup((char *)astr, astrlen);
index f8b530df9b5615a3e63f7ca1858580089e462d55..0def17aac1c54a49f734c7ccc03f3b8977d568e6 100644 (file)
@@ -109,9 +109,12 @@ but would not match a peer certificate with a DNS name of
 =head1 RETURN VALUES
 
 The functions return 1 for a successful match, 0 for a failed match
-and -1 for an internal error: typically a memory allocation failure.
+and -1 for an internal error: typically a memory allocation failure
+or an ASN.1 decoding error.
 
-X509_check_ip_asc() can also return -2 if the IP address string is malformed.
+All functions can also return -2 if the input is malformed. For example,
+X509_check_host() returns -2 if the provided B<name> contains embedded
+NULs.
 
 =head1 NOTES