1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59: #include <stdio.h>
60: #include "ssl_locl.h"
61: #include <openssl/buffer.h>
62: #include <openssl/rand.h>
63: #include <openssl/objects.h>
64: #include <openssl/evp.h>
65:
66: static SSL_METHOD *ssl23_get_client_method(int ver);
67: static int ssl23_client_hello(SSL *s);
68: static int ssl23_get_server_hello(SSL *s);
69: static SSL_METHOD *ssl23_get_client_method(int ver)
70: {
71: #ifndef OPENSSL_NO_SSL2
72: if (ver == SSL2_VERSION)
73: return(SSLv2_client_method());
74: #endif
75: if (ver == SSL3_VERSION)
76: return(SSLv3_client_method());
77: else if (ver == TLS1_VERSION)
78: return(TLSv1_client_method());
79: else
80: return(NULL);
81: }
82:
83: IMPLEMENT_ssl23_meth_func(SSLv23_client_method,
84: ssl_undefined_function,
85: ssl23_connect,
86: ssl23_get_client_method)
87:
88: int ssl23_connect(SSL *s)
89: {
90: BUF_MEM *buf=NULL;
91: unsigned long Time=(unsigned long)time(NULL);
92: void (*cb)(const SSL *ssl,int type,int val)=NULL;
93: int ret= -1;
94: int new_state,state;
95:
96: RAND_add(&Time,sizeof(Time),0);
97: ERR_clear_error();
98: clear_sys_error();
99:
100: if (s->info_callback != NULL)
101: cb=s->info_callback;
102: else if (s->ctx->info_callback != NULL)
103: cb=s->ctx->info_callback;
104:
105: s->in_handshake++;
106: if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
107:
108: for (;;)
109: {
110: state=s->state;
111:
112: switch(s->state)
113: {
114: case SSL_ST_BEFORE:
115: case SSL_ST_CONNECT:
116: case SSL_ST_BEFORE|SSL_ST_CONNECT:
117: case SSL_ST_OK|SSL_ST_CONNECT:
118:
119: if (s->session != NULL)
120: {
121: SSLerr(SSL_F_SSL23_CONNECT,SSL_R_SSL23_DOING_SESSION_ID_REUSE);
122: ret= -1;
123: goto end;
124: }
125: s->server=0;
126: if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
127:
128:
129: s->type=SSL_ST_CONNECT;
130:
131: if (s->init_buf == NULL)
132: {
133: if ((buf=BUF_MEM_new()) == NULL)
134: {
135: ret= -1;
136: goto end;
137: }
138: if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
139: {
140: ret= -1;
141: goto end;
142: }
143: s->init_buf=buf;
144: buf=NULL;
145: }
146:
147: if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
148:
149: ssl3_init_finished_mac(s);
150:
151: s->state=SSL23_ST_CW_CLNT_HELLO_A;
152: s->ctx->stats.sess_connect++;
153: s->init_num=0;
154: break;
155:
156: case SSL23_ST_CW_CLNT_HELLO_A:
157: case SSL23_ST_CW_CLNT_HELLO_B:
158:
159: s->shutdown=0;
160: ret=ssl23_client_hello(s);
161: if (ret <= 0) goto end;
162: s->state=SSL23_ST_CR_SRVR_HELLO_A;
163: s->init_num=0;
164:
165: break;
166:
167: case SSL23_ST_CR_SRVR_HELLO_A:
168: case SSL23_ST_CR_SRVR_HELLO_B:
169: ret=ssl23_get_server_hello(s);
170: if (ret >= 0) cb=NULL;
171: goto end;
172:
173:
174: default:
175: SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE);
176: ret= -1;
177: goto end;
178:
179: }
180:
181: if (s->debug) { (void)BIO_flush(s->wbio); }
182:
183: if ((cb != NULL) && (s->state != state))
184: {
185: new_state=s->state;
186: s->state=state;
187: cb(s,SSL_CB_CONNECT_LOOP,1);
188: s->state=new_state;
189: }
190: }
191: end:
192: s->in_handshake--;
193: if (buf != NULL)
194: BUF_MEM_free(buf);
195: if (cb != NULL)
196: cb(s,SSL_CB_CONNECT_EXIT,ret);
197: return(ret);
198: }
199:
200:
201: static int ssl23_client_hello(SSL *s)
202: {
203: unsigned char *buf;
204: unsigned char *p,*d;
205: int i,j,ch_len;
206: unsigned long Time,l;
207: int ssl2_compat;
208: int version = 0, version_major, version_minor;
209: SSL_COMP *comp;
210: int ret;
211:
212: ssl2_compat = (s->options & SSL_OP_NO_SSLv2) ? 0 : 1;
213:
214: if (!(s->options & SSL_OP_NO_TLSv1))
215: {
216: version = TLS1_VERSION;
217: }
218: else if (!(s->options & SSL_OP_NO_SSLv3))
219: {
220: version = SSL3_VERSION;
221: }
222: else if (!(s->options & SSL_OP_NO_SSLv2))
223: {
224: version = SSL2_VERSION;
225: }
226: #ifndef OPENSSL_NO_TLSEXT
227: if (version != SSL2_VERSION)
228: {
229:
230:
231: if (s->tlsext_hostname != NULL)
232: ssl2_compat = 0;
233: }
234: #endif
235:
236: buf=(unsigned char *)s->init_buf->data;
237: if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
238: {
239: #if 0
240:
241: if (!ssl_get_new_session(s,0))
242: {
243: return(-1);
244: }
245: #endif
246:
247: p=s->s3->client_random;
248: Time=(unsigned long)time(NULL);
249: l2n(Time,p);
250: if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0)
251: return -1;
252:
253: if (version == TLS1_VERSION)
254: {
255: version_major = TLS1_VERSION_MAJOR;
256: version_minor = TLS1_VERSION_MINOR;
257: }
258: else if (version == SSL3_VERSION)
259: {
260: version_major = SSL3_VERSION_MAJOR;
261: version_minor = SSL3_VERSION_MINOR;
262: }
263: else if (version == SSL2_VERSION)
264: {
265: version_major = SSL2_VERSION_MAJOR;
266: version_minor = SSL2_VERSION_MINOR;
267: }
268: else
269: {
270: SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_PROTOCOLS_AVAILABLE);
271: return(-1);
272: }
273:
274: s->client_version = version;
275:
276: if (ssl2_compat)
277: {
278:
279:
280:
281: d = &(buf[2]);
282: p = d + 9;
283:
284: *(d++) = SSL2_MT_CLIENT_HELLO;
285: *(d++) = version_major;
286: *(d++) = version_minor;
287:
288:
289: i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p,0);
290: if (i == 0)
291: {
292:
293: SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
294: return -1;
295: }
296: s2n(i,d);
297: p+=i;
298:
299:
300: #if 0
301: s->session->session_id_length=0;
302: #endif
303: s2n(0,d);
304:
305: if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
306: ch_len=SSL2_CHALLENGE_LENGTH;
307: else
308: ch_len=SSL2_MAX_CHALLENGE_LENGTH;
309:
310:
311: if (SSL3_RANDOM_SIZE < ch_len)
312: i=SSL3_RANDOM_SIZE;
313: else
314: i=ch_len;
315: s2n(i,d);
316: memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE);
317: if (RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i) <= 0)
318: return -1;
319:
320: memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
321: p+=i;
322:
323: i= p- &(buf[2]);
324: buf[0]=((i>>8)&0xff)|0x80;
325: buf[1]=(i&0xff);
326:
327:
328: s->init_num=i+2;
329: s->init_off=0;
330:
331: ssl3_finish_mac(s,&(buf[2]),i);
332: }
333: else
334: {
335:
336:
337:
338: d = p = &(buf[9]);
339:
340: *(p++) = version_major;
341: *(p++) = version_minor;
342:
343:
344: memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE);
345: p += SSL3_RANDOM_SIZE;
346:
347:
348: *(p++) = 0;
349:
350:
351: i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),ssl3_put_cipher_by_char);
352: if (i == 0)
353: {
354: SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
355: return -1;
356: }
357: s2n(i,p);
358: p+=i;
359:
360:
361: if (s->ctx->comp_methods == NULL)
362: j=0;
363: else
364: j=sk_SSL_COMP_num(s->ctx->comp_methods);
365: *(p++)=1+j;
366: for (i=0; i<j; i++)
367: {
368: comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
369: *(p++)=comp->id;
370: }
371: *(p++)=0;
372: #ifndef OPENSSL_NO_TLSEXT
373: if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
374: {
375: SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
376: return -1;
377: }
378: #endif
379:
380: l = p-d;
381: *p = 42;
382:
383:
384: d=&(buf[5]);
385: *(d++)=SSL3_MT_CLIENT_HELLO;
386: l2n3(l,d);
387:
388: l += 4;
389:
390: if (l > SSL3_RT_MAX_PLAIN_LENGTH)
391: {
392: SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
393: return -1;
394: }
395:
396:
397: d=buf;
398: *(d++) = SSL3_RT_HANDSHAKE;
399: *(d++) = version_major;
400: *(d++) = version_minor;
401:
402: s2n((int)l,d);
403:
404:
405: s->init_num=p-buf;
406: s->init_off=0;
407:
408: ssl3_finish_mac(s,&(buf[5]), s->init_num - 5);
409: }
410:
411: s->state=SSL23_ST_CW_CLNT_HELLO_B;
412: s->init_off=0;
413: }
414:
415:
416: ret = ssl23_write_bytes(s);
417:
418: if ((ret >= 2) && s->msg_callback)
419: {
420:
421:
422: if (ssl2_compat)
423: s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg);
424: else
425: s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data+5, ret-5, s, s->msg_callback_arg);
426: }
427:
428: return ret;
429: }
430:
431: static int ssl23_get_server_hello(SSL *s)
432: {
433: char buf[8];
434: unsigned char *p;
435: int i;
436: int n;
437:
438: n=ssl23_read_bytes(s,7);
439:
440: if (n != 7) return(n);
441: p=s->packet;
442:
443: memcpy(buf,p,n);
444:
445: if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) &&
446: (p[5] == 0x00) && (p[6] == 0x02))
447: {
448: #ifdef OPENSSL_NO_SSL2
449: SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
450: goto err;
451: #else
452:
453:
454:
455: int ch_len;
456:
457: if (s->options & SSL_OP_NO_SSLv2)
458: {
459: SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
460: goto err;
461: }
462: if (s->s2 == NULL)
463: {
464: if (!ssl2_new(s))
465: goto err;
466: }
467: else
468: ssl2_clear(s);
469:
470: if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
471: ch_len=SSL2_CHALLENGE_LENGTH;
472: else
473: ch_len=SSL2_MAX_CHALLENGE_LENGTH;
474:
475:
476: i=(SSL3_RANDOM_SIZE < ch_len)
477: ?SSL3_RANDOM_SIZE:ch_len;
478: s->s2->challenge_length=i;
479: memcpy(s->s2->challenge,
480: &(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
481:
482: if (s->s3 != NULL) ssl3_free(s);
483:
484: if (!BUF_MEM_grow_clean(s->init_buf,
485: SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
486: {
487: SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB);
488: goto err;
489: }
490:
491: s->state=SSL2_ST_GET_SERVER_HELLO_A;
492: if (!(s->client_version == SSL2_VERSION))
493:
494: s->s2->ssl2_rollback=1;
495:
496:
497:
498: s->rstate=SSL_ST_READ_HEADER;
499: s->packet_length=n;
500: s->packet= &(s->s2->rbuf[0]);
501: memcpy(s->packet,buf,n);
502: s->s2->rbuf_left=n;
503: s->s2->rbuf_offs=0;
504:
505:
506: s->s2->write_sequence=1;
507:
508: s->method=SSLv2_client_method();
509: s->handshake_func=s->method->ssl_connect;
510: #endif
511: }
512: else if ((p[0] == SSL3_RT_HANDSHAKE) &&
513: (p[1] == SSL3_VERSION_MAJOR) &&
514: ((p[2] == SSL3_VERSION_MINOR) ||
515: (p[2] == TLS1_VERSION_MINOR)) &&
516: (p[5] == SSL3_MT_SERVER_HELLO))
517: {
518:
519:
520: if (!ssl_init_wbio_buffer(s,1)) goto err;
521:
522:
523: s->state=SSL3_ST_CR_SRVR_HELLO_A;
524:
525:
526:
527: s->rstate=SSL_ST_READ_HEADER;
528: s->packet_length=n;
529: s->packet= &(s->s3->rbuf.buf[0]);
530: memcpy(s->packet,buf,n);
531: s->s3->rbuf.left=n;
532: s->s3->rbuf.offset=0;
533:
534: if ((p[2] == SSL3_VERSION_MINOR) &&
535: !(s->options & SSL_OP_NO_SSLv3))
536: {
537: s->version=SSL3_VERSION;
538: s->method=SSLv3_client_method();
539: }
540: else if ((p[2] == TLS1_VERSION_MINOR) &&
541: !(s->options & SSL_OP_NO_TLSv1))
542: {
543: s->version=TLS1_VERSION;
544: s->method=TLSv1_client_method();
545: }
546: else
547: {
548: SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
549: goto err;
550: }
551:
552: s->handshake_func=s->method->ssl_connect;
553: }
554: else if ((p[0] == SSL3_RT_ALERT) &&
555: (p[1] == SSL3_VERSION_MAJOR) &&
556: ((p[2] == SSL3_VERSION_MINOR) ||
557: (p[2] == TLS1_VERSION_MINOR)) &&
558: (p[3] == 0) &&