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:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112: #include <stdio.h>
113: #include "ssl_locl.h"
114: #include <openssl/buffer.h>
115: #include <openssl/rand.h>
116: #include <openssl/objects.h>
117: #include <openssl/evp.h>
118:
119: static SSL_METHOD *ssl23_get_server_method(int ver);
120: int ssl23_get_client_hello(SSL *s);
121: static SSL_METHOD *ssl23_get_server_method(int ver)
122: {
123: #ifndef OPENSSL_NO_SSL2
124: if (ver == SSL2_VERSION)
125: return(SSLv2_server_method());
126: #endif
127: if (ver == SSL3_VERSION)
128: return(SSLv3_server_method());
129: else if (ver == TLS1_VERSION)
130: return(TLSv1_server_method());
131: else
132: return(NULL);
133: }
134:
135: IMPLEMENT_ssl23_meth_func(SSLv23_server_method,
136: ssl23_accept,
137: ssl_undefined_function,
138: ssl23_get_server_method)
139:
140: int ssl23_accept(SSL *s)
141: {
142: BUF_MEM *buf;
143: unsigned long Time=(unsigned long)time(NULL);
144: void (*cb)(const SSL *ssl,int type,int val)=NULL;
145: int ret= -1;
146: int new_state,state;
147:
148: RAND_add(&Time,sizeof(Time),0);
149: ERR_clear_error();
150: clear_sys_error();
151:
152: if (s->info_callback != NULL)
153: cb=s->info_callback;
154: else if (s->ctx->info_callback != NULL)
155: cb=s->ctx->info_callback;
156:
157: s->in_handshake++;
158: if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
159:
160: for (;;)
161: {
162: state=s->state;
163:
164: switch(s->state)
165: {
166: case SSL_ST_BEFORE:
167: case SSL_ST_ACCEPT:
168: case SSL_ST_BEFORE|SSL_ST_ACCEPT:
169: case SSL_ST_OK|SSL_ST_ACCEPT:
170:
171: s->server=1;
172: if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
173:
174:
175: s->type=SSL_ST_ACCEPT;
176:
177: if (s->init_buf == NULL)
178: {
179: if ((buf=BUF_MEM_new()) == NULL)
180: {
181: ret= -1;
182: goto end;
183: }
184: if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
185: {
186: ret= -1;
187: goto end;
188: }
189: s->init_buf=buf;
190: }
191:
192: ssl3_init_finished_mac(s);
193:
194: s->state=SSL23_ST_SR_CLNT_HELLO_A;
195: s->ctx->stats.sess_accept++;
196: s->init_num=0;
197: break;
198:
199: case SSL23_ST_SR_CLNT_HELLO_A:
200: case SSL23_ST_SR_CLNT_HELLO_B:
201:
202: s->shutdown=0;
203: ret=ssl23_get_client_hello(s);
204: if (ret >= 0) cb=NULL;
205: goto end;
206:
207:
208: default:
209: SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE);
210: ret= -1;
211: goto end;
212:
213: }
214:
215: if ((cb != NULL) && (s->state != state))
216: {
217: new_state=s->state;
218: s->state=state;
219: cb(s,SSL_CB_ACCEPT_LOOP,1);
220: s->state=new_state;
221: }
222: }
223: end:
224: s->in_handshake--;
225: if (cb != NULL)
226: cb(s,SSL_CB_ACCEPT_EXIT,ret);
227: return(ret);
228: }
229:
230:
231: int ssl23_get_client_hello(SSL *s)
232: {
233: char buf_space[11];
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246: char *buf= &(buf_space[0]);
247: unsigned char *p,*d,*d_len,*dd;
248: unsigned int i;
249: unsigned int csl,sil,cl;
250: int n=0,j;
251: int type=0;
252: int v[2];
253:
254: if (s->state == SSL23_ST_SR_CLNT_HELLO_A)
255: {
256:
257: v[0]=v[1]=0;
258:
259: if (!ssl3_setup_buffers(s)) goto err;
260:
261: n=ssl23_read_bytes(s, sizeof buf_space);
262: if (n != sizeof buf_space) return(n);
263:
264: p=s->packet;
265:
266: memcpy(buf,p,n);
267:
268: if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO))
269: {
270:
271:
272:
273: if ((p[3] == 0x00) && (p[4] == 0x02))
274: {
275: v[0]=p[3]; v[1]=p[4];
276:
277: if (!(s->options & SSL_OP_NO_SSLv2))
278: type=1;
279: }
280: else if (p[3] == SSL3_VERSION_MAJOR)
281: {
282: v[0]=p[3]; v[1]=p[4];
283:
284: if (p[4] >= TLS1_VERSION_MINOR)
285: {
286: if (!(s->options & SSL_OP_NO_TLSv1))
287: {
288: s->version=TLS1_VERSION;
289:
290: s->state=SSL23_ST_SR_CLNT_HELLO_B;
291: }
292: else if (!(s->options & SSL_OP_NO_SSLv3))
293: {
294: s->version=SSL3_VERSION;
295:
296: s->state=SSL23_ST_SR_CLNT_HELLO_B;
297: }
298: else if (!(s->options & SSL_OP_NO_SSLv2))
299: {
300: type=1;
301: }
302: }
303: else if (!(s->options & SSL_OP_NO_SSLv3))
304: {
305: s->version=SSL3_VERSION;
306:
307: s->state=SSL23_ST_SR_CLNT_HELLO_B;
308: }
309: else if (!(s->options & SSL_OP_NO_SSLv2))
310: type=1;
311:
312: }
313: }
314: else if ((p[0] == SSL3_RT_HANDSHAKE) &&
315: (p[1] == SSL3_VERSION_MAJOR) &&
316: (p[5] == SSL3_MT_CLIENT_HELLO) &&
317: ((p[3] == 0 && p[4] < 5 )
318: || (p[9] == p[1])))
319: {
320:
321:
322:
323:
324: v[0]=p[1];
325:
326:
327:
328:
329:
330:
331:
332:
333: if (p[3] == 0 && p[4] < 6)
334: {
335: #if 0
336: SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_SMALL);
337: goto err;
338: #else
339: v[1] = TLS1_VERSION_MINOR;
340: #endif
341: }
342: else
343: v[1]=p[10];
344: if (v[1] >= TLS1_VERSION_MINOR)
345: {
346: if (!(s->options & SSL_OP_NO_TLSv1))
347: {
348: s->version=TLS1_VERSION;
349: type=3;
350: }
351: else if (!(s->options & SSL_OP_NO_SSLv3))
352: {
353: s->version=SSL3_VERSION;
354: type=3;
355: }
356: }
357: else
358: {
359:
360: if (!(s->options & SSL_OP_NO_SSLv3))
361: {
362: s->version=SSL3_VERSION;
363: type=3;
364: }
365: else if (!(s->options & SSL_OP_NO_TLSv1))
366: {
367:
368:
369: s->version=TLS1_VERSION;
370: type=3;
371: }
372: }
373: }
374: else if ((strncmp("GET ", (char *)p,4) == 0) ||
375: (strncmp("POST ",(char *)p,5) == 0) ||
376: (strncmp("HEAD ",(char *)p,5) == 0) ||
377: (strncmp("PUT ", (char *)p,4) == 0))
378: {
379: SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST);
380: goto err;
381: }
382: else if (strncmp("CONNECT",(char *)p,7) == 0)
383: {
384: SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST);
385: goto err;
386: }
387: }
388:
389: if (s->state == SSL23_ST_SR_CLNT_HELLO_B)
390: {
391:
392:
393:
394: type=2;
395: p=s->packet;
396: v[0] = p[3];
397: v[1] = p[4];
398:
399: n=((p[0]&0x7f)<<8)|p[1];
400: if (n > (1024*4))
401: {
402: SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE);
403: goto err;
404: }
405:
406: j=ssl23_read_bytes(s,n+2);
407: if (j <= 0) return(j);
408:
409: ssl3_finish_mac(s, s->packet+2, s->packet_length-2);
410: if (s->msg_callback)
411: s->msg_callback(0, SSL2_VERSION, 0, s->packet+2, s->packet_length-2, s, s->msg_callback_arg);
412:
413: p=s->packet;
414: p+=5;
415: n2s(p,csl);
416: n2s(p,sil);
417: n2s(p,cl);
418: d=(unsigned char *)s->init_buf->data;
419: if ((csl+sil+cl+11) != s->packet_length)
420: {
421: SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_LENGTH_MISMATCH);
422: goto err;
423: }
424:
425:
426: *(d++) = SSL3_MT_CLIENT_HELLO;
427:
428: d_len = d;
429: d += 3;
430:
431:
432: *(d++) = SSL3_VERSION_MAJOR;
433: *(d++) = v[1];
434:
435:
436:
437: i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl;
438: memset(d,0,SSL3_RANDOM_SIZE);
439: memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i);
440: d+=SSL3_RANDOM_SIZE;
441:
442:
443: *(d++)=0;
444:
445:
446: j=0;
447: dd=d;
448: d+=2;
449: for (i=0; i<csl; i+=3)
450: {
451: if (p[i] != 0) continue;
452: *(d++)=p[i+1];
453: *(d++)=p[i+2];
454: j+=2;
455: }
456: s2n(j,dd);
457:
458:
459: *(d++)=1;
460: *(d++)=0;
461:
462: i = (d-(unsigned char *)s->init_buf->data) - 4;
463: l2n3((long)i, d_len);
464:
465:
466: s->s3->tmp.reuse_message=1;
467: s->s3->tmp.message_type=SSL3_MT_CLIENT_HELLO;
468: s->s3->tmp.message_size=i;
469: }
470:
471:
472:
473:
474: if (type == 1)
475: {
476: #ifdef OPENSSL_NO_SSL2
477: SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
478: goto err;
479: #else
480:
481:
482:
483:
484: if (s->s2 == NULL)
485: {
486: if (!ssl2_new(s))
487: goto err;
488: }
489: else
490: ssl2_clear(s);
491:
492: if (s->s3 != NULL) ssl3_free(s);
493:
494: if (!BUF_MEM_grow_clean(s->init_buf,
495: SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
496: {
497: goto err;
498: }
499:
500: s->state=SSL2_ST_GET_CLIENT_HELLO_A;
501: if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3)
502: s->s2->ssl2_rollback=0;
503: else
504:
505:
506: s->s2->ssl2_rollback=1;
507:
508:
509:
510: s->rstate=SSL_ST_READ_HEADER;
511: s->packet_length=n;
512: s->packet= &(s->s2->rbuf[0]);
513: memcpy(s->packet,buf,n);
514: s->s2->rbuf_left=n;
515: s->s2->rbuf_offs=0;
516:
517: s->method=SSLv2_server_method();
518: s->handshake_func=s->method->ssl_accept;
519: #endif
520: }
521:
522: if ((type == 2) || (type == 3))
523: {
524:
525:
526: if (!ssl_init_wbio_buffer(s,1)) goto err;
527:
528:
529: s->state=SSL3_ST_SR_CLNT_HELLO_A;
530:
531: if (type == 3)
532: {
533:
534:
535: s->rstate=SSL_ST_READ_HEADER;
536: s->packet_length=n;
537: s->packet= &(s->s3->rbuf.buf[0]);
538: memcpy(s->packet,buf,n);
539: s->s3->rbuf.left=n;
540: s->s3->rbuf.offset=0;
541: }
542: else
543: {
544: s->packet_length=0;
545: s->s3->rbuf.left=0;
546: s->s3->rbuf.offset=0;
547: }
548:
549: if (s->version == TLS1_VERSION)
550: s->method = TLSv1_server_method();
551: else
552: s->method = SSLv3_server_method();
553: #if 0
554: s->client_version=(v[0]<<