| Index: mozilla/security/nss/lib/softoken/pkcs11c.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/softoken/pkcs11c.c (revision 180595)
|
| +++ mozilla/security/nss/lib/softoken/pkcs11c.c (working copy)
|
| @@ -457,6 +457,24 @@
|
| return -1;
|
| }
|
|
|
| +static SECStatus
|
| +sftk_EncryptOAEP(SFTKOAEPEncryptInfo *info, unsigned char *output,
|
| + unsigned int *outputLen, unsigned int maxLen,
|
| + unsigned char *input, unsigned int inputLen)
|
| +{
|
| + return RSA_EncryptOAEP(info->params, info->key, output, outputLen,
|
| + maxLen, input, inputLen);
|
| +}
|
| +
|
| +static SECStatus
|
| +sftk_DecryptOAEP(SFTKOAEPDecryptInfo *info, unsigned char *output,
|
| + unsigned int *outputLen, unsigned int maxLen,
|
| + unsigned char *input, unsigned int inputLen)
|
| +{
|
| + return RSA_DecryptOAEP(info->params, info->key, output, outputLen,
|
| + maxLen, input, inputLen);
|
| +}
|
| +
|
| /** NSC_CryptInit initializes an encryption/Decryption operation.
|
| *
|
| * Always called by NSC_EncryptInit, NSC_DecryptInit, NSC_WrapKey,NSC_UnwrapKey.
|
| @@ -513,6 +531,7 @@
|
| if (isEncrypt) {
|
| NSSLOWKEYPublicKey *pubKey = sftk_GetPubKey(key,CKK_RSA,&crv);
|
| if (pubKey == NULL) {
|
| + crv = CKR_KEY_HANDLE_INVALID;
|
| break;
|
| }
|
| context->maxLen = nsslowkey_PublicModulusLen(pubKey);
|
| @@ -523,6 +542,7 @@
|
| } else {
|
| NSSLOWKEYPrivateKey *privKey = sftk_GetPrivKey(key,CKK_RSA,&crv);
|
| if (privKey == NULL) {
|
| + crv = CKR_KEY_HANDLE_INVALID;
|
| break;
|
| }
|
| context->maxLen = nsslowkey_PrivateModulusLen(privKey);
|
| @@ -533,6 +553,55 @@
|
| }
|
| context->destroy = sftk_Null;
|
| break;
|
| +/* XXX: Disabled until unit tests land.
|
| + case CKM_RSA_PKCS_OAEP:
|
| + if (key_type != CKK_RSA) {
|
| + crv = CKR_KEY_TYPE_INCONSISTENT;
|
| + break;
|
| + }
|
| + context->multi = PR_FALSE;
|
| + context->rsa = PR_TRUE;
|
| + if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_OAEP_PARAMS)) {
|
| + crv = CKR_MECHANISM_PARAM_INVALID;
|
| + break;
|
| + }
|
| + /\* XXX: Need Parameter validation here *\/
|
| + if (isEncrypt) {
|
| + SFTKOAEPEncryptInfo *info = PORT_New(SFTKOAEPEncryptInfo);
|
| + if (info == NULL) {
|
| + crv = CKR_HOST_MEMORY;
|
| + break;
|
| + }
|
| + info->params = pMechanism->pParameter;
|
| + info->key = sftk_GetPubKey(key, CKK_RSA, &crv);
|
| + if (info->key == NULL) {
|
| + PORT_Free(info);
|
| + crv = CKR_KEY_HANDLE_INVALID;
|
| + break;
|
| + }
|
| + context->update = (SFTKCipher) sftk_EncryptOAEP;
|
| + context->maxLen = nsslowkey_PublicModulusLen(info->key);
|
| + context->cipherInfo = info;
|
| + } else {
|
| + SFTKOAEPDecryptInfo *info = PORT_New(SFTKOAEPDecryptInfo);
|
| + if (info == NULL) {
|
| + crv = CKR_HOST_MEMORY;
|
| + break;
|
| + }
|
| + info->params = pMechanism->pParameter;
|
| + info->key = sftk_GetPrivKey(key, CKK_RSA, &crv);
|
| + if (info->key == NULL) {
|
| + PORT_Free(info);
|
| + crv = CKR_KEY_HANDLE_INVALID;
|
| + break;
|
| + }
|
| + context->update = (SFTKCipher) sftk_DecryptOAEP;
|
| + context->maxLen = nsslowkey_PrivateModulusLen(info->key);
|
| + context->cipherInfo = info;
|
| + }
|
| + context->destroy = (SFTKDestroy) sftk_Space;
|
| + break;
|
| +*/
|
| case CKM_RC2_CBC_PAD:
|
| context->doPad = PR_TRUE;
|
| /* fall thru */
|
| @@ -1460,17 +1529,25 @@
|
| DOSUB(SHA384)
|
| DOSUB(SHA512)
|
|
|
| -/*
|
| - * HMAC General copies only a portion of the result. This update routine likes
|
| - * the final HMAC output with the signature.
|
| - */
|
| static SECStatus
|
| -sftk_HMACCopy(CK_ULONG *copyLen,unsigned char *sig,unsigned int *sigLen,
|
| - unsigned int maxLen,unsigned char *hash, unsigned int hashLen)
|
| +sftk_SignCopy(
|
| + CK_ULONG *copyLen,
|
| + void *out, unsigned int *outLength,
|
| + unsigned int maxLength,
|
| + const unsigned char *hashResult,
|
| + unsigned int hashResultLength)
|
| {
|
| - if (maxLen < *copyLen) return SECFailure;
|
| - PORT_Memcpy(sig,hash,*copyLen);
|
| - *sigLen = *copyLen;
|
| + unsigned int toCopy = *copyLen;
|
| + if (toCopy > maxLength) {
|
| + toCopy = maxLength;
|
| + }
|
| + if (toCopy > hashResultLength) {
|
| + toCopy = hashResultLength;
|
| + }
|
| + memcpy(out, hashResult, toCopy);
|
| + if (outLength) {
|
| + *outLength = toCopy;
|
| + }
|
| return SECSuccess;
|
| }
|
|
|
| @@ -1519,14 +1596,14 @@
|
| context->end = (SFTKEnd) HMAC_Finish;
|
|
|
| context->hashdestroy = (SFTKDestroy) HMAC_Destroy;
|
| - intpointer = (CK_ULONG *) PORT_Alloc(sizeof(CK_ULONG));
|
| + intpointer = PORT_New(CK_ULONG);
|
| if (intpointer == NULL) {
|
| return CKR_HOST_MEMORY;
|
| }
|
| *intpointer = mac_size;
|
| - context->cipherInfo = (void *) intpointer;
|
| + context->cipherInfo = intpointer;
|
| context->destroy = (SFTKDestroy) sftk_Space;
|
| - context->update = (SFTKCipher) sftk_HMACCopy;
|
| + context->update = (SFTKCipher) sftk_SignCopy;
|
| context->verify = (SFTKVerify) sftk_HMACCmp;
|
| context->maxLen = hashObj->length;
|
| HMAC_Begin(HMACcontext);
|
| @@ -2172,6 +2249,65 @@
|
| case CKM_TLS_PRF_GENERAL:
|
| crv = sftk_TLSPRFInit(context, key, key_type);
|
| break;
|
| +
|
| + case CKM_NSS_HMAC_CONSTANT_TIME: {
|
| + sftk_MACConstantTimeCtx *ctx =
|
| + sftk_HMACConstantTime_New(pMechanism,key);
|
| + CK_ULONG *intpointer;
|
| +
|
| + if (ctx == NULL) {
|
| + crv = CKR_ARGUMENTS_BAD;
|
| + break;
|
| + }
|
| + intpointer = PORT_New(CK_ULONG);
|
| + if (intpointer == NULL) {
|
| + crv = CKR_HOST_MEMORY;
|
| + break;
|
| + }
|
| + *intpointer = ctx->hash->length;
|
| +
|
| + context->cipherInfo = intpointer;
|
| + context->hashInfo = ctx;
|
| + context->currentMech = pMechanism->mechanism;
|
| + context->hashUpdate = sftk_HMACConstantTime_Update;
|
| + context->hashdestroy = sftk_MACConstantTime_DestroyContext;
|
| + context->end = sftk_MACConstantTime_EndHash;
|
| + context->update = sftk_SignCopy;
|
| + context->destroy = sftk_Space;
|
| + context->maxLen = 64;
|
| + context->multi = PR_TRUE;
|
| + break;
|
| + }
|
| +
|
| + case CKM_NSS_SSL3_MAC_CONSTANT_TIME: {
|
| + sftk_MACConstantTimeCtx *ctx =
|
| + sftk_SSLv3MACConstantTime_New(pMechanism,key);
|
| + CK_ULONG *intpointer;
|
| +
|
| + if (ctx == NULL) {
|
| + crv = CKR_ARGUMENTS_BAD;
|
| + break;
|
| + }
|
| + intpointer = PORT_New(CK_ULONG);
|
| + if (intpointer == NULL) {
|
| + crv = CKR_HOST_MEMORY;
|
| + break;
|
| + }
|
| + *intpointer = ctx->hash->length;
|
| +
|
| + context->cipherInfo = intpointer;
|
| + context->hashInfo = ctx;
|
| + context->currentMech = pMechanism->mechanism;
|
| + context->hashUpdate = sftk_SSLv3MACConstantTime_Update;
|
| + context->hashdestroy = sftk_MACConstantTime_DestroyContext;
|
| + context->end = sftk_MACConstantTime_EndHash;
|
| + context->update = sftk_SignCopy;
|
| + context->destroy = sftk_Space;
|
| + context->maxLen = 64;
|
| + context->multi = PR_TRUE;
|
| + break;
|
| + }
|
| +
|
| default:
|
| crv = CKR_MECHANISM_INVALID;
|
| break;
|
|
|