]> granicus.if.org Git - p11-kit/commitdiff
iter: Utilize 'slot-id' URI path attribute
authorDaiki Ueno <dueno@redhat.com>
Wed, 10 Aug 2016 15:15:25 +0000 (17:15 +0200)
committerStef Walter <stefw@redhat.com>
Fri, 2 Sep 2016 15:48:36 +0000 (17:48 +0200)
https://bugs.freedesktop.org/show_bug.cgi?id=97245

p11-kit/iter.c
p11-kit/test-iter.c

index 60325139884949a5ad789c28987f24cc9efe7a5a..4caf5d710cb6ac20384381b7673295cea0f21c5a 100644 (file)
@@ -64,6 +64,7 @@ struct p11_kit_iter {
        CK_SLOT_INFO match_slot;
        CK_TOKEN_INFO match_token;
        CK_ATTRIBUTE *match_attrs;
+       CK_SLOT_ID match_slot_id;
        Callback *callbacks;
 
        /* The input modules */
@@ -181,6 +182,8 @@ p11_kit_iter_set_uri (P11KitIter *iter,
                        attrs = p11_kit_uri_get_attributes (uri, &count);
                        iter->match_attrs = p11_attrs_buildn (NULL, attrs, count);
 
+                       iter->match_slot_id = p11_kit_uri_get_slot_id (uri);
+
                        minfo = p11_kit_uri_get_module_info (uri);
                        if (minfo != NULL)
                                memcpy (&iter->match_module, minfo, sizeof (CK_INFO));
@@ -194,10 +197,11 @@ p11_kit_iter_set_uri (P11KitIter *iter,
                                memcpy (&iter->match_token, tinfo, sizeof (CK_TOKEN_INFO));
                }
        } else {
-               /* Match any module version number*/
+               /* Match any module version number and slot ID */
                memset (&iter->match_module, 0, sizeof (iter->match_module));
                iter->match_module.libraryVersion.major = (CK_BYTE)-1;
                iter->match_module.libraryVersion.minor = (CK_BYTE)-1;
+               iter->match_slot_id = (CK_SLOT_ID)-1;
        }
 }
 
@@ -513,6 +517,8 @@ move_next_session (P11KitIter *iter)
                iter->slot = iter->slots[iter->saw_slots++];
 
                assert (iter->module != NULL);
+               if (iter->match_slot_id != (CK_SLOT_ID)-1 && iter->slot != iter->match_slot_id)
+                       continue;
                rv = (iter->module->C_GetSlotInfo) (iter->slot, &iter->slot_info);
                if (rv != CKR_OK || !p11_match_uri_slot_info (&iter->match_slot, &iter->slot_info))
                        continue;
index 07b8e3203a4bf693d759abe2b88a980a758b37e1..3f5a76f67b796ede0b0b39146449645936fd471b 100644 (file)
@@ -766,6 +766,80 @@ test_slot_mismatch (void)
        finalize_and_free_modules (modules);
 }
 
+static void
+test_slot_match_by_id (void)
+{
+       CK_FUNCTION_LIST_PTR *modules;
+       P11KitIter *iter;
+       P11KitUri *uri;
+       char *string;
+       CK_RV rv;
+       int count;
+       int ret;
+
+       modules = initialize_and_get_modules ();
+
+       uri = p11_kit_uri_new ();
+       ret = asprintf (&string, "pkcs11:slot-id=%lu", MOCK_SLOT_ONE_ID);
+       assert (ret > 0);
+       ret = p11_kit_uri_parse (string, P11_KIT_URI_FOR_SLOT, uri);
+       free (string);
+       assert_num_eq (P11_KIT_URI_OK, ret);
+
+       iter = p11_kit_iter_new (uri, 0);
+       p11_kit_uri_free (uri);
+
+       p11_kit_iter_begin (iter, modules);
+
+       count = 0;
+       while ((rv = p11_kit_iter_next (iter)) == CKR_OK)
+               count++;
+
+       assert (rv == CKR_CANCEL);
+
+       /* Three modules, each with 1 slot, and 3 public objects */
+       assert_num_eq (9, count);
+
+       p11_kit_iter_free (iter);
+
+       finalize_and_free_modules (modules);
+}
+
+static void
+test_slot_mismatch_by_id (void)
+{
+       CK_FUNCTION_LIST_PTR *modules;
+       P11KitIter *iter;
+       P11KitUri *uri;
+       CK_RV rv;
+       int count;
+       int ret;
+
+       modules = initialize_and_get_modules ();
+
+       uri = p11_kit_uri_new ();
+       ret = p11_kit_uri_parse ("pkcs11:slot-id=0", P11_KIT_URI_FOR_SLOT, uri);
+       assert_num_eq (P11_KIT_URI_OK, ret);
+
+       iter = p11_kit_iter_new (uri, 0);
+       p11_kit_uri_free (uri);
+
+       p11_kit_iter_begin (iter, modules);
+
+       count = 0;
+       while ((rv = p11_kit_iter_next (iter)) == CKR_OK)
+               count++;
+
+       assert (rv == CKR_CANCEL);
+
+       /* Nothing should have matched */
+       assert_num_eq (0, count);
+
+       p11_kit_iter_free (iter);
+
+       finalize_and_free_modules (modules);
+}
+
 static void
 test_slot_info (void)
 {
@@ -1415,6 +1489,8 @@ main (int argc,
        p11_test (test_token_info, "/iter/token-info");
        p11_test (test_slot_match, "/iter/test_slot_match");
        p11_test (test_slot_mismatch, "/iter/test_slot_mismatch");
+       p11_test (test_slot_match_by_id, "/iter/test_slot_match_by_id");
+       p11_test (test_slot_mismatch_by_id, "/iter/test_slot_mismatch_by_id");
        p11_test (test_slot_info, "/iter/slot-info");
        p11_test (test_module_match, "/iter/test_module_match");
        p11_test (test_module_mismatch, "/iter/test_module_mismatch");