| Index: nss/lib/pk11wrap/pk11obj.c
|
| diff --git a/nss/lib/pk11wrap/pk11obj.c b/nss/lib/pk11wrap/pk11obj.c
|
| index 848b45a017919918b3c66ac0aeba55a66b381efc..260aeed69873e8878e385a8d8e1067c7a747ae49 100644
|
| --- a/nss/lib/pk11wrap/pk11obj.c
|
| +++ b/nss/lib/pk11wrap/pk11obj.c
|
| @@ -25,6 +25,8 @@ SECItem *
|
| PK11_BlockData(SECItem *data,unsigned long size) {
|
| SECItem *newData;
|
|
|
| + if (size == 0u) return NULL;
|
| +
|
| newData = (SECItem *)PORT_Alloc(sizeof(SECItem));
|
| if (newData == NULL) return NULL;
|
|
|
| @@ -666,6 +668,18 @@ SECStatus
|
| PK11_Verify(SECKEYPublicKey *key, const SECItem *sig, const SECItem *hash,
|
| void *wincx)
|
| {
|
| + CK_MECHANISM_TYPE mech = PK11_MapSignKeyType(key->keyType);
|
| + return PK11_VerifyWithMechanism(key, mech, NULL, sig, hash, wincx);
|
| +}
|
| +
|
| +/*
|
| + * Verify a signature from its hash using the given algorithm.
|
| + */
|
| +SECStatus
|
| +PK11_VerifyWithMechanism(SECKEYPublicKey *key, CK_MECHANISM_TYPE mechanism,
|
| + const SECItem *param, const SECItem *sig,
|
| + const SECItem *hash, void *wincx)
|
| +{
|
| PK11SlotInfo *slot = key->pkcs11Slot;
|
| CK_OBJECT_HANDLE id = key->pkcs11ID;
|
| CK_MECHANISM mech = {0, NULL, 0 };
|
| @@ -673,7 +687,11 @@ PK11_Verify(SECKEYPublicKey *key, const SECItem *sig, const SECItem *hash,
|
| CK_SESSION_HANDLE session;
|
| CK_RV crv;
|
|
|
| - mech.mechanism = PK11_MapSignKeyType(key->keyType);
|
| + mech.mechanism = mechanism;
|
| + if (param) {
|
| + mech.pParameter = param->data;
|
| + mech.ulParameterLen = param->len;
|
| + }
|
|
|
| if (slot == NULL) {
|
| unsigned int length = 0;
|
| @@ -737,6 +755,17 @@ PK11_Verify(SECKEYPublicKey *key, const SECItem *sig, const SECItem *hash,
|
| SECStatus
|
| PK11_Sign(SECKEYPrivateKey *key, SECItem *sig, const SECItem *hash)
|
| {
|
| + CK_MECHANISM_TYPE mech = PK11_MapSignKeyType(key->keyType);
|
| + return PK11_SignWithMechanism(key, mech, NULL, sig, hash);
|
| +}
|
| +
|
| +/*
|
| + * Sign a hash using the given algorithm.
|
| + */
|
| +SECStatus
|
| +PK11_SignWithMechanism(SECKEYPrivateKey *key, CK_MECHANISM_TYPE mechanism,
|
| + const SECItem *param, SECItem *sig, const SECItem *hash)
|
| +{
|
| PK11SlotInfo *slot = key->pkcs11Slot;
|
| CK_MECHANISM mech = {0, NULL, 0 };
|
| PRBool owner = PR_TRUE;
|
| @@ -745,7 +774,11 @@ PK11_Sign(SECKEYPrivateKey *key, SECItem *sig, const SECItem *hash)
|
| CK_ULONG len;
|
| CK_RV crv;
|
|
|
| - mech.mechanism = PK11_MapSignKeyType(key->keyType);
|
| + mech.mechanism = mechanism;
|
| + if (param) {
|
| + mech.pParameter = param->data;
|
| + mech.ulParameterLen = param->len;
|
| + }
|
|
|
| if (SECKEY_HAS_ATTRIBUTE_SET(key,CKA_PRIVATE)) {
|
| PK11_HandlePasswordCheck(slot, key->wincx);
|
|
|