| Index: mozilla/security/nss/lib/pk11wrap/pk11obj.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/pk11wrap/pk11obj.c (revision 180595)
|
| +++ mozilla/security/nss/lib/pk11wrap/pk11obj.c (working copy)
|
| @@ -778,6 +778,51 @@
|
| }
|
|
|
| /*
|
| + * sign data with a MAC key.
|
| + */
|
| +SECStatus
|
| +PK11_SignWithSymKey(PK11SymKey *symKey, CK_MECHANISM_TYPE mechanism,
|
| + SECItem *param, SECItem *sig, const SECItem *data)
|
| +{
|
| + PK11SlotInfo *slot = symKey->slot;
|
| + CK_MECHANISM mech = {0, NULL, 0 };
|
| + PRBool owner = PR_TRUE;
|
| + CK_SESSION_HANDLE session;
|
| + PRBool haslock = PR_FALSE;
|
| + CK_ULONG len;
|
| + CK_RV crv;
|
| +
|
| + mech.mechanism = mechanism;
|
| + if (param) {
|
| + mech.pParameter = param->data;
|
| + mech.ulParameterLen = param->len;
|
| + }
|
| +
|
| + session = pk11_GetNewSession(slot,&owner);
|
| + haslock = (!owner || !(slot->isThreadSafe));
|
| + if (haslock) PK11_EnterSlotMonitor(slot);
|
| + crv = PK11_GETTAB(slot)->C_SignInit(session,&mech,symKey->objectID);
|
| + if (crv != CKR_OK) {
|
| + if (haslock) PK11_ExitSlotMonitor(slot);
|
| + pk11_CloseSession(slot,session,owner);
|
| + PORT_SetError( PK11_MapError(crv) );
|
| + return SECFailure;
|
| + }
|
| +
|
| + len = sig->len;
|
| + crv = PK11_GETTAB(slot)->C_Sign(session,data->data,
|
| + data->len, sig->data, &len);
|
| + if (haslock) PK11_ExitSlotMonitor(slot);
|
| + pk11_CloseSession(slot,session,owner);
|
| + sig->len = len;
|
| + if (crv != CKR_OK) {
|
| + PORT_SetError( PK11_MapError(crv) );
|
| + return SECFailure;
|
| + }
|
| + return SECSuccess;
|
| +}
|
| +
|
| +/*
|
| * Now SSL 2.0 uses raw RSA stuff. These next to functions *must* use
|
| * RSA keys, or they'll fail. We do the checks up front. If anyone comes
|
| * up with a meaning for rawdecrypt for any other public key operation,
|
|
|