diff options
author | jsing <> | 2014-04-14 15:15:33 +0000 |
---|---|---|
committer | jsing <> | 2014-04-14 15:15:33 +0000 |
commit | 30f92658fa4e1357cfcee9c077a21e928970d290 (patch) | |
tree | 225d880512d3748d996f5d84d5d01521efe52b02 /src/lib/libssl/s23_srvr.c | |
parent | 6c233db50b8fc1d31e373868a83572c35271ca51 (diff) | |
download | openbsd-30f92658fa4e1357cfcee9c077a21e928970d290.tar.gz openbsd-30f92658fa4e1357cfcee9c077a21e928970d290.tar.bz2 openbsd-30f92658fa4e1357cfcee9c077a21e928970d290.zip |
First pass at applying KNF to the OpenSSL code, which almost makes it
readable. This pass is whitespace only and can readily be verified using
tr and md5.
Diffstat (limited to 'src/lib/libssl/s23_srvr.c')
-rw-r--r-- | src/lib/libssl/s23_srvr.c | 564 |
1 files changed, 260 insertions, 304 deletions
diff --git a/src/lib/libssl/s23_srvr.c b/src/lib/libssl/s23_srvr.c index 2ac8786c62..35db7b4992 100644 --- a/src/lib/libssl/s23_srvr.c +++ b/src/lib/libssl/s23_srvr.c | |||
@@ -121,227 +121,209 @@ | |||
121 | 121 | ||
122 | static const SSL_METHOD *ssl23_get_server_method(int ver); | 122 | static const SSL_METHOD *ssl23_get_server_method(int ver); |
123 | int ssl23_get_client_hello(SSL *s); | 123 | int ssl23_get_client_hello(SSL *s); |
124 | static const SSL_METHOD *ssl23_get_server_method(int ver) | 124 | static const SSL_METHOD |
125 | { | 125 | *ssl23_get_server_method(int ver) |
126 | { | ||
126 | #ifndef OPENSSL_NO_SSL2 | 127 | #ifndef OPENSSL_NO_SSL2 |
127 | if (ver == SSL2_VERSION) | 128 | if (ver == SSL2_VERSION) |
128 | return(SSLv2_server_method()); | 129 | return (SSLv2_server_method()); |
129 | #endif | 130 | #endif |
130 | if (ver == SSL3_VERSION) | 131 | if (ver == SSL3_VERSION) |
131 | return(SSLv3_server_method()); | 132 | return (SSLv3_server_method()); |
132 | else if (ver == TLS1_VERSION) | 133 | else if (ver == TLS1_VERSION) |
133 | return(TLSv1_server_method()); | 134 | return (TLSv1_server_method()); |
134 | else if (ver == TLS1_1_VERSION) | 135 | else if (ver == TLS1_1_VERSION) |
135 | return(TLSv1_1_server_method()); | 136 | return (TLSv1_1_server_method()); |
136 | else if (ver == TLS1_2_VERSION) | 137 | else if (ver == TLS1_2_VERSION) |
137 | return(TLSv1_2_server_method()); | 138 | return (TLSv1_2_server_method()); |
138 | else | 139 | else |
139 | return(NULL); | 140 | return (NULL); |
140 | } | 141 | } |
141 | 142 | ||
142 | IMPLEMENT_ssl23_meth_func(SSLv23_server_method, | 143 | IMPLEMENT_ssl23_meth_func(SSLv23_server_method, |
143 | ssl23_accept, | 144 | ssl23_accept, ssl_undefined_function, ssl23_get_server_method) |
144 | ssl_undefined_function, | ||
145 | ssl23_get_server_method) | ||
146 | 145 | ||
147 | int ssl23_accept(SSL *s) | 146 | int |
148 | { | 147 | ssl23_accept(SSL *s) |
148 | { | ||
149 | BUF_MEM *buf; | 149 | BUF_MEM *buf; |
150 | unsigned long Time=(unsigned long)time(NULL); | 150 | unsigned long Time = (unsigned long)time(NULL); |
151 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 151 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
152 | int ret= -1; | 152 | int ret = -1; |
153 | int new_state,state; | 153 | int new_state, state; |
154 | 154 | ||
155 | RAND_add(&Time,sizeof(Time),0); | 155 | RAND_add(&Time, sizeof(Time), 0); |
156 | ERR_clear_error(); | 156 | ERR_clear_error(); |
157 | errno = 0; | 157 | errno = 0; |
158 | 158 | ||
159 | if (s->info_callback != NULL) | 159 | if (s->info_callback != NULL) |
160 | cb=s->info_callback; | 160 | cb = s->info_callback; |
161 | else if (s->ctx->info_callback != NULL) | 161 | else if (s->ctx->info_callback != NULL) |
162 | cb=s->ctx->info_callback; | 162 | cb = s->ctx->info_callback; |
163 | 163 | ||
164 | s->in_handshake++; | 164 | s->in_handshake++; |
165 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); | 165 | if (!SSL_in_init(s) || SSL_in_before(s)) |
166 | SSL_clear(s); | ||
166 | 167 | ||
167 | for (;;) | 168 | for (;;) { |
168 | { | 169 | state = s->state; |
169 | state=s->state; | ||
170 | 170 | ||
171 | switch(s->state) | 171 | switch (s->state) { |
172 | { | ||
173 | case SSL_ST_BEFORE: | 172 | case SSL_ST_BEFORE: |
174 | case SSL_ST_ACCEPT: | 173 | case SSL_ST_ACCEPT: |
175 | case SSL_ST_BEFORE|SSL_ST_ACCEPT: | 174 | case SSL_ST_BEFORE|SSL_ST_ACCEPT: |
176 | case SSL_ST_OK|SSL_ST_ACCEPT: | 175 | case SSL_ST_OK|SSL_ST_ACCEPT: |
177 | 176 | ||
178 | s->server=1; | 177 | s->server = 1; |
179 | if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); | 178 | if (cb != NULL) |
179 | cb(s, SSL_CB_HANDSHAKE_START, 1); | ||
180 | 180 | ||
181 | /* s->version=SSL3_VERSION; */ | 181 | /* s->version=SSL3_VERSION; */ |
182 | s->type=SSL_ST_ACCEPT; | 182 | s->type = SSL_ST_ACCEPT; |
183 | 183 | ||
184 | if (s->init_buf == NULL) | 184 | if (s->init_buf == NULL) { |
185 | { | 185 | if ((buf = BUF_MEM_new()) == NULL) { |
186 | if ((buf=BUF_MEM_new()) == NULL) | 186 | ret = -1; |
187 | { | ||
188 | ret= -1; | ||
189 | goto end; | 187 | goto end; |
190 | } | 188 | } |
191 | if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH)) | 189 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { |
192 | { | 190 | ret = -1; |
193 | ret= -1; | ||
194 | goto end; | 191 | goto end; |
195 | } | ||
196 | s->init_buf=buf; | ||
197 | } | 192 | } |
193 | s->init_buf = buf; | ||
194 | } | ||
198 | 195 | ||
199 | ssl3_init_finished_mac(s); | 196 | ssl3_init_finished_mac(s); |
200 | 197 | ||
201 | s->state=SSL23_ST_SR_CLNT_HELLO_A; | 198 | s->state = SSL23_ST_SR_CLNT_HELLO_A; |
202 | s->ctx->stats.sess_accept++; | 199 | s->ctx->stats.sess_accept++; |
203 | s->init_num=0; | 200 | s->init_num = 0; |
204 | break; | 201 | break; |
205 | 202 | ||
206 | case SSL23_ST_SR_CLNT_HELLO_A: | 203 | case SSL23_ST_SR_CLNT_HELLO_A: |
207 | case SSL23_ST_SR_CLNT_HELLO_B: | 204 | case SSL23_ST_SR_CLNT_HELLO_B: |
208 | 205 | ||
209 | s->shutdown=0; | 206 | s->shutdown = 0; |
210 | ret=ssl23_get_client_hello(s); | 207 | ret = ssl23_get_client_hello(s); |
211 | if (ret >= 0) cb=NULL; | 208 | if (ret >= 0) |
209 | cb = NULL; | ||
212 | goto end; | 210 | goto end; |
213 | /* break; */ | 211 | /* break; */ |
214 | 212 | ||
215 | default: | 213 | default: |
216 | SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE); | 214 | SSLerr(SSL_F_SSL23_ACCEPT, SSL_R_UNKNOWN_STATE); |
217 | ret= -1; | 215 | ret = -1; |
218 | goto end; | 216 | goto end; |
219 | /* break; */ | 217 | /* break; */ |
220 | } | 218 | } |
221 | 219 | ||
222 | if ((cb != NULL) && (s->state != state)) | 220 | if ((cb != NULL) && (s->state != state)) { |
223 | { | 221 | new_state = s->state; |
224 | new_state=s->state; | 222 | s->state = state; |
225 | s->state=state; | 223 | cb(s, SSL_CB_ACCEPT_LOOP, 1); |
226 | cb(s,SSL_CB_ACCEPT_LOOP,1); | 224 | s->state = new_state; |
227 | s->state=new_state; | ||
228 | } | ||
229 | } | 225 | } |
226 | } | ||
230 | end: | 227 | end: |
231 | s->in_handshake--; | 228 | s->in_handshake--; |
232 | if (cb != NULL) | 229 | if (cb != NULL) |
233 | cb(s,SSL_CB_ACCEPT_EXIT,ret); | 230 | cb(s, SSL_CB_ACCEPT_EXIT, ret); |
234 | return(ret); | 231 | return (ret); |
235 | } | 232 | } |
236 | 233 | ||
237 | 234 | ||
238 | int ssl23_get_client_hello(SSL *s) | 235 | int |
239 | { | 236 | ssl23_get_client_hello(SSL *s) |
237 | { | ||
240 | char buf_space[11]; /* Request this many bytes in initial read. | 238 | char buf_space[11]; /* Request this many bytes in initial read. |
241 | * We can detect SSL 3.0/TLS 1.0 Client Hellos | 239 | * We can detect SSL 3.0/TLS 1.0 Client Hellos |
242 | * ('type == 3') correctly only when the following | 240 | * ('type == 3') correctly only when the following |
243 | * is in a single record, which is not guaranteed by | 241 | * is in a single record, which is not guaranteed by |
244 | * the protocol specification: | 242 | * the protocol specification: |
245 | * Byte Content | 243 | * Byte Content |
246 | * 0 type \ | 244 | * 0 type \ |
247 | * 1/2 version > record header | 245 | * 1/2 version > record header |
248 | * 3/4 length / | 246 | * 3/4 length / |
249 | * 5 msg_type \ | 247 | * 5 msg_type \ |
250 | * 6-8 length > Client Hello message | 248 | * 6-8 length > Client Hello message |
251 | * 9/10 client_version / | 249 | * 9/10 client_version / |
252 | */ | 250 | */ |
253 | char *buf= &(buf_space[0]); | 251 | char *buf = &(buf_space[0]); |
254 | unsigned char *p,*d,*d_len,*dd; | 252 | unsigned char *p, *d, *d_len, *dd; |
255 | unsigned int i; | 253 | unsigned int i; |
256 | unsigned int csl,sil,cl; | 254 | unsigned int csl, sil, cl; |
257 | int n=0,j; | 255 | int n = 0, j; |
258 | int type=0; | 256 | int type = 0; |
259 | int v[2]; | 257 | int v[2]; |
260 | 258 | ||
261 | if (s->state == SSL23_ST_SR_CLNT_HELLO_A) | 259 | if (s->state == SSL23_ST_SR_CLNT_HELLO_A) { |
262 | { | ||
263 | /* read the initial header */ | 260 | /* read the initial header */ |
264 | v[0]=v[1]=0; | 261 | v[0] = v[1] = 0; |
265 | 262 | ||
266 | if (!ssl3_setup_buffers(s)) goto err; | 263 | if (!ssl3_setup_buffers(s)) |
264 | goto err; | ||
267 | 265 | ||
268 | n=ssl23_read_bytes(s, sizeof buf_space); | 266 | n = ssl23_read_bytes(s, sizeof buf_space); |
269 | if (n != sizeof buf_space) return(n); /* n == -1 || n == 0 */ | 267 | if (n != sizeof buf_space) |
268 | return(n); /* n == -1 || n == 0 */ | ||
270 | 269 | ||
271 | p=s->packet; | 270 | p = s->packet; |
272 | 271 | ||
273 | memcpy(buf,p,n); | 272 | memcpy(buf, p, n); |
274 | 273 | ||
275 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) | 274 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) { |
276 | { | ||
277 | /* | 275 | /* |
278 | * SSLv2 header | 276 | * SSLv2 header |
279 | */ | 277 | */ |
280 | if ((p[3] == 0x00) && (p[4] == 0x02)) | 278 | if ((p[3] == 0x00) && (p[4] == 0x02)) { |
281 | { | 279 | v[0] = p[3]; |
282 | v[0]=p[3]; v[1]=p[4]; | 280 | v[1] = p[4]; |
283 | /* SSLv2 */ | 281 | /* SSLv2 */ |
284 | if (!(s->options & SSL_OP_NO_SSLv2)) | 282 | if (!(s->options & SSL_OP_NO_SSLv2)) |
285 | type=1; | 283 | type = 1; |
286 | } | 284 | } else if (p[3] == SSL3_VERSION_MAJOR) { |
287 | else if (p[3] == SSL3_VERSION_MAJOR) | 285 | v[0] = p[3]; |
288 | { | 286 | v[1] = p[4]; |
289 | v[0]=p[3]; v[1]=p[4]; | ||
290 | /* SSLv3/TLSv1 */ | 287 | /* SSLv3/TLSv1 */ |
291 | if (p[4] >= TLS1_VERSION_MINOR) | 288 | if (p[4] >= TLS1_VERSION_MINOR) { |
292 | { | ||
293 | if (p[4] >= TLS1_2_VERSION_MINOR && | 289 | if (p[4] >= TLS1_2_VERSION_MINOR && |
294 | !(s->options & SSL_OP_NO_TLSv1_2)) | 290 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
295 | { | 291 | s->version = TLS1_2_VERSION; |
296 | s->version=TLS1_2_VERSION; | 292 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
297 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 293 | } else if (p[4] >= TLS1_1_VERSION_MINOR && |
298 | } | 294 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
299 | else if (p[4] >= TLS1_1_VERSION_MINOR && | 295 | s->version = TLS1_1_VERSION; |
300 | !(s->options & SSL_OP_NO_TLSv1_1)) | ||
301 | { | ||
302 | s->version=TLS1_1_VERSION; | ||
303 | /* type=2; */ /* done later to survive restarts */ | 296 | /* type=2; */ /* done later to survive restarts */ |
304 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 297 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
305 | } | 298 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
306 | else if (!(s->options & SSL_OP_NO_TLSv1)) | 299 | s->version = TLS1_VERSION; |
307 | { | ||
308 | s->version=TLS1_VERSION; | ||
309 | /* type=2; */ /* done later to survive restarts */ | 300 | /* type=2; */ /* done later to survive restarts */ |
310 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 301 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
311 | } | 302 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
312 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 303 | s->version = SSL3_VERSION; |
313 | { | ||
314 | s->version=SSL3_VERSION; | ||
315 | /* type=2; */ | 304 | /* type=2; */ |
316 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 305 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
317 | } | 306 | } else if (!(s->options & SSL_OP_NO_SSLv2)) { |
318 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 307 | type = 1; |
319 | { | ||
320 | type=1; | ||
321 | } | ||
322 | } | 308 | } |
323 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 309 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
324 | { | 310 | s->version = SSL3_VERSION; |
325 | s->version=SSL3_VERSION; | ||
326 | /* type=2; */ | 311 | /* type=2; */ |
327 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 312 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
328 | } | 313 | } else if (!(s->options & SSL_OP_NO_SSLv2)) |
329 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 314 | type = 1; |
330 | type=1; | ||
331 | 315 | ||
332 | } | ||
333 | } | 316 | } |
334 | else if ((p[0] == SSL3_RT_HANDSHAKE) && | 317 | } else if ((p[0] == SSL3_RT_HANDSHAKE) && |
335 | (p[1] == SSL3_VERSION_MAJOR) && | 318 | (p[1] == SSL3_VERSION_MAJOR) && |
336 | (p[5] == SSL3_MT_CLIENT_HELLO) && | 319 | (p[5] == SSL3_MT_CLIENT_HELLO) && |
337 | ((p[3] == 0 && p[4] < 5 /* silly record length? */) | 320 | ((p[3] == 0 && p[4] < 5 /* silly record length? */) |
338 | || (p[9] >= p[1]))) | 321 | || (p[9] >= p[1]))) { |
339 | { | ||
340 | /* | 322 | /* |
341 | * SSLv3 or tls1 header | 323 | * SSLv3 or tls1 header |
342 | */ | 324 | */ |
343 | 325 | ||
344 | v[0]=p[1]; /* major version (= SSL3_VERSION_MAJOR) */ | 326 | v[0] = p[1]; /* major version (= SSL3_VERSION_MAJOR) */ |
345 | /* We must look at client_version inside the Client Hello message | 327 | /* We must look at client_version inside the Client Hello message |
346 | * to get the correct minor version. | 328 | * to get the correct minor version. |
347 | * However if we have only a pathologically small fragment of the | 329 | * However if we have only a pathologically small fragment of the |
@@ -350,127 +332,108 @@ int ssl23_get_client_hello(SSL *s) | |||
350 | * No known SSL 3.0 client fragments ClientHello like this, | 332 | * No known SSL 3.0 client fragments ClientHello like this, |
351 | * so we simply assume TLS 1.0 to avoid protocol version downgrade | 333 | * so we simply assume TLS 1.0 to avoid protocol version downgrade |
352 | * attacks. */ | 334 | * attacks. */ |
353 | if (p[3] == 0 && p[4] < 6) | 335 | if (p[3] == 0 && p[4] < 6) { |
354 | { | ||
355 | #if 0 | 336 | #if 0 |
356 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_SMALL); | 337 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_TOO_SMALL); |
357 | goto err; | 338 | goto err; |
358 | #else | 339 | #else |
359 | v[1] = TLS1_VERSION_MINOR; | 340 | v[1] = TLS1_VERSION_MINOR; |
360 | #endif | 341 | #endif |
361 | } | 342 | } |
362 | /* if major version number > 3 set minor to a value | 343 | /* if major version number > 3 set minor to a value |
363 | * which will use the highest version 3 we support. | 344 | * which will use the highest version 3 we support. |
364 | * If TLS 2.0 ever appears we will need to revise | 345 | * If TLS 2.0 ever appears we will need to revise |
365 | * this.... | 346 | * this.... |
366 | */ | 347 | */ |
367 | else if (p[9] > SSL3_VERSION_MAJOR) | 348 | else if (p[9] > SSL3_VERSION_MAJOR) |
368 | v[1]=0xff; | 349 | v[1] = 0xff; |
369 | else | 350 | else |
370 | v[1]=p[10]; /* minor version according to client_version */ | 351 | v[1] = p[10]; /* minor version according to client_version */ |
371 | if (v[1] >= TLS1_VERSION_MINOR) | 352 | if (v[1] >= TLS1_VERSION_MINOR) { |
372 | { | ||
373 | if (v[1] >= TLS1_2_VERSION_MINOR && | 353 | if (v[1] >= TLS1_2_VERSION_MINOR && |
374 | !(s->options & SSL_OP_NO_TLSv1_2)) | 354 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
375 | { | 355 | s->version = TLS1_2_VERSION; |
376 | s->version=TLS1_2_VERSION; | 356 | type = 3; |
377 | type=3; | 357 | } else if (v[1] >= TLS1_1_VERSION_MINOR && |
378 | } | 358 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
379 | else if (v[1] >= TLS1_1_VERSION_MINOR && | 359 | s->version = TLS1_1_VERSION; |
380 | !(s->options & SSL_OP_NO_TLSv1_1)) | 360 | type = 3; |
381 | { | 361 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
382 | s->version=TLS1_1_VERSION; | 362 | s->version = TLS1_VERSION; |
383 | type=3; | 363 | type = 3; |
384 | } | 364 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
385 | else if (!(s->options & SSL_OP_NO_TLSv1)) | 365 | s->version = SSL3_VERSION; |
386 | { | 366 | type = 3; |
387 | s->version=TLS1_VERSION; | ||
388 | type=3; | ||
389 | } | ||
390 | else if (!(s->options & SSL_OP_NO_SSLv3)) | ||
391 | { | ||
392 | s->version=SSL3_VERSION; | ||
393 | type=3; | ||
394 | } | ||
395 | } | 367 | } |
396 | else | 368 | } else { |
397 | { | ||
398 | /* client requests SSL 3.0 */ | 369 | /* client requests SSL 3.0 */ |
399 | if (!(s->options & SSL_OP_NO_SSLv3)) | 370 | if (!(s->options & SSL_OP_NO_SSLv3)) { |
400 | { | 371 | s->version = SSL3_VERSION; |
401 | s->version=SSL3_VERSION; | 372 | type = 3; |
402 | type=3; | 373 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
403 | } | ||
404 | else if (!(s->options & SSL_OP_NO_TLSv1)) | ||
405 | { | ||
406 | /* we won't be able to use TLS of course, | 374 | /* we won't be able to use TLS of course, |
407 | * but this will send an appropriate alert */ | 375 | * but this will send an appropriate alert */ |
408 | s->version=TLS1_VERSION; | 376 | s->version = TLS1_VERSION; |
409 | type=3; | 377 | type = 3; |
410 | } | ||
411 | } | 378 | } |
412 | } | 379 | } |
413 | else if ((strncmp("GET ", (char *)p,4) == 0) || | 380 | } |
414 | (strncmp("POST ",(char *)p,5) == 0) || | 381 | else if ((strncmp("GET ", (char *)p, 4) == 0) || |
415 | (strncmp("HEAD ",(char *)p,5) == 0) || | 382 | (strncmp("POST ",(char *)p, 5) == 0) || |
416 | (strncmp("PUT ", (char *)p,4) == 0)) | 383 | (strncmp("HEAD ",(char *)p, 5) == 0) || |
417 | { | 384 | (strncmp("PUT ", (char *)p, 4) == 0)) { |
418 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST); | 385 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_HTTP_REQUEST); |
419 | goto err; | 386 | goto err; |
420 | } | 387 | } else if (strncmp("CONNECT", (char *)p, 7) == 0) { |
421 | else if (strncmp("CONNECT",(char *)p,7) == 0) | 388 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_HTTPS_PROXY_REQUEST); |
422 | { | ||
423 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST); | ||
424 | goto err; | 389 | goto err; |
425 | } | ||
426 | } | 390 | } |
391 | } | ||
427 | 392 | ||
428 | #ifdef OPENSSL_FIPS | 393 | #ifdef OPENSSL_FIPS |
429 | if (FIPS_mode() && (s->version < TLS1_VERSION)) | 394 | if (FIPS_mode() && (s->version < TLS1_VERSION)) { |
430 | { | ||
431 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, | 395 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, |
432 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 396 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
433 | goto err; | 397 | goto err; |
434 | } | 398 | } |
435 | #endif | 399 | #endif |
436 | 400 | ||
437 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) | 401 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) { |
438 | { | ||
439 | /* we have SSLv3/TLSv1 in an SSLv2 header | 402 | /* we have SSLv3/TLSv1 in an SSLv2 header |
440 | * (other cases skip this state) */ | 403 | * (other cases skip this state) */ |
441 | 404 | ||
442 | type=2; | 405 | type = 2; |
443 | p=s->packet; | 406 | p = s->packet; |
444 | v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ | 407 | v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ |
445 | v[1] = p[4]; | 408 | v[1] = p[4]; |
446 | 409 | ||
447 | n=((p[0]&0x7f)<<8)|p[1]; | 410 | n = ((p[0] & 0x7f) << 8) | p[1]; |
448 | if (n > (1024*4)) | 411 | if (n > (1024 * 4)) { |
449 | { | 412 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_TOO_LARGE); |
450 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE); | ||
451 | goto err; | 413 | goto err; |
452 | } | 414 | } |
453 | 415 | ||
454 | j=ssl23_read_bytes(s,n+2); | 416 | j = ssl23_read_bytes(s, n + 2); |
455 | if (j <= 0) return(j); | 417 | if (j <= 0) |
418 | return (j); | ||
456 | 419 | ||
457 | ssl3_finish_mac(s, s->packet+2, s->packet_length-2); | 420 | ssl3_finish_mac(s, s->packet + 2, s->packet_length - 2); |
458 | if (s->msg_callback) | 421 | if (s->msg_callback) |
459 | s->msg_callback(0, SSL2_VERSION, 0, s->packet+2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ | 422 | s->msg_callback(0, SSL2_VERSION, 0, s->packet + 2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ |
460 | 423 | ||
461 | p=s->packet; | 424 | p = s->packet; |
462 | p+=5; | 425 | p += 5; |
463 | n2s(p,csl); | 426 | n2s(p, csl); |
464 | n2s(p,sil); | 427 | n2s(p, sil); |
465 | n2s(p,cl); | 428 | n2s(p, cl); |
466 | d=(unsigned char *)s->init_buf->data; | 429 | d = (unsigned char *)s->init_buf->data; |
467 | if ((csl+sil+cl+11) != s->packet_length) /* We can't have TLS extensions in SSL 2.0 format | 430 | if ((csl + sil + cl + 11) != s->packet_length) /* We can't have TLS extensions in SSL 2.0 format |
468 | * Client Hello, can we? Error condition should be | 431 | * Client Hello, can we ? Error condition should be |
469 | * '>' otherweise */ | 432 | * '>' otherweise */ |
470 | { | 433 | { |
471 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_LENGTH_MISMATCH); | 434 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH); |
472 | goto err; | 435 | goto err; |
473 | } | 436 | } |
474 | 437 | ||
475 | /* record header: msg_type ... */ | 438 | /* record header: msg_type ... */ |
476 | *(d++) = SSL3_MT_CLIENT_HELLO; | 439 | *(d++) = SSL3_MT_CLIENT_HELLO; |
@@ -484,130 +447,122 @@ int ssl23_get_client_hello(SSL *s) | |||
484 | 447 | ||
485 | /* lets populate the random area */ | 448 | /* lets populate the random area */ |
486 | /* get the challenge_length */ | 449 | /* get the challenge_length */ |
487 | i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl; | 450 | i = (cl > SSL3_RANDOM_SIZE) ? SSL3_RANDOM_SIZE : cl; |
488 | memset(d,0,SSL3_RANDOM_SIZE); | 451 | memset(d, 0, SSL3_RANDOM_SIZE); |
489 | memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i); | 452 | memcpy(&(d[SSL3_RANDOM_SIZE - i]), &(p[csl + sil]), i); |
490 | d+=SSL3_RANDOM_SIZE; | 453 | d += SSL3_RANDOM_SIZE; |
491 | 454 | ||
492 | /* no session-id reuse */ | 455 | /* no session-id reuse */ |
493 | *(d++)=0; | 456 | *(d++) = 0; |
494 | 457 | ||
495 | /* ciphers */ | 458 | /* ciphers */ |
496 | j=0; | 459 | j = 0; |
497 | dd=d; | 460 | dd = d; |
498 | d+=2; | 461 | d += 2; |
499 | for (i=0; i<csl; i+=3) | 462 | for (i = 0; i < csl; i += 3) { |
500 | { | 463 | if (p[i] != 0) |
501 | if (p[i] != 0) continue; | 464 | continue; |
502 | *(d++)=p[i+1]; | 465 | *(d++) = p[i + 1]; |
503 | *(d++)=p[i+2]; | 466 | *(d++) = p[i + 2]; |
504 | j+=2; | 467 | j += 2; |
505 | } | 468 | } |
506 | s2n(j,dd); | 469 | s2n(j, dd); |
507 | 470 | ||
508 | /* COMPRESSION */ | 471 | /* COMPRESSION */ |
509 | *(d++)=1; | 472 | *(d++) = 1; |
510 | *(d++)=0; | 473 | *(d++) = 0; |
511 | 474 | ||
512 | #if 0 | 475 | #if 0 |
513 | /* copy any remaining data with may be extensions */ | 476 | /* copy any remaining data with may be extensions */ |
514 | p = p+csl+sil+cl; | 477 | p = p + csl + sil + cl; |
515 | while (p < s->packet+s->packet_length) | 478 | while (p < s->packet + s->packet_length) { |
516 | { | ||
517 | *(d++)=*(p++); | 479 | *(d++)=*(p++); |
518 | } | 480 | } |
519 | #endif | 481 | #endif |
520 | 482 | ||
521 | i = (d-(unsigned char *)s->init_buf->data) - 4; | 483 | i = (d - (unsigned char *)s->init_buf->data) - 4; |
522 | l2n3((long)i, d_len); | 484 | l2n3((long)i, d_len); |
523 | 485 | ||
524 | /* get the data reused from the init_buf */ | 486 | /* get the data reused from the init_buf */ |
525 | s->s3->tmp.reuse_message=1; | 487 | s->s3->tmp.reuse_message = 1; |
526 | s->s3->tmp.message_type=SSL3_MT_CLIENT_HELLO; | 488 | s->s3->tmp.message_type = SSL3_MT_CLIENT_HELLO; |
527 | s->s3->tmp.message_size=i; | 489 | s->s3->tmp.message_size = i; |
528 | } | 490 | } |
529 | 491 | ||
530 | /* imaginary new state (for program structure): */ | 492 | /* imaginary new state (for program structure): */ |
531 | /* s->state = SSL23_SR_CLNT_HELLO_C */ | 493 | /* s->state = SSL23_SR_CLNT_HELLO_C */ |
532 | 494 | ||
533 | if (type == 1) | 495 | if (type == 1) { |
534 | { | ||
535 | #ifdef OPENSSL_NO_SSL2 | 496 | #ifdef OPENSSL_NO_SSL2 |
536 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 497 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
537 | goto err; | 498 | goto err; |
538 | #else | 499 | #else |
539 | /* we are talking sslv2 */ | 500 | /* we are talking sslv2 */ |
540 | /* we need to clean up the SSLv3/TLSv1 setup and put in the | 501 | /* we need to clean up the SSLv3/TLSv1 setup and put in the |
541 | * sslv2 stuff. */ | 502 | * sslv2 stuff. */ |
542 | 503 | ||
543 | if (s->s2 == NULL) | 504 | if (s->s2 == NULL) { |
544 | { | ||
545 | if (!ssl2_new(s)) | 505 | if (!ssl2_new(s)) |
546 | goto err; | 506 | goto err; |
547 | } | 507 | } else |
548 | else | ||
549 | ssl2_clear(s); | 508 | ssl2_clear(s); |
550 | 509 | ||
551 | if (s->s3 != NULL) ssl3_free(s); | 510 | if (s->s3 != NULL) |
511 | ssl3_free(s); | ||
552 | 512 | ||
553 | if (!BUF_MEM_grow_clean(s->init_buf, | 513 | if (!BUF_MEM_grow_clean(s->init_buf, |
554 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) | 514 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) { |
555 | { | ||
556 | goto err; | 515 | goto err; |
557 | } | 516 | } |
558 | 517 | ||
559 | s->state=SSL2_ST_GET_CLIENT_HELLO_A; | 518 | s->state = SSL2_ST_GET_CLIENT_HELLO_A; |
560 | if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3) | 519 | if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3) |
561 | s->s2->ssl2_rollback=0; | 520 | s->s2->ssl2_rollback = 0; |
562 | else | 521 | else |
563 | /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0 | 522 | /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0 |
564 | * (SSL 3.0 draft/RFC 2246, App. E.2) */ | 523 | * (SSL 3.0 draft/RFC 2246, App. E.2) */ |
565 | s->s2->ssl2_rollback=1; | 524 | s->s2->ssl2_rollback = 1; |
566 | 525 | ||
567 | /* setup the n bytes we have read so we get them from | 526 | /* setup the n bytes we have read so we get them from |
568 | * the sslv2 buffer */ | 527 | * the sslv2 buffer */ |
569 | s->rstate=SSL_ST_READ_HEADER; | 528 | s->rstate = SSL_ST_READ_HEADER; |
570 | s->packet_length=n; | 529 | s->packet_length = n; |
571 | s->packet= &(s->s2->rbuf[0]); | 530 | s->packet = &(s->s2->rbuf[0]); |
572 | memcpy(s->packet,buf,n); | 531 | memcpy(s->packet, buf, n); |
573 | s->s2->rbuf_left=n; | 532 | s->s2->rbuf_left = n; |
574 | s->s2->rbuf_offs=0; | 533 | s->s2->rbuf_offs = 0; |
575 | 534 | ||
576 | s->method=SSLv2_server_method(); | 535 | s->method = SSLv2_server_method(); |
577 | s->handshake_func=s->method->ssl_accept; | 536 | s->handshake_func = s->method->ssl_accept; |
578 | #endif | 537 | #endif |
579 | } | 538 | } |
580 | 539 | ||
581 | if ((type == 2) || (type == 3)) | 540 | if ((type == 2) || (type == 3)) { |
582 | { | ||
583 | /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */ | 541 | /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */ |
584 | 542 | ||
585 | if (!ssl_init_wbio_buffer(s,1)) goto err; | 543 | if (!ssl_init_wbio_buffer(s, 1)) goto err; |
586 | 544 | ||
587 | /* we are in this state */ | 545 | /* we are in this state */ |
588 | s->state=SSL3_ST_SR_CLNT_HELLO_A; | 546 | s->state = SSL3_ST_SR_CLNT_HELLO_A; |
589 | 547 | ||
590 | if (type == 3) | 548 | if (type == 3) { |
591 | { | ||
592 | /* put the 'n' bytes we have read into the input buffer | 549 | /* put the 'n' bytes we have read into the input buffer |
593 | * for SSLv3 */ | 550 | * for SSLv3 */ |
594 | s->rstate=SSL_ST_READ_HEADER; | 551 | s->rstate = SSL_ST_READ_HEADER; |
595 | s->packet_length=n; | 552 | s->packet_length = n; |
596 | if (s->s3->rbuf.buf == NULL) | 553 | if (s->s3->rbuf.buf == NULL) |
597 | if (!ssl3_setup_read_buffer(s)) | 554 | if (!ssl3_setup_read_buffer(s)) |
598 | goto err; | 555 | goto err; |
599 | 556 | ||
600 | s->packet= &(s->s3->rbuf.buf[0]); | 557 | s->packet = &(s->s3->rbuf.buf[0]); |
601 | memcpy(s->packet,buf,n); | 558 | memcpy(s->packet, buf, n); |
602 | s->s3->rbuf.left=n; | 559 | s->s3->rbuf.left = n; |
603 | s->s3->rbuf.offset=0; | 560 | s->s3->rbuf.offset = 0; |
604 | } | 561 | } else { |
605 | else | 562 | s->packet_length = 0; |
606 | { | 563 | s->s3->rbuf.left = 0; |
607 | s->packet_length=0; | 564 | s->s3->rbuf.offset = 0; |
608 | s->s3->rbuf.left=0; | 565 | } |
609 | s->s3->rbuf.offset=0; | ||
610 | } | ||
611 | if (s->version == TLS1_2_VERSION) | 566 | if (s->version == TLS1_2_VERSION) |
612 | s->method = TLSv1_2_server_method(); | 567 | s->method = TLSv1_2_server_method(); |
613 | else if (s->version == TLS1_1_VERSION) | 568 | else if (s->version == TLS1_1_VERSION) |
@@ -617,22 +572,23 @@ int ssl23_get_client_hello(SSL *s) | |||
617 | else | 572 | else |
618 | s->method = SSLv3_server_method(); | 573 | s->method = SSLv3_server_method(); |
619 | #if 0 /* ssl3_get_client_hello does this */ | 574 | #if 0 /* ssl3_get_client_hello does this */ |
620 | s->client_version=(v[0]<<8)|v[1]; | 575 | s->client_version = (v[0]<<8)|v[1]; |
621 | #endif | 576 | #endif |
622 | s->handshake_func=s->method->ssl_accept; | 577 | s->handshake_func = s->method->ssl_accept; |
623 | } | 578 | } |
624 | 579 | ||
625 | if ((type < 1) || (type > 3)) | 580 | if ((type < 1) || (type > 3)) { |
626 | { | ||
627 | /* bad, very bad */ | 581 | /* bad, very bad */ |
628 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNKNOWN_PROTOCOL); | 582 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL); |
629 | goto err; | 583 | goto err; |
630 | } | 584 | } |
631 | s->init_num=0; | 585 | s->init_num = 0; |
632 | 586 | ||
633 | if (buf != buf_space) OPENSSL_free(buf); | 587 | if (buf != buf_space) |
634 | return(SSL_accept(s)); | 588 | OPENSSL_free(buf); |
589 | return (SSL_accept(s)); | ||
635 | err: | 590 | err: |
636 | if (buf != buf_space) OPENSSL_free(buf); | 591 | if (buf != buf_space) |
637 | return(-1); | 592 | OPENSSL_free(buf); |
638 | } | 593 | return (-1); |
594 | } | ||