diff options
Diffstat (limited to 'src/lib/libssl/s3_lib.c')
-rw-r--r-- | src/lib/libssl/s3_lib.c | 403 |
1 files changed, 352 insertions, 51 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index c32c06de32..686992406c 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -56,7 +56,7 @@ | |||
56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
57 | */ | 57 | */ |
58 | /* ==================================================================== | 58 | /* ==================================================================== |
59 | * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. | 59 | * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. |
60 | * | 60 | * |
61 | * Redistribution and use in source and binary forms, with or without | 61 | * Redistribution and use in source and binary forms, with or without |
62 | * modification, are permitted provided that the following conditions | 62 | * modification, are permitted provided that the following conditions |
@@ -110,10 +110,10 @@ | |||
110 | */ | 110 | */ |
111 | 111 | ||
112 | #include <stdio.h> | 112 | #include <stdio.h> |
113 | #include <openssl/md5.h> | ||
114 | #include <openssl/sha.h> | ||
115 | #include <openssl/objects.h> | 113 | #include <openssl/objects.h> |
116 | #include "ssl_locl.h" | 114 | #include "ssl_locl.h" |
115 | #include "kssl_lcl.h" | ||
116 | #include <openssl/md5.h> | ||
117 | 117 | ||
118 | const char *ssl3_version_str="SSLv3" OPENSSL_VERSION_PTEXT; | 118 | const char *ssl3_version_str="SSLv3" OPENSSL_VERSION_PTEXT; |
119 | 119 | ||
@@ -170,7 +170,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
170 | SSL3_TXT_ADH_RC4_128_MD5, | 170 | SSL3_TXT_ADH_RC4_128_MD5, |
171 | SSL3_CK_ADH_RC4_128_MD5, | 171 | SSL3_CK_ADH_RC4_128_MD5, |
172 | SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_SSLV3, | 172 | SSL_kEDH |SSL_aNULL|SSL_RC4 |SSL_MD5 |SSL_SSLV3, |
173 | SSL_NOT_EXP, | 173 | SSL_NOT_EXP|SSL_MEDIUM, |
174 | 0, | 174 | 0, |
175 | 128, | 175 | 128, |
176 | 128, | 176 | 128, |
@@ -196,7 +196,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
196 | SSL3_TXT_ADH_DES_64_CBC_SHA, | 196 | SSL3_TXT_ADH_DES_64_CBC_SHA, |
197 | SSL3_CK_ADH_DES_64_CBC_SHA, | 197 | SSL3_CK_ADH_DES_64_CBC_SHA, |
198 | SSL_kEDH |SSL_aNULL|SSL_DES |SSL_SHA1|SSL_SSLV3, | 198 | SSL_kEDH |SSL_aNULL|SSL_DES |SSL_SHA1|SSL_SSLV3, |
199 | SSL_NOT_EXP, | 199 | SSL_NOT_EXP|SSL_LOW, |
200 | 0, | 200 | 0, |
201 | 56, | 201 | 56, |
202 | 56, | 202 | 56, |
@@ -209,7 +209,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
209 | SSL3_TXT_ADH_DES_192_CBC_SHA, | 209 | SSL3_TXT_ADH_DES_192_CBC_SHA, |
210 | SSL3_CK_ADH_DES_192_CBC_SHA, | 210 | SSL3_CK_ADH_DES_192_CBC_SHA, |
211 | SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3, | 211 | SSL_kEDH |SSL_aNULL|SSL_3DES |SSL_SHA1|SSL_SSLV3, |
212 | SSL_NOT_EXP, | 212 | SSL_NOT_EXP|SSL_HIGH, |
213 | 0, | 213 | 0, |
214 | 168, | 214 | 168, |
215 | 168, | 215 | 168, |
@@ -518,7 +518,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
518 | SSL3_TXT_FZA_DMS_RC4_SHA, | 518 | SSL3_TXT_FZA_DMS_RC4_SHA, |
519 | SSL3_CK_FZA_DMS_RC4_SHA, | 519 | SSL3_CK_FZA_DMS_RC4_SHA, |
520 | SSL_kFZA|SSL_aFZA |SSL_RC4 |SSL_SHA1|SSL_SSLV3, | 520 | SSL_kFZA|SSL_aFZA |SSL_RC4 |SSL_SHA1|SSL_SSLV3, |
521 | SSL_NOT_EXP, | 521 | SSL_NOT_EXP|SSL_MEDIUM, |
522 | 0, | 522 | 0, |
523 | 128, | 523 | 128, |
524 | 128, | 524 | 128, |
@@ -526,6 +526,97 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
526 | SSL_ALL_STRENGTHS, | 526 | SSL_ALL_STRENGTHS, |
527 | }, | 527 | }, |
528 | 528 | ||
529 | #ifndef OPENSSL_NO_KRB5 | ||
530 | /* The Kerberos ciphers | ||
531 | ** 20000107 VRS: And the first shall be last, | ||
532 | ** in hopes of avoiding the lynx ssl renegotiation problem. | ||
533 | */ | ||
534 | /* Cipher 21 VRS */ | ||
535 | { | ||
536 | 1, | ||
537 | SSL3_TXT_KRB5_DES_40_CBC_SHA, | ||
538 | SSL3_CK_KRB5_DES_40_CBC_SHA, | ||
539 | SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_SHA1 |SSL_SSLV3, | ||
540 | SSL_EXPORT|SSL_EXP40, | ||
541 | 0, | ||
542 | 40, | ||
543 | 56, | ||
544 | SSL_ALL_CIPHERS, | ||
545 | SSL_ALL_STRENGTHS, | ||
546 | }, | ||
547 | |||
548 | /* Cipher 22 VRS */ | ||
549 | { | ||
550 | 1, | ||
551 | SSL3_TXT_KRB5_DES_40_CBC_MD5, | ||
552 | SSL3_CK_KRB5_DES_40_CBC_MD5, | ||
553 | SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_MD5 |SSL_SSLV3, | ||
554 | SSL_EXPORT|SSL_EXP40, | ||
555 | 0, | ||
556 | 40, | ||
557 | 56, | ||
558 | SSL_ALL_CIPHERS, | ||
559 | SSL_ALL_STRENGTHS, | ||
560 | }, | ||
561 | |||
562 | /* Cipher 23 VRS */ | ||
563 | { | ||
564 | 1, | ||
565 | SSL3_TXT_KRB5_DES_64_CBC_SHA, | ||
566 | SSL3_CK_KRB5_DES_64_CBC_SHA, | ||
567 | SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_SHA1 |SSL_SSLV3, | ||
568 | SSL_NOT_EXP|SSL_LOW, | ||
569 | 0, | ||
570 | 56, | ||
571 | 56, | ||
572 | SSL_ALL_CIPHERS, | ||
573 | SSL_ALL_STRENGTHS, | ||
574 | }, | ||
575 | |||
576 | /* Cipher 24 VRS */ | ||
577 | { | ||
578 | 1, | ||
579 | SSL3_TXT_KRB5_DES_64_CBC_MD5, | ||
580 | SSL3_CK_KRB5_DES_64_CBC_MD5, | ||
581 | SSL_kKRB5|SSL_aKRB5| SSL_DES|SSL_MD5 |SSL_SSLV3, | ||
582 | SSL_NOT_EXP|SSL_LOW, | ||
583 | 0, | ||
584 | 56, | ||
585 | 56, | ||
586 | SSL_ALL_CIPHERS, | ||
587 | SSL_ALL_STRENGTHS, | ||
588 | }, | ||
589 | |||
590 | /* Cipher 25 VRS */ | ||
591 | { | ||
592 | 1, | ||
593 | SSL3_TXT_KRB5_DES_192_CBC3_SHA, | ||
594 | SSL3_CK_KRB5_DES_192_CBC3_SHA, | ||
595 | SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_SHA1 |SSL_SSLV3, | ||
596 | SSL_NOT_EXP|SSL_HIGH, | ||
597 | 0, | ||
598 | 112, | ||
599 | 168, | ||
600 | SSL_ALL_CIPHERS, | ||
601 | SSL_ALL_STRENGTHS, | ||
602 | }, | ||
603 | |||
604 | /* Cipher 26 VRS */ | ||
605 | { | ||
606 | 1, | ||
607 | SSL3_TXT_KRB5_DES_192_CBC3_MD5, | ||
608 | SSL3_CK_KRB5_DES_192_CBC3_MD5, | ||
609 | SSL_kKRB5|SSL_aKRB5| SSL_3DES|SSL_MD5 |SSL_SSLV3, | ||
610 | SSL_NOT_EXP|SSL_HIGH, | ||
611 | 0, | ||
612 | 112, | ||
613 | 168, | ||
614 | SSL_ALL_CIPHERS, | ||
615 | SSL_ALL_STRENGTHS, | ||
616 | }, | ||
617 | #endif /* OPENSSL_NO_KRB5 */ | ||
618 | |||
619 | |||
529 | #if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES | 620 | #if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES |
530 | /* New TLS Export CipherSuites */ | 621 | /* New TLS Export CipherSuites */ |
531 | /* Cipher 60 */ | 622 | /* Cipher 60 */ |
@@ -612,7 +703,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
612 | TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA, | 703 | TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA, |
613 | TLS1_CK_DHE_DSS_WITH_RC4_128_SHA, | 704 | TLS1_CK_DHE_DSS_WITH_RC4_128_SHA, |
614 | SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1, | 705 | SSL_kEDH|SSL_aDSS|SSL_RC4|SSL_SHA|SSL_TLSV1, |
615 | SSL_NOT_EXP, | 706 | SSL_NOT_EXP|SSL_MEDIUM, |
616 | 0, | 707 | 0, |
617 | 128, | 708 | 128, |
618 | 128, | 709 | 128, |
@@ -620,6 +711,165 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[]={ | |||
620 | SSL_ALL_STRENGTHS | 711 | SSL_ALL_STRENGTHS |
621 | }, | 712 | }, |
622 | #endif | 713 | #endif |
714 | /* New AES ciphersuites */ | ||
715 | |||
716 | /* Cipher 2F */ | ||
717 | { | ||
718 | 1, | ||
719 | TLS1_TXT_RSA_WITH_AES_128_SHA, | ||
720 | TLS1_CK_RSA_WITH_AES_128_SHA, | ||
721 | SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1, | ||
722 | SSL_NOT_EXP|SSL_MEDIUM, | ||
723 | 0, | ||
724 | 128, | ||
725 | 128, | ||
726 | SSL_ALL_CIPHERS, | ||
727 | SSL_ALL_STRENGTHS, | ||
728 | }, | ||
729 | /* Cipher 30 */ | ||
730 | { | ||
731 | 0, | ||
732 | TLS1_TXT_DH_DSS_WITH_AES_128_SHA, | ||
733 | TLS1_CK_DH_DSS_WITH_AES_128_SHA, | ||
734 | SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
735 | SSL_NOT_EXP|SSL_MEDIUM, | ||
736 | 0, | ||
737 | 128, | ||
738 | 128, | ||
739 | SSL_ALL_CIPHERS, | ||
740 | SSL_ALL_STRENGTHS, | ||
741 | }, | ||
742 | /* Cipher 31 */ | ||
743 | { | ||
744 | 0, | ||
745 | TLS1_TXT_DH_RSA_WITH_AES_128_SHA, | ||
746 | TLS1_CK_DH_RSA_WITH_AES_128_SHA, | ||
747 | SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
748 | SSL_NOT_EXP|SSL_MEDIUM, | ||
749 | 0, | ||
750 | 128, | ||
751 | 128, | ||
752 | SSL_ALL_CIPHERS, | ||
753 | SSL_ALL_STRENGTHS, | ||
754 | }, | ||
755 | /* Cipher 32 */ | ||
756 | { | ||
757 | 1, | ||
758 | TLS1_TXT_DHE_DSS_WITH_AES_128_SHA, | ||
759 | TLS1_CK_DHE_DSS_WITH_AES_128_SHA, | ||
760 | SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
761 | SSL_NOT_EXP|SSL_MEDIUM, | ||
762 | 0, | ||
763 | 128, | ||
764 | 128, | ||
765 | SSL_ALL_CIPHERS, | ||
766 | SSL_ALL_STRENGTHS, | ||
767 | }, | ||
768 | /* Cipher 33 */ | ||
769 | { | ||
770 | 1, | ||
771 | TLS1_TXT_DHE_RSA_WITH_AES_128_SHA, | ||
772 | TLS1_CK_DHE_RSA_WITH_AES_128_SHA, | ||
773 | SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
774 | SSL_NOT_EXP|SSL_MEDIUM, | ||
775 | 0, | ||
776 | 128, | ||
777 | 128, | ||
778 | SSL_ALL_CIPHERS, | ||
779 | SSL_ALL_STRENGTHS, | ||
780 | }, | ||
781 | /* Cipher 34 */ | ||
782 | { | ||
783 | 1, | ||
784 | TLS1_TXT_ADH_WITH_AES_128_SHA, | ||
785 | TLS1_CK_ADH_WITH_AES_128_SHA, | ||
786 | SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
787 | SSL_NOT_EXP|SSL_MEDIUM, | ||
788 | 0, | ||
789 | 128, | ||
790 | 128, | ||
791 | SSL_ALL_CIPHERS, | ||
792 | SSL_ALL_STRENGTHS, | ||
793 | }, | ||
794 | |||
795 | /* Cipher 35 */ | ||
796 | { | ||
797 | 1, | ||
798 | TLS1_TXT_RSA_WITH_AES_256_SHA, | ||
799 | TLS1_CK_RSA_WITH_AES_256_SHA, | ||
800 | SSL_kRSA|SSL_aRSA|SSL_AES|SSL_SHA |SSL_TLSV1, | ||
801 | SSL_NOT_EXP|SSL_HIGH, | ||
802 | 0, | ||
803 | 256, | ||
804 | 256, | ||
805 | SSL_ALL_CIPHERS, | ||
806 | SSL_ALL_STRENGTHS, | ||
807 | }, | ||
808 | /* Cipher 36 */ | ||
809 | { | ||
810 | 0, | ||
811 | TLS1_TXT_DH_DSS_WITH_AES_256_SHA, | ||
812 | TLS1_CK_DH_DSS_WITH_AES_256_SHA, | ||
813 | SSL_kDHd|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
814 | SSL_NOT_EXP|SSL_HIGH, | ||
815 | 0, | ||
816 | 256, | ||
817 | 256, | ||
818 | SSL_ALL_CIPHERS, | ||
819 | SSL_ALL_STRENGTHS, | ||
820 | }, | ||
821 | /* Cipher 37 */ | ||
822 | { | ||
823 | 0, | ||
824 | TLS1_TXT_DH_RSA_WITH_AES_256_SHA, | ||
825 | TLS1_CK_DH_RSA_WITH_AES_256_SHA, | ||
826 | SSL_kDHr|SSL_aDH|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
827 | SSL_NOT_EXP|SSL_HIGH, | ||
828 | 0, | ||
829 | 256, | ||
830 | 256, | ||
831 | SSL_ALL_CIPHERS, | ||
832 | SSL_ALL_STRENGTHS, | ||
833 | }, | ||
834 | /* Cipher 38 */ | ||
835 | { | ||
836 | 1, | ||
837 | TLS1_TXT_DHE_DSS_WITH_AES_256_SHA, | ||
838 | TLS1_CK_DHE_DSS_WITH_AES_256_SHA, | ||
839 | SSL_kEDH|SSL_aDSS|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
840 | SSL_NOT_EXP|SSL_HIGH, | ||
841 | 0, | ||
842 | 256, | ||
843 | 256, | ||
844 | SSL_ALL_CIPHERS, | ||
845 | SSL_ALL_STRENGTHS, | ||
846 | }, | ||
847 | /* Cipher 39 */ | ||
848 | { | ||
849 | 1, | ||
850 | TLS1_TXT_DHE_RSA_WITH_AES_256_SHA, | ||
851 | TLS1_CK_DHE_RSA_WITH_AES_256_SHA, | ||
852 | SSL_kEDH|SSL_aRSA|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
853 | SSL_NOT_EXP|SSL_HIGH, | ||
854 | 0, | ||
855 | 256, | ||
856 | 256, | ||
857 | SSL_ALL_CIPHERS, | ||
858 | SSL_ALL_STRENGTHS, | ||
859 | }, | ||
860 | /* Cipher 3A */ | ||
861 | { | ||
862 | 1, | ||
863 | TLS1_TXT_ADH_WITH_AES_256_SHA, | ||
864 | TLS1_CK_ADH_WITH_AES_256_SHA, | ||
865 | SSL_kEDH|SSL_aNULL|SSL_AES|SSL_SHA|SSL_TLSV1, | ||
866 | SSL_NOT_EXP|SSL_HIGH, | ||
867 | 0, | ||
868 | 256, | ||
869 | 256, | ||
870 | SSL_ALL_CIPHERS, | ||
871 | SSL_ALL_STRENGTHS, | ||
872 | }, | ||
623 | 873 | ||
624 | /* end of list */ | 874 | /* end of list */ |
625 | }; | 875 | }; |
@@ -693,6 +943,9 @@ SSL_CIPHER *ssl3_get_cipher(unsigned int u) | |||
693 | 943 | ||
694 | int ssl3_pending(SSL *s) | 944 | int ssl3_pending(SSL *s) |
695 | { | 945 | { |
946 | if (s->rstate == SSL_ST_READ_BODY) | ||
947 | return 0; | ||
948 | |||
696 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0; | 949 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0; |
697 | } | 950 | } |
698 | 951 | ||
@@ -702,6 +955,8 @@ int ssl3_new(SSL *s) | |||
702 | 955 | ||
703 | if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err; | 956 | if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err; |
704 | memset(s3,0,sizeof *s3); | 957 | memset(s3,0,sizeof *s3); |
958 | EVP_MD_CTX_init(&s3->finish_dgst1); | ||
959 | EVP_MD_CTX_init(&s3->finish_dgst2); | ||
705 | 960 | ||
706 | s->s3=s3; | 961 | s->s3=s3; |
707 | 962 | ||
@@ -723,12 +978,14 @@ void ssl3_free(SSL *s) | |||
723 | OPENSSL_free(s->s3->wbuf.buf); | 978 | OPENSSL_free(s->s3->wbuf.buf); |
724 | if (s->s3->rrec.comp != NULL) | 979 | if (s->s3->rrec.comp != NULL) |
725 | OPENSSL_free(s->s3->rrec.comp); | 980 | OPENSSL_free(s->s3->rrec.comp); |
726 | #ifndef NO_DH | 981 | #ifndef OPENSSL_NO_DH |
727 | if (s->s3->tmp.dh != NULL) | 982 | if (s->s3->tmp.dh != NULL) |
728 | DH_free(s->s3->tmp.dh); | 983 | DH_free(s->s3->tmp.dh); |
729 | #endif | 984 | #endif |
730 | if (s->s3->tmp.ca_names != NULL) | 985 | if (s->s3->tmp.ca_names != NULL) |
731 | sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free); | 986 | sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free); |
987 | EVP_MD_CTX_cleanup(&s->s3->finish_dgst1); | ||
988 | EVP_MD_CTX_cleanup(&s->s3->finish_dgst2); | ||
732 | memset(s->s3,0,sizeof *s->s3); | 989 | memset(s->s3,0,sizeof *s->s3); |
733 | OPENSSL_free(s->s3); | 990 | OPENSSL_free(s->s3); |
734 | s->s3=NULL; | 991 | s->s3=NULL; |
@@ -737,6 +994,7 @@ void ssl3_free(SSL *s) | |||
737 | void ssl3_clear(SSL *s) | 994 | void ssl3_clear(SSL *s) |
738 | { | 995 | { |
739 | unsigned char *rp,*wp; | 996 | unsigned char *rp,*wp; |
997 | size_t rlen, wlen; | ||
740 | 998 | ||
741 | ssl3_cleanup_key_block(s); | 999 | ssl3_cleanup_key_block(s); |
742 | if (s->s3->tmp.ca_names != NULL) | 1000 | if (s->s3->tmp.ca_names != NULL) |
@@ -747,17 +1005,24 @@ void ssl3_clear(SSL *s) | |||
747 | OPENSSL_free(s->s3->rrec.comp); | 1005 | OPENSSL_free(s->s3->rrec.comp); |
748 | s->s3->rrec.comp=NULL; | 1006 | s->s3->rrec.comp=NULL; |
749 | } | 1007 | } |
750 | #ifndef NO_DH | 1008 | #ifndef OPENSSL_NO_DH |
751 | if (s->s3->tmp.dh != NULL) | 1009 | if (s->s3->tmp.dh != NULL) |
752 | DH_free(s->s3->tmp.dh); | 1010 | DH_free(s->s3->tmp.dh); |
753 | #endif | 1011 | #endif |
754 | 1012 | ||
755 | rp=s->s3->rbuf.buf; | 1013 | rp = s->s3->rbuf.buf; |
756 | wp=s->s3->wbuf.buf; | 1014 | wp = s->s3->wbuf.buf; |
1015 | rlen = s->s3->rbuf.len; | ||
1016 | wlen = s->s3->wbuf.len; | ||
1017 | |||
1018 | EVP_MD_CTX_cleanup(&s->s3->finish_dgst1); | ||
1019 | EVP_MD_CTX_cleanup(&s->s3->finish_dgst2); | ||
757 | 1020 | ||
758 | memset(s->s3,0,sizeof *s->s3); | 1021 | memset(s->s3,0,sizeof *s->s3); |
759 | if (rp != NULL) s->s3->rbuf.buf=rp; | 1022 | s->s3->rbuf.buf = rp; |
760 | if (wp != NULL) s->s3->wbuf.buf=wp; | 1023 | s->s3->wbuf.buf = wp; |
1024 | s->s3->rbuf.len = rlen; | ||
1025 | s->s3->wbuf.len = wlen; | ||
761 | 1026 | ||
762 | ssl_free_wbio_buffer(s); | 1027 | ssl_free_wbio_buffer(s); |
763 | 1028 | ||
@@ -769,17 +1034,17 @@ void ssl3_clear(SSL *s) | |||
769 | s->version=SSL3_VERSION; | 1034 | s->version=SSL3_VERSION; |
770 | } | 1035 | } |
771 | 1036 | ||
772 | long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg) | 1037 | long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) |
773 | { | 1038 | { |
774 | int ret=0; | 1039 | int ret=0; |
775 | 1040 | ||
776 | #if !defined(NO_DSA) || !defined(NO_RSA) | 1041 | #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA) |
777 | if ( | 1042 | if ( |
778 | #ifndef NO_RSA | 1043 | #ifndef OPENSSL_NO_RSA |
779 | cmd == SSL_CTRL_SET_TMP_RSA || | 1044 | cmd == SSL_CTRL_SET_TMP_RSA || |
780 | cmd == SSL_CTRL_SET_TMP_RSA_CB || | 1045 | cmd == SSL_CTRL_SET_TMP_RSA_CB || |
781 | #endif | 1046 | #endif |
782 | #ifndef NO_DSA | 1047 | #ifndef OPENSSL_NO_DSA |
783 | cmd == SSL_CTRL_SET_TMP_DH || | 1048 | cmd == SSL_CTRL_SET_TMP_DH || |
784 | cmd == SSL_CTRL_SET_TMP_DH_CB || | 1049 | cmd == SSL_CTRL_SET_TMP_DH_CB || |
785 | #endif | 1050 | #endif |
@@ -813,7 +1078,7 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg) | |||
813 | case SSL_CTRL_GET_FLAGS: | 1078 | case SSL_CTRL_GET_FLAGS: |
814 | ret=(int)(s->s3->flags); | 1079 | ret=(int)(s->s3->flags); |
815 | break; | 1080 | break; |
816 | #ifndef NO_RSA | 1081 | #ifndef OPENSSL_NO_RSA |
817 | case SSL_CTRL_NEED_TMP_RSA: | 1082 | case SSL_CTRL_NEED_TMP_RSA: |
818 | if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) && | 1083 | if ((s->cert != NULL) && (s->cert->rsa_tmp == NULL) && |
819 | ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || | 1084 | ((s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || |
@@ -846,7 +1111,7 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg) | |||
846 | } | 1111 | } |
847 | break; | 1112 | break; |
848 | #endif | 1113 | #endif |
849 | #ifndef NO_DH | 1114 | #ifndef OPENSSL_NO_DH |
850 | case SSL_CTRL_SET_TMP_DH: | 1115 | case SSL_CTRL_SET_TMP_DH: |
851 | { | 1116 | { |
852 | DH *dh = (DH *)parg; | 1117 | DH *dh = (DH *)parg; |
@@ -892,12 +1157,12 @@ long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)()) | |||
892 | { | 1157 | { |
893 | int ret=0; | 1158 | int ret=0; |
894 | 1159 | ||
895 | #if !defined(NO_DSA) || !defined(NO_RSA) | 1160 | #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_RSA) |
896 | if ( | 1161 | if ( |
897 | #ifndef NO_RSA | 1162 | #ifndef OPENSSL_NO_RSA |
898 | cmd == SSL_CTRL_SET_TMP_RSA_CB || | 1163 | cmd == SSL_CTRL_SET_TMP_RSA_CB || |
899 | #endif | 1164 | #endif |
900 | #ifndef NO_DSA | 1165 | #ifndef OPENSSL_NO_DSA |
901 | cmd == SSL_CTRL_SET_TMP_DH_CB || | 1166 | cmd == SSL_CTRL_SET_TMP_DH_CB || |
902 | #endif | 1167 | #endif |
903 | 0) | 1168 | 0) |
@@ -912,14 +1177,14 @@ long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)()) | |||
912 | 1177 | ||
913 | switch (cmd) | 1178 | switch (cmd) |
914 | { | 1179 | { |
915 | #ifndef NO_RSA | 1180 | #ifndef OPENSSL_NO_RSA |
916 | case SSL_CTRL_SET_TMP_RSA_CB: | 1181 | case SSL_CTRL_SET_TMP_RSA_CB: |
917 | { | 1182 | { |
918 | s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp; | 1183 | s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp; |
919 | } | 1184 | } |
920 | break; | 1185 | break; |
921 | #endif | 1186 | #endif |
922 | #ifndef NO_DH | 1187 | #ifndef OPENSSL_NO_DH |
923 | case SSL_CTRL_SET_TMP_DH_CB: | 1188 | case SSL_CTRL_SET_TMP_DH_CB: |
924 | { | 1189 | { |
925 | s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp; | 1190 | s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp; |
@@ -932,7 +1197,7 @@ long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)()) | |||
932 | return(ret); | 1197 | return(ret); |
933 | } | 1198 | } |
934 | 1199 | ||
935 | long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg) | 1200 | long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) |
936 | { | 1201 | { |
937 | CERT *cert; | 1202 | CERT *cert; |
938 | 1203 | ||
@@ -940,7 +1205,7 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg) | |||
940 | 1205 | ||
941 | switch (cmd) | 1206 | switch (cmd) |
942 | { | 1207 | { |
943 | #ifndef NO_RSA | 1208 | #ifndef OPENSSL_NO_RSA |
944 | case SSL_CTRL_NEED_TMP_RSA: | 1209 | case SSL_CTRL_NEED_TMP_RSA: |
945 | if ( (cert->rsa_tmp == NULL) && | 1210 | if ( (cert->rsa_tmp == NULL) && |
946 | ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || | 1211 | ((cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) || |
@@ -985,7 +1250,7 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg) | |||
985 | } | 1250 | } |
986 | break; | 1251 | break; |
987 | #endif | 1252 | #endif |
988 | #ifndef NO_DH | 1253 | #ifndef OPENSSL_NO_DH |
989 | case SSL_CTRL_SET_TMP_DH: | 1254 | case SSL_CTRL_SET_TMP_DH: |
990 | { | 1255 | { |
991 | DH *new=NULL,*dh; | 1256 | DH *new=NULL,*dh; |
@@ -1042,14 +1307,14 @@ long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)()) | |||
1042 | 1307 | ||
1043 | switch (cmd) | 1308 | switch (cmd) |
1044 | { | 1309 | { |
1045 | #ifndef NO_RSA | 1310 | #ifndef OPENSSL_NO_RSA |
1046 | case SSL_CTRL_SET_TMP_RSA_CB: | 1311 | case SSL_CTRL_SET_TMP_RSA_CB: |
1047 | { | 1312 | { |
1048 | cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp; | 1313 | cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp; |
1049 | } | 1314 | } |
1050 | break; | 1315 | break; |
1051 | #endif | 1316 | #endif |
1052 | #ifndef NO_DH | 1317 | #ifndef OPENSSL_NO_DH |
1053 | case SSL_CTRL_SET_TMP_DH_CB: | 1318 | case SSL_CTRL_SET_TMP_DH_CB: |
1054 | { | 1319 | { |
1055 | cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp; | 1320 | cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp; |
@@ -1114,10 +1379,11 @@ int ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | |||
1114 | return(2); | 1379 | return(2); |
1115 | } | 1380 | } |
1116 | 1381 | ||
1117 | SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *have, | 1382 | SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, |
1118 | STACK_OF(SSL_CIPHER) *pref) | 1383 | STACK_OF(SSL_CIPHER) *srvr) |
1119 | { | 1384 | { |
1120 | SSL_CIPHER *c,*ret=NULL; | 1385 | SSL_CIPHER *c,*ret=NULL; |
1386 | STACK_OF(SSL_CIPHER) *prio, *allow; | ||
1121 | int i,j,ok; | 1387 | int i,j,ok; |
1122 | CERT *cert; | 1388 | CERT *cert; |
1123 | unsigned long alg,mask,emask; | 1389 | unsigned long alg,mask,emask; |
@@ -1125,26 +1391,62 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *have, | |||
1125 | /* Let's see which ciphers we can support */ | 1391 | /* Let's see which ciphers we can support */ |
1126 | cert=s->cert; | 1392 | cert=s->cert; |
1127 | 1393 | ||
1128 | sk_SSL_CIPHER_set_cmp_func(pref,ssl_cipher_ptr_id_cmp); | 1394 | #if 0 |
1395 | /* Do not set the compare functions, because this may lead to a | ||
1396 | * reordering by "id". We want to keep the original ordering. | ||
1397 | * We may pay a price in performance during sk_SSL_CIPHER_find(), | ||
1398 | * but would have to pay with the price of sk_SSL_CIPHER_dup(). | ||
1399 | */ | ||
1400 | sk_SSL_CIPHER_set_cmp_func(srvr, ssl_cipher_ptr_id_cmp); | ||
1401 | sk_SSL_CIPHER_set_cmp_func(clnt, ssl_cipher_ptr_id_cmp); | ||
1402 | #endif | ||
1129 | 1403 | ||
1130 | #ifdef CIPHER_DEBUG | 1404 | #ifdef CIPHER_DEBUG |
1131 | printf("Have:\n"); | 1405 | printf("Server has %d from %p:\n", sk_SSL_CIPHER_num(srvr), srvr); |
1132 | for(i=0 ; i < sk_num(pref) ; ++i) | 1406 | for(i=0 ; i < sk_SSL_CIPHER_num(srvr) ; ++i) |
1133 | { | 1407 | { |
1134 | c=(SSL_CIPHER *)sk_value(pref,i); | 1408 | c=sk_SSL_CIPHER_value(srvr,i); |
1409 | printf("%p:%s\n",c,c->name); | ||
1410 | } | ||
1411 | printf("Client sent %d from %p:\n", sk_SSL_CIPHER_num(clnt), clnt); | ||
1412 | for(i=0 ; i < sk_SSL_CIPHER_num(clnt) ; ++i) | ||
1413 | { | ||
1414 | c=sk_SSL_CIPHER_value(clnt,i); | ||
1135 | printf("%p:%s\n",c,c->name); | 1415 | printf("%p:%s\n",c,c->name); |
1136 | } | 1416 | } |
1137 | #endif | 1417 | #endif |
1138 | 1418 | ||
1139 | for (i=0; i<sk_SSL_CIPHER_num(have); i++) | 1419 | if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) |
1420 | { | ||
1421 | prio = srvr; | ||
1422 | allow = clnt; | ||
1423 | } | ||
1424 | else | ||
1425 | { | ||
1426 | prio = clnt; | ||
1427 | allow = srvr; | ||
1428 | } | ||
1429 | |||
1430 | for (i=0; i<sk_SSL_CIPHER_num(prio); i++) | ||
1140 | { | 1431 | { |
1141 | c=sk_SSL_CIPHER_value(have,i); | 1432 | c=sk_SSL_CIPHER_value(prio,i); |
1142 | 1433 | ||
1143 | ssl_set_cert_masks(cert,c); | 1434 | ssl_set_cert_masks(cert,c); |
1144 | mask=cert->mask; | 1435 | mask=cert->mask; |
1145 | emask=cert->export_mask; | 1436 | emask=cert->export_mask; |
1146 | 1437 | ||
1438 | #ifdef KSSL_DEBUG | ||
1439 | printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms); | ||
1440 | #endif /* KSSL_DEBUG */ | ||
1441 | |||
1147 | alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK); | 1442 | alg=c->algorithms&(SSL_MKEY_MASK|SSL_AUTH_MASK); |
1443 | #ifndef OPENSSL_NO_KRB5 | ||
1444 | if (alg & SSL_KRB5) | ||
1445 | { | ||
1446 | if ( !kssl_keytab_is_available(s->kssl_ctx) ) | ||
1447 | continue; | ||
1448 | } | ||
1449 | #endif /* OPENSSL_NO_KRB5 */ | ||
1148 | if (SSL_C_IS_EXPORT(c)) | 1450 | if (SSL_C_IS_EXPORT(c)) |
1149 | { | 1451 | { |
1150 | ok=((alg & emask) == alg)?1:0; | 1452 | ok=((alg & emask) == alg)?1:0; |
@@ -1164,10 +1466,10 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *have, | |||
1164 | 1466 | ||
1165 | if (!ok) continue; | 1467 | if (!ok) continue; |
1166 | 1468 | ||
1167 | j=sk_SSL_CIPHER_find(pref,c); | 1469 | j=sk_SSL_CIPHER_find(allow,c); |
1168 | if (j >= 0) | 1470 | if (j >= 0) |
1169 | { | 1471 | { |
1170 | ret=sk_SSL_CIPHER_value(pref,j); | 1472 | ret=sk_SSL_CIPHER_value(allow,j); |
1171 | break; | 1473 | break; |
1172 | } | 1474 | } |
1173 | } | 1475 | } |
@@ -1181,31 +1483,31 @@ int ssl3_get_req_cert_type(SSL *s, unsigned char *p) | |||
1181 | 1483 | ||
1182 | alg=s->s3->tmp.new_cipher->algorithms; | 1484 | alg=s->s3->tmp.new_cipher->algorithms; |
1183 | 1485 | ||
1184 | #ifndef NO_DH | 1486 | #ifndef OPENSSL_NO_DH |
1185 | if (alg & (SSL_kDHr|SSL_kEDH)) | 1487 | if (alg & (SSL_kDHr|SSL_kEDH)) |
1186 | { | 1488 | { |
1187 | # ifndef NO_RSA | 1489 | # ifndef OPENSSL_NO_RSA |
1188 | p[ret++]=SSL3_CT_RSA_FIXED_DH; | 1490 | p[ret++]=SSL3_CT_RSA_FIXED_DH; |
1189 | # endif | 1491 | # endif |
1190 | # ifndef NO_DSA | 1492 | # ifndef OPENSSL_NO_DSA |
1191 | p[ret++]=SSL3_CT_DSS_FIXED_DH; | 1493 | p[ret++]=SSL3_CT_DSS_FIXED_DH; |
1192 | # endif | 1494 | # endif |
1193 | } | 1495 | } |
1194 | if ((s->version == SSL3_VERSION) && | 1496 | if ((s->version == SSL3_VERSION) && |
1195 | (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr))) | 1497 | (alg & (SSL_kEDH|SSL_kDHd|SSL_kDHr))) |
1196 | { | 1498 | { |
1197 | # ifndef NO_RSA | 1499 | # ifndef OPENSSL_NO_RSA |
1198 | p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH; | 1500 | p[ret++]=SSL3_CT_RSA_EPHEMERAL_DH; |
1199 | # endif | 1501 | # endif |
1200 | # ifndef NO_DSA | 1502 | # ifndef OPENSSL_NO_DSA |
1201 | p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH; | 1503 | p[ret++]=SSL3_CT_DSS_EPHEMERAL_DH; |
1202 | # endif | 1504 | # endif |
1203 | } | 1505 | } |
1204 | #endif /* !NO_DH */ | 1506 | #endif /* !OPENSSL_NO_DH */ |
1205 | #ifndef NO_RSA | 1507 | #ifndef OPENSSL_NO_RSA |
1206 | p[ret++]=SSL3_CT_RSA_SIGN; | 1508 | p[ret++]=SSL3_CT_RSA_SIGN; |
1207 | #endif | 1509 | #endif |
1208 | #ifndef NO_DSA | 1510 | #ifndef OPENSSL_NO_DSA |
1209 | p[ret++]=SSL3_CT_DSS_SIGN; | 1511 | p[ret++]=SSL3_CT_DSS_SIGN; |
1210 | #endif | 1512 | #endif |
1211 | return(ret); | 1513 | return(ret); |
@@ -1312,13 +1614,12 @@ static int ssl3_read_internal(SSL *s, void *buf, int len, int peek) | |||
1312 | if (s->s3->renegotiate) ssl3_renegotiate_check(s); | 1614 | if (s->s3->renegotiate) ssl3_renegotiate_check(s); |
1313 | s->s3->in_read_app_data=1; | 1615 | s->s3->in_read_app_data=1; |
1314 | ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek); | 1616 | ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek); |
1315 | if ((ret == -1) && (s->s3->in_read_app_data == 0)) | 1617 | if ((ret == -1) && (s->s3->in_read_app_data == 2)) |
1316 | { | 1618 | { |
1317 | /* ssl3_read_bytes decided to call s->handshake_func, which | 1619 | /* ssl3_read_bytes decided to call s->handshake_func, which |
1318 | * called ssl3_read_bytes to read handshake data. | 1620 | * called ssl3_read_bytes to read handshake data. |
1319 | * However, ssl3_read_bytes actually found application data | 1621 | * However, ssl3_read_bytes actually found application data |
1320 | * and thinks that application data makes sense here (signalled | 1622 | * and thinks that application data makes sense here; so disable |
1321 | * by resetting 'in_read_app_data', strangely); so disable | ||
1322 | * handshake processing and try to read application data again. */ | 1623 | * handshake processing and try to read application data again. */ |
1323 | s->in_handshake++; | 1624 | s->in_handshake++; |
1324 | ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek); | 1625 | ret=ssl3_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek); |