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 "ssl_locl.h"
113: #ifndef OPENSSL_NO_SSL2
114: #include <stdio.h>
115: #include <openssl/bio.h>
116: #include <openssl/rand.h>
117: #include <openssl/objects.h>
118: #include <openssl/evp.h>
119:
120: static SSL_METHOD *ssl2_get_server_method(int ver);
121: static int get_client_master_key(SSL *s);
122: static int get_client_hello(SSL *s);
123: static int server_hello(SSL *s);
124: static int get_client_finished(SSL *s);
125: static int server_verify(SSL *s);
126: static int server_finish(SSL *s);
127: static int request_certificate(SSL *s);
128: static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from,
129: unsigned char *to,int padding);
130: #define BREAK break
131:
132: static SSL_METHOD *ssl2_get_server_method(int ver)
133: {
134: if (ver == SSL2_VERSION)
135: return(SSLv2_server_method());
136: else
137: return(NULL);
138: }
139:
140: IMPLEMENT_ssl2_meth_func(SSLv2_server_method,
141: ssl2_accept,
142: ssl_undefined_function,
143: ssl2_get_server_method)
144:
145: int ssl2_accept(SSL *s)
146: {
147: unsigned long l=(unsigned long)time(NULL);
148: BUF_MEM *buf=NULL;
149: int ret= -1;
150: long num1;
151: void (*cb)(const SSL *ssl,int type,int val)=NULL;
152: int new_state,state;
153:
154: RAND_add(&l,sizeof(l),0);
155: ERR_clear_error();
156: clear_sys_error();
157:
158: if (s->info_callback != NULL)
159: cb=s->info_callback;
160: else if (s->ctx->info_callback != NULL)
161: cb=s->ctx->info_callback;
162:
163:
164: s->in_handshake++;
165: if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
166:
167: if (s->cert == NULL)
168: {
169: SSLerr(SSL_F_SSL2_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
170: return(-1);
171: }
172:
173: clear_sys_error();
174: for (;;)
175: {
176: state=s->state;
177:
178: switch (s->state)
179: {
180: case SSL_ST_BEFORE:
181: case SSL_ST_ACCEPT:
182: case SSL_ST_BEFORE|SSL_ST_ACCEPT:
183: case SSL_ST_OK|SSL_ST_ACCEPT:
184:
185: s->server=1;
186: if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
187:
188: s->version=SSL2_VERSION;
189: s->type=SSL_ST_ACCEPT;
190:
191: buf=s->init_buf;
192: if ((buf == NULL) && ((buf=BUF_MEM_new()) == NULL))
193: { ret= -1; goto end; }
194: if (!BUF_MEM_grow(buf,(int)
195: SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
196: { ret= -1; goto end; }
197: s->init_buf=buf;
198: s->init_num=0;
199: s->ctx->stats.sess_accept++;
200: s->handshake_func=ssl2_accept;
201: s->state=SSL2_ST_GET_CLIENT_HELLO_A;
202: BREAK;
203:
204: case SSL2_ST_GET_CLIENT_HELLO_A:
205: case SSL2_ST_GET_CLIENT_HELLO_B:
206: case SSL2_ST_GET_CLIENT_HELLO_C:
207: s->shutdown=0;
208: ret=get_client_hello(s);
209: if (ret <= 0) goto end;
210: s->init_num=0;
211: s->state=SSL2_ST_SEND_SERVER_HELLO_A;
212: BREAK;
213:
214: case SSL2_ST_SEND_SERVER_HELLO_A:
215: case SSL2_ST_SEND_SERVER_HELLO_B:
216: ret=server_hello(s);
217: if (ret <= 0) goto end;
218: s->init_num=0;
219: if (!s->hit)
220: {
221: s->state=SSL2_ST_GET_CLIENT_MASTER_KEY_A;
222: BREAK;
223: }
224: else
225: {
226: s->state=SSL2_ST_SERVER_START_ENCRYPTION;
227: BREAK;
228: }
229: case SSL2_ST_GET_CLIENT_MASTER_KEY_A:
230: case SSL2_ST_GET_CLIENT_MASTER_KEY_B:
231: ret=get_client_master_key(s);
232: if (ret <= 0) goto end;
233: s->init_num=0;
234: s->state=SSL2_ST_SERVER_START_ENCRYPTION;
235: BREAK;
236:
237: case SSL2_ST_SERVER_START_ENCRYPTION:
238:
239:
240:
241: if (!ssl2_enc_init(s,0))
242: { ret= -1; goto end; }
243: s->s2->clear_text=0;
244: s->state=SSL2_ST_SEND_SERVER_VERIFY_A;
245: BREAK;
246:
247: case SSL2_ST_SEND_SERVER_VERIFY_A:
248: case SSL2_ST_SEND_SERVER_VERIFY_B:
249: ret=server_verify(s);
250: if (ret <= 0) goto end;
251: s->init_num=0;
252: if (s->hit)
253: {
254:
255:
256:
257:
258: s->state=SSL2_ST_SEND_SERVER_VERIFY_C;
259: BREAK;
260: }
261: else
262: {
263: s->state=SSL2_ST_GET_CLIENT_FINISHED_A;
264: break;
265: }
266:
267: case SSL2_ST_SEND_SERVER_VERIFY_C:
268:
269: num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
270: if (num1 != 0)
271: {
272: s->rwstate=SSL_WRITING;
273: num1=BIO_flush(s->wbio);
274: if (num1 <= 0) { ret= -1; goto end; }
275: s->rwstate=SSL_NOTHING;
276: }
277:
278:
279: s->wbio=BIO_pop(s->wbio);
280:
281: s->state=SSL2_ST_GET_CLIENT_FINISHED_A;
282: BREAK;
283:
284: case SSL2_ST_GET_CLIENT_FINISHED_A:
285: case SSL2_ST_GET_CLIENT_FINISHED_B:
286: ret=get_client_finished(s);
287: if (ret <= 0)
288: goto end;
289: s->init_num=0;
290: s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_A;
291: BREAK;
292:
293: case SSL2_ST_SEND_REQUEST_CERTIFICATE_A:
294: case SSL2_ST_SEND_REQUEST_CERTIFICATE_B:
295: case SSL2_ST_SEND_REQUEST_CERTIFICATE_C:
296: case SSL2_ST_SEND_REQUEST_CERTIFICATE_D:
297:
298:
299:
300: if (!(s->verify_mode & SSL_VERIFY_PEER) ||
301: ((s->session->peer != NULL) &&
302: (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)))
303: {
304: s->state=SSL2_ST_SEND_SERVER_FINISHED_A;
305: break;
306: }
307: else
308: {
309: ret=request_certificate(s);
310: if (ret <= 0) goto end;
311: s->init_num=0;
312: s->state=SSL2_ST_SEND_SERVER_FINISHED_A;
313: }
314: BREAK;
315:
316: case SSL2_ST_SEND_SERVER_FINISHED_A:
317: case SSL2_ST_SEND_SERVER_FINISHED_B:
318: ret=server_finish(s);
319: if (ret <= 0) goto end;
320: s->init_num=0;
321: s->state=SSL_ST_OK;
322: break;
323:
324: case SSL_ST_OK:
325: BUF_MEM_free(s->init_buf);
326: ssl_free_wbio_buffer(s);
327: s->init_buf=NULL;
328: s->init_num=0;
329:
330:
331: ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
332:
333: s->ctx->stats.sess_accept_good++;
334:
335: ret=1;
336:
337: if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
338:
339: goto end;
340:
341:
342: default:
343: SSLerr(SSL_F_SSL2_ACCEPT,SSL_R_UNKNOWN_STATE);
344: ret= -1;
345: goto end;
346:
347: }
348:
349: if ((cb != NULL) && (s->state != state))
350: {
351: new_state=s->state;
352: s->state=state;
353: cb(s,SSL_CB_ACCEPT_LOOP,1);
354: s->state=new_state;
355: }
356: }
357: end:
358: s->in_handshake--;
359: if (cb != NULL)
360: cb(s,SSL_CB_ACCEPT_EXIT,ret);
361: return(ret);
362: }
363:
364: static int get_client_master_key(SSL *s)
365: {
366: int is_export,i,n,keya,ek;
367: unsigned long len;
368: unsigned char *p;
369: SSL_CIPHER *cp;
370: const EVP_CIPHER *c;
371: const EVP_MD *md;
372:
373: p=(unsigned char *)s->init_buf->data;
374: if (s->state == SSL2_ST_GET_CLIENT_MASTER_KEY_A)
375: {
376: i=ssl2_read(s,(char *)&(p[s->init_num]),10-s->init_num);
377:
378: if (i < (10-s->init_num))
379: return(ssl2_part_read(s,SSL_F_GET_CLIENT_MASTER_KEY,i));
380: s->init_num = 10;
381:
382: if (*(p++) != SSL2_MT_CLIENT_MASTER_KEY)
383: {
384: if (p[-1] != SSL2_MT_ERROR)
385: {
386: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
387: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_READ_WRONG_PACKET_TYPE);
388: }
389: else
390: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_PEER_ERROR);
391: return(-1);
392: }
393:
394: cp=ssl2_get_cipher_by_char(p);
395: if (cp == NULL)
396: {
397: ssl2_return_error(s,SSL2_PE_NO_CIPHER);
398: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_NO_CIPHER_MATCH);
399: return(-1);
400: }
401: s->session->cipher= cp;
402:
403: p+=3;
404: n2s(p,i); s->s2->tmp.clear=i;
405: n2s(p,i); s->s2->tmp.enc=i;
406: n2s(p,i); s->session->key_arg_length=i;
407: if(s->session->key_arg_length > SSL_MAX_KEY_ARG_LENGTH)
408: {
409: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
410: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_KEY_ARG_TOO_LONG);
411: return -1;
412: }
413: s->state=SSL2_ST_GET_CLIENT_MASTER_KEY_B;
414: }
415:
416:
417: p=(unsigned char *)s->init_buf->data;
418: if (s->init_buf->length < SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
419: {
420: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
421: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
422: return -1;
423: }
424: keya=s->session->key_arg_length;
425: len = 10 + (unsigned long)s->s2->tmp.clear + (unsigned long)s->s2->tmp.enc + (unsigned long)keya;
426: if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
427: {
428: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
429: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_MESSAGE_TOO_LONG);
430: return -1;
431: }
432: n = (int)len - s->init_num;
433: i = ssl2_read(s,(char *)&(p[s->init_num]),n);
434: if (i != n) return(ssl2_part_read(s,SSL_F_GET_CLIENT_MASTER_KEY,i));
435: if (s->msg_callback)
436: s->msg_callback(0, s->version, 0, p, (size_t)len, s, s->msg_callback_arg);
437: p += 10;
438:
439: memcpy(s->session->key_arg,&(p[s->s2->tmp.clear+s->s2->tmp.enc]),
440: (unsigned int)keya);
441:
442: if (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL)
443: {
444: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
445: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_NO_PRIVATEKEY);
446: return(-1);
447: }
448: i=ssl_rsa_private_decrypt(s->cert,s->s2->tmp.enc,
449: &(p[s->s2->tmp.clear]),&(p[s->s2->tmp.clear]),
450: (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING);
451:
452: is_export=SSL_C_IS_EXPORT(s->session->cipher);
453:
454: if (!ssl_cipher_get_evp(s->session,&c,&md,NULL))
455: {
456: ssl2_return_error(s,SSL2_PE_NO_CIPHER);
457: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
458: return(0);
459: }
460:
461: if (s->session->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC)
462: {
463: is_export=1;
464: ek=8;
465: }
466: else
467: ek=5;
468:
469:
470: #if 1
471:
472:
473: if ((i < 0) ||
474: ((!is_export && (i != EVP_CIPHER_key_length(c)))
475: || (is_export && ((i != ek) || (s->s2->tmp.clear+(unsigned int)i !=
476: (unsigned int)EVP_CIPHER_key_length(c))))))
477: {
478: ERR_clear_error();
479: if (is_export)
480: i=ek;
481: else
482: i=EVP_CIPHER_key_length(c);
483: if (RAND_pseudo_bytes(p,i) <= 0)
484: return 0;
485: }
486: #else
487: if (i < 0)
488: {
489: error=1;
490: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_BAD_RSA_DECRYPT);
491: }
492:
493: else if ((!is_export && (i != EVP_CIPHER_key_length(c)))
494: || (is_export && ((i != ek) || (s->s2->tmp.clear+i !=
495: EVP_CIPHER_key_length(c)))))
496: {
497: error=1;
498: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_WRONG_NUMBER_OF_KEY_BITS);
499: }
500: if (error)
501: {
502: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
503: return(-1);
504: }
505: #endif
506:
507: if (is_export) i+=s->s2->tmp.clear;
508:
509: if (i > SSL_MAX_MASTER_KEY_LENGTH)
510: {
511: ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
512: SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
513: return -1;
514: }
515: s->session->master_key_length=i;
516: memcpy(s->session->master_key,p,(unsigned int)i);
517: return(1);
518: }
519:
520: static int get_client_hello(SSL *s)
521: {
522: int i,n;
523: unsigned long len;
524: unsigned char *p;
525: STACK_OF(SSL_CIPHER) *cs;
526: STACK_OF(SSL_CIPHER) *cl;
527: STACK_OF(SSL_CIPHER) *prio, *allow;
528: int z;
529:
530:
531:
532: if (s->state == SSL2_ST_GET_CLIENT_HELLO_A)
533: {
534: s->first_packet=1;
535: s->state=SSL2_ST_GET_CLIENT_HELLO_B;
536: }
537:
538: p=(unsigned char *)s->init_buf->data;
539: if (s->state == SSL2_ST_GET_CLIENT_HELLO_B)
540: {
541: i=ssl2_read(s,(char *)&(p[s->init_num]),9-s->init_num);
542: if (i < (9-s->init_num))
543: return(ssl2_part_read(s,SSL_F_GET_CLIENT_HELLO,i));
544: s->init_num = 9;
545:
546: if (*(p++) != SSL2_MT_CLIENT_HELLO)
547: {