diff options
Diffstat (limited to 'src/lib/libssl/t1_enc.c')
-rw-r--r-- | src/lib/libssl/t1_enc.c | 309 |
1 files changed, 260 insertions, 49 deletions
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c index 793ea43e90..f7bdeb3b9d 100644 --- a/src/lib/libssl/t1_enc.c +++ b/src/lib/libssl/t1_enc.c | |||
@@ -143,6 +143,7 @@ | |||
143 | #include <openssl/evp.h> | 143 | #include <openssl/evp.h> |
144 | #include <openssl/hmac.h> | 144 | #include <openssl/hmac.h> |
145 | #include <openssl/md5.h> | 145 | #include <openssl/md5.h> |
146 | #include <openssl/rand.h> | ||
146 | #ifdef KSSL_DEBUG | 147 | #ifdef KSSL_DEBUG |
147 | #include <openssl/des.h> | 148 | #include <openssl/des.h> |
148 | #endif | 149 | #endif |
@@ -158,68 +159,75 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec, | |||
158 | unsigned char *out, int olen) | 159 | unsigned char *out, int olen) |
159 | { | 160 | { |
160 | int chunk; | 161 | int chunk; |
161 | unsigned int j; | 162 | size_t j; |
162 | HMAC_CTX ctx; | 163 | EVP_MD_CTX ctx, ctx_tmp; |
163 | HMAC_CTX ctx_tmp; | 164 | EVP_PKEY *mac_key; |
164 | unsigned char A1[EVP_MAX_MD_SIZE]; | 165 | unsigned char A1[EVP_MAX_MD_SIZE]; |
165 | unsigned int A1_len; | 166 | size_t A1_len; |
166 | int ret = 0; | 167 | int ret = 0; |
167 | 168 | ||
168 | chunk=EVP_MD_size(md); | 169 | chunk=EVP_MD_size(md); |
169 | OPENSSL_assert(chunk >= 0); | 170 | OPENSSL_assert(chunk >= 0); |
170 | 171 | ||
171 | HMAC_CTX_init(&ctx); | 172 | EVP_MD_CTX_init(&ctx); |
172 | HMAC_CTX_init(&ctx_tmp); | 173 | EVP_MD_CTX_init(&ctx_tmp); |
173 | if (!HMAC_Init_ex(&ctx,sec,sec_len,md, NULL)) | 174 | EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); |
175 | EVP_MD_CTX_set_flags(&ctx_tmp, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); | ||
176 | mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len); | ||
177 | if (!mac_key) | ||
178 | goto err; | ||
179 | if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key)) | ||
174 | goto err; | 180 | goto err; |
175 | if (!HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL)) | 181 | if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key)) |
176 | goto err; | 182 | goto err; |
177 | if (seed1 != NULL && !HMAC_Update(&ctx,seed1,seed1_len)) | 183 | if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len)) |
178 | goto err; | 184 | goto err; |
179 | if (seed2 != NULL && !HMAC_Update(&ctx,seed2,seed2_len)) | 185 | if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len)) |
180 | goto err; | 186 | goto err; |
181 | if (seed3 != NULL && !HMAC_Update(&ctx,seed3,seed3_len)) | 187 | if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len)) |
182 | goto err; | 188 | goto err; |
183 | if (seed4 != NULL && !HMAC_Update(&ctx,seed4,seed4_len)) | 189 | if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len)) |
184 | goto err; | 190 | goto err; |
185 | if (seed5 != NULL && !HMAC_Update(&ctx,seed5,seed5_len)) | 191 | if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len)) |
186 | goto err; | 192 | goto err; |
187 | if (!HMAC_Final(&ctx,A1,&A1_len)) | 193 | if (!EVP_DigestSignFinal(&ctx,A1,&A1_len)) |
188 | goto err; | 194 | goto err; |
189 | 195 | ||
190 | for (;;) | 196 | for (;;) |
191 | { | 197 | { |
192 | if (!HMAC_Init_ex(&ctx,NULL,0,NULL,NULL)) /* re-init */ | 198 | /* Reinit mac contexts */ |
199 | if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key)) | ||
193 | goto err; | 200 | goto err; |
194 | if (!HMAC_Init_ex(&ctx_tmp,NULL,0,NULL,NULL)) /* re-init */ | 201 | if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key)) |
195 | goto err; | 202 | goto err; |
196 | if (!HMAC_Update(&ctx,A1,A1_len)) | 203 | if (!EVP_DigestSignUpdate(&ctx,A1,A1_len)) |
197 | goto err; | 204 | goto err; |
198 | if (!HMAC_Update(&ctx_tmp,A1,A1_len)) | 205 | if (!EVP_DigestSignUpdate(&ctx_tmp,A1,A1_len)) |
199 | goto err; | 206 | goto err; |
200 | if (seed1 != NULL && !HMAC_Update(&ctx,seed1,seed1_len)) | 207 | if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len)) |
201 | goto err; | 208 | goto err; |
202 | if (seed2 != NULL && !HMAC_Update(&ctx,seed2,seed2_len)) | 209 | if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len)) |
203 | goto err; | 210 | goto err; |
204 | if (seed3 != NULL && !HMAC_Update(&ctx,seed3,seed3_len)) | 211 | if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len)) |
205 | goto err; | 212 | goto err; |
206 | if (seed4 != NULL && !HMAC_Update(&ctx,seed4,seed4_len)) | 213 | if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len)) |
207 | goto err; | 214 | goto err; |
208 | if (seed5 != NULL && !HMAC_Update(&ctx,seed5,seed5_len)) | 215 | if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len)) |
209 | goto err; | 216 | goto err; |
210 | 217 | ||
211 | if (olen > chunk) | 218 | if (olen > chunk) |
212 | { | 219 | { |
213 | if (!HMAC_Final(&ctx,out,&j)) | 220 | if (!EVP_DigestSignFinal(&ctx,out,&j)) |
214 | goto err; | 221 | goto err; |
215 | out+=j; | 222 | out+=j; |
216 | olen-=j; | 223 | olen-=j; |
217 | if (!HMAC_Final(&ctx_tmp,A1,&A1_len)) /* calc the next A1 value */ | 224 | /* calc the next A1 value */ |
225 | if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len)) | ||
218 | goto err; | 226 | goto err; |
219 | } | 227 | } |
220 | else /* last one */ | 228 | else /* last one */ |
221 | { | 229 | { |
222 | if (!HMAC_Final(&ctx,A1,&A1_len)) | 230 | if (!EVP_DigestSignFinal(&ctx,A1,&A1_len)) |
223 | goto err; | 231 | goto err; |
224 | memcpy(out,A1,olen); | 232 | memcpy(out,A1,olen); |
225 | break; | 233 | break; |
@@ -227,8 +235,9 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec, | |||
227 | } | 235 | } |
228 | ret = 1; | 236 | ret = 1; |
229 | err: | 237 | err: |
230 | HMAC_CTX_cleanup(&ctx); | 238 | EVP_PKEY_free(mac_key); |
231 | HMAC_CTX_cleanup(&ctx_tmp); | 239 | EVP_MD_CTX_cleanup(&ctx); |
240 | EVP_MD_CTX_cleanup(&ctx_tmp); | ||
232 | OPENSSL_cleanse(A1,sizeof(A1)); | 241 | OPENSSL_cleanse(A1,sizeof(A1)); |
233 | return ret; | 242 | return ret; |
234 | } | 243 | } |
@@ -256,6 +265,8 @@ static int tls1_PRF(long digest_mask, | |||
256 | if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) count++; | 265 | if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) count++; |
257 | } | 266 | } |
258 | len=slen/count; | 267 | len=slen/count; |
268 | if (count == 1) | ||
269 | slen = 0; | ||
259 | S1=sec; | 270 | S1=sec; |
260 | memset(out1,0,olen); | 271 | memset(out1,0,olen); |
261 | for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) { | 272 | for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) { |
@@ -284,7 +295,7 @@ static int tls1_generate_key_block(SSL *s, unsigned char *km, | |||
284 | unsigned char *tmp, int num) | 295 | unsigned char *tmp, int num) |
285 | { | 296 | { |
286 | int ret; | 297 | int ret; |
287 | ret = tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | 298 | ret = tls1_PRF(ssl_get_algorithm2(s), |
288 | TLS_MD_KEY_EXPANSION_CONST,TLS_MD_KEY_EXPANSION_CONST_SIZE, | 299 | TLS_MD_KEY_EXPANSION_CONST,TLS_MD_KEY_EXPANSION_CONST_SIZE, |
289 | s->s3->server_random,SSL3_RANDOM_SIZE, | 300 | s->s3->server_random,SSL3_RANDOM_SIZE, |
290 | s->s3->client_random,SSL3_RANDOM_SIZE, | 301 | s->s3->client_random,SSL3_RANDOM_SIZE, |
@@ -358,7 +369,7 @@ int tls1_change_cipher_state(SSL *s, int which) | |||
358 | { | 369 | { |
359 | if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC) | 370 | if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC) |
360 | s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM; | 371 | s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM; |
361 | else | 372 | else |
362 | s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM; | 373 | s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM; |
363 | 374 | ||
364 | if (s->enc_read_ctx != NULL) | 375 | if (s->enc_read_ctx != NULL) |
@@ -445,7 +456,11 @@ int tls1_change_cipher_state(SSL *s, int which) | |||
445 | j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ? | 456 | j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ? |
446 | cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl; | 457 | cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl; |
447 | /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */ | 458 | /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */ |
448 | k=EVP_CIPHER_iv_length(c); | 459 | /* If GCM mode only part of IV comes from PRF */ |
460 | if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) | ||
461 | k = EVP_GCM_TLS_FIXED_IV_LEN; | ||
462 | else | ||
463 | k=EVP_CIPHER_iv_length(c); | ||
449 | if ( (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) || | 464 | if ( (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) || |
450 | (which == SSL3_CHANGE_CIPHER_SERVER_READ)) | 465 | (which == SSL3_CHANGE_CIPHER_SERVER_READ)) |
451 | { | 466 | { |
@@ -474,10 +489,14 @@ int tls1_change_cipher_state(SSL *s, int which) | |||
474 | } | 489 | } |
475 | 490 | ||
476 | memcpy(mac_secret,ms,i); | 491 | memcpy(mac_secret,ms,i); |
477 | mac_key = EVP_PKEY_new_mac_key(mac_type, NULL, | 492 | |
478 | mac_secret,*mac_secret_size); | 493 | if (!(EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER)) |
479 | EVP_DigestSignInit(mac_ctx,NULL,m,NULL,mac_key); | 494 | { |
480 | EVP_PKEY_free(mac_key); | 495 | mac_key = EVP_PKEY_new_mac_key(mac_type, NULL, |
496 | mac_secret,*mac_secret_size); | ||
497 | EVP_DigestSignInit(mac_ctx,NULL,m,NULL,mac_key); | ||
498 | EVP_PKEY_free(mac_key); | ||
499 | } | ||
481 | #ifdef TLS_DEBUG | 500 | #ifdef TLS_DEBUG |
482 | printf("which = %04X\nmac key=",which); | 501 | printf("which = %04X\nmac key=",which); |
483 | { int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); } | 502 | { int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); } |
@@ -487,7 +506,7 @@ printf("which = %04X\nmac key=",which); | |||
487 | /* In here I set both the read and write key/iv to the | 506 | /* In here I set both the read and write key/iv to the |
488 | * same value since only the correct one will be used :-). | 507 | * same value since only the correct one will be used :-). |
489 | */ | 508 | */ |
490 | if (!tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | 509 | if (!tls1_PRF(ssl_get_algorithm2(s), |
491 | exp_label,exp_label_len, | 510 | exp_label,exp_label_len, |
492 | s->s3->client_random,SSL3_RANDOM_SIZE, | 511 | s->s3->client_random,SSL3_RANDOM_SIZE, |
493 | s->s3->server_random,SSL3_RANDOM_SIZE, | 512 | s->s3->server_random,SSL3_RANDOM_SIZE, |
@@ -498,7 +517,7 @@ printf("which = %04X\nmac key=",which); | |||
498 | 517 | ||
499 | if (k > 0) | 518 | if (k > 0) |
500 | { | 519 | { |
501 | if (!tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | 520 | if (!tls1_PRF(ssl_get_algorithm2(s), |
502 | TLS_MD_IV_BLOCK_CONST,TLS_MD_IV_BLOCK_CONST_SIZE, | 521 | TLS_MD_IV_BLOCK_CONST,TLS_MD_IV_BLOCK_CONST_SIZE, |
503 | s->s3->client_random,SSL3_RANDOM_SIZE, | 522 | s->s3->client_random,SSL3_RANDOM_SIZE, |
504 | s->s3->server_random,SSL3_RANDOM_SIZE, | 523 | s->s3->server_random,SSL3_RANDOM_SIZE, |
@@ -524,7 +543,19 @@ printf("which = %04X\nmac key=",which); | |||
524 | } | 543 | } |
525 | #endif /* KSSL_DEBUG */ | 544 | #endif /* KSSL_DEBUG */ |
526 | 545 | ||
527 | EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE)); | 546 | if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) |
547 | { | ||
548 | EVP_CipherInit_ex(dd,c,NULL,key,NULL,(which & SSL3_CC_WRITE)); | ||
549 | EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GCM_SET_IV_FIXED, k, iv); | ||
550 | } | ||
551 | else | ||
552 | EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE)); | ||
553 | |||
554 | /* Needed for "composite" AEADs, such as RC4-HMAC-MD5 */ | ||
555 | if ((EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER) && *mac_secret_size) | ||
556 | EVP_CIPHER_CTX_ctrl(dd,EVP_CTRL_AEAD_SET_MAC_KEY, | ||
557 | *mac_secret_size,mac_secret); | ||
558 | |||
528 | #ifdef TLS_DEBUG | 559 | #ifdef TLS_DEBUG |
529 | printf("which = %04X\nkey=",which); | 560 | printf("which = %04X\nkey=",which); |
530 | { int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); } | 561 | { int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); } |
@@ -606,7 +637,8 @@ printf("\nkey block\n"); | |||
606 | { int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); } | 637 | { int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); } |
607 | #endif | 638 | #endif |
608 | 639 | ||
609 | if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) | 640 | if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) |
641 | && s->method->version <= TLS1_VERSION) | ||
610 | { | 642 | { |
611 | /* enable vulnerability countermeasure for CBC ciphers with | 643 | /* enable vulnerability countermeasure for CBC ciphers with |
612 | * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt) | 644 | * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt) |
@@ -640,14 +672,14 @@ int tls1_enc(SSL *s, int send) | |||
640 | SSL3_RECORD *rec; | 672 | SSL3_RECORD *rec; |
641 | EVP_CIPHER_CTX *ds; | 673 | EVP_CIPHER_CTX *ds; |
642 | unsigned long l; | 674 | unsigned long l; |
643 | int bs,i,ii,j,k,n=0; | 675 | int bs,i,ii,j,k,pad=0; |
644 | const EVP_CIPHER *enc; | 676 | const EVP_CIPHER *enc; |
645 | 677 | ||
646 | if (send) | 678 | if (send) |
647 | { | 679 | { |
648 | if (EVP_MD_CTX_md(s->write_hash)) | 680 | if (EVP_MD_CTX_md(s->write_hash)) |
649 | { | 681 | { |
650 | n=EVP_MD_CTX_size(s->write_hash); | 682 | int n=EVP_MD_CTX_size(s->write_hash); |
651 | OPENSSL_assert(n >= 0); | 683 | OPENSSL_assert(n >= 0); |
652 | } | 684 | } |
653 | ds=s->enc_write_ctx; | 685 | ds=s->enc_write_ctx; |
@@ -655,13 +687,34 @@ int tls1_enc(SSL *s, int send) | |||
655 | if (s->enc_write_ctx == NULL) | 687 | if (s->enc_write_ctx == NULL) |
656 | enc=NULL; | 688 | enc=NULL; |
657 | else | 689 | else |
690 | { | ||
691 | int ivlen; | ||
658 | enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx); | 692 | enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx); |
693 | /* For TLSv1.1 and later explicit IV */ | ||
694 | if (s->version >= TLS1_1_VERSION | ||
695 | && EVP_CIPHER_mode(enc) == EVP_CIPH_CBC_MODE) | ||
696 | ivlen = EVP_CIPHER_iv_length(enc); | ||
697 | else | ||
698 | ivlen = 0; | ||
699 | if (ivlen > 1) | ||
700 | { | ||
701 | if ( rec->data != rec->input) | ||
702 | /* we can't write into the input stream: | ||
703 | * Can this ever happen?? (steve) | ||
704 | */ | ||
705 | fprintf(stderr, | ||
706 | "%s:%d: rec->data != rec->input\n", | ||
707 | __FILE__, __LINE__); | ||
708 | else if (RAND_bytes(rec->input, ivlen) <= 0) | ||
709 | return -1; | ||
710 | } | ||
711 | } | ||
659 | } | 712 | } |
660 | else | 713 | else |
661 | { | 714 | { |
662 | if (EVP_MD_CTX_md(s->read_hash)) | 715 | if (EVP_MD_CTX_md(s->read_hash)) |
663 | { | 716 | { |
664 | n=EVP_MD_CTX_size(s->read_hash); | 717 | int n=EVP_MD_CTX_size(s->read_hash); |
665 | OPENSSL_assert(n >= 0); | 718 | OPENSSL_assert(n >= 0); |
666 | } | 719 | } |
667 | ds=s->enc_read_ctx; | 720 | ds=s->enc_read_ctx; |
@@ -687,7 +740,43 @@ int tls1_enc(SSL *s, int send) | |||
687 | l=rec->length; | 740 | l=rec->length; |
688 | bs=EVP_CIPHER_block_size(ds->cipher); | 741 | bs=EVP_CIPHER_block_size(ds->cipher); |
689 | 742 | ||
690 | if ((bs != 1) && send) | 743 | if (EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER) |
744 | { | ||
745 | unsigned char buf[13],*seq; | ||
746 | |||
747 | seq = send?s->s3->write_sequence:s->s3->read_sequence; | ||
748 | |||
749 | if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER) | ||
750 | { | ||
751 | unsigned char dtlsseq[9],*p=dtlsseq; | ||
752 | |||
753 | s2n(send?s->d1->w_epoch:s->d1->r_epoch,p); | ||
754 | memcpy(p,&seq[2],6); | ||
755 | memcpy(buf,dtlsseq,8); | ||
756 | } | ||
757 | else | ||
758 | { | ||
759 | memcpy(buf,seq,8); | ||
760 | for (i=7; i>=0; i--) /* increment */ | ||
761 | { | ||
762 | ++seq[i]; | ||
763 | if (seq[i] != 0) break; | ||
764 | } | ||
765 | } | ||
766 | |||
767 | buf[8]=rec->type; | ||
768 | buf[9]=(unsigned char)(s->version>>8); | ||
769 | buf[10]=(unsigned char)(s->version); | ||
770 | buf[11]=rec->length>>8; | ||
771 | buf[12]=rec->length&0xff; | ||
772 | pad=EVP_CIPHER_CTX_ctrl(ds,EVP_CTRL_AEAD_TLS1_AAD,13,buf); | ||
773 | if (send) | ||
774 | { | ||
775 | l+=pad; | ||
776 | rec->length+=pad; | ||
777 | } | ||
778 | } | ||
779 | else if ((bs != 1) && send) | ||
691 | { | 780 | { |
692 | i=bs-((int)l%bs); | 781 | i=bs-((int)l%bs); |
693 | 782 | ||
@@ -728,13 +817,25 @@ int tls1_enc(SSL *s, int send) | |||
728 | { | 817 | { |
729 | if (l == 0 || l%bs != 0) | 818 | if (l == 0 || l%bs != 0) |
730 | { | 819 | { |
820 | if (s->version >= TLS1_1_VERSION) | ||
821 | return -1; | ||
731 | SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG); | 822 | SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG); |
732 | ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED); | 823 | ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED); |
733 | return 0; | 824 | return 0; |
734 | } | 825 | } |
735 | } | 826 | } |
736 | 827 | ||
737 | EVP_Cipher(ds,rec->data,rec->input,l); | 828 | i = EVP_Cipher(ds,rec->data,rec->input,l); |
829 | if ((EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_CUSTOM_CIPHER) | ||
830 | ?(i<0) | ||
831 | :(i==0)) | ||
832 | return -1; /* AEAD can fail to verify MAC */ | ||
833 | if (EVP_CIPHER_mode(enc) == EVP_CIPH_GCM_MODE && !send) | ||
834 | { | ||
835 | rec->data += EVP_GCM_TLS_EXPLICIT_IV_LEN; | ||
836 | rec->input += EVP_GCM_TLS_EXPLICIT_IV_LEN; | ||
837 | rec->length -= EVP_GCM_TLS_EXPLICIT_IV_LEN; | ||
838 | } | ||
738 | 839 | ||
739 | #ifdef KSSL_DEBUG | 840 | #ifdef KSSL_DEBUG |
740 | { | 841 | { |
@@ -784,8 +885,19 @@ int tls1_enc(SSL *s, int send) | |||
784 | return -1; | 885 | return -1; |
785 | } | 886 | } |
786 | } | 887 | } |
787 | rec->length-=i; | 888 | rec->length -=i; |
889 | if (s->version >= TLS1_1_VERSION | ||
890 | && EVP_CIPHER_CTX_mode(ds) == EVP_CIPH_CBC_MODE) | ||
891 | { | ||
892 | if (bs > (int)rec->length) | ||
893 | return -1; | ||
894 | rec->data += bs; /* skip the explicit IV */ | ||
895 | rec->input += bs; | ||
896 | rec->length -= bs; | ||
897 | } | ||
788 | } | 898 | } |
899 | if (pad && !send) | ||
900 | rec->length -= pad; | ||
789 | } | 901 | } |
790 | return(1); | 902 | return(1); |
791 | } | 903 | } |
@@ -841,7 +953,7 @@ int tls1_final_finish_mac(SSL *s, | |||
841 | 953 | ||
842 | for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++) | 954 | for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++) |
843 | { | 955 | { |
844 | if (mask & s->s3->tmp.new_cipher->algorithm2) | 956 | if (mask & ssl_get_algorithm2(s)) |
845 | { | 957 | { |
846 | int hashsize = EVP_MD_size(md); | 958 | int hashsize = EVP_MD_size(md); |
847 | if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf))) | 959 | if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf))) |
@@ -860,7 +972,7 @@ int tls1_final_finish_mac(SSL *s, | |||
860 | } | 972 | } |
861 | } | 973 | } |
862 | 974 | ||
863 | if (!tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | 975 | if (!tls1_PRF(ssl_get_algorithm2(s), |
864 | str,slen, buf,(int)(q-buf), NULL,0, NULL,0, NULL,0, | 976 | str,slen, buf,(int)(q-buf), NULL,0, NULL,0, NULL,0, |
865 | s->session->master_key,s->session->master_key_length, | 977 | s->session->master_key,s->session->master_key_length, |
866 | out,buf2,sizeof buf2)) | 978 | out,buf2,sizeof buf2)) |
@@ -970,6 +1082,7 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | |||
970 | const void *co = NULL, *so = NULL; | 1082 | const void *co = NULL, *so = NULL; |
971 | int col = 0, sol = 0; | 1083 | int col = 0, sol = 0; |
972 | 1084 | ||
1085 | |||
973 | #ifdef KSSL_DEBUG | 1086 | #ifdef KSSL_DEBUG |
974 | printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len); | 1087 | printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len); |
975 | #endif /* KSSL_DEBUG */ | 1088 | #endif /* KSSL_DEBUG */ |
@@ -986,7 +1099,7 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | |||
986 | } | 1099 | } |
987 | #endif | 1100 | #endif |
988 | 1101 | ||
989 | tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | 1102 | tls1_PRF(ssl_get_algorithm2(s), |
990 | TLS_MD_MASTER_SECRET_CONST,TLS_MD_MASTER_SECRET_CONST_SIZE, | 1103 | TLS_MD_MASTER_SECRET_CONST,TLS_MD_MASTER_SECRET_CONST_SIZE, |
991 | s->s3->client_random,SSL3_RANDOM_SIZE, | 1104 | s->s3->client_random,SSL3_RANDOM_SIZE, |
992 | co, col, | 1105 | co, col, |
@@ -994,6 +1107,16 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | |||
994 | so, sol, | 1107 | so, sol, |
995 | p,len, | 1108 | p,len, |
996 | s->session->master_key,buff,sizeof buff); | 1109 | s->session->master_key,buff,sizeof buff); |
1110 | #ifdef SSL_DEBUG | ||
1111 | fprintf(stderr, "Premaster Secret:\n"); | ||
1112 | BIO_dump_fp(stderr, (char *)p, len); | ||
1113 | fprintf(stderr, "Client Random:\n"); | ||
1114 | BIO_dump_fp(stderr, (char *)s->s3->client_random, SSL3_RANDOM_SIZE); | ||
1115 | fprintf(stderr, "Server Random:\n"); | ||
1116 | BIO_dump_fp(stderr, (char *)s->s3->server_random, SSL3_RANDOM_SIZE); | ||
1117 | fprintf(stderr, "Master Secret:\n"); | ||
1118 | BIO_dump_fp(stderr, (char *)s->session->master_key, SSL3_MASTER_SECRET_SIZE); | ||
1119 | #endif | ||
997 | 1120 | ||
998 | #ifdef KSSL_DEBUG | 1121 | #ifdef KSSL_DEBUG |
999 | printf ("tls1_generate_master_secret() complete\n"); | 1122 | printf ("tls1_generate_master_secret() complete\n"); |
@@ -1001,6 +1124,95 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | |||
1001 | return(SSL3_MASTER_SECRET_SIZE); | 1124 | return(SSL3_MASTER_SECRET_SIZE); |
1002 | } | 1125 | } |
1003 | 1126 | ||
1127 | int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, | ||
1128 | const char *label, size_t llen, const unsigned char *context, | ||
1129 | size_t contextlen, int use_context) | ||
1130 | { | ||
1131 | unsigned char *buff; | ||
1132 | unsigned char *val = NULL; | ||
1133 | size_t vallen, currentvalpos; | ||
1134 | int rv; | ||
1135 | |||
1136 | #ifdef KSSL_DEBUG | ||
1137 | printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, p, plen); | ||
1138 | #endif /* KSSL_DEBUG */ | ||
1139 | |||
1140 | buff = OPENSSL_malloc(olen); | ||
1141 | if (buff == NULL) goto err2; | ||
1142 | |||
1143 | /* construct PRF arguments | ||
1144 | * we construct the PRF argument ourself rather than passing separate | ||
1145 | * values into the TLS PRF to ensure that the concatenation of values | ||
1146 | * does not create a prohibited label. | ||
1147 | */ | ||
1148 | vallen = llen + SSL3_RANDOM_SIZE * 2; | ||
1149 | if (use_context) | ||
1150 | { | ||
1151 | vallen += 2 + contextlen; | ||
1152 | } | ||
1153 | |||
1154 | val = OPENSSL_malloc(vallen); | ||
1155 | if (val == NULL) goto err2; | ||
1156 | currentvalpos = 0; | ||
1157 | memcpy(val + currentvalpos, (unsigned char *) label, llen); | ||
1158 | currentvalpos += llen; | ||
1159 | memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE); | ||
1160 | currentvalpos += SSL3_RANDOM_SIZE; | ||
1161 | memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE); | ||
1162 | currentvalpos += SSL3_RANDOM_SIZE; | ||
1163 | |||
1164 | if (use_context) | ||
1165 | { | ||
1166 | val[currentvalpos] = (contextlen >> 8) & 0xff; | ||
1167 | currentvalpos++; | ||
1168 | val[currentvalpos] = contextlen & 0xff; | ||
1169 | currentvalpos++; | ||
1170 | if ((contextlen > 0) || (context != NULL)) | ||
1171 | { | ||
1172 | memcpy(val + currentvalpos, context, contextlen); | ||
1173 | } | ||
1174 | } | ||
1175 | |||
1176 | /* disallow prohibited labels | ||
1177 | * note that SSL3_RANDOM_SIZE > max(prohibited label len) = | ||
1178 | * 15, so size of val > max(prohibited label len) = 15 and the | ||
1179 | * comparisons won't have buffer overflow | ||
1180 | */ | ||
1181 | if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST, | ||
1182 | TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0) goto err1; | ||
1183 | if (memcmp(val, TLS_MD_SERVER_FINISH_CONST, | ||
1184 | TLS_MD_SERVER_FINISH_CONST_SIZE) == 0) goto err1; | ||
1185 | if (memcmp(val, TLS_MD_MASTER_SECRET_CONST, | ||
1186 | TLS_MD_MASTER_SECRET_CONST_SIZE) == 0) goto err1; | ||
1187 | if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST, | ||
1188 | TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) goto err1; | ||
1189 | |||
1190 | rv = tls1_PRF(s->s3->tmp.new_cipher->algorithm2, | ||
1191 | val, vallen, | ||
1192 | NULL, 0, | ||
1193 | NULL, 0, | ||
1194 | NULL, 0, | ||
1195 | NULL, 0, | ||
1196 | s->session->master_key,s->session->master_key_length, | ||
1197 | out,buff,olen); | ||
1198 | |||
1199 | #ifdef KSSL_DEBUG | ||
1200 | printf ("tls1_export_keying_material() complete\n"); | ||
1201 | #endif /* KSSL_DEBUG */ | ||
1202 | goto ret; | ||
1203 | err1: | ||
1204 | SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL); | ||
1205 | rv = 0; | ||
1206 | goto ret; | ||
1207 | err2: | ||
1208 | SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, ERR_R_MALLOC_FAILURE); | ||
1209 | rv = 0; | ||
1210 | ret: | ||
1211 | if (buff != NULL) OPENSSL_free(buff); | ||
1212 | if (val != NULL) OPENSSL_free(val); | ||
1213 | return(rv); | ||
1214 | } | ||
1215 | |||
1004 | int tls1_alert_code(int code) | 1216 | int tls1_alert_code(int code) |
1005 | { | 1217 | { |
1006 | switch (code) | 1218 | switch (code) |
@@ -1042,4 +1254,3 @@ int tls1_alert_code(int code) | |||
1042 | default: return(-1); | 1254 | default: return(-1); |
1043 | } | 1255 | } |
1044 | } | 1256 | } |
1045 | |||