Chromium Code Reviews| Index: mozilla/security/nss/lib/pk11wrap/pk11obj.c |
| =================================================================== |
| --- mozilla/security/nss/lib/pk11wrap/pk11obj.c (revision 182578) |
| +++ mozilla/security/nss/lib/pk11wrap/pk11obj.c (working copy) |
| @@ -822,6 +822,93 @@ |
| return SECSuccess; |
| } |
| +SECStatus |
| +PK11_EncryptWithSymKey(PK11SymKey *symKey, |
|
wtc
2013/03/26 18:24:46
The two new functions are very similar to the PK11
Ryan Sleevi
2013/03/26 18:39:14
I don't have strong feelings about this, although
|
| + CK_MECHANISM_TYPE mechanism, SECItem *param, |
| + unsigned char *out, unsigned int *outLen, |
| + unsigned int maxLen, |
| + const unsigned char *data, unsigned dataLen) |
| +{ |
| + PK11SlotInfo *slot = symKey->slot; |
| + CK_MECHANISM mech = {0, NULL, 0 }; |
| + CK_ULONG len = maxLen; |
| + PRBool owner = PR_TRUE; |
| + CK_SESSION_HANDLE session; |
| + PRBool haslock = PR_FALSE; |
| + 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_EncryptInit(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; |
| + } |
| + crv = PK11_GETTAB(slot)->C_Encrypt(session, (unsigned char *)data, |
| + dataLen, out, &len); |
| + if (haslock) PK11_ExitSlotMonitor(slot); |
| + pk11_CloseSession(slot,session,owner); |
| + *outLen = len; |
| + if (crv != CKR_OK) { |
| + PORT_SetError( PK11_MapError(crv) ); |
| + return SECFailure; |
| + } |
| + return SECSuccess; |
| +} |
| + |
| +SECStatus |
| +PK11_DecryptWithSymKey(PK11SymKey *symKey, |
| + CK_MECHANISM_TYPE mechanism, SECItem *param, |
| + unsigned char *out, unsigned int *outLen, |
| + unsigned int maxLen, |
| + const unsigned char *enc, unsigned encLen) |
| +{ |
| + PK11SlotInfo *slot = symKey->slot; |
| + CK_MECHANISM mech = {0, NULL, 0 }; |
| + CK_ULONG len = maxLen; |
| + PRBool owner = PR_TRUE; |
| + CK_SESSION_HANDLE session; |
| + PRBool haslock = PR_FALSE; |
| + 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_DecryptInit(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; |
| + } |
| + |
| + crv = PK11_GETTAB(slot)->C_Decrypt(session, (unsigned char *)enc, encLen, |
| + out, &len); |
| + if (haslock) PK11_ExitSlotMonitor(slot); |
| + pk11_CloseSession(slot, session, owner); |
| + *outLen = 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 |