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 * ***** BEGIN LICENSE BLOCK ***** | 5 * This Source Code Form is subject to the terms of the Mozilla Public |
6 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 6 * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 * | 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
8 * The contents of this file are subject to the Mozilla Public License Version | 8 /* $Id: ssl3con.c,v 1.192 2012/09/28 05:10:25 wtc%google.com Exp $ */ |
9 * 1.1 (the "License"); you may not use this file except in compliance with | |
10 * the License. You may obtain a copy of the License at | |
11 * http://www.mozilla.org/MPL/ | |
12 * | |
13 * Software distributed under the License is distributed on an "AS IS" basis, | |
14 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
15 * for the specific language governing rights and limitations under the | |
16 * License. | |
17 * | |
18 * The Original Code is the Netscape security libraries. | |
19 * | |
20 * The Initial Developer of the Original Code is | |
21 * Netscape Communications Corporation. | |
22 * Portions created by the Initial Developer are Copyright (C) 1994-2000 | |
23 * the Initial Developer. All Rights Reserved. | |
24 * | |
25 * Contributor(s): | |
26 * Dr Stephen Henson <stephen.henson@gemplus.com> | |
27 * Dr Vipul Gupta <vipul.gupta@sun.com> and | |
28 * Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories | |
29 * | |
30 * Alternatively, the contents of this file may be used under the terms of | |
31 * either the GNU General Public License Version 2 or later (the "GPL"), or | |
32 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | |
33 * in which case the provisions of the GPL or the LGPL are applicable instead | |
34 * of those above. If you wish to allow use of your version of this file only | |
35 * under the terms of either the GPL or the LGPL, and not to allow others to | |
36 * use your version of this file under the terms of the MPL, indicate your | |
37 * decision by deleting the provisions above and replace them with the notice | |
38 * and other provisions required by the GPL or the LGPL. If you do not delete | |
39 * the provisions above, a recipient may use your version of this file under | |
40 * the terms of any one of the MPL, the GPL or the LGPL. | |
41 * | |
42 * ***** END LICENSE BLOCK ***** */ | |
43 /* $Id: ssl3con.c,v 1.173 2012/03/18 00:31:19 wtc%google.com Exp $ */ | |
44 | 9 |
45 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ | 10 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ |
46 | 11 |
47 #include "cert.h" | 12 #include "cert.h" |
48 #include "ssl.h" | 13 #include "ssl.h" |
49 #include "cryptohi.h" /* for DSAU_ stuff */ | 14 #include "cryptohi.h" /* for DSAU_ stuff */ |
50 #include "keyhi.h" | 15 #include "keyhi.h" |
51 #include "secder.h" | 16 #include "secder.h" |
52 #include "secitem.h" | 17 #include "secitem.h" |
53 | 18 |
54 #include "sslimpl.h" | 19 #include "sslimpl.h" |
55 #include "sslproto.h" | 20 #include "sslproto.h" |
56 #include "sslerr.h" | 21 #include "sslerr.h" |
57 #include "prtime.h" | 22 #include "prtime.h" |
58 #include "prinrval.h" | 23 #include "prinrval.h" |
59 #include "prerror.h" | 24 #include "prerror.h" |
60 #include "pratom.h" | 25 #include "pratom.h" |
61 #include "prthread.h" | 26 #include "prthread.h" |
62 | 27 |
63 #include "pk11func.h" | 28 #include "pk11func.h" |
64 #include "secmod.h" | 29 #include "secmod.h" |
| 30 #ifndef NO_PKCS11_BYPASS |
65 #include "blapi.h" | 31 #include "blapi.h" |
| 32 #endif |
66 | 33 |
67 #include <stdio.h> | 34 #include <stdio.h> |
68 #ifdef NSS_ENABLE_ZLIB | 35 #ifdef NSS_ENABLE_ZLIB |
69 #include "zlib.h" | 36 #include "zlib.h" |
70 #endif | 37 #endif |
71 | 38 |
72 /* DSA_SIGNATURE_LEN is deprecated and replaced by DSA1_SIGNATURE_LEN | |
73 * in NSS 3.14. Provide a backup definition when compiling against an | |
74 * older system NSS library. | |
75 */ | |
76 #ifndef DSA1_SIGNATURE_LEN | |
77 #define DSA1_SIGNATURE_LEN 40 /* Bytes */ | |
78 #endif | |
79 | |
80 #ifndef PK11_SETATTRS | 39 #ifndef PK11_SETATTRS |
81 #define PK11_SETATTRS(x,id,v,l) (x)->type = (id); \ | 40 #define PK11_SETATTRS(x,id,v,l) (x)->type = (id); \ |
82 (x)->pValue=(v); (x)->ulValueLen = (l); | 41 (x)->pValue=(v); (x)->ulValueLen = (l); |
83 #endif | 42 #endif |
84 | 43 |
85 static void ssl3_CleanupPeerCerts(sslSocket *ss); | 44 static void ssl3_CleanupPeerCerts(sslSocket *ss); |
86 static void ssl3_CopyPeerCertsFromSID(sslSocket *ss, sslSessionID *sid); | 45 static void ssl3_CopyPeerCertsFromSID(sslSocket *ss, sslSessionID *sid); |
87 static PK11SymKey *ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec, | 46 static PK11SymKey *ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec, |
88 PK11SlotInfo * serverKeySlot); | 47 PK11SlotInfo * serverKeySlot); |
89 static SECStatus ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms); | 48 static SECStatus ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms); |
(...skipping 15 matching lines...) Expand all Loading... |
105 unsigned int l); | 64 unsigned int l); |
106 static SECStatus ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags); | 65 static SECStatus ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags); |
107 | 66 |
108 static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen, | 67 static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen, |
109 int maxOutputLen, const unsigned char *input, | 68 int maxOutputLen, const unsigned char *input, |
110 int inputLen); | 69 int inputLen); |
111 | 70 |
112 #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */ | 71 #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */ |
113 #define MIN_SEND_BUF_LENGTH 4000 | 72 #define MIN_SEND_BUF_LENGTH 4000 |
114 | 73 |
115 #define MAX_CIPHER_SUITES 20 | |
116 | |
117 /* This list of SSL3 cipher suites is sorted in descending order of | 74 /* This list of SSL3 cipher suites is sorted in descending order of |
118 * precedence (desirability). It only includes cipher suites we implement. | 75 * precedence (desirability). It only includes cipher suites we implement. |
119 * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites | 76 * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites |
120 * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c) | 77 * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c) |
121 */ | 78 */ |
122 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = { | 79 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = { |
123 /* cipher_suite policy enabled is_present*/ | 80 /* cipher_suite policy enabled is_present*/ |
124 #ifdef NSS_ENABLE_ECC | 81 #ifdef NSS_ENABLE_ECC |
125 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 82 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
126 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 83 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
127 #endif /* NSS_ENABLE_ECC */ | 84 #endif /* NSS_ENABLE_ECC */ |
128 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 85 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
129 { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 86 { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
130 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 87 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
131 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 88 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
132 #ifdef NSS_ENABLE_ECC | 89 #ifdef NSS_ENABLE_ECC |
133 { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 90 { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
134 { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 91 { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
135 #endif /* NSS_ENABLE_ECC */ | 92 #endif /* NSS_ENABLE_ECC */ |
136 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 93 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
137 { TLS_RSA_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 94 { TLS_RSA_WITH_AES_256_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
138 | 95 |
139 #ifdef NSS_ENABLE_ECC | 96 #ifdef NSS_ENABLE_ECC |
140 { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 97 { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
141 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 98 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
142 { TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 99 { TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
143 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 100 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
144 #endif /* NSS_ENABLE_ECC */ | 101 #endif /* NSS_ENABLE_ECC */ |
145 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 102 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
146 { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 103 { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
147 { TLS_DHE_DSS_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 104 { TLS_DHE_DSS_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
148 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 105 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
149 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 106 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
150 #ifdef NSS_ENABLE_ECC | 107 #ifdef NSS_ENABLE_ECC |
151 { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 108 { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
152 { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 109 { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
153 { TLS_ECDH_ECDSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 110 { TLS_ECDH_ECDSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
154 { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 111 { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
155 #endif /* NSS_ENABLE_ECC */ | 112 #endif /* NSS_ENABLE_ECC */ |
156 { TLS_RSA_WITH_SEED_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 113 { TLS_RSA_WITH_SEED_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
157 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 114 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
158 { SSL_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 115 { SSL_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
159 { SSL_RSA_WITH_RC4_128_MD5, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 116 { SSL_RSA_WITH_RC4_128_MD5, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, |
160 { TLS_RSA_WITH_AES_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 117 { TLS_RSA_WITH_AES_128_CBC_SHA, » SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
161 | 118 |
162 #ifdef NSS_ENABLE_ECC | 119 #ifdef NSS_ENABLE_ECC |
163 { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 120 { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
164 { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 121 { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
165 #endif /* NSS_ENABLE_ECC */ | 122 #endif /* NSS_ENABLE_ECC */ |
166 { SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 123 { SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
167 { SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 124 { SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE}, |
168 #ifdef NSS_ENABLE_ECC | 125 #ifdef NSS_ENABLE_ECC |
169 { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 126 { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
170 { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 127 { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
171 #endif /* NSS_ENABLE_ECC */ | 128 #endif /* NSS_ENABLE_ECC */ |
172 { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 129 { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
173 { SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 130 { SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, |
174 | 131 |
175 | 132 |
176 { SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 133 { SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
177 { SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 134 { SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
178 { SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 135 { SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
179 { SSL_RSA_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 136 { SSL_RSA_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
180 { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 137 { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
181 { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 138 { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
182 | 139 |
183 { SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 140 { SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
184 { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE}, | 141 { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
185 | 142 |
186 #ifdef NSS_ENABLE_ECC | 143 #ifdef NSS_ENABLE_ECC |
187 { TLS_ECDHE_ECDSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 144 { TLS_ECDHE_ECDSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
188 { TLS_ECDHE_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 145 { TLS_ECDHE_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
189 { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 146 { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
190 { TLS_ECDH_ECDSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, | 147 { TLS_ECDH_ECDSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE, PR_FALSE}, |
191 #endif /* NSS_ENABLE_ECC */ | 148 #endif /* NSS_ENABLE_ECC */ |
192 { SSL_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 149 { SSL_RSA_WITH_NULL_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
193 { SSL_RSA_WITH_NULL_MD5, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, | 150 { SSL_RSA_WITH_NULL_MD5, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}, |
194 | 151 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 {SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, | 283 {SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, |
327 cipher_des40, mac_sha, kea_dh_dss_export}, | 284 cipher_des40, mac_sha, kea_dh_dss_export}, |
328 {SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, | 285 {SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, |
329 cipher_des40, mac_sha, kea_dh_rsa_export}, | 286 cipher_des40, mac_sha, kea_dh_rsa_export}, |
330 #endif | 287 #endif |
331 {SSL_DHE_RSA_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dhe_rsa}, | 288 {SSL_DHE_RSA_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dhe_rsa}, |
332 {SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, | 289 {SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, |
333 cipher_3des, mac_sha, kea_dhe_rsa}, | 290 cipher_3des, mac_sha, kea_dhe_rsa}, |
334 #if 0 | 291 #if 0 |
335 {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4_40, mac_md5, kea_dh_anon_export}, | 292 {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4_40, mac_md5, kea_dh_anon_export}, |
336 {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4, mac_md5, kea_dh_anon_export}, | |
337 {SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA, | 293 {SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA, |
338 cipher_des40, mac_sha, kea_dh_anon_export}, | 294 cipher_des40, mac_sha, kea_dh_anon_export}, |
339 {SSL_DH_ANON_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_anon}, | 295 {SSL_DH_ANON_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_anon}, |
340 {SSL_DH_ANON_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_anon}, | 296 {SSL_DH_ANON_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_anon}, |
341 #endif | 297 #endif |
342 | 298 |
343 | 299 |
344 /* New TLS cipher suites */ | 300 /* New TLS cipher suites */ |
345 {TLS_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_rsa}, | 301 {TLS_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_rsa}, |
346 {TLS_DHE_DSS_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dhe_dss}, | 302 {TLS_DHE_DSS_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dhe_dss}, |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 { | 526 { |
571 if ((sizeof *x) == sizeof(PRInt32)) { | 527 if ((sizeof *x) == sizeof(PRInt32)) { |
572 PR_ATOMIC_INCREMENT((PRInt32 *)x); | 528 PR_ATOMIC_INCREMENT((PRInt32 *)x); |
573 } else { | 529 } else { |
574 tooLong * tl = (tooLong *)x; | 530 tooLong * tl = (tooLong *)x; |
575 if (PR_ATOMIC_INCREMENT(&tl->low) == 0) | 531 if (PR_ATOMIC_INCREMENT(&tl->low) == 0) |
576 PR_ATOMIC_INCREMENT(&tl->high); | 532 PR_ATOMIC_INCREMENT(&tl->high); |
577 } | 533 } |
578 } | 534 } |
579 | 535 |
| 536 static PRBool |
| 537 ssl3_CipherSuiteAllowedForVersion(ssl3CipherSuite cipherSuite, |
| 538 SSL3ProtocolVersion version) |
| 539 { |
| 540 switch (cipherSuite) { |
| 541 /* See RFC 4346 A.5. Export cipher suites must not be used in TLS 1.1 or |
| 542 * later. This set of cipher suites is similar to, but different from, the |
| 543 * set of cipher suites considered exportable by SSL_IsExportCipherSuite. |
| 544 */ |
| 545 case SSL_RSA_EXPORT_WITH_RC4_40_MD5: |
| 546 case SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5: |
| 547 /* SSL_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented |
| 548 * SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA: never implemented |
| 549 * SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented |
| 550 * SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA: never implemented |
| 551 * SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented |
| 552 * SSL_DH_ANON_EXPORT_WITH_RC4_40_MD5: never implemented |
| 553 * SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA: never implemented |
| 554 */ |
| 555 return version <= SSL_LIBRARY_VERSION_TLS_1_0; |
| 556 default: |
| 557 return PR_TRUE; |
| 558 } |
| 559 } |
| 560 |
580 /* return pointer to ssl3CipherSuiteDef for suite, or NULL */ | 561 /* return pointer to ssl3CipherSuiteDef for suite, or NULL */ |
581 /* XXX This does a linear search. A binary search would be better. */ | 562 /* XXX This does a linear search. A binary search would be better. */ |
582 static const ssl3CipherSuiteDef * | 563 static const ssl3CipherSuiteDef * |
583 ssl_LookupCipherSuiteDef(ssl3CipherSuite suite) | 564 ssl_LookupCipherSuiteDef(ssl3CipherSuite suite) |
584 { | 565 { |
585 int cipher_suite_def_len = | 566 int cipher_suite_def_len = |
586 sizeof(cipher_suite_defs) / sizeof(cipher_suite_defs[0]); | 567 sizeof(cipher_suite_defs) / sizeof(cipher_suite_defs[0]); |
587 int i; | 568 int i; |
588 | 569 |
589 for (i = 0; i < cipher_suite_def_len; i++) { | 570 for (i = 0; i < cipher_suite_def_len; i++) { |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 | 894 |
914 switch (key->keyType) { | 895 switch (key->keyType) { |
915 case rsaKey: | 896 case rsaKey: |
916 hashItem.data = hash->md5; | 897 hashItem.data = hash->md5; |
917 hashItem.len = sizeof(SSL3Hashes); | 898 hashItem.len = sizeof(SSL3Hashes); |
918 break; | 899 break; |
919 case dsaKey: | 900 case dsaKey: |
920 hashItem.data = hash->sha; | 901 hashItem.data = hash->sha; |
921 hashItem.len = sizeof(hash->sha); | 902 hashItem.len = sizeof(hash->sha); |
922 /* Allow DER encoded DSA signatures in SSL 3.0 */ | 903 /* Allow DER encoded DSA signatures in SSL 3.0 */ |
923 » if (isTLS || buf->len != DSA1_SIGNATURE_LEN) { | 904 » if (isTLS || buf->len != SECKEY_SignatureLen(key)) { |
924 signature = DSAU_DecodeDerSig(buf); | 905 signature = DSAU_DecodeDerSig(buf); |
925 if (!signature) { | 906 if (!signature) { |
926 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | 907 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); |
927 return SECFailure; | 908 return SECFailure; |
928 } | 909 } |
929 buf = signature; | 910 buf = signature; |
930 } | 911 } |
931 break; | 912 break; |
932 | 913 |
933 #ifdef NSS_ENABLE_ECC | 914 #ifdef NSS_ENABLE_ECC |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 /* Called from ssl3_ComputeExportRSAKeyHash | 960 /* Called from ssl3_ComputeExportRSAKeyHash |
980 * ssl3_ComputeDHKeyHash | 961 * ssl3_ComputeDHKeyHash |
981 * which are called from ssl3_HandleServerKeyExchange. | 962 * which are called from ssl3_HandleServerKeyExchange. |
982 */ | 963 */ |
983 SECStatus | 964 SECStatus |
984 ssl3_ComputeCommonKeyHash(PRUint8 * hashBuf, unsigned int bufLen, | 965 ssl3_ComputeCommonKeyHash(PRUint8 * hashBuf, unsigned int bufLen, |
985 SSL3Hashes *hashes, PRBool bypassPKCS11) | 966 SSL3Hashes *hashes, PRBool bypassPKCS11) |
986 { | 967 { |
987 SECStatus rv = SECSuccess; | 968 SECStatus rv = SECSuccess; |
988 | 969 |
| 970 #ifndef NO_PKCS11_BYPASS |
989 if (bypassPKCS11) { | 971 if (bypassPKCS11) { |
990 MD5_HashBuf (hashes->md5, hashBuf, bufLen); | 972 MD5_HashBuf (hashes->md5, hashBuf, bufLen); |
991 SHA1_HashBuf(hashes->sha, hashBuf, bufLen); | 973 SHA1_HashBuf(hashes->sha, hashBuf, bufLen); |
992 } else { | 974 } else |
| 975 #endif |
| 976 { |
993 rv = PK11_HashBuf(SEC_OID_MD5, hashes->md5, hashBuf, bufLen); | 977 rv = PK11_HashBuf(SEC_OID_MD5, hashes->md5, hashBuf, bufLen); |
994 if (rv != SECSuccess) { | 978 if (rv != SECSuccess) { |
995 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 979 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
996 rv = SECFailure; | 980 rv = SECFailure; |
997 goto done; | 981 goto done; |
998 } | 982 } |
999 | 983 |
1000 rv = PK11_HashBuf(SEC_OID_SHA1, hashes->sha, hashBuf, bufLen); | 984 rv = PK11_HashBuf(SEC_OID_SHA1, hashes->sha, hashBuf, bufLen); |
1001 if (rv != SECSuccess) { | 985 if (rv != SECSuccess) { |
1002 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 986 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1403 #endif /* NSS_ENABLE_ZLIB */ | 1387 #endif /* NSS_ENABLE_ZLIB */ |
1404 default: | 1388 default: |
1405 PORT_Assert(0); | 1389 PORT_Assert(0); |
1406 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | 1390 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
1407 return SECFailure; | 1391 return SECFailure; |
1408 } | 1392 } |
1409 | 1393 |
1410 return SECSuccess; | 1394 return SECSuccess; |
1411 } | 1395 } |
1412 | 1396 |
| 1397 #ifndef NO_PKCS11_BYPASS |
1413 /* Initialize encryption and MAC contexts for pending spec. | 1398 /* Initialize encryption and MAC contexts for pending spec. |
1414 * Master Secret already is derived in spec->msItem | 1399 * Master Secret already is derived in spec->msItem |
1415 * Caller holds Spec write lock. | 1400 * Caller holds Spec write lock. |
1416 */ | 1401 */ |
1417 static SECStatus | 1402 static SECStatus |
1418 ssl3_InitPendingContextsBypass(sslSocket *ss) | 1403 ssl3_InitPendingContextsBypass(sslSocket *ss) |
1419 { | 1404 { |
1420 ssl3CipherSpec * pwSpec; | 1405 ssl3CipherSpec * pwSpec; |
1421 const ssl3BulkCipherDef *cipher_def; | 1406 const ssl3BulkCipherDef *cipher_def; |
1422 void * serverContext = NULL; | 1407 void * serverContext = NULL; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1569 pwSpec->decodeContext = (ss->sec.isServer) ? clientContext : serverContext; | 1554 pwSpec->decodeContext = (ss->sec.isServer) ? clientContext : serverContext; |
1570 | 1555 |
1571 ssl3_InitCompressionContext(pwSpec); | 1556 ssl3_InitCompressionContext(pwSpec); |
1572 | 1557 |
1573 success: | 1558 success: |
1574 return SECSuccess; | 1559 return SECSuccess; |
1575 | 1560 |
1576 bail_out: | 1561 bail_out: |
1577 return SECFailure; | 1562 return SECFailure; |
1578 } | 1563 } |
| 1564 #endif |
1579 | 1565 |
1580 /* This function should probably be moved to pk11wrap and be named | 1566 /* This function should probably be moved to pk11wrap and be named |
1581 * PK11_ParamFromIVAndEffectiveKeyBits | 1567 * PK11_ParamFromIVAndEffectiveKeyBits |
1582 */ | 1568 */ |
1583 static SECItem * | 1569 static SECItem * |
1584 ssl3_ParamFromIV(CK_MECHANISM_TYPE mtype, SECItem *iv, CK_ULONG ulEffectiveBits) | 1570 ssl3_ParamFromIV(CK_MECHANISM_TYPE mtype, SECItem *iv, CK_ULONG ulEffectiveBits) |
1585 { | 1571 { |
1586 SECItem * param = PK11_ParamFromIV(mtype, iv); | 1572 SECItem * param = PK11_ParamFromIV(mtype, iv); |
1587 if (param && param->data && param->len >= sizeof(CK_RC2_PARAMS)) { | 1573 if (param && param->data && param->len >= sizeof(CK_RC2_PARAMS)) { |
1588 switch (mtype) { | 1574 switch (mtype) { |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 | 1754 |
1769 pwSpec = ss->ssl3.pwSpec; | 1755 pwSpec = ss->ssl3.pwSpec; |
1770 cwSpec = ss->ssl3.cwSpec; | 1756 cwSpec = ss->ssl3.cwSpec; |
1771 | 1757 |
1772 if (pms || (!pwSpec->msItem.len && !pwSpec->master_secret)) { | 1758 if (pms || (!pwSpec->msItem.len && !pwSpec->master_secret)) { |
1773 rv = ssl3_DeriveMasterSecret(ss, pms); | 1759 rv = ssl3_DeriveMasterSecret(ss, pms); |
1774 if (rv != SECSuccess) { | 1760 if (rv != SECSuccess) { |
1775 goto done; /* err code set by ssl3_DeriveMasterSecret */ | 1761 goto done; /* err code set by ssl3_DeriveMasterSecret */ |
1776 } | 1762 } |
1777 } | 1763 } |
| 1764 #ifndef NO_PKCS11_BYPASS |
1778 if (ss->opt.bypassPKCS11 && pwSpec->msItem.len && pwSpec->msItem.data) { | 1765 if (ss->opt.bypassPKCS11 && pwSpec->msItem.len && pwSpec->msItem.data) { |
1779 /* Double Bypass succeeded in extracting the master_secret */ | 1766 /* Double Bypass succeeded in extracting the master_secret */ |
1780 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; | 1767 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; |
1781 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | 1768 PRBool isTLS = (PRBool)(kea_def->tls_keygen || |
1782 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | 1769 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); |
1783 pwSpec->bypassCiphers = PR_TRUE; | 1770 pwSpec->bypassCiphers = PR_TRUE; |
1784 rv = ssl3_KeyAndMacDeriveBypass( pwSpec, | 1771 rv = ssl3_KeyAndMacDeriveBypass( pwSpec, |
1785 (const unsigned char *)&ss->ssl3.hs.client_random, | 1772 (const unsigned char *)&ss->ssl3.hs.client_random, |
1786 (const unsigned char *)&ss->ssl3.hs.server_random, | 1773 (const unsigned char *)&ss->ssl3.hs.server_random, |
1787 isTLS, | 1774 isTLS, |
1788 (PRBool)(kea_def->is_limited)); | 1775 (PRBool)(kea_def->is_limited)); |
1789 if (rv == SECSuccess) { | 1776 if (rv == SECSuccess) { |
1790 rv = ssl3_InitPendingContextsBypass(ss); | 1777 rv = ssl3_InitPendingContextsBypass(ss); |
1791 } | 1778 } |
1792 } else if (pwSpec->master_secret) { | 1779 } else |
| 1780 #endif |
| 1781 if (pwSpec->master_secret) { |
1793 rv = ssl3_DeriveConnectionKeysPKCS11(ss); | 1782 rv = ssl3_DeriveConnectionKeysPKCS11(ss); |
1794 if (rv == SECSuccess) { | 1783 if (rv == SECSuccess) { |
1795 rv = ssl3_InitPendingContextsPKCS11(ss); | 1784 rv = ssl3_InitPendingContextsPKCS11(ss); |
1796 } | 1785 } |
1797 } else { | 1786 } else { |
1798 PORT_Assert(pwSpec->master_secret); | 1787 PORT_Assert(pwSpec->master_secret); |
1799 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | 1788 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
1800 rv = SECFailure; | 1789 rv = SECFailure; |
1801 } | 1790 } |
1802 if (rv != SECSuccess) { | 1791 if (rv != SECSuccess) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 SSL3ContentType type, | 1857 SSL3ContentType type, |
1869 SSL3ProtocolVersion version, | 1858 SSL3ProtocolVersion version, |
1870 SSL3SequenceNumber seq_num, | 1859 SSL3SequenceNumber seq_num, |
1871 const SSL3Opaque * input, | 1860 const SSL3Opaque * input, |
1872 int inputLength, | 1861 int inputLength, |
1873 unsigned char * outbuf, | 1862 unsigned char * outbuf, |
1874 unsigned int * outLength) | 1863 unsigned int * outLength) |
1875 { | 1864 { |
1876 const ssl3MACDef * mac_def; | 1865 const ssl3MACDef * mac_def; |
1877 SECStatus rv; | 1866 SECStatus rv; |
| 1867 #ifndef NO_PKCS11_BYPASS |
1878 PRBool isTLS; | 1868 PRBool isTLS; |
| 1869 #endif |
1879 unsigned int tempLen; | 1870 unsigned int tempLen; |
1880 unsigned char temp[MAX_MAC_LENGTH]; | 1871 unsigned char temp[MAX_MAC_LENGTH]; |
1881 | 1872 |
1882 temp[0] = (unsigned char)(seq_num.high >> 24); | 1873 temp[0] = (unsigned char)(seq_num.high >> 24); |
1883 temp[1] = (unsigned char)(seq_num.high >> 16); | 1874 temp[1] = (unsigned char)(seq_num.high >> 16); |
1884 temp[2] = (unsigned char)(seq_num.high >> 8); | 1875 temp[2] = (unsigned char)(seq_num.high >> 8); |
1885 temp[3] = (unsigned char)(seq_num.high >> 0); | 1876 temp[3] = (unsigned char)(seq_num.high >> 0); |
1886 temp[4] = (unsigned char)(seq_num.low >> 24); | 1877 temp[4] = (unsigned char)(seq_num.low >> 24); |
1887 temp[5] = (unsigned char)(seq_num.low >> 16); | 1878 temp[5] = (unsigned char)(seq_num.low >> 16); |
1888 temp[6] = (unsigned char)(seq_num.low >> 8); | 1879 temp[6] = (unsigned char)(seq_num.low >> 8); |
1889 temp[7] = (unsigned char)(seq_num.low >> 0); | 1880 temp[7] = (unsigned char)(seq_num.low >> 0); |
1890 temp[8] = type; | 1881 temp[8] = type; |
1891 | 1882 |
1892 /* TLS MAC includes the record's version field, SSL's doesn't. | 1883 /* TLS MAC includes the record's version field, SSL's doesn't. |
1893 ** We decide which MAC defintiion to use based on the version of | 1884 ** We decide which MAC defintiion to use based on the version of |
1894 ** the protocol that was negotiated when the spec became current, | 1885 ** the protocol that was negotiated when the spec became current, |
1895 ** NOT based on the version value in the record itself. | 1886 ** NOT based on the version value in the record itself. |
1896 ** But, we use the record'v version value in the computation. | 1887 ** But, we use the record'v version value in the computation. |
1897 */ | 1888 */ |
1898 if (spec->version <= SSL_LIBRARY_VERSION_3_0) { | 1889 if (spec->version <= SSL_LIBRARY_VERSION_3_0) { |
1899 temp[9] = MSB(inputLength); | 1890 temp[9] = MSB(inputLength); |
1900 temp[10] = LSB(inputLength); | 1891 temp[10] = LSB(inputLength); |
1901 tempLen = 11; | 1892 tempLen = 11; |
| 1893 #ifndef NO_PKCS11_BYPASS |
1902 isTLS = PR_FALSE; | 1894 isTLS = PR_FALSE; |
| 1895 #endif |
1903 } else { | 1896 } else { |
1904 /* New TLS hash includes version. */ | 1897 /* New TLS hash includes version. */ |
1905 if (isDTLS) { | 1898 if (isDTLS) { |
1906 SSL3ProtocolVersion dtls_version; | 1899 SSL3ProtocolVersion dtls_version; |
1907 | 1900 |
1908 dtls_version = dtls_TLSVersionToDTLSVersion(version); | 1901 dtls_version = dtls_TLSVersionToDTLSVersion(version); |
1909 temp[9] = MSB(dtls_version); | 1902 temp[9] = MSB(dtls_version); |
1910 temp[10] = LSB(dtls_version); | 1903 temp[10] = LSB(dtls_version); |
1911 } else { | 1904 } else { |
1912 temp[9] = MSB(version); | 1905 temp[9] = MSB(version); |
1913 temp[10] = LSB(version); | 1906 temp[10] = LSB(version); |
1914 } | 1907 } |
1915 temp[11] = MSB(inputLength); | 1908 temp[11] = MSB(inputLength); |
1916 temp[12] = LSB(inputLength); | 1909 temp[12] = LSB(inputLength); |
1917 tempLen = 13; | 1910 tempLen = 13; |
| 1911 #ifndef NO_PKCS11_BYPASS |
1918 isTLS = PR_TRUE; | 1912 isTLS = PR_TRUE; |
| 1913 #endif |
1919 } | 1914 } |
1920 | 1915 |
1921 PRINT_BUF(95, (NULL, "frag hash1: temp", temp, tempLen)); | 1916 PRINT_BUF(95, (NULL, "frag hash1: temp", temp, tempLen)); |
1922 PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength)); | 1917 PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength)); |
1923 | 1918 |
1924 mac_def = spec->mac_def; | 1919 mac_def = spec->mac_def; |
1925 if (mac_def->mac == mac_null) { | 1920 if (mac_def->mac == mac_null) { |
1926 *outLength = 0; | 1921 *outLength = 0; |
1927 return SECSuccess; | 1922 return SECSuccess; |
1928 } | 1923 } |
1929 if (! spec->bypassCiphers) { | 1924 #ifndef NO_PKCS11_BYPASS |
1930 » PK11Context *mac_context = | 1925 if (spec->bypassCiphers) { |
1931 » (useServerMacKey ? spec->server.write_mac_context | |
1932 » : spec->client.write_mac_context); | |
1933 » rv = PK11_DigestBegin(mac_context); | |
1934 » rv |= PK11_DigestOp(mac_context, temp, tempLen); | |
1935 » rv |= PK11_DigestOp(mac_context, input, inputLength); | |
1936 » rv |= PK11_DigestFinal(mac_context, outbuf, outLength, spec->mac_size); | |
1937 } else { | |
1938 /* bypass version */ | 1926 /* bypass version */ |
1939 const SECHashObject *hashObj = NULL; | 1927 const SECHashObject *hashObj = NULL; |
1940 unsigned int pad_bytes = 0; | 1928 unsigned int pad_bytes = 0; |
1941 PRUint64 write_mac_context[MAX_MAC_CONTEXT_LLONGS]; | 1929 PRUint64 write_mac_context[MAX_MAC_CONTEXT_LLONGS]; |
1942 | 1930 |
1943 switch (mac_def->mac) { | 1931 switch (mac_def->mac) { |
1944 case ssl_mac_null: | 1932 case ssl_mac_null: |
1945 *outLength = 0; | 1933 *outLength = 0; |
1946 return SECSuccess; | 1934 return SECSuccess; |
1947 case ssl_mac_md5: | 1935 case ssl_mac_md5: |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2010 } | 1998 } |
2011 if (rv == SECSuccess) { | 1999 if (rv == SECSuccess) { |
2012 HMAC_Begin(cx); | 2000 HMAC_Begin(cx); |
2013 HMAC_Update(cx, temp, tempLen); | 2001 HMAC_Update(cx, temp, tempLen); |
2014 HMAC_Update(cx, input, inputLength); | 2002 HMAC_Update(cx, input, inputLength); |
2015 rv = HMAC_Finish(cx, outbuf, outLength, spec->mac_size); | 2003 rv = HMAC_Finish(cx, outbuf, outLength, spec->mac_size); |
2016 HMAC_Destroy(cx, PR_FALSE); | 2004 HMAC_Destroy(cx, PR_FALSE); |
2017 } | 2005 } |
2018 #undef cx | 2006 #undef cx |
2019 } | 2007 } |
| 2008 } else |
| 2009 #endif |
| 2010 { |
| 2011 PK11Context *mac_context = |
| 2012 (useServerMacKey ? spec->server.write_mac_context |
| 2013 : spec->client.write_mac_context); |
| 2014 rv = PK11_DigestBegin(mac_context); |
| 2015 rv |= PK11_DigestOp(mac_context, temp, tempLen); |
| 2016 rv |= PK11_DigestOp(mac_context, input, inputLength); |
| 2017 rv |= PK11_DigestFinal(mac_context, outbuf, outLength, spec->mac_size); |
2020 } | 2018 } |
2021 | 2019 |
2022 PORT_Assert(rv != SECSuccess || *outLength == (unsigned)spec->mac_size); | 2020 PORT_Assert(rv != SECSuccess || *outLength == (unsigned)spec->mac_size); |
2023 | 2021 |
2024 PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength)); | 2022 PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength)); |
2025 | 2023 |
2026 if (rv != SECSuccess) { | 2024 if (rv != SECSuccess) { |
2027 rv = SECFailure; | 2025 rv = SECFailure; |
2028 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); | 2026 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); |
2029 } | 2027 } |
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2795 default: desc = bad_certificate; break; | 2793 default: desc = bad_certificate; break; |
2796 } | 2794 } |
2797 SSL_DBG(("%d: SSL3[%d]: peer certificate is no good: error=%d", | 2795 SSL_DBG(("%d: SSL3[%d]: peer certificate is no good: error=%d", |
2798 SSL_GETPID(), ss->fd, errCode)); | 2796 SSL_GETPID(), ss->fd, errCode)); |
2799 | 2797 |
2800 (void) SSL3_SendAlert(ss, alert_fatal, desc); | 2798 (void) SSL3_SendAlert(ss, alert_fatal, desc); |
2801 } | 2799 } |
2802 | 2800 |
2803 | 2801 |
2804 /* | 2802 /* |
2805 * Send handshake_Failure alert. Set generic error number. | 2803 * Send decode_error alert. Set generic error number. |
2806 */ | 2804 */ |
2807 SECStatus | 2805 SECStatus |
2808 ssl3_DecodeError(sslSocket *ss) | 2806 ssl3_DecodeError(sslSocket *ss) |
2809 { | 2807 { |
2810 (void)SSL3_SendAlert(ss, alert_fatal, | 2808 (void)SSL3_SendAlert(ss, alert_fatal, |
2811 ss->version > SSL_LIBRARY_VERSION_3_0 ? decode_error | 2809 ss->version > SSL_LIBRARY_VERSION_3_0 ? decode_error |
2812 : illegal_parameter); | 2810 : illegal_parameter); |
2813 PORT_SetError( ss->sec.isServer ? SSL_ERROR_BAD_CLIENT | 2811 PORT_SetError( ss->sec.isServer ? SSL_ERROR_BAD_CLIENT |
2814 : SSL_ERROR_BAD_SERVER ); | 2812 : SSL_ERROR_BAD_SERVER ); |
2815 return SECFailure; | 2813 return SECFailure; |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3166 } | 3164 } |
3167 } | 3165 } |
3168 if (fpms) { | 3166 if (fpms) { |
3169 PK11_FreeSymKey(fpms); | 3167 PK11_FreeSymKey(fpms); |
3170 } | 3168 } |
3171 } | 3169 } |
3172 if (pwSpec->master_secret == NULL) { | 3170 if (pwSpec->master_secret == NULL) { |
3173 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | 3171 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); |
3174 return rv; | 3172 return rv; |
3175 } | 3173 } |
| 3174 #ifndef NO_PKCS11_BYPASS |
3176 if (ss->opt.bypassPKCS11) { | 3175 if (ss->opt.bypassPKCS11) { |
3177 SECItem * keydata; | 3176 SECItem * keydata; |
3178 /* In hope of doing a "double bypass", | 3177 /* In hope of doing a "double bypass", |
3179 * need to extract the master secret's value from the key object | 3178 * need to extract the master secret's value from the key object |
3180 * and store it raw in the sslSocket struct. | 3179 * and store it raw in the sslSocket struct. |
3181 */ | 3180 */ |
3182 rv = PK11_ExtractKeyValue(pwSpec->master_secret); | 3181 rv = PK11_ExtractKeyValue(pwSpec->master_secret); |
3183 if (rv != SECSuccess) { | 3182 if (rv != SECSuccess) { |
3184 #if defined(NSS_SURVIVE_DOUBLE_BYPASS_FAILURE) | 3183 #if defined(NSS_SURVIVE_DOUBLE_BYPASS_FAILURE) |
3185 /* The double bypass failed. | 3184 /* The double bypass failed. |
(...skipping 15 matching lines...) Expand all Loading... |
3201 keydata = PK11_GetKeyData(pwSpec->master_secret); | 3200 keydata = PK11_GetKeyData(pwSpec->master_secret); |
3202 if (keydata && keydata->len <= sizeof pwSpec->raw_master_secret) { | 3201 if (keydata && keydata->len <= sizeof pwSpec->raw_master_secret) { |
3203 memcpy(pwSpec->raw_master_secret, keydata->data, keydata->len); | 3202 memcpy(pwSpec->raw_master_secret, keydata->data, keydata->len); |
3204 pwSpec->msItem.data = pwSpec->raw_master_secret; | 3203 pwSpec->msItem.data = pwSpec->raw_master_secret; |
3205 pwSpec->msItem.len = keydata->len; | 3204 pwSpec->msItem.len = keydata->len; |
3206 } else { | 3205 } else { |
3207 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | 3206 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
3208 return SECFailure; | 3207 return SECFailure; |
3209 } | 3208 } |
3210 } | 3209 } |
| 3210 #endif |
3211 return SECSuccess; | 3211 return SECSuccess; |
3212 } | 3212 } |
3213 | 3213 |
3214 | 3214 |
3215 /* | 3215 /* |
3216 * Derive encryption and MAC Keys (and IVs) from master secret | 3216 * Derive encryption and MAC Keys (and IVs) from master secret |
3217 * Sets a useful error code when returning SECFailure. | 3217 * Sets a useful error code when returning SECFailure. |
3218 * | 3218 * |
3219 * Called only from ssl3_InitPendingCipherSpec(), | 3219 * Called only from ssl3_InitPendingCipherSpec(), |
3220 * which in turn is called from | 3220 * which in turn is called from |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3348 if (symKey) PK11_FreeSymKey(symKey); | 3348 if (symKey) PK11_FreeSymKey(symKey); |
3349 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | 3349 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); |
3350 return SECFailure; | 3350 return SECFailure; |
3351 } | 3351 } |
3352 | 3352 |
3353 static SECStatus | 3353 static SECStatus |
3354 ssl3_RestartHandshakeHashes(sslSocket *ss) | 3354 ssl3_RestartHandshakeHashes(sslSocket *ss) |
3355 { | 3355 { |
3356 SECStatus rv = SECSuccess; | 3356 SECStatus rv = SECSuccess; |
3357 | 3357 |
| 3358 #ifndef NO_PKCS11_BYPASS |
3358 if (ss->opt.bypassPKCS11) { | 3359 if (ss->opt.bypassPKCS11) { |
3359 ss->ssl3.hs.messages.len = 0; | 3360 ss->ssl3.hs.messages.len = 0; |
3360 MD5_Begin((MD5Context *)ss->ssl3.hs.md5_cx); | 3361 MD5_Begin((MD5Context *)ss->ssl3.hs.md5_cx); |
3361 SHA1_Begin((SHA1Context *)ss->ssl3.hs.sha_cx); | 3362 SHA1_Begin((SHA1Context *)ss->ssl3.hs.sha_cx); |
3362 } else { | 3363 } else |
| 3364 #endif |
| 3365 { |
3363 rv = PK11_DigestBegin(ss->ssl3.hs.md5); | 3366 rv = PK11_DigestBegin(ss->ssl3.hs.md5); |
3364 if (rv != SECSuccess) { | 3367 if (rv != SECSuccess) { |
3365 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 3368 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
3366 return rv; | 3369 return rv; |
3367 } | 3370 } |
3368 rv = PK11_DigestBegin(ss->ssl3.hs.sha); | 3371 rv = PK11_DigestBegin(ss->ssl3.hs.sha); |
3369 if (rv != SECSuccess) { | 3372 if (rv != SECSuccess) { |
3370 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 3373 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
3371 return rv; | 3374 return rv; |
3372 } | 3375 } |
3373 } | 3376 } |
3374 return rv; | 3377 return rv; |
3375 } | 3378 } |
3376 | 3379 |
3377 static SECStatus | 3380 static SECStatus |
3378 ssl3_NewHandshakeHashes(sslSocket *ss) | 3381 ssl3_NewHandshakeHashes(sslSocket *ss) |
3379 { | 3382 { |
3380 PK11Context *md5 = NULL; | 3383 PK11Context *md5 = NULL; |
3381 PK11Context *sha = NULL; | 3384 PK11Context *sha = NULL; |
3382 | 3385 |
3383 /* | 3386 /* |
3384 * note: We should probably lookup an SSL3 slot for these | 3387 * note: We should probably lookup an SSL3 slot for these |
3385 * handshake hashes in hopes that we wind up with the same slots | 3388 * handshake hashes in hopes that we wind up with the same slots |
3386 * that the master secret will wind up in ... | 3389 * that the master secret will wind up in ... |
3387 */ | 3390 */ |
3388 SSL_TRC(30,("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd)); | 3391 SSL_TRC(30,("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd)); |
| 3392 #ifndef NO_PKCS11_BYPASS |
3389 if (ss->opt.bypassPKCS11) { | 3393 if (ss->opt.bypassPKCS11) { |
3390 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); | 3394 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); |
3391 ss->ssl3.hs.messages.buf = NULL; | 3395 ss->ssl3.hs.messages.buf = NULL; |
3392 ss->ssl3.hs.messages.space = 0; | 3396 ss->ssl3.hs.messages.space = 0; |
3393 } else { | 3397 } else |
| 3398 #endif |
| 3399 { |
3394 ss->ssl3.hs.md5 = md5 = PK11_CreateDigestContext(SEC_OID_MD5); | 3400 ss->ssl3.hs.md5 = md5 = PK11_CreateDigestContext(SEC_OID_MD5); |
3395 ss->ssl3.hs.sha = sha = PK11_CreateDigestContext(SEC_OID_SHA1); | 3401 ss->ssl3.hs.sha = sha = PK11_CreateDigestContext(SEC_OID_SHA1); |
3396 if (md5 == NULL) { | 3402 if (md5 == NULL) { |
3397 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 3403 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
3398 goto loser; | 3404 goto loser; |
3399 } | 3405 } |
3400 if (sha == NULL) { | 3406 if (sha == NULL) { |
3401 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 3407 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
3402 goto loser; | 3408 goto loser; |
3403 } | 3409 } |
(...skipping 27 matching lines...) Expand all Loading... |
3431 static SECStatus | 3437 static SECStatus |
3432 ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b, | 3438 ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b, |
3433 unsigned int l) | 3439 unsigned int l) |
3434 { | 3440 { |
3435 SECStatus rv = SECSuccess; | 3441 SECStatus rv = SECSuccess; |
3436 | 3442 |
3437 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 3443 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
3438 | 3444 |
3439 PRINT_BUF(90, (NULL, "MD5 & SHA handshake hash input:", b, l)); | 3445 PRINT_BUF(90, (NULL, "MD5 & SHA handshake hash input:", b, l)); |
3440 | 3446 |
| 3447 #ifndef NO_PKCS11_BYPASS |
3441 if (ss->opt.bypassPKCS11) { | 3448 if (ss->opt.bypassPKCS11) { |
3442 MD5_Update((MD5Context *)ss->ssl3.hs.md5_cx, b, l); | 3449 MD5_Update((MD5Context *)ss->ssl3.hs.md5_cx, b, l); |
3443 SHA1_Update((SHA1Context *)ss->ssl3.hs.sha_cx, b, l); | 3450 SHA1_Update((SHA1Context *)ss->ssl3.hs.sha_cx, b, l); |
3444 #if defined(NSS_SURVIVE_DOUBLE_BYPASS_FAILURE) | 3451 #if defined(NSS_SURVIVE_DOUBLE_BYPASS_FAILURE) |
3445 rv = sslBuffer_Append(&ss->ssl3.hs.messages, b, l); | 3452 rv = sslBuffer_Append(&ss->ssl3.hs.messages, b, l); |
3446 #endif | 3453 #endif |
3447 return rv; | 3454 return rv; |
3448 } | 3455 } |
| 3456 #endif |
3449 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); | 3457 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); |
3450 if (rv != SECSuccess) { | 3458 if (rv != SECSuccess) { |
3451 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 3459 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
3452 return rv; | 3460 return rv; |
3453 } | 3461 } |
3454 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); | 3462 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); |
3455 if (rv != SECSuccess) { | 3463 if (rv != SECSuccess) { |
3456 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 3464 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
3457 return rv; | 3465 return rv; |
3458 } | 3466 } |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3732 PRUint32 sender) | 3740 PRUint32 sender) |
3733 { | 3741 { |
3734 SECStatus rv = SECSuccess; | 3742 SECStatus rv = SECSuccess; |
3735 PRBool isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); | 3743 PRBool isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); |
3736 unsigned int outLength; | 3744 unsigned int outLength; |
3737 SSL3Opaque md5_inner[MAX_MAC_LENGTH]; | 3745 SSL3Opaque md5_inner[MAX_MAC_LENGTH]; |
3738 SSL3Opaque sha_inner[MAX_MAC_LENGTH]; | 3746 SSL3Opaque sha_inner[MAX_MAC_LENGTH]; |
3739 | 3747 |
3740 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 3748 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
3741 | 3749 |
| 3750 #ifndef NO_PKCS11_BYPASS |
3742 if (ss->opt.bypassPKCS11) { | 3751 if (ss->opt.bypassPKCS11) { |
3743 /* compute them without PKCS11 */ | 3752 /* compute them without PKCS11 */ |
3744 PRUint64 md5_cx[MAX_MAC_CONTEXT_LLONGS]; | 3753 PRUint64 md5_cx[MAX_MAC_CONTEXT_LLONGS]; |
3745 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; | 3754 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; |
3746 | 3755 |
3747 #define md5cx ((MD5Context *)md5_cx) | 3756 #define md5cx ((MD5Context *)md5_cx) |
3748 #define shacx ((SHA1Context *)sha_cx) | 3757 #define shacx ((SHA1Context *)sha_cx) |
3749 | 3758 |
3750 if (!spec->msItem.data) { | 3759 if (!spec->msItem.data) { |
3751 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); | 3760 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3814 SHA1_Update(shacx, mac_pad_2, mac_defs[mac_sha].pad_size); | 3823 SHA1_Update(shacx, mac_pad_2, mac_defs[mac_sha].pad_size); |
3815 SHA1_Update(shacx, sha_inner, SHA1_LENGTH); | 3824 SHA1_Update(shacx, sha_inner, SHA1_LENGTH); |
3816 } | 3825 } |
3817 SHA1_End(shacx, hashes->sha, &outLength, SHA1_LENGTH); | 3826 SHA1_End(shacx, hashes->sha, &outLength, SHA1_LENGTH); |
3818 | 3827 |
3819 PRINT_BUF(60, (NULL, "SHA outer: result", hashes->sha, SHA1_LENGTH)); | 3828 PRINT_BUF(60, (NULL, "SHA outer: result", hashes->sha, SHA1_LENGTH)); |
3820 | 3829 |
3821 rv = SECSuccess; | 3830 rv = SECSuccess; |
3822 #undef md5cx | 3831 #undef md5cx |
3823 #undef shacx | 3832 #undef shacx |
3824 } else { | 3833 } else |
| 3834 #endif |
| 3835 { |
3825 /* compute hases with PKCS11 */ | 3836 /* compute hases with PKCS11 */ |
3826 PK11Context * md5; | 3837 PK11Context * md5; |
3827 PK11Context * sha = NULL; | 3838 PK11Context * sha = NULL; |
3828 unsigned char *md5StateBuf = NULL; | 3839 unsigned char *md5StateBuf = NULL; |
3829 unsigned char *shaStateBuf = NULL; | 3840 unsigned char *shaStateBuf = NULL; |
3830 unsigned int md5StateLen, shaStateLen; | 3841 unsigned int md5StateLen, shaStateLen; |
3831 unsigned char md5StackBuf[256]; | 3842 unsigned char md5StackBuf[256]; |
3832 unsigned char shaStackBuf[512]; | 3843 unsigned char shaStackBuf[512]; |
3833 | 3844 |
3834 if (!spec->master_secret) { | 3845 if (!spec->master_secret) { |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4287 if (IS_DTLS(ss)) { | 4298 if (IS_DTLS(ss)) { |
4288 length += 1 + ss->ssl3.hs.cookieLen; | 4299 length += 1 + ss->ssl3.hs.cookieLen; |
4289 } | 4300 } |
4290 | 4301 |
4291 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); | 4302 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); |
4292 if (rv != SECSuccess) { | 4303 if (rv != SECSuccess) { |
4293 return rv; /* err set by ssl3_AppendHandshake* */ | 4304 return rv; /* err set by ssl3_AppendHandshake* */ |
4294 } | 4305 } |
4295 | 4306 |
4296 if (ss->firstHsDone) { | 4307 if (ss->firstHsDone) { |
4297 » /* Work around the Windows SChannel bug described above. */ | 4308 » /* The client hello version must stay unchanged to work around |
| 4309 » * the Windows SChannel bug described above. */ |
4298 PORT_Assert(ss->version == ss->clientHelloVersion); | 4310 PORT_Assert(ss->version == ss->clientHelloVersion); |
4299 } | 4311 } |
4300 ss->clientHelloVersion = ss->version; | 4312 ss->clientHelloVersion = ss->version; |
4301 if (IS_DTLS(ss)) { | 4313 if (IS_DTLS(ss)) { |
4302 PRUint16 version; | 4314 PRUint16 version; |
4303 | 4315 |
4304 version = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); | 4316 version = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); |
4305 rv = ssl3_AppendHandshakeNumber(ss, version, 2); | 4317 rv = ssl3_AppendHandshakeNumber(ss, version, 2); |
4306 } else { | 4318 } else { |
4307 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); | 4319 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4903 } | 4915 } |
4904 | 4916 |
4905 loser: | 4917 loser: |
4906 done: | 4918 done: |
4907 PZ_Unlock(symWrapKeysLock); | 4919 PZ_Unlock(symWrapKeysLock); |
4908 return unwrappedWrappingKey; | 4920 return unwrappedWrappingKey; |
4909 } | 4921 } |
4910 | 4922 |
4911 /* hexEncode hex encodes |length| bytes from |in| and writes it as |length*2| | 4923 /* hexEncode hex encodes |length| bytes from |in| and writes it as |length*2| |
4912 * bytes to |out|. */ | 4924 * bytes to |out|. */ |
4913 static void hexEncode(char *out, const unsigned char *in, size_t length) { | 4925 static void |
| 4926 hexEncode(char *out, const unsigned char *in, unsigned int length) |
| 4927 { |
4914 static const char hextable[] = "0123456789abcdef"; | 4928 static const char hextable[] = "0123456789abcdef"; |
4915 size_t i; | 4929 unsigned int i; |
4916 | 4930 |
4917 for (i = 0; i < length; i++) { | 4931 for (i = 0; i < length; i++) { |
4918 *(out++) = hextable[in[i] >> 4]; | 4932 *(out++) = hextable[in[i] >> 4]; |
4919 *(out++) = hextable[in[i] & 15]; | 4933 *(out++) = hextable[in[i] & 15]; |
4920 } | 4934 } |
4921 } | 4935 } |
4922 | 4936 |
4923 /* Called from ssl3_SendClientKeyExchange(). */ | 4937 /* Called from ssl3_SendClientKeyExchange(). */ |
4924 /* Presently, this always uses PKCS11. There is no bypass for this. */ | 4938 /* Presently, this always uses PKCS11. There is no bypass for this. */ |
4925 static SECStatus | 4939 static SECStatus |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5375 } | 5389 } |
5376 | 5390 |
5377 /* find selected cipher suite in our list. */ | 5391 /* find selected cipher suite in our list. */ |
5378 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); | 5392 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); |
5379 if (temp < 0) { | 5393 if (temp < 0) { |
5380 goto loser; /* alert has been sent */ | 5394 goto loser; /* alert has been sent */ |
5381 } | 5395 } |
5382 ssl3_config_match_init(ss); | 5396 ssl3_config_match_init(ss); |
5383 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | 5397 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { |
5384 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; | 5398 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; |
5385 » if ((temp == suite->cipher_suite) && | 5399 » if (temp == suite->cipher_suite) { |
5386 » (config_match(suite, ss->ssl3.policy, PR_TRUE))) { | 5400 » if (!config_match(suite, ss->ssl3.policy, PR_TRUE)) { |
| 5401 » » break;» /* failure */ |
| 5402 » } |
| 5403 » if (!ssl3_CipherSuiteAllowedForVersion(suite->cipher_suite, |
| 5404 » » » » » » ss->version)) { |
| 5405 » » desc = handshake_failure; |
| 5406 » » errCode = SSL_ERROR_CIPHER_DISALLOWED_FOR_VERSION; |
| 5407 » » goto alert_loser; |
| 5408 » } |
| 5409 » |
5387 suite_found = PR_TRUE; | 5410 suite_found = PR_TRUE; |
5388 break; /* success */ | 5411 break; /* success */ |
5389 } | 5412 } |
5390 } | 5413 } |
5391 if (!suite_found) { | 5414 if (!suite_found) { |
5392 desc = handshake_failure; | 5415 desc = handshake_failure; |
5393 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | 5416 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; |
5394 goto alert_loser; | 5417 goto alert_loser; |
5395 } | 5418 } |
5396 ss->ssl3.hs.cipher_suite = (ssl3CipherSuite)temp; | 5419 ss->ssl3.hs.cipher_suite = (ssl3CipherSuite)temp; |
5397 ss->ssl3.hs.suite_def = ssl_LookupCipherSuiteDef((ssl3CipherSuite)temp); | 5420 ss->ssl3.hs.suite_def = ssl_LookupCipherSuiteDef((ssl3CipherSuite)temp); |
5398 PORT_Assert(ss->ssl3.hs.suite_def); | 5421 PORT_Assert(ss->ssl3.hs.suite_def); |
5399 if (!ss->ssl3.hs.suite_def) { | 5422 if (!ss->ssl3.hs.suite_def) { |
5400 PORT_SetError(errCode = SEC_ERROR_LIBRARY_FAILURE); | 5423 PORT_SetError(errCode = SEC_ERROR_LIBRARY_FAILURE); |
5401 goto loser; /* we don't send alerts for our screw-ups. */ | 5424 goto loser; /* we don't send alerts for our screw-ups. */ |
5402 } | 5425 } |
5403 | 5426 |
5404 /* find selected compression method in our list. */ | 5427 /* find selected compression method in our list. */ |
5405 temp = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length); | 5428 temp = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length); |
5406 if (temp < 0) { | 5429 if (temp < 0) { |
5407 goto loser; /* alert has been sent */ | 5430 goto loser; /* alert has been sent */ |
5408 } | 5431 } |
5409 suite_found = PR_FALSE; | 5432 suite_found = PR_FALSE; |
5410 for (i = 0; i < compressionMethodsCount; i++) { | 5433 for (i = 0; i < compressionMethodsCount; i++) { |
5411 » if (temp == compressions[i] && | 5434 » if (temp == compressions[i]) { |
5412 » compressionEnabled(ss, compressions[i])) { | 5435 » if (!compressionEnabled(ss, compressions[i])) { |
| 5436 » » break;» /* failure */ |
| 5437 » } |
5413 suite_found = PR_TRUE; | 5438 suite_found = PR_TRUE; |
5414 break; /* success */ | 5439 break; /* success */ |
5415 } | 5440 } |
5416 } | 5441 } |
5417 if (!suite_found) { | 5442 if (!suite_found) { |
5418 desc = handshake_failure; | 5443 desc = handshake_failure; |
5419 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; | 5444 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; |
5420 goto alert_loser; | 5445 goto alert_loser; |
5421 } | 5446 } |
5422 ss->ssl3.hs.compression = (SSLCompressionMethod)temp; | 5447 ss->ssl3.hs.compression = (SSLCompressionMethod)temp; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5487 /* 3 cases here: | 5512 /* 3 cases here: |
5488 * a) key is wrapped (implies using PKCS11) | 5513 * a) key is wrapped (implies using PKCS11) |
5489 * b) key is unwrapped, but we're still using PKCS11 | 5514 * b) key is unwrapped, but we're still using PKCS11 |
5490 * c) key is unwrapped, and we're bypassing PKCS11. | 5515 * c) key is unwrapped, and we're bypassing PKCS11. |
5491 */ | 5516 */ |
5492 if (sid->u.ssl3.keys.msIsWrapped) { | 5517 if (sid->u.ssl3.keys.msIsWrapped) { |
5493 PK11SlotInfo *slot; | 5518 PK11SlotInfo *slot; |
5494 PK11SymKey * wrapKey; /* wrapping key */ | 5519 PK11SymKey * wrapKey; /* wrapping key */ |
5495 CK_FLAGS keyFlags = 0; | 5520 CK_FLAGS keyFlags = 0; |
5496 | 5521 |
| 5522 #ifndef NO_PKCS11_BYPASS |
5497 if (ss->opt.bypassPKCS11) { | 5523 if (ss->opt.bypassPKCS11) { |
5498 /* we cannot restart a non-bypass session in a | 5524 /* we cannot restart a non-bypass session in a |
5499 ** bypass socket. | 5525 ** bypass socket. |
5500 */ | 5526 */ |
5501 break; | 5527 break; |
5502 } | 5528 } |
| 5529 #endif |
5503 /* unwrap master secret with PKCS11 */ | 5530 /* unwrap master secret with PKCS11 */ |
5504 slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID, | 5531 slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID, |
5505 sid->u.ssl3.masterSlotID); | 5532 sid->u.ssl3.masterSlotID); |
5506 if (slot == NULL) { | 5533 if (slot == NULL) { |
5507 break; /* not considered an error. */ | 5534 break; /* not considered an error. */ |
5508 } | 5535 } |
5509 if (!PK11_IsPresent(slot)) { | 5536 if (!PK11_IsPresent(slot)) { |
5510 PK11_FreeSlot(slot); | 5537 PK11_FreeSlot(slot); |
5511 break; /* not considered an error. */ | 5538 break; /* not considered an error. */ |
5512 } | 5539 } |
(...skipping 14 matching lines...) Expand all Loading... |
5527 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | 5554 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; |
5528 pwSpec->master_secret = | 5555 pwSpec->master_secret = |
5529 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, | 5556 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, |
5530 NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE, | 5557 NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE, |
5531 CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags); | 5558 CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags); |
5532 errCode = PORT_GetError(); | 5559 errCode = PORT_GetError(); |
5533 PK11_FreeSymKey(wrapKey); | 5560 PK11_FreeSymKey(wrapKey); |
5534 if (pwSpec->master_secret == NULL) { | 5561 if (pwSpec->master_secret == NULL) { |
5535 break; /* errorCode set just after call to UnwrapSymKey. */ | 5562 break; /* errorCode set just after call to UnwrapSymKey. */ |
5536 } | 5563 } |
| 5564 #ifndef NO_PKCS11_BYPASS |
5537 } else if (ss->opt.bypassPKCS11) { | 5565 } else if (ss->opt.bypassPKCS11) { |
5538 /* MS is not wrapped */ | 5566 /* MS is not wrapped */ |
5539 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | 5567 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; |
5540 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | 5568 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; |
5541 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len); | 5569 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len); |
5542 pwSpec->msItem.data = pwSpec->raw_master_secret; | 5570 pwSpec->msItem.data = pwSpec->raw_master_secret; |
5543 pwSpec->msItem.len = wrappedMS.len; | 5571 pwSpec->msItem.len = wrappedMS.len; |
| 5572 #endif |
5544 } else { | 5573 } else { |
5545 /* We CAN restart a bypass session in a non-bypass socket. */ | 5574 /* We CAN restart a bypass session in a non-bypass socket. */ |
5546 /* need to import the raw master secret to session object */ | 5575 /* need to import the raw master secret to session object */ |
5547 PK11SlotInfo *slot = PK11_GetInternalSlot(); | 5576 PK11SlotInfo *slot = PK11_GetInternalSlot(); |
5548 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | 5577 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; |
5549 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | 5578 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; |
5550 pwSpec->master_secret = | 5579 pwSpec->master_secret = |
5551 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, | 5580 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, |
5552 PK11_OriginUnwrap, CKA_ENCRYPT, | 5581 PK11_OriginUnwrap, CKA_ENCRYPT, |
5553 &wrappedMS, NULL); | 5582 &wrappedMS, NULL); |
(...skipping 17 matching lines...) Expand all Loading... |
5571 ss->ssl3.hs.ws = wait_change_cipher; | 5600 ss->ssl3.hs.ws = wait_change_cipher; |
5572 | 5601 |
5573 ss->ssl3.hs.isResuming = PR_TRUE; | 5602 ss->ssl3.hs.isResuming = PR_TRUE; |
5574 | 5603 |
5575 /* copy the peer cert from the SID */ | 5604 /* copy the peer cert from the SID */ |
5576 if (sid->peerCert != NULL) { | 5605 if (sid->peerCert != NULL) { |
5577 ss->sec.peerCert = CERT_DupCertificate(sid->peerCert); | 5606 ss->sec.peerCert = CERT_DupCertificate(sid->peerCert); |
5578 ssl3_CopyPeerCertsFromSID(ss, sid); | 5607 ssl3_CopyPeerCertsFromSID(ss, sid); |
5579 } | 5608 } |
5580 | 5609 |
| 5610 |
5581 /* NULL value for PMS signifies re-use of the old MS */ | 5611 /* NULL value for PMS signifies re-use of the old MS */ |
5582 rv = ssl3_InitPendingCipherSpec(ss, NULL); | 5612 rv = ssl3_InitPendingCipherSpec(ss, NULL); |
5583 if (rv != SECSuccess) { | 5613 if (rv != SECSuccess) { |
5584 goto alert_loser; /* err code was set */ | 5614 goto alert_loser; /* err code was set */ |
5585 } | 5615 } |
5586 goto winner; | 5616 goto winner; |
5587 } while (0); | 5617 } while (0); |
5588 | 5618 |
5589 if (sid_match) | 5619 if (sid_match) |
5590 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_not_ok ); | 5620 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_not_ok ); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5633 return SECSuccess; | 5663 return SECSuccess; |
5634 | 5664 |
5635 alert_loser: | 5665 alert_loser: |
5636 (void)SSL3_SendAlert(ss, alert_fatal, desc); | 5666 (void)SSL3_SendAlert(ss, alert_fatal, desc); |
5637 | 5667 |
5638 loser: | 5668 loser: |
5639 errCode = ssl_MapLowLevelError(errCode); | 5669 errCode = ssl_MapLowLevelError(errCode); |
5640 return SECFailure; | 5670 return SECFailure; |
5641 } | 5671 } |
5642 | 5672 |
5643 /* ssl3_BigIntGreaterThan1 returns true iff |mpint|, taken as an unsigned, | 5673 /* ssl3_BigIntGreaterThanOne returns true iff |mpint|, taken as an unsigned, |
5644 * big-endian integer is > 1 */ | 5674 * big-endian integer is > 1 */ |
5645 static PRBool | 5675 static PRBool |
5646 ssl3_BigIntGreaterThan1(const SECItem* mpint) { | 5676 ssl3_BigIntGreaterThanOne(const SECItem* mpint) { |
5647 unsigned char firstNonZeroByte = 0; | 5677 unsigned char firstNonZeroByte = 0; |
5648 unsigned int i; | 5678 unsigned int i; |
5649 | 5679 |
5650 for (i = 0; i < mpint->len; i++) { | 5680 for (i = 0; i < mpint->len; i++) { |
5651 if (mpint->data[i]) { | 5681 if (mpint->data[i]) { |
5652 firstNonZeroByte = mpint->data[i]; | 5682 firstNonZeroByte = mpint->data[i]; |
5653 break; | 5683 break; |
5654 } | 5684 } |
5655 } | 5685 } |
5656 | 5686 |
5657 if (firstNonZeroByte == 0) | 5687 if (firstNonZeroByte == 0) |
5658 return PR_FALSE; | 5688 return PR_FALSE; |
5659 if (firstNonZeroByte > 1) | 5689 if (firstNonZeroByte > 1) |
5660 return PR_TRUE; | 5690 return PR_TRUE; |
5661 | 5691 |
5662 // firstNonZeroByte == 1, therefore mpint > 1 iff the first non-zero byte | 5692 /* firstNonZeroByte == 1, therefore mpint > 1 iff the first non-zero byte |
5663 // is followed by another byte. | 5693 * is followed by another byte. */ |
5664 return (i < mpint->len - 1); | 5694 return (i < mpint->len - 1); |
5665 } | 5695 } |
5666 | 5696 |
5667 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete | 5697 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete |
5668 * ssl3 ServerKeyExchange message. | 5698 * ssl3 ServerKeyExchange message. |
5669 * Caller must hold Handshake and RecvBuf locks. | 5699 * Caller must hold Handshake and RecvBuf locks. |
5670 */ | 5700 */ |
5671 static SECStatus | 5701 static SECStatus |
5672 ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | 5702 ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
5673 { | 5703 { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5788 goto loser; /* malformed. */ | 5818 goto loser; /* malformed. */ |
5789 } | 5819 } |
5790 if (dh_p.len < 512/8) { | 5820 if (dh_p.len < 512/8) { |
5791 errCode = SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY; | 5821 errCode = SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY; |
5792 goto alert_loser; | 5822 goto alert_loser; |
5793 } | 5823 } |
5794 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_g, 2, &b, &length); | 5824 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_g, 2, &b, &length); |
5795 if (rv != SECSuccess) { | 5825 if (rv != SECSuccess) { |
5796 goto loser; /* malformed. */ | 5826 goto loser; /* malformed. */ |
5797 } | 5827 } |
5798 » if (dh_g.len > dh_p.len || !ssl3_BigIntGreaterThan1(&dh_g)) | 5828 » if (dh_g.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_g)) |
5799 goto alert_loser; | 5829 goto alert_loser; |
5800 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_Ys, 2, &b, &length); | 5830 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_Ys, 2, &b, &length); |
5801 if (rv != SECSuccess) { | 5831 if (rv != SECSuccess) { |
5802 goto loser; /* malformed. */ | 5832 goto loser; /* malformed. */ |
5803 } | 5833 } |
5804 » if (dh_Ys.len > dh_p.len || !ssl3_BigIntGreaterThan1(&dh_Ys)) | 5834 » if (dh_Ys.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_Ys)) |
5805 goto alert_loser; | 5835 goto alert_loser; |
5806 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); | 5836 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); |
5807 if (rv != SECSuccess) { | 5837 if (rv != SECSuccess) { |
5808 goto loser; /* malformed. */ | 5838 goto loser; /* malformed. */ |
5809 } | 5839 } |
5810 if (length != 0) { | 5840 if (length != 0) { |
5811 if (isTLS) | 5841 if (isTLS) |
5812 desc = decode_error; | 5842 desc = decode_error; |
5813 goto alert_loser; /* malformed. */ | 5843 goto alert_loser; /* malformed. */ |
5814 } | 5844 } |
(...skipping 1127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6942 #ifndef PARANOID | 6972 #ifndef PARANOID |
6943 /* Look for a matching cipher suite. */ | 6973 /* Look for a matching cipher suite. */ |
6944 j = ssl3_config_match_init(ss); | 6974 j = ssl3_config_match_init(ss); |
6945 if (j <= 0) { /* no ciphers are working/supported by PK11 */ | 6975 if (j <= 0) { /* no ciphers are working/supported by PK11 */ |
6946 errCode = PORT_GetError(); /* error code is already set. */ | 6976 errCode = PORT_GetError(); /* error code is already set. */ |
6947 goto alert_loser; | 6977 goto alert_loser; |
6948 } | 6978 } |
6949 #endif | 6979 #endif |
6950 | 6980 |
6951 /* Select a cipher suite. | 6981 /* Select a cipher suite. |
| 6982 ** |
6952 ** NOTE: This suite selection algorithm should be the same as the one in | 6983 ** NOTE: This suite selection algorithm should be the same as the one in |
6953 ** ssl3_HandleV2ClientHello(). | 6984 ** ssl3_HandleV2ClientHello(). |
| 6985 ** |
| 6986 ** If TLS 1.0 is enabled, we could handle the case where the client |
| 6987 ** offered TLS 1.1 but offered only export cipher suites by choosing TLS |
| 6988 ** 1.0 and selecting one of those export cipher suites. However, a secure |
| 6989 ** TLS 1.1 client should not have export cipher suites enabled at all, |
| 6990 ** and a TLS 1.1 client should definitely not be offering *only* export |
| 6991 ** cipher suites. Therefore, we refuse to negotiate export cipher suites |
| 6992 ** with any client that indicates support for TLS 1.1 or higher when we |
| 6993 ** (the server) have TLS 1.1 support enabled. |
6954 */ | 6994 */ |
6955 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { | 6995 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { |
6956 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; | 6996 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; |
6957 » if (!config_match(suite, ss->ssl3.policy, PR_TRUE)) | 6997 » if (!config_match(suite, ss->ssl3.policy, PR_TRUE) || |
| 6998 » !ssl3_CipherSuiteAllowedForVersion(suite->cipher_suite, |
| 6999 » » » » » ss->version)) { |
6958 continue; | 7000 continue; |
| 7001 } |
6959 for (i = 0; i + 1 < suites.len; i += 2) { | 7002 for (i = 0; i + 1 < suites.len; i += 2) { |
6960 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; | 7003 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; |
6961 if (suite_i == suite->cipher_suite) { | 7004 if (suite_i == suite->cipher_suite) { |
6962 ss->ssl3.hs.cipher_suite = suite->cipher_suite; | 7005 ss->ssl3.hs.cipher_suite = suite->cipher_suite; |
6963 ss->ssl3.hs.suite_def = | 7006 ss->ssl3.hs.suite_def = |
6964 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); | 7007 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); |
6965 goto suite_found; | 7008 goto suite_found; |
6966 } | 7009 } |
6967 } | 7010 } |
6968 } | 7011 } |
6969 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | 7012 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; |
6970 goto alert_loser; | 7013 goto alert_loser; |
6971 | 7014 |
6972 suite_found: | 7015 suite_found: |
6973 /* Look for a matching compression algorithm. */ | 7016 /* Look for a matching compression algorithm. */ |
6974 for (i = 0; i < comps.len; i++) { | 7017 for (i = 0; i < comps.len; i++) { |
| 7018 if (!compressionEnabled(ss, comps.data[i])) |
| 7019 continue; |
6975 for (j = 0; j < compressionMethodsCount; j++) { | 7020 for (j = 0; j < compressionMethodsCount; j++) { |
6976 » if (comps.data[i] == compressions[j] && | 7021 » if (comps.data[i] == compressions[j]) { |
6977 » » compressionEnabled(ss, compressions[j])) { | |
6978 ss->ssl3.hs.compression = | 7022 ss->ssl3.hs.compression = |
6979 (SSLCompressionMethod)compressions[j]; | 7023 (SSLCompressionMethod)compressions[j]; |
6980 goto compression_found; | 7024 goto compression_found; |
6981 } | 7025 } |
6982 } | 7026 } |
6983 } | 7027 } |
6984 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; | 7028 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; |
6985 /* null compression must be supported */ | 7029 /* null compression must be supported */ |
6986 goto alert_loser; | 7030 goto alert_loser; |
6987 | 7031 |
6988 compression_found: | 7032 compression_found: |
6989 suites.data = NULL; | 7033 suites.data = NULL; |
6990 comps.data = NULL; | 7034 comps.data = NULL; |
6991 | 7035 |
6992 ss->sec.send = ssl3_SendApplicationData; | 7036 ss->sec.send = ssl3_SendApplicationData; |
6993 | 7037 |
6994 /* If there are any failures while processing the old sid, | 7038 /* If there are any failures while processing the old sid, |
6995 * we don't consider them to be errors. Instead, We just behave | 7039 * we don't consider them to be errors. Instead, We just behave |
6996 * as if the client had sent us no sid to begin with, and make a new one. | 7040 * as if the client had sent us no sid to begin with, and make a new one. |
6997 */ | 7041 */ |
6998 if (sid != NULL) do { | 7042 if (sid != NULL) do { |
6999 ssl3CipherSpec *pwSpec; | 7043 ssl3CipherSpec *pwSpec; |
7000 SECItem wrappedMS; /* wrapped key */ | 7044 SECItem wrappedMS; /* wrapped key */ |
7001 | 7045 |
7002 if (sid->version != ss->version || | 7046 if (sid->version != ss->version || |
7003 » sid->u.ssl3.cipherSuite != ss->ssl3.hs.cipher_suite) { | 7047 » sid->u.ssl3.cipherSuite != ss->ssl3.hs.cipher_suite || |
| 7048 » sid->u.ssl3.compression != ss->ssl3.hs.compression) { |
7004 break; /* not an error */ | 7049 break; /* not an error */ |
7005 } | 7050 } |
7006 | 7051 |
7007 if (ss->sec.ci.sid) { | 7052 if (ss->sec.ci.sid) { |
7008 if (ss->sec.uncache) | 7053 if (ss->sec.uncache) |
7009 ss->sec.uncache(ss->sec.ci.sid); | 7054 ss->sec.uncache(ss->sec.ci.sid); |
7010 PORT_Assert(ss->sec.ci.sid != sid); /* should be impossible, but ..
. */ | 7055 PORT_Assert(ss->sec.ci.sid != sid); /* should be impossible, but ..
. */ |
7011 if (ss->sec.ci.sid != sid) { | 7056 if (ss->sec.ci.sid != sid) { |
7012 ssl_FreeSID(ss->sec.ci.sid); | 7057 ssl_FreeSID(ss->sec.ci.sid); |
7013 } | 7058 } |
7014 ss->sec.ci.sid = NULL; | 7059 ss->sec.ci.sid = NULL; |
7015 } | 7060 } |
7016 /* we need to resurrect the master secret.... */ | 7061 /* we need to resurrect the master secret.... */ |
7017 | 7062 |
7018 ssl_GetSpecWriteLock(ss); haveSpecWriteLock = PR_TRUE; | 7063 ssl_GetSpecWriteLock(ss); haveSpecWriteLock = PR_TRUE; |
7019 pwSpec = ss->ssl3.pwSpec; | 7064 pwSpec = ss->ssl3.pwSpec; |
7020 if (sid->u.ssl3.keys.msIsWrapped) { | 7065 if (sid->u.ssl3.keys.msIsWrapped) { |
7021 PK11SymKey * wrapKey; /* wrapping key */ | 7066 PK11SymKey * wrapKey; /* wrapping key */ |
7022 CK_FLAGS keyFlags = 0; | 7067 CK_FLAGS keyFlags = 0; |
| 7068 #ifndef NO_PKCS11_BYPASS |
7023 if (ss->opt.bypassPKCS11) { | 7069 if (ss->opt.bypassPKCS11) { |
7024 /* we cannot restart a non-bypass session in a | 7070 /* we cannot restart a non-bypass session in a |
7025 ** bypass socket. | 7071 ** bypass socket. |
7026 */ | 7072 */ |
7027 break; | 7073 break; |
7028 } | 7074 } |
| 7075 #endif |
7029 | 7076 |
7030 wrapKey = getWrappingKey(ss, NULL, sid->u.ssl3.exchKeyType, | 7077 wrapKey = getWrappingKey(ss, NULL, sid->u.ssl3.exchKeyType, |
7031 sid->u.ssl3.masterWrapMech, | 7078 sid->u.ssl3.masterWrapMech, |
7032 ss->pkcs11PinArg); | 7079 ss->pkcs11PinArg); |
7033 if (!wrapKey) { | 7080 if (!wrapKey) { |
7034 /* we have a SID cache entry, but no wrapping key for it??? */ | 7081 /* we have a SID cache entry, but no wrapping key for it??? */ |
7035 break; | 7082 break; |
7036 } | 7083 } |
7037 | 7084 |
7038 if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ | 7085 if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ |
7039 keyFlags = CKF_SIGN | CKF_VERIFY; | 7086 keyFlags = CKF_SIGN | CKF_VERIFY; |
7040 } | 7087 } |
7041 | 7088 |
7042 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | 7089 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; |
7043 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | 7090 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; |
7044 | 7091 |
7045 /* unwrap the master secret. */ | 7092 /* unwrap the master secret. */ |
7046 pwSpec->master_secret = | 7093 pwSpec->master_secret = |
7047 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, | 7094 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, |
7048 NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE, | 7095 NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE, |
7049 CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags); | 7096 CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags); |
7050 PK11_FreeSymKey(wrapKey); | 7097 PK11_FreeSymKey(wrapKey); |
7051 if (pwSpec->master_secret == NULL) { | 7098 if (pwSpec->master_secret == NULL) { |
7052 break; /* not an error */ | 7099 break; /* not an error */ |
7053 } | 7100 } |
| 7101 #ifndef NO_PKCS11_BYPASS |
7054 } else if (ss->opt.bypassPKCS11) { | 7102 } else if (ss->opt.bypassPKCS11) { |
7055 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | 7103 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; |
7056 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | 7104 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; |
7057 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len); | 7105 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len); |
7058 pwSpec->msItem.data = pwSpec->raw_master_secret; | 7106 pwSpec->msItem.data = pwSpec->raw_master_secret; |
7059 pwSpec->msItem.len = wrappedMS.len; | 7107 pwSpec->msItem.len = wrappedMS.len; |
| 7108 #endif |
7060 } else { | 7109 } else { |
7061 /* We CAN restart a bypass session in a non-bypass socket. */ | 7110 /* We CAN restart a bypass session in a non-bypass socket. */ |
7062 /* need to import the raw master secret to session object */ | 7111 /* need to import the raw master secret to session object */ |
7063 PK11SlotInfo * slot; | 7112 PK11SlotInfo * slot; |
7064 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | 7113 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; |
7065 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | 7114 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; |
7066 slot = PK11_GetInternalSlot(); | 7115 slot = PK11_GetInternalSlot(); |
7067 pwSpec->master_secret = | 7116 pwSpec->master_secret = |
7068 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, | 7117 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, |
7069 PK11_OriginUnwrap, CKA_ENCRYPT, &wrappedMS, | 7118 PK11_OriginUnwrap, CKA_ENCRYPT, &wrappedMS, |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7453 /* Disable any ECC cipher suites for which we have no cert. */ | 7502 /* Disable any ECC cipher suites for which we have no cert. */ |
7454 ssl3_FilterECCipherSuitesByServerCerts(ss); | 7503 ssl3_FilterECCipherSuitesByServerCerts(ss); |
7455 #endif | 7504 #endif |
7456 i = ssl3_config_match_init(ss); | 7505 i = ssl3_config_match_init(ss); |
7457 if (i <= 0) { | 7506 if (i <= 0) { |
7458 errCode = PORT_GetError(); /* error code is already set. */ | 7507 errCode = PORT_GetError(); /* error code is already set. */ |
7459 goto alert_loser; | 7508 goto alert_loser; |
7460 } | 7509 } |
7461 | 7510 |
7462 /* Select a cipher suite. | 7511 /* Select a cipher suite. |
| 7512 ** |
7463 ** NOTE: This suite selection algorithm should be the same as the one in | 7513 ** NOTE: This suite selection algorithm should be the same as the one in |
7464 ** ssl3_HandleClientHello(). | 7514 ** ssl3_HandleClientHello(). |
| 7515 ** |
| 7516 ** See the comments about export cipher suites in ssl3_HandleClientHello(). |
7465 */ | 7517 */ |
7466 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { | 7518 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { |
7467 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; | 7519 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; |
7468 » if (!config_match(suite, ss->ssl3.policy, PR_TRUE)) | 7520 » if (!config_match(suite, ss->ssl3.policy, PR_TRUE) || |
| 7521 » !ssl3_CipherSuiteAllowedForVersion(suite->cipher_suite, |
| 7522 » » » » » ss->version)) { |
7469 continue; | 7523 continue; |
| 7524 } |
7470 for (i = 0; i+2 < suite_length; i += 3) { | 7525 for (i = 0; i+2 < suite_length; i += 3) { |
7471 PRUint32 suite_i = (suites[i] << 16)|(suites[i+1] << 8)|suites[i+2]; | 7526 PRUint32 suite_i = (suites[i] << 16)|(suites[i+1] << 8)|suites[i+2]; |
7472 if (suite_i == suite->cipher_suite) { | 7527 if (suite_i == suite->cipher_suite) { |
7473 ss->ssl3.hs.cipher_suite = suite->cipher_suite; | 7528 ss->ssl3.hs.cipher_suite = suite->cipher_suite; |
7474 ss->ssl3.hs.suite_def = | 7529 ss->ssl3.hs.suite_def = |
7475 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); | 7530 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); |
7476 goto suite_found; | 7531 goto suite_found; |
7477 } | 7532 } |
7478 } | 7533 } |
7479 } | 7534 } |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7785 ca_list = ss->ssl3.ca_list; | 7840 ca_list = ss->ssl3.ca_list; |
7786 if (!ca_list) { | 7841 if (!ca_list) { |
7787 ca_list = ssl3_server_ca_list; | 7842 ca_list = ssl3_server_ca_list; |
7788 } | 7843 } |
7789 | 7844 |
7790 if (ca_list != NULL) { | 7845 if (ca_list != NULL) { |
7791 names = ca_list->names; | 7846 names = ca_list->names; |
7792 nnames = ca_list->nnames; | 7847 nnames = ca_list->nnames; |
7793 } | 7848 } |
7794 | 7849 |
7795 /* There used to be a test here to require a CA, but there | |
7796 * are cases where you want to have no CAs offered. */ | |
7797 for (i = 0, name = names; i < nnames; i++, name++) { | 7850 for (i = 0, name = names; i < nnames; i++, name++) { |
7798 calen += 2 + name->len; | 7851 calen += 2 + name->len; |
7799 } | 7852 } |
7800 | 7853 |
7801 certTypes = certificate_types; | 7854 certTypes = certificate_types; |
7802 certTypesLength = sizeof certificate_types; | 7855 certTypesLength = sizeof certificate_types; |
7803 | 7856 |
7804 length = 1 + certTypesLength + 2 + calen; | 7857 length = 1 + certTypesLength + 2 + calen; |
7805 | 7858 |
7806 rv = ssl3_AppendHandshakeHeader(ss, certificate_request, length); | 7859 rv = ssl3_AppendHandshakeHeader(ss, certificate_request, length); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7992 * | 8045 * |
7993 * Called from ssl3_HandleClientKeyExchange | 8046 * Called from ssl3_HandleClientKeyExchange |
7994 */ | 8047 */ |
7995 static SECStatus | 8048 static SECStatus |
7996 ssl3_HandleRSAClientKeyExchange(sslSocket *ss, | 8049 ssl3_HandleRSAClientKeyExchange(sslSocket *ss, |
7997 SSL3Opaque *b, | 8050 SSL3Opaque *b, |
7998 PRUint32 length, | 8051 PRUint32 length, |
7999 SECKEYPrivateKey *serverKey) | 8052 SECKEYPrivateKey *serverKey) |
8000 { | 8053 { |
8001 PK11SymKey * pms; | 8054 PK11SymKey * pms; |
| 8055 #ifndef NO_PKCS11_BYPASS |
8002 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; | 8056 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; |
8003 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; | 8057 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; |
8004 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; | 8058 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; |
8005 unsigned int outLen = 0; | 8059 unsigned int outLen = 0; |
| 8060 #endif |
8006 PRBool isTLS = PR_FALSE; | 8061 PRBool isTLS = PR_FALSE; |
8007 SECStatus rv; | 8062 SECStatus rv; |
8008 SECItem enc_pms; | 8063 SECItem enc_pms; |
8009 unsigned char rsaPmsBuf[SSL3_RSA_PMS_LENGTH]; | 8064 unsigned char rsaPmsBuf[SSL3_RSA_PMS_LENGTH]; |
8010 SECItem pmsItem = {siBuffer, NULL, 0}; | 8065 SECItem pmsItem = {siBuffer, NULL, 0}; |
8011 | 8066 |
8012 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); | 8067 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
8013 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 8068 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
8014 | 8069 |
8015 enc_pms.data = b; | 8070 enc_pms.data = b; |
8016 enc_pms.len = length; | 8071 enc_pms.len = length; |
8017 pmsItem.data = rsaPmsBuf; | 8072 pmsItem.data = rsaPmsBuf; |
8018 pmsItem.len = sizeof rsaPmsBuf; | 8073 pmsItem.len = sizeof rsaPmsBuf; |
8019 | 8074 |
8020 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ | 8075 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ |
8021 PRInt32 kLen; | 8076 PRInt32 kLen; |
8022 kLen = ssl3_ConsumeHandshakeNumber(ss, 2, &enc_pms.data, &enc_pms.len); | 8077 kLen = ssl3_ConsumeHandshakeNumber(ss, 2, &enc_pms.data, &enc_pms.len); |
8023 if (kLen < 0) { | 8078 if (kLen < 0) { |
8024 PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | 8079 PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); |
8025 return SECFailure; | 8080 return SECFailure; |
8026 } | 8081 } |
8027 if ((unsigned)kLen < enc_pms.len) { | 8082 if ((unsigned)kLen < enc_pms.len) { |
8028 enc_pms.len = kLen; | 8083 enc_pms.len = kLen; |
8029 } | 8084 } |
8030 isTLS = PR_TRUE; | 8085 isTLS = PR_TRUE; |
8031 } else { | 8086 } else { |
8032 isTLS = (PRBool)(ss->ssl3.hs.kea_def->tls_keygen != 0); | 8087 isTLS = (PRBool)(ss->ssl3.hs.kea_def->tls_keygen != 0); |
8033 } | 8088 } |
8034 | 8089 |
| 8090 #ifndef NO_PKCS11_BYPASS |
8035 if (ss->opt.bypassPKCS11) { | 8091 if (ss->opt.bypassPKCS11) { |
8036 /* TRIPLE BYPASS, get PMS directly from RSA decryption. | 8092 /* TRIPLE BYPASS, get PMS directly from RSA decryption. |
8037 * Use PK11_PrivDecryptPKCS1 to decrypt the PMS to a buffer, | 8093 * Use PK11_PrivDecryptPKCS1 to decrypt the PMS to a buffer, |
8038 * then, check for version rollback attack, then | 8094 * then, check for version rollback attack, then |
8039 * do the equivalent of ssl3_DeriveMasterSecret, placing the MS in | 8095 * do the equivalent of ssl3_DeriveMasterSecret, placing the MS in |
8040 * pwSpec->msItem. Finally call ssl3_InitPendingCipherSpec with | 8096 * pwSpec->msItem. Finally call ssl3_InitPendingCipherSpec with |
8041 * ss and NULL, so that it will use the MS we've already derived here. | 8097 * ss and NULL, so that it will use the MS we've already derived here. |
8042 */ | 8098 */ |
8043 | 8099 |
8044 rv = PK11_PrivDecryptPKCS1(serverKey, rsaPmsBuf, &outLen, | 8100 rv = PK11_PrivDecryptPKCS1(serverKey, rsaPmsBuf, &outLen, |
(...skipping 16 matching lines...) Expand all Loading... |
8061 } | 8117 } |
8062 /* have PMS, build MS without PKCS11 */ | 8118 /* have PMS, build MS without PKCS11 */ |
8063 rv = ssl3_MasterKeyDeriveBypass(pwSpec, cr, sr, &pmsItem, isTLS, | 8119 rv = ssl3_MasterKeyDeriveBypass(pwSpec, cr, sr, &pmsItem, isTLS, |
8064 PR_TRUE); | 8120 PR_TRUE); |
8065 if (rv != SECSuccess) { | 8121 if (rv != SECSuccess) { |
8066 pwSpec->msItem.data = pwSpec->raw_master_secret; | 8122 pwSpec->msItem.data = pwSpec->raw_master_secret; |
8067 pwSpec->msItem.len = SSL3_MASTER_SECRET_LENGTH; | 8123 pwSpec->msItem.len = SSL3_MASTER_SECRET_LENGTH; |
8068 PK11_GenerateRandom(pwSpec->msItem.data, pwSpec->msItem.len); | 8124 PK11_GenerateRandom(pwSpec->msItem.data, pwSpec->msItem.len); |
8069 } | 8125 } |
8070 rv = ssl3_InitPendingCipherSpec(ss, NULL); | 8126 rv = ssl3_InitPendingCipherSpec(ss, NULL); |
8071 } else { | 8127 } else |
| 8128 #endif |
| 8129 { |
| 8130 #ifndef NO_PKCS11_BYPASS |
8072 double_bypass: | 8131 double_bypass: |
| 8132 #endif |
8073 /* | 8133 /* |
8074 * unwrap pms out of the incoming buffer | 8134 * unwrap pms out of the incoming buffer |
8075 * Note: CKM_SSL3_MASTER_KEY_DERIVE is NOT the mechanism used to do | 8135 * Note: CKM_SSL3_MASTER_KEY_DERIVE is NOT the mechanism used to do |
8076 * the unwrap. Rather, it is the mechanism with which the | 8136 * the unwrap. Rather, it is the mechanism with which the |
8077 * unwrapped pms will be used. | 8137 * unwrapped pms will be used. |
8078 */ | 8138 */ |
8079 pms = PK11_PubUnwrapSymKey(serverKey, &enc_pms, | 8139 pms = PK11_PubUnwrapSymKey(serverKey, &enc_pms, |
8080 CKM_SSL3_MASTER_KEY_DERIVE, CKA_DERIVE, 0); | 8140 CKM_SSL3_MASTER_KEY_DERIVE, CKA_DERIVE, 0); |
8081 if (pms != NULL) { | 8141 if (pms != NULL) { |
8082 PRINT_BUF(60, (ss, "decrypted premaster secret:", | 8142 PRINT_BUF(60, (ss, "decrypted premaster secret:", |
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8954 | 9014 |
8955 rv = PK11_DigestBegin(prf_context); | 9015 rv = PK11_DigestBegin(prf_context); |
8956 rv |= PK11_DigestOp(prf_context, (unsigned char *) label, labelLen); | 9016 rv |= PK11_DigestOp(prf_context, (unsigned char *) label, labelLen); |
8957 rv |= PK11_DigestOp(prf_context, val, valLen); | 9017 rv |= PK11_DigestOp(prf_context, val, valLen); |
8958 rv |= PK11_DigestFinal(prf_context, out, &retLen, outLen); | 9018 rv |= PK11_DigestFinal(prf_context, out, &retLen, outLen); |
8959 PORT_Assert(rv != SECSuccess || retLen == outLen); | 9019 PORT_Assert(rv != SECSuccess || retLen == outLen); |
8960 | 9020 |
8961 PK11_DestroyContext(prf_context, PR_TRUE); | 9021 PK11_DestroyContext(prf_context, PR_TRUE); |
8962 } else { | 9022 } else { |
8963 /* bypass PKCS11 */ | 9023 /* bypass PKCS11 */ |
| 9024 #ifdef NO_PKCS11_BYPASS |
| 9025 PORT_Assert(spec->master_secret); |
| 9026 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
| 9027 rv = SECFailure; |
| 9028 #else |
8964 SECItem inData = { siBuffer, }; | 9029 SECItem inData = { siBuffer, }; |
8965 SECItem outData = { siBuffer, }; | 9030 SECItem outData = { siBuffer, }; |
8966 PRBool isFIPS = PR_FALSE; | 9031 PRBool isFIPS = PR_FALSE; |
8967 | 9032 |
8968 inData.data = (unsigned char *) val; | 9033 inData.data = (unsigned char *) val; |
8969 inData.len = valLen; | 9034 inData.len = valLen; |
8970 outData.data = out; | 9035 outData.data = out; |
8971 outData.len = outLen; | 9036 outData.len = outLen; |
8972 rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS); | 9037 rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS); |
8973 PORT_Assert(rv != SECSuccess || outData.len == outLen); | 9038 PORT_Assert(rv != SECSuccess || outData.len == outLen); |
| 9039 #endif |
8974 } | 9040 } |
8975 return rv; | 9041 return rv; |
8976 } | 9042 } |
8977 | 9043 |
8978 /* called from ssl3_HandleServerHelloDone | 9044 /* called from ssl3_HandleServerHelloDone |
8979 */ | 9045 */ |
8980 static SECStatus | 9046 static SECStatus |
8981 ssl3_SendNextProto(sslSocket *ss) | 9047 ssl3_SendNextProto(sslSocket *ss) |
8982 { | 9048 { |
8983 SECStatus rv; | 9049 SECStatus rv; |
(...skipping 18 matching lines...) Expand all Loading... |
9002 if (rv != SECSuccess) { | 9068 if (rv != SECSuccess) { |
9003 return rv; /* error code set by AppendHandshake */ | 9069 return rv; /* error code set by AppendHandshake */ |
9004 } | 9070 } |
9005 rv = ssl3_AppendHandshakeVariable(ss, padding, padding_len, 1); | 9071 rv = ssl3_AppendHandshakeVariable(ss, padding, padding_len, 1); |
9006 if (rv != SECSuccess) { | 9072 if (rv != SECSuccess) { |
9007 return rv; /* error code set by AppendHandshake */ | 9073 return rv; /* error code set by AppendHandshake */ |
9008 } | 9074 } |
9009 return rv; | 9075 return rv; |
9010 } | 9076 } |
9011 | 9077 |
| 9078 /* called from ssl3_SendFinished |
| 9079 * |
| 9080 * This function is simply a debugging aid and therefore does not return a |
| 9081 * SECStatus. */ |
| 9082 static void |
| 9083 ssl3_RecordKeyLog(sslSocket *ss) |
| 9084 { |
| 9085 sslSessionID *sid; |
| 9086 SECStatus rv; |
| 9087 SECItem *keyData; |
| 9088 char buf[14 /* "CLIENT_RANDOM " */ + |
| 9089 SSL3_RANDOM_LENGTH*2 /* client_random */ + |
| 9090 1 /* " " */ + |
| 9091 48*2 /* master secret */ + |
| 9092 1 /* new line */]; |
| 9093 unsigned int j; |
| 9094 |
| 9095 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
| 9096 |
| 9097 sid = ss->sec.ci.sid; |
| 9098 |
| 9099 if (!ssl_keylog_iob) |
| 9100 return; |
| 9101 |
| 9102 rv = PK11_ExtractKeyValue(ss->ssl3.cwSpec->master_secret); |
| 9103 if (rv != SECSuccess) |
| 9104 return; |
| 9105 |
| 9106 ssl_GetSpecReadLock(ss); |
| 9107 |
| 9108 /* keyData does not need to be freed. */ |
| 9109 keyData = PK11_GetKeyData(ss->ssl3.cwSpec->master_secret); |
| 9110 if (!keyData || !keyData->data || keyData->len != 48) { |
| 9111 ssl_ReleaseSpecReadLock(ss); |
| 9112 return; |
| 9113 } |
| 9114 |
| 9115 /* https://developer.mozilla.org/en/NSS_Key_Log_Format */ |
| 9116 |
| 9117 /* There could be multiple, concurrent writers to the |
| 9118 * keylog, so we have to do everything in a single call to |
| 9119 * fwrite. */ |
| 9120 |
| 9121 memcpy(buf, "CLIENT_RANDOM ", 14); |
| 9122 j = 14; |
| 9123 hexEncode(buf + j, ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH); |
| 9124 j += SSL3_RANDOM_LENGTH*2; |
| 9125 buf[j++] = ' '; |
| 9126 hexEncode(buf + j, keyData->data, 48); |
| 9127 j += 48*2; |
| 9128 buf[j++] = '\n'; |
| 9129 |
| 9130 PORT_Assert(j == sizeof(buf)); |
| 9131 |
| 9132 ssl_ReleaseSpecReadLock(ss); |
| 9133 |
| 9134 if (fwrite(buf, sizeof(buf), 1, ssl_keylog_iob) != 1) |
| 9135 return; |
| 9136 fflush(ssl_keylog_iob); |
| 9137 return; |
| 9138 } |
| 9139 |
9012 /* called from ssl3_SendClientSecondRound | 9140 /* called from ssl3_SendClientSecondRound |
9013 * ssl3_HandleFinished | 9141 * ssl3_HandleFinished |
9014 */ | 9142 */ |
9015 static SECStatus | 9143 static SECStatus |
9016 ssl3_SendEncryptedExtensions(sslSocket *ss) | 9144 ssl3_SendEncryptedExtensions(sslSocket *ss) |
9017 { | 9145 { |
9018 static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature"; | 9146 static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature"; |
9019 /* This is the ASN.1 prefix for a P-256 public key. Specifically it's: | 9147 /* This is the ASN.1 prefix for a P-256 public key. Specifically it's: |
9020 * SEQUENCE | 9148 * SEQUENCE |
9021 * SEQUENCE | 9149 * SEQUENCE |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9160 if (ss->ssl3.channelIDPub) | 9288 if (ss->ssl3.channelIDPub) |
9161 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); | 9289 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); |
9162 | 9290 |
9163 ss->handshake = ssl_GatherRecord1stHandshake; | 9291 ss->handshake = ssl_GatherRecord1stHandshake; |
9164 ss->ssl3.channelID = channelID; | 9292 ss->ssl3.channelID = channelID; |
9165 ss->ssl3.channelIDPub = channelIDPub; | 9293 ss->ssl3.channelIDPub = channelIDPub; |
9166 | 9294 |
9167 return SECSuccess; | 9295 return SECSuccess; |
9168 } | 9296 } |
9169 | 9297 |
9170 /* called from ssl3_SendFinished | |
9171 * | |
9172 * Caller must already hold the SpecReadLock. (wish we could assert that!). | |
9173 * This function is simply a debugging aid and therefore does not return a | |
9174 * SECStatus. */ | |
9175 static void | |
9176 ssl3_RecordKeyLog(sslSocket *ss) | |
9177 { | |
9178 sslSessionID *sid; | |
9179 SECStatus rv; | |
9180 SECItem *keyData; | |
9181 char buf[14 /* "CLIENT_RANDOM " */ + | |
9182 SSL3_RANDOM_LENGTH*2 /* client_random */ + | |
9183 1 /* " " */ + | |
9184 48*2 /* master secret */ + | |
9185 1 /* new line */]; | |
9186 unsigned int j; | |
9187 | |
9188 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
9189 | |
9190 sid = ss->sec.ci.sid; | |
9191 | |
9192 if (!ssl_keylog_iob) | |
9193 return; | |
9194 | |
9195 rv = PK11_ExtractKeyValue(ss->ssl3.cwSpec->master_secret); | |
9196 if (rv != SECSuccess) | |
9197 return; | |
9198 | |
9199 ssl_GetSpecReadLock(ss); | |
9200 | |
9201 /* keyData does not need to be freed. */ | |
9202 keyData = PK11_GetKeyData(ss->ssl3.cwSpec->master_secret); | |
9203 if (!keyData || !keyData->data || keyData->len != 48) { | |
9204 ssl_ReleaseSpecReadLock(ss); | |
9205 return; | |
9206 } | |
9207 | |
9208 /* https://developer.mozilla.org/en/NSS_Key_Log_Format */ | |
9209 | |
9210 /* There could be multiple, concurrent writers to the | |
9211 * keylog, so we have to do everything in a single call to | |
9212 * fwrite. */ | |
9213 | |
9214 memcpy(buf, "CLIENT_RANDOM ", 14); | |
9215 j = 14; | |
9216 hexEncode(buf + j, ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH); | |
9217 j += SSL3_RANDOM_LENGTH*2; | |
9218 buf[j++] = ' '; | |
9219 hexEncode(buf + j, keyData->data, 48); | |
9220 j += 48*2; | |
9221 buf[j++] = '\n'; | |
9222 | |
9223 PORT_Assert(j == sizeof(buf)); | |
9224 | |
9225 ssl_ReleaseSpecReadLock(ss); | |
9226 | |
9227 if (fwrite(buf, sizeof(buf), 1, ssl_keylog_iob) != 1) | |
9228 return; | |
9229 fflush(ssl_keylog_iob); | |
9230 return; | |
9231 } | |
9232 | |
9233 /* called from ssl3_HandleServerHelloDone | 9298 /* called from ssl3_HandleServerHelloDone |
9234 * ssl3_HandleClientHello | 9299 * ssl3_HandleClientHello |
9235 * ssl3_HandleFinished | 9300 * ssl3_HandleFinished |
9236 */ | 9301 */ |
9237 static SECStatus | 9302 static SECStatus |
9238 ssl3_SendFinished(sslSocket *ss, PRInt32 flags) | 9303 ssl3_SendFinished(sslSocket *ss, PRInt32 flags) |
9239 { | 9304 { |
9240 ssl3CipherSpec *cwSpec; | 9305 ssl3CipherSpec *cwSpec; |
9241 PRBool isTLS; | 9306 PRBool isTLS; |
9242 PRBool isServer = ss->sec.isServer; | 9307 PRBool isServer = ss->sec.isServer; |
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9928 buf->len -= ss->ssl3.hs.msg_len; | 9993 buf->len -= ss->ssl3.hs.msg_len; |
9929 ss->ssl3.hs.msg_len = 0; | 9994 ss->ssl3.hs.msg_len = 0; |
9930 ss->ssl3.hs.header_bytes = 0; | 9995 ss->ssl3.hs.header_bytes = 0; |
9931 if (rv != SECSuccess) { /* return if SECWouldBlock. */ | 9996 if (rv != SECSuccess) { /* return if SECWouldBlock. */ |
9932 return rv; | 9997 return rv; |
9933 } | 9998 } |
9934 } else { | 9999 } else { |
9935 /* must be copied to msg_body and dealt with from there */ | 10000 /* must be copied to msg_body and dealt with from there */ |
9936 unsigned int bytes; | 10001 unsigned int bytes; |
9937 | 10002 |
9938 » PORT_Assert(ss->ssl3.hs.msg_body.len <= ss->ssl3.hs.msg_len); | 10003 » PORT_Assert(ss->ssl3.hs.msg_body.len < ss->ssl3.hs.msg_len); |
9939 bytes = PR_MIN(buf->len, ss->ssl3.hs.msg_len - ss->ssl3.hs.msg_body.
len); | 10004 bytes = PR_MIN(buf->len, ss->ssl3.hs.msg_len - ss->ssl3.hs.msg_body.
len); |
9940 | 10005 |
9941 /* Grow the buffer if needed */ | 10006 /* Grow the buffer if needed */ |
9942 rv = sslBuffer_Grow(&ss->ssl3.hs.msg_body, ss->ssl3.hs.msg_len); | 10007 rv = sslBuffer_Grow(&ss->ssl3.hs.msg_body, ss->ssl3.hs.msg_len); |
9943 if (rv != SECSuccess) { | 10008 if (rv != SECSuccess) { |
9944 /* sslBuffer_Grow has set a memory error code. */ | 10009 /* sslBuffer_Grow has set a memory error code. */ |
9945 return SECFailure; | 10010 return SECFailure; |
9946 } | 10011 } |
9947 | 10012 |
9948 PORT_Memcpy(ss->ssl3.hs.msg_body.buf + ss->ssl3.hs.msg_body.len, | 10013 PORT_Memcpy(ss->ssl3.hs.msg_body.buf + ss->ssl3.hs.msg_body.len, |
9949 buf->buf, bytes); | 10014 buf->buf, bytes); |
9950 ss->ssl3.hs.msg_body.len += bytes; | 10015 ss->ssl3.hs.msg_body.len += bytes; |
9951 buf->buf += bytes; | 10016 buf->buf += bytes; |
9952 buf->len -= bytes; | 10017 buf->len -= bytes; |
9953 | 10018 |
9954 PORT_Assert(ss->ssl3.hs.msg_body.len <= ss->ssl3.hs.msg_len); | 10019 PORT_Assert(ss->ssl3.hs.msg_body.len <= ss->ssl3.hs.msg_len); |
9955 | 10020 |
9956 /* if we have a whole message, do it */ | 10021 /* if we have a whole message, do it */ |
9957 if (ss->ssl3.hs.msg_body.len == ss->ssl3.hs.msg_len) { | 10022 if (ss->ssl3.hs.msg_body.len == ss->ssl3.hs.msg_len) { |
9958 rv = ssl3_HandleHandshakeMessage( | 10023 rv = ssl3_HandleHandshakeMessage( |
9959 ss, ss->ssl3.hs.msg_body.buf, ss->ssl3.hs.msg_len); | 10024 ss, ss->ssl3.hs.msg_body.buf, ss->ssl3.hs.msg_len); |
9960 » » /* | 10025 » » if (rv == SECFailure) { |
9961 » » * XXX This appears to be wrong. This error handling | 10026 » » /* This test wants to fall through on either |
9962 » » * should clean up after a SECWouldBlock return, like the | 10027 » » * SECSuccess or SECWouldBlock. |
9963 » » * error handling used 40 lines before/above this one, | 10028 » » * ssl3_HandleHandshakeMessage MUST set error code. |
9964 » » */ | 10029 » » */ |
9965 » » if (rv != SECSuccess) { | |
9966 » » /* ssl3_HandleHandshakeMessage MUST set error code. */ | |
9967 return rv; | 10030 return rv; |
9968 } | 10031 } |
9969 ss->ssl3.hs.msg_body.len = 0; | 10032 ss->ssl3.hs.msg_body.len = 0; |
9970 » » ss->ssl3.hs.msg_len = 0; | 10033 » » ss->ssl3.hs.msg_len = 0; |
9971 ss->ssl3.hs.header_bytes = 0; | 10034 ss->ssl3.hs.header_bytes = 0; |
| 10035 if (rv != SECSuccess) { /* return if SECWouldBlock. */ |
| 10036 return rv; |
| 10037 } |
9972 } else { | 10038 } else { |
9973 PORT_Assert(buf->len == 0); | 10039 PORT_Assert(buf->len == 0); |
9974 break; | 10040 break; |
9975 } | 10041 } |
9976 } | 10042 } |
9977 } /* end loop */ | 10043 } /* end loop */ |
9978 | 10044 |
9979 origBuf->len = 0; /* So ssl3_GatherAppDataRecord will keep looping. */ | 10045 origBuf->len = 0; /* So ssl3_GatherAppDataRecord will keep looping. */ |
9980 buf->buf = NULL; /* not a leak. */ | 10046 buf->buf = NULL; /* not a leak. */ |
9981 return SECSuccess; | 10047 return SECSuccess; |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10450 #endif | 10516 #endif |
10451 ssl_ReleaseSpecWriteLock(ss); | 10517 ssl_ReleaseSpecWriteLock(ss); |
10452 | 10518 |
10453 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); | 10519 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); |
10454 | 10520 |
10455 if (IS_DTLS(ss)) { | 10521 if (IS_DTLS(ss)) { |
10456 ss->ssl3.hs.sendMessageSeq = 0; | 10522 ss->ssl3.hs.sendMessageSeq = 0; |
10457 ss->ssl3.hs.recvMessageSeq = 0; | 10523 ss->ssl3.hs.recvMessageSeq = 0; |
10458 ss->ssl3.hs.rtTimeoutMs = INITIAL_DTLS_TIMEOUT_MS; | 10524 ss->ssl3.hs.rtTimeoutMs = INITIAL_DTLS_TIMEOUT_MS; |
10459 ss->ssl3.hs.rtRetries = 0; | 10525 ss->ssl3.hs.rtRetries = 0; |
10460 | |
10461 /* Have to allocate this because ssl_FreeSocket relocates | |
10462 * this structure in DEBUG mode */ | |
10463 if (!(ss->ssl3.hs.lastMessageFlight = PORT_New(PRCList))) | |
10464 return SECFailure; | |
10465 ss->ssl3.hs.recvdHighWater = -1; | 10526 ss->ssl3.hs.recvdHighWater = -1; |
10466 » PR_INIT_CLIST(ss->ssl3.hs.lastMessageFlight); | 10527 » PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight); |
10467 dtls_SetMTU(ss, 0); /* Set the MTU to the highest plateau */ | 10528 dtls_SetMTU(ss, 0); /* Set the MTU to the highest plateau */ |
10468 } | 10529 } |
10469 | 10530 |
10470 rv = ssl3_NewHandshakeHashes(ss); | 10531 rv = ssl3_NewHandshakeHashes(ss); |
10471 if (rv == SECSuccess) { | 10532 if (rv == SECSuccess) { |
10472 ss->ssl3.initialized = PR_TRUE; | 10533 ss->ssl3.initialized = PR_TRUE; |
10473 } | 10534 } |
10474 | 10535 |
10475 return rv; | 10536 return rv; |
10476 } | 10537 } |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10829 | 10890 |
10830 if (ss->ssl3.peerCertArena != NULL) | 10891 if (ss->ssl3.peerCertArena != NULL) |
10831 ssl3_CleanupPeerCerts(ss); | 10892 ssl3_CleanupPeerCerts(ss); |
10832 | 10893 |
10833 if (ss->ssl3.clientCertChain != NULL) { | 10894 if (ss->ssl3.clientCertChain != NULL) { |
10834 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); | 10895 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); |
10835 ss->ssl3.clientCertChain = NULL; | 10896 ss->ssl3.clientCertChain = NULL; |
10836 } | 10897 } |
10837 | 10898 |
10838 /* clean up handshake */ | 10899 /* clean up handshake */ |
| 10900 #ifndef NO_PKCS11_BYPASS |
10839 if (ss->opt.bypassPKCS11) { | 10901 if (ss->opt.bypassPKCS11) { |
10840 SHA1_DestroyContext((SHA1Context *)ss->ssl3.hs.sha_cx, PR_FALSE); | 10902 SHA1_DestroyContext((SHA1Context *)ss->ssl3.hs.sha_cx, PR_FALSE); |
10841 MD5_DestroyContext((MD5Context *)ss->ssl3.hs.md5_cx, PR_FALSE); | 10903 MD5_DestroyContext((MD5Context *)ss->ssl3.hs.md5_cx, PR_FALSE); |
10842 } | 10904 } |
| 10905 #endif |
10843 if (ss->ssl3.hs.md5) { | 10906 if (ss->ssl3.hs.md5) { |
10844 PK11_DestroyContext(ss->ssl3.hs.md5,PR_TRUE); | 10907 PK11_DestroyContext(ss->ssl3.hs.md5,PR_TRUE); |
10845 } | 10908 } |
10846 if (ss->ssl3.hs.sha) { | 10909 if (ss->ssl3.hs.sha) { |
10847 PK11_DestroyContext(ss->ssl3.hs.sha,PR_TRUE); | 10910 PK11_DestroyContext(ss->ssl3.hs.sha,PR_TRUE); |
10848 } | 10911 } |
10849 if (ss->ssl3.hs.messages.buf) { | 10912 if (ss->ssl3.hs.messages.buf) { |
10850 PORT_Free(ss->ssl3.hs.messages.buf); | 10913 PORT_Free(ss->ssl3.hs.messages.buf); |
10851 ss->ssl3.hs.messages.buf = NULL; | 10914 ss->ssl3.hs.messages.buf = NULL; |
10852 ss->ssl3.hs.messages.len = 0; | 10915 ss->ssl3.hs.messages.len = 0; |
10853 ss->ssl3.hs.messages.space = 0; | 10916 ss->ssl3.hs.messages.space = 0; |
10854 } | 10917 } |
10855 if (ss->ssl3.hs.pending_cert_msg.data) { | 10918 if (ss->ssl3.hs.pending_cert_msg.data) { |
10856 SECITEM_FreeItem(&ss->ssl3.hs.pending_cert_msg, PR_FALSE); | 10919 SECITEM_FreeItem(&ss->ssl3.hs.pending_cert_msg, PR_FALSE); |
10857 } | 10920 } |
10858 if (ss->ssl3.hs.cert_status.data) { | 10921 if (ss->ssl3.hs.cert_status.data) { |
10859 SECITEM_FreeItem(&ss->ssl3.hs.cert_status, PR_FALSE); | 10922 SECITEM_FreeItem(&ss->ssl3.hs.cert_status, PR_FALSE); |
10860 } | 10923 } |
10861 | 10924 |
10862 /* free the SSL3Buffer (msg_body) */ | 10925 /* free the SSL3Buffer (msg_body) */ |
10863 PORT_Free(ss->ssl3.hs.msg_body.buf); | 10926 PORT_Free(ss->ssl3.hs.msg_body.buf); |
10864 | 10927 |
10865 /* free up the CipherSpecs */ | 10928 /* free up the CipherSpecs */ |
10866 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); | 10929 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); |
10867 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); | 10930 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); |
10868 | 10931 |
10869 /* Destroy the DTLS data */ | 10932 /* Destroy the DTLS data */ |
10870 if (IS_DTLS(ss)) { | 10933 if (IS_DTLS(ss)) { |
10871 » if (ss->ssl3.hs.lastMessageFlight) { | 10934 » dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); |
10872 » dtls_FreeHandshakeMessages(ss->ssl3.hs.lastMessageFlight); | |
10873 » PORT_Free(ss->ssl3.hs.lastMessageFlight); | |
10874 » } | |
10875 if (ss->ssl3.hs.recvdFragments.buf) { | 10935 if (ss->ssl3.hs.recvdFragments.buf) { |
10876 PORT_Free(ss->ssl3.hs.recvdFragments.buf); | 10936 PORT_Free(ss->ssl3.hs.recvdFragments.buf); |
10877 } | 10937 } |
10878 } | 10938 } |
10879 | 10939 |
10880 ss->ssl3.initialized = PR_FALSE; | 10940 ss->ssl3.initialized = PR_FALSE; |
10881 | 10941 |
10882 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); | 10942 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); |
10883 } | 10943 } |
10884 | 10944 |
10885 /* End of ssl3con.c */ | 10945 /* End of ssl3con.c */ |
OLD | NEW |