From 36c0348e68e7aa8126b1e1f78c83de0979973c1b Mon Sep 17 00:00:00 2001 From: Rich Megginson Date: Thu, 17 Dec 2009 14:52:44 -0700 Subject: Allow collect_objects() to search through all objectclasses Added a pemAll to pemObjectType enum - changed collect_objects() to look through all types of objects if the caller did not specify a particular type of object to look for - some of the PK11 routines do not specify the type e.g. PK11_FindObjectForCert(): CK_ATTRIBUTE searchTemplate = { CKA_VALUE, NULL, 0 }; PK11_SETATTRS(&searchTemplate, CKA_VALUE, cert->derCert.data, cert->derCert.len); --- ckpem.h | 1 + pfind.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ckpem.h b/ckpem.h index be74843..839d40b 100644 --- a/ckpem.h +++ b/ckpem.h @@ -95,6 +95,7 @@ struct pemTrustObjectStr { typedef struct pemTrustObjectStr pemTrustObject; typedef enum { + pemAll = -1, /* matches all types */ pemRaw, pemCert, pemBareKey, diff --git a/pfind.c b/pfind.c index fdcb945..30b1174 100644 --- a/pfind.c +++ b/pfind.c @@ -313,8 +313,9 @@ collect_objects(CK_ATTRIBUTE_PTR pTemplate, plog("CKO_NETSCAPE_BUILTIN_ROOT_LIST\n"); goto done; case CK_INVALID_HANDLE: + type = pemAll; /* look through all objectclasses - ignore the type field */ plog("CK_INVALID_HANDLE\n"); - goto done; + break; default: plog("no other object types %08x\n", objClass); goto done; /* no other object types we understand in this module */ @@ -322,15 +323,20 @@ collect_objects(CK_ATTRIBUTE_PTR pTemplate, /* find objects */ for (i = 0; i < pem_nobjs; i++) { + int match = 1; /* matches type if type not specified */ if (NULL == gobj[i]) continue; plog(" %d type = %d\n", i, gobj[i]->type); - if ((type == gobj[i]->type) - && (slotID == gobj[i]->slotID) - && (CK_TRUE == - pem_match(pTemplate, ulAttributeCount, gobj[i]))) { - + if (type != pemAll) { + /* type specified - must match given type */ + match = (type == gobj[i]->type); + } + if (match) { + match = (slotID == gobj[i]->slotID) && + (CK_TRUE == pem_match(pTemplate, ulAttributeCount, gobj[i])); + } + if (match) { pemInternalObject *o = gobj[i]; PUT_Object(o, *pError); } -- cgit