| Index: nss/lib/softoken/pkcs11c.c
|
| diff --git a/nss/lib/softoken/pkcs11c.c b/nss/lib/softoken/pkcs11c.c
|
| index 472b71a77d1cdcedda1ac8808d3773c76d184ff7..080dfda0c22f9867321180b31cfc312de09da4ae 100644
|
| --- a/nss/lib/softoken/pkcs11c.c
|
| +++ b/nss/lib/softoken/pkcs11c.c
|
| @@ -302,6 +302,46 @@ GetHashTypeFromMechanism(CK_MECHANISM_TYPE mech)
|
| }
|
| }
|
|
|
| +/*
|
| + * Returns true if "params" contains a valid set of PSS parameters
|
| + */
|
| +static PRBool
|
| +sftk_ValidatePssParams(const CK_RSA_PKCS_PSS_PARAMS *params)
|
| +{
|
| + if (!params) {
|
| + return PR_FALSE;
|
| + }
|
| + if (GetHashTypeFromMechanism(params->hashAlg) == HASH_AlgNULL ||
|
| + GetHashTypeFromMechanism(params->mgf) == HASH_AlgNULL) {
|
| + return PR_FALSE;
|
| + }
|
| + return PR_TRUE;
|
| +}
|
| +
|
| +/*
|
| + * Returns true if "params" contains a valid set of OAEP parameters
|
| + */
|
| +static PRBool
|
| +sftk_ValidateOaepParams(const CK_RSA_PKCS_OAEP_PARAMS *params)
|
| +{
|
| + if (!params) {
|
| + return PR_FALSE;
|
| + }
|
| + /* The requirements of ulSourceLen/pSourceData come from PKCS #11, which
|
| + * state:
|
| + * If the parameter is empty, pSourceData must be NULL and
|
| + * ulSourceDataLen must be zero.
|
| + */
|
| + if (params->source != CKZ_DATA_SPECIFIED ||
|
| + (GetHashTypeFromMechanism(params->hashAlg) == HASH_AlgNULL) ||
|
| + (GetHashTypeFromMechanism(params->mgf) == HASH_AlgNULL) ||
|
| + (params->ulSourceDataLen == 0 && params->pSourceData != NULL) ||
|
| + (params->ulSourceDataLen != 0 && params->pSourceData == NULL)) {
|
| + return PR_FALSE;
|
| + }
|
| + return PR_TRUE;
|
| +}
|
| +
|
| /*
|
| * return a context based on the SFTKContext type.
|
| */
|
| @@ -588,11 +628,6 @@ sftk_RSAEncryptOAEP(SFTKOAEPEncryptInfo *info, unsigned char *output,
|
| hashAlg = GetHashTypeFromMechanism(info->params->hashAlg);
|
| maskHashAlg = GetHashTypeFromMechanism(info->params->mgf);
|
|
|
| - if (info->params->source != CKZ_DATA_SPECIFIED) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
|
| - return SECFailure;
|
| - }
|
| -
|
| return RSA_EncryptOAEP(&info->key->u.rsa, hashAlg, maskHashAlg,
|
| (const unsigned char*)info->params->pSourceData,
|
| info->params->ulSourceDataLen, NULL, 0,
|
| @@ -617,11 +652,6 @@ sftk_RSADecryptOAEP(SFTKOAEPDecryptInfo *info, unsigned char *output,
|
| hashAlg = GetHashTypeFromMechanism(info->params->hashAlg);
|
| maskHashAlg = GetHashTypeFromMechanism(info->params->mgf);
|
|
|
| - if (info->params->source != CKZ_DATA_SPECIFIED) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
|
| - return SECFailure;
|
| - }
|
| -
|
| rv = RSA_DecryptOAEP(&info->key->u.rsa, hashAlg, maskHashAlg,
|
| (const unsigned char*)info->params->pSourceData,
|
| info->params->ulSourceDataLen,
|
| @@ -801,19 +831,18 @@ sftk_CryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
|
| }
|
| 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)) {
|
| + if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_OAEP_PARAMS) ||
|
| + !sftk_ValidateOaepParams((CK_RSA_PKCS_OAEP_PARAMS*)pMechanism->pParameter)) {
|
| crv = CKR_MECHANISM_PARAM_INVALID;
|
| break;
|
| }
|
| - /\* XXX: Need Parameter validation here *\/
|
| + context->multi = PR_FALSE;
|
| + context->rsa = PR_TRUE;
|
| if (isEncrypt) {
|
| SFTKOAEPEncryptInfo *info = PORT_New(SFTKOAEPEncryptInfo);
|
| if (info == NULL) {
|
| @@ -849,7 +878,6 @@ sftk_CryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
|
| }
|
| context->destroy = (SFTKDestroy) sftk_Space;
|
| break;
|
| -*/
|
| case CKM_RC2_CBC_PAD:
|
| context->doPad = PR_TRUE;
|
| /* fall thru */
|
| @@ -2506,7 +2534,8 @@ finish_rsa:
|
| break;
|
| }
|
| context->rsa = PR_TRUE;
|
| - if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS)) {
|
| + if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS) ||
|
| + !sftk_ValidatePssParams((const CK_RSA_PKCS_PSS_PARAMS*)pMechanism->pParameter)) {
|
| crv = CKR_MECHANISM_PARAM_INVALID;
|
| break;
|
| }
|
| @@ -3143,7 +3172,8 @@ finish_rsa:
|
| break;
|
| }
|
| context->rsa = PR_TRUE;
|
| - if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS)) {
|
| + if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS) ||
|
| + !sftk_ValidatePssParams((const CK_RSA_PKCS_PSS_PARAMS*)pMechanism->pParameter)) {
|
| crv = CKR_MECHANISM_PARAM_INVALID;
|
| break;
|
| }
|
|
|