[PATCH 1 of 2] Add signature time extraction for Linux and test for it in binverifytest

Wald Commits scm-commit at wald.intevation.org
Mon Nov 24 14:43:46 CET 2014


# HG changeset patch
# User Andre Heinecke <andre.heinecke at intevation.de>
# Date 1416836590 -3600
# Node ID 948f03bb52549edd5790df60746fc356f2773721
# Parent  41cf49df007daf7226be880d8ad09d481fd87026
Add signature time extraction for Linux and test for it in binverifytest

diff -r 41cf49df007d -r 948f03bb5254 common/binverify.c
--- a/common/binverify.c	Mon Nov 24 14:04:34 2014 +0100
+++ b/common/binverify.c	Mon Nov 24 14:43:10 2014 +0100
@@ -361,6 +361,57 @@
 #ifndef __clang__
 #pragma GCC diagnostic pop
 #endif
+#include <stdlib.h>
+
+#define SIG_DT_MARKER "\r\nS_DT:"
+
+/** This function is only intended to be used on well formatted input
+  * after verifification as it makes some hard assumptions what
+  * follows the SIG_DT_MARKER*/
+time_t
+get_signature_time (char *data, size_t data_size)
+{
+  char *p = NULL,
+       *end = NULL,
+       *buf = NULL;
+  long lSigTime = 0;
+  size_t len = 0;
+
+
+  /** Look for a DOS linebreak followed by an S_DT: */
+  size_t marker_len = strlen(SIG_DT_MARKER);
+  for (p = data + data_size - 1; p > data; p--)
+    {
+      if (!memcmp(SIG_DT_MARKER, p, marker_len))
+        break;
+    }
+
+  if (!p || p == data)
+    {
+      ERRORPRINTF ("Failed to find signature timestamp.\n");
+      return 0;
+    }
+  p = strchr (p, ':');
+  end = strchr (p, '\r');
+  if (!end)
+    {
+      return 0;
+    }
+  if (end - p  <= 0)
+    {
+      // Should never happen but we check to ensure that
+      // the following cast is valid which makes a size_t
+      ERRORPRINTF ("Signature timestamp does not compute.\n");
+      return 0;
+    }
+  len = (size_t) (end - p);
+
+  buf = xstrndup (p + 1, len);
+
+  lSigTime = strtol (buf, NULL, 10);
+  xfree (buf);
+  return (time_t) lSigTime;
+}
 
 bin_verify_result
 verify_binary_linux(const char *filename, size_t name_len)
@@ -464,6 +515,9 @@
   retval.result = VerifyValid;
   retval.fptr = fptr;
 
+/** We know know that the signature is valid we can trust the data content. */
+  retval.sig_time = get_signature_time (data, data_size);
+
 done:
   if (retval.result != VerifyValid)
     {
diff -r 41cf49df007d -r 948f03bb5254 ui/tests/binverifytest.cpp
--- a/ui/tests/binverifytest.cpp	Mon Nov 24 14:04:34 2014 +0100
+++ b/ui/tests/binverifytest.cpp	Mon Nov 24 14:43:10 2014 +0100
@@ -87,12 +87,16 @@
     QVERIFY (VerifyValid == res.result);
     QFile thefile ("fakeinst-signed" EXE_SUFFIX);
 #ifdef WIN32
-    /* Verifies the deny write open mode. But on linuy we dont have it. */
+    /* Verifies the deny write open mode. But on linux we dont have it. */
     QVERIFY (!thefile.open(QIODevice::ReadWrite));
 #endif
     QVERIFY (res.fptr != NULL);
     fclose(res.fptr);
     QVERIFY (thefile.open(QIODevice::ReadWrite));
+    QVERIFY (res.sig_time != 0 && res.sig_time != -1);
+    QDateTime sigDt = QDateTime::fromTime_t(res.sig_time);
+    QVERIFY (sigDt.isValid());
+    qDebug() << "Signature time: " << sigDt;
     thefile.close();
 }
 


More information about the Trustbridge-commits mailing list