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 <openssl/objects.h>
61: #include <openssl/evp.h>
62: #include <openssl/hmac.h>
63: #include "ssl_locl.h"
64:
65: const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
66:
67: #ifndef OPENSSL_NO_TLSEXT
68: static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
69: const unsigned char *sess_id, int sesslen,
70: SSL_SESSION **psess);
71: #endif
72:
73: SSL3_ENC_METHOD TLSv1_enc_data={
74: tls1_enc,
75: tls1_mac,
76: tls1_setup_key_block,
77: tls1_generate_master_secret,
78: tls1_change_cipher_state,
79: tls1_final_finish_mac,
80: TLS1_FINISH_MAC_LENGTH,
81: tls1_cert_verify_mac,
82: TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
83: TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
84: tls1_alert_code,
85: };
86:
87: long tls1_default_timeout(void)
88: {
89:
90:
91: return(60*60*2);
92: }
93:
94: IMPLEMENT_tls1_meth_func(tlsv1_base_method,
95: ssl_undefined_function,
96: ssl_undefined_function,
97: ssl_bad_method)
98:
99: int tls1_new(SSL *s)
100: {
101: if (!ssl3_new(s)) return(0);
102: s->method->ssl_clear(s);
103: return(1);
104: }
105:
106: void tls1_free(SSL *s)
107: {
108: ssl3_free(s);
109: }
110:
111: void tls1_clear(SSL *s)
112: {
113: ssl3_clear(s);
114: s->version=TLS1_VERSION;
115: }
116:
117: #if 0
118: long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
119: {
120: return(0);
121: }
122:
123: long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
124: {
125: return(0);
126: }
127: #endif
128:
129: #ifndef OPENSSL_NO_TLSEXT
130: unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
131: {
132: int extdatalen=0;
133: unsigned char *ret = p;
134:
135: ret+=2;
136:
137: if (ret>=limit) return NULL;
138:
139: if (s->tlsext_hostname != NULL)
140: {
141:
142: unsigned long size_str;
143: long lenmax;
144:
145:
146:
147:
148:
149:
150:
151:
152:
153: if ((lenmax = limit - ret - 9) < 0
154: || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax)
155: return NULL;
156:
157:
158: s2n(TLSEXT_TYPE_server_name,ret);
159: s2n(size_str+5,ret);
160:
161:
162: s2n(size_str+3,ret);
163:
164:
165: *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
166: s2n(size_str,ret);
167: memcpy(ret, s->tlsext_hostname, size_str);
168: ret+=size_str;
169:
170: }
171:
172: if (!(SSL_get_options(s) & SSL_OP_NO_TICKET))
173: {
174: int ticklen;
175: if (s->session && s->session->tlsext_tick)
176: ticklen = s->session->tlsext_ticklen;
177: else
178: ticklen = 0;
179:
180:
181:
182: if (limit - ret - 4 - ticklen < 0)
183: return NULL;
184: s2n(TLSEXT_TYPE_session_ticket,ret);
185: s2n(ticklen,ret);
186: if (ticklen)
187: {
188: memcpy(ret, s->session->tlsext_tick, ticklen);
189: ret += ticklen;
190: }
191: }
192:
193: if ((extdatalen = ret-p-2)== 0)
194: return p;
195:
196: s2n(extdatalen,p);
197: return ret;
198: }
199:
200: unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
201: {
202: int extdatalen=0;
203: unsigned char *ret = p;
204:
205: ret+=2;
206: if (ret>=limit) return NULL;
207:
208: if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
209: {
210: if (limit - ret - 4 < 0) return NULL;
211:
212: s2n(TLSEXT_TYPE_server_name,ret);
213: s2n(0,ret);
214: }
215:
216: if (s->tlsext_ticket_expected
217: && !(SSL_get_options(s) & SSL_OP_NO_TICKET))
218: {
219: if (limit - ret - 4 < 0) return NULL;
220: s2n(TLSEXT_TYPE_session_ticket,ret);
221: s2n(0,ret);
222: }
223:
224: if ((extdatalen = ret-p-2)== 0)
225: return p;
226:
227: s2n(extdatalen,p);
228: return ret;
229: }
230:
231: int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
232: {
233: unsigned short type;
234: unsigned short size;
235: unsigned short len;
236: unsigned char *data = *p;
237: s->servername_done = 0;
238:
239: if (data >= (d+n-2))
240: return 1;
241: n2s(data,len);
242:
243: if (data > (d+n-len))
244: return 1;
245:
246: while (data <= (d+n-4))
247: {
248: n2s(data,type);
249: n2s(data,size);
250:
251: if (data+size > (d+n))
252: return 1;
253:
254: if (s->tlsext_debug_cb)
255: s->tlsext_debug_cb(s, 0, type, data, size,
256: s->tlsext_debug_arg);
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280: if (type == TLSEXT_TYPE_server_name)
281: {
282: unsigned char *sdata;
283: int servname_type;
284: int dsize;
285:
286: if (size < 2)
287: {
288: *al = SSL_AD_DECODE_ERROR;
289: return 0;
290: }
291: n2s(data,dsize);
292: size -= 2;
293: if (dsize > size )
294: {
295: *al = SSL_AD_DECODE_ERROR;
296: return 0;
297: }
298:
299: sdata = data;
300: while (dsize > 3)
301: {
302: servname_type = *(sdata++);
303: n2s(sdata,len);
304: dsize -= 3;
305:
306: if (len > dsize)
307: {
308: *al = SSL_AD_DECODE_ERROR;
309: return 0;
310: }
311: if (s->servername_done == 0)
312: switch (servname_type)
313: {
314: case TLSEXT_NAMETYPE_host_name:
315: if (s->session->tlsext_hostname == NULL)
316: {
317: if (len > TLSEXT_MAXLEN_host_name ||
318: ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL))
319: {
320: *al = TLS1_AD_UNRECOGNIZED_NAME;
321: return 0;
322: }
323: memcpy(s->session->tlsext_hostname, sdata, len);
324: s->session->tlsext_hostname[len]='\0';
325: if (strlen(s->session->tlsext_hostname) != len) {
326: OPENSSL_free(s->session->tlsext_hostname);
327: *al = TLS1_AD_UNRECOGNIZED_NAME;
328: return 0;
329: }
330: s->servername_done = 1;
331:
332: }
333: else
334: s->servername_done = strlen(s->session->tlsext_hostname) == len
335: && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
336:
337: break;
338:
339: default:
340: break;
341: }
342:
343: dsize -= len;
344: }
345: if (dsize != 0)
346: {
347: *al = SSL_AD_DECODE_ERROR;
348: return 0;
349: }
350:
351: }
352:
353:
354: data+=size;
355: }
356:
357: *p = data;
358: return 1;
359: }
360:
361: int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
362: {
363: unsigned short type;
364: unsigned short size;
365: unsigned short len;
366: unsigned char *data = *p;
367:
368: int tlsext_servername = 0;
369:
370: if (data >= (d+n-2))
371: return 1;
372:
373: n2s(data,len);
374:
375: while(data <= (d+n-4))
376: {
377: n2s(data,type);
378: n2s(data,size);
379:
380: if (data+size > (d+n))
381: return 1;
382:
383: if (s->tlsext_debug_cb)
384: s->tlsext_debug_cb(s, 1, type, data, size,
385: s->tlsext_debug_arg);
386:
387: if (type == TLSEXT_TYPE_server_name)
388: {
389: if (s->tlsext_hostname == NULL || size > 0)
390: {
391: *al = TLS1_AD_UNRECOGNIZED_NAME;
392: return 0;
393: }
394: tlsext_servername = 1;
395: }
396: else if (type == TLSEXT_TYPE_session_ticket)
397: {
398: if ((SSL_get_options(s) & SSL_OP_NO_TICKET)
399: || (size > 0))
400: {
401: *al = TLS1_AD_UNSUPPORTED_EXTENSION;
402: return 0;
403: }
404: s->tlsext_ticket_expected = 1;
405: }
406:
407: data+=size;
408: }
409:
410: if (data != d+n)
411: {
412: *al = SSL_AD_DECODE_ERROR;
413: return 0;
414: }
415:
416: if (!s->hit && tlsext_servername == 1)
417: {
418: if (s->tlsext_hostname)
419: {
420: if (s->session->tlsext_hostname == NULL)
421: {
422: s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);
423: if (!s->session->tlsext_hostname)
424: {
425: *al = SSL_AD_UNRECOGNIZED_NAME;
426: return 0;
427: }
428: }
429: else
430: {
431: *al = SSL_AD_DECODE_ERROR;
432: return 0;
433: }
434: }
435: }
436:
437: *p = data;
438: return 1;
439: }
440:
441: int ssl_check_clienthello_tlsext(SSL *s)
442: {
443: int ret=SSL_TLSEXT_ERR_NOACK;
444: int al = SSL_AD_UNRECOGNIZED_NAME;
445:
446: if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
447: ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
448: else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
449: ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
450:
451: switch (ret)
452: {
453: case SSL_TLSEXT_ERR_ALERT_FATAL:
454: ssl3_send_alert(s,SSL3_AL_FATAL,al);
455: return -1;
456:
457: case SSL_TLSEXT_ERR_ALERT_WARNING:
458: ssl3_send_alert(s,SSL3_AL_WARNING,al);
459: return 1;
460:
461: case SSL_TLSEXT_ERR_NOACK:
462: s->servername_done=0;
463: default:
464: return 1;
465: }
466: }
467:
468: int ssl_check_serverhello_tlsext(SSL *s)
469: {
470: int ret=SSL_TLSEXT_ERR_NOACK;
471: int al = SSL_AD_UNRECOGNIZED_NAME;
472:
473: if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0)
474: ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
475: else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)
476: ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
477:
478: switch (ret)
479: {
480: case SSL_TLSEXT_ERR_ALERT_FATAL:
481: ssl3_send_alert(s,SSL3_AL_FATAL,al);
482: return -1;
483:
484: case SSL_TLSEXT_ERR_ALERT_WARNING:
485: ssl3_send_alert(s,SSL3_AL_WARNING,al);
486: return 1;
487:
488: case SSL_TLSEXT_ERR_NOACK:
489: s->servername_done=0;
490: default:
491: return 1;
492: }
493: }
494:
495:
496:
497:
498:
499:
500: int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
501: const unsigned char *limit, SSL_SESSION **ret)
502: {
503:
504: const unsigned char *p = session_id + len;
505: unsigned short i;
506: if ((s->version <= SSL3_VERSION) || !limit)
507: return 1;
508: if (p >= limit)
509: return -1;
510:
511: n2s(p, i);
512: p+= i;
513: if (p >= limit)
514: return -1;
515:
516: i = *(p++);
517: p += i;
518: if (p > limit)
519: return -1;
520:
521: if ((p + 2) >= limit)
522: return 1;
523: n2s(p, i);
524: while ((p + 4) <= limit)
525: {
526: unsigned short type, size;
527: n2s(p, type);
528: n2s(p, size);
529: if (p + size > limit)
530: return 1;
531: if (type == TLSEXT_TYPE_session_ticket)
532: {
533:
534:
535:
536: if (SSL_get_options(s) & SSL_OP_NO_TICKET)
537: return 0;
538:
539:
540:
541: if (size == 0)
542: {
543: s->tlsext_ticket_expected = 1;
544: return 0;
545: }
546: return tls_decrypt_ticket(s, p, size, session_id, len,
547: ret);
548: }
549: p += size;
550: }
551: return 1;
552: }
553:
554: static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
555: const unsigned char *sess_id, int sesslen,
556: SSL_SESSION **psess)
557: {
558: SSL_SESSION *sess;
559: unsigned char *sdec;
560: const unsigned char *p;
561: int slen, mlen;
562: unsigned char tick_hmac[EVP_MAX_MD_SIZE];
563: HMAC_CTX hctx;
564: EVP_CIPHER_CTX ctx;
565:
566:
567:
568: mlen = EVP_MD_size(tlsext_tick_md());
569: eticklen -= mlen;
570:
<