changeset 464:2e100d3e414a

Add helper functions for sha256 sum and rsa signing
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 23 Apr 2014 15:33:42 +0000
parents 5200b8e9b2ae
children 88dfe16a0bb9
files ui/sslhelp.cpp ui/sslhelp.h
diffstat 2 files changed, 77 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ui/sslhelp.cpp	Wed Apr 23 15:33:09 2014 +0000
+++ b/ui/sslhelp.cpp	Wed Apr 23 15:33:42 2014 +0000
@@ -6,6 +6,13 @@
  * See LICENSE.txt for details.
  */
 #include "sslhelp.h"
+#include <polarssl/sha256.h>
+#include <polarssl/pk.h>
+#include <polarssl/entropy.h>
+#include <polarssl/ctr_drbg.h>
+#include <QApplication>
+#include <QUuid>
+#include <QDebug>
 
 QString getPolarSSLErrorMsg(int ret)
 {
@@ -14,3 +21,57 @@
     errbuf[1020] = '\0'; /* Just to be sure */
     return QString::fromLatin1(errbuf);
 }
+
+QByteArray sha256sum(const QByteArray& data)
+{
+    unsigned char output[32];
+    sha256((unsigned char *)data.constData(), (size_t)data.size(), output, 0);
+    return QByteArray(data, 32);
+}
+
+QByteArray rsaSignSHA256Hash(const QByteArray& hash, pk_context *pk)
+{
+    int ret = 0;
+    unsigned char sig[POLARSSL_MPI_MAX_SIZE];
+    size_t sig_len;
+    entropy_context entropy;
+    ctr_drbg_context ctr_drbg;
+
+    entropy_init(&entropy);
+
+    QUuid uuid = QUuid::createUuid();
+    QString personalString = QApplication::applicationName() + uuid.toString();
+    QByteArray personalBa = personalString.toLocal8Bit();
+
+    /*
+    * Initialize random generator.
+    * Personalisation string, does not need to be random but
+    * should be unique according to documentation.
+    *
+    * the ctr_drbg structure does not need to be freed explicitly.
+    */
+    ret = ctr_drbg_init(&ctr_drbg, entropy_func, &entropy,
+                        (const unsigned char*) personalBa.constData(),
+                        personalBa.size());
+    if (ret != 0) {
+        qDebug() << "Failed to initialize drbg: " << getPolarSSLErrorMsg(ret);
+        entropy_free (&entropy);
+        return QByteArray();
+    }
+
+    ret = pk_sign(pk, POLARSSL_MD_SHA256, (const unsigned char*) hash.constData(),
+                  hash.size(), sig, &sig_len, ctr_drbg_random, &ctr_drbg);
+    entropy_free (&entropy);
+
+    if (ret != 0) {
+        qDebug() << "Failed to sign: " << getPolarSSLErrorMsg(ret);
+        return QByteArray();
+    }
+
+    if (sig_len != 3072 / 8) {
+        qDebug() << "Invalid size of signature: " << sig_len;
+        return QByteArray();
+    }
+
+    return QByteArray((const char *)sig, (int)sig_len);
+}
--- a/ui/sslhelp.h	Wed Apr 23 15:33:09 2014 +0000
+++ b/ui/sslhelp.h	Wed Apr 23 15:33:42 2014 +0000
@@ -12,6 +12,7 @@
  * @brief Helper functions to combine Qt with Polarssl
  */
 #include <polarssl/error.h>
+#include <polarssl/pk.h>
 
 #include <QString>
 
@@ -21,3 +22,18 @@
  * @returns A QString representation of that error
  */
 QString getPolarSSLErrorMsg(int ret);
+
+/** @brief calculate the sha256 of the bytearray data
+ *
+ * @param [in] data The data to hash
+ * @returns the sha256sum of the data
+ */
+QByteArray sha256sum(const QByteArray& data);
+
+/** @brief Create a RSA signature fur a sha256 hashsum
+ *
+ * @param [in] hash the hash to sign.
+ * @param [in] pk the key to use.
+ * @returns the signature of the data or an empty byte array on error
+ */
+QByteArray rsaSignSHA256Hash(const QByteArray& hash, pk_context *pk);

http://wald.intevation.org/projects/trustbridge/