qt4-x11 (4:4.6.3-4+squeeze1) ssl_certificate_large_sn.diff

Summary

 src/network/ssl/qsslcertificate.cpp |   23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

    
download this patch

Patch contents

From 0f16c7ce8dcd6f4905d14875088c55148e41366a Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Tue, 1 Jun 2010 16:50:55 +0200
Subject: [PATCH] QSslCertificate: support large serial numbers

We were calling an OpenSSL function that returned a long for the serial
number; sometimes serial numbers are too big to fit into a long (up to
20 octets). In that case, do not convert the serial number to decimal,
but just output the hexadecimal value.

Reviewed-by: Zeno Albisser
Task-number: QTBUG-9973
---
 src/network/ssl/qsslcertificate.cpp                |   23 ++++++++++++++++---
 .../more-certificates/cert-large-serial-number.pem |   14 ++++++++++++
 tests/auto/qsslcertificate/tst_qsslcertificate.cpp |   13 +++++++++++
 3 files changed, 46 insertions(+), 4 deletions(-)
 create mode 100644 tests/auto/qsslcertificate/more-certificates/cert-large-serial-number.pem

--- a/src/network/ssl/qsslcertificate.cpp
+++ b/src/network/ssl/qsslcertificate.cpp
@@ -259,13 +259,28 @@
 
 /*!
     Returns the certificate's serial number string in decimal format.
+    In case the serial number cannot be converted to decimal format
+    (i.e. if it is bigger than 4294967295, which means it does not fit into 4 bytes),
+    its hexadecimal version is returned.
 */
 QByteArray QSslCertificate::serialNumber() const
 {
-    if (d->serialNumberString.isEmpty() && d->x509)
-        d->serialNumberString =
-            QByteArray::number(qlonglong(q_ASN1_INTEGER_get(d->x509->cert_info->serialNumber)));
-
+    if (d->serialNumberString.isEmpty() && d->x509) {
+        ASN1_INTEGER *serialNumber = d->x509->cert_info->serialNumber;
+        // if we cannot convert to a long, just output the hexadecimal number
+        if (serialNumber->length > 4) {
+            QByteArray hexString;
+            hexString.reserve(serialNumber->length * 3);
+            for (int a = 0; a < serialNumber->length; ++a) {
+                hexString += QByteArray::number(serialNumber->data[a], 16).rightJustified(2, '0');
+                hexString += ':';
+            }
+            hexString.chop(1);
+            d->serialNumberString = hexString;
+        } else {
+            d->serialNumberString = QByteArray::number(qlonglong(q_ASN1_INTEGER_get(serialNumber)));
+        }
+    }
     return d->serialNumberString;
 }