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