Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: net/third_party/nss/patches/recordlayerversion.patch

Issue 10828269: When renegotiating, continue to use the client_version used in the initial ClientHello (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Add the patch file Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 Index: net/third_party/nss/ssl/sslimpl.h 1 Index: mozilla/security/nss/lib/ssl/sslimpl.h
2 =================================================================== 2 ===================================================================
3 --- net/third_party/nss/ssl/sslimpl.h» (revision 146623) 3 RCS file: /cvsroot/mozilla/security/nss/lib/ssl/sslimpl.h,v
4 +++ net/third_party/nss/ssl/sslimpl.h» (working copy) 4 retrieving revision 1.106
5 @@ -294,6 +294,8 @@ 5 diff -u -p -r1.106 sslimpl.h
6 --- mozilla/security/nss/lib/ssl/sslimpl.h» 14 Jun 2012 19:03:29 -0000» 1.106
7 +++ mozilla/security/nss/lib/ssl/sslimpl.h» 17 Aug 2012 02:10:02 -0000
8 @@ -251,6 +251,8 @@ struct sslSocketOpsStr {
6 #define ssl_SEND_FLAG_NO_BUFFER 0x20000000 9 #define ssl_SEND_FLAG_NO_BUFFER 0x20000000
7 #define ssl_SEND_FLAG_USE_EPOCH 0x10000000 /* DTLS only */ 10 #define ssl_SEND_FLAG_USE_EPOCH 0x10000000 /* DTLS only */
8 #define ssl_SEND_FLAG_NO_RETRANSMIT 0x08000000 /* DTLS only */ 11 #define ssl_SEND_FLAG_NO_RETRANSMIT 0x08000000 /* DTLS only */
9 +#define ssl_SEND_FLAG_CAP_RECORD_VERSION \ 12 +#define ssl_SEND_FLAG_CAP_RECORD_VERSION \
10 + 0x04000000 /* TLS only */ 13 + 0x04000000 /* TLS only */
11 #define ssl_SEND_FLAG_MASK 0x7f000000 14 #define ssl_SEND_FLAG_MASK 0x7f000000
12 15
13 /* 16 /*
14 @@ -1414,6 +1416,7 @@ 17 @@ -1327,6 +1329,7 @@ extern SECStatus
15 ssl3_CompressMACEncryptRecord(ssl3CipherSpec * cwSpec, 18 ssl3_CompressMACEncryptRecord(ssl3CipherSpec * cwSpec,
16 PRBool isServer, 19 PRBool isServer,
17 PRBool isDTLS, 20 PRBool isDTLS,
18 + PRBool capRecordVersion, 21 + PRBool capRecordVersion,
19 SSL3ContentType type, 22 SSL3ContentType type,
20 const SSL3Opaque * pIn, 23 const SSL3Opaque * pIn,
21 PRUint32 contentLen, 24 PRUint32 contentLen,
22 Index: net/third_party/nss/ssl/ssl3con.c 25 Index: mozilla/security/nss/lib/ssl/ssl3con.c
23 =================================================================== 26 ===================================================================
24 --- net/third_party/nss/ssl/ssl3con.c» (revision 146623) 27 RCS file: /cvsroot/mozilla/security/nss/lib/ssl/ssl3con.c,v
25 +++ net/third_party/nss/ssl/ssl3con.c» (working copy) 28 retrieving revision 1.186
26 @@ -2057,6 +2057,7 @@ 29 diff -u -p -r1.186 ssl3con.c
30 --- mozilla/security/nss/lib/ssl/ssl3con.c» 30 Jul 2012 00:47:36 -0000» 1.186
31 +++ mozilla/security/nss/lib/ssl/ssl3con.c» 17 Aug 2012 02:10:02 -0000
32 @@ -2060,6 +2060,7 @@ SECStatus
27 ssl3_CompressMACEncryptRecord(ssl3CipherSpec * cwSpec, 33 ssl3_CompressMACEncryptRecord(ssl3CipherSpec * cwSpec,
28 PRBool isServer, 34 PRBool isServer,
29 PRBool isDTLS, 35 PRBool isDTLS,
30 + PRBool capRecordVersion, 36 + PRBool capRecordVersion,
31 SSL3ContentType type, 37 SSL3ContentType type,
32 const SSL3Opaque * pIn, 38 const SSL3Opaque * pIn,
33 PRUint32 contentLen, 39 PRUint32 contentLen,
34 @@ -2216,8 +2217,13 @@ 40 @@ -2219,8 +2220,13 @@ ssl3_CompressMACEncryptRecord(ssl3Cipher
35 wrBuf->buf[11] = MSB(cipherBytes); 41 wrBuf->buf[11] = MSB(cipherBytes);
36 wrBuf->buf[12] = LSB(cipherBytes); 42 wrBuf->buf[12] = LSB(cipherBytes);
37 } else { 43 } else {
38 - wrBuf->buf[1] = MSB(cwSpec->version); 44 - wrBuf->buf[1] = MSB(cwSpec->version);
39 - wrBuf->buf[2] = LSB(cwSpec->version); 45 - wrBuf->buf[2] = LSB(cwSpec->version);
40 + SSL3ProtocolVersion version = cwSpec->version; 46 + SSL3ProtocolVersion version = cwSpec->version;
41 + 47 +
42 + if (capRecordVersion) { 48 + if (capRecordVersion) {
43 + version = PR_MIN(SSL_LIBRARY_VERSION_TLS_1_0, version); 49 + version = PR_MIN(SSL_LIBRARY_VERSION_TLS_1_0, version);
44 + } 50 + }
45 + wrBuf->buf[1] = MSB(version); 51 + wrBuf->buf[1] = MSB(version);
46 + wrBuf->buf[2] = LSB(version); 52 + wrBuf->buf[2] = LSB(version);
47 wrBuf->buf[3] = MSB(cipherBytes); 53 wrBuf->buf[3] = MSB(cipherBytes);
48 wrBuf->buf[4] = LSB(cipherBytes); 54 wrBuf->buf[4] = LSB(cipherBytes);
49 } 55 }
50 @@ -2247,7 +2253,14 @@ 56 @@ -2250,7 +2256,14 @@ ssl3_CompressMACEncryptRecord(ssl3Cipher
51 * all ciphertext into the pending ciphertext buffer. 57 * all ciphertext into the pending ciphertext buffer.
52 * ssl_SEND_FLAG_USE_EPOCH (for DTLS) 58 * ssl_SEND_FLAG_USE_EPOCH (for DTLS)
53 * Forces the use of the provided epoch 59 * Forces the use of the provided epoch
54 - * 60 - *
55 + * ssl_SEND_FLAG_CAP_RECORD_VERSION 61 + * ssl_SEND_FLAG_CAP_RECORD_VERSION
56 + * Caps the record layer version number of TLS ClientHello to { 3, 1 } 62 + * Caps the record layer version number of TLS ClientHello to { 3, 1 }
57 + * (TLS 1.0). Some TLS 1.0 servers (which seem to use F5 BIG-IP) ignore 63 + * (TLS 1.0). Some TLS 1.0 servers (which seem to use F5 BIG-IP) ignore
58 + * ClientHello.client_version and use the record layer version number 64 + * ClientHello.client_version and use the record layer version number
59 + * (TLSPlaintext.version) instead when negotiating protocol versions. In 65 + * (TLSPlaintext.version) instead when negotiating protocol versions. In
60 + * addition, if the record layer version number of ClientHello is { 3, 2 } 66 + * addition, if the record layer version number of ClientHello is { 3, 2 }
61 + * (TLS 1.1) or higher, these servers reset the TCP connections. Set this 67 + * (TLS 1.1) or higher, these servers reset the TCP connections. Set this
62 + * flag to work around such servers. 68 + * flag to work around such servers.
63 */ 69 */
64 PRInt32 70 PRInt32
65 ssl3_SendRecord( sslSocket * ss, 71 ssl3_SendRecord( sslSocket * ss,
66 @@ -2260,6 +2273,7 @@ 72 @@ -2263,6 +2276,7 @@ ssl3_SendRecord( sslSocket * ss
67 sslBuffer * wrBuf = &ss->sec.writeBuf; 73 sslBuffer * wrBuf = &ss->sec.writeBuf;
68 SECStatus rv; 74 SECStatus rv;
69 PRInt32 totalSent = 0; 75 PRInt32 totalSent = 0;
70 + PRBool capRecordVersion; 76 + PRBool capRecordVersion;
71 77
72 SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s nIn=%d", 78 SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s nIn=%d",
73 SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type), 79 SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type),
74 @@ -2268,6 +2282,16 @@ 80 @@ -2271,6 +2285,17 @@ ssl3_SendRecord( sslSocket * ss
75 81
76 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 82 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) );
77 83
78 + capRecordVersion = ((flags & ssl_SEND_FLAG_CAP_RECORD_VERSION) != 0); 84 + capRecordVersion = ((flags & ssl_SEND_FLAG_CAP_RECORD_VERSION) != 0);
79 + 85 +
80 + if (capRecordVersion) { 86 + if (capRecordVersion) {
81 +» /* ssl_SEND_FLAG_CAP_RECORD_VERSION can only be used with 87 +» /* ssl_SEND_FLAG_CAP_RECORD_VERSION can only be used with the
82 +» * TLS ClientHello. */ 88 +» * TLS initial ClientHello. */
83 + PORT_Assert(!IS_DTLS(ss)); 89 + PORT_Assert(!IS_DTLS(ss));
90 + PORT_Assert(!ss->firstHsDone);
84 + PORT_Assert(type == content_handshake); 91 + PORT_Assert(type == content_handshake);
85 + PORT_Assert(ss->ssl3.hs.ws == wait_server_hello); 92 + PORT_Assert(ss->ssl3.hs.ws == wait_server_hello);
86 + } 93 + }
87 + 94 +
88 if (ss->ssl3.initialized == PR_FALSE) { 95 if (ss->ssl3.initialized == PR_FALSE) {
89 /* This can happen on a server if the very first incoming record 96 /* This can happen on a server if the very first incoming record
90 ** looks like a defective ssl3 record (e.g. too long), and we're 97 ** looks like a defective ssl3 record (e.g. too long), and we're
91 @@ -2324,7 +2348,8 @@ 98 @@ -2327,7 +2352,8 @@ ssl3_SendRecord( sslSocket * ss
92 99
93 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, 100 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec,
94 ss->sec.isServer, IS_DTLS(ss), 101 ss->sec.isServer, IS_DTLS(ss),
95 - type, pIn, 1, wrBuf); 102 - type, pIn, 1, wrBuf);
96 + capRecordVersion, type, pIn, 103 + capRecordVersion, type, pIn,
97 + 1, wrBuf); 104 + 1, wrBuf);
98 if (rv != SECSuccess) 105 if (rv != SECSuccess)
99 goto spec_locked_loser; 106 goto spec_locked_loser;
100 107
101 @@ -2337,7 +2362,8 @@ 108 @@ -2340,7 +2366,8 @@ ssl3_SendRecord( sslSocket * ss
102 109
103 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, 110 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec,
104 ss->sec.isServer, IS_DTLS(ss), 111 ss->sec.isServer, IS_DTLS(ss),
105 - type, pIn + 1, contentLen - 1, 112 - type, pIn + 1, contentLen - 1,
106 + capRecordVersion, type, 113 + capRecordVersion, type,
107 + pIn + 1, contentLen - 1, 114 + pIn + 1, contentLen - 1,
108 &secondRecord); 115 &secondRecord);
109 if (rv == SECSuccess) { 116 if (rv == SECSuccess) {
110 PRINT_BUF(50, (ss, "send (encrypted) record data [2/2]:", 117 PRINT_BUF(50, (ss, "send (encrypted) record data [2/2]:",
111 @@ -2349,6 +2375,7 @@ 118 @@ -2352,6 +2379,7 @@ ssl3_SendRecord( sslSocket * ss
112 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, 119 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec,
113 ss->sec.isServer, 120 ss->sec.isServer,
114 IS_DTLS(ss), 121 IS_DTLS(ss),
115 + capRecordVersion, 122 + capRecordVersion,
116 type, pIn, 123 type, pIn,
117 contentLen, wrBuf); 124 contentLen, wrBuf);
118 } else { 125 } else {
119 @@ -2560,6 +2587,8 @@ 126 @@ -2563,6 +2591,8 @@ ssl3_FlushHandshake(sslSocket *ss, PRInt
120 static SECStatus 127 static SECStatus
121 ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags) 128 ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags)
122 { 129 {
123 + static const PRInt32 allowedFlags = ssl_SEND_FLAG_FORCE_INTO_BUFFER | 130 + static const PRInt32 allowedFlags = ssl_SEND_FLAG_FORCE_INTO_BUFFER |
124 + ssl_SEND_FLAG_CAP_RECORD_VERSION; 131 + ssl_SEND_FLAG_CAP_RECORD_VERSION;
125 PRInt32 rv = SECSuccess; 132 PRInt32 rv = SECSuccess;
126 133
127 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 134 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
128 @@ -2568,9 +2597,9 @@ 135 @@ -2571,9 +2601,9 @@ ssl3_FlushHandshakeMessages(sslSocket *s
129 if (!ss->sec.ci.sendBuf.buf || !ss->sec.ci.sendBuf.len) 136 if (!ss->sec.ci.sendBuf.buf || !ss->sec.ci.sendBuf.len)
130 return rv; 137 return rv;
131 138
132 - /* only this flag is allowed */ 139 - /* only this flag is allowed */
133 - PORT_Assert(!(flags & ~ssl_SEND_FLAG_FORCE_INTO_BUFFER)); 140 - PORT_Assert(!(flags & ~ssl_SEND_FLAG_FORCE_INTO_BUFFER));
134 - if ((flags & ~ssl_SEND_FLAG_FORCE_INTO_BUFFER) != 0) { 141 - if ((flags & ~ssl_SEND_FLAG_FORCE_INTO_BUFFER) != 0) {
135 + /* only these flags are allowed */ 142 + /* only these flags are allowed */
136 + PORT_Assert(!(flags & ~allowedFlags)); 143 + PORT_Assert(!(flags & ~allowedFlags));
137 + if ((flags & ~allowedFlags) != 0) { 144 + if ((flags & ~allowedFlags) != 0) {
138 PORT_SetError(SEC_ERROR_INVALID_ARGS); 145 PORT_SetError(SEC_ERROR_INVALID_ARGS);
139 rv = SECFailure; 146 rv = SECFailure;
140 } else { 147 } else {
141 @@ -3981,8 +4010,10 @@ 148 @@ -4000,8 +4030,10 @@ ssl3_SendClientHello(sslSocket *ss, PRBo
142 int num_suites; 149 int num_suites;
143 int actual_count = 0; 150 int actual_count = 0;
144 PRBool isTLS = PR_FALSE; 151 PRBool isTLS = PR_FALSE;
145 + PRBool serverVersionKnown = PR_FALSE; 152 + PRBool requestingResume = PR_FALSE;
146 PRInt32 total_exten_len = 0; 153 PRInt32 total_exten_len = 0;
147 unsigned numCompressionMethods; 154 unsigned numCompressionMethods;
148 + PRInt32 flags; 155 + PRInt32 flags;
149 156
150 SSL_TRC(3, ("%d: SSL3[%d]: send client_hello handshake", SSL_GETPID(), 157 SSL_TRC(3, ("%d: SSL3[%d]: send client_hello handshake", SSL_GETPID(),
151 ss->fd)); 158 ss->fd));
152 @@ -4070,6 +4101,7 @@ 159 @@ -4090,6 +4122,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBo
153 } 160 }
154 161
155 if (sid) { 162 if (sid) {
156 +» serverVersionKnown = PR_TRUE; 163 +» requestingResume = PR_TRUE;
157 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_hits ); 164 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_hits );
158 165
159 /* Are we attempting a stateless session resume? */ 166 /* Are we attempting a stateless session resume? */
160 @@ -4305,7 +4337,11 @@ 167 @@ -4325,7 +4358,11 @@ ssl3_SendClientHello(sslSocket *ss, PRBo
161 ssl_renegotiation_info_xtn; 168 ssl_renegotiation_info_xtn;
162 } 169 }
163 170
164 - rv = ssl3_FlushHandshake(ss, 0); 171 - rv = ssl3_FlushHandshake(ss, 0);
165 + flags = 0; 172 + flags = 0;
166 + if (!serverVersionKnown && !IS_DTLS(ss)) { 173 + if (!ss->firstHsDone && !requestingResume && !IS_DTLS(ss)) {
167 + flags |= ssl_SEND_FLAG_CAP_RECORD_VERSION; 174 + flags |= ssl_SEND_FLAG_CAP_RECORD_VERSION;
168 + } 175 + }
169 + rv = ssl3_FlushHandshake(ss, flags); 176 + rv = ssl3_FlushHandshake(ss, flags);
170 if (rv != SECSuccess) { 177 if (rv != SECSuccess) {
171 return rv; /* error code set by ssl3_FlushHandshake */ 178 return rv; /* error code set by ssl3_FlushHandshake */
172 } 179 }
173 Index: net/third_party/nss/ssl/dtls1con.c 180 Index: mozilla/security/nss/lib/ssl/dtlscon.c
174 =================================================================== 181 ===================================================================
175 --- net/third_party/nss/ssl/dtls1con.c» (revision 146623) 182 RCS file: /cvsroot/mozilla/security/nss/lib/ssl/dtlscon.c,v
176 +++ net/third_party/nss/ssl/dtls1con.c» (working copy) 183 retrieving revision 1.3
177 @@ -834,7 +834,8 @@ 184 diff -u -p -r1.3 dtlscon.c
185 --- mozilla/security/nss/lib/ssl/dtlscon.c» 4 Jul 2012 15:21:47 -0000» 1.3
186 +++ mozilla/security/nss/lib/ssl/dtlscon.c» 17 Aug 2012 02:10:02 -0000
187 @@ -802,7 +802,8 @@ dtls_CompressMACEncryptRecord(sslSocket
178 188
179 if (cwSpec) { 189 if (cwSpec) {
180 rv = ssl3_CompressMACEncryptRecord(cwSpec, ss->sec.isServer, PR_TRUE, 190 rv = ssl3_CompressMACEncryptRecord(cwSpec, ss->sec.isServer, PR_TRUE,
181 - type, pIn, contentLen, wrBuf); 191 - type, pIn, contentLen, wrBuf);
182 + PR_FALSE, type, pIn, contentLen, 192 + PR_FALSE, type, pIn, contentLen,
183 + wrBuf); 193 + wrBuf);
184 } else { 194 } else {
185 PR_NOT_REACHED("Couldn't find a cipher spec matching epoch"); 195 PR_NOT_REACHED("Couldn't find a cipher spec matching epoch");
186 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 196 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
OLDNEW
« no previous file with comments | « net/third_party/nss/patches/applypatches.sh ('k') | net/third_party/nss/patches/renegoclientversion.patch » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698