| Index: net/third_party/nss/ssl/ssl3con.c
|
| ===================================================================
|
| --- net/third_party/nss/ssl/ssl3con.c (revision 219583)
|
| +++ net/third_party/nss/ssl/ssl3con.c (working copy)
|
| @@ -35,9 +35,9 @@
|
| * that don't contain the TLS 1.2 changes. */
|
| #ifndef CKM_NSS_TLS_PRF_GENERAL_SHA256
|
| #define CKM_NSS_TLS_PRF_GENERAL_SHA256 (CKM_NSS + 21)
|
| -#define CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256 (CKM_NSS + 22)
|
| -#define CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256 (CKM_NSS + 23)
|
| -#define CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 (CKM_NSS + 24)
|
| +#define CKM_TLS12_MASTER_KEY_DERIVE 0x000003E0
|
| +#define CKM_TLS12_KEY_AND_MAC_DERIVE 0x000003E1
|
| +#define CKM_TLS12_MASTER_KEY_DERIVE_DH 0x000003E2
|
| #endif
|
|
|
| #include <stdio.h>
|
| @@ -3603,15 +3603,17 @@
|
| SECItem params;
|
| CK_FLAGS keyFlags;
|
| CK_VERSION pms_version;
|
| - CK_SSL3_MASTER_KEY_DERIVE_PARAMS master_params;
|
| + /* master_params may be used as a CK_SSL3_MASTER_KEY_DERIVE_PARAMS */
|
| + CK_TLS12_MASTER_KEY_DERIVE_PARAMS master_params;
|
| + unsigned int master_params_len;
|
|
|
| PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
|
| PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss));
|
| PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec);
|
| if (isTLS12) {
|
| - if(isDH) master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256;
|
| - else master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256;
|
| - key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256;
|
| + if(isDH) master_derive = CKM_TLS12_MASTER_KEY_DERIVE_DH;
|
| + else master_derive = CKM_TLS12_MASTER_KEY_DERIVE;
|
| + key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE;
|
| keyFlags = CKF_SIGN | CKF_VERIFY;
|
| } else if (isTLS) {
|
| if(isDH) master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH;
|
| @@ -3635,9 +3637,15 @@
|
| master_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH;
|
| master_params.RandomInfo.pServerRandom = sr;
|
| master_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH;
|
| + if (isTLS12) {
|
| + master_params.prfHashMechanism = CKM_SHA256;
|
| + master_params_len = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS);
|
| + } else {
|
| + master_params_len = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);
|
| + }
|
|
|
| params.data = (unsigned char *) &master_params;
|
| - params.len = sizeof master_params;
|
| + params.len = master_params_len;
|
| }
|
|
|
| if (pms != NULL) {
|
| @@ -3767,7 +3775,9 @@
|
| PK11SymKey * symKey = NULL;
|
| void * pwArg = ss->pkcs11PinArg;
|
| int keySize;
|
| - CK_SSL3_KEY_MAT_PARAMS key_material_params;
|
| + CK_TLS12_KEY_MAT_PARAMS key_material_params; /* may be used as a
|
| + * CK_SSL3_KEY_MAT_PARAMS */
|
| + unsigned int key_material_params_len;
|
| CK_SSL3_KEY_MAT_OUT returnedKeys;
|
| CK_MECHANISM_TYPE key_derive;
|
| CK_MECHANISM_TYPE bulk_mechanism;
|
| @@ -3821,17 +3831,21 @@
|
| PORT_Assert( alg2Mech[calg].calg == calg);
|
| bulk_mechanism = alg2Mech[calg].cmech;
|
|
|
| - params.data = (unsigned char *)&key_material_params;
|
| - params.len = sizeof(key_material_params);
|
| -
|
| if (isTLS12) {
|
| - key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256;
|
| + key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE;
|
| + key_material_params.prfHashMechanism = CKM_SHA256;
|
| + key_material_params_len = sizeof(CK_TLS12_KEY_MAT_PARAMS);
|
| } else if (isTLS) {
|
| key_derive = CKM_TLS_KEY_AND_MAC_DERIVE;
|
| + key_material_params_len = sizeof(CK_SSL3_KEY_MAT_PARAMS);
|
| } else {
|
| key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE;
|
| + key_material_params_len = sizeof(CK_SSL3_KEY_MAT_PARAMS);
|
| }
|
|
|
| + params.data = (unsigned char *)&key_material_params;
|
| + params.len = key_material_params_len;
|
| +
|
| /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and
|
| * DERIVE by DEFAULT */
|
| symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms,
|
| @@ -10097,17 +10111,34 @@
|
| const SSL3Hashes * hashes,
|
| TLSFinished * tlsFinished)
|
| {
|
| - const char * label;
|
| - unsigned int len;
|
| - SECStatus rv;
|
| + SECStatus rv;
|
| + CK_TLS12_MAC_PARAMS tls12_mac_params;
|
| + SECItem param = {siBuffer, NULL, 0};
|
| + PK11Context *prf_context;
|
| + unsigned int retLen;
|
|
|
| - label = isServer ? "server finished" : "client finished";
|
| - len = 15;
|
| + if (spec->version < SSL_LIBRARY_VERSION_TLS_1_2) {
|
| + tls12_mac_params.prfHashMechanism = CKM_TLS_PRF;
|
| + } else {
|
| + tls12_mac_params.prfHashMechanism = CKM_SHA256;
|
| + }
|
| + tls12_mac_params.ulMacLength = 12;
|
| + tls12_mac_params.ulServerOrClient = isServer ? 1 : 2;
|
| + param.data = (unsigned char *)&tls12_mac_params;
|
| + param.len = sizeof(tls12_mac_params);
|
| + prf_context = PK11_CreateContextBySymKey(CKM_TLS12_MAC, CKA_SIGN,
|
| + spec->master_secret, ¶m);
|
| + if (!prf_context)
|
| + return SECFailure;
|
|
|
| - rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->u.raw,
|
| - hashes->len, tlsFinished->verify_data,
|
| - sizeof tlsFinished->verify_data);
|
| + rv = PK11_DigestBegin(prf_context);
|
| + rv |= PK11_DigestOp(prf_context, hashes->u.raw, hashes->len);
|
| + rv |= PK11_DigestFinal(prf_context, tlsFinished->verify_data, &retLen,
|
| + sizeof tlsFinished->verify_data);
|
| + PORT_Assert(rv != SECSuccess || retLen == sizeof tlsFinished->verify_data);
|
|
|
| + PK11_DestroyContext(prf_context, PR_TRUE);
|
| +
|
| return rv;
|
| }
|
|
|
|
|