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:
113:
114:
115:
116: #include <stdio.h>
117: #include "ssl_locl.h"
118: #include <openssl/buffer.h>
119: #include <openssl/rand.h>
120: #include <openssl/objects.h>
121: #include <openssl/evp.h>
122: #include <openssl/x509.h>
123: #include <openssl/md5.h>
124: #ifndef OPENSSL_NO_DH
125: #include <openssl/dh.h>
126: #endif
127:
128: static SSL_METHOD *dtls1_get_server_method(int ver);
129: static int dtls1_send_hello_verify_request(SSL *s);
130:
131: static SSL_METHOD *dtls1_get_server_method(int ver)
132: {
133: if (ver == DTLS1_VERSION)
134: return(DTLSv1_server_method());
135: else
136: return(NULL);
137: }
138:
139: IMPLEMENT_dtls1_meth_func(DTLSv1_server_method,
140: dtls1_accept,
141: ssl_undefined_function,
142: dtls1_get_server_method)
143:
144: int dtls1_accept(SSL *s)
145: {
146: BUF_MEM *buf;
147: unsigned long l,Time=(unsigned long)time(NULL);
148: void (*cb)(const SSL *ssl,int type,int val)=NULL;
149: long num1;
150: int ret= -1;
151: int new_state,state,skip=0;
152:
153: RAND_add(&Time,sizeof(Time),0);
154: ERR_clear_error();
155: clear_sys_error();
156:
157: if (s->info_callback != NULL)
158: cb=s->info_callback;
159: else if (s->ctx->info_callback != NULL)
160: cb=s->ctx->info_callback;
161:
162:
163: s->in_handshake++;
164: if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
165:
166: if (s->cert == NULL)
167: {
168: SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
169: return(-1);
170: }
171:
172: for (;;)
173: {
174: state=s->state;
175:
176: switch (s->state)
177: {
178: case SSL_ST_RENEGOTIATE:
179: s->new_session=1;
180:
181:
182: case SSL_ST_BEFORE:
183: case SSL_ST_ACCEPT:
184: case SSL_ST_BEFORE|SSL_ST_ACCEPT:
185: case SSL_ST_OK|SSL_ST_ACCEPT:
186:
187: s->server=1;
188: if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
189:
190: if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00))
191: {
192: SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
193: return -1;
194: }
195: s->type=SSL_ST_ACCEPT;
196:
197: if (s->init_buf == NULL)
198: {
199: if ((buf=BUF_MEM_new()) == NULL)
200: {
201: ret= -1;
202: goto end;
203: }
204: if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
205: {
206: ret= -1;
207: goto end;
208: }
209: s->init_buf=buf;
210: }
211:
212: if (!ssl3_setup_buffers(s))
213: {
214: ret= -1;
215: goto end;
216: }
217:
218: s->init_num=0;
219:
220: if (s->state != SSL_ST_RENEGOTIATE)
221: {
222:
223:
224:
225: if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
226:
227: ssl3_init_finished_mac(s);
228: s->state=SSL3_ST_SR_CLNT_HELLO_A;
229: s->ctx->stats.sess_accept++;
230: }
231: else
232: {
233:
234:
235: s->ctx->stats.sess_accept_renegotiate++;
236: s->state=SSL3_ST_SW_HELLO_REQ_A;
237: }
238:
239: if ( (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
240: s->d1->send_cookie = 1;
241: else
242: s->d1->send_cookie = 0;
243:
244: break;
245:
246: case SSL3_ST_SW_HELLO_REQ_A:
247: case SSL3_ST_SW_HELLO_REQ_B:
248:
249: s->shutdown=0;
250: ret=dtls1_send_hello_request(s);
251: if (ret <= 0) goto end;
252: s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
253: s->state=SSL3_ST_SW_FLUSH;
254: s->init_num=0;
255:
256: ssl3_init_finished_mac(s);
257: break;
258:
259: case SSL3_ST_SW_HELLO_REQ_C:
260: s->state=SSL_ST_OK;
261: break;
262:
263: case SSL3_ST_SR_CLNT_HELLO_A:
264: case SSL3_ST_SR_CLNT_HELLO_B:
265: case SSL3_ST_SR_CLNT_HELLO_C:
266:
267: s->shutdown=0;
268: ret=ssl3_get_client_hello(s);
269: if (ret <= 0) goto end;
270: s->new_session = 2;
271:
272: if ( s->d1->send_cookie)
273: s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A;
274: else
275: s->state = SSL3_ST_SW_SRVR_HELLO_A;
276:
277: s->init_num=0;
278: break;
279:
280: case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
281: case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
282:
283: ret = dtls1_send_hello_verify_request(s);
284: if ( ret <= 0) goto end;
285: s->d1->send_cookie = 0;
286: s->state=SSL3_ST_SW_FLUSH;
287: s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
288:
289:
290: if (s->client_version != DTLS1_BAD_VER)
291: ssl3_init_finished_mac(s);
292: break;
293:
294: case SSL3_ST_SW_SRVR_HELLO_A:
295: case SSL3_ST_SW_SRVR_HELLO_B:
296: ret=dtls1_send_server_hello(s);
297: if (ret <= 0) goto end;
298:
299: if (s->hit)
300: s->state=SSL3_ST_SW_CHANGE_A;
301: else
302: s->state=SSL3_ST_SW_CERT_A;
303: s->init_num=0;
304: break;
305:
306: case SSL3_ST_SW_CERT_A:
307: case SSL3_ST_SW_CERT_B:
308:
309: if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
310: {
311: ret=dtls1_send_server_certificate(s);
312: if (ret <= 0) goto end;
313: }
314: else
315: skip=1;
316: s->state=SSL3_ST_SW_KEY_EXCH_A;
317: s->init_num=0;
318: break;
319:
320: case SSL3_ST_SW_KEY_EXCH_A:
321: case SSL3_ST_SW_KEY_EXCH_B:
322: l=s->s3->tmp.new_cipher->algorithms;
323:
324:
325:
326: if ((s->options & SSL_OP_EPHEMERAL_RSA)
327: #ifndef OPENSSL_NO_KRB5
328: && !(l & SSL_KRB5)
329: #endif
330: )
331:
332:
333:
334:
335: s->s3->tmp.use_rsa_tmp=1;
336: else
337: s->s3->tmp.use_rsa_tmp=0;
338:
339:
340:
341: if (s->s3->tmp.use_rsa_tmp
342: || (l & (SSL_DH|SSL_kFZA))
343: || ((l & SSL_kRSA)
344: && (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
345: || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
346: && EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
347: )
348: )
349: )
350: )
351: {
352: ret=dtls1_send_server_key_exchange(s);
353: if (ret <= 0) goto end;
354: }
355: else
356: skip=1;
357:
358: s->state=SSL3_ST_SW_CERT_REQ_A;
359: s->init_num=0;
360: break;
361:
362: case SSL3_ST_SW_CERT_REQ_A:
363: case SSL3_ST_SW_CERT_REQ_B:
364: if (
365: !(s->verify_mode & SSL_VERIFY_PEER) ||
366:
367:
368: ((s->session->peer != NULL) &&
369: (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
370:
371:
372:
373: ((s->s3->tmp.new_cipher->algorithms & SSL_aNULL) &&
374:
375:
376: !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
377:
378: (s->s3->tmp.new_cipher->algorithms & SSL_aKRB5))
379: {
380:
381: skip=1;
382: s->s3->tmp.cert_request=0;
383: s->state=SSL3_ST_SW_SRVR_DONE_A;
384: }
385: else
386: {
387: s->s3->tmp.cert_request=1;
388: ret=dtls1_send_certificate_request(s);
389: if (ret <= 0) goto end;
390: #ifndef NETSCAPE_HANG_BUG
391: s->state=SSL3_ST_SW_SRVR_DONE_A;
392: #else
393: s->state=SSL3_ST_SW_FLUSH;
394: s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
395: #endif
396: s->init_num=0;
397: }
398: break;
399:
400: case SSL3_ST_SW_SRVR_DONE_A:
401: case SSL3_ST_SW_SRVR_DONE_B:
402: ret=dtls1_send_server_done(s);
403: if (ret <= 0) goto end;
404: s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
405: s->state=SSL3_ST_SW_FLUSH;
406: s->init_num=0;
407: break;
408:
409: case SSL3_ST_SW_FLUSH:
410:
411: num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
412: if (num1 > 0)
413: {
414: s->rwstate=SSL_WRITING;
415: num1=BIO_flush(s->wbio);
416: if (num1 <= 0) { ret= -1; goto end; }
417: s->rwstate=SSL_NOTHING;
418: }
419:
420: s->state=s->s3->tmp.next_state;
421: break;
422:
423: case SSL3_ST_SR_CERT_A:
424: case SSL3_ST_SR_CERT_B:
425:
426: ret = ssl3_check_client_hello(s);
427: if (ret <= 0)
428: goto end;
429: if (ret == 2)
430: s->state = SSL3_ST_SR_CLNT_HELLO_C;
431: else {
432:
433:
434: ret=ssl3_get_client_certificate(s);
435: if (ret <= 0) goto end;
436: s->init_num=0;
437: s->state=SSL3_ST_SR_KEY_EXCH_A;
438: }
439: break;
440:
441: case SSL3_ST_SR_KEY_EXCH_A:
442: case SSL3_ST_SR_KEY_EXCH_B:
443: ret=ssl3_get_client_key_exchange(s);
444: if (ret <= 0) goto end;
445: s->state=SSL3_ST_SR_CERT_VRFY_A;
446: s->init_num=0;
447:
448:
449:
450: s->method->ssl3_enc->cert_verify_mac(s,
451: &(s->s3->finish_dgst1),
452: &(s->s3->tmp.cert_verify_md[0]));
453: s->method->ssl3_enc->cert_verify_mac(s,
454: &(s->s3->finish_dgst2),
455: &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
456:
457: break;
458:
459: case SSL3_ST_SR_CERT_VRFY_A:
460: case SSL3_ST_SR_CERT_VRFY_B:
461:
462:
463: ret=ssl3_get_cert_verify(s);
464: if (ret <= 0) goto end;
465:
466: s->state=SSL3_ST_SR_FINISHED_A;
467: s->init_num=0;
468: break;
469:
470: case SSL3_ST_SR_FINISHED_A:
471: case SSL3_ST_SR_FINISHED_B:
472: ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
473: SSL3_ST_SR_FINISHED_B);
474: if (ret <= 0) goto end;
475: if (s->hit)
476: s->state=SSL_ST_OK;
477: else
478: s->state=SSL3_ST_SW_CHANGE_A;
479: s->init_num=0;
480: break;
481:
482: case SSL3_ST_SW_CHANGE_A:
483: case SSL3_ST_SW_CHANGE_B:
484:
485: s->session->cipher=s->s3->tmp.new_cipher;
486: if (!s->method->ssl3_enc->setup_key_block(s))
487: { ret= -1; goto end; }
488:
489: ret=dtls1_send_change_cipher_spec(s,
490: SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
491:
492: if (ret <= 0) goto end;
493: s->state=SSL3_ST_SW_FINISHED_A;
494: s->init_num=0;
495:
496: if (!s->method->ssl3_enc->change_cipher_state(s,
497: SSL3_CHANGE_CIPHER_SERVER_WRITE))
498: {
499: ret= -1;
500: goto end;
501: }
502:
503: dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
504: break;
505:
506: case SSL3_ST_SW_FINISHED_A:
507: case SSL3_ST_SW_FINISHED_B:
508: ret=dtls1_send_finished(s,
509: SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
510: s->method->ssl3_enc->server_finished_label,
511: s->method->ssl3_enc->server_finished_label_len);
512: if (ret <= 0) goto end;
513: s->state=SSL3_ST_SW_FLUSH;
514: if (s->hit)
515: s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
516: else
517: s->s3->tmp.next_state=SSL_ST_OK;
518: s->init_num=0;
519: break;
520:
521: case SSL_ST_OK:
522:
523: ssl3_cleanup_key_block(s);
524:
525: #if 0
526: BUF_MEM_free(s->init_buf);
527: s->init_buf=NULL;
528: #endif
529:
530:
531: ssl_free_wbio_buffer(s);
532:
533: s->init_num=0;
534:
535: if (s->new_session == 2)
536: {
537:
538:
539:
540: s->new_session=0;
541:
542: ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
543:
544: s->ctx->stats.sess_accept_good++;
545:
546: s->handshake_func=dtls1_accept;
547:
548: if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
549: }
550:
551: ret = 1;
552:
553:
554: s->d1->handshake_r