mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 21:05:36 +00:00
Fix bug 87650: replace slot traversal functions with list functions.
Add SECKEY_ImportDERPublicKey.
This commit is contained in:
parent
c1ab3021f5
commit
46c3dc53ea
@ -33,7 +33,7 @@
|
||||
*
|
||||
* key.h - public data structures and prototypes for the private key library
|
||||
*
|
||||
* $Id: keyhi.h,v 1.4 2001/06/07 21:47:29 relyea%netscape.com Exp $
|
||||
* $Id: keyhi.h,v 1.5 2001/06/25 19:31:04 nicolson%netscape.com Exp $
|
||||
*/
|
||||
|
||||
#ifndef _KEYHI_H_
|
||||
@ -227,6 +227,29 @@ SECKEY_CopyEncryptedPrivateKeyInfo(PRArenaPool *poolp,
|
||||
KeyType SECKEY_GetPrivateKeyType(SECKEYPrivateKey *privKey);
|
||||
KeyType SECKEY_GetPublicKeyType(SECKEYPublicKey *pubKey);
|
||||
|
||||
/*
|
||||
* Creates a PublicKey from its DER encoding.
|
||||
* Currently only supports RSA and DSA keys.
|
||||
*/
|
||||
SECKEYPublicKey*
|
||||
SECKEY_ImportDERPublicKey(SECItem *derKey, CK_KEY_TYPE type);
|
||||
|
||||
SECKEYPrivateKeyList*
|
||||
SECKEY_NewPrivateKeyList(void);
|
||||
|
||||
void
|
||||
SECKEY_DestroyPrivateKeyList(SECKEYPrivateKeyList *keys);
|
||||
|
||||
void
|
||||
SECKEY_RemovePrivateKeyListNode(SECKEYPrivateKeyListNode *node);
|
||||
|
||||
SECStatus
|
||||
SECKEY_AddPrivateKeyToListTail( SECKEYPrivateKeyList *list,
|
||||
SECKEYPrivateKey *key);
|
||||
|
||||
#define PRIVKEY_LIST_HEAD(l) ((SECKEYPrivateKeyListNode*)PR_LIST_HEAD(&l->list))
|
||||
#define PRIVKEY_LIST_NEXT(n) ((SECKEYPrivateKeyListNode *)n->links.next)
|
||||
#define PRIVKEY_LIST_END(n,l) (((void *)n) == ((void *)&l->list))
|
||||
|
||||
SEC_END_PROTOS
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "plarena.h"
|
||||
#include "pkcs11t.h"
|
||||
#include "secmodt.h"
|
||||
#include "prclist.h"
|
||||
|
||||
/*
|
||||
** A Generic public key object.
|
||||
@ -80,4 +81,14 @@ typedef struct {
|
||||
void *wincx;
|
||||
} SEC_PKCS5KeyAndPassword;
|
||||
|
||||
typedef struct {
|
||||
PRCList links;
|
||||
SECKEYPrivateKey *key;
|
||||
} SECKEYPrivateKeyListNode;
|
||||
|
||||
typedef struct {
|
||||
PRCList list;
|
||||
PRArenaPool *arena;
|
||||
} SECKEYPrivateKeyList;
|
||||
|
||||
#endif /* _KEYTHI_H_ */
|
||||
|
@ -1693,3 +1693,112 @@ SECKEY_GetPublicKeyType(SECKEYPublicKey *pubKey)
|
||||
{
|
||||
return pubKey->keyType;
|
||||
}
|
||||
|
||||
SECKEYPublicKey*
|
||||
SECKEY_ImportDERPublicKey(SECItem *derKey, CK_KEY_TYPE type)
|
||||
{
|
||||
SECKEYPublicKey *pubk = NULL;
|
||||
SECStatus rv = SECFailure;
|
||||
|
||||
pubk = PORT_New(SECKEYPublicKey);
|
||||
if(pubk == NULL) {
|
||||
goto finish;
|
||||
}
|
||||
pubk->arena = NULL;
|
||||
pubk->pkcs11Slot = NULL;
|
||||
pubk->pkcs11ID = CK_INVALID_HANDLE;
|
||||
pubk->keyType = type;
|
||||
|
||||
if( type == CKK_RSA) {
|
||||
rv = SEC_ASN1DecodeItem(NULL, pubk, SECKEY_RSAPublicKeyTemplate,
|
||||
derKey);
|
||||
} else if( type == CKK_DSA) {
|
||||
rv = SEC_ASN1DecodeItem(NULL, pubk, SECKEY_DSAPublicKeyTemplate,
|
||||
derKey);
|
||||
} else {
|
||||
rv = SECFailure;
|
||||
}
|
||||
|
||||
finish:
|
||||
if( rv != SECSuccess && pubk != NULL) {
|
||||
PORT_Free(pubk);
|
||||
pubk = NULL;
|
||||
}
|
||||
return pubk;
|
||||
}
|
||||
|
||||
SECKEYPrivateKeyList*
|
||||
SECKEY_NewPrivateKeyList(void)
|
||||
{
|
||||
PRArenaPool *arena = NULL;
|
||||
SECKEYPrivateKeyList *ret = NULL;
|
||||
|
||||
arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
||||
if ( arena == NULL ) {
|
||||
goto loser;
|
||||
}
|
||||
|
||||
ret = (SECKEYPrivateKeyList *)PORT_ArenaZAlloc(arena,
|
||||
sizeof(SECKEYPrivateKeyList));
|
||||
if ( ret == NULL ) {
|
||||
goto loser;
|
||||
}
|
||||
|
||||
ret->arena = arena;
|
||||
|
||||
PR_INIT_CLIST(&ret->list);
|
||||
|
||||
return(ret);
|
||||
|
||||
loser:
|
||||
if ( arena != NULL ) {
|
||||
PORT_FreeArena(arena, PR_FALSE);
|
||||
}
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
void
|
||||
SECKEY_DestroyPrivateKeyList(SECKEYPrivateKeyList *keys)
|
||||
{
|
||||
while( !PR_CLIST_IS_EMPTY(&keys->list) ) {
|
||||
SECKEY_RemovePrivateKeyListNode(
|
||||
(SECKEYPrivateKeyListNode*)(PR_LIST_HEAD(&keys->list)) );
|
||||
}
|
||||
|
||||
PORT_FreeArena(keys->arena, PR_FALSE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SECKEY_RemovePrivateKeyListNode(SECKEYPrivateKeyListNode *node)
|
||||
{
|
||||
PR_ASSERT(node->key);
|
||||
SECKEY_DestroyPrivateKey(node->key);
|
||||
node->key = NULL;
|
||||
PR_REMOVE_LINK(&node->links);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
SECStatus
|
||||
SECKEY_AddPrivateKeyToListTail( SECKEYPrivateKeyList *list,
|
||||
SECKEYPrivateKey *key)
|
||||
{
|
||||
SECKEYPrivateKeyListNode *node;
|
||||
|
||||
node = (SECKEYPrivateKeyListNode *)PORT_ArenaZAlloc(list->arena,
|
||||
sizeof(SECKEYPrivateKeyListNode));
|
||||
if ( node == NULL ) {
|
||||
goto loser;
|
||||
}
|
||||
|
||||
PR_INSERT_BEFORE(&node->links, &list->list);
|
||||
node->key = key;
|
||||
return(SECSuccess);
|
||||
|
||||
loser:
|
||||
return(SECFailure);
|
||||
}
|
||||
|
@ -518,8 +518,6 @@ PK11_ReferenceSlot;
|
||||
PK11_GetSlotPWValues;
|
||||
PK11_ImportSymKey;
|
||||
PK11_ExtractKeyValue;
|
||||
PK11_TraversePrivateKeysInSlot;
|
||||
PK11_TraverseCertsInSlot;
|
||||
SEC_CertNicknameConflict;
|
||||
SECMOD_DeleteInternalModule;
|
||||
SECMOD_DestroyModule;
|
||||
@ -533,7 +531,14 @@ SECKEY_GetPrivateKeyType;
|
||||
SECKEY_EncodeDERSubjectPublicKeyInfo;
|
||||
SECKEY_ExtractPublicKey;
|
||||
SECKEY_HashPassword;
|
||||
SECKEY_ImportDERPublicKey;
|
||||
SECKEY_NewPrivateKeyList;
|
||||
SECKEY_DestroyPrivateKeyList;
|
||||
SECKEY_RemovePrivateKeyListNode;
|
||||
SECKEY_AddPrivateKeyToListTail;
|
||||
SEC_PKCS5GetIV;
|
||||
PK11_ListPrivateKeysInSlot;
|
||||
PK11_ListCertsInSlot;
|
||||
VFY_EndWithSignature;
|
||||
;+ local:
|
||||
;+ *;
|
||||
|
@ -32,7 +32,7 @@
|
||||
* may use your version of this file under either the MPL or the
|
||||
* GPL.
|
||||
*
|
||||
# $Id: nssinit.c,v 1.20 2001/06/12 22:25:13 nicolson%netscape.com Exp $
|
||||
# $Id: nssinit.c,v 1.21 2001/06/25 19:31:12 nicolson%netscape.com Exp $
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
@ -345,7 +345,11 @@ NSS_NoDB_Init(const char * configdir)
|
||||
{
|
||||
|
||||
SECStatus rv = SECSuccess;
|
||||
|
||||
|
||||
if( isInitialized ) {
|
||||
return SECSuccess;
|
||||
}
|
||||
|
||||
rv = RNG_RNGInit();
|
||||
if (rv != SECSuccess) {
|
||||
return rv;
|
||||
@ -358,6 +362,8 @@ NSS_NoDB_Init(const char * configdir)
|
||||
}
|
||||
rv = nss_OpenVolatileSecModDB();
|
||||
|
||||
isInitialized = PR_TRUE;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -378,6 +384,8 @@ NSS_Shutdown(void)
|
||||
if (keyHandle)
|
||||
SECKEY_CloseKeyDB(keyHandle);
|
||||
SECKEY_SetDefaultKeyDB(NULL);
|
||||
|
||||
isInitialized = PR_FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2806,3 +2806,59 @@ PK11_GetLowLevelKeyIDForPrivateKey(SECKEYPrivateKey *privKey)
|
||||
return pk11_GetLowLevelKeyFromHandle(privKey->pkcs11Slot,privKey->pkcs11ID);
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
listCertsCallback(CERTCertificate* cert, void*arg)
|
||||
{
|
||||
CERTCertList *list = (CERTCertList*)arg;
|
||||
|
||||
return CERT_AddCertToListTail(list, CERT_DupCertificate(cert));
|
||||
}
|
||||
|
||||
CERTCertList *
|
||||
PK11_ListCertsInSlot(PK11SlotInfo *slot)
|
||||
{
|
||||
SECStatus status;
|
||||
CERTCertList *certs;
|
||||
|
||||
certs = CERT_NewCertList();
|
||||
if(certs == NULL) return NULL;
|
||||
|
||||
status = PK11_TraverseCertsInSlot(slot, listCertsCallback,
|
||||
(void*)certs);
|
||||
|
||||
if( status != SECSuccess ) {
|
||||
SECKEY_DestroyCertList(certs);
|
||||
certs = NULL;
|
||||
}
|
||||
|
||||
return certs;
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
privateKeyListCallback(SECKEYPrivateKey *key, void *arg)
|
||||
{
|
||||
SECKEYPrivateKeyList *list = (SECKEYPrivateKeyList*)arg;
|
||||
|
||||
return SECKEY_AddPrivateKeyToListTail(list, SECKEY_CopyPrivateKey(key));
|
||||
}
|
||||
|
||||
SECKEYPrivateKeyList*
|
||||
PK11_ListPrivateKeysInSlot(PK11SlotInfo *slot)
|
||||
{
|
||||
SECStatus status;
|
||||
SECKEYPrivateKeyList *keys;
|
||||
|
||||
keys = SECKEY_NewPrivateKeyList();
|
||||
if(keys == NULL) return NULL;
|
||||
|
||||
status = PK11_TraversePrivateKeysInSlot(slot, privateKeyListCallback,
|
||||
(void*)keys);
|
||||
|
||||
if( status != SECSuccess ) {
|
||||
SECKEY_DestroyPrivateKeyList(keys);
|
||||
keys = NULL;
|
||||
}
|
||||
|
||||
return keys;
|
||||
}
|
||||
|
||||
|
@ -336,6 +336,7 @@ SECItem * PK11_GetKeyIDFromPrivateKey(SECKEYPrivateKey *key, void *wincx);
|
||||
SECItem* PK11_DEREncodePublicKey(SECKEYPublicKey *pubk);
|
||||
PK11SymKey* PK11_CopySymKeyForSigning(PK11SymKey *originalKey,
|
||||
CK_MECHANISM_TYPE mech);
|
||||
SECKEYPrivateKeyList* PK11_ListPrivateKeysInSlot(PK11SlotInfo *slot);
|
||||
|
||||
/**********************************************************************
|
||||
* Certs
|
||||
@ -403,6 +404,8 @@ SECStatus PK11_TraverseCertsInSlot(PK11SlotInfo *slot,
|
||||
SECStatus(* callback)(CERTCertificate*, void *), void *arg);
|
||||
CERTCertList *
|
||||
PK11_ListCerts(PK11CertListType type, void *pwarg);
|
||||
CERTCertList *
|
||||
PK11_ListCertsInSlot(PK11SlotInfo *slot);
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user