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/evp.h>
115: #include <openssl/md5.h>
116:
117: static unsigned char ssl3_pad_1[48]={
118: 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
119: 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
120: 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
121: 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
122: 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
123: 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 };
124:
125: static unsigned char ssl3_pad_2[48]={
126: 0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
127: 0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
128: 0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
129: 0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
130: 0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
131: 0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c };
132:
133: static int ssl3_handshake_mac(SSL *s, EVP_MD_CTX *in_ctx,
134: const char *sender, int len, unsigned char *p);
135:
136: static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num)
137: {
138: EVP_MD_CTX m5;
139: EVP_MD_CTX s1;
140: unsigned char buf[16],smd[SHA_DIGEST_LENGTH];
141: unsigned char c='A';
142: unsigned int i,j,k;
143:
144: #ifdef CHARSET_EBCDIC
145: c = os_toascii[c];
146: #endif
147: k=0;
148: EVP_MD_CTX_init(&m5);
149: EVP_MD_CTX_init(&s1);
150: for (i=0; (int)i<num; i+=MD5_DIGEST_LENGTH)
151: {
152: k++;
153: if (k > sizeof buf)
154: {
155:
156: SSLerr(SSL_F_SSL3_GENERATE_KEY_BLOCK, ERR_R_INTERNAL_ERROR);
157: return 0;
158: }
159:
160: for (j=0; j<k; j++)
161: buf[j]=c;
162: c++;
163: EVP_DigestInit_ex(&s1,EVP_sha1(), NULL);
164: EVP_DigestUpdate(&s1,buf,k);
165: EVP_DigestUpdate(&s1,s->session->master_key,
166: s->session->master_key_length);
167: EVP_DigestUpdate(&s1,s->s3->server_random,SSL3_RANDOM_SIZE);
168: EVP_DigestUpdate(&s1,s->s3->client_random,SSL3_RANDOM_SIZE);
169: EVP_DigestFinal_ex(&s1,smd,NULL);
170:
171: EVP_DigestInit_ex(&m5,EVP_md5(), NULL);
172: EVP_DigestUpdate(&m5,s->session->master_key,
173: s->session->master_key_length);
174: EVP_DigestUpdate(&m5,smd,SHA_DIGEST_LENGTH);
175: if ((int)(i+MD5_DIGEST_LENGTH) > num)
176: {
177: EVP_DigestFinal_ex(&m5,smd,NULL);
178: memcpy(km,smd,(num-i));
179: }
180: else
181: EVP_DigestFinal_ex(&m5,km,NULL);
182:
183: km+=MD5_DIGEST_LENGTH;
184: }
185: OPENSSL_cleanse(smd,SHA_DIGEST_LENGTH);
186: EVP_MD_CTX_cleanup(&m5);
187: EVP_MD_CTX_cleanup(&s1);
188: return 1;
189: }
190:
191: int ssl3_change_cipher_state(SSL *s, int which)
192: {
193: unsigned char *p,*key_block,*mac_secret;
194: unsigned char exp_key[EVP_MAX_KEY_LENGTH];
195: unsigned char exp_iv[EVP_MAX_IV_LENGTH];
196: unsigned char *ms,*key,*iv,*er1,*er2;
197: EVP_CIPHER_CTX *dd;
198: const EVP_CIPHER *c;
199: #ifndef OPENSSL_NO_COMP
200: COMP_METHOD *comp;
201: #endif
202: const EVP_MD *m;
203: EVP_MD_CTX md;
204: int is_exp,n,i,j,k,cl;
205: int reuse_dd = 0;
206:
207: is_exp=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
208: c=s->s3->tmp.new_sym_enc;
209: m=s->s3->tmp.new_hash;
210: #ifndef OPENSSL_NO_COMP
211: if (s->s3->tmp.new_compression == NULL)
212: comp=NULL;
213: else
214: comp=s->s3->tmp.new_compression->method;
215: #endif
216: key_block=s->s3->tmp.key_block;
217:
218: if (which & SSL3_CC_READ)
219: {
220: if (s->enc_read_ctx != NULL)
221: reuse_dd = 1;
222: else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
223: goto err;
224: else
225:
226: EVP_CIPHER_CTX_init(s->enc_read_ctx);
227: dd= s->enc_read_ctx;
228: s->read_hash=m;
229: #ifndef OPENSSL_NO_COMP
230:
231: if (s->expand != NULL)
232: {
233: COMP_CTX_free(s->expand);
234: s->expand=NULL;
235: }
236: if (comp != NULL)
237: {
238: s->expand=COMP_CTX_new(comp);
239: if (s->expand == NULL)
240: {
241: SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
242: goto err2;
243: }
244: if (s->s3->rrec.comp == NULL)
245: s->s3->rrec.comp=(unsigned char *)
246: OPENSSL_malloc(SSL3_RT_MAX_PLAIN_LENGTH);
247: if (s->s3->rrec.comp == NULL)
248: goto err;
249: }
250: #endif
251: memset(&(s->s3->read_sequence[0]),0,8);
252: mac_secret= &(s->s3->read_mac_secret[0]);
253: }
254: else
255: {
256: if (s->enc_write_ctx != NULL)
257: reuse_dd = 1;
258: else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
259: goto err;
260: else
261:
262: EVP_CIPHER_CTX_init(s->enc_write_ctx);
263: dd= s->enc_write_ctx;
264: s->write_hash=m;
265: #ifndef OPENSSL_NO_COMP
266:
267: if (s->compress != NULL)
268: {
269: COMP_CTX_free(s->compress);
270: s->compress=NULL;
271: }
272: if (comp != NULL)
273: {
274: s->compress=COMP_CTX_new(comp);
275: if (s->compress == NULL)
276: {
277: SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
278: goto err2;
279: }
280: }
281: #endif
282: memset(&(s->s3->write_sequence[0]),0,8);
283: mac_secret= &(s->s3->write_mac_secret[0]);
284: }
285:
286: if (reuse_dd)
287: EVP_CIPHER_CTX_cleanup(dd);
288:
289: p=s->s3->tmp.key_block;
290: i=EVP_MD_size(m);
291: cl=EVP_CIPHER_key_length(c);
292: j=is_exp ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
293: cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
294:
295: k=EVP_CIPHER_iv_length(c);
296: if ( (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
297: (which == SSL3_CHANGE_CIPHER_SERVER_READ))
298: {
299: ms= &(p[ 0]); n=i+i;
300: key= &(p[ n]); n+=j+j;
301: iv= &(p[ n]); n+=k+k;
302: er1= &(s->s3->client_random[0]);
303: er2= &(s->s3->server_random[0]);
304: }
305: else
306: {
307: n=i;
308: ms= &(p[ n]); n+=i+j;
309: key= &(p[ n]); n+=j+k;
310: iv= &(p[ n]); n+=k;
311: er1= &(s->s3->server_random[0]);
312: er2= &(s->s3->client_random[0]);
313: }
314:
315: if (n > s->s3->tmp.key_block_length)
316: {
317: SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
318: goto err2;
319: }
320:
321: EVP_MD_CTX_init(&md);
322: memcpy(mac_secret,ms,i);
323: if (is_exp)
324: {
325:
326:
327:
328: EVP_DigestInit_ex(&md,EVP_md5(), NULL);
329: EVP_DigestUpdate(&md,key,j);
330: EVP_DigestUpdate(&md,er1,SSL3_RANDOM_SIZE);
331: EVP_DigestUpdate(&md,er2,SSL3_RANDOM_SIZE);
332: EVP_DigestFinal_ex(&md,&(exp_key[0]),NULL);
333: key= &(exp_key[0]);
334:
335: if (k > 0)
336: {
337: EVP_DigestInit_ex(&md,EVP_md5(), NULL);
338: EVP_DigestUpdate(&md,er1,SSL3_RANDOM_SIZE);
339: EVP_DigestUpdate(&md,er2,SSL3_RANDOM_SIZE);
340: EVP_DigestFinal_ex(&md,&(exp_iv[0]),NULL);
341: iv= &(exp_iv[0]);
342: }
343: }
344:
345: s->session->key_arg_length=0;
346:
347: EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
348:
349: OPENSSL_cleanse(&(exp_key[0]),sizeof(exp_key));
350: OPENSSL_cleanse(&(exp_iv[0]),sizeof(exp_iv));
351: EVP_MD_CTX_cleanup(&md);
352: return(1);
353: err:
354: SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
355: err2:
356: return(0);
357: }
358:
359: int ssl3_setup_key_block(SSL *s)
360: {
361: unsigned char *p;
362: const EVP_CIPHER *c;
363: const EVP_MD *hash;
364: int num;
365: int ret = 0;
366: SSL_COMP *comp;
367:
368: if (s->s3->tmp.key_block_length != 0)
369: return(1);
370:
371: if (!ssl_cipher_get_evp(s->session,&c,&hash,&comp))
372: {
373: SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
374: return(0);
375: }
376:
377: s->s3->tmp.new_sym_enc=c;
378: s->s3->tmp.new_hash=hash;
379: #ifdef OPENSSL_NO_COMP
380: s->s3->tmp.new_compression=NULL;
381: #else
382: s->s3->tmp.new_compression=comp;
383: #endif
384:
385: num=EVP_CIPHER_key_length(c)+EVP_MD_size(hash)+EVP_CIPHER_iv_length(c);
386: num*=2;
387:
388: ssl3_cleanup_key_block(s);
389:
390: if ((p=OPENSSL_malloc(num)) == NULL)
391: goto err;
392:
393: s->s3->tmp.key_block_length=num;
394: s->s3->tmp.key_block=p;
395:
396: ret = ssl3_generate_key_block(s,p,num);
397:
398: if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
399: {
400:
401:
402:
403: s->s3->need_empty_fragments = 1;
404:
405: if (s->session->cipher != NULL)
406: {
407: if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_eNULL)
408: s->s3->need_empty_fragments = 0;
409:
410: #ifndef OPENSSL_NO_RC4
411: if ((s->session->cipher->algorithms & SSL_ENC_MASK) == SSL_RC4)
412: s->s3->need_empty_fragments = 0;
413: #endif
414: }
415: }
416:
417: return ret;
418:
419: err:
420: SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
421: return(0);
422: }
423:
424: void ssl3_cleanup_key_block(SSL *s)
425: {
426: if (s->s3->tmp.key_block != NULL)
427: {
428: OPENSSL_cleanse(s->s3->tmp.key_block,
429: s->s3->tmp.key_block_length);
430: OPENSSL_free(s->s3->tmp.key_block);
431: s->s3->tmp.key_block=NULL;
432: }
433: s->s3->tmp.key_block_length=0;
434: }
435:
436: int ssl3_enc(SSL *s, int send)
437: {
438: SSL3_RECORD *rec;
439: EVP_CIPHER_CTX *ds;
440: unsigned long l;
441: int bs,i;
442: const EVP_CIPHER *enc;
443:
444: if (send)
445: {
446: ds=s->enc_write_ctx;
447: rec= &(s->s3->wrec);
448: if (s->enc_write_ctx == NULL)
449: enc=NULL;
450: else
451: enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
452: }
453: else
454: {
455: ds=s->enc_read_ctx;
456: rec= &(s->s3->rrec);
457: if (s->enc_read_ctx == NULL)
458: enc=NULL;
459: else
460: enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
461: }
462:
463: if ((s->session == NULL) || (ds == NULL) ||
464: (enc == NULL))
465: {
466: memmove(rec->data,rec->input,rec->length);
467: rec->input=rec->data;
468: }
469: else
470: {
471: l=rec->length;
472: bs=EVP_CIPHER_block_size(ds->cipher);
473:
474:
475:
476: if ((bs != 1) && send)
477: {
478: i=bs-((int)l%bs);
479:
480:
481: l+=i;
482: rec->length+=i;
483: rec->input[l-1]=(i-1);
484: }
485:
486: if (!send)
487: {
488: if (l == 0 || l%bs != 0)
489: {
490: SSLerr(SSL_F_SSL3_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
491: ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
492: return 0;
493: }
494:
495: }
496:
497: EVP_Cipher(ds,rec->data,rec->input,l);
498:
499: if ((bs != 1) && !send)
500: {
501: i=rec->data[l-1]+1;
502:
503:
504: if (i > bs)
505: {
506:
507:
508:
509:
510: return -1;
511: }
512:
513: rec->length-=i;
514: }
515: }
516: return(1);
517: }
518:
519: void ssl3_init_finished_mac(SSL *s)
520: {
521: EVP_DigestInit_ex(&(s->s3->finish_dgst1),s->ctx->md5, NULL);
522: EVP_DigestInit_ex(&(s->s3->finish_dgst2),s->ctx->sha1, NULL);
523: }
524:
525: void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len)
526: {
527: EVP_DigestUpdate(&(s->s3->finish_dgst1),buf,len);
528: EVP_DigestUpdate(&(s->s3->finish_dgst2),buf,len);
529: }
530:
531: int ssl3_cert_verify_mac(SSL *s, EVP_MD_CTX *ctx, unsigned char *p)
532: {
533: return(ssl3_handshake_mac(s,ctx,NULL,0,p));
534: }
535:
536: int ssl3_final_finish_mac(SSL *s, EVP_MD_CTX *ctx1, EVP_MD_CTX *ctx2,
537: const char *sender, int len, unsigned char *p)
538: {
539: int ret;
540: