Index: /trunk/include/iprt/ldr.h
===================================================================
--- /trunk/include/iprt/ldr.h	(revision 74706)
+++ /trunk/include/iprt/ldr.h	(revision 74707)
@@ -1181,5 +1181,6 @@
  *
  */
-typedef DECLCALLBACK(int) FNRTLDRVALIDATESIGNEDDATA(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature, void const *pvSignature, size_t cbSignature,
+typedef DECLCALLBACK(int) FNRTLDRVALIDATESIGNEDDATA(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+                                                    void const *pvSignature, size_t cbSignature,
                                                     PRTERRINFO pErrInfo, void *pvUser);
 /** Pointer to a signature verification callback. */
Index: /trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp	(revision 74706)
+++ /trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp	(revision 74707)
@@ -3966,4 +3966,47 @@
 
 /**
+ * @interface_method_impl{RTLDROPS,pfnVerifySignature}
+ */
+static DECLCALLBACK(int)
+rtldrMachO_VerifySignature(PRTLDRMODINTERNAL pMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser, PRTERRINFO pErrInfo)
+{
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+    PRTLDRMODMACHO pThis = RT_FROM_MEMBER(pMod, RTLDRMODMACHO, Core);
+
+    int rc = rtldrMachO_LoadSignatureBlob(pThis);
+    if (RT_SUCCESS(rc))
+    {
+        RT_NOREF(pfnCallback, pvUser, pErrInfo);
+#if 0
+        int rc = rtldrPE_VerifySignatureImagePrecoditions(pModPe, pErrInfo);
+        if (RT_SUCCESS(rc))
+        {
+            PRTLDRPESIGNATURE pSignature = NULL;
+            rc = rtldrPE_VerifySignatureRead(pModPe, &pSignature, pErrInfo);
+            if (RT_SUCCESS(rc))
+            {
+                rc = rtldrPE_VerifySignatureDecode(pModPe, pSignature, pErrInfo);
+                if (RT_SUCCESS(rc))
+                    rc = rtldrPE_VerifySignatureValidateHash(pModPe, pSignature, pErrInfo);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = pfnCallback(&pModPe->Core, RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA,
+                                     &pSignature->ContentInfo, sizeof(pSignature->ContentInfo),
+                                     pErrInfo, pvUser);
+                }
+                rtldrPE_VerifySignatureDestroy(pModPe, pSignature);
+            }
+        }
+#endif
+    }
+    return rc;
+#else
+    RT_NOREF_PV(pMod); RT_NOREF_PV(pfnCallback); RT_NOREF_PV(pvUser); RT_NOREF_PV(pErrInfo);
+    return VERR_NOT_SUPPORTED;
+#endif
+}
+
+
+/**
  * Operations for a Mach-O module interpreter.
  */
@@ -3989,5 +4032,5 @@
     rtldrMachO_ReadDbgInfo,
     rtldrMachO_QueryProp,
-    NULL /*pfnVerifySignature*/,
+    rtldrMachO_VerifySignature,
     NULL /*pfnHashImage*/,
     NULL /*pfnUnwindFrame*/,
Index: /trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp	(revision 74706)
+++ /trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp	(revision 74707)
@@ -2840,6 +2840,6 @@
              *
              * Seems the difference between V1 and V2 page hash attributes is
-             * that v1 uses SHA-1 while v2 uses SHA-256. The data structures to
-             * be identical otherwise.  Initially we assumed the digest
+             * that v1 uses SHA-1 while v2 uses SHA-256. The data structures
+             * seems to be identical otherwise.  Initially we assumed the digest
              * algorithm was supposed to be RTCRSPCINDIRECTDATACONTENT::DigestInfo,
              * i.e. the same as for the whole image hash.  The initial approach
Index: /trunk/src/VBox/Runtime/tools/RTSignTool.cpp
===================================================================
--- /trunk/src/VBox/Runtime/tools/RTSignTool.cpp	(revision 74706)
+++ /trunk/src/VBox/Runtime/tools/RTSignTool.cpp	(revision 74707)
@@ -1421,5 +1421,13 @@
 
 
+    RTTIMESPEC Now;
+    bool       fTriedNow = false;
     rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &pState->uTimestamp, sizeof(pState->uTimestamp));
+    if (rc == VERR_NOT_FOUND)
+    {
+        fTriedNow = true;
+        pState->uTimestamp = RTTimeSpecGetSeconds(RTTimeNow(&Now));
+        rc = VINF_SUCCESS;
+    }
     if (RT_SUCCESS(rc))
     {
@@ -1427,7 +1435,6 @@
         if (RT_SUCCESS(rc))
             RTMsgInfo("'%s' is valid.\n", pszFilename);
-        else if (rc == VERR_CR_X509_CPV_NOT_VALID_AT_TIME)
-        {
-            RTTIMESPEC Now;
+        else if (rc == VERR_CR_X509_CPV_NOT_VALID_AT_TIME && !fTriedNow)
+        {
             pState->uTimestamp = RTTimeSpecGetSeconds(RTTimeNow(&Now));
             rc = RTLdrVerifySignature(hLdrMod, VerifyExeCallback, pState, RTErrInfoInitStatic(pStaticErrInfo));
