]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
TLS: Support longer X.509 serialNumber values
authorJouni Malinen <j@w1.fi>
Wed, 16 Dec 2015 23:41:45 +0000 (01:41 +0200)
committerJouni Malinen <j@w1.fi>
Wed, 16 Dec 2015 23:41:45 +0000 (01:41 +0200)
This extends the old support from 32 or 64 bit value to full 20 octets
maximum (RFC 5280, 4.1.2.2).

Signed-off-by: Jouni Malinen <j@w1.fi>
src/tls/x509v3.c
src/tls/x509v3.h

index ebb80bd243523745ee64356d614303b248ed2a74..9f39597994054e56622f486558a4113b71577172 100644 (file)
@@ -1401,21 +1401,23 @@ static int x509_parse_tbs_certificate(const u8 *buf, size_t len,
 
        /* serialNumber CertificateSerialNumber ::= INTEGER */
        if (hdr.class != ASN1_CLASS_UNIVERSAL ||
-           hdr.tag != ASN1_TAG_INTEGER) {
+           hdr.tag != ASN1_TAG_INTEGER ||
+           hdr.length < 1 || hdr.length > X509_MAX_SERIAL_NUM_LEN) {
                wpa_printf(MSG_DEBUG, "X509: No INTEGER tag found for "
-                          "serialNumber; class=%d tag=0x%x",
-                          hdr.class, hdr.tag);
+                          "serialNumber; class=%d tag=0x%x length=%u",
+                          hdr.class, hdr.tag, hdr.length);
                return -1;
        }
 
-       pos = hdr.payload;
-       left = hdr.length;
-       while (left) {
-               cert->serial_number <<= 8;
-               cert->serial_number |= *pos++;
-               left--;
-       }
-       wpa_printf(MSG_MSGDUMP, "X509: serialNumber %lu", cert->serial_number);
+       pos = hdr.payload + hdr.length;
+       while (hdr.length > 0 && hdr.payload[0] == 0) {
+               hdr.payload++;
+               hdr.length--;
+       }
+       os_memcpy(cert->serial_number, hdr.payload, hdr.length);
+       cert->serial_number_len = hdr.length;
+       wpa_hexdump(MSG_MSGDUMP, "X509: serialNumber", cert->serial_number,
+                   cert->serial_number_len);
 
        /* signature AlgorithmIdentifier */
        if (x509_parse_algorithm_identifier(pos, end - pos, &cert->signature,
index fdfc9d89ee04a0f1c33160e3daad86a7c7f20655..9cd904afacf2cf33a97bb307bd831b5b08b17734 100644 (file)
@@ -45,10 +45,13 @@ struct x509_name {
        struct asn1_oid rid; /* registeredID */
 };
 
+#define X509_MAX_SERIAL_NUM_LEN 20
+
 struct x509_certificate {
        struct x509_certificate *next;
        enum { X509_CERT_V1 = 0, X509_CERT_V2 = 1, X509_CERT_V3 = 2 } version;
-       unsigned long serial_number;
+       u8 serial_number[X509_MAX_SERIAL_NUM_LEN];
+       size_t serial_number_len;
        struct x509_algorithm_identifier signature;
        struct x509_name issuer;
        struct x509_name subject;