Index: nss/mozilla/security/nss/lib/softoken/pkcs11c.c |
=================================================================== |
--- nss/mozilla/security/nss/lib/softoken/pkcs11c.c (revision 162724) |
+++ nss/mozilla/security/nss/lib/softoken/pkcs11c.c (working copy) |
@@ -425,17 +425,38 @@ |
} |
context->type = ctype; |
context->multi = PR_TRUE; |
+ context->rsa = PR_FALSE; |
context->cipherInfo = NULL; |
context->hashInfo = NULL; |
context->doPad = PR_FALSE; |
context->padDataLength = 0; |
context->key = key; |
context->blockSize = 0; |
+ context->maxLen = 0; |
*contextPtr = context; |
return CKR_OK; |
} |
+static int |
+sftk_aes_mode(CK_MECHANISM_TYPE mechanism) |
+{ |
+ switch (mechanism) { |
+ case CKM_AES_CBC_PAD: |
+ case CKM_AES_CBC: |
+ return NSS_AES_CBC; |
+ case CKM_AES_ECB: |
+ return NSS_AES; |
+ case CKM_AES_CTS: |
+ return NSS_AES_CTS; |
+ case CKM_AES_CTR: |
+ return NSS_AES_CTR; |
+ case CKM_AES_GCM: |
+ return NSS_AES_GCM; |
+ } |
+ return -1; |
+} |
+ |
/** NSC_CryptInit initializes an encryption/Decryption operation. |
* |
* Always called by NSC_EncryptInit, NSC_DecryptInit, NSC_WrapKey,NSC_UnwrapKey. |
@@ -488,6 +509,7 @@ |
break; |
} |
context->multi = PR_FALSE; |
+ context->rsa = PR_TRUE; |
if (isEncrypt) { |
NSSLOWKEYPublicKey *pubKey = sftk_GetPubKey(key,CKK_RSA,&crv); |
if (pubKey == NULL) { |
@@ -750,6 +772,12 @@ |
case CKM_AES_ECB: |
case CKM_AES_CBC: |
context->blockSize = 16; |
+ case CKM_AES_CTS: |
+ case CKM_AES_CTR: |
+ case CKM_AES_GCM: |
+ if (pMechanism->mechanism == CKM_AES_GCM) { |
+ context->multi = PR_FALSE; |
+ } |
if (key_type != CKK_AES) { |
crv = CKR_KEY_TYPE_INCONSISTENT; |
break; |
@@ -762,7 +790,7 @@ |
context->cipherInfo = AES_CreateContext( |
(unsigned char*)att->attrib.pValue, |
(unsigned char*)pMechanism->pParameter, |
- pMechanism->mechanism == CKM_AES_ECB ? NSS_AES : NSS_AES_CBC, |
+ sftk_aes_mode(pMechanism->mechanism), |
isEncrypt, att->attrib.ulValueLen, 16); |
sftk_FreeAttribute(att); |
if (context->cipherInfo == NULL) { |
@@ -980,8 +1008,8 @@ |
if (crv != CKR_OK) return crv; |
if (!pEncryptedData) { |
- *pulEncryptedDataLen = context->multi ? |
- ulDataLen + 2 * context->blockSize : context->maxLen; |
+ *pulEncryptedDataLen = context->rsa ? context->maxLen : |
+ ulDataLen + 2 * context->blockSize; |
goto finish; |
} |
@@ -1993,6 +2021,7 @@ |
crv = CKR_KEY_TYPE_INCONSISTENT; |
break; |
} |
+ context->rsa = PR_TRUE; |
privKey = sftk_GetPrivKey(key,CKK_RSA,&crv); |
if (privKey == NULL) { |
crv = CKR_KEY_TYPE_INCONSISTENT; |
@@ -2017,6 +2046,7 @@ |
crv = CKR_KEY_TYPE_INCONSISTENT; |
break; |
} |
+ context->rsa = PR_TRUE; |
if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS)) { |
crv = CKR_MECHANISM_PARAM_INVALID; |
break; |
@@ -2510,6 +2540,7 @@ |
crv = CKR_KEY_TYPE_INCONSISTENT; |
break; |
} |
+ context->rsa = PR_TRUE; |
pubKey = sftk_GetPubKey(key,CKK_RSA,&crv); |
if (pubKey == NULL) { |
if (info) PORT_Free(info); |
@@ -2530,6 +2561,7 @@ |
crv = CKR_KEY_TYPE_INCONSISTENT; |
break; |
} |
+ context->rsa = PR_TRUE; |
if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS)) { |
crv = CKR_MECHANISM_PARAM_INVALID; |
break; |
@@ -2759,6 +2791,7 @@ |
break; |
} |
context->multi = PR_FALSE; |
+ context->rsa = PR_TRUE; |
pubKey = sftk_GetPubKey(key,CKK_RSA,&crv); |
if (pubKey == NULL) { |
break; |