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

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