diff --git a/security/nss/lib/nss/nss.def b/security/nss/lib/nss/nss.def index e29a8c827298..1ac985afb1dc 100644 --- a/security/nss/lib/nss/nss.def +++ b/security/nss/lib/nss/nss.def @@ -640,6 +640,7 @@ PK11_DeleteTokenPrivateKey; PK11_DeleteTokenPublicKey; PK11_DeleteTokenSymKey; PK11_GetSymKeyNickname; +PK11_GetPQGParamsFromPrivateKey; PK11_GetPublicKeyNickname; PK11_GetPrivateKeyNickname; PK11_SetSymKeyNickname; diff --git a/security/nss/lib/pk11wrap/pk11func.h b/security/nss/lib/pk11wrap/pk11func.h index e0b2cb886fa3..b619e0f4d5ce 100644 --- a/security/nss/lib/pk11wrap/pk11func.h +++ b/security/nss/lib/pk11wrap/pk11func.h @@ -374,6 +374,7 @@ SECKEYPrivateKeyList* PK11_ListPrivKeysInSlot(PK11SlotInfo *slot, char *nickname, void *wincx); SECKEYPublicKeyList* PK11_ListPublicKeysInSlot(PK11SlotInfo *slot, char *nickname); +SECKEYPQGParams *PK11_GetPQGParamsFromPrivateKey(SECKEYPrivateKey *privKey); /* depricated */ SECKEYPrivateKeyList* PK11_ListPrivateKeysInSlot(PK11SlotInfo *slot); diff --git a/security/nss/lib/pk11wrap/pk11skey.c b/security/nss/lib/pk11wrap/pk11skey.c index 96772f82ee9e..1597d63abe1e 100644 --- a/security/nss/lib/pk11wrap/pk11skey.c +++ b/security/nss/lib/pk11wrap/pk11skey.c @@ -4893,3 +4893,48 @@ PK11_SetPublicKeyNickname(SECKEYPublicKey *pubKey, const char *nickname) return PK11_SetObjectNickname(pubKey->pkcs11Slot, pubKey->pkcs11ID,nickname); } + +SECKEYPQGParams * +PK11_GetPQGParamsFromPrivateKey(SECKEYPrivateKey *privKey) +{ + CK_ATTRIBUTE pTemplate[] = { + { CKA_PRIME, NULL, 0 }, + { CKA_SUBPRIME, NULL, 0 }, + { CKA_BASE, NULL, 0 }, + }; + int pTemplateLen = sizeof(pTemplate)/sizeof(pTemplate[0]); + PRArenaPool *arena = NULL; + SECKEYPQGParams *params; + CK_RV crv; + + + arena = PORT_NewArena(2048); + if (arena == NULL) { + goto loser; + } + params=(SECKEYPQGParams *)PORT_ArenaZAlloc(arena,sizeof(SECKEYPQGParams)); + if (params == NULL) { + goto loser; + } + + crv = PK11_GetAttributes(arena, privKey->pkcs11Slot, privKey->pkcs11ID, + pTemplate, pTemplateLen); + if (crv != CKR_OK) { + PORT_SetError( PK11_MapError(crv) ); + goto loser; + } + + params->arena = arena; + params->prime.data = pTemplate[0].pValue; + params->prime.len = pTemplate[0].ulValueLen; + params->subPrime.data = pTemplate[1].pValue; + params->subPrime.len = pTemplate[1].ulValueLen; + params->base.data = pTemplate[2].pValue; + params->base.len = pTemplate[2].ulValueLen; + + return params; + +loser: + PORT_FreeArena(arena,PR_FALSE); + return NULL; +}