OLD | NEW |
1 Index: net/third_party/nss/ssl/ssl.h | 1 diff -up a/src/net/third_party/nss/ssl/ssl.h b/src/net/third_party/nss/ssl/ssl.h |
2 =================================================================== | 2 --- a/src/net/third_party/nss/ssl/ssl.h»2012-02-29 19:15:20.975171099 -0800 |
3 --- net/third_party/nss/ssl/ssl.h» (revision 108962) | 3 +++ b/src/net/third_party/nss/ssl/ssl.h»2012-02-29 19:18:21.947702106 -0800 |
4 +++ net/third_party/nss/ssl/ssl.h» (working copy) | 4 @@ -169,6 +169,7 @@ SSL_IMPORT PRFileDesc *SSL_ImportFD(PRFi |
5 @@ -143,6 +143,7 @@ | 5 #define SSL_CBC_RANDOM_IV 23 |
6 #define SSL_ENABLE_CACHED_INFO 24 /* Enable TLS cached information */ | 6 #define SSL_ENABLE_OCSP_STAPLING 24 /* Request OCSP stapling (client) */ |
7 /* extension, off by default. */ | |
8 #define SSL_ENABLE_OB_CERTS 25 /* Enable origin bound certs. */ | 7 #define SSL_ENABLE_OB_CERTS 25 /* Enable origin bound certs. */ |
9 +#define SSL_ENCRYPT_CLIENT_CERTS 26 /* Enable encrypted client certs. */ | 8 +#define SSL_ENCRYPT_CLIENT_CERTS 26 /* Enable encrypted client certs. */ |
10 | 9 |
11 #ifdef SSL_DEPRECATED_FUNCTION | 10 #ifdef SSL_DEPRECATED_FUNCTION |
12 /* Old deprecated function names */ | 11 /* Old deprecated function names */ |
13 Index: net/third_party/nss/ssl/sslimpl.h | 12 diff -up a/src/net/third_party/nss/ssl/sslimpl.h b/src/net/third_party/nss/ssl/s
slimpl.h |
14 =================================================================== | 13 --- a/src/net/third_party/nss/ssl/sslimpl.h» 2012-02-29 19:15:20.975171099 -0
800 |
15 --- net/third_party/nss/ssl/sslimpl.h» (revision 108962) | 14 +++ b/src/net/third_party/nss/ssl/sslimpl.h» 2012-02-29 19:19:26.478604857 -0
800 |
16 +++ net/third_party/nss/ssl/sslimpl.h» (working copy) | 15 @@ -350,6 +350,7 @@ typedef struct sslOptionsStr { |
17 @@ -350,6 +350,7 @@ | 16 unsigned int cbcRandomIV : 1; /* 24 */ |
18 unsigned int enableOCSPStapling : 1; /* 24 */ | 17 unsigned int enableOCSPStapling : 1; /* 25 */ |
19 unsigned int enableCachedInfo : 1; /* 25 */ | |
20 unsigned int enableOBCerts : 1; /* 26 */ | 18 unsigned int enableOBCerts : 1; /* 26 */ |
21 + unsigned int encryptClientCerts : 1; /* 27 */ | 19 + unsigned int encryptClientCerts : 1; /* 27 */ |
22 } sslOptions; | 20 } sslOptions; |
23 | 21 |
24 typedef enum { sslHandshakingUndetermined = 0, | 22 typedef enum { sslHandshakingUndetermined = 0, |
25 Index: net/third_party/nss/ssl/ssl3ext.c | 23 diff -up a/src/net/third_party/nss/ssl/ssl3con.c b/src/net/third_party/nss/ssl/s
sl3con.c |
26 =================================================================== | 24 --- a/src/net/third_party/nss/ssl/ssl3con.c» 2012-02-29 19:15:20.975171099 -0
800 |
27 --- net/third_party/nss/ssl/ssl3ext.c» (revision 108962) | 25 +++ b/src/net/third_party/nss/ssl/ssl3con.c» 2012-02-29 20:00:15.851981917 -0
800 |
28 +++ net/third_party/nss/ssl/ssl3ext.c» (working copy) | 26 @@ -2863,7 +2863,14 @@ ssl3_HandleChangeCipherSpecs(sslSocket * |
29 @@ -78,6 +78,12 @@ | |
30 PRBool append, PRUint32 maxBytes); | |
31 static SECStatus ssl3_HandleRenegotiationInfoXtn(sslSocket *ss, | |
32 PRUint16 ex_type, SECItem *data); | |
33 +static SECStatus ssl3_ServerHandleEncryptedClientCertsXtn(sslSocket *ss, | |
34 + PRUint16 ex_type, SECItem *data); | |
35 +static SECStatus ssl3_ClientHandleEncryptedClientCertsXtn(sslSocket *ss, | |
36 + PRUint16 ex_type, SECItem *data); | |
37 +static PRInt32 ssl3_SendEncryptedClientCertsXtn(sslSocket *ss, | |
38 + PRBool append, PRUint32 maxBytes); | |
39 | |
40 /* | |
41 * Write bytes. Using this function means the SECItem structure | |
42 @@ -234,6 +240,7 @@ | |
43 { ssl_ec_point_formats_xtn, &ssl3_HandleSupportedPointFormatsXtn }, | |
44 #endif | |
45 { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn }, | |
46 + { ssl_encrypted_client_certs, &ssl3_ServerHandleEncryptedClientCertsXtn }, | |
47 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, | |
48 { ssl_next_proto_neg_xtn, &ssl3_ServerHandleNextProtoNegoXtn }, | |
49 { ssl_cached_info_xtn, &ssl3_ServerHandleCachedInfoXtn }, | |
50 @@ -247,6 +254,7 @@ | |
51 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn }, | |
52 /* TODO: add a handler for ssl_ec_point_formats_xtn */ | |
53 { ssl_session_ticket_xtn, &ssl3_ClientHandleSessionTicketXtn }, | |
54 + { ssl_encrypted_client_certs, &ssl3_ClientHandleEncryptedClientCertsXtn }, | |
55 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, | |
56 { ssl_next_proto_neg_xtn, &ssl3_ClientHandleNextProtoNegoXtn }, | |
57 { ssl_cached_info_xtn, &ssl3_ClientHandleCachedInfoXtn }, | |
58 @@ -275,6 +283,7 @@ | |
59 { ssl_ec_point_formats_xtn, &ssl3_SendSupportedPointFormatsXtn }, | |
60 #endif | |
61 { ssl_session_ticket_xtn, &ssl3_SendSessionTicketXtn }, | |
62 + { ssl_encrypted_client_certs, &ssl3_SendEncryptedClientCertsXtn }, | |
63 { ssl_next_proto_neg_xtn, &ssl3_ClientSendNextProtoNegoXtn }, | |
64 { ssl_cached_info_xtn, &ssl3_ClientSendCachedInfoXtn }, | |
65 { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn }, | |
66 @@ -1318,6 +1327,18 @@ | |
67 return SECSuccess; | |
68 } | |
69 | |
70 +static SECStatus | |
71 +ssl3_ClientHandleEncryptedClientCertsXtn(sslSocket *ss, PRUint16 ex_type, | |
72 +» SECItem *data) | |
73 +{ | |
74 + if (data->len != 0) | |
75 +» return SECFailure; | |
76 + | |
77 + /* Keep track of negotiated extensions. */ | |
78 + ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; | |
79 + return SECSuccess; | |
80 +} | |
81 + | |
82 SECStatus | |
83 ssl3_ServerHandleSessionTicketXtn(sslSocket *ss, PRUint16 ex_type, | |
84 SECItem *data) | |
85 @@ -1728,6 +1749,24 @@ | |
86 return rv; | |
87 } | |
88 | |
89 +static SECStatus | |
90 +ssl3_ServerHandleEncryptedClientCertsXtn(sslSocket *ss, PRUint16 ex_type, | |
91 +» SECItem *data) | |
92 +{ | |
93 + SECStatus rv = SECSuccess; | |
94 + | |
95 + if (data->len != 0) | |
96 +» return SECFailure; | |
97 + | |
98 + if (ss->opt.encryptClientCerts) { | |
99 +» ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; | |
100 +» rv = ssl3_RegisterServerHelloExtensionSender( | |
101 +» ss, ex_type, ssl3_SendEncryptedClientCertsXtn); | |
102 + } | |
103 + | |
104 + return rv; | |
105 +} | |
106 + | |
107 /* | |
108 * Read bytes. Using this function means the SECItem structure | |
109 * cannot be freed. The caller is expected to call this function | |
110 @@ -1927,6 +1966,33 @@ | |
111 return needed; | |
112 } | |
113 | |
114 +static PRInt32 | |
115 +ssl3_SendEncryptedClientCertsXtn( | |
116 +» » » sslSocket * ss, | |
117 +» » » PRBool append, | |
118 +» » » PRUint32 maxBytes) | |
119 +{ | |
120 + PRInt32 needed; | |
121 + | |
122 + if (!ss->opt.encryptClientCerts) | |
123 +» return 0; | |
124 + | |
125 + needed = 4; /* two bytes of type and two of length. */ | |
126 + if (append && maxBytes >= needed) { | |
127 +» SECStatus rv; | |
128 +» rv = ssl3_AppendHandshakeNumber(ss, ssl_encrypted_client_certs, 2); | |
129 +» if (rv != SECSuccess) | |
130 +» return -1; | |
131 +» rv = ssl3_AppendHandshakeNumber(ss, 0 /* length */, 2); | |
132 +» if (rv != SECSuccess) | |
133 +» return -1; | |
134 +» ss->xtnData.advertised[ss->xtnData.numAdvertised++] = | |
135 +» ssl_encrypted_client_certs; | |
136 + } | |
137 + | |
138 + return needed; | |
139 +} | |
140 + | |
141 /* This function runs in both the client and server. */ | |
142 static SECStatus | |
143 ssl3_HandleRenegotiationInfoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data) | |
144 Index: net/third_party/nss/ssl/sslsock.c | |
145 =================================================================== | |
146 --- net/third_party/nss/ssl/sslsock.c» (revision 108962) | |
147 +++ net/third_party/nss/ssl/sslsock.c» (working copy) | |
148 @@ -188,6 +188,7 @@ | |
149 PR_FALSE, /* enableOCSPStapling */ | |
150 PR_FALSE, /* enableCachedInfo */ | |
151 PR_FALSE, /* enableOBCerts */ | |
152 + PR_FALSE, /* encryptClientCerts */ | |
153 }; | |
154 | |
155 sslSessionIDLookupFunc ssl_sid_lookup; | |
156 @@ -757,6 +758,10 @@ | |
157 » ss->opt.enableOBCerts = on; | |
158 » break; | |
159 | |
160 + case SSL_ENCRYPT_CLIENT_CERTS: | |
161 +» ss->opt.encryptClientCerts = on; | |
162 +» break; | |
163 + | |
164 default: | |
165 » PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
166 » rv = SECFailure; | |
167 @@ -824,6 +829,8 @@ | |
168 case SSL_ENABLE_OCSP_STAPLING: on = ss->opt.enableOCSPStapling; break; | |
169 case SSL_ENABLE_CACHED_INFO: on = ss->opt.enableCachedInfo; break; | |
170 case SSL_ENABLE_OB_CERTS: on = ss->opt.enableOBCerts; break; | |
171 + case SSL_ENCRYPT_CLIENT_CERTS: | |
172 + on = ss->opt.encryptClientCerts; break; | |
173 | |
174 default: | |
175 » PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
176 @@ -880,6 +887,8 @@ | |
177 » break; | |
178 case SSL_ENABLE_CACHED_INFO: on = ssl_defaults.enableCachedInfo; break; | |
179 case SSL_ENABLE_OB_CERTS: on = ssl_defaults.enableOBCerts; break; | |
180 + case SSL_ENCRYPT_CLIENT_CERTS: | |
181 + on = ssl_defaults.encryptClientCerts; break; | |
182 | |
183 default: | |
184 » PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
185 @@ -1039,6 +1048,10 @@ | |
186 » ssl_defaults.enableOBCerts = on; | |
187 » break; | |
188 | |
189 + case SSL_ENCRYPT_CLIENT_CERTS: | |
190 +» ssl_defaults.encryptClientCerts = on; | |
191 +» break; | |
192 + | |
193 default: | |
194 » PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
195 » return SECFailure; | |
196 Index: net/third_party/nss/ssl/ssl3con.c | |
197 =================================================================== | |
198 --- net/third_party/nss/ssl/ssl3con.c» (revision 108962) | |
199 +++ net/third_party/nss/ssl/ssl3con.c» (working copy) | |
200 @@ -2835,8 +2835,15 @@ | |
201 | 27 |
202 ss->ssl3.prSpec = ss->ssl3.crSpec; | 28 ss->ssl3.prSpec = ss->ssl3.crSpec; |
203 ss->ssl3.crSpec = prSpec; | 29 ss->ssl3.crSpec = prSpec; |
204 - ss->ssl3.hs.ws = wait_finished; | 30 - ss->ssl3.hs.ws = wait_finished; |
205 | 31 + |
206 + if (ss->sec.isServer && | 32 + if (ss->sec.isServer && |
207 + ss->opt.requestCertificate && | 33 + ss->opt.requestCertificate && |
208 + ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 34 + ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
209 + ss->ssl3.hs.ws = wait_client_cert; | 35 + ss->ssl3.hs.ws = wait_client_cert; |
210 + } else { | 36 + } else { |
211 + ss->ssl3.hs.ws = wait_finished; | 37 + ss->ssl3.hs.ws = wait_finished; |
212 + } | 38 + } |
213 + | 39 |
214 SSL_TRC(3, ("%d: SSL3[%d] Set Current Read Cipher Suite to Pending", | 40 SSL_TRC(3, ("%d: SSL3[%d] Set Current Read Cipher Suite to Pending", |
215 SSL_GETPID(), ss->fd )); | 41 SSL_GETPID(), ss->fd )); |
216 | 42 @@ -4877,10 +4884,11 @@ loser: |
217 @@ -4850,10 +4857,11 @@ | |
218 static SECStatus | 43 static SECStatus |
219 ssl3_SendCertificateVerify(sslSocket *ss) | 44 ssl3_SendCertificateVerify(sslSocket *ss) |
220 { | 45 { |
221 - SECStatus rv = SECFailure; | 46 - SECStatus rv = SECFailure; |
222 - PRBool isTLS; | 47 - PRBool isTLS; |
223 - SECItem buf = {siBuffer, NULL, 0}; | 48 - SECItem buf = {siBuffer, NULL, 0}; |
224 - SSL3Hashes hashes; | 49 - SSL3Hashes hashes; |
225 + SECStatus rv = SECFailure; | 50 + SECStatus rv = SECFailure; |
226 + PRBool isTLS; | 51 + PRBool isTLS; |
227 + SECItem buf = {siBuffer, NULL, 0}; | 52 + SECItem buf = {siBuffer, NULL, 0}; |
228 + SSL3Hashes hashes; | 53 + SSL3Hashes hashes; |
229 + ssl3CipherSpec *spec; | 54 + ssl3CipherSpec *spec; |
230 | 55 |
231 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | 56 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); |
232 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 57 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
233 @@ -4862,13 +4870,17 @@ | 58 @@ -4889,13 +4897,17 @@ ssl3_SendCertificateVerify(sslSocket *ss |
234 SSL_GETPID(), ss->fd)); | 59 SSL_GETPID(), ss->fd)); |
235 | 60 |
236 ssl_GetSpecReadLock(ss); | 61 ssl_GetSpecReadLock(ss); |
237 - rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); | 62 - rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); |
238 + spec = ss->ssl3.pwSpec; | 63 + spec = ss->ssl3.pwSpec; |
239 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 64 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
240 + spec = ss->ssl3.cwSpec; | 65 + spec = ss->ssl3.cwSpec; |
241 + } | 66 + } |
242 + rv = ssl3_ComputeHandshakeHashes(ss, spec, &hashes, 0); | 67 + rv = ssl3_ComputeHandshakeHashes(ss, spec, &hashes, 0); |
243 ssl_ReleaseSpecReadLock(ss); | 68 ssl_ReleaseSpecReadLock(ss); |
244 if (rv != SECSuccess) { | 69 if (rv != SECSuccess) { |
245 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ | 70 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ |
246 } | 71 } |
247 | 72 |
248 - isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | 73 - isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); |
249 + isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); | 74 + isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); |
250 if (ss->ssl3.platformClientKey) { | 75 if (ss->ssl3.platformClientKey) { |
251 #ifdef NSS_PLATFORM_CLIENT_AUTH | 76 #ifdef NSS_PLATFORM_CLIENT_AUTH |
252 rv = ssl3_PlatformSignHashes(&hashes, ss->ssl3.platformClientKey, | 77 rv = ssl3_PlatformSignHashes(&hashes, ss->ssl3.platformClientKey, |
253 @@ -5840,7 +5852,10 @@ | 78 @@ -5912,6 +5924,10 @@ ssl3_SendClientSecondRound(sslSocket *ss |
254 { | 79 { |
255 SECStatus rv; | 80 SECStatus rv; |
256 SSL3WaitState ws = ss->ssl3.hs.ws; | 81 PRBool sendClientCert; |
257 - PRBool send_verify = PR_FALSE; | 82 + PRBool sendEmptyCert; |
258 + PRBool sendEmptyCert, sendCert; | 83 + int n = 0, i; |
259 + int n = 0, i; | |
260 + typedef SECStatus (*SendFunction)(sslSocket*); | 84 + typedef SECStatus (*SendFunction)(sslSocket*); |
261 + SendFunction send_funcs[5]; | 85 + SendFunction send_funcs[5]; |
262 | 86 |
263 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake", | 87 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
264 » » SSL_GETPID(), ss->fd)); | 88 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
265 @@ -5858,46 +5873,45 @@ | 89 @@ -5958,35 +5974,40 @@ ssl3_SendClientSecondRound(sslSocket *ss |
266 | 90 |
267 ssl_GetXmitBufLock(ss); /*******************************/ | 91 ssl_GetXmitBufLock(ss); /*******************************/ |
268 | 92 |
269 - if (ss->ssl3.sendEmptyCert) { | 93 - if (ss->ssl3.sendEmptyCert) { |
270 - ss->ssl3.sendEmptyCert = PR_FALSE; | 94 - ss->ssl3.sendEmptyCert = PR_FALSE; |
271 - rv = ssl3_SendEmptyCertificate(ss); | 95 - rv = ssl3_SendEmptyCertificate(ss); |
272 - /* Don't send verify */ | 96 - /* Don't send verify */ |
273 - if (rv != SECSuccess) { | 97 - if (rv != SECSuccess) { |
274 - goto loser; /* error code is set. */ | 98 - goto loser; /* error code is set. */ |
275 - } | 99 - } |
276 - } else if (ss->ssl3.clientCertChain != NULL && | 100 - } else if (sendClientCert) { |
277 - ss->ssl3.platformClientKey) { | |
278 -#ifdef NSS_PLATFORM_CLIENT_AUTH | |
279 - send_verify = PR_TRUE; | |
280 - rv = ssl3_SendCertificate(ss); | |
281 - if (rv != SECSuccess) { | |
282 - goto loser; /* error code is set. */ | |
283 - } | |
284 -#endif /* NSS_PLATFORM_CLIENT_AUTH */ | |
285 - } else if (ss->ssl3.clientCertChain != NULL && | |
286 - ss->ssl3.clientPrivateKey != NULL) { | |
287 -» send_verify = PR_TRUE; | |
288 - rv = ssl3_SendCertificate(ss); | 101 - rv = ssl3_SendCertificate(ss); |
289 - if (rv != SECSuccess) { | 102 - if (rv != SECSuccess) { |
290 - goto loser; /* error code is set. */ | 103 - goto loser; /* error code is set. */ |
291 - } | 104 - } |
292 - } | 105 - } |
293 + sendEmptyCert = ss->ssl3.sendEmptyCert; | 106 + sendEmptyCert = ss->ssl3.sendEmptyCert; |
294 + ss->ssl3.sendEmptyCert = PR_FALSE; | 107 + ss->ssl3.sendEmptyCert = PR_FALSE; |
295 + sendCert = !sendEmptyCert && | |
296 + ss->ssl3.clientCertChain != NULL && | |
297 + (ss->ssl3.platformClientKey || | |
298 + ss->ssl3.clientPrivateKey != NULL); | |
299 | 108 |
300 - rv = ssl3_SendClientKeyExchange(ss); | 109 - rv = ssl3_SendClientKeyExchange(ss); |
301 - if (rv != SECSuccess) { | 110 - if (rv != SECSuccess) { |
302 - goto loser; /* err is set. */ | 111 - goto loser; /* err is set. */ |
303 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 112 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
304 + send_funcs[n++] = ssl3_SendClientKeyExchange; | 113 + send_funcs[n++] = ssl3_SendClientKeyExchange; |
305 + send_funcs[n++] = ssl3_SendChangeCipherSpecs; | 114 + send_funcs[n++] = ssl3_SendChangeCipherSpecs; |
306 + if (sendEmptyCert) { | 115 + if (sendEmptyCert) { |
307 + send_funcs[n++] = ssl3_SendEmptyCertificate; | 116 + send_funcs[n++] = ssl3_SendEmptyCertificate; |
308 + } | 117 + } |
309 +» if (sendCert) { | 118 +» if (sendClientCert) { |
310 + send_funcs[n++] = ssl3_SendCertificate; | 119 + send_funcs[n++] = ssl3_SendCertificate; |
311 + send_funcs[n++] = ssl3_SendCertificateVerify; | 120 + send_funcs[n++] = ssl3_SendCertificateVerify; |
312 + } | 121 + } |
313 + } else { | 122 + } else { |
314 + if (sendEmptyCert) { | 123 + if (sendEmptyCert) { |
315 + send_funcs[n++] = ssl3_SendEmptyCertificate; | 124 + send_funcs[n++] = ssl3_SendEmptyCertificate; |
316 + } | 125 + } |
317 +» if (sendCert) { | 126 +» if (sendClientCert) { |
318 + send_funcs[n++] = ssl3_SendCertificate; | 127 + send_funcs[n++] = ssl3_SendCertificate; |
319 + } | 128 + } |
320 + send_funcs[n++] = ssl3_SendClientKeyExchange; | 129 + send_funcs[n++] = ssl3_SendClientKeyExchange; |
321 +» if (sendCert) { | 130 +» if (sendClientCert) { |
322 + send_funcs[n++] = ssl3_SendCertificateVerify; | 131 + send_funcs[n++] = ssl3_SendCertificateVerify; |
323 + } | 132 + } |
324 + send_funcs[n++] = ssl3_SendChangeCipherSpecs; | 133 + send_funcs[n++] = ssl3_SendChangeCipherSpecs; |
325 } | 134 } |
326 | 135 |
327 - if (send_verify) { | 136 - if (sendClientCert) { |
328 - rv = ssl3_SendCertificateVerify(ss); | 137 - rv = ssl3_SendCertificateVerify(ss); |
| 138 - if (rv != SECSuccess) { |
| 139 - goto loser; /* err is set. */ |
| 140 - } |
| 141 - } |
329 + PORT_Assert(n <= sizeof(send_funcs)/sizeof(send_funcs[0])); | 142 + PORT_Assert(n <= sizeof(send_funcs)/sizeof(send_funcs[0])); |
330 + | 143 |
| 144 - rv = ssl3_SendChangeCipherSpecs(ss); |
| 145 - if (rv != SECSuccess) { |
| 146 -» goto loser;» /* err code was set. */ |
331 + for (i = 0; i < n; i++) { | 147 + for (i = 0; i < n; i++) { |
332 + rv = send_funcs[i](ss); | 148 + rv = send_funcs[i](ss); |
333 » if (rv != SECSuccess) { | 149 +» if (rv != SECSuccess) { |
334 -» goto loser;»/* err is set. */ | |
335 - } | |
336 + goto loser; /* err code was set. */ | 150 + goto loser; /* err code was set. */ |
337 + } | 151 + } |
338 } | 152 } |
339 - rv = ssl3_SendChangeCipherSpecs(ss); | |
340 - if (rv != SECSuccess) { | |
341 - goto loser; /* err code was set. */ | |
342 - } | |
343 | 153 |
344 /* We don't send NPN in a renegotiation as it's explicitly disallowed by | 154 /* XXX: If the server's certificate hasn't been authenticated by this |
345 * the spec. */ | 155 @@ -6201,8 +6222,13 @@ ssl3_SendServerHelloSequence(sslSocket * |
346 @@ -6110,8 +6124,13 @@ | |
347 return rv; /* err code is set. */ | 156 return rv; /* err code is set. */ |
348 } | 157 } |
349 | 158 |
350 - ss->ssl3.hs.ws = (ss->opt.requestCertificate) ? wait_client_cert | 159 - ss->ssl3.hs.ws = (ss->opt.requestCertificate) ? wait_client_cert |
351 - : wait_client_key; | 160 - : wait_client_key; |
352 + if (ss->opt.requestCertificate && | 161 + if (ss->opt.requestCertificate && |
353 + !ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 162 + !ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
354 + ss->ssl3.hs.ws = wait_client_cert; | 163 + ss->ssl3.hs.ws = wait_client_cert; |
355 + } else { | 164 + } else { |
356 + ss->ssl3.hs.ws = wait_client_key; | 165 + ss->ssl3.hs.ws = wait_client_key; |
357 + } | 166 + } |
358 + | 167 + |
359 return SECSuccess; | 168 return SECSuccess; |
360 } | 169 } |
361 | 170 |
362 @@ -7355,7 +7374,11 @@ | 171 @@ -7446,7 +7472,11 @@ ssl3_HandleCertificateVerify(sslSocket * |
363 desc = isTLS ? decode_error : illegal_parameter; | 172 desc = isTLS ? decode_error : illegal_parameter; |
364 goto alert_loser; /* malformed */ | 173 goto alert_loser; /* malformed */ |
365 } | 174 } |
366 - ss->ssl3.hs.ws = wait_change_cipher; | 175 - ss->ssl3.hs.ws = wait_change_cipher; |
367 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 176 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
368 + ss->ssl3.hs.ws = wait_finished; | 177 + ss->ssl3.hs.ws = wait_finished; |
369 + } else { | 178 + } else { |
370 + ss->ssl3.hs.ws = wait_change_cipher; | 179 + ss->ssl3.hs.ws = wait_change_cipher; |
371 + } | 180 + } |
372 return SECSuccess; | 181 return SECSuccess; |
373 | 182 |
374 alert_loser: | 183 alert_loser: |
375 @@ -8348,7 +8371,11 @@ | 184 @@ -8346,7 +8376,11 @@ ssl3_HandleCertificate(sslSocket *ss, SS |
376 | 185 » } |
377 cert_block: | 186 } else { |
378 if (ss->sec.isServer) { | 187 server_no_cert: |
379 - ss->ssl3.hs.ws = wait_client_key; | 188 - ss->ssl3.hs.ws = wait_client_key; |
380 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 189 + if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
381 + ss->ssl3.hs.ws = wait_cert_verify; | 190 + ss->ssl3.hs.ws = wait_cert_verify; |
382 + } else { | 191 + } else { |
383 + ss->ssl3.hs.ws = wait_client_key; | 192 + ss->ssl3.hs.ws = wait_client_key; |
384 + } | 193 + } |
385 } else { | 194 } |
386 » ss->ssl3.hs.ws = wait_cert_request; /* disallow server_key_exchange */ | 195 |
387 » if (ss->ssl3.hs.kea_def->is_limited || | 196 PORT_Assert(rv == SECSuccess); |
388 @@ -8978,6 +9005,8 @@ | 197 @@ -8959,6 +8993,8 @@ ssl3_HandleHandshakeMessage(sslSocket *s |
389 if (type == finished) { | 198 if (type == finished) { |
390 sender = ss->sec.isServer ? sender_client : sender_server; | 199 sender = ss->sec.isServer ? sender_client : sender_server; |
391 rSpec = ss->ssl3.crSpec; | 200 rSpec = ss->ssl3.crSpec; |
392 + } else if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { | 201 + } else if (ssl3_ExtensionNegotiated(ss, ssl_encrypted_client_certs)) { |
393 + rSpec = ss->ssl3.crSpec; | 202 + rSpec = ss->ssl3.crSpec; |
394 } | 203 } |
395 rv = ssl3_ComputeHandshakeHashes(ss, rSpec, &hashes, sender); | 204 rv = ssl3_ComputeHandshakeHashes(ss, rSpec, &hashes, sender); |
396 } | 205 } |
397 Index: net/third_party/nss/ssl/sslt.h | 206 diff -up a/src/net/third_party/nss/ssl/ssl3ext.c b/src/net/third_party/nss/ssl/s
sl3ext.c |
398 =================================================================== | 207 --- a/src/net/third_party/nss/ssl/ssl3ext.c» 2012-02-29 17:12:15.720044263 -0
800 |
399 --- net/third_party/nss/ssl/sslt.h» (revision 108962) | 208 +++ b/src/net/third_party/nss/ssl/ssl3ext.c» 2012-02-29 20:00:15.851981917 -0
800 |
400 +++ net/third_party/nss/ssl/sslt.h» (working copy) | 209 @@ -84,6 +84,12 @@ static SECStatus ssl3_ServerHandleNextPr |
401 @@ -206,10 +206,11 @@ | 210 » » » PRUint16 ex_type, SECItem *data); |
| 211 static PRInt32 ssl3_ClientSendNextProtoNegoXtn(sslSocket *ss, PRBool append, |
| 212 » » » » » PRUint32 maxBytes); |
| 213 +static SECStatus ssl3_ServerHandleEncryptedClientCertsXtn(sslSocket *ss, |
| 214 + PRUint16 ex_type, SECItem *data); |
| 215 +static SECStatus ssl3_ClientHandleEncryptedClientCertsXtn(sslSocket *ss, |
| 216 + PRUint16 ex_type, SECItem *data); |
| 217 +static PRInt32 ssl3_SendEncryptedClientCertsXtn(sslSocket *ss, |
| 218 + PRBool append, PRUint32 maxBytes); |
| 219 |
| 220 /* |
| 221 * Write bytes. Using this function means the SECItem structure |
| 222 @@ -240,6 +246,7 @@ static const ssl3HelloExtensionHandler c |
| 223 { ssl_ec_point_formats_xtn, &ssl3_HandleSupportedPointFormatsXtn }, |
| 224 #endif |
| 225 { ssl_session_ticket_xtn, &ssl3_ServerHandleSessionTicketXtn }, |
| 226 + { ssl_encrypted_client_certs, &ssl3_ServerHandleEncryptedClientCertsXtn }, |
| 227 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, |
| 228 { ssl_next_proto_nego_xtn, &ssl3_ServerHandleNextProtoNegoXtn }, |
| 229 { ssl_ob_cert_xtn, &ssl3_ServerHandleOBCertXtn }, |
| 230 @@ -252,6 +259,7 @@ static const ssl3HelloExtensionHandler s |
| 231 { ssl_server_name_xtn, &ssl3_HandleServerNameXtn }, |
| 232 /* TODO: add a handler for ssl_ec_point_formats_xtn */ |
| 233 { ssl_session_ticket_xtn, &ssl3_ClientHandleSessionTicketXtn }, |
| 234 + { ssl_encrypted_client_certs, &ssl3_ClientHandleEncryptedClientCertsXtn }, |
| 235 { ssl_renegotiation_info_xtn, &ssl3_HandleRenegotiationInfoXtn }, |
| 236 { ssl_next_proto_nego_xtn, &ssl3_ClientHandleNextProtoNegoXtn }, |
| 237 { ssl_cert_status_xtn, &ssl3_ClientHandleStatusRequestXtn }, |
| 238 @@ -279,6 +287,7 @@ ssl3HelloExtensionSender clientHelloSend |
| 239 { ssl_ec_point_formats_xtn, &ssl3_SendSupportedPointFormatsXtn }, |
| 240 #endif |
| 241 { ssl_session_ticket_xtn, &ssl3_SendSessionTicketXtn }, |
| 242 + { ssl_encrypted_client_certs, &ssl3_SendEncryptedClientCertsXtn }, |
| 243 { ssl_next_proto_nego_xtn, &ssl3_ClientSendNextProtoNegoXtn }, |
| 244 { ssl_cert_status_xtn, &ssl3_ClientSendStatusRequestXtn }, |
| 245 { ssl_ob_cert_xtn, &ssl3_SendOBCertXtn } |
| 246 @@ -1083,6 +1092,18 @@ ssl3_ClientHandleSessionTicketXtn(sslSoc |
| 247 return SECSuccess; |
| 248 } |
| 249 |
| 250 +static SECStatus |
| 251 +ssl3_ClientHandleEncryptedClientCertsXtn(sslSocket *ss, PRUint16 ex_type, |
| 252 +» SECItem *data) |
| 253 +{ |
| 254 + if (data->len != 0) |
| 255 +» return SECFailure; |
| 256 + |
| 257 + /* Keep track of negotiated extensions. */ |
| 258 + ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; |
| 259 + return SECSuccess; |
| 260 +} |
| 261 + |
| 262 SECStatus |
| 263 ssl3_ServerHandleSessionTicketXtn(sslSocket *ss, PRUint16 ex_type, |
| 264 SECItem *data) |
| 265 @@ -1496,6 +1517,24 @@ loser: |
| 266 return rv; |
| 267 } |
| 268 |
| 269 +static SECStatus |
| 270 +ssl3_ServerHandleEncryptedClientCertsXtn(sslSocket *ss, PRUint16 ex_type, |
| 271 +» SECItem *data) |
| 272 +{ |
| 273 + SECStatus rv = SECSuccess; |
| 274 + |
| 275 + if (data->len != 0) |
| 276 +» return SECFailure; |
| 277 + |
| 278 + if (ss->opt.encryptClientCerts) { |
| 279 +» ss->xtnData.negotiated[ss->xtnData.numNegotiated++] = ex_type; |
| 280 +» rv = ssl3_RegisterServerHelloExtensionSender( |
| 281 +» ss, ex_type, ssl3_SendEncryptedClientCertsXtn); |
| 282 + } |
| 283 + |
| 284 + return rv; |
| 285 +} |
| 286 + |
| 287 /* |
| 288 * Read bytes. Using this function means the SECItem structure |
| 289 * cannot be freed. The caller is expected to call this function |
| 290 @@ -1695,6 +1734,33 @@ ssl3_SendRenegotiationInfoXtn( |
| 291 return needed; |
| 292 } |
| 293 |
| 294 +static PRInt32 |
| 295 +ssl3_SendEncryptedClientCertsXtn( |
| 296 +» » » sslSocket * ss, |
| 297 +» » » PRBool append, |
| 298 +» » » PRUint32 maxBytes) |
| 299 +{ |
| 300 + PRInt32 needed; |
| 301 + |
| 302 + if (!ss->opt.encryptClientCerts) |
| 303 +» return 0; |
| 304 + |
| 305 + needed = 4; /* two bytes of type and two of length. */ |
| 306 + if (append && maxBytes >= needed) { |
| 307 +» SECStatus rv; |
| 308 +» rv = ssl3_AppendHandshakeNumber(ss, ssl_encrypted_client_certs, 2); |
| 309 +» if (rv != SECSuccess) |
| 310 +» return -1; |
| 311 +» rv = ssl3_AppendHandshakeNumber(ss, 0 /* length */, 2); |
| 312 +» if (rv != SECSuccess) |
| 313 +» return -1; |
| 314 +» ss->xtnData.advertised[ss->xtnData.numAdvertised++] = |
| 315 +» ssl_encrypted_client_certs; |
| 316 + } |
| 317 + |
| 318 + return needed; |
| 319 +} |
| 320 + |
| 321 /* This function runs in both the client and server. */ |
| 322 static SECStatus |
| 323 ssl3_HandleRenegotiationInfoXtn(sslSocket *ss, PRUint16 ex_type, SECItem *data) |
| 324 diff -up a/src/net/third_party/nss/ssl/sslsock.c b/src/net/third_party/nss/ssl/s
slsock.c |
| 325 --- a/src/net/third_party/nss/ssl/sslsock.c» 2012-02-29 17:49:08.431530583 -0
800 |
| 326 +++ b/src/net/third_party/nss/ssl/sslsock.c» 2012-02-29 20:00:15.851981917 -0
800 |
| 327 @@ -188,6 +188,7 @@ static sslOptions ssl_defaults = { |
| 328 PR_TRUE, /* cbcRandomIV */ |
| 329 PR_FALSE, /* enableOCSPStapling */ |
| 330 PR_FALSE, /* enableOBCerts */ |
| 331 + PR_FALSE, /* encryptClientCerts */ |
| 332 }; |
| 333 |
| 334 sslSessionIDLookupFunc ssl_sid_lookup; |
| 335 @@ -755,6 +756,10 @@ SSL_OptionSet(PRFileDesc *fd, PRInt32 wh |
| 336 » ss->opt.enableOBCerts = on; |
| 337 » break; |
| 338 |
| 339 + case SSL_ENCRYPT_CLIENT_CERTS: |
| 340 +» ss->opt.encryptClientCerts = on; |
| 341 +» break; |
| 342 + |
| 343 default: |
| 344 » PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 345 » rv = SECFailure; |
| 346 @@ -822,6 +827,8 @@ SSL_OptionGet(PRFileDesc *fd, PRInt32 wh |
| 347 case SSL_CBC_RANDOM_IV: on = ss->opt.cbcRandomIV; break; |
| 348 case SSL_ENABLE_OCSP_STAPLING: on = ss->opt.enableOCSPStapling; break; |
| 349 case SSL_ENABLE_OB_CERTS: on = ss->opt.enableOBCerts; break; |
| 350 + case SSL_ENCRYPT_CLIENT_CERTS: |
| 351 + on = ss->opt.encryptClientCerts; break; |
| 352 |
| 353 default: |
| 354 » PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 355 @@ -880,6 +887,8 @@ SSL_OptionGetDefault(PRInt32 which, PRBo |
| 356 » on = ssl_defaults.enableOCSPStapling; |
| 357 » break; |
| 358 case SSL_ENABLE_OB_CERTS: on = ssl_defaults.enableOBCerts; break; |
| 359 + case SSL_ENCRYPT_CLIENT_CERTS: |
| 360 + on = ssl_defaults.encryptClientCerts; break; |
| 361 |
| 362 default: |
| 363 » PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 364 @@ -1047,6 +1056,10 @@ SSL_OptionSetDefault(PRInt32 which, PRBo |
| 365 » ssl_defaults.enableOBCerts = on; |
| 366 » break; |
| 367 |
| 368 + case SSL_ENCRYPT_CLIENT_CERTS: |
| 369 +» ssl_defaults.encryptClientCerts = on; |
| 370 +» break; |
| 371 + |
| 372 default: |
| 373 » PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 374 » return SECFailure; |
| 375 diff -up a/src/net/third_party/nss/ssl/sslt.h b/src/net/third_party/nss/ssl/sslt
.h |
| 376 --- a/src/net/third_party/nss/ssl/sslt.h» 2012-02-29 17:12:15.780045080 -0
800 |
| 377 +++ b/src/net/third_party/nss/ssl/sslt.h» 2012-02-29 19:34:43.921452065 -0
800 |
| 378 @@ -205,10 +205,11 @@ typedef enum { |
| 379 #endif |
402 ssl_session_ticket_xtn = 35, | 380 ssl_session_ticket_xtn = 35, |
403 ssl_next_proto_neg_xtn = 13172, | 381 ssl_next_proto_nego_xtn = 13172, |
404 ssl_cached_info_xtn = 13173, | |
405 + ssl_encrypted_client_certs = 13180, /* not IANA assigned. */ | 382 + ssl_encrypted_client_certs = 13180, /* not IANA assigned. */ |
406 ssl_renegotiation_info_xtn = 0xff01, /* experimental number */ | 383 ssl_renegotiation_info_xtn = 0xff01, /* experimental number */ |
407 ssl_ob_cert_xtn = 13175 /* experimental number */ | 384 ssl_ob_cert_xtn = 13175 /* experimental number */ |
408 } SSLExtensionType; | 385 } SSLExtensionType; |
409 | 386 |
410 -#define SSL_MAX_EXTENSIONS 9 | 387 -#define SSL_MAX_EXTENSIONS 8 |
411 +#define SSL_MAX_EXTENSIONS 10 | 388 +#define SSL_MAX_EXTENSIONS 9 |
412 | 389 |
413 #endif /* __sslt_h_ */ | 390 #endif /* __sslt_h_ */ |
OLD | NEW |