| Index: crypto/rsa_private_key_nss.cc
|
| diff --git a/crypto/rsa_private_key_nss.cc b/crypto/rsa_private_key_nss.cc
|
| index 8157de254fc9e069069e02dba27ecf8efa462d84..0d79dbe84661831740ef43cdd66bf72696f26685 100644
|
| --- a/crypto/rsa_private_key_nss.cc
|
| +++ b/crypto/rsa_private_key_nss.cc
|
| @@ -7,6 +7,7 @@
|
| #include <cryptohi.h>
|
| #include <keyhi.h>
|
| #include <pk11pub.h>
|
| +#include <secmod.h>
|
|
|
| #include <list>
|
|
|
| @@ -119,31 +120,22 @@ RSAPrivateKey* RSAPrivateKey::FindFromPublicKeyInfo(
|
| return NULL;
|
| }
|
|
|
| - ScopedPK11Slot slot(GetPrivateNSSKeySlot());
|
| - if (!slot.get()) {
|
| - NOTREACHED();
|
| - return NULL;
|
| - }
|
| -
|
| - // Finally...Look for the key!
|
| - result->key_ = PK11_FindKeyByKeyID(slot.get(), ck_id.get(), NULL);
|
| -
|
| - // If we don't find the matching key in the private slot, then we
|
| - // look in the public slot.
|
| - if (!result->key_) {
|
| - slot.reset(GetPublicNSSKeySlot());
|
| - if (!slot.get()) {
|
| - NOTREACHED();
|
| - return NULL;
|
| + // Search all slots in all modules for the key with the given ID.
|
| + AutoSECMODListReadLock auto_lock;
|
| + SECMODModuleList* head = SECMOD_GetDefaultModuleList();
|
| + for (SECMODModuleList* item = head; item != NULL; item = item->next) {
|
| + int slot_count = item->module->loaded ? item->module->slotCount : 0;
|
| + for (int i = 0; i < slot_count; i++) {
|
| + // Finally...Look for the key!
|
| + result->key_ = PK11_FindKeyByKeyID(item->module->slots[i],
|
| + ck_id.get(), NULL);
|
| + if (result->key_)
|
| + return result.release();
|
| }
|
| - result->key_ = PK11_FindKeyByKeyID(slot.get(), ck_id.get(), NULL);
|
| }
|
|
|
| - // If we didn't find it, that's ok.
|
| - if (!result->key_)
|
| - return NULL;
|
| -
|
| - return result.release();
|
| + // We didn't find the key.
|
| + return NULL;
|
| }
|
|
|
|
|
|
|