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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 int additionalDataLen); | 104 int additionalDataLen); |
105 #endif | 105 #endif |
106 | 106 |
107 #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */ | 107 #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */ |
108 #define MIN_SEND_BUF_LENGTH 4000 | 108 #define MIN_SEND_BUF_LENGTH 4000 |
109 | 109 |
110 /* This list of SSL3 cipher suites is sorted in descending order of | 110 /* This list of SSL3 cipher suites is sorted in descending order of |
111 * precedence (desirability). It only includes cipher suites we implement. | 111 * precedence (desirability). It only includes cipher suites we implement. |
112 * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites | 112 * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites |
113 * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c) | 113 * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c) |
| 114 * |
| 115 * Important: See bug 946147 before enabling, reordering, or adding any cipher |
| 116 * suites to this list. |
114 */ | 117 */ |
115 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = { | 118 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = { |
116 /* cipher_suite policy enabled is_present*/ | 119 /* cipher_suite policy enabled isPresent */ |
117 #ifdef NSS_ENABLE_ECC | |
118 { TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
119 { TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
120 { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
121 { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
122 #endif /* NSS_ENABLE_ECC */ | |
123 { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | |
124 { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | |
125 | 120 |
126 #ifdef NSS_ENABLE_ECC | 121 #ifdef NSS_ENABLE_ECC |
127 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 122 { TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
128 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 123 { TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 124 { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 125 { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 126 /* TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA is out of order to work around |
| 127 * bug 946147. |
| 128 */ |
| 129 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 130 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 131 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 132 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 133 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 134 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 135 { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 136 { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 137 { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 138 { TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
129 #endif /* NSS_ENABLE_ECC */ | 139 #endif /* NSS_ENABLE_ECC */ |
130 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 140 |
131 { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 141 { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
132 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 142 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
133 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 143 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
134 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 144 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
135 #ifdef NSS_ENABLE_ECC | 145 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
136 { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 146 { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
137 { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 147 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
138 #endif /* NSS_ENABLE_ECC */ | 148 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
139 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 149 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
140 { TLS_RSA_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 150 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
141 { TLS_RSA_WITH_AES_256_CBC_SHA256,» SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 151 { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 152 { SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 153 { SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 154 { TLS_DHE_DSS_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
142 | 155 |
143 #ifdef NSS_ENABLE_ECC | 156 #ifdef NSS_ENABLE_ECC |
144 { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 157 { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
145 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 158 { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
146 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 159 { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
147 { TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 160 { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
148 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 161 { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
149 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 162 { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 163 { TLS_ECDH_ECDSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 164 { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
150 #endif /* NSS_ENABLE_ECC */ | 165 #endif /* NSS_ENABLE_ECC */ |
151 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 166 |
152 { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 167 /* RSA */ |
153 { TLS_DHE_DSS_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 168 { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
154 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 169 { TLS_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
155 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 170 { TLS_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
156 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 171 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 172 { TLS_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 173 { TLS_RSA_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 174 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 175 { TLS_RSA_WITH_SEED_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 176 { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 177 { SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 178 { SSL_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 179 { SSL_RSA_WITH_RC4_128_MD5, SSL_ALLOWED, PR_TRUE, PR_FALSE}, |
| 180 |
| 181 /* 56-bit DES "domestic" cipher suites */ |
| 182 { SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 183 { SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 184 { SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 185 { SSL_RSA_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 186 |
| 187 /* export ciphersuites with 1024-bit public key exchange keys */ |
| 188 { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 189 { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 190 |
| 191 /* export ciphersuites with 512-bit public key exchange keys */ |
| 192 { SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 193 { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
| 194 |
| 195 /* ciphersuites with no encryption */ |
157 #ifdef NSS_ENABLE_ECC | 196 #ifdef NSS_ENABLE_ECC |
158 { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 197 { TLS_ECDHE_ECDSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
159 { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 198 { TLS_ECDHE_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
160 { TLS_ECDH_ECDSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 199 { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
161 { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 200 { TLS_ECDH_ECDSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
162 #endif /* NSS_ENABLE_ECC */ | 201 #endif /* NSS_ENABLE_ECC */ |
163 { TLS_RSA_WITH_SEED_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 202 { SSL_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
164 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 203 { TLS_RSA_WITH_NULL_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
165 { SSL_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 204 { SSL_RSA_WITH_NULL_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, |
166 { SSL_RSA_WITH_RC4_128_MD5, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 205 }; |
167 { TLS_RSA_WITH_AES_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | |
168 { TLS_RSA_WITH_AES_128_CBC_SHA256,» SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | |
169 | 206 |
170 #ifdef NSS_ENABLE_ECC | 207 /* Verify that SSL_ImplementedCiphers and cipherSuites are in consistent order. |
171 { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 208 */ |
172 { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 209 #ifdef DEBUG |
173 #endif /* NSS_ENABLE_ECC */ | 210 void ssl3_CheckCipherSuiteOrderConsistency() |
174 { SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 211 { |
175 { SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, | 212 unsigned int i; |
176 #ifdef NSS_ENABLE_ECC | |
177 { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
178 { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
179 #endif /* NSS_ENABLE_ECC */ | |
180 { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
181 { SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | |
182 | 213 |
| 214 /* Note that SSL_ImplementedCiphers has more elements than cipherSuites |
| 215 * because it SSL_ImplementedCiphers includes SSL 2.0 cipher suites. |
| 216 */ |
| 217 PORT_Assert(SSL_NumImplementedCiphers >= PR_ARRAY_SIZE(cipherSuites)); |
183 | 218 |
184 { SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 219 for (i = 0; i < PR_ARRAY_SIZE(cipherSuites); ++i) { |
185 { SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 220 PORT_Assert(SSL_ImplementedCiphers[i] == cipherSuites[i].cipher_suite); |
186 { SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 221 } |
187 { SSL_RSA_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 222 } |
188 { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 223 #endif |
189 { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
190 | |
191 { SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
192 { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
193 | |
194 #ifdef NSS_ENABLE_ECC | |
195 { TLS_ECDHE_ECDSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
196 { TLS_ECDHE_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
197 { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
198 { TLS_ECDH_ECDSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | |
199 #endif /* NSS_ENABLE_ECC */ | |
200 { SSL_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
201 { TLS_RSA_WITH_NULL_SHA256, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
202 { SSL_RSA_WITH_NULL_MD5, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | |
203 | |
204 }; | |
205 | 224 |
206 /* This list of SSL3 compression methods is sorted in descending order of | 225 /* This list of SSL3 compression methods is sorted in descending order of |
207 * precedence (desirability). It only includes compression methods we | 226 * precedence (desirability). It only includes compression methods we |
208 * implement. | 227 * implement. |
209 */ | 228 */ |
210 static const /*SSLCompressionMethod*/ PRUint8 compressions [] = { | 229 static const /*SSLCompressionMethod*/ PRUint8 compressions [] = { |
211 #ifdef NSS_ENABLE_ZLIB | 230 #ifdef NSS_ENABLE_ZLIB |
212 ssl_compression_deflate, | 231 ssl_compression_deflate, |
213 #endif | 232 #endif |
214 ssl_compression_null | 233 ssl_compression_null |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 { calg_chacha20 , CKM_NSS_CHACHA20_POLY1305 }, | 506 { calg_chacha20 , CKM_NSS_CHACHA20_POLY1305 }, |
488 /* { calg_init , (CK_MECHANISM_TYPE)0x7fffffffL } */ | 507 /* { calg_init , (CK_MECHANISM_TYPE)0x7fffffffL } */ |
489 }; | 508 }; |
490 | 509 |
491 #define mmech_invalid (CK_MECHANISM_TYPE)0x80000000L | 510 #define mmech_invalid (CK_MECHANISM_TYPE)0x80000000L |
492 #define mmech_md5 CKM_SSL3_MD5_MAC | 511 #define mmech_md5 CKM_SSL3_MD5_MAC |
493 #define mmech_sha CKM_SSL3_SHA1_MAC | 512 #define mmech_sha CKM_SSL3_SHA1_MAC |
494 #define mmech_md5_hmac CKM_MD5_HMAC | 513 #define mmech_md5_hmac CKM_MD5_HMAC |
495 #define mmech_sha_hmac CKM_SHA_1_HMAC | 514 #define mmech_sha_hmac CKM_SHA_1_HMAC |
496 #define mmech_sha256_hmac CKM_SHA256_HMAC | 515 #define mmech_sha256_hmac CKM_SHA256_HMAC |
497 #define mmech_sha384_hmac CKM_SHA384_HMAC | |
498 #define mmech_sha512_hmac CKM_SHA512_HMAC | |
499 | 516 |
500 static const ssl3MACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */ | 517 static const ssl3MACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */ |
501 /* pad_size is only used for SSL 3.0 MAC. See RFC 6101 Sec. 5.2.3.1. */ | 518 /* pad_size is only used for SSL 3.0 MAC. See RFC 6101 Sec. 5.2.3.1. */ |
502 /* mac mmech pad_size mac_size */ | 519 /* mac mmech pad_size mac_size */ |
503 { mac_null, mmech_invalid, 0, 0 }, | 520 { mac_null, mmech_invalid, 0, 0 }, |
504 { mac_md5, mmech_md5, 48, MD5_LENGTH }, | 521 { mac_md5, mmech_md5, 48, MD5_LENGTH }, |
505 { mac_sha, mmech_sha, 40, SHA1_LENGTH}, | 522 { mac_sha, mmech_sha, 40, SHA1_LENGTH}, |
506 {hmac_md5, mmech_md5_hmac, 0, MD5_LENGTH }, | 523 {hmac_md5, mmech_md5_hmac, 0, MD5_LENGTH }, |
507 {hmac_sha, mmech_sha_hmac, 0, SHA1_LENGTH}, | 524 {hmac_sha, mmech_sha_hmac, 0, SHA1_LENGTH}, |
508 {hmac_sha256, mmech_sha256_hmac, 0, SHA256_LENGTH}, | 525 {hmac_sha256, mmech_sha256_hmac, 0, SHA256_LENGTH}, |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 | 849 |
833 /* return number of cipher suites that match policy, enabled state and are | 850 /* return number of cipher suites that match policy, enabled state and are |
834 * applicable for the configured protocol version range. */ | 851 * applicable for the configured protocol version range. */ |
835 /* called from ssl3_SendClientHello and ssl3_ConstructV2CipherSpecsHack */ | 852 /* called from ssl3_SendClientHello and ssl3_ConstructV2CipherSpecsHack */ |
836 static int | 853 static int |
837 count_cipher_suites(sslSocket *ss, int policy, PRBool enabled) | 854 count_cipher_suites(sslSocket *ss, int policy, PRBool enabled) |
838 { | 855 { |
839 int i, count = 0; | 856 int i, count = 0; |
840 | 857 |
841 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | 858 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { |
842 » return 0; | 859 » return 0; |
843 } | 860 } |
844 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | 861 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { |
845 if (config_match(&ss->cipherSuites[i], policy, enabled, &ss->vrange)) | 862 if (config_match(&ss->cipherSuites[i], policy, enabled, &ss->vrange)) |
846 count++; | 863 count++; |
847 } | 864 } |
848 if (count <= 0) { | 865 if (count <= 0) { |
849 PORT_SetError(SSL_ERROR_SSL_DISABLED); | 866 PORT_SetError(SSL_ERROR_SSL_DISABLED); |
850 } | 867 } |
851 return count; | 868 return count; |
852 } | 869 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 | 915 |
899 ss->version = PR_MIN(peerVersion, ss->vrange.max); | 916 ss->version = PR_MIN(peerVersion, ss->vrange.max); |
900 PORT_Assert(ssl3_VersionIsSupported(ss->protocolVariant, ss->version)); | 917 PORT_Assert(ssl3_VersionIsSupported(ss->protocolVariant, ss->version)); |
901 | 918 |
902 return SECSuccess; | 919 return SECSuccess; |
903 } | 920 } |
904 | 921 |
905 static SECStatus | 922 static SECStatus |
906 ssl3_GetNewRandom(SSL3Random *random) | 923 ssl3_GetNewRandom(SSL3Random *random) |
907 { | 924 { |
908 PRUint32 gmt = ssl_Time(); | |
909 SECStatus rv; | 925 SECStatus rv; |
910 | 926 |
911 random->rand[0] = (unsigned char)(gmt >> 24); | |
912 random->rand[1] = (unsigned char)(gmt >> 16); | |
913 random->rand[2] = (unsigned char)(gmt >> 8); | |
914 random->rand[3] = (unsigned char)(gmt); | |
915 | |
916 /* first 4 bytes are reserverd for time */ | 927 /* first 4 bytes are reserverd for time */ |
917 rv = PK11_GenerateRandom(&random->rand[4], SSL3_RANDOM_LENGTH - 4); | 928 rv = PK11_GenerateRandom(random->rand, SSL3_RANDOM_LENGTH); |
918 if (rv != SECSuccess) { | 929 if (rv != SECSuccess) { |
919 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); | 930 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); |
920 } | 931 } |
921 return rv; | 932 return rv; |
922 } | 933 } |
923 | 934 |
924 /* Called by ssl3_SendServerKeyExchange and ssl3_SendCertificateVerify */ | 935 /* Called by ssl3_SendServerKeyExchange and ssl3_SendCertificateVerify */ |
925 SECStatus | 936 SECStatus |
926 ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, | 937 ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, |
927 PRBool isTLS) | 938 PRBool isTLS) |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1045 * In that case, we use just the SHA1 part. */ | 1056 * In that case, we use just the SHA1 part. */ |
1046 if (hash->hashAlg == SEC_OID_UNKNOWN) { | 1057 if (hash->hashAlg == SEC_OID_UNKNOWN) { |
1047 hashItem.data = hash->u.s.sha; | 1058 hashItem.data = hash->u.s.sha; |
1048 hashItem.len = sizeof(hash->u.s.sha); | 1059 hashItem.len = sizeof(hash->u.s.sha); |
1049 } else { | 1060 } else { |
1050 hashItem.data = hash->u.raw; | 1061 hashItem.data = hash->u.raw; |
1051 hashItem.len = hash->len; | 1062 hashItem.len = hash->len; |
1052 } | 1063 } |
1053 /* Allow DER encoded DSA signatures in SSL 3.0 */ | 1064 /* Allow DER encoded DSA signatures in SSL 3.0 */ |
1054 if (isTLS || buf->len != SECKEY_SignatureLen(key)) { | 1065 if (isTLS || buf->len != SECKEY_SignatureLen(key)) { |
1055 » signature = DSAU_DecodeDerSig(buf); | 1066 » signature = DSAU_DecodeDerSigToLen(buf, SECKEY_SignatureLen(key)); |
1056 if (!signature) { | 1067 if (!signature) { |
1057 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | 1068 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); |
1058 return SECFailure; | 1069 return SECFailure; |
1059 } | 1070 } |
1060 buf = signature; | 1071 buf = signature; |
1061 } | 1072 } |
1062 break; | 1073 break; |
1063 | 1074 |
1064 #ifdef NSS_ENABLE_ECC | 1075 #ifdef NSS_ENABLE_ECC |
1065 case ecKey: | 1076 case ecKey: |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 | 1641 |
1631 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 1642 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
1632 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | 1643 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); |
1633 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | 1644 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); |
1634 | 1645 |
1635 pwSpec = ss->ssl3.pwSpec; | 1646 pwSpec = ss->ssl3.pwSpec; |
1636 cipher_def = pwSpec->cipher_def; | 1647 cipher_def = pwSpec->cipher_def; |
1637 | 1648 |
1638 calg = cipher_def->calg; | 1649 calg = cipher_def->calg; |
1639 | 1650 |
1640 if (calg == calg_aes_gcm) { | 1651 if (calg == ssl_calg_aes_gcm) { |
1641 pwSpec->encode = NULL; | 1652 pwSpec->encode = NULL; |
1642 pwSpec->decode = NULL; | 1653 pwSpec->decode = NULL; |
1643 pwSpec->destroy = NULL; | 1654 pwSpec->destroy = NULL; |
1644 pwSpec->encodeContext = NULL; | 1655 pwSpec->encodeContext = NULL; |
1645 pwSpec->decodeContext = NULL; | 1656 pwSpec->decodeContext = NULL; |
1646 pwSpec->aead = ssl3_AESGCMBypass; | 1657 pwSpec->aead = ssl3_AESGCMBypass; |
1647 ssl3_InitCompressionContext(pwSpec); | 1658 ssl3_InitCompressionContext(pwSpec); |
1648 return SECSuccess; | 1659 return SECSuccess; |
1649 } | 1660 } |
1650 | 1661 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1746 * is decrypting, and vice versa. | 1757 * is decrypting, and vice versa. |
1747 */ | 1758 */ |
1748 optArg1 = !optArg1; | 1759 optArg1 = !optArg1; |
1749 break; | 1760 break; |
1750 /* kill warnings. */ | 1761 /* kill warnings. */ |
1751 case ssl_calg_null: | 1762 case ssl_calg_null: |
1752 case ssl_calg_rc4: | 1763 case ssl_calg_rc4: |
1753 case ssl_calg_rc2: | 1764 case ssl_calg_rc2: |
1754 case ssl_calg_idea: | 1765 case ssl_calg_idea: |
1755 case ssl_calg_fortezza: | 1766 case ssl_calg_fortezza: |
| 1767 case ssl_calg_aes_gcm: |
1756 break; | 1768 break; |
1757 } | 1769 } |
1758 | 1770 |
1759 rv = (*initFn)(clientContext, | 1771 rv = (*initFn)(clientContext, |
1760 pwSpec->client.write_key_item.data, | 1772 pwSpec->client.write_key_item.data, |
1761 pwSpec->client.write_key_item.len, | 1773 pwSpec->client.write_key_item.len, |
1762 pwSpec->client.write_iv_item.data, | 1774 pwSpec->client.write_iv_item.data, |
1763 mode, optArg1, optArg2); | 1775 mode, optArg1, optArg2); |
1764 if (rv != SECSuccess) { | 1776 if (rv != SECSuccess) { |
1765 PORT_Assert(0); | 1777 PORT_Assert(0); |
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2499 | 2511 |
2500 PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength)); | 2512 PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength)); |
2501 | 2513 |
2502 if (rv != SECSuccess) { | 2514 if (rv != SECSuccess) { |
2503 rv = SECFailure; | 2515 rv = SECFailure; |
2504 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); | 2516 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); |
2505 } | 2517 } |
2506 return rv; | 2518 return rv; |
2507 } | 2519 } |
2508 | 2520 |
2509 /* This is a bodge to allow this code to be compiled against older NSS headers | |
2510 * that don't contain the CBC constant-time changes. */ | |
2511 #ifndef CKM_NSS_HMAC_CONSTANT_TIME | |
2512 #define CKM_NSS_HMAC_CONSTANT_TIME (CKM_NSS + 19) | |
2513 #define CKM_NSS_SSL3_MAC_CONSTANT_TIME (CKM_NSS + 20) | |
2514 | |
2515 typedef struct CK_NSS_MAC_CONSTANT_TIME_PARAMS { | |
2516 CK_MECHANISM_TYPE macAlg; /* in */ | |
2517 CK_ULONG ulBodyTotalLen; /* in */ | |
2518 CK_BYTE * pHeader; /* in */ | |
2519 CK_ULONG ulHeaderLen; /* in */ | |
2520 } CK_NSS_MAC_CONSTANT_TIME_PARAMS; | |
2521 #endif | |
2522 | |
2523 /* Called from: ssl3_HandleRecord() | 2521 /* Called from: ssl3_HandleRecord() |
2524 * Caller must already hold the SpecReadLock. (wish we could assert that!) | 2522 * Caller must already hold the SpecReadLock. (wish we could assert that!) |
2525 * | 2523 * |
2526 * On entry: | 2524 * On entry: |
2527 * originalLen >= inputLen >= MAC size | 2525 * originalLen >= inputLen >= MAC size |
2528 */ | 2526 */ |
2529 static SECStatus | 2527 static SECStatus |
2530 ssl3_ComputeRecordMACConstantTime( | 2528 ssl3_ComputeRecordMACConstantTime( |
2531 ssl3CipherSpec * spec, | 2529 ssl3CipherSpec * spec, |
2532 PRBool useServerMacKey, | 2530 PRBool useServerMacKey, |
2533 const unsigned char *header, | 2531 const unsigned char *header, |
2534 unsigned int headerLen, | 2532 unsigned int headerLen, |
2535 const SSL3Opaque * input, | 2533 const SSL3Opaque * input, |
2536 int inputLen, | 2534 int inputLen, |
2537 int originalLen, | 2535 int originalLen, |
2538 unsigned char * outbuf, | 2536 unsigned char * outbuf, |
2539 unsigned int * outLen) | 2537 unsigned int * outLen) |
2540 { | 2538 { |
2541 CK_MECHANISM_TYPE macType; | 2539 CK_MECHANISM_TYPE macType; |
2542 CK_NSS_MAC_CONSTANT_TIME_PARAMS params; | 2540 CK_NSS_MAC_CONSTANT_TIME_PARAMS params; |
2543 PK11Context * mac_context; | 2541 SECItem param, inputItem, outputItem; |
2544 SECItem param; | |
2545 SECStatus rv; | 2542 SECStatus rv; |
2546 PK11SymKey * key; | 2543 PK11SymKey * key; |
2547 | 2544 |
2548 PORT_Assert(inputLen >= spec->mac_size); | 2545 PORT_Assert(inputLen >= spec->mac_size); |
2549 PORT_Assert(originalLen >= inputLen); | 2546 PORT_Assert(originalLen >= inputLen); |
2550 | 2547 |
2551 if (spec->bypassCiphers) { | 2548 if (spec->bypassCiphers) { |
2552 /* This function doesn't support PKCS#11 bypass. We fallback on the | 2549 /* This function doesn't support PKCS#11 bypass. We fallback on the |
2553 * non-constant time version. */ | 2550 * non-constant time version. */ |
2554 goto fallback; | 2551 goto fallback; |
(...skipping 11 matching lines...) Expand all Loading... |
2566 | 2563 |
2567 params.macAlg = spec->mac_def->mmech; | 2564 params.macAlg = spec->mac_def->mmech; |
2568 params.ulBodyTotalLen = originalLen; | 2565 params.ulBodyTotalLen = originalLen; |
2569 params.pHeader = (unsigned char *) header; /* const cast */ | 2566 params.pHeader = (unsigned char *) header; /* const cast */ |
2570 params.ulHeaderLen = headerLen; | 2567 params.ulHeaderLen = headerLen; |
2571 | 2568 |
2572 param.data = (unsigned char*) ¶ms; | 2569 param.data = (unsigned char*) ¶ms; |
2573 param.len = sizeof(params); | 2570 param.len = sizeof(params); |
2574 param.type = 0; | 2571 param.type = 0; |
2575 | 2572 |
| 2573 inputItem.data = (unsigned char *) input; |
| 2574 inputItem.len = inputLen; |
| 2575 inputItem.type = 0; |
| 2576 |
| 2577 outputItem.data = outbuf; |
| 2578 outputItem.len = *outLen; |
| 2579 outputItem.type = 0; |
| 2580 |
2576 key = spec->server.write_mac_key; | 2581 key = spec->server.write_mac_key; |
2577 if (!useServerMacKey) { | 2582 if (!useServerMacKey) { |
2578 key = spec->client.write_mac_key; | 2583 key = spec->client.write_mac_key; |
2579 } | 2584 } |
2580 mac_context = PK11_CreateContextBySymKey(macType, CKA_SIGN, key, ¶m); | 2585 |
2581 if (mac_context == NULL) { | 2586 rv = PK11_SignWithSymKey(key, macType, ¶m, &outputItem, &inputItem); |
2582 » /* Older versions of NSS may not support constant-time MAC. */ | 2587 if (rv != SECSuccess) { |
2583 » goto fallback; | 2588 » if (PORT_GetError() == SEC_ERROR_INVALID_ALGORITHM) { |
| 2589 » goto fallback; |
| 2590 » } |
| 2591 |
| 2592 » *outLen = 0; |
| 2593 » rv = SECFailure; |
| 2594 » ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); |
| 2595 » return rv; |
2584 } | 2596 } |
2585 | 2597 |
2586 rv = PK11_DigestBegin(mac_context); | 2598 PORT_Assert(outputItem.len == (unsigned)spec->mac_size); |
2587 rv |= PK11_DigestOp(mac_context, input, inputLen); | 2599 *outLen = outputItem.len; |
2588 rv |= PK11_DigestFinal(mac_context, outbuf, outLen, spec->mac_size); | |
2589 PK11_DestroyContext(mac_context, PR_TRUE); | |
2590 | 2600 |
2591 PORT_Assert(rv != SECSuccess || *outLen == (unsigned)spec->mac_size); | |
2592 | |
2593 if (rv != SECSuccess) { | |
2594 rv = SECFailure; | |
2595 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); | |
2596 } | |
2597 return rv; | 2601 return rv; |
2598 | 2602 |
2599 fallback: | 2603 fallback: |
2600 /* ssl3_ComputeRecordMAC expects the MAC to have been removed from the | 2604 /* ssl3_ComputeRecordMAC expects the MAC to have been removed from the |
2601 * length already. */ | 2605 * length already. */ |
2602 inputLen -= spec->mac_size; | 2606 inputLen -= spec->mac_size; |
2603 return ssl3_ComputeRecordMAC(spec, useServerMacKey, header, headerLen, | 2607 return ssl3_ComputeRecordMAC(spec, useServerMacKey, header, headerLen, |
2604 input, inputLen, outbuf, outLen); | 2608 input, inputLen, outbuf, outLen); |
2605 } | 2609 } |
2606 | 2610 |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2869 * ssl_SEND_FLAG_USE_EPOCH (for DTLS) | 2873 * ssl_SEND_FLAG_USE_EPOCH (for DTLS) |
2870 * Forces the use of the provided epoch | 2874 * Forces the use of the provided epoch |
2871 * ssl_SEND_FLAG_CAP_RECORD_VERSION | 2875 * ssl_SEND_FLAG_CAP_RECORD_VERSION |
2872 * Caps the record layer version number of TLS ClientHello to { 3, 1 } | 2876 * Caps the record layer version number of TLS ClientHello to { 3, 1 } |
2873 * (TLS 1.0). Some TLS 1.0 servers (which seem to use F5 BIG-IP) ignore | 2877 * (TLS 1.0). Some TLS 1.0 servers (which seem to use F5 BIG-IP) ignore |
2874 * ClientHello.client_version and use the record layer version number | 2878 * ClientHello.client_version and use the record layer version number |
2875 * (TLSPlaintext.version) instead when negotiating protocol versions. In | 2879 * (TLSPlaintext.version) instead when negotiating protocol versions. In |
2876 * addition, if the record layer version number of ClientHello is { 3, 2 } | 2880 * addition, if the record layer version number of ClientHello is { 3, 2 } |
2877 * (TLS 1.1) or higher, these servers reset the TCP connections. Lastly, | 2881 * (TLS 1.1) or higher, these servers reset the TCP connections. Lastly, |
2878 * some F5 BIG-IP servers hang if a record containing a ClientHello has a | 2882 * some F5 BIG-IP servers hang if a record containing a ClientHello has a |
2879 * version greater than 0x0301 and a length greater than 255. Set this flag | 2883 * version greater than { 3, 1 } and a length greater than 255. Set this |
2880 * to work around such servers. | 2884 * flag to work around such servers. |
2881 */ | 2885 */ |
2882 PRInt32 | 2886 PRInt32 |
2883 ssl3_SendRecord( sslSocket * ss, | 2887 ssl3_SendRecord( sslSocket * ss, |
2884 DTLSEpoch epoch, /* DTLS only */ | 2888 DTLSEpoch epoch, /* DTLS only */ |
2885 SSL3ContentType type, | 2889 SSL3ContentType type, |
2886 const SSL3Opaque * pIn, /* input buffer */ | 2890 const SSL3Opaque * pIn, /* input buffer */ |
2887 PRInt32 nIn, /* bytes of input */ | 2891 PRInt32 nIn, /* bytes of input */ |
2888 PRInt32 flags) | 2892 PRInt32 flags) |
2889 { | 2893 { |
2890 sslBuffer * wrBuf = &ss->sec.writeBuf; | 2894 sslBuffer * wrBuf = &ss->sec.writeBuf; |
(...skipping 1119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4010 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 4014 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
4011 return SECFailure; | 4015 return SECFailure; |
4012 } | 4016 } |
4013 ss->ssl3.hs.hashType = handshake_hash_single; | 4017 ss->ssl3.hs.hashType = handshake_hash_single; |
4014 | 4018 |
4015 if (PK11_DigestBegin(ss->ssl3.hs.sha) != SECSuccess) { | 4019 if (PK11_DigestBegin(ss->ssl3.hs.sha) != SECSuccess) { |
4016 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | 4020 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); |
4017 return SECFailure; | 4021 return SECFailure; |
4018 } | 4022 } |
4019 | 4023 |
4020 » /* A backup SHA-1 hash for a potential client auth signature. */ | 4024 » /* Create a backup SHA-1 hash for a potential client auth |
| 4025 » * signature. |
| 4026 » * |
| 4027 » * In TLS 1.2, ssl3_ComputeHandshakeHashes always uses the |
| 4028 » * handshake hash function (SHA-256). If the server or the client |
| 4029 » * does not support SHA-256 as a signature hash, we can either |
| 4030 » * maintain a backup SHA-1 handshake hash or buffer all handshake |
| 4031 » * messages. |
| 4032 » */ |
4021 if (!ss->sec.isServer) { | 4033 if (!ss->sec.isServer) { |
4022 » » ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_SHA1); | 4034 » » ss->ssl3.hs.backupHash = PK11_CreateDigestContext(SEC_OID_SHA1); |
4023 » » if (ss->ssl3.hs.md5 == NULL) { | 4035 » » if (ss->ssl3.hs.backupHash == NULL) { |
4024 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 4036 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
4025 return SECFailure; | 4037 return SECFailure; |
4026 } | 4038 } |
4027 | 4039 |
4028 » » if (PK11_DigestBegin(ss->ssl3.hs.md5) != SECSuccess) { | 4040 » » if (PK11_DigestBegin(ss->ssl3.hs.backupHash) != SECSuccess) { |
4029 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 4041 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
4030 return SECFailure; | 4042 return SECFailure; |
4031 } | 4043 } |
4032 } | 4044 } |
4033 } else { | 4045 } else { |
4034 /* Both ss->ssl3.hs.md5 and ss->ssl3.hs.sha should be NULL or | 4046 /* Both ss->ssl3.hs.md5 and ss->ssl3.hs.sha should be NULL or |
4035 * created successfully. */ | 4047 * created successfully. */ |
4036 ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_MD5); | 4048 ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_MD5); |
4037 if (ss->ssl3.hs.md5 == NULL) { | 4049 if (ss->ssl3.hs.md5 == NULL) { |
4038 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 4050 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4133 } | 4145 } |
4134 return rv; | 4146 return rv; |
4135 } | 4147 } |
4136 #endif | 4148 #endif |
4137 if (ss->ssl3.hs.hashType == handshake_hash_single) { | 4149 if (ss->ssl3.hs.hashType == handshake_hash_single) { |
4138 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); | 4150 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); |
4139 if (rv != SECSuccess) { | 4151 if (rv != SECSuccess) { |
4140 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | 4152 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); |
4141 return rv; | 4153 return rv; |
4142 } | 4154 } |
4143 » if (ss->ssl3.hs.md5) { | 4155 » if (ss->ssl3.hs.backupHash) { |
4144 » rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); | 4156 » rv = PK11_DigestOp(ss->ssl3.hs.backupHash, b, l); |
4145 if (rv != SECSuccess) { | 4157 if (rv != SECSuccess) { |
4146 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 4158 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
4147 return rv; | 4159 return rv; |
4148 } | 4160 } |
4149 } | 4161 } |
4150 } else { | 4162 } else { |
4151 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); | 4163 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); |
4152 if (rv != SECSuccess) { | 4164 if (rv != SECSuccess) { |
4153 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 4165 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
4154 return rv; | 4166 return rv; |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4895 return rv; | 4907 return rv; |
4896 } | 4908 } |
4897 | 4909 |
4898 static SECStatus | 4910 static SECStatus |
4899 ssl3_ComputeBackupHandshakeHashes(sslSocket * ss, | 4911 ssl3_ComputeBackupHandshakeHashes(sslSocket * ss, |
4900 SSL3Hashes * hashes) /* output goes here. */ | 4912 SSL3Hashes * hashes) /* output goes here. */ |
4901 { | 4913 { |
4902 SECStatus rv = SECSuccess; | 4914 SECStatus rv = SECSuccess; |
4903 | 4915 |
4904 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 4916 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
| 4917 PORT_Assert( !ss->sec.isServer ); |
4905 PORT_Assert( ss->ssl3.hs.hashType == handshake_hash_single ); | 4918 PORT_Assert( ss->ssl3.hs.hashType == handshake_hash_single ); |
4906 | 4919 |
4907 rv = PK11_DigestFinal(ss->ssl3.hs.md5, hashes->u.raw, &hashes->len, | 4920 rv = PK11_DigestFinal(ss->ssl3.hs.backupHash, hashes->u.raw, &hashes->len, |
4908 sizeof(hashes->u.raw)); | 4921 sizeof(hashes->u.raw)); |
4909 if (rv != SECSuccess) { | 4922 if (rv != SECSuccess) { |
4910 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 4923 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
4911 rv = SECFailure; | 4924 rv = SECFailure; |
4912 goto loser; | 4925 goto loser; |
4913 } | 4926 } |
4914 hashes->hashAlg = SEC_OID_SHA1; | 4927 hashes->hashAlg = SEC_OID_SHA1; |
4915 | 4928 |
4916 loser: | 4929 loser: |
4917 PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); | 4930 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); |
4918 ss->ssl3.hs.md5 = NULL; | 4931 ss->ssl3.hs.backupHash = NULL; |
4919 return rv; | 4932 return rv; |
4920 } | 4933 } |
4921 | 4934 |
4922 /* | 4935 /* |
4923 * SSL 2 based implementations pass in the initial outbound buffer | 4936 * SSL 2 based implementations pass in the initial outbound buffer |
4924 * so that the handshake hash can contain the included information. | 4937 * so that the handshake hash can contain the included information. |
4925 * | 4938 * |
4926 * Called from ssl2_BeginClientHandshake() in sslcon.c | 4939 * Called from ssl2_BeginClientHandshake() in sslcon.c |
4927 */ | 4940 */ |
4928 SECStatus | 4941 SECStatus |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4988 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 5001 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
4989 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); | 5002 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); |
4990 | 5003 |
4991 rv = ssl3_InitState(ss); | 5004 rv = ssl3_InitState(ss); |
4992 if (rv != SECSuccess) { | 5005 if (rv != SECSuccess) { |
4993 return rv; /* ssl3_InitState has set the error code. */ | 5006 return rv; /* ssl3_InitState has set the error code. */ |
4994 } | 5007 } |
4995 ss->ssl3.hs.sendingSCSV = PR_FALSE; /* Must be reset every handshake */ | 5008 ss->ssl3.hs.sendingSCSV = PR_FALSE; /* Must be reset every handshake */ |
4996 PORT_Assert(IS_DTLS(ss) || !resending); | 5009 PORT_Assert(IS_DTLS(ss) || !resending); |
4997 | 5010 |
| 5011 SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); |
| 5012 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; |
| 5013 |
4998 /* We might be starting a session renegotiation in which case we should | 5014 /* We might be starting a session renegotiation in which case we should |
4999 * clear previous state. | 5015 * clear previous state. |
5000 */ | 5016 */ |
5001 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); | 5017 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); |
5002 | 5018 |
5003 rv = ssl3_RestartHandshakeHashes(ss); | 5019 rv = ssl3_RestartHandshakeHashes(ss); |
5004 if (rv != SECSuccess) { | 5020 if (rv != SECSuccess) { |
5005 return rv; | 5021 return rv; |
5006 } | 5022 } |
5007 | 5023 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5112 (*ss->sec.uncache)(sid); | 5128 (*ss->sec.uncache)(sid); |
5113 ssl_FreeSID(sid); | 5129 ssl_FreeSID(sid); |
5114 sid = NULL; | 5130 sid = NULL; |
5115 } | 5131 } |
5116 } | 5132 } |
5117 | 5133 |
5118 if (sid) { | 5134 if (sid) { |
5119 requestingResume = PR_TRUE; | 5135 requestingResume = PR_TRUE; |
5120 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_hits ); | 5136 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_hits ); |
5121 | 5137 |
5122 /* Are we attempting a stateless session resume? */ | |
5123 if (sid->version > SSL_LIBRARY_VERSION_3_0 && | |
5124 sid->u.ssl3.sessionTicket.ticket.data) | |
5125 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_stateless_resumes ); | |
5126 | |
5127 PRINT_BUF(4, (ss, "client, found session-id:", sid->u.ssl3.sessionID, | 5138 PRINT_BUF(4, (ss, "client, found session-id:", sid->u.ssl3.sessionID, |
5128 sid->u.ssl3.sessionIDLength)); | 5139 sid->u.ssl3.sessionIDLength)); |
5129 | 5140 |
5130 ss->ssl3.policy = sid->u.ssl3.policy; | 5141 ss->ssl3.policy = sid->u.ssl3.policy; |
5131 } else { | 5142 } else { |
5132 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_misses ); | 5143 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_misses ); |
5133 | 5144 |
5134 /* | 5145 /* |
5135 * Windows SChannel compares the client_version inside the RSA | 5146 * Windows SChannel compares the client_version inside the RSA |
5136 * EncryptedPreMasterSecret of a renegotiation with the | 5147 * EncryptedPreMasterSecret of a renegotiation with the |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5185 /* HACK for SCSV in SSL 3.0. On initial handshake, prepend SCSV, | 5196 /* HACK for SCSV in SSL 3.0. On initial handshake, prepend SCSV, |
5186 * only if TLS is disabled. | 5197 * only if TLS is disabled. |
5187 */ | 5198 */ |
5188 if (!ss->firstHsDone && !isTLS) { | 5199 if (!ss->firstHsDone && !isTLS) { |
5189 /* Must set this before calling Hello Extension Senders, | 5200 /* Must set this before calling Hello Extension Senders, |
5190 * to suppress sending of empty RI extension. | 5201 * to suppress sending of empty RI extension. |
5191 */ | 5202 */ |
5192 ss->ssl3.hs.sendingSCSV = PR_TRUE; | 5203 ss->ssl3.hs.sendingSCSV = PR_TRUE; |
5193 } | 5204 } |
5194 | 5205 |
| 5206 /* When we attempt session resumption (only), we must lock the sid to |
| 5207 * prevent races with other resumption connections that receive a |
| 5208 * NewSessionTicket that will cause the ticket in the sid to be replaced. |
| 5209 * Once we've copied the session ticket into our ClientHello message, it |
| 5210 * is OK for the ticket to change, so we just need to make sure we hold |
| 5211 * the lock across the calls to ssl3_CallHelloExtensionSenders. |
| 5212 */ |
| 5213 if (sid->u.ssl3.lock) { |
| 5214 PR_RWLock_Rlock(sid->u.ssl3.lock); |
| 5215 } |
| 5216 |
5195 if (isTLS || (ss->firstHsDone && ss->peerRequestedProtection)) { | 5217 if (isTLS || (ss->firstHsDone && ss->peerRequestedProtection)) { |
5196 PRUint32 maxBytes = 65535; /* 2^16 - 1 */ | 5218 PRUint32 maxBytes = 65535; /* 2^16 - 1 */ |
5197 PRInt32 extLen; | 5219 PRInt32 extLen; |
5198 | 5220 |
5199 extLen = ssl3_CallHelloExtensionSenders(ss, PR_FALSE, maxBytes, NULL); | 5221 extLen = ssl3_CallHelloExtensionSenders(ss, PR_FALSE, maxBytes, NULL); |
5200 if (extLen < 0) { | 5222 if (extLen < 0) { |
| 5223 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5201 return SECFailure; | 5224 return SECFailure; |
5202 } | 5225 } |
5203 maxBytes -= extLen; | 5226 maxBytes -= extLen; |
5204 total_exten_len += extLen; | 5227 total_exten_len += extLen; |
5205 | 5228 |
5206 if (total_exten_len > 0) | 5229 if (total_exten_len > 0) |
5207 total_exten_len += 2; | 5230 total_exten_len += 2; |
5208 } | 5231 } |
5209 | 5232 |
5210 #if defined(NSS_ENABLE_ECC) | 5233 #if defined(NSS_ENABLE_ECC) |
5211 if (!total_exten_len || !isTLS) { | 5234 if (!total_exten_len || !isTLS) { |
5212 /* not sending the elliptic_curves and ec_point_formats extensions */ | 5235 /* not sending the elliptic_curves and ec_point_formats extensions */ |
5213 ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ | 5236 ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ |
5214 } | 5237 } |
5215 #endif | 5238 #endif |
5216 | 5239 |
5217 if (IS_DTLS(ss)) { | 5240 if (IS_DTLS(ss)) { |
5218 ssl3_DisableNonDTLSSuites(ss); | 5241 ssl3_DisableNonDTLSSuites(ss); |
5219 } | 5242 } |
5220 | 5243 |
5221 if (!ssl3_HasGCMSupport()) { | 5244 if (!ssl3_HasGCMSupport()) { |
5222 ssl3_DisableGCMSuites(ss); | 5245 ssl3_DisableGCMSuites(ss); |
5223 } | 5246 } |
5224 | 5247 |
5225 /* how many suites are permitted by policy and user preference? */ | 5248 /* how many suites are permitted by policy and user preference? */ |
5226 num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE); | 5249 num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE); |
5227 if (!num_suites) | 5250 if (!num_suites) { |
| 5251 » if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5228 return SECFailure; /* count_cipher_suites has set error code. */ | 5252 return SECFailure; /* count_cipher_suites has set error code. */ |
| 5253 } |
5229 | 5254 |
5230 fallbackSCSV = ss->opt.enableFallbackSCSV && (!requestingResume || | 5255 fallbackSCSV = ss->opt.enableFallbackSCSV && (!requestingResume || |
5231 ss->version < sid->version); | 5256 ss->version < sid->version); |
5232 /* make room for SCSV */ | 5257 /* make room for SCSV */ |
5233 if (ss->ssl3.hs.sendingSCSV) { | 5258 if (ss->ssl3.hs.sendingSCSV) { |
5234 ++num_suites; | 5259 ++num_suites; |
5235 } | 5260 } |
5236 if (fallbackSCSV) { | 5261 if (fallbackSCSV) { |
5237 ++num_suites; | 5262 ++num_suites; |
5238 } | 5263 } |
(...skipping 22 matching lines...) Expand all Loading... |
5261 if (!IS_DTLS(ss) && isTLS && !ss->firstHsDone) { | 5286 if (!IS_DTLS(ss) && isTLS && !ss->firstHsDone) { |
5262 paddingExtensionLen = ssl3_CalculatePaddingExtensionLength(length); | 5287 paddingExtensionLen = ssl3_CalculatePaddingExtensionLength(length); |
5263 total_exten_len += paddingExtensionLen; | 5288 total_exten_len += paddingExtensionLen; |
5264 length += paddingExtensionLen; | 5289 length += paddingExtensionLen; |
5265 } else { | 5290 } else { |
5266 paddingExtensionLen = 0; | 5291 paddingExtensionLen = 0; |
5267 } | 5292 } |
5268 | 5293 |
5269 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); | 5294 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); |
5270 if (rv != SECSuccess) { | 5295 if (rv != SECSuccess) { |
| 5296 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5271 return rv; /* err set by ssl3_AppendHandshake* */ | 5297 return rv; /* err set by ssl3_AppendHandshake* */ |
5272 } | 5298 } |
5273 | 5299 |
5274 if (ss->firstHsDone) { | 5300 if (ss->firstHsDone) { |
5275 /* The client hello version must stay unchanged to work around | 5301 /* The client hello version must stay unchanged to work around |
5276 * the Windows SChannel bug described above. */ | 5302 * the Windows SChannel bug described above. */ |
5277 PORT_Assert(ss->version == ss->clientHelloVersion); | 5303 PORT_Assert(ss->version == ss->clientHelloVersion); |
5278 } | 5304 } |
5279 ss->clientHelloVersion = ss->version; | 5305 ss->clientHelloVersion = ss->version; |
5280 if (IS_DTLS(ss)) { | 5306 if (IS_DTLS(ss)) { |
5281 PRUint16 version; | 5307 PRUint16 version; |
5282 | 5308 |
5283 version = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); | 5309 version = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); |
5284 rv = ssl3_AppendHandshakeNumber(ss, version, 2); | 5310 rv = ssl3_AppendHandshakeNumber(ss, version, 2); |
5285 } else { | 5311 } else { |
5286 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); | 5312 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); |
5287 } | 5313 } |
5288 if (rv != SECSuccess) { | 5314 if (rv != SECSuccess) { |
| 5315 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5289 return rv; /* err set by ssl3_AppendHandshake* */ | 5316 return rv; /* err set by ssl3_AppendHandshake* */ |
5290 } | 5317 } |
5291 | 5318 |
5292 if (!resending) { /* Don't re-generate if we are in DTLS re-sending mode */ | 5319 if (!resending) { /* Don't re-generate if we are in DTLS re-sending mode */ |
5293 rv = ssl3_GetNewRandom(&ss->ssl3.hs.client_random); | 5320 rv = ssl3_GetNewRandom(&ss->ssl3.hs.client_random); |
5294 if (rv != SECSuccess) { | 5321 if (rv != SECSuccess) { |
| 5322 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5295 return rv; /* err set by GetNewRandom. */ | 5323 return rv; /* err set by GetNewRandom. */ |
5296 } | 5324 } |
5297 } | 5325 } |
5298 rv = ssl3_AppendHandshake(ss, &ss->ssl3.hs.client_random, | 5326 rv = ssl3_AppendHandshake(ss, &ss->ssl3.hs.client_random, |
5299 SSL3_RANDOM_LENGTH); | 5327 SSL3_RANDOM_LENGTH); |
5300 if (rv != SECSuccess) { | 5328 if (rv != SECSuccess) { |
| 5329 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5301 return rv; /* err set by ssl3_AppendHandshake* */ | 5330 return rv; /* err set by ssl3_AppendHandshake* */ |
5302 } | 5331 } |
5303 | 5332 |
5304 if (sid) | 5333 if (sid) |
5305 rv = ssl3_AppendHandshakeVariable( | 5334 rv = ssl3_AppendHandshakeVariable( |
5306 ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1); | 5335 ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1); |
5307 else | 5336 else |
5308 rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1); | 5337 rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1); |
5309 if (rv != SECSuccess) { | 5338 if (rv != SECSuccess) { |
| 5339 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5310 return rv; /* err set by ssl3_AppendHandshake* */ | 5340 return rv; /* err set by ssl3_AppendHandshake* */ |
5311 } | 5341 } |
5312 | 5342 |
5313 if (IS_DTLS(ss)) { | 5343 if (IS_DTLS(ss)) { |
5314 rv = ssl3_AppendHandshakeVariable( | 5344 rv = ssl3_AppendHandshakeVariable( |
5315 ss, ss->ssl3.hs.cookie, ss->ssl3.hs.cookieLen, 1); | 5345 ss, ss->ssl3.hs.cookie, ss->ssl3.hs.cookieLen, 1); |
5316 if (rv != SECSuccess) { | 5346 if (rv != SECSuccess) { |
| 5347 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5317 return rv; /* err set by ssl3_AppendHandshake* */ | 5348 return rv; /* err set by ssl3_AppendHandshake* */ |
5318 } | 5349 } |
5319 } | 5350 } |
5320 | 5351 |
5321 rv = ssl3_AppendHandshakeNumber(ss, num_suites*sizeof(ssl3CipherSuite), 2); | 5352 rv = ssl3_AppendHandshakeNumber(ss, num_suites*sizeof(ssl3CipherSuite), 2); |
5322 if (rv != SECSuccess) { | 5353 if (rv != SECSuccess) { |
| 5354 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5323 return rv; /* err set by ssl3_AppendHandshake* */ | 5355 return rv; /* err set by ssl3_AppendHandshake* */ |
5324 } | 5356 } |
5325 | 5357 |
5326 if (ss->ssl3.hs.sendingSCSV) { | 5358 if (ss->ssl3.hs.sendingSCSV) { |
5327 /* Add the actual SCSV */ | 5359 /* Add the actual SCSV */ |
5328 rv = ssl3_AppendHandshakeNumber(ss, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, | 5360 rv = ssl3_AppendHandshakeNumber(ss, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, |
5329 sizeof(ssl3CipherSuite)); | 5361 sizeof(ssl3CipherSuite)); |
5330 if (rv != SECSuccess) { | 5362 if (rv != SECSuccess) { |
| 5363 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5331 return rv; /* err set by ssl3_AppendHandshake* */ | 5364 return rv; /* err set by ssl3_AppendHandshake* */ |
5332 } | 5365 } |
5333 actual_count++; | 5366 actual_count++; |
5334 } | 5367 } |
5335 if (fallbackSCSV) { | 5368 if (fallbackSCSV) { |
5336 rv = ssl3_AppendHandshakeNumber(ss, TLS_FALLBACK_SCSV, | 5369 rv = ssl3_AppendHandshakeNumber(ss, TLS_FALLBACK_SCSV, |
5337 sizeof(ssl3CipherSuite)); | 5370 sizeof(ssl3CipherSuite)); |
5338 if (rv != SECSuccess) { | 5371 if (rv != SECSuccess) { |
| 5372 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5339 return rv; /* err set by ssl3_AppendHandshake* */ | 5373 return rv; /* err set by ssl3_AppendHandshake* */ |
5340 } | 5374 } |
5341 actual_count++; | 5375 actual_count++; |
5342 } | 5376 } |
5343 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | 5377 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { |
5344 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; | 5378 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; |
5345 if (config_match(suite, ss->ssl3.policy, PR_TRUE, &ss->vrange)) { | 5379 if (config_match(suite, ss->ssl3.policy, PR_TRUE, &ss->vrange)) { |
5346 actual_count++; | 5380 actual_count++; |
5347 if (actual_count > num_suites) { | 5381 if (actual_count > num_suites) { |
| 5382 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5348 /* set error card removal/insertion error */ | 5383 /* set error card removal/insertion error */ |
5349 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); | 5384 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); |
5350 return SECFailure; | 5385 return SECFailure; |
5351 } | 5386 } |
5352 rv = ssl3_AppendHandshakeNumber(ss, suite->cipher_suite, | 5387 rv = ssl3_AppendHandshakeNumber(ss, suite->cipher_suite, |
5353 sizeof(ssl3CipherSuite)); | 5388 sizeof(ssl3CipherSuite)); |
5354 if (rv != SECSuccess) { | 5389 if (rv != SECSuccess) { |
| 5390 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5355 return rv; /* err set by ssl3_AppendHandshake* */ | 5391 return rv; /* err set by ssl3_AppendHandshake* */ |
5356 } | 5392 } |
5357 } | 5393 } |
5358 } | 5394 } |
5359 | 5395 |
5360 /* if cards were removed or inserted between count_cipher_suites and | 5396 /* if cards were removed or inserted between count_cipher_suites and |
5361 * generating our list, detect the error here rather than send it off to | 5397 * generating our list, detect the error here rather than send it off to |
5362 * the server.. */ | 5398 * the server.. */ |
5363 if (actual_count != num_suites) { | 5399 if (actual_count != num_suites) { |
5364 /* Card removal/insertion error */ | 5400 /* Card removal/insertion error */ |
| 5401 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5365 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); | 5402 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); |
5366 return SECFailure; | 5403 return SECFailure; |
5367 } | 5404 } |
5368 | 5405 |
5369 rv = ssl3_AppendHandshakeNumber(ss, numCompressionMethods, 1); | 5406 rv = ssl3_AppendHandshakeNumber(ss, numCompressionMethods, 1); |
5370 if (rv != SECSuccess) { | 5407 if (rv != SECSuccess) { |
| 5408 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5371 return rv; /* err set by ssl3_AppendHandshake* */ | 5409 return rv; /* err set by ssl3_AppendHandshake* */ |
5372 } | 5410 } |
5373 for (i = 0; i < compressionMethodsCount; i++) { | 5411 for (i = 0; i < compressionMethodsCount; i++) { |
5374 if (!compressionEnabled(ss, compressions[i])) | 5412 if (!compressionEnabled(ss, compressions[i])) |
5375 continue; | 5413 continue; |
5376 rv = ssl3_AppendHandshakeNumber(ss, compressions[i], 1); | 5414 rv = ssl3_AppendHandshakeNumber(ss, compressions[i], 1); |
5377 if (rv != SECSuccess) { | 5415 if (rv != SECSuccess) { |
| 5416 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5378 return rv; /* err set by ssl3_AppendHandshake* */ | 5417 return rv; /* err set by ssl3_AppendHandshake* */ |
5379 } | 5418 } |
5380 } | 5419 } |
5381 | 5420 |
5382 if (total_exten_len) { | 5421 if (total_exten_len) { |
5383 PRUint32 maxBytes = total_exten_len - 2; | 5422 PRUint32 maxBytes = total_exten_len - 2; |
5384 PRInt32 extLen; | 5423 PRInt32 extLen; |
5385 | 5424 |
5386 rv = ssl3_AppendHandshakeNumber(ss, maxBytes, 2); | 5425 rv = ssl3_AppendHandshakeNumber(ss, maxBytes, 2); |
5387 if (rv != SECSuccess) { | 5426 if (rv != SECSuccess) { |
| 5427 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5388 return rv; /* err set by AppendHandshake. */ | 5428 return rv; /* err set by AppendHandshake. */ |
5389 } | 5429 } |
5390 | 5430 |
5391 extLen = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, maxBytes, NULL); | 5431 extLen = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, maxBytes, NULL); |
5392 if (extLen < 0) { | 5432 if (extLen < 0) { |
| 5433 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5393 return SECFailure; | 5434 return SECFailure; |
5394 } | 5435 } |
5395 maxBytes -= extLen; | 5436 maxBytes -= extLen; |
5396 | 5437 |
5397 extLen = ssl3_AppendPaddingExtension(ss, paddingExtensionLen, maxBytes); | 5438 extLen = ssl3_AppendPaddingExtension(ss, paddingExtensionLen, maxBytes); |
5398 if (extLen < 0) { | 5439 if (extLen < 0) { |
| 5440 if (sid->u.ssl3.lock) { PR_RWLock_Unlock(sid->u.ssl3.lock); } |
5399 return SECFailure; | 5441 return SECFailure; |
5400 } | 5442 } |
5401 maxBytes -= extLen; | 5443 maxBytes -= extLen; |
5402 | 5444 |
5403 PORT_Assert(!maxBytes); | 5445 PORT_Assert(!maxBytes); |
5404 } | 5446 } |
| 5447 |
| 5448 if (sid->u.ssl3.lock) { |
| 5449 PR_RWLock_Unlock(sid->u.ssl3.lock); |
| 5450 } |
| 5451 |
| 5452 if (ss->xtnData.sentSessionTicketInClientHello) { |
| 5453 SSL_AtomicIncrementLong(&ssl3stats.sch_sid_stateless_resumes); |
| 5454 } |
| 5455 |
5405 if (ss->ssl3.hs.sendingSCSV) { | 5456 if (ss->ssl3.hs.sendingSCSV) { |
5406 /* Since we sent the SCSV, pretend we sent empty RI extension. */ | 5457 /* Since we sent the SCSV, pretend we sent empty RI extension. */ |
5407 TLSExtensionData *xtnData = &ss->xtnData; | 5458 TLSExtensionData *xtnData = &ss->xtnData; |
5408 xtnData->advertised[xtnData->numAdvertised++] = | 5459 xtnData->advertised[xtnData->numAdvertised++] = |
5409 ssl_renegotiation_info_xtn; | 5460 ssl_renegotiation_info_xtn; |
5410 } | 5461 } |
5411 | 5462 |
5412 flags = 0; | 5463 flags = 0; |
5413 if (!ss->firstHsDone && !IS_DTLS(ss)) { | 5464 if (!ss->firstHsDone && !IS_DTLS(ss)) { |
5414 flags |= ssl_SEND_FLAG_CAP_RECORD_VERSION; | 5465 flags |= ssl_SEND_FLAG_CAP_RECORD_VERSION; |
(...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6201 unsigned int len; | 6252 unsigned int len; |
6202 SSL3SignatureAndHashAlgorithm sigAndHash; | 6253 SSL3SignatureAndHashAlgorithm sigAndHash; |
6203 | 6254 |
6204 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | 6255 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); |
6205 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 6256 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
6206 | 6257 |
6207 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake", | 6258 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake", |
6208 SSL_GETPID(), ss->fd)); | 6259 SSL_GETPID(), ss->fd)); |
6209 | 6260 |
6210 ssl_GetSpecReadLock(ss); | 6261 ssl_GetSpecReadLock(ss); |
6211 /* In TLS 1.2, ssl3_ComputeHandshakeHashes always uses the handshake hash | 6262 if (ss->ssl3.hs.hashType == handshake_hash_single && |
6212 * function (SHA-256). If the server or the client does not support SHA-256 | 6263 » ss->ssl3.hs.backupHash) { |
6213 * as a signature hash, we can either maintain a backup SHA-1 handshake | |
6214 * hash or buffer all handshake messages. | |
6215 */ | |
6216 if (ss->ssl3.hs.hashType == handshake_hash_single && ss->ssl3.hs.md5) { | |
6217 rv = ssl3_ComputeBackupHandshakeHashes(ss, &hashes); | 6264 rv = ssl3_ComputeBackupHandshakeHashes(ss, &hashes); |
6218 » PORT_Assert(ss->ssl3.hs.md5 == NULL); | 6265 » PORT_Assert(!ss->ssl3.hs.backupHash); |
6219 } else { | 6266 } else { |
6220 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); | 6267 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); |
6221 } | 6268 } |
6222 ssl_ReleaseSpecReadLock(ss); | 6269 ssl_ReleaseSpecReadLock(ss); |
6223 if (rv != SECSuccess) { | 6270 if (rv != SECSuccess) { |
6224 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ | 6271 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ |
6225 } | 6272 } |
6226 | 6273 |
6227 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | 6274 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); |
6228 isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | 6275 isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6604 PK11_FreeSlot(slot); | 6651 PK11_FreeSlot(slot); |
6605 if (pwSpec->master_secret == NULL) { | 6652 if (pwSpec->master_secret == NULL) { |
6606 break; | 6653 break; |
6607 } | 6654 } |
6608 } | 6655 } |
6609 | 6656 |
6610 /* Got a Match */ | 6657 /* Got a Match */ |
6611 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_hits ); | 6658 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_hits ); |
6612 | 6659 |
6613 /* If we sent a session ticket, then this is a stateless resume. */ | 6660 /* If we sent a session ticket, then this is a stateless resume. */ |
6614 » if (sid->version > SSL_LIBRARY_VERSION_3_0 && | 6661 » if (ss->xtnData.sentSessionTicketInClientHello) |
6615 » sid->u.ssl3.sessionTicket.ticket.data != NULL) | |
6616 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_stateless_resumes ); | 6662 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_stateless_resumes ); |
6617 | 6663 |
6618 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) | 6664 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) |
6619 ss->ssl3.hs.ws = wait_new_session_ticket; | 6665 ss->ssl3.hs.ws = wait_new_session_ticket; |
6620 else | 6666 else |
6621 ss->ssl3.hs.ws = wait_change_cipher; | 6667 ss->ssl3.hs.ws = wait_change_cipher; |
6622 | 6668 |
6623 ss->ssl3.hs.isResuming = PR_TRUE; | 6669 ss->ssl3.hs.isResuming = PR_TRUE; |
6624 | 6670 |
6625 /* copy the peer cert from the SID */ | 6671 /* copy the peer cert from the SID */ |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7030 * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and | 7076 * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and |
7031 * older, DSA key size is at most 1024 bits and the hash function must | 7077 * older, DSA key size is at most 1024 bits and the hash function must |
7032 * be SHA-1. | 7078 * be SHA-1. |
7033 */ | 7079 */ |
7034 if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) { | 7080 if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) { |
7035 *preferSha1 = SECKEY_PublicKeyStrength(pubk) <= 128; | 7081 *preferSha1 = SECKEY_PublicKeyStrength(pubk) <= 128; |
7036 } else { | 7082 } else { |
7037 *preferSha1 = PR_FALSE; | 7083 *preferSha1 = PR_FALSE; |
7038 } | 7084 } |
7039 | 7085 |
7040 done: | 7086 done: |
7041 if (pubk) | 7087 if (pubk) |
7042 SECKEY_DestroyPublicKey(pubk); | 7088 SECKEY_DestroyPublicKey(pubk); |
7043 return rv; | 7089 return rv; |
7044 } | 7090 } |
7045 | 7091 |
7046 /* Destroys the backup handshake hash context if we don't need it. Note that | 7092 /* Destroys the backup handshake hash context if we don't need it. Note that |
7047 * this function selects the hash algorithm for client authentication | 7093 * this function selects the hash algorithm for client authentication |
7048 * signatures; ssl3_SendCertificateVerify uses the presence of the backup hash | 7094 * signatures; ssl3_SendCertificateVerify uses the presence of the backup hash |
7049 * to determine whether to use SHA-1 or SHA-256. */ | 7095 * to determine whether to use SHA-1 or SHA-256. */ |
7050 static void | 7096 static void |
7051 ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss, | 7097 ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss, |
7052 const SECItem *algorithms) | 7098 const SECItem *algorithms) |
7053 { | 7099 { |
7054 SECStatus rv; | 7100 SECStatus rv; |
7055 TLSSignatureAlgorithm sigAlg; | 7101 TLSSignatureAlgorithm sigAlg; |
7056 PRBool preferSha1; | 7102 PRBool preferSha1; |
7057 PRBool supportsSha1 = PR_FALSE; | 7103 PRBool supportsSha1 = PR_FALSE; |
7058 PRBool supportsSha256 = PR_FALSE; | 7104 PRBool supportsSha256 = PR_FALSE; |
7059 PRBool needBackupHash = PR_FALSE; | 7105 PRBool needBackupHash = PR_FALSE; |
7060 unsigned int i; | 7106 unsigned int i; |
7061 | 7107 |
7062 PORT_Assert(ss->ssl3.hs.md5); | 7108 #ifndef NO_PKCS11_BYPASS |
| 7109 /* Backup handshake hash is not supported in PKCS #11 bypass mode. */ |
| 7110 if (ss->opt.bypassPKCS11) { |
| 7111 » PORT_Assert(!ss->ssl3.hs.backupHash); |
| 7112 » return; |
| 7113 } |
| 7114 #endif |
| 7115 PORT_Assert(ss->ssl3.hs.backupHash); |
7063 | 7116 |
7064 /* Determine the key's signature algorithm and whether it prefers SHA-1. */ | 7117 /* Determine the key's signature algorithm and whether it prefers SHA-1. */ |
7065 rv = ssl3_ExtractClientKeyInfo(ss, &sigAlg, &preferSha1); | 7118 rv = ssl3_ExtractClientKeyInfo(ss, &sigAlg, &preferSha1); |
7066 if (rv != SECSuccess) { | 7119 if (rv != SECSuccess) { |
7067 goto done; | 7120 goto done; |
7068 } | 7121 } |
7069 | 7122 |
7070 /* Determine the server's hash support for that signature algorithm. */ | 7123 /* Determine the server's hash support for that signature algorithm. */ |
7071 for (i = 0; i < algorithms->len; i += 2) { | 7124 for (i = 0; i < algorithms->len; i += 2) { |
7072 if (algorithms->data[i+1] == sigAlg) { | 7125 if (algorithms->data[i+1] == sigAlg) { |
7073 if (algorithms->data[i] == tls_hash_sha1) { | 7126 if (algorithms->data[i] == tls_hash_sha1) { |
7074 supportsSha1 = PR_TRUE; | 7127 supportsSha1 = PR_TRUE; |
7075 } else if (algorithms->data[i] == tls_hash_sha256) { | 7128 } else if (algorithms->data[i] == tls_hash_sha256) { |
7076 supportsSha256 = PR_TRUE; | 7129 supportsSha256 = PR_TRUE; |
7077 } | 7130 } |
7078 } | 7131 } |
7079 } | 7132 } |
7080 | 7133 |
7081 /* If either the server does not support SHA-256 or the client key prefers | 7134 /* If either the server does not support SHA-256 or the client key prefers |
7082 * SHA-1, leave the backup hash. */ | 7135 * SHA-1, leave the backup hash. */ |
7083 if (supportsSha1 && (preferSha1 || !supportsSha256)) { | 7136 if (supportsSha1 && (preferSha1 || !supportsSha256)) { |
7084 needBackupHash = PR_TRUE; | 7137 needBackupHash = PR_TRUE; |
7085 } | 7138 } |
7086 | 7139 |
7087 done: | 7140 done: |
7088 if (!needBackupHash) { | 7141 if (!needBackupHash) { |
7089 » PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); | 7142 » PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); |
7090 » ss->ssl3.hs.md5 = NULL; | 7143 » ss->ssl3.hs.backupHash = NULL; |
7091 } | 7144 } |
7092 } | 7145 } |
7093 | 7146 |
7094 typedef struct dnameNode { | 7147 typedef struct dnameNode { |
7095 struct dnameNode *next; | 7148 struct dnameNode *next; |
7096 SECItem name; | 7149 SECItem name; |
7097 } dnameNode; | 7150 } dnameNode; |
7098 | 7151 |
7099 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete | 7152 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete |
7100 * ssl3 Certificate Request message. | 7153 * ssl3 Certificate Request message. |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7276 if (ss->ssl3.clientCertificate != NULL) { | 7329 if (ss->ssl3.clientCertificate != NULL) { |
7277 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | 7330 CERT_DestroyCertificate(ss->ssl3.clientCertificate); |
7278 ss->ssl3.clientCertificate = NULL; | 7331 ss->ssl3.clientCertificate = NULL; |
7279 } | 7332 } |
7280 if (ss->ssl3.platformClientKey) { | 7333 if (ss->ssl3.platformClientKey) { |
7281 ssl_FreePlatformKey(ss->ssl3.platformClientKey); | 7334 ssl_FreePlatformKey(ss->ssl3.platformClientKey); |
7282 ss->ssl3.platformClientKey = (PlatformKey)NULL; | 7335 ss->ssl3.platformClientKey = (PlatformKey)NULL; |
7283 } | 7336 } |
7284 goto send_no_certificate; | 7337 goto send_no_certificate; |
7285 } | 7338 } |
7286 » if (isTLS12) { | 7339 » if (ss->ssl3.hs.hashType == handshake_hash_single) { |
7287 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); | 7340 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); |
7288 } | 7341 } |
7289 break; /* not an error */ | 7342 break; /* not an error */ |
7290 } | 7343 } |
7291 #endif /* NSS_PLATFORM_CLIENT_AUTH */ | 7344 #endif /* NSS_PLATFORM_CLIENT_AUTH */ |
7292 /* check what the callback function returned */ | 7345 /* check what the callback function returned */ |
7293 if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { | 7346 if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { |
7294 /* we are missing either the key or cert */ | 7347 /* we are missing either the key or cert */ |
7295 if (ss->ssl3.clientCertificate) { | 7348 if (ss->ssl3.clientCertificate) { |
7296 /* got a cert, but no key - free it */ | 7349 /* got a cert, but no key - free it */ |
7297 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | 7350 CERT_DestroyCertificate(ss->ssl3.clientCertificate); |
7298 ss->ssl3.clientCertificate = NULL; | 7351 ss->ssl3.clientCertificate = NULL; |
7299 } | 7352 } |
7300 if (ss->ssl3.clientPrivateKey) { | 7353 if (ss->ssl3.clientPrivateKey) { |
7301 /* got a key, but no cert - free it */ | 7354 /* got a key, but no cert - free it */ |
7302 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | 7355 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
7303 ss->ssl3.clientPrivateKey = NULL; | 7356 ss->ssl3.clientPrivateKey = NULL; |
7304 } | 7357 } |
7305 goto send_no_certificate; | 7358 goto send_no_certificate; |
7306 } | 7359 } |
7307 /* Setting ssl3.clientCertChain non-NULL will cause | 7360 /* Setting ssl3.clientCertChain non-NULL will cause |
7308 * ssl3_HandleServerHelloDone to call SendCertificate. | 7361 * ssl3_HandleServerHelloDone to call SendCertificate. |
7309 */ | 7362 */ |
7310 ss->ssl3.clientCertChain = CERT_CertChainFromCert( | 7363 ss->ssl3.clientCertChain = CERT_CertChainFromCert( |
7311 ss->ssl3.clientCertificate, | 7364 ss->ssl3.clientCertificate, |
7312 certUsageSSLClient, PR_FALSE); | 7365 certUsageSSLClient, PR_FALSE); |
7313 if (ss->ssl3.clientCertChain == NULL) { | 7366 if (ss->ssl3.clientCertChain == NULL) { |
7314 » if (ss->ssl3.clientCertificate != NULL) { | 7367 » CERT_DestroyCertificate(ss->ssl3.clientCertificate); |
7315 » » CERT_DestroyCertificate(ss->ssl3.clientCertificate); | 7368 » ss->ssl3.clientCertificate = NULL; |
7316 » » ss->ssl3.clientCertificate = NULL; | 7369 » SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
7317 » } | 7370 » ss->ssl3.clientPrivateKey = NULL; |
7318 » if (ss->ssl3.clientPrivateKey != NULL) { | |
7319 » » SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
7320 » » ss->ssl3.clientPrivateKey = NULL; | |
7321 » } | |
7322 goto send_no_certificate; | 7371 goto send_no_certificate; |
7323 } | 7372 } |
7324 » if (isTLS12) { | 7373 » if (ss->ssl3.hs.hashType == handshake_hash_single) { |
7325 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); | 7374 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); |
7326 } | 7375 } |
7327 break; /* not an error */ | 7376 break; /* not an error */ |
7328 | 7377 |
7329 case SECFailure: | 7378 case SECFailure: |
7330 default: | 7379 default: |
7331 send_no_certificate: | 7380 send_no_certificate: |
7332 if (isTLS) { | 7381 if (isTLS) { |
7333 ss->ssl3.sendEmptyCert = PR_TRUE; | 7382 ss->ssl3.sendEmptyCert = PR_TRUE; |
7334 } else { | 7383 } else { |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7552 | 7601 |
7553 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); | 7602 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
7554 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 7603 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
7555 | 7604 |
7556 sendClientCert = !ss->ssl3.sendEmptyCert && | 7605 sendClientCert = !ss->ssl3.sendEmptyCert && |
7557 ss->ssl3.clientCertChain != NULL && | 7606 ss->ssl3.clientCertChain != NULL && |
7558 (ss->ssl3.platformClientKey || | 7607 (ss->ssl3.platformClientKey || |
7559 ss->ssl3.clientPrivateKey != NULL); | 7608 ss->ssl3.clientPrivateKey != NULL); |
7560 | 7609 |
7561 if (!sendClientCert && | 7610 if (!sendClientCert && |
7562 » ss->ssl3.hs.hashType == handshake_hash_single && ss->ssl3.hs.md5) { | 7611 » ss->ssl3.hs.hashType == handshake_hash_single && |
| 7612 » ss->ssl3.hs.backupHash) { |
7563 /* Don't need the backup handshake hash. */ | 7613 /* Don't need the backup handshake hash. */ |
7564 » PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); | 7614 » PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); |
7565 » ss->ssl3.hs.md5 = NULL; | 7615 » ss->ssl3.hs.backupHash = NULL; |
7566 } | 7616 } |
7567 | 7617 |
7568 /* We must wait for the server's certificate to be authenticated before | 7618 /* We must wait for the server's certificate to be authenticated before |
7569 * sending the client certificate in order to disclosing the client | 7619 * sending the client certificate in order to disclosing the client |
7570 * certificate to an attacker that does not have a valid cert for the | 7620 * certificate to an attacker that does not have a valid cert for the |
7571 * domain we are connecting to. | 7621 * domain we are connecting to. |
7572 * | 7622 * |
7573 * XXX: We should do the same for the NPN extension, but for that we | 7623 * XXX: We should do the same for the NPN extension, but for that we |
7574 * need an option to give the application the ability to leak the NPN | 7624 * need an option to give the application the ability to leak the NPN |
7575 * information to get better performance. | 7625 * information to get better performance. |
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8324 ss->ssl3.hs.suite_def = | 8374 ss->ssl3.hs.suite_def = |
8325 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); | 8375 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); |
8326 goto suite_found; | 8376 goto suite_found; |
8327 } | 8377 } |
8328 } | 8378 } |
8329 } | 8379 } |
8330 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | 8380 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; |
8331 goto alert_loser; | 8381 goto alert_loser; |
8332 | 8382 |
8333 suite_found: | 8383 suite_found: |
8334 /* Look for a matching compression algorithm. */ | 8384 /* Select a compression algorithm. */ |
8335 for (i = 0; i < comps.len; i++) { | 8385 for (i = 0; i < comps.len; i++) { |
8336 if (!compressionEnabled(ss, comps.data[i])) | 8386 if (!compressionEnabled(ss, comps.data[i])) |
8337 continue; | 8387 continue; |
8338 for (j = 0; j < compressionMethodsCount; j++) { | 8388 for (j = 0; j < compressionMethodsCount; j++) { |
8339 if (comps.data[i] == compressions[j]) { | 8389 if (comps.data[i] == compressions[j]) { |
8340 ss->ssl3.hs.compression = | 8390 ss->ssl3.hs.compression = |
8341 (SSLCompressionMethod)compressions[j]; | 8391 (SSLCompressionMethod)compressions[j]; |
8342 goto compression_found; | 8392 goto compression_found; |
8343 } | 8393 } |
8344 } | 8394 } |
(...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9766 rv = ssl3_AppendHandshakeHeader(ss, certificate, 3); | 9816 rv = ssl3_AppendHandshakeHeader(ss, certificate, 3); |
9767 if (rv == SECSuccess) { | 9817 if (rv == SECSuccess) { |
9768 rv = ssl3_AppendHandshakeNumber(ss, 0, 3); | 9818 rv = ssl3_AppendHandshakeNumber(ss, 0, 3); |
9769 } | 9819 } |
9770 return rv; /* error, if any, set by functions called above. */ | 9820 return rv; /* error, if any, set by functions called above. */ |
9771 } | 9821 } |
9772 | 9822 |
9773 SECStatus | 9823 SECStatus |
9774 ssl3_HandleNewSessionTicket(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | 9824 ssl3_HandleNewSessionTicket(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
9775 { | 9825 { |
9776 SECStatus rv; | 9826 SECStatus rv; |
9777 NewSessionTicket session_ticket; | 9827 SECItem ticketData; |
9778 | 9828 |
9779 SSL_TRC(3, ("%d: SSL3[%d]: handle session_ticket handshake", | 9829 SSL_TRC(3, ("%d: SSL3[%d]: handle session_ticket handshake", |
9780 SSL_GETPID(), ss->fd)); | 9830 SSL_GETPID(), ss->fd)); |
9781 | 9831 |
9782 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); | 9832 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
9783 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 9833 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
9784 | 9834 |
| 9835 PORT_Assert(!ss->ssl3.hs.newSessionTicket.ticket.data); |
| 9836 PORT_Assert(!ss->ssl3.hs.receivedNewSessionTicket); |
| 9837 |
9785 if (ss->ssl3.hs.ws != wait_new_session_ticket) { | 9838 if (ss->ssl3.hs.ws != wait_new_session_ticket) { |
9786 SSL3_SendAlert(ss, alert_fatal, unexpected_message); | 9839 SSL3_SendAlert(ss, alert_fatal, unexpected_message); |
9787 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET); | 9840 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET); |
9788 return SECFailure; | 9841 return SECFailure; |
9789 } | 9842 } |
9790 | 9843 |
9791 session_ticket.received_timestamp = ssl_Time(); | 9844 /* RFC5077 Section 3.3: "The client MUST NOT treat the ticket as valid |
| 9845 * until it has verified the server's Finished message." See the comment in |
| 9846 * ssl3_FinishHandshake for more details. |
| 9847 */ |
| 9848 ss->ssl3.hs.newSessionTicket.received_timestamp = ssl_Time(); |
9792 if (length < 4) { | 9849 if (length < 4) { |
9793 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); | 9850 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); |
9794 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); | 9851 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); |
9795 return SECFailure; | 9852 return SECFailure; |
9796 } | 9853 } |
9797 session_ticket.ticket_lifetime_hint = | 9854 ss->ssl3.hs.newSessionTicket.ticket_lifetime_hint = |
9798 (PRUint32)ssl3_ConsumeHandshakeNumber(ss, 4, &b, &length); | 9855 (PRUint32)ssl3_ConsumeHandshakeNumber(ss, 4, &b, &length); |
9799 | 9856 |
9800 rv = ssl3_ConsumeHandshakeVariable(ss, &session_ticket.ticket, 2, | 9857 rv = ssl3_ConsumeHandshakeVariable(ss, &ticketData, 2, &b, &length); |
9801 » &b, &length); | |
9802 if (length != 0 || rv != SECSuccess) { | 9858 if (length != 0 || rv != SECSuccess) { |
9803 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); | 9859 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); |
9804 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); | 9860 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); |
9805 return SECFailure; /* malformed */ | 9861 return SECFailure; /* malformed */ |
9806 } | 9862 } |
| 9863 rv = SECITEM_CopyItem(NULL, &ss->ssl3.hs.newSessionTicket.ticket, |
| 9864 &ticketData); |
| 9865 if (rv != SECSuccess) { |
| 9866 return rv; |
| 9867 } |
| 9868 ss->ssl3.hs.receivedNewSessionTicket = PR_TRUE; |
9807 | 9869 |
9808 rv = ssl3_SetSIDSessionTicket(ss->sec.ci.sid, &session_ticket); | |
9809 if (rv != SECSuccess) { | |
9810 (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure); | |
9811 PORT_SetError(SSL_ERROR_INTERNAL_ERROR_ALERT); | |
9812 return SECFailure; | |
9813 } | |
9814 ss->ssl3.hs.ws = wait_change_cipher; | 9870 ss->ssl3.hs.ws = wait_change_cipher; |
9815 return SECSuccess; | 9871 return SECSuccess; |
9816 } | 9872 } |
9817 | 9873 |
9818 #ifdef NISCC_TEST | 9874 #ifdef NISCC_TEST |
9819 static PRInt32 connNum = 0; | 9875 static PRInt32 connNum = 0; |
9820 | 9876 |
9821 static SECStatus | 9877 static SECStatus |
9822 get_fake_cert(SECItem *pCertItem, int *pIndex) | 9878 get_fake_cert(SECItem *pCertItem, int *pIndex) |
9823 { | 9879 { |
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10494 * success. Any remaining work will be taken care of by subsequent | 10550 * success. Any remaining work will be taken care of by subsequent |
10495 * calls to SSL_ForceHandshake/PR_Send/PR_Read/etc. | 10551 * calls to SSL_ForceHandshake/PR_Send/PR_Read/etc. |
10496 */ | 10552 */ |
10497 if (rv == SECWouldBlock) { | 10553 if (rv == SECWouldBlock) { |
10498 rv = SECSuccess; | 10554 rv = SECSuccess; |
10499 } | 10555 } |
10500 } else { | 10556 } else { |
10501 SSL_TRC(3, ("%d: SSL3[%p]: certificate authentication won the race with" | 10557 SSL_TRC(3, ("%d: SSL3[%p]: certificate authentication won the race with" |
10502 " peer's finished message", SSL_GETPID(), ss->fd)); | 10558 " peer's finished message", SSL_GETPID(), ss->fd)); |
10503 | 10559 |
10504 PORT_Assert(!ss->firstHsDone); | |
10505 PORT_Assert(!ss->sec.isServer); | |
10506 PORT_Assert(!ss->ssl3.hs.isResuming); | 10560 PORT_Assert(!ss->ssl3.hs.isResuming); |
10507 PORT_Assert(ss->ssl3.hs.ws != idle_handshake); | 10561 PORT_Assert(ss->ssl3.hs.ws != idle_handshake); |
10508 | 10562 |
10509 if (ss->opt.enableFalseStart && | 10563 if (ss->opt.enableFalseStart && |
10510 !ss->firstHsDone && | 10564 !ss->firstHsDone && |
10511 !ss->sec.isServer && | |
10512 !ss->ssl3.hs.isResuming && | 10565 !ss->ssl3.hs.isResuming && |
10513 ssl3_WaitingForStartOfServerSecondRound(ss)) { | 10566 ssl3_WaitingForStartOfServerSecondRound(ss)) { |
10514 /* ssl3_SendClientSecondRound deferred the false start check because | 10567 /* ssl3_SendClientSecondRound deferred the false start check because |
10515 * certificate authentication was pending, so we do it now if we sti
ll | 10568 * certificate authentication was pending, so we do it now if we sti
ll |
10516 * haven't received any of the server's second round yet. | 10569 * haven't received any of the server's second round yet. |
10517 */ | 10570 */ |
10518 rv = ssl3_CheckFalseStart(ss); | 10571 rv = ssl3_CheckFalseStart(ss); |
10519 } else { | 10572 } else { |
10520 rv = SECSuccess; | 10573 rv = SECSuccess; |
10521 } | 10574 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10600 &outData, isFIPS); | 10653 &outData, isFIPS); |
10601 } else { | 10654 } else { |
10602 rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS); | 10655 rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS); |
10603 } | 10656 } |
10604 PORT_Assert(rv != SECSuccess || outData.len == outLen); | 10657 PORT_Assert(rv != SECSuccess || outData.len == outLen); |
10605 #endif | 10658 #endif |
10606 } | 10659 } |
10607 return rv; | 10660 return rv; |
10608 } | 10661 } |
10609 | 10662 |
10610 /* called from ssl3_HandleServerHelloDone | 10663 /* called from ssl3_SendClientSecondRound |
| 10664 * ssl3_HandleFinished |
10611 */ | 10665 */ |
10612 static SECStatus | 10666 static SECStatus |
10613 ssl3_SendNextProto(sslSocket *ss) | 10667 ssl3_SendNextProto(sslSocket *ss) |
10614 { | 10668 { |
10615 SECStatus rv; | 10669 SECStatus rv; |
10616 int padding_len; | 10670 int padding_len; |
10617 static const unsigned char padding[32] = {0}; | 10671 static const unsigned char padding[32] = {0}; |
10618 | 10672 |
10619 if (ss->ssl3.nextProto.len == 0 || | 10673 if (ss->ssl3.nextProto.len == 0 || |
10620 ss->ssl3.nextProtoState == SSL_NEXT_PROTO_SELECTED) { | 10674 ss->ssl3.nextProtoState == SSL_NEXT_PROTO_SELECTED) { |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10873 if (ss->ssl3.channelIDPub) | 10927 if (ss->ssl3.channelIDPub) |
10874 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); | 10928 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); |
10875 | 10929 |
10876 ss->handshake = ssl_GatherRecord1stHandshake; | 10930 ss->handshake = ssl_GatherRecord1stHandshake; |
10877 ss->ssl3.channelID = channelID; | 10931 ss->ssl3.channelID = channelID; |
10878 ss->ssl3.channelIDPub = channelIDPub; | 10932 ss->ssl3.channelIDPub = channelIDPub; |
10879 | 10933 |
10880 return SECSuccess; | 10934 return SECSuccess; |
10881 } | 10935 } |
10882 | 10936 |
10883 /* called from ssl3_HandleServerHelloDone | 10937 /* called from ssl3_SendClientSecondRound |
10884 * ssl3_HandleClientHello | 10938 * ssl3_HandleClientHello |
10885 * ssl3_HandleFinished | 10939 * ssl3_HandleFinished |
10886 */ | 10940 */ |
10887 static SECStatus | 10941 static SECStatus |
10888 ssl3_SendFinished(sslSocket *ss, PRInt32 flags) | 10942 ssl3_SendFinished(sslSocket *ss, PRInt32 flags) |
10889 { | 10943 { |
10890 ssl3CipherSpec *cwSpec; | 10944 ssl3CipherSpec *cwSpec; |
10891 PRBool isTLS; | 10945 PRBool isTLS; |
10892 PRBool isServer = ss->sec.isServer; | 10946 PRBool isServer = ss->sec.isServer; |
10893 SECStatus rv; | 10947 SECStatus rv; |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11109 PRInt32 flags = 0; | 11163 PRInt32 flags = 0; |
11110 | 11164 |
11111 /* Send a NewSessionTicket message if the client sent us | 11165 /* Send a NewSessionTicket message if the client sent us |
11112 * either an empty session ticket, or one that did not verify. | 11166 * either an empty session ticket, or one that did not verify. |
11113 * (Note that if either of these conditions was met, then the | 11167 * (Note that if either of these conditions was met, then the |
11114 * server has sent a SessionTicket extension in the | 11168 * server has sent a SessionTicket extension in the |
11115 * ServerHello message.) | 11169 * ServerHello message.) |
11116 */ | 11170 */ |
11117 if (isServer && !ss->ssl3.hs.isResuming && | 11171 if (isServer && !ss->ssl3.hs.isResuming && |
11118 ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) { | 11172 ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) { |
| 11173 /* RFC 5077 Section 3.3: "In the case of a full handshake, the |
| 11174 * server MUST verify the client's Finished message before sending |
| 11175 * the ticket." Presumably, this also means that the client's |
| 11176 * certificate, if any, must be verified beforehand too. |
| 11177 */ |
11119 rv = ssl3_SendNewSessionTicket(ss); | 11178 rv = ssl3_SendNewSessionTicket(ss); |
11120 if (rv != SECSuccess) { | 11179 if (rv != SECSuccess) { |
11121 goto xmit_loser; | 11180 goto xmit_loser; |
11122 } | 11181 } |
11123 } | 11182 } |
11124 | 11183 |
11125 rv = ssl3_SendChangeCipherSpecs(ss); | 11184 rv = ssl3_SendChangeCipherSpecs(ss); |
11126 if (rv != SECSuccess) { | 11185 if (rv != SECSuccess) { |
11127 goto xmit_loser; /* err is set. */ | 11186 goto xmit_loser; /* err is set. */ |
11128 } | 11187 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11233 SECStatus | 11292 SECStatus |
11234 ssl3_FinishHandshake(sslSocket * ss) | 11293 ssl3_FinishHandshake(sslSocket * ss) |
11235 { | 11294 { |
11236 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); | 11295 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
11237 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 11296 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
11238 PORT_Assert( ss->ssl3.hs.restartTarget == NULL ); | 11297 PORT_Assert( ss->ssl3.hs.restartTarget == NULL ); |
11239 | 11298 |
11240 /* The first handshake is now completed. */ | 11299 /* The first handshake is now completed. */ |
11241 ss->handshake = NULL; | 11300 ss->handshake = NULL; |
11242 | 11301 |
| 11302 /* RFC 5077 Section 3.3: "The client MUST NOT treat the ticket as valid |
| 11303 * until it has verified the server's Finished message." When the server |
| 11304 * sends a NewSessionTicket in a resumption handshake, we must wait until |
| 11305 * the handshake is finished (we have verified the server's Finished |
| 11306 * AND the server's certificate) before we update the ticket in the sid. |
| 11307 * |
| 11308 * This must be done before we call (*ss->sec.cache)(ss->sec.ci.sid) |
| 11309 * because CacheSID requires the session ticket to already be set, and also |
| 11310 * because of the lazy lock creation scheme used by CacheSID and |
| 11311 * ssl3_SetSIDSessionTicket. |
| 11312 */ |
| 11313 if (ss->ssl3.hs.receivedNewSessionTicket) { |
| 11314 PORT_Assert(!ss->sec.isServer); |
| 11315 ssl3_SetSIDSessionTicket(ss->sec.ci.sid, &ss->ssl3.hs.newSessionTicket); |
| 11316 /* The sid took over the ticket data */ |
| 11317 PORT_Assert(!ss->ssl3.hs.newSessionTicket.ticket.data); |
| 11318 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; |
| 11319 } |
| 11320 |
11243 if (ss->ssl3.hs.cacheSID && ss->sec.isServer) { | 11321 if (ss->ssl3.hs.cacheSID && ss->sec.isServer) { |
| 11322 PORT_Assert(ss->sec.ci.sid->cached == never_cached); |
11244 (*ss->sec.cache)(ss->sec.ci.sid); | 11323 (*ss->sec.cache)(ss->sec.ci.sid); |
11245 ss->ssl3.hs.cacheSID = PR_FALSE; | 11324 ss->ssl3.hs.cacheSID = PR_FALSE; |
11246 } | 11325 } |
11247 | 11326 |
11248 ss->ssl3.hs.canFalseStart = PR_FALSE; /* False Start phase is complete */ | 11327 ss->ssl3.hs.canFalseStart = PR_FALSE; /* False Start phase is complete */ |
11249 ss->ssl3.hs.ws = idle_handshake; | 11328 ss->ssl3.hs.ws = idle_handshake; |
11250 | 11329 |
11251 ssl_FinishHandshake(ss); | 11330 ssl_FinishHandshake(ss); |
11252 | 11331 |
11253 return SECSuccess; | 11332 return SECSuccess; |
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12304 ss->ssl3.hs.rtRetries = 0; | 12383 ss->ssl3.hs.rtRetries = 0; |
12305 ss->ssl3.hs.recvdHighWater = -1; | 12384 ss->ssl3.hs.recvdHighWater = -1; |
12306 PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight); | 12385 PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight); |
12307 dtls_SetMTU(ss, 0); /* Set the MTU to the highest plateau */ | 12386 dtls_SetMTU(ss, 0); /* Set the MTU to the highest plateau */ |
12308 } | 12387 } |
12309 | 12388 |
12310 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); | 12389 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); |
12311 ss->ssl3.hs.messages.buf = NULL; | 12390 ss->ssl3.hs.messages.buf = NULL; |
12312 ss->ssl3.hs.messages.space = 0; | 12391 ss->ssl3.hs.messages.space = 0; |
12313 | 12392 |
| 12393 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; |
| 12394 PORT_Memset(&ss->ssl3.hs.newSessionTicket, 0, |
| 12395 sizeof(ss->ssl3.hs.newSessionTicket)); |
| 12396 |
12314 ss->ssl3.initialized = PR_TRUE; | 12397 ss->ssl3.initialized = PR_TRUE; |
12315 return SECSuccess; | 12398 return SECSuccess; |
12316 } | 12399 } |
12317 | 12400 |
12318 /* Returns a reference counted object that contains a key pair. | 12401 /* Returns a reference counted object that contains a key pair. |
12319 * Or NULL on failure. Initial ref count is 1. | 12402 * Or NULL on failure. Initial ref count is 1. |
12320 * Uses the keys in the pair as input. | 12403 * Uses the keys in the pair as input. |
12321 */ | 12404 */ |
12322 ssl3KeyPair * | 12405 ssl3KeyPair * |
12323 ssl3_NewKeyPair( SECKEYPrivateKey * privKey, SECKEYPublicKey * pubKey) | 12406 ssl3_NewKeyPair( SECKEYPrivateKey * privKey, SECKEYPublicKey * pubKey) |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12738 if (ss->ssl3.hs.messages.buf) { | 12821 if (ss->ssl3.hs.messages.buf) { |
12739 PORT_Free(ss->ssl3.hs.messages.buf); | 12822 PORT_Free(ss->ssl3.hs.messages.buf); |
12740 ss->ssl3.hs.messages.buf = NULL; | 12823 ss->ssl3.hs.messages.buf = NULL; |
12741 ss->ssl3.hs.messages.len = 0; | 12824 ss->ssl3.hs.messages.len = 0; |
12742 ss->ssl3.hs.messages.space = 0; | 12825 ss->ssl3.hs.messages.space = 0; |
12743 } | 12826 } |
12744 | 12827 |
12745 /* free the SSL3Buffer (msg_body) */ | 12828 /* free the SSL3Buffer (msg_body) */ |
12746 PORT_Free(ss->ssl3.hs.msg_body.buf); | 12829 PORT_Free(ss->ssl3.hs.msg_body.buf); |
12747 | 12830 |
| 12831 SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); |
| 12832 |
12748 /* free up the CipherSpecs */ | 12833 /* free up the CipherSpecs */ |
12749 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); | 12834 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); |
12750 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); | 12835 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); |
12751 | 12836 |
12752 /* Destroy the DTLS data */ | 12837 /* Destroy the DTLS data */ |
12753 if (IS_DTLS(ss)) { | 12838 if (IS_DTLS(ss)) { |
12754 dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); | 12839 dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); |
12755 if (ss->ssl3.hs.recvdFragments.buf) { | 12840 if (ss->ssl3.hs.recvdFragments.buf) { |
12756 PORT_Free(ss->ssl3.hs.recvdFragments.buf); | 12841 PORT_Free(ss->ssl3.hs.recvdFragments.buf); |
12757 } | 12842 } |
12758 } | 12843 } |
12759 | 12844 |
12760 ss->ssl3.initialized = PR_FALSE; | 12845 ss->ssl3.initialized = PR_FALSE; |
12761 | 12846 |
12762 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); | 12847 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); |
12763 } | 12848 } |
12764 | 12849 |
12765 /* End of ssl3con.c */ | 12850 /* End of ssl3con.c */ |
OLD | NEW |