OLD | NEW |
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 /* | 2 /* |
3 * SSL3 Protocol | 3 * SSL3 Protocol |
4 * | 4 * |
5 * This Source Code Form is subject to the terms of the Mozilla Public | 5 * This Source Code Form is subject to the terms of the Mozilla Public |
6 * License, v. 2.0. If a copy of the MPL was not distributed with this | 6 * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
8 | 8 |
9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ | 9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ |
10 | 10 |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "pk11func.h" | 28 #include "pk11func.h" |
29 #include "secmod.h" | 29 #include "secmod.h" |
30 #ifndef NO_PKCS11_BYPASS | 30 #ifndef NO_PKCS11_BYPASS |
31 #include "blapi.h" | 31 #include "blapi.h" |
32 #endif | 32 #endif |
33 | 33 |
34 /* This is a bodge to allow this code to be compiled against older NSS headers | 34 /* This is a bodge to allow this code to be compiled against older NSS headers |
35 * that don't contain the TLS 1.2 changes. */ | 35 * that don't contain the TLS 1.2 changes. */ |
36 #ifndef CKM_NSS_TLS_PRF_GENERAL_SHA256 | 36 #ifndef CKM_NSS_TLS_PRF_GENERAL_SHA256 |
37 #define CKM_NSS_TLS_PRF_GENERAL_SHA256 (CKM_NSS + 21) | 37 #define CKM_NSS_TLS_PRF_GENERAL_SHA256 (CKM_NSS + 21) |
38 #define CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256 (CKM_NSS + 22) | 38 #define CKM_TLS12_MASTER_KEY_DERIVE 0x000003E0 |
39 #define CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256 (CKM_NSS + 23) | 39 #define CKM_TLS12_KEY_AND_MAC_DERIVE 0x000003E1 |
40 #define CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 (CKM_NSS + 24) | 40 #define CKM_TLS12_MASTER_KEY_DERIVE_DH 0x000003E2 |
41 #endif | 41 #endif |
42 | 42 |
43 #include <stdio.h> | 43 #include <stdio.h> |
44 #ifdef NSS_ENABLE_ZLIB | 44 #ifdef NSS_ENABLE_ZLIB |
45 #include "zlib.h" | 45 #include "zlib.h" |
46 #endif | 46 #endif |
47 #ifdef LINUX | 47 #ifdef LINUX |
48 #include <dlfcn.h> | 48 #include <dlfcn.h> |
49 #endif | 49 #endif |
50 | 50 |
(...skipping 3545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3596 * data into a 48-byte value. | 3596 * data into a 48-byte value. |
3597 */ | 3597 */ |
3598 PRBool isDH = (PRBool) ((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || | 3598 PRBool isDH = (PRBool) ((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || |
3599 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); | 3599 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); |
3600 SECStatus rv = SECFailure; | 3600 SECStatus rv = SECFailure; |
3601 CK_MECHANISM_TYPE master_derive; | 3601 CK_MECHANISM_TYPE master_derive; |
3602 CK_MECHANISM_TYPE key_derive; | 3602 CK_MECHANISM_TYPE key_derive; |
3603 SECItem params; | 3603 SECItem params; |
3604 CK_FLAGS keyFlags; | 3604 CK_FLAGS keyFlags; |
3605 CK_VERSION pms_version; | 3605 CK_VERSION pms_version; |
3606 CK_SSL3_MASTER_KEY_DERIVE_PARAMS master_params; | 3606 /* master_params may be used as a CK_SSL3_MASTER_KEY_DERIVE_PARAMS */ |
| 3607 CK_TLS12_MASTER_KEY_DERIVE_PARAMS master_params; |
| 3608 unsigned int master_params_len; |
3607 | 3609 |
3608 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 3610 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
3609 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | 3611 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); |
3610 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | 3612 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); |
3611 if (isTLS12) { | 3613 if (isTLS12) { |
3612 » if(isDH) master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256; | 3614 » if(isDH) master_derive = CKM_TLS12_MASTER_KEY_DERIVE_DH; |
3613 » else master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256; | 3615 » else master_derive = CKM_TLS12_MASTER_KEY_DERIVE; |
3614 » key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256; | 3616 » key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE; |
3615 keyFlags = CKF_SIGN | CKF_VERIFY; | 3617 keyFlags = CKF_SIGN | CKF_VERIFY; |
3616 } else if (isTLS) { | 3618 } else if (isTLS) { |
3617 if(isDH) master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH; | 3619 if(isDH) master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH; |
3618 else master_derive = CKM_TLS_MASTER_KEY_DERIVE; | 3620 else master_derive = CKM_TLS_MASTER_KEY_DERIVE; |
3619 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | 3621 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; |
3620 keyFlags = CKF_SIGN | CKF_VERIFY; | 3622 keyFlags = CKF_SIGN | CKF_VERIFY; |
3621 } else { | 3623 } else { |
3622 if (isDH) master_derive = CKM_SSL3_MASTER_KEY_DERIVE_DH; | 3624 if (isDH) master_derive = CKM_SSL3_MASTER_KEY_DERIVE_DH; |
3623 else master_derive = CKM_SSL3_MASTER_KEY_DERIVE; | 3625 else master_derive = CKM_SSL3_MASTER_KEY_DERIVE; |
3624 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; | 3626 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; |
3625 keyFlags = 0; | 3627 keyFlags = 0; |
3626 } | 3628 } |
3627 | 3629 |
3628 if (pms || !pwSpec->master_secret) { | 3630 if (pms || !pwSpec->master_secret) { |
3629 if (isDH) { | 3631 if (isDH) { |
3630 master_params.pVersion = NULL; | 3632 master_params.pVersion = NULL; |
3631 } else { | 3633 } else { |
3632 master_params.pVersion = &pms_version; | 3634 master_params.pVersion = &pms_version; |
3633 } | 3635 } |
3634 master_params.RandomInfo.pClientRandom = cr; | 3636 master_params.RandomInfo.pClientRandom = cr; |
3635 master_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH; | 3637 master_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH; |
3636 master_params.RandomInfo.pServerRandom = sr; | 3638 master_params.RandomInfo.pServerRandom = sr; |
3637 master_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH; | 3639 master_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH; |
| 3640 if (isTLS12) { |
| 3641 master_params.prfHashMechanism = CKM_SHA256; |
| 3642 master_params_len = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); |
| 3643 } else { |
| 3644 master_params_len = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS); |
| 3645 } |
3638 | 3646 |
3639 params.data = (unsigned char *) &master_params; | 3647 params.data = (unsigned char *) &master_params; |
3640 » params.len = sizeof master_params; | 3648 » params.len = master_params_len; |
3641 } | 3649 } |
3642 | 3650 |
3643 if (pms != NULL) { | 3651 if (pms != NULL) { |
3644 #if defined(TRACE) | 3652 #if defined(TRACE) |
3645 if (ssl_trace >= 100) { | 3653 if (ssl_trace >= 100) { |
3646 SECStatus extractRV = PK11_ExtractKeyValue(pms); | 3654 SECStatus extractRV = PK11_ExtractKeyValue(pms); |
3647 if (extractRV == SECSuccess) { | 3655 if (extractRV == SECSuccess) { |
3648 SECItem * keyData = PK11_GetKeyData(pms); | 3656 SECItem * keyData = PK11_GetKeyData(pms); |
3649 if (keyData && keyData->data && keyData->len) { | 3657 if (keyData && keyData->data && keyData->len) { |
3650 ssl_PrintBuf(ss, "Pre-Master Secret", | 3658 ssl_PrintBuf(ss, "Pre-Master Secret", |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3760 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | 3768 PRBool isTLS = (PRBool)(kea_def->tls_keygen || |
3761 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | 3769 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); |
3762 PRBool isTLS12= | 3770 PRBool isTLS12= |
3763 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | 3771 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
3764 /* following variables used in PKCS11 path */ | 3772 /* following variables used in PKCS11 path */ |
3765 const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def; | 3773 const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def; |
3766 PK11SlotInfo * slot = NULL; | 3774 PK11SlotInfo * slot = NULL; |
3767 PK11SymKey * symKey = NULL; | 3775 PK11SymKey * symKey = NULL; |
3768 void * pwArg = ss->pkcs11PinArg; | 3776 void * pwArg = ss->pkcs11PinArg; |
3769 int keySize; | 3777 int keySize; |
3770 CK_SSL3_KEY_MAT_PARAMS key_material_params; | 3778 CK_TLS12_KEY_MAT_PARAMS key_material_params; /* may be used as a |
| 3779 » » » » » » * CK_SSL3_KEY_MAT_PARAMS */ |
| 3780 unsigned int key_material_params_len; |
3771 CK_SSL3_KEY_MAT_OUT returnedKeys; | 3781 CK_SSL3_KEY_MAT_OUT returnedKeys; |
3772 CK_MECHANISM_TYPE key_derive; | 3782 CK_MECHANISM_TYPE key_derive; |
3773 CK_MECHANISM_TYPE bulk_mechanism; | 3783 CK_MECHANISM_TYPE bulk_mechanism; |
3774 SSLCipherAlgorithm calg; | 3784 SSLCipherAlgorithm calg; |
3775 SECItem params; | 3785 SECItem params; |
3776 PRBool skipKeysAndIVs = (PRBool)(cipher_def->calg == calg_null); | 3786 PRBool skipKeysAndIVs = (PRBool)(cipher_def->calg == calg_null); |
3777 | 3787 |
3778 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 3788 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
3779 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | 3789 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); |
3780 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | 3790 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3814 key_material_params.ulKeySizeInBits = 0; | 3824 key_material_params.ulKeySizeInBits = 0; |
3815 key_material_params.ulIVSizeInBits = 0; | 3825 key_material_params.ulIVSizeInBits = 0; |
3816 returnedKeys.pIVClient = NULL; | 3826 returnedKeys.pIVClient = NULL; |
3817 returnedKeys.pIVServer = NULL; | 3827 returnedKeys.pIVServer = NULL; |
3818 } | 3828 } |
3819 | 3829 |
3820 calg = cipher_def->calg; | 3830 calg = cipher_def->calg; |
3821 PORT_Assert( alg2Mech[calg].calg == calg); | 3831 PORT_Assert( alg2Mech[calg].calg == calg); |
3822 bulk_mechanism = alg2Mech[calg].cmech; | 3832 bulk_mechanism = alg2Mech[calg].cmech; |
3823 | 3833 |
3824 params.data = (unsigned char *)&key_material_params; | |
3825 params.len = sizeof(key_material_params); | |
3826 | |
3827 if (isTLS12) { | 3834 if (isTLS12) { |
3828 » key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256; | 3835 » key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE; |
| 3836 » key_material_params.prfHashMechanism = CKM_SHA256; |
| 3837 » key_material_params_len = sizeof(CK_TLS12_KEY_MAT_PARAMS); |
3829 } else if (isTLS) { | 3838 } else if (isTLS) { |
3830 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | 3839 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; |
| 3840 key_material_params_len = sizeof(CK_SSL3_KEY_MAT_PARAMS); |
3831 } else { | 3841 } else { |
3832 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; | 3842 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; |
| 3843 key_material_params_len = sizeof(CK_SSL3_KEY_MAT_PARAMS); |
3833 } | 3844 } |
3834 | 3845 |
| 3846 params.data = (unsigned char *)&key_material_params; |
| 3847 params.len = key_material_params_len; |
| 3848 |
3835 /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and | 3849 /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and |
3836 * DERIVE by DEFAULT */ | 3850 * DERIVE by DEFAULT */ |
3837 symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms, | 3851 symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms, |
3838 bulk_mechanism, CKA_ENCRYPT, keySize); | 3852 bulk_mechanism, CKA_ENCRYPT, keySize); |
3839 if (!symKey) { | 3853 if (!symKey) { |
3840 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | 3854 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); |
3841 return SECFailure; | 3855 return SECFailure; |
3842 } | 3856 } |
3843 /* we really should use the actual mac'ing mechanism here, but we | 3857 /* we really should use the actual mac'ing mechanism here, but we |
3844 * don't because these types are used to map keytype anyway and both | 3858 * don't because these types are used to map keytype anyway and both |
(...skipping 6245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10090 | 10104 |
10091 return rv; | 10105 return rv; |
10092 } | 10106 } |
10093 | 10107 |
10094 static SECStatus | 10108 static SECStatus |
10095 ssl3_ComputeTLSFinished(ssl3CipherSpec *spec, | 10109 ssl3_ComputeTLSFinished(ssl3CipherSpec *spec, |
10096 PRBool isServer, | 10110 PRBool isServer, |
10097 const SSL3Hashes * hashes, | 10111 const SSL3Hashes * hashes, |
10098 TLSFinished * tlsFinished) | 10112 TLSFinished * tlsFinished) |
10099 { | 10113 { |
10100 const char * label; | 10114 SECStatus rv; |
10101 unsigned int len; | 10115 CK_TLS12_MAC_PARAMS tls12_mac_params; |
10102 SECStatus rv; | 10116 SECItem param = {siBuffer, NULL, 0}; |
| 10117 PK11Context *prf_context; |
| 10118 unsigned int retLen; |
10103 | 10119 |
10104 label = isServer ? "server finished" : "client finished"; | 10120 if (spec->version < SSL_LIBRARY_VERSION_TLS_1_2) { |
10105 len = 15; | 10121 » tls12_mac_params.prfHashMechanism = CKM_TLS_PRF; |
| 10122 } else { |
| 10123 » tls12_mac_params.prfHashMechanism = CKM_SHA256; |
| 10124 } |
| 10125 tls12_mac_params.ulMacLength = 12; |
| 10126 tls12_mac_params.ulServerOrClient = isServer ? 1 : 2; |
| 10127 param.data = (unsigned char *)&tls12_mac_params; |
| 10128 param.len = sizeof(tls12_mac_params); |
| 10129 prf_context = PK11_CreateContextBySymKey(CKM_TLS12_MAC, CKA_SIGN, |
| 10130 » » » » » spec->master_secret, ¶m); |
| 10131 if (!prf_context) |
| 10132 » return SECFailure; |
10106 | 10133 |
10107 rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->u.raw, | 10134 rv = PK11_DigestBegin(prf_context); |
10108 » hashes->len, tlsFinished->verify_data, | 10135 rv |= PK11_DigestOp(prf_context, hashes->u.raw, hashes->len); |
10109 » sizeof tlsFinished->verify_data); | 10136 rv |= PK11_DigestFinal(prf_context, tlsFinished->verify_data, &retLen, |
| 10137 » » » sizeof tlsFinished->verify_data); |
| 10138 PORT_Assert(rv != SECSuccess || retLen == sizeof tlsFinished->verify_data); |
| 10139 |
| 10140 PK11_DestroyContext(prf_context, PR_TRUE); |
10110 | 10141 |
10111 return rv; | 10142 return rv; |
10112 } | 10143 } |
10113 | 10144 |
10114 /* The calling function must acquire and release the appropriate | 10145 /* The calling function must acquire and release the appropriate |
10115 * lock (e.g., ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for | 10146 * lock (e.g., ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for |
10116 * ss->ssl3.crSpec). | 10147 * ss->ssl3.crSpec). |
10117 */ | 10148 */ |
10118 SECStatus | 10149 SECStatus |
10119 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label, | 10150 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label, |
(...skipping 2144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12264 PORT_Free(ss->ssl3.hs.recvdFragments.buf); | 12295 PORT_Free(ss->ssl3.hs.recvdFragments.buf); |
12265 } | 12296 } |
12266 } | 12297 } |
12267 | 12298 |
12268 ss->ssl3.initialized = PR_FALSE; | 12299 ss->ssl3.initialized = PR_FALSE; |
12269 | 12300 |
12270 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); | 12301 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); |
12271 } | 12302 } |
12272 | 12303 |
12273 /* End of ssl3con.c */ | 12304 /* End of ssl3con.c */ |
OLD | NEW |