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; |
} |