| Index: nss/lib/softoken/pkcs11c.c
|
| ===================================================================
|
| --- nss/lib/softoken/pkcs11c.c (revision 195639)
|
| +++ nss/lib/softoken/pkcs11c.c (working copy)
|
| @@ -2247,8 +2247,11 @@
|
| *(CK_ULONG *)pMechanism->pParameter);
|
| break;
|
| case CKM_TLS_PRF_GENERAL:
|
| - crv = sftk_TLSPRFInit(context, key, key_type);
|
| + crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgNULL);
|
| break;
|
| + case CKM_NSS_TLS_PRF_GENERAL_SHA256:
|
| + crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgSHA256);
|
| + break;
|
|
|
| case CKM_NSS_HMAC_CONSTANT_TIME: {
|
| sftk_MACConstantTimeCtx *ctx =
|
| @@ -2803,8 +2806,11 @@
|
| *(CK_ULONG *)pMechanism->pParameter);
|
| break;
|
| case CKM_TLS_PRF_GENERAL:
|
| - crv = sftk_TLSPRFInit(context, key, key_type);
|
| + crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgNULL);
|
| break;
|
| + case CKM_NSS_TLS_PRF_GENERAL_SHA256:
|
| + crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgSHA256);
|
| + break;
|
|
|
| default:
|
| crv = CKR_MECHANISM_INVALID;
|
| @@ -5471,6 +5477,7 @@
|
| CK_OBJECT_CLASS classType = CKO_SECRET_KEY;
|
| CK_KEY_DERIVATION_STRING_DATA *stringPtr;
|
| PRBool isTLS = PR_FALSE;
|
| + PRBool isSHA256 = PR_FALSE;
|
| PRBool isDH = PR_FALSE;
|
| SECStatus rv;
|
| int i;
|
| @@ -5570,6 +5577,10 @@
|
| /*
|
| * generate the master secret
|
| */
|
| + case CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256:
|
| + case CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256:
|
| + isSHA256 = PR_TRUE;
|
| + /* fall thru */
|
| case CKM_TLS_MASTER_KEY_DERIVE:
|
| case CKM_TLS_MASTER_KEY_DERIVE_DH:
|
| isTLS = PR_TRUE;
|
| @@ -5582,7 +5593,8 @@
|
| unsigned char crsrdata[SSL3_RANDOM_LENGTH * 2];
|
|
|
| if ((pMechanism->mechanism == CKM_SSL3_MASTER_KEY_DERIVE_DH) ||
|
| - (pMechanism->mechanism == CKM_TLS_MASTER_KEY_DERIVE_DH))
|
| + (pMechanism->mechanism == CKM_TLS_MASTER_KEY_DERIVE_DH) ||
|
| + (pMechanism->mechanism == CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256))
|
| isDH = PR_TRUE;
|
|
|
| /* first do the consistancy checks */
|
| @@ -5650,7 +5662,12 @@
|
| pms.data = (unsigned char*)att->attrib.pValue;
|
| pms.len = att->attrib.ulValueLen;
|
|
|
| - status = TLS_PRF(&pms, "master secret", &crsr, &master, isFIPS);
|
| + if (isSHA256) {
|
| + status = TLS_P_hash(HASH_AlgSHA256, &pms, "master secret",
|
| + &crsr, &master, isFIPS);
|
| + } else {
|
| + status = TLS_PRF(&pms, "master secret", &crsr, &master, isFIPS);
|
| + }
|
| if (status != SECSuccess) {
|
| crv = CKR_FUNCTION_FAILED;
|
| break;
|
| @@ -5709,6 +5726,9 @@
|
| break;
|
| }
|
|
|
| + case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256:
|
| + isSHA256 = PR_TRUE;
|
| + /* fall thru */
|
| case CKM_TLS_KEY_AND_MAC_DERIVE:
|
| isTLS = PR_TRUE;
|
| /* fall thru */
|
| @@ -5800,8 +5820,13 @@
|
| master.data = (unsigned char*)att->attrib.pValue;
|
| master.len = att->attrib.ulValueLen;
|
|
|
| - status = TLS_PRF(&master, "key expansion", &srcr, &keyblk,
|
| - isFIPS);
|
| + if (isSHA256) {
|
| + status = TLS_P_hash(HASH_AlgSHA256, &master, "key expansion",
|
| + &srcr, &keyblk, isFIPS);
|
| + } else {
|
| + status = TLS_PRF(&master, "key expansion", &srcr, &keyblk,
|
| + isFIPS);
|
| + }
|
| if (status != SECSuccess) {
|
| goto key_and_mac_derive_fail;
|
| }
|
| @@ -5958,7 +5983,7 @@
|
| } else {
|
|
|
| /*
|
| - ** Generate TLS Export write keys and IVs.
|
| + ** Generate TLS 1.0 Export write keys and IVs.
|
| */
|
| SECStatus status;
|
| SECItem secret = { siBuffer, NULL, 0 };
|
|
|