Index: nss/lib/pk11wrap/pk11obj.c |
diff --git a/nss/lib/pk11wrap/pk11obj.c b/nss/lib/pk11wrap/pk11obj.c |
index 84268ab497f6ff9d145a8ecf0a29224e74cfc22f..70802948193e7f4ece6d57f1e4ab9b1590301ab9 100644 |
--- a/nss/lib/pk11wrap/pk11obj.c |
+++ b/nss/lib/pk11wrap/pk11obj.c |
@@ -914,17 +914,11 @@ PK11_Encrypt(PK11SymKey *symKey, |
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, |
- * then we need to move this check into some of PK11_PubDecrypt callers, |
- * (namely SSL 2.0). |
- */ |
static SECStatus |
-pk11_PrivDecryptRaw(SECKEYPrivateKey *key, unsigned char *data, |
- unsigned *outLen, unsigned int maxLen, unsigned char *enc, |
- unsigned encLen, CK_MECHANISM_PTR mech) |
+pk11_PrivDecryptRaw(SECKEYPrivateKey *key, |
+ unsigned char *data, unsigned *outLen, unsigned int maxLen, |
+ const unsigned char *enc, unsigned encLen, |
+ CK_MECHANISM_PTR mech) |
{ |
PK11SlotInfo *slot = key->pkcs11Slot; |
CK_ULONG out = maxLen; |
@@ -960,11 +954,12 @@ pk11_PrivDecryptRaw(SECKEYPrivateKey *key, unsigned char *data, |
* do C_Login with CKU_CONTEXT_SPECIFIC |
* between C_DecryptInit and C_Decrypt |
* ... But see note above about servers */ |
- if (SECKEY_HAS_ATTRIBUTE_SET_LOCK(key, CKA_ALWAYS_AUTHENTICATE, haslock)) { |
+ if (SECKEY_HAS_ATTRIBUTE_SET_LOCK(key, CKA_ALWAYS_AUTHENTICATE, haslock)) { |
PK11_DoPassword(slot, session, PR_FALSE, key->wincx, haslock, PR_TRUE); |
} |
- crv = PK11_GETTAB(slot)->C_Decrypt(session,enc, encLen, data, &out); |
+ crv = PK11_GETTAB(slot)->C_Decrypt(session, (unsigned char *)enc, encLen, |
+ data, &out); |
if (haslock) PK11_ExitSlotMonitor(slot); |
pk11_CloseSession(slot,session,owner); |
*outLen = out; |
@@ -976,41 +971,37 @@ pk11_PrivDecryptRaw(SECKEYPrivateKey *key, unsigned char *data, |
} |
SECStatus |
-PK11_PubDecryptRaw(SECKEYPrivateKey *key, unsigned char *data, |
- unsigned *outLen, unsigned int maxLen, unsigned char *enc, |
- unsigned encLen) |
+PK11_PubDecryptRaw(SECKEYPrivateKey *key, |
+ unsigned char *data, unsigned *outLen, unsigned int maxLen, |
+ const unsigned char *enc, unsigned encLen) |
{ |
CK_MECHANISM mech = {CKM_RSA_X_509, NULL, 0 }; |
return pk11_PrivDecryptRaw(key, data, outLen, maxLen, enc, encLen, &mech); |
} |
SECStatus |
-PK11_PrivDecryptPKCS1(SECKEYPrivateKey *key, unsigned char *data, |
- unsigned *outLen, unsigned int maxLen, unsigned char *enc, |
- unsigned encLen) |
+PK11_PrivDecryptPKCS1(SECKEYPrivateKey *key, |
+ unsigned char *data, unsigned *outLen, unsigned int maxLen, |
+ const unsigned char *enc, unsigned encLen) |
{ |
CK_MECHANISM mech = {CKM_RSA_PKCS, NULL, 0 }; |
return pk11_PrivDecryptRaw(key, data, outLen, maxLen, enc, encLen, &mech); |
} |
static SECStatus |
-pk11_PubEncryptRaw(SECKEYPublicKey *key, unsigned char *enc, |
- unsigned char *data, unsigned dataLen, |
- CK_MECHANISM_PTR mech, void *wincx) |
+pk11_PubEncryptRaw(SECKEYPublicKey *key, |
+ unsigned char *out, unsigned int *outLen, |
+ unsigned int maxLen, |
+ const unsigned char *data, unsigned dataLen, |
+ CK_MECHANISM_PTR mech, void *wincx) |
{ |
PK11SlotInfo *slot; |
CK_OBJECT_HANDLE id; |
- CK_ULONG out; |
+ CK_ULONG len = maxLen; |
PRBool owner = PR_TRUE; |
CK_SESSION_HANDLE session; |
CK_RV crv; |
- if (!key || key->keyType != rsaKey) { |
- PORT_SetError( SEC_ERROR_BAD_KEY ); |
- return SECFailure; |
- } |
- out = SECKEY_PublicKeyStrength(key); |
- |
slot = PK11_GetBestSlotWithAttributes(mech->mechanism,CKF_ENCRYPT,0,wincx); |
if (slot == NULL) { |
PORT_SetError( SEC_ERROR_NO_MODULE ); |
@@ -1035,10 +1026,12 @@ pk11_PubEncryptRaw(SECKEYPublicKey *key, unsigned char *enc, |
PORT_SetError( PK11_MapError(crv) ); |
return SECFailure; |
} |
- crv = PK11_GETTAB(slot)->C_Encrypt(session,data,dataLen,enc,&out); |
+ crv = PK11_GETTAB(slot)->C_Encrypt(session,(unsigned char *)data,dataLen, |
+ out,&len); |
if (!owner || !(slot->isThreadSafe)) PK11_ExitSlotMonitor(slot); |
pk11_CloseSession(slot,session,owner); |
PK11_FreeSlot(slot); |
+ *outLen = len; |
if (crv != CKR_OK) { |
PORT_SetError( PK11_MapError(crv) ); |
return SECFailure; |
@@ -1047,19 +1040,69 @@ pk11_PubEncryptRaw(SECKEYPublicKey *key, unsigned char *enc, |
} |
SECStatus |
-PK11_PubEncryptRaw(SECKEYPublicKey *key, unsigned char *enc, |
- unsigned char *data, unsigned dataLen, void *wincx) |
+PK11_PubEncryptRaw(SECKEYPublicKey *key, |
+ unsigned char *enc, |
+ const unsigned char *data, unsigned dataLen, |
+ void *wincx) |
{ |
CK_MECHANISM mech = {CKM_RSA_X_509, NULL, 0 }; |
- return pk11_PubEncryptRaw(key, enc, data, dataLen, &mech, wincx); |
+ unsigned int outLen; |
+ if (!key || key->keyType != rsaKey) { |
+ PORT_SetError(SEC_ERROR_BAD_KEY); |
+ return SECFailure; |
+ } |
+ outLen = SECKEY_PublicKeyStrength(key); |
+ return pk11_PubEncryptRaw(key, enc, &outLen, outLen, data, dataLen, &mech, |
+ wincx); |
} |
SECStatus |
-PK11_PubEncryptPKCS1(SECKEYPublicKey *key, unsigned char *enc, |
- unsigned char *data, unsigned dataLen, void *wincx) |
+PK11_PubEncryptPKCS1(SECKEYPublicKey *key, |
+ unsigned char *enc, |
+ const unsigned char *data, unsigned dataLen, |
+ void *wincx) |
{ |
CK_MECHANISM mech = {CKM_RSA_PKCS, NULL, 0 }; |
- return pk11_PubEncryptRaw(key, enc, data, dataLen, &mech, wincx); |
+ unsigned int outLen; |
+ if (!key || key->keyType != rsaKey) { |
wtc
2014/05/20 19:25:57
It seems that we lost the key type checks in the n
Ryan Sleevi
2014/05/20 21:19:14
This was intentional.
I wanted PK11_PubEncrypt an
|
+ PORT_SetError(SEC_ERROR_BAD_KEY); |
+ return SECFailure; |
+ } |
+ outLen = SECKEY_PublicKeyStrength(key); |
+ return pk11_PubEncryptRaw(key, enc, &outLen, outLen, data, dataLen, &mech, |
+ wincx); |
+} |
+ |
+SECStatus |
+PK11_PrivDecrypt(SECKEYPrivateKey *key, |
+ CK_MECHANISM_TYPE mechanism, SECItem *param, |
+ unsigned char *out, unsigned int *outLen, |
+ unsigned int maxLen, |
+ const unsigned char *enc, unsigned encLen) |
+{ |
+ CK_MECHANISM mech = { mechanism, NULL, 0 }; |
+ if (param) { |
+ mech.pParameter = param->data; |
+ mech.ulParameterLen = param->len; |
+ } |
+ return pk11_PrivDecryptRaw(key, out, outLen, maxLen, enc, encLen, &mech); |
+} |
+ |
+SECStatus |
+PK11_PubEncrypt(SECKEYPublicKey *key, |
+ CK_MECHANISM_TYPE mechanism, SECItem *param, |
+ unsigned char *out, unsigned int *outLen, |
+ unsigned int maxLen, |
+ const unsigned char *data, unsigned dataLen, |
+ void *wincx) |
+{ |
+ CK_MECHANISM mech = { mechanism, NULL, 0 }; |
+ if (param) { |
+ mech.pParameter = param->data; |
+ mech.ulParameterLen = param->len; |
+ } |
+ return pk11_PubEncryptRaw(key, out, outLen, maxLen, data, dataLen, &mech, |
+ wincx); |
} |
SECKEYPrivateKey * |