Blame SOURCES/libcacard-2.7.0-caching-keys.patch

6d15ff
From 2c10ae315375730020108cbcae0c282d0d6eff5f Mon Sep 17 00:00:00 2001
6d15ff
From: Jakub Jelen <jjelen@redhat.com>
6d15ff
Date: Mon, 26 Aug 2019 17:42:06 +0200
6d15ff
Subject: [PATCH 1/2] vcard_emul_nss: Drop the key caching to simplify error
6d15ff
 handling
6d15ff
6d15ff
It could happen with PKCS#11 modules that (correctly) invalidate object
6d15ff
handles after logout (which was introduced in 0d3a683a), that the handles
6d15ff
are not valid when we try to use the objects again.
6d15ff
6d15ff
This is trying to address this use case, which I noticed was breaking
6d15ff
CI with SoftHSM PKCS#11 modules.
6d15ff
6d15ff
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
6d15ff
---
6d15ff
 src/vcard_emul_nss.c | 15 +--------------
6d15ff
 1 file changed, 1 insertion(+), 14 deletions(-)
6d15ff
6d15ff
diff --git a/src/vcard_emul_nss.c b/src/vcard_emul_nss.c
6d15ff
index e8f5c56..f788964 100644
6d15ff
--- a/src/vcard_emul_nss.c
6d15ff
+++ b/src/vcard_emul_nss.c
6d15ff
@@ -52,7 +52,6 @@ typedef enum {
6d15ff
 struct VCardKeyStruct {
6d15ff
     CERTCertificate *cert;
6d15ff
     PK11SlotInfo *slot;
6d15ff
-    SECKEYPrivateKey *key;
6d15ff
     VCardEmulTriState failedX509;
6d15ff
 };
6d15ff
 
6d15ff
@@ -155,10 +154,6 @@ vcard_emul_make_key(PK11SlotInfo *slot, CERTCertificate *cert)
6d15ff
     key = g_new(VCardKey, 1);
6d15ff
     key->slot = PK11_ReferenceSlot(slot);
6d15ff
     key->cert = CERT_DupCertificate(cert);
6d15ff
-    /* NOTE: if we aren't logged into the token, this could return NULL */
6d15ff
-    /* NOTE: the cert is a temp cert, not necessarily the cert in the token,
6d15ff
-     * use the DER version of this function */
6d15ff
-    key->key = PK11_FindKeyByDERCert(slot, cert, NULL);
6d15ff
     key->failedX509 = VCardEmulUnknown;
6d15ff
     return key;
6d15ff
 }
6d15ff
@@ -170,10 +165,6 @@ vcard_emul_delete_key(VCardKey *key)
6d15ff
     if (!nss_emul_init || (key == NULL)) {
6d15ff
         return;
6d15ff
     }
6d15ff
-    if (key->key) {
6d15ff
-        SECKEY_DestroyPrivateKey(key->key);
6d15ff
-        key->key = NULL;
6d15ff
-    }
6d15ff
     if (key->cert) {
6d15ff
         CERT_DestroyCertificate(key->cert);
6d15ff
     }
6d15ff
@@ -189,12 +180,8 @@ vcard_emul_delete_key(VCardKey *key)
6d15ff
 static SECKEYPrivateKey *
6d15ff
 vcard_emul_get_nss_key(VCardKey *key)
6d15ff
 {
6d15ff
-    if (key->key) {
6d15ff
-        return key->key;
6d15ff
-    }
6d15ff
     /* NOTE: if we aren't logged into the token, this could return NULL */
6d15ff
-    key->key = PK11_FindPrivateKeyFromCert(key->slot, key->cert, NULL);
6d15ff
-    return key->key;
6d15ff
+    return PK11_FindPrivateKeyFromCert(key->slot, key->cert, NULL);
6d15ff
 }
6d15ff
 
6d15ff
 /*
6d15ff
-- 
6d15ff
2.22.0
6d15ff
6d15ff
6d15ff
From 06587ef683373690f61540935b4516b4f23238ea Mon Sep 17 00:00:00 2001
6d15ff
From: Jakub Jelen <jjelen@redhat.com>
6d15ff
Date: Tue, 27 Aug 2019 12:38:45 +0200
6d15ff
Subject: [PATCH 2/2] tests: Reproducer for pkcs11 modules invalidating object
6d15ff
 handles on logout
6d15ff
6d15ff
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
6d15ff
---
6d15ff
 tests/hwtests.c | 21 +++++++++++++++++++++
6d15ff
 1 file changed, 21 insertions(+)
6d15ff
6d15ff
diff --git a/tests/hwtests.c b/tests/hwtests.c
6d15ff
index cd9a33b..39decfb 100644
6d15ff
--- a/tests/hwtests.c
6d15ff
+++ b/tests/hwtests.c
6d15ff
@@ -339,6 +339,26 @@ static void test_sign_bad_data_x509(void)
6d15ff
     vreader_free(reader); /* get by id ref */
6d15ff
 }
6d15ff
 
6d15ff
+/* This is a regression test for issues with PKCS#11 tokens
6d15ff
+ * invalidating object handles after logout (such as softhsm).
6d15ff
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=1576642
6d15ff
+ */
6d15ff
+static void test_sign_logout_sign(void)
6d15ff
+{
6d15ff
+    VReader *reader = vreader_get_reader_by_id(0);
6d15ff
+
6d15ff
+    g_assert_nonnull(reader);
6d15ff
+
6d15ff
+    test_login();
6d15ff
+    test_sign();
6d15ff
+
6d15ff
+    /* This implicitly logs out the user */
6d15ff
+    test_login();
6d15ff
+    test_sign();
6d15ff
+
6d15ff
+    vreader_free(reader); /* get by id ref */
6d15ff
+}
6d15ff
+
6d15ff
 static void libcacard_finalize(void)
6d15ff
 {
6d15ff
     VReader *reader = vreader_get_reader_by_id(0);
6d15ff
@@ -374,6 +394,7 @@ int main(int argc, char *argv[])
6d15ff
     g_test_add_func("/hw-tests/sign-bad-data", test_sign_bad_data_x509);
6d15ff
     g_test_add_func("/hw-tests/empty-applets", test_empty_applets);
6d15ff
     g_test_add_func("/hw-tests/get-response", test_get_response);
6d15ff
+    g_test_add_func("/hw-tests/sign-logout-sign", test_sign_logout_sign);
6d15ff
 
6d15ff
     ret = g_test_run();
6d15ff
 
6d15ff
-- 
6d15ff
2.22.0
6d15ff
6d15ff