Blame SOURCES/0001-Relax-the-certificate-time-checks-in-the-self-tests-.patch

cfb861
commit 58f79c3d235290c4cecccc1d55cbcc2da8e988a6
cfb861
Author: Richard Hughes <richard@hughsie.com>
cfb861
Date:   Thu Aug 1 09:45:25 2019 +0100
cfb861
cfb861
    Relax the certificate time checks in the self tests for the legacy certificate
cfb861
    
cfb861
    One test verifies a firmware with a signature from the old LVFS which was
cfb861
    hosted on secure-lvfs.rhcloud.com and used the original PKCS-7 key. This key
cfb861
    had a two year validity (expiring today, ohh the naivety...) rather than the
cfb861
    newer fwupd.org key which expires in the year 2058.
cfb861
    
cfb861
    For this specific test only, disable the certificate time checks to fix CI.
cfb861
    
cfb861
    Fixes https://github.com/hughsie/fwupd/issues/1264
cfb861
cfb861
diff --git a/src/fu-engine.c b/src/fu-engine.c
cfb861
index ac102cfa..1a57b0af 100644
cfb861
--- a/src/fu-engine.c
cfb861
+++ b/src/fu-engine.c
cfb861
@@ -1908,7 +1908,8 @@ fu_engine_get_existing_keyring_result (FuEngine *self,
cfb861
 	blob_sig = fu_common_get_contents_bytes (fwupd_remote_get_filename_cache_sig (remote), error);
cfb861
 	if (blob_sig == NULL)
cfb861
 		return NULL;
cfb861
-	return fu_keyring_verify_data (kr, blob, blob_sig, error);
cfb861
+	return fu_keyring_verify_data (kr, blob, blob_sig,
cfb861
+				       FU_KEYRING_VERIFY_FLAG_NONE, error);
cfb861
 }
cfb861
 
cfb861
 /**
cfb861
@@ -1991,7 +1992,9 @@ fu_engine_update_metadata (FuEngine *self, const gchar *remote_id,
cfb861
 		pki_dir = g_build_filename (sysconfdir, "pki", "fwupd-metadata", NULL);
cfb861
 		if (!fu_keyring_add_public_keys (kr, pki_dir, error))
cfb861
 			return FALSE;
cfb861
-		kr_result = fu_keyring_verify_data (kr, bytes_raw, bytes_sig, error);
cfb861
+		kr_result = fu_keyring_verify_data (kr, bytes_raw, bytes_sig,
cfb861
+						    FU_KEYRING_VERIFY_FLAG_NONE,
cfb861
+						    error);
cfb861
 		if (kr_result == NULL)
cfb861
 			return FALSE;
cfb861
 
cfb861
diff --git a/src/fu-keyring-gpg.c b/src/fu-keyring-gpg.c
cfb861
index af0bfbe0..a51ab7a4 100644
cfb861
--- a/src/fu-keyring-gpg.c
cfb861
+++ b/src/fu-keyring-gpg.c
cfb861
@@ -231,6 +231,7 @@ static FuKeyringResult *
cfb861
 fu_keyring_gpg_verify_data (FuKeyring *keyring,
cfb861
 			    GBytes *blob,
cfb861
 			    GBytes *blob_signature,
cfb861
+			    FuKeyringVerifyFlags flags,
cfb861
 			    GError **error)
cfb861
 {
cfb861
 	FuKeyringGpg *self = FU_KEYRING_GPG (keyring);
cfb861
diff --git a/src/fu-keyring-pkcs7.c b/src/fu-keyring-pkcs7.c
cfb861
index d48dc5d0..dc310d37 100644
cfb861
--- a/src/fu-keyring-pkcs7.c
cfb861
+++ b/src/fu-keyring-pkcs7.c
cfb861
@@ -182,6 +182,7 @@ static FuKeyringResult *
cfb861
 fu_keyring_pkcs7_verify_data (FuKeyring *keyring,
cfb861
 			     GBytes *blob,
cfb861
 			     GBytes *blob_signature,
cfb861
+			     FuKeyringVerifyFlags flags,
cfb861
 			     GError **error)
cfb861
 {
cfb861
 	FuKeyringPkcs7 *self = FU_KEYRING_PKCS7 (keyring);
cfb861
@@ -231,6 +232,14 @@ fu_keyring_pkcs7_verify_data (FuKeyring *keyring,
cfb861
 	for (gint i = 0; i < count; i++) {
cfb861
 		gnutls_pkcs7_signature_info_st info;
cfb861
 		gint64 signing_time = 0;
cfb861
+		gnutls_certificate_verify_flags verify_flags = 0;
cfb861
+
cfb861
+		/* use with care */
cfb861
+		if (flags & FU_KEYRING_VERIFY_FLAG_DISABLE_TIME_CHECKS) {
cfb861
+			g_debug ("WARNING: disabling time checks");
cfb861
+			verify_flags |= GNUTLS_VERIFY_DISABLE_TIME_CHECKS;
cfb861
+			verify_flags |= GNUTLS_VERIFY_DISABLE_TRUSTED_TIME_CHECKS;
cfb861
+		}
cfb861
 
cfb861
 		/* verify the data against the detached signature */
cfb861
 		rc = gnutls_pkcs7_verify (pkcs7, self->tl,
cfb861
@@ -238,7 +247,7 @@ fu_keyring_pkcs7_verify_data (FuKeyring *keyring,
cfb861
 					  0,    /* vdata_size */
cfb861
 					  i,    /* index */
cfb861
 					  &datum, /* data */
cfb861
-					  0);   /* flags */
cfb861
+					  verify_flags);
cfb861
 		if (rc < 0) {
cfb861
 			g_set_error (error,
cfb861
 				     FWUPD_ERROR,
cfb861
diff --git a/src/fu-keyring-utils.c b/src/fu-keyring-utils.c
cfb861
index 0c5a7f04..465b4a02 100644
cfb861
--- a/src/fu-keyring-utils.c
cfb861
+++ b/src/fu-keyring-utils.c
cfb861
@@ -167,7 +167,9 @@ fu_keyring_get_release_trust_flags (AsRelease *release,
cfb861
 				fu_keyring_get_name (kr));
cfb861
 		return FALSE;
cfb861
 	}
cfb861
-	kr_result = fu_keyring_verify_data (kr, blob_payload, blob_signature, &error_local);
cfb861
+	kr_result = fu_keyring_verify_data (kr, blob_payload, blob_signature,
cfb861
+					    FU_KEYRING_VERIFY_FLAG_NONE,
cfb861
+					    &error_local);
cfb861
 	if (kr_result == NULL) {
cfb861
 		g_warning ("untrusted as failed to verify from %s keyring: %s",
cfb861
 			   fu_keyring_get_name (kr),
cfb861
diff --git a/src/fu-keyring.c b/src/fu-keyring.c
cfb861
index d8a88e8c..9b582563 100644
cfb861
--- a/src/fu-keyring.c
cfb861
+++ b/src/fu-keyring.c
cfb861
@@ -40,13 +40,14 @@ FuKeyringResult *
cfb861
 fu_keyring_verify_data (FuKeyring *keyring,
cfb861
 		       GBytes *blob,
cfb861
 		       GBytes *blob_signature,
cfb861
+		       FuKeyringVerifyFlags flags,
cfb861
 		       GError **error)
cfb861
 {
cfb861
 	FuKeyringClass *klass = FU_KEYRING_GET_CLASS (keyring);
cfb861
 	g_return_val_if_fail (FU_IS_KEYRING (keyring), NULL);
cfb861
 	g_return_val_if_fail (blob != NULL, NULL);
cfb861
 	g_return_val_if_fail (blob_signature != NULL, NULL);
cfb861
-	return klass->verify_data (keyring, blob, blob_signature, error);
cfb861
+	return klass->verify_data (keyring, blob, blob_signature, flags, error);
cfb861
 }
cfb861
 
cfb861
 const gchar *
cfb861
diff --git a/src/fu-keyring.h b/src/fu-keyring.h
cfb861
index 6e03694c..f097305d 100644
cfb861
--- a/src/fu-keyring.h
cfb861
+++ b/src/fu-keyring.h
cfb861
@@ -17,6 +17,20 @@ G_BEGIN_DECLS
cfb861
 #define FU_TYPE_KEYRING (fu_keyring_get_type ())
cfb861
 G_DECLARE_DERIVABLE_TYPE (FuKeyring, fu_keyring, FU, KEYRING, GObject)
cfb861
 
cfb861
+/**
cfb861
+ * FuKeyringVerifyFlags:
cfb861
+ * @FU_KEYRING_VERIFY_FLAG_NONE:		No flags set
cfb861
+ * @FU_KEYRING_VERIFY_FLAG_DISABLE_TIME_CHECKS:	Disable checking of validity periods
cfb861
+ *
cfb861
+ * The flags to use when interacting with a keyring
cfb861
+ **/
cfb861
+typedef enum {
cfb861
+	FU_KEYRING_VERIFY_FLAG_NONE			= 0,
cfb861
+	FU_KEYRING_VERIFY_FLAG_DISABLE_TIME_CHECKS	= 1 << 2,
cfb861
+	/*< private >*/
cfb861
+	FU_KEYRING_VERIFY_FLAG_LAST
cfb861
+} FuKeyringVerifyFlags;
cfb861
+
cfb861
 struct _FuKeyringClass
cfb861
 {
cfb861
 	GObjectClass		 parent_class;
cfb861
@@ -28,6 +42,7 @@ struct _FuKeyringClass
cfb861
 	FuKeyringResult		*(*verify_data)		(FuKeyring	*keyring,
cfb861
 							 GBytes		*payload,
cfb861
 							 GBytes		*payload_signature,
cfb861
+							 FuKeyringVerifyFlags flags,
cfb861
 							 GError		**error);
cfb861
 };
cfb861
 
cfb861
@@ -39,6 +54,7 @@ gboolean	 fu_keyring_add_public_keys		(FuKeyring	*keyring,
cfb861
 FuKeyringResult	*fu_keyring_verify_data			(FuKeyring	*keyring,
cfb861
 							 GBytes		*blob,
cfb861
 							 GBytes		*blob_signature,
cfb861
+							 FuKeyringVerifyFlags flags,
cfb861
 							 GError		**error);
cfb861
 const gchar	*fu_keyring_get_name			(FuKeyring	*self);
cfb861
 void		 fu_keyring_set_name			(FuKeyring	*self,
cfb861
diff --git a/src/fu-self-test.c b/src/fu-self-test.c
cfb861
index 4f359614..98fac714 100644
cfb861
--- a/src/fu-self-test.c
cfb861
+++ b/src/fu-self-test.c
cfb861
@@ -1947,7 +1947,9 @@ fu_keyring_gpg_func (void)
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (blob_pass);
cfb861
 	blob_sig = g_bytes_new_static (sig_gpgme, strlen (sig_gpgme));
cfb861
-	result_pass = fu_keyring_verify_data (keyring, blob_pass, blob_sig, &error);
cfb861
+	result_pass = fu_keyring_verify_data (keyring, blob_pass, blob_sig,
cfb861
+					      FU_KEYRING_VERIFY_FLAG_NONE,
cfb861
+					      &error);
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (result_pass);
cfb861
 	g_assert_cmpint (fu_keyring_result_get_timestamp (result_pass), == , 1438072952);
cfb861
@@ -1960,7 +1962,8 @@ fu_keyring_gpg_func (void)
cfb861
 	blob_fail = fu_common_get_contents_bytes (fw_fail, &error);
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (blob_fail);
cfb861
-	result_fail = fu_keyring_verify_data (keyring, blob_fail, blob_sig, &error);
cfb861
+	result_fail = fu_keyring_verify_data (keyring, blob_fail, blob_sig,
cfb861
+					      FU_KEYRING_VERIFY_FLAG_NONE, &error);
cfb861
 	g_assert_error (error, FWUPD_ERROR, FWUPD_ERROR_SIGNATURE_INVALID);
cfb861
 	g_assert_null (result_fail);
cfb861
 	g_clear_error (&error);
cfb861
@@ -2010,7 +2013,9 @@ fu_keyring_pkcs7_func (void)
cfb861
 	blob_sig = fu_common_get_contents_bytes (sig_fn, &error);
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (blob_sig);
cfb861
-	result_pass = fu_keyring_verify_data (keyring, blob_pass, blob_sig, &error);
cfb861
+	result_pass = fu_keyring_verify_data (keyring, blob_pass, blob_sig,
cfb861
+					      FU_KEYRING_VERIFY_FLAG_DISABLE_TIME_CHECKS,
cfb861
+					      &error);
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (result_pass);
cfb861
 	g_assert_cmpint (fu_keyring_result_get_timestamp (result_pass), >= , 1502871248);
cfb861
@@ -2022,7 +2027,8 @@ fu_keyring_pkcs7_func (void)
cfb861
 	blob_sig2 = fu_common_get_contents_bytes (sig_fn2, &error);
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (blob_sig2);
cfb861
-	result_fail = fu_keyring_verify_data (keyring, blob_pass, blob_sig2, &error);
cfb861
+	result_fail = fu_keyring_verify_data (keyring, blob_pass, blob_sig2,
cfb861
+					      FU_KEYRING_VERIFY_FLAG_NONE, &error);
cfb861
 	g_assert_error (error, FWUPD_ERROR, FWUPD_ERROR_SIGNATURE_INVALID);
cfb861
 	g_assert_null (result_fail);
cfb861
 	g_clear_error (&error);
cfb861
@@ -2033,7 +2039,8 @@ fu_keyring_pkcs7_func (void)
cfb861
 	blob_fail = fu_common_get_contents_bytes (fw_fail, &error);
cfb861
 	g_assert_no_error (error);
cfb861
 	g_assert_nonnull (blob_fail);
cfb861
-	result_fail = fu_keyring_verify_data (keyring, blob_fail, blob_sig, &error);
cfb861
+	result_fail = fu_keyring_verify_data (keyring, blob_fail, blob_sig,
cfb861
+					      FU_KEYRING_VERIFY_FLAG_NONE, &error);
cfb861
 	g_assert_error (error, FWUPD_ERROR, FWUPD_ERROR_SIGNATURE_INVALID);
cfb861
 	g_assert_null (result_fail);
cfb861
 	g_clear_error (&error);