OLD | NEW |
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 /* | 2 /* |
3 * SSL3 Protocol | 3 * SSL3 Protocol |
4 * | 4 * |
5 * This Source Code Form is subject to the terms of the Mozilla Public | 5 * This Source Code Form is subject to the terms of the Mozilla Public |
6 * License, v. 2.0. If a copy of the MPL was not distributed with this | 6 * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
8 /* $Id$ */ | 8 /* $Id$ */ |
9 | 9 |
10 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ | 10 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ |
11 | 11 |
12 #include "cert.h" | 12 #include "cert.h" |
13 #include "ssl.h" | 13 #include "ssl.h" |
14 #include "cryptohi.h" /* for DSAU_ stuff */ | 14 #include "cryptohi.h" /* for DSAU_ stuff */ |
15 #include "keyhi.h" | 15 #include "keyhi.h" |
16 #include "secder.h" | 16 #include "secder.h" |
17 #include "secitem.h" | 17 #include "secitem.h" |
| 18 #include "sechash.h" |
18 | 19 |
19 #include "sslimpl.h" | 20 #include "sslimpl.h" |
20 #include "sslproto.h" | 21 #include "sslproto.h" |
21 #include "sslerr.h" | 22 #include "sslerr.h" |
22 #include "prtime.h" | 23 #include "prtime.h" |
23 #include "prinrval.h" | 24 #include "prinrval.h" |
24 #include "prerror.h" | 25 #include "prerror.h" |
25 #include "pratom.h" | 26 #include "pratom.h" |
26 #include "prthread.h" | 27 #include "prthread.h" |
27 | 28 |
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
793 random->rand[3] = (unsigned char)(gmt); | 794 random->rand[3] = (unsigned char)(gmt); |
794 | 795 |
795 /* first 4 bytes are reserverd for time */ | 796 /* first 4 bytes are reserverd for time */ |
796 rv = PK11_GenerateRandom(&random->rand[4], SSL3_RANDOM_LENGTH - 4); | 797 rv = PK11_GenerateRandom(&random->rand[4], SSL3_RANDOM_LENGTH - 4); |
797 if (rv != SECSuccess) { | 798 if (rv != SECSuccess) { |
798 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); | 799 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); |
799 } | 800 } |
800 return rv; | 801 return rv; |
801 } | 802 } |
802 | 803 |
| 804 #define SSL_MAX_RSA_ASN1_PREFIX 20 |
| 805 |
| 806 /* ssl3_GetPKCS1v15ASN1Data sets |out| and |out_len| to point to a buffer that |
| 807 * contains ASN.1 data that should be prepended to a hash of the given type in |
| 808 * order to create a structure that is valid for use in a PKCS#1 v1.5 RSA |
| 809 * signature. |out_len| will not be set to a value greater than |
| 810 * SSL_MAX_RSA_ASN1_PREFIX. */ |
| 811 static SECStatus |
| 812 ssl3_GetPKCS1v15ASN1Data(SECOidTag hashAlg, |
| 813 const SSL3Opaque** out, unsigned int *out_len) |
| 814 { |
| 815 /* These are ASN1 DER structures: |
| 816 * DigestInfo ::= SEQUENCE { |
| 817 * digestAlgorithm AlgorithmIdentifier, |
| 818 * digest OCTET STRING |
| 819 * } |
| 820 */ |
| 821 static const unsigned char kMD5[] = { |
| 822 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, |
| 823 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, |
| 824 0x04, 0x10 |
| 825 }; |
| 826 static const unsigned char kSHA1[] = { |
| 827 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, |
| 828 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 |
| 829 }; |
| 830 static const unsigned char kSHA224[] = { |
| 831 0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, |
| 832 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, |
| 833 0x00, 0x04, 0x1c |
| 834 }; |
| 835 static const unsigned char kSHA256[] = { |
| 836 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, |
| 837 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, |
| 838 0x00, 0x04, 0x20 |
| 839 }; |
| 840 static const unsigned char kSHA384[] = { |
| 841 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, |
| 842 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, |
| 843 0x00, 0x04, 0x30 |
| 844 }; |
| 845 static const unsigned char kSHA512[] = { |
| 846 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, |
| 847 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, |
| 848 0x00, 0x04, 0x40 |
| 849 }; |
| 850 |
| 851 switch (hashAlg) { |
| 852 case SEC_OID_UNKNOWN: |
| 853 *out_len = 0; |
| 854 break; |
| 855 case SEC_OID_MD5: |
| 856 *out = kMD5; |
| 857 *out_len = sizeof(kMD5); |
| 858 break; |
| 859 case SEC_OID_SHA1: |
| 860 *out = kSHA1; |
| 861 *out_len = sizeof(kSHA1); |
| 862 break; |
| 863 case SEC_OID_SHA224: |
| 864 *out = kSHA224; |
| 865 *out_len = sizeof(kSHA224); |
| 866 break; |
| 867 case SEC_OID_SHA256: |
| 868 *out = kSHA256; |
| 869 *out_len = sizeof(kSHA256); |
| 870 break; |
| 871 case SEC_OID_SHA384: |
| 872 *out = kSHA384; |
| 873 *out_len = sizeof(kSHA384); |
| 874 break; |
| 875 case SEC_OID_SHA512: |
| 876 *out = kSHA512; |
| 877 *out_len = sizeof(kSHA512); |
| 878 break; |
| 879 default: |
| 880 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 881 return SECFailure; |
| 882 } |
| 883 |
| 884 return SECSuccess; |
| 885 } |
| 886 |
803 /* Called by ssl3_SendServerKeyExchange and ssl3_SendCertificateVerify */ | 887 /* Called by ssl3_SendServerKeyExchange and ssl3_SendCertificateVerify */ |
804 SECStatus | 888 SECStatus |
805 ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, | 889 ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, |
806 PRBool isTLS) | 890 PRBool isTLS) |
807 { | 891 { |
808 SECStatus rv» » = SECFailure; | 892 SECStatus rv» » = SECFailure; |
809 PRBool doDerEncode = PR_FALSE; | 893 PRBool doDerEncode = PR_FALSE; |
810 int signatureLen; | 894 int signatureLen; |
811 SECItem hashItem; | 895 SECItem hashItem; |
| 896 unsigned int len; |
| 897 const SSL3Opaque* asn1Prefix; |
| 898 SSL3Opaque asn1AndHash[HASH_LENGTH_MAX + SSL_MAX_RSA_ASN1_PREFIX]; |
812 | 899 |
813 buf->data = NULL; | 900 buf->data = NULL; |
814 signatureLen = PK11_SignatureLen(key); | 901 signatureLen = PK11_SignatureLen(key); |
815 if (signatureLen <= 0) { | 902 if (signatureLen <= 0) { |
816 PORT_SetError(SEC_ERROR_INVALID_KEY); | 903 PORT_SetError(SEC_ERROR_INVALID_KEY); |
817 goto done; | 904 goto done; |
818 } | 905 } |
819 | 906 |
820 buf->len = (unsigned)signatureLen; | 907 buf->len = (unsigned)signatureLen; |
821 buf->data = (unsigned char *)PORT_Alloc(signatureLen); | 908 buf->data = (unsigned char *)PORT_Alloc(signatureLen); |
822 if (!buf->data) | 909 if (!buf->data) |
823 goto done; /* error code was set. */ | 910 goto done; /* error code was set. */ |
824 | 911 |
825 switch (key->keyType) { | 912 switch (key->keyType) { |
826 case rsaKey: | 913 case rsaKey: |
827 » hashItem.data = hash->md5; | 914 » rv = ssl3_GetPKCS1v15ASN1Data(hash->hashAlg, &asn1Prefix, &len); |
828 » hashItem.len = sizeof(SSL3Hashes); | 915 » if (rv != SECSuccess) { |
| 916 » return rv; |
| 917 » } |
| 918 » if (len + hash->len > sizeof(asn1AndHash)) { |
| 919 » PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
| 920 » return SECFailure; |
| 921 » } |
| 922 » memcpy(asn1AndHash, asn1Prefix, len); |
| 923 » memcpy(asn1AndHash + len, hash->u.raw, hash->len); |
| 924 » len += hash->len; |
| 925 » hashItem.data = asn1AndHash; |
| 926 » hashItem.len = len; |
829 break; | 927 break; |
830 case dsaKey: | 928 case dsaKey: |
831 doDerEncode = isTLS; | 929 doDerEncode = isTLS; |
832 » hashItem.data = hash->sha; | 930 » /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. |
833 » hashItem.len = sizeof(hash->sha); | 931 » * In that case, we use just the SHA1 part. */ |
| 932 » if (hash->hashAlg == SEC_OID_UNKNOWN) { |
| 933 » hashItem.data = hash->u.s.sha; |
| 934 » hashItem.len = sizeof(hash->u.s.sha); |
| 935 » } else { |
| 936 » hashItem.data = hash->u.raw; |
| 937 » hashItem.len = hash->len; |
| 938 » } |
834 break; | 939 break; |
835 #ifdef NSS_ENABLE_ECC | 940 #ifdef NSS_ENABLE_ECC |
836 case ecKey: | 941 case ecKey: |
837 doDerEncode = PR_TRUE; | 942 doDerEncode = PR_TRUE; |
838 » hashItem.data = hash->sha; | 943 » /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. |
839 » hashItem.len = sizeof(hash->sha); | 944 » * In that case, we use just the SHA1 part. */ |
| 945 » if (hash->hashAlg == SEC_OID_UNKNOWN) { |
| 946 » hashItem.data = hash->u.s.sha; |
| 947 » hashItem.len = sizeof(hash->u.s.sha); |
| 948 » } else { |
| 949 » hashItem.data = hash->u.raw; |
| 950 » hashItem.len = hash->len; |
| 951 » } |
840 break; | 952 break; |
841 #endif /* NSS_ENABLE_ECC */ | 953 #endif /* NSS_ENABLE_ECC */ |
842 default: | 954 default: |
843 PORT_SetError(SEC_ERROR_INVALID_KEY); | 955 PORT_SetError(SEC_ERROR_INVALID_KEY); |
844 goto done; | 956 goto done; |
845 } | 957 } |
846 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); | 958 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); |
847 | 959 |
848 rv = PK11_Sign(key, buf, &hashItem); | 960 rv = PK11_Sign(key, buf, &hashItem); |
849 if (rv != SECSuccess) { | 961 if (rv != SECSuccess) { |
(...skipping 22 matching lines...) Expand all Loading... |
872 | 984 |
873 /* Called from ssl3_HandleServerKeyExchange, ssl3_HandleCertificateVerify */ | 985 /* Called from ssl3_HandleServerKeyExchange, ssl3_HandleCertificateVerify */ |
874 SECStatus | 986 SECStatus |
875 ssl3_VerifySignedHashes(SSL3Hashes *hash, CERTCertificate *cert, | 987 ssl3_VerifySignedHashes(SSL3Hashes *hash, CERTCertificate *cert, |
876 SECItem *buf, PRBool isTLS, void *pwArg) | 988 SECItem *buf, PRBool isTLS, void *pwArg) |
877 { | 989 { |
878 SECKEYPublicKey * key; | 990 SECKEYPublicKey * key; |
879 SECItem * signature = NULL; | 991 SECItem * signature = NULL; |
880 SECStatus rv; | 992 SECStatus rv; |
881 SECItem hashItem; | 993 SECItem hashItem; |
882 #ifdef NSS_ENABLE_ECC | 994 const SSL3Opaque* asn1Prefix; |
| 995 SSL3Opaque asn1AndHash[HASH_LENGTH_MAX + SSL_MAX_RSA_ASN1_PREFIX]; |
883 unsigned int len; | 996 unsigned int len; |
884 #endif /* NSS_ENABLE_ECC */ | |
885 | 997 |
886 | 998 |
887 PRINT_BUF(60, (NULL, "check signed hashes", | 999 PRINT_BUF(60, (NULL, "check signed hashes", |
888 buf->data, buf->len)); | 1000 buf->data, buf->len)); |
889 | 1001 |
890 key = CERT_ExtractPublicKey(cert); | 1002 key = CERT_ExtractPublicKey(cert); |
891 if (key == NULL) { | 1003 if (key == NULL) { |
892 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); | 1004 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); |
893 return SECFailure; | 1005 return SECFailure; |
894 } | 1006 } |
895 | 1007 |
896 switch (key->keyType) { | 1008 switch (key->keyType) { |
897 case rsaKey: | 1009 case rsaKey: |
898 » hashItem.data = hash->md5; | 1010 » rv = ssl3_GetPKCS1v15ASN1Data(hash->hashAlg, &asn1Prefix, &len); |
899 » hashItem.len = sizeof(SSL3Hashes); | 1011 » if (rv != SECSuccess) { |
| 1012 » return rv; |
| 1013 » } |
| 1014 » if (len + hash->len > sizeof(asn1AndHash)) { |
| 1015 » PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); |
| 1016 » return SECFailure; |
| 1017 » } |
| 1018 » memcpy(asn1AndHash, asn1Prefix, len); |
| 1019 » memcpy(asn1AndHash + len, hash->u.raw, hash->len); |
| 1020 » len += hash->len; |
| 1021 » hashItem.data = asn1AndHash; |
| 1022 » hashItem.len = len; |
900 break; | 1023 break; |
901 case dsaKey: | 1024 case dsaKey: |
902 » hashItem.data = hash->sha; | 1025 » /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. |
903 » hashItem.len = sizeof(hash->sha); | 1026 » * In that case, we use just the SHA1 part. */ |
| 1027 » if (hash->hashAlg == SEC_OID_UNKNOWN) { |
| 1028 » hashItem.data = hash->u.s.sha; |
| 1029 » hashItem.len = sizeof(hash->u.s.sha); |
| 1030 » } else { |
| 1031 » hashItem.data = hash->u.raw; |
| 1032 » hashItem.len = hash->len; |
| 1033 » } |
904 /* Allow DER encoded DSA signatures in SSL 3.0 */ | 1034 /* Allow DER encoded DSA signatures in SSL 3.0 */ |
905 if (isTLS || buf->len != SECKEY_SignatureLen(key)) { | 1035 if (isTLS || buf->len != SECKEY_SignatureLen(key)) { |
906 signature = DSAU_DecodeDerSig(buf); | 1036 signature = DSAU_DecodeDerSig(buf); |
907 if (!signature) { | 1037 if (!signature) { |
908 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | 1038 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); |
909 return SECFailure; | 1039 return SECFailure; |
910 } | 1040 } |
911 buf = signature; | 1041 buf = signature; |
912 } | 1042 } |
913 break; | 1043 break; |
914 | 1044 |
915 #ifdef NSS_ENABLE_ECC | 1045 #ifdef NSS_ENABLE_ECC |
916 case ecKey: | 1046 case ecKey: |
917 » hashItem.data = hash->sha; | 1047 » /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. |
918 » hashItem.len = sizeof(hash->sha); | 1048 » * In that case, we use just the SHA1 part. */ |
| 1049 » if (hash->hashAlg == SEC_OID_UNKNOWN) { |
| 1050 » hashItem.data = hash->u.s.sha; |
| 1051 » hashItem.len = sizeof(hash->u.s.sha); |
| 1052 » } else { |
| 1053 » hashItem.data = hash->u.raw; |
| 1054 » hashItem.len = hash->len; |
| 1055 » } |
919 /* | 1056 /* |
920 * ECDSA signatures always encode the integers r and s | 1057 * ECDSA signatures always encode the integers r and s |
921 * using ASN (unlike DSA where ASN encoding is used | 1058 * using ASN (unlike DSA where ASN encoding is used |
922 * with TLS but not with SSL3) | 1059 * with TLS but not with SSL3) |
923 */ | 1060 */ |
924 len = SECKEY_SignatureLen(key); | 1061 len = SECKEY_SignatureLen(key); |
925 if (len == 0) { | 1062 if (len == 0) { |
926 SECKEY_DestroyPublicKey(key); | 1063 SECKEY_DestroyPublicKey(key); |
927 PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); | 1064 PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); |
928 return SECFailure; | 1065 return SECFailure; |
(...skipping 25 matching lines...) Expand all Loading... |
954 ssl_MapLowLevelError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | 1091 ssl_MapLowLevelError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); |
955 } | 1092 } |
956 return rv; | 1093 return rv; |
957 } | 1094 } |
958 | 1095 |
959 | 1096 |
960 /* Caller must set hiLevel error code. */ | 1097 /* Caller must set hiLevel error code. */ |
961 /* Called from ssl3_ComputeExportRSAKeyHash | 1098 /* Called from ssl3_ComputeExportRSAKeyHash |
962 * ssl3_ComputeDHKeyHash | 1099 * ssl3_ComputeDHKeyHash |
963 * which are called from ssl3_HandleServerKeyExchange. | 1100 * which are called from ssl3_HandleServerKeyExchange. |
| 1101 * |
| 1102 * hashAlg: either the OID for a hash function or SEC_OID_UNKNOWN to specify |
| 1103 * the pre-1.2, MD5/SHA1 combination hash. |
964 */ | 1104 */ |
965 SECStatus | 1105 SECStatus |
966 ssl3_ComputeCommonKeyHash(PRUint8 * hashBuf, unsigned int bufLen, | 1106 ssl3_ComputeCommonKeyHash(SECOidTag hashAlg, |
967 » » » SSL3Hashes *hashes, PRBool bypassPKCS11) | 1107 » » » PRUint8 * hashBuf, unsigned int bufLen, |
| 1108 » » » SSL3Hashes *hashes, PRBool bypassPKCS11) |
968 { | 1109 { |
969 SECStatus rv = SECSuccess; | 1110 SECStatus rv = SECSuccess; |
970 | 1111 |
971 #ifndef NO_PKCS11_BYPASS | 1112 #ifndef NO_PKCS11_BYPASS |
972 if (bypassPKCS11) { | 1113 if (bypassPKCS11) { |
973 » MD5_HashBuf (hashes->md5, hashBuf, bufLen); | 1114 » if (hashAlg == SEC_OID_UNKNOWN) { |
974 » SHA1_HashBuf(hashes->sha, hashBuf, bufLen); | 1115 » MD5_HashBuf (hashes->u.s.md5, hashBuf, bufLen); |
| 1116 » SHA1_HashBuf(hashes->u.s.sha, hashBuf, bufLen); |
| 1117 » hashes->len = MD5_LENGTH + SHA1_LENGTH; |
| 1118 » } else if (hashAlg == SEC_OID_SHA1) { |
| 1119 » SHA1_HashBuf(hashes->u.raw, hashBuf, bufLen); |
| 1120 » hashes->len = SHA1_LENGTH; |
| 1121 » } else if (hashAlg == SEC_OID_SHA256) { |
| 1122 » SHA256_HashBuf(hashes->u.raw, hashBuf, bufLen); |
| 1123 » hashes->len = SHA256_LENGTH; |
| 1124 » } else { |
| 1125 » PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 1126 » return SECFailure; |
| 1127 » } |
975 } else | 1128 } else |
976 #endif | 1129 #endif |
977 { | 1130 { |
978 » rv = PK11_HashBuf(SEC_OID_MD5, hashes->md5, hashBuf, bufLen); | 1131 » if (hashAlg == SEC_OID_UNKNOWN) { |
979 » if (rv != SECSuccess) { | 1132 » rv = PK11_HashBuf(SEC_OID_MD5, hashes->u.s.md5, hashBuf, bufLen); |
980 » ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 1133 » if (rv != SECSuccess) { |
981 » rv = SECFailure; | 1134 » » ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
982 » goto done; | 1135 » » rv = SECFailure; |
983 » } | 1136 » » goto done; |
| 1137 » } |
984 | 1138 |
985 » rv = PK11_HashBuf(SEC_OID_SHA1, hashes->sha, hashBuf, bufLen); | 1139 » rv = PK11_HashBuf(SEC_OID_SHA1, hashes->u.s.sha, hashBuf, bufLen); |
986 » if (rv != SECSuccess) { | 1140 » if (rv != SECSuccess) { |
987 » ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 1141 » » ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
988 » rv = SECFailure; | 1142 » » rv = SECFailure; |
| 1143 » } |
| 1144 » hashes->len = MD5_LENGTH + SHA1_LENGTH; |
| 1145 » } else { |
| 1146 » hashes->len = HASH_ResultLenByOidTag(hashAlg); |
| 1147 » if (hashes->len > sizeof(hashes->u.raw)) { |
| 1148 » » ssl_MapLowLevelError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 1149 » » rv = SECFailure; |
| 1150 » } else { |
| 1151 » » rv = PK11_HashBuf(hashAlg, hashes->u.raw, hashBuf, bufLen); |
| 1152 » » if (rv != SECSuccess) { |
| 1153 » » ssl_MapLowLevelError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 1154 » » rv = SECFailure; |
| 1155 » » } |
| 1156 » } |
989 } | 1157 } |
990 } | 1158 } |
| 1159 hashes->hashAlg = hashAlg; |
| 1160 |
991 done: | 1161 done: |
992 return rv; | 1162 return rv; |
993 } | 1163 } |
994 | 1164 |
995 /* Caller must set hiLevel error code. | 1165 /* Caller must set hiLevel error code. |
996 ** Called from ssl3_SendServerKeyExchange and | 1166 ** Called from ssl3_SendServerKeyExchange and |
997 ** ssl3_HandleServerKeyExchange. | 1167 ** ssl3_HandleServerKeyExchange. |
998 */ | 1168 */ |
999 static SECStatus | 1169 static SECStatus |
1000 ssl3_ComputeExportRSAKeyHash(SECItem modulus, SECItem publicExponent, | 1170 ssl3_ComputeExportRSAKeyHash(SECOidTag hashAlg, |
| 1171 » » » SECItem modulus, SECItem publicExponent, |
1001 SSL3Random *client_rand, SSL3Random *server_rand, | 1172 SSL3Random *client_rand, SSL3Random *server_rand, |
1002 SSL3Hashes *hashes, PRBool bypassPKCS11) | 1173 SSL3Hashes *hashes, PRBool bypassPKCS11) |
1003 { | 1174 { |
1004 PRUint8 * hashBuf; | 1175 PRUint8 * hashBuf; |
1005 PRUint8 * pBuf; | 1176 PRUint8 * pBuf; |
1006 SECStatus rv = SECSuccess; | 1177 SECStatus rv = SECSuccess; |
1007 unsigned int bufLen; | 1178 unsigned int bufLen; |
1008 PRUint8 buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8]; | 1179 PRUint8 buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8]; |
1009 | 1180 |
1010 bufLen = 2*SSL3_RANDOM_LENGTH + 2 + modulus.len + 2 + publicExponent.len; | 1181 bufLen = 2*SSL3_RANDOM_LENGTH + 2 + modulus.len + 2 + publicExponent.len; |
(...skipping 15 matching lines...) Expand all Loading... |
1026 pBuf += 2; | 1197 pBuf += 2; |
1027 memcpy(pBuf, modulus.data, modulus.len); | 1198 memcpy(pBuf, modulus.data, modulus.len); |
1028 pBuf += modulus.len; | 1199 pBuf += modulus.len; |
1029 pBuf[0] = (PRUint8)(publicExponent.len >> 8); | 1200 pBuf[0] = (PRUint8)(publicExponent.len >> 8); |
1030 pBuf[1] = (PRUint8)(publicExponent.len); | 1201 pBuf[1] = (PRUint8)(publicExponent.len); |
1031 pBuf += 2; | 1202 pBuf += 2; |
1032 memcpy(pBuf, publicExponent.data, publicExponent.len); | 1203 memcpy(pBuf, publicExponent.data, publicExponent.len); |
1033 pBuf += publicExponent.len; | 1204 pBuf += publicExponent.len; |
1034 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); | 1205 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); |
1035 | 1206 |
1036 rv = ssl3_ComputeCommonKeyHash(hashBuf, bufLen, hashes, bypassPKCS11); | 1207 rv = ssl3_ComputeCommonKeyHash(hashAlg, hashBuf, bufLen, hashes, bypassPKCS1
1); |
1037 | 1208 |
1038 PRINT_BUF(95, (NULL, "RSAkey hash: ", hashBuf, bufLen)); | 1209 PRINT_BUF(95, (NULL, "RSAkey hash: ", hashBuf, bufLen)); |
1039 PRINT_BUF(95, (NULL, "RSAkey hash: MD5 result", hashes->md5, MD5_LENGTH)); | 1210 if (hashAlg == SEC_OID_UNKNOWN) { |
1040 PRINT_BUF(95, (NULL, "RSAkey hash: SHA1 result", hashes->sha, SHA1_LENGTH)); | 1211 » PRINT_BUF(95, (NULL, "RSAkey hash: MD5 result", hashes->u.s.md5, MD5_LEN
GTH)); |
| 1212 » PRINT_BUF(95, (NULL, "RSAkey hash: SHA1 result", hashes->u.s.sha, SHA1_L
ENGTH)); |
| 1213 } else { |
| 1214 » PRINT_BUF(95, (NULL, "RSAkey hash: ", hashes->u.raw, hashes->len)); |
| 1215 } |
1041 | 1216 |
1042 if (hashBuf != buf && hashBuf != NULL) | 1217 if (hashBuf != buf && hashBuf != NULL) |
1043 PORT_Free(hashBuf); | 1218 PORT_Free(hashBuf); |
1044 return rv; | 1219 return rv; |
1045 } | 1220 } |
1046 | 1221 |
1047 /* Caller must set hiLevel error code. */ | 1222 /* Caller must set hiLevel error code. */ |
1048 /* Called from ssl3_HandleServerKeyExchange. */ | 1223 /* Called from ssl3_HandleServerKeyExchange. */ |
1049 static SECStatus | 1224 static SECStatus |
1050 ssl3_ComputeDHKeyHash(SECItem dh_p, SECItem dh_g, SECItem dh_Ys, | 1225 ssl3_ComputeDHKeyHash(SECOidTag hashAlg, |
1051 » » » SSL3Random *client_rand, SSL3Random *server_rand, | 1226 » » SECItem dh_p, SECItem dh_g, SECItem dh_Ys, |
1052 » » » SSL3Hashes *hashes, PRBool bypassPKCS11) | 1227 » » SSL3Random *client_rand, SSL3Random *server_rand, |
| 1228 » » SSL3Hashes *hashes, PRBool bypassPKCS11) |
1053 { | 1229 { |
1054 PRUint8 * hashBuf; | 1230 PRUint8 * hashBuf; |
1055 PRUint8 * pBuf; | 1231 PRUint8 * pBuf; |
1056 SECStatus rv = SECSuccess; | 1232 SECStatus rv = SECSuccess; |
1057 unsigned int bufLen; | 1233 unsigned int bufLen; |
1058 PRUint8 buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8]; | 1234 PRUint8 buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8]; |
1059 | 1235 |
1060 bufLen = 2*SSL3_RANDOM_LENGTH + 2 + dh_p.len + 2 + dh_g.len + 2 + dh_Ys.len; | 1236 bufLen = 2*SSL3_RANDOM_LENGTH + 2 + dh_p.len + 2 + dh_g.len + 2 + dh_Ys.len; |
1061 if (bufLen <= sizeof buf) { | 1237 if (bufLen <= sizeof buf) { |
1062 hashBuf = buf; | 1238 hashBuf = buf; |
(...skipping 18 matching lines...) Expand all Loading... |
1081 pBuf += 2; | 1257 pBuf += 2; |
1082 memcpy(pBuf, dh_g.data, dh_g.len); | 1258 memcpy(pBuf, dh_g.data, dh_g.len); |
1083 pBuf += dh_g.len; | 1259 pBuf += dh_g.len; |
1084 pBuf[0] = (PRUint8)(dh_Ys.len >> 8); | 1260 pBuf[0] = (PRUint8)(dh_Ys.len >> 8); |
1085 pBuf[1] = (PRUint8)(dh_Ys.len); | 1261 pBuf[1] = (PRUint8)(dh_Ys.len); |
1086 pBuf += 2; | 1262 pBuf += 2; |
1087 memcpy(pBuf, dh_Ys.data, dh_Ys.len); | 1263 memcpy(pBuf, dh_Ys.data, dh_Ys.len); |
1088 pBuf += dh_Ys.len; | 1264 pBuf += dh_Ys.len; |
1089 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); | 1265 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); |
1090 | 1266 |
1091 rv = ssl3_ComputeCommonKeyHash(hashBuf, bufLen, hashes, bypassPKCS11); | 1267 rv = ssl3_ComputeCommonKeyHash(hashAlg, hashBuf, bufLen, hashes, bypassPKCS1
1); |
1092 | 1268 |
1093 PRINT_BUF(95, (NULL, "DHkey hash: ", hashBuf, bufLen)); | 1269 PRINT_BUF(95, (NULL, "DHkey hash: ", hashBuf, bufLen)); |
1094 PRINT_BUF(95, (NULL, "DHkey hash: MD5 result", hashes->md5, MD5_LENGTH)); | 1270 if (hashAlg == SEC_OID_UNKNOWN) { |
1095 PRINT_BUF(95, (NULL, "DHkey hash: SHA1 result", hashes->sha, SHA1_LENGTH)); | 1271 » PRINT_BUF(95, (NULL, "DHkey hash: MD5 result", hashes->u.s.md5, MD5_LENG
TH)); |
| 1272 » PRINT_BUF(95, (NULL, "DHkey hash: SHA1 result", hashes->u.s.sha, SHA1_LE
NGTH)); |
| 1273 } else { |
| 1274 » PRINT_BUF(95, (NULL, "DHkey hash: ", hashes->u.raw, hashes->len)); |
| 1275 } |
1096 | 1276 |
1097 if (hashBuf != buf && hashBuf != NULL) | 1277 if (hashBuf != buf && hashBuf != NULL) |
1098 PORT_Free(hashBuf); | 1278 PORT_Free(hashBuf); |
1099 return rv; | 1279 return rv; |
1100 } | 1280 } |
1101 | 1281 |
1102 static void | 1282 static void |
1103 ssl3_BumpSequenceNumber(SSL3SequenceNumber *num) | 1283 ssl3_BumpSequenceNumber(SSL3SequenceNumber *num) |
1104 { | 1284 { |
1105 num->low++; | 1285 num->low++; |
(...skipping 2077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3183 */ | 3363 */ |
3184 static SECStatus | 3364 static SECStatus |
3185 ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms) | 3365 ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms) |
3186 { | 3366 { |
3187 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; | 3367 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; |
3188 const ssl3KEADef *kea_def= ss->ssl3.hs.kea_def; | 3368 const ssl3KEADef *kea_def= ss->ssl3.hs.kea_def; |
3189 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; | 3369 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; |
3190 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; | 3370 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; |
3191 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | 3371 PRBool isTLS = (PRBool)(kea_def->tls_keygen || |
3192 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | 3372 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); |
| 3373 PRBool isTLS12= |
| 3374 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
3193 /* | 3375 /* |
3194 * Whenever isDH is true, we need to use CKM_TLS_MASTER_KEY_DERIVE_DH | 3376 * Whenever isDH is true, we need to use CKM_TLS_MASTER_KEY_DERIVE_DH |
3195 * which, unlike CKM_TLS_MASTER_KEY_DERIVE, converts arbitrary size | 3377 * which, unlike CKM_TLS_MASTER_KEY_DERIVE, converts arbitrary size |
3196 * data into a 48-byte value. | 3378 * data into a 48-byte value. |
3197 */ | 3379 */ |
3198 PRBool isDH = (PRBool) ((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || | 3380 PRBool isDH = (PRBool) ((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || |
3199 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); | 3381 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); |
3200 SECStatus rv = SECFailure; | 3382 SECStatus rv = SECFailure; |
3201 CK_MECHANISM_TYPE master_derive; | 3383 CK_MECHANISM_TYPE master_derive; |
3202 CK_MECHANISM_TYPE key_derive; | 3384 CK_MECHANISM_TYPE key_derive; |
3203 SECItem params; | 3385 SECItem params; |
3204 CK_FLAGS keyFlags; | 3386 CK_FLAGS keyFlags; |
3205 CK_VERSION pms_version; | 3387 CK_VERSION pms_version; |
3206 CK_SSL3_MASTER_KEY_DERIVE_PARAMS master_params; | 3388 CK_SSL3_MASTER_KEY_DERIVE_PARAMS master_params; |
3207 | 3389 |
3208 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 3390 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
3209 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | 3391 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); |
3210 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | 3392 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); |
3211 if (isTLS) { | 3393 if (isTLS12) { |
| 3394 » if(isDH) master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256; |
| 3395 » else master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256; |
| 3396 » key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256; |
| 3397 » keyFlags = CKF_SIGN | CKF_VERIFY; |
| 3398 } else if (isTLS) { |
3212 if(isDH) master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH; | 3399 if(isDH) master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH; |
3213 else master_derive = CKM_TLS_MASTER_KEY_DERIVE; | 3400 else master_derive = CKM_TLS_MASTER_KEY_DERIVE; |
3214 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | 3401 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; |
3215 keyFlags = CKF_SIGN | CKF_VERIFY; | 3402 keyFlags = CKF_SIGN | CKF_VERIFY; |
3216 } else { | 3403 } else { |
3217 if (isDH) master_derive = CKM_SSL3_MASTER_KEY_DERIVE_DH; | 3404 if (isDH) master_derive = CKM_SSL3_MASTER_KEY_DERIVE_DH; |
3218 else master_derive = CKM_SSL3_MASTER_KEY_DERIVE; | 3405 else master_derive = CKM_SSL3_MASTER_KEY_DERIVE; |
3219 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; | 3406 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; |
3220 keyFlags = 0; | 3407 keyFlags = 0; |
3221 } | 3408 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3359 */ | 3546 */ |
3360 static SECStatus | 3547 static SECStatus |
3361 ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss) | 3548 ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss) |
3362 { | 3549 { |
3363 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; | 3550 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; |
3364 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; | 3551 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; |
3365 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; | 3552 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; |
3366 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; | 3553 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; |
3367 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | 3554 PRBool isTLS = (PRBool)(kea_def->tls_keygen || |
3368 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | 3555 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); |
| 3556 PRBool isTLS12= |
| 3557 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
3369 /* following variables used in PKCS11 path */ | 3558 /* following variables used in PKCS11 path */ |
3370 const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def; | 3559 const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def; |
3371 PK11SlotInfo * slot = NULL; | 3560 PK11SlotInfo * slot = NULL; |
3372 PK11SymKey * symKey = NULL; | 3561 PK11SymKey * symKey = NULL; |
3373 void * pwArg = ss->pkcs11PinArg; | 3562 void * pwArg = ss->pkcs11PinArg; |
3374 int keySize; | 3563 int keySize; |
3375 CK_SSL3_KEY_MAT_PARAMS key_material_params; | 3564 CK_SSL3_KEY_MAT_PARAMS key_material_params; |
3376 CK_SSL3_KEY_MAT_OUT returnedKeys; | 3565 CK_SSL3_KEY_MAT_OUT returnedKeys; |
3377 CK_MECHANISM_TYPE key_derive; | 3566 CK_MECHANISM_TYPE key_derive; |
3378 CK_MECHANISM_TYPE bulk_mechanism; | 3567 CK_MECHANISM_TYPE bulk_mechanism; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3416 returnedKeys.pIVServer = NULL; | 3605 returnedKeys.pIVServer = NULL; |
3417 } | 3606 } |
3418 | 3607 |
3419 calg = cipher_def->calg; | 3608 calg = cipher_def->calg; |
3420 PORT_Assert( alg2Mech[calg].calg == calg); | 3609 PORT_Assert( alg2Mech[calg].calg == calg); |
3421 bulk_mechanism = alg2Mech[calg].cmech; | 3610 bulk_mechanism = alg2Mech[calg].cmech; |
3422 | 3611 |
3423 params.data = (unsigned char *)&key_material_params; | 3612 params.data = (unsigned char *)&key_material_params; |
3424 params.len = sizeof(key_material_params); | 3613 params.len = sizeof(key_material_params); |
3425 | 3614 |
3426 if (isTLS) { | 3615 if (isTLS12) { |
| 3616 » key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256; |
| 3617 } else if (isTLS) { |
3427 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | 3618 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; |
3428 } else { | 3619 } else { |
3429 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; | 3620 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; |
3430 } | 3621 } |
3431 | 3622 |
3432 /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and | 3623 /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and |
3433 * DERIVE by DEFAULT */ | 3624 * DERIVE by DEFAULT */ |
3434 symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms, | 3625 symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms, |
3435 bulk_mechanism, CKA_ENCRYPT, keySize); | 3626 bulk_mechanism, CKA_ENCRYPT, keySize); |
3436 if (!symKey) { | 3627 if (!symKey) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3473 PK11_FreeSymKey(symKey); | 3664 PK11_FreeSymKey(symKey); |
3474 return SECSuccess; | 3665 return SECSuccess; |
3475 | 3666 |
3476 | 3667 |
3477 loser: | 3668 loser: |
3478 if (symKey) PK11_FreeSymKey(symKey); | 3669 if (symKey) PK11_FreeSymKey(symKey); |
3479 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | 3670 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); |
3480 return SECFailure; | 3671 return SECFailure; |
3481 } | 3672 } |
3482 | 3673 |
| 3674 /* ssl3_InitTLS12HandshakeHash creates a handshake hash function for TLS 1.2, |
| 3675 * if needed, and hashes in any buffered messages in ss->ssl3.hs.messages. */ |
| 3676 static SECStatus |
| 3677 ssl3_InitTLS12HandshakeHash(sslSocket *ss) |
| 3678 { |
| 3679 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2 && |
| 3680 ss->ssl3.hs.tls12_handshake_hash == NULL) { |
| 3681 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 |
| 3682 * then this will need to be updated. */ |
| 3683 ss->ssl3.hs.tls12_handshake_hash = |
| 3684 PK11_CreateDigestContext(SEC_OID_SHA256); |
| 3685 if (!ss->ssl3.hs.tls12_handshake_hash || |
| 3686 SECSuccess != PK11_DigestBegin(ss->ssl3.hs.tls12_handshake_hash)) { |
| 3687 ssl_MapLowLevelError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 3688 return SECFailure; |
| 3689 } |
| 3690 } |
| 3691 |
| 3692 if (ss->ssl3.hs.tls12_handshake_hash && ss->ssl3.hs.messages.len > 0) { |
| 3693 if (SECSuccess != PK11_DigestOp( |
| 3694 ss->ssl3.hs.tls12_handshake_hash, |
| 3695 ss->ssl3.hs.messages.buf, |
| 3696 ss->ssl3.hs.messages.len)) { |
| 3697 ssl_MapLowLevelError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 3698 return SECFailure; |
| 3699 } |
| 3700 } |
| 3701 |
| 3702 if (ss->ssl3.hs.messages.buf && !ss->opt.bypassPKCS11) { |
| 3703 PORT_Free(ss->ssl3.hs.messages.buf); |
| 3704 ss->ssl3.hs.messages.buf = NULL; |
| 3705 ss->ssl3.hs.messages.len = 0; |
| 3706 ss->ssl3.hs.messages.space = 0; |
| 3707 } |
| 3708 |
| 3709 return SECSuccess; |
| 3710 } |
| 3711 |
3483 static SECStatus | 3712 static SECStatus |
3484 ssl3_RestartHandshakeHashes(sslSocket *ss) | 3713 ssl3_RestartHandshakeHashes(sslSocket *ss) |
3485 { | 3714 { |
3486 SECStatus rv = SECSuccess; | 3715 SECStatus rv = SECSuccess; |
3487 | 3716 |
| 3717 ss->ssl3.hs.messages.len = 0; |
3488 #ifndef NO_PKCS11_BYPASS | 3718 #ifndef NO_PKCS11_BYPASS |
3489 if (ss->opt.bypassPKCS11) { | 3719 if (ss->opt.bypassPKCS11) { |
3490 ss->ssl3.hs.messages.len = 0; | |
3491 MD5_Begin((MD5Context *)ss->ssl3.hs.md5_cx); | 3720 MD5_Begin((MD5Context *)ss->ssl3.hs.md5_cx); |
3492 SHA1_Begin((SHA1Context *)ss->ssl3.hs.sha_cx); | 3721 SHA1_Begin((SHA1Context *)ss->ssl3.hs.sha_cx); |
3493 } else | 3722 } else |
3494 #endif | 3723 #endif |
3495 { | 3724 { |
| 3725 if (ss->ssl3.hs.tls12_handshake_hash) { |
| 3726 rv = PK11_DigestBegin(ss->ssl3.hs.tls12_handshake_hash); |
| 3727 if (rv != SECSuccess) { |
| 3728 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); |
| 3729 return rv; |
| 3730 } |
| 3731 } |
3496 rv = PK11_DigestBegin(ss->ssl3.hs.md5); | 3732 rv = PK11_DigestBegin(ss->ssl3.hs.md5); |
3497 if (rv != SECSuccess) { | 3733 if (rv != SECSuccess) { |
3498 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 3734 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
3499 return rv; | 3735 return rv; |
3500 } | 3736 } |
3501 rv = PK11_DigestBegin(ss->ssl3.hs.sha); | 3737 rv = PK11_DigestBegin(ss->ssl3.hs.sha); |
3502 if (rv != SECSuccess) { | 3738 if (rv != SECSuccess) { |
3503 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 3739 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
3504 return rv; | 3740 return rv; |
3505 } | 3741 } |
3506 } | 3742 } |
3507 return rv; | 3743 return rv; |
3508 } | 3744 } |
3509 | 3745 |
3510 static SECStatus | 3746 static SECStatus |
3511 ssl3_NewHandshakeHashes(sslSocket *ss) | 3747 ssl3_NewHandshakeHashes(sslSocket *ss) |
3512 { | 3748 { |
3513 PK11Context *md5 = NULL; | 3749 PK11Context *md5 = NULL; |
3514 PK11Context *sha = NULL; | 3750 PK11Context *sha = NULL; |
3515 | 3751 |
3516 /* | 3752 /* |
3517 * note: We should probably lookup an SSL3 slot for these | 3753 * note: We should probably lookup an SSL3 slot for these |
3518 * handshake hashes in hopes that we wind up with the same slots | 3754 * handshake hashes in hopes that we wind up with the same slots |
3519 * that the master secret will wind up in ... | 3755 * that the master secret will wind up in ... |
3520 */ | 3756 */ |
3521 SSL_TRC(30,("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd)); | 3757 SSL_TRC(30,("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd)); |
3522 #ifndef NO_PKCS11_BYPASS | 3758 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); |
3523 if (ss->opt.bypassPKCS11) { | 3759 ss->ssl3.hs.messages.buf = NULL; |
3524 » PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); | 3760 ss->ssl3.hs.messages.space = 0; |
3525 » ss->ssl3.hs.messages.buf = NULL; | 3761 |
3526 » ss->ssl3.hs.messages.space = 0; | 3762 ss->ssl3.hs.md5 = md5 = PK11_CreateDigestContext(SEC_OID_MD5); |
3527 } else | 3763 ss->ssl3.hs.sha = sha = PK11_CreateDigestContext(SEC_OID_SHA1); |
3528 #endif | 3764 ss->ssl3.hs.tls12_handshake_hash = NULL; |
3529 { | 3765 if (md5 == NULL) { |
3530 » ss->ssl3.hs.md5 = md5 = PK11_CreateDigestContext(SEC_OID_MD5); | 3766 » ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
3531 » ss->ssl3.hs.sha = sha = PK11_CreateDigestContext(SEC_OID_SHA1); | 3767 » goto loser; |
3532 » if (md5 == NULL) { | 3768 } |
3533 » ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 3769 if (sha == NULL) { |
3534 » goto loser; | 3770 » ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
3535 » } | 3771 » goto loser; |
3536 » if (sha == NULL) { | |
3537 » ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
3538 » goto loser; | |
3539 » } | |
3540 } | 3772 } |
3541 if (SECSuccess == ssl3_RestartHandshakeHashes(ss)) { | 3773 if (SECSuccess == ssl3_RestartHandshakeHashes(ss)) { |
3542 return SECSuccess; | 3774 return SECSuccess; |
3543 } | 3775 } |
3544 | 3776 |
3545 loser: | 3777 loser: |
3546 if (md5 != NULL) { | 3778 if (md5 != NULL) { |
3547 PK11_DestroyContext(md5, PR_TRUE); | 3779 PK11_DestroyContext(md5, PR_TRUE); |
3548 ss->ssl3.hs.md5 = NULL; | 3780 ss->ssl3.hs.md5 = NULL; |
3549 } | 3781 } |
(...skipping 17 matching lines...) Expand all Loading... |
3567 static SECStatus | 3799 static SECStatus |
3568 ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b, | 3800 ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b, |
3569 unsigned int l) | 3801 unsigned int l) |
3570 { | 3802 { |
3571 SECStatus rv = SECSuccess; | 3803 SECStatus rv = SECSuccess; |
3572 | 3804 |
3573 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 3805 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
3574 | 3806 |
3575 PRINT_BUF(90, (NULL, "MD5 & SHA handshake hash input:", b, l)); | 3807 PRINT_BUF(90, (NULL, "MD5 & SHA handshake hash input:", b, l)); |
3576 | 3808 |
| 3809 if ((ss->version == 0 || ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) && |
| 3810 !ss->opt.bypassPKCS11 && |
| 3811 ss->ssl3.hs.tls12_handshake_hash == NULL) { |
| 3812 /* For TLS 1.2 connections we need to buffer the handshake messages |
| 3813 * until we have established which PRF hash function to use. */ |
| 3814 rv = sslBuffer_Append(&ss->ssl3.hs.messages, b, l); |
| 3815 if (rv != SECSuccess) { |
| 3816 return rv; |
| 3817 } |
| 3818 } |
| 3819 |
3577 #ifndef NO_PKCS11_BYPASS | 3820 #ifndef NO_PKCS11_BYPASS |
3578 if (ss->opt.bypassPKCS11) { | 3821 if (ss->opt.bypassPKCS11) { |
3579 MD5_Update((MD5Context *)ss->ssl3.hs.md5_cx, b, l); | 3822 MD5_Update((MD5Context *)ss->ssl3.hs.md5_cx, b, l); |
3580 SHA1_Update((SHA1Context *)ss->ssl3.hs.sha_cx, b, l); | 3823 SHA1_Update((SHA1Context *)ss->ssl3.hs.sha_cx, b, l); |
3581 #if defined(NSS_SURVIVE_DOUBLE_BYPASS_FAILURE) | 3824 #if defined(NSS_SURVIVE_DOUBLE_BYPASS_FAILURE) |
3582 rv = sslBuffer_Append(&ss->ssl3.hs.messages, b, l); | 3825 rv = sslBuffer_Append(&ss->ssl3.hs.messages, b, l); |
3583 #endif | 3826 #endif |
3584 return rv; | 3827 return rv; |
3585 } | 3828 } |
3586 #endif | 3829 #endif |
3587 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); | 3830 if (ss->ssl3.hs.tls12_handshake_hash) { |
3588 if (rv != SECSuccess) { | 3831 » rv = PK11_DigestOp(ss->ssl3.hs.tls12_handshake_hash, b, l); |
3589 » ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 3832 } else { |
3590 » return rv; | 3833 » rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); |
3591 } | 3834 » if (rv != SECSuccess) { |
3592 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); | 3835 » ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
3593 if (rv != SECSuccess) { | 3836 » return rv; |
3594 » ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 3837 » } |
3595 » return rv; | 3838 » rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); |
| 3839 » if (rv != SECSuccess) { |
| 3840 » ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
| 3841 » return rv; |
| 3842 » } |
3596 } | 3843 } |
3597 return rv; | 3844 return rv; |
3598 } | 3845 } |
3599 | 3846 |
3600 /************************************************************************** | 3847 /************************************************************************** |
3601 * Append Handshake functions. | 3848 * Append Handshake functions. |
3602 * All these functions set appropriate error codes. | 3849 * All these functions set appropriate error codes. |
3603 * Most rely on ssl3_AppendHandshake to set the error code. | 3850 * Most rely on ssl3_AppendHandshake to set the error code. |
3604 **************************************************************************/ | 3851 **************************************************************************/ |
3605 SECStatus | 3852 SECStatus |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3737 /* Fragment length -- set to the packet length because not fragmented */ | 3984 /* Fragment length -- set to the packet length because not fragmented */ |
3738 rv = ssl3_AppendHandshakeNumber(ss, length, 3); | 3985 rv = ssl3_AppendHandshakeNumber(ss, length, 3); |
3739 if (rv != SECSuccess) { | 3986 if (rv != SECSuccess) { |
3740 return rv; /* error code set by AppendHandshake, if applicable. */ | 3987 return rv; /* error code set by AppendHandshake, if applicable. */ |
3741 } | 3988 } |
3742 } | 3989 } |
3743 | 3990 |
3744 return rv; /* error code set by AppendHandshake, if applicable. */ | 3991 return rv; /* error code set by AppendHandshake, if applicable. */ |
3745 } | 3992 } |
3746 | 3993 |
| 3994 /* ssl3_AppendSignatureAndHashAlgorithm appends the serialisation of |
| 3995 * |sigAndHash| to the current handshake message. */ |
| 3996 SECStatus |
| 3997 ssl3_AppendSignatureAndHashAlgorithm( |
| 3998 sslSocket *ss, const SSL3SignatureAndHashAlgorithm* sigAndHash) |
| 3999 { |
| 4000 unsigned char serialized[2]; |
| 4001 |
| 4002 serialized[0] = ssl3_OIDToTLSHashFunction(sigAndHash->hashAlg); |
| 4003 if (serialized[0] == 0) { |
| 4004 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 4005 return SECFailure; |
| 4006 } |
| 4007 |
| 4008 serialized[1] = sigAndHash->sigAlg; |
| 4009 |
| 4010 return ssl3_AppendHandshake(ss, serialized, sizeof(serialized)); |
| 4011 } |
| 4012 |
3747 /************************************************************************** | 4013 /************************************************************************** |
3748 * Consume Handshake functions. | 4014 * Consume Handshake functions. |
3749 * | 4015 * |
3750 * All data used in these functions is protected by two locks, | 4016 * All data used in these functions is protected by two locks, |
3751 * the RecvBufLock and the SSL3HandshakeLock | 4017 * the RecvBufLock and the SSL3HandshakeLock |
3752 **************************************************************************/ | 4018 **************************************************************************/ |
3753 | 4019 |
3754 /* Read up the next "bytes" number of bytes from the (decrypted) input | 4020 /* Read up the next "bytes" number of bytes from the (decrypted) input |
3755 * stream "b" (which is *length bytes long). Copy them into buffer "v". | 4021 * stream "b" (which is *length bytes long). Copy them into buffer "v". |
3756 * Reduces *length by bytes. Advances *b by bytes. | 4022 * Reduces *length by bytes. Advances *b by bytes. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3843 return ssl3_DecodeError(ss); | 4109 return ssl3_DecodeError(ss); |
3844 } | 4110 } |
3845 i->data = *b; | 4111 i->data = *b; |
3846 i->len = count; | 4112 i->len = count; |
3847 *b += count; | 4113 *b += count; |
3848 *length -= count; | 4114 *length -= count; |
3849 } | 4115 } |
3850 return SECSuccess; | 4116 return SECSuccess; |
3851 } | 4117 } |
3852 | 4118 |
| 4119 /* tls12HashOIDMap contains the mapping between TLS hash identifiers and the |
| 4120 * SECOidTag used internally by NSS. */ |
| 4121 static const struct { |
| 4122 int tlsHash; |
| 4123 SECOidTag oid; |
| 4124 } tls12HashOIDMap[] = { |
| 4125 { tls_hash_md5, SEC_OID_MD5 }, |
| 4126 { tls_hash_sha1, SEC_OID_SHA1 }, |
| 4127 { tls_hash_sha224, SEC_OID_SHA224 }, |
| 4128 { tls_hash_sha256, SEC_OID_SHA256 }, |
| 4129 { tls_hash_sha384, SEC_OID_SHA384 }, |
| 4130 { tls_hash_sha512, SEC_OID_SHA512 } |
| 4131 }; |
| 4132 |
| 4133 /* ssl3_TLSHashFunctionToOID converts a TLS hash identifier into an OID value. |
| 4134 * If the hash is not recognised, SEC_OID_UNKNOWN is returned. |
| 4135 * |
| 4136 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ |
| 4137 SECOidTag ssl3_TLSHashFunctionToOID(int hashFunc) |
| 4138 { |
| 4139 size_t i; |
| 4140 |
| 4141 for (i = 0; i < sizeof(tls12HashOIDMap) / sizeof(tls12HashOIDMap[0]); i++) { |
| 4142 if (hashFunc == tls12HashOIDMap[i].tlsHash) { |
| 4143 return tls12HashOIDMap[i].oid; |
| 4144 } |
| 4145 } |
| 4146 return SEC_OID_UNKNOWN; |
| 4147 } |
| 4148 |
| 4149 /* ssl3_OIDToTLSHashFunction converts an OID to a TLS hash function identifier. |
| 4150 * If the hash is not recognised, zero is returned. |
| 4151 * |
| 4152 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ |
| 4153 int ssl3_OIDToTLSHashFunction(SECOidTag oid) |
| 4154 { |
| 4155 size_t i; |
| 4156 |
| 4157 for (i = 0; i < sizeof(tls12HashOIDMap) / sizeof(tls12HashOIDMap[0]); i++) { |
| 4158 if (oid == tls12HashOIDMap[i].oid) { |
| 4159 return tls12HashOIDMap[i].tlsHash; |
| 4160 } |
| 4161 } |
| 4162 return 0; |
| 4163 } |
| 4164 |
| 4165 /* ssl3_TLSSignatureAlgorithmForKeyType returns the TLS signature algorithm |
| 4166 * identifier for a given KeyType. */ |
| 4167 static SECStatus ssl3_TLSSignatureAlgorithmForKeyType( |
| 4168 KeyType keyType, TLS12SignatureAlgorithm *out) |
| 4169 { |
| 4170 switch (keyType) { |
| 4171 case rsaKey: |
| 4172 *out = tls_sig_rsa; |
| 4173 return SECSuccess; |
| 4174 case dsaKey: |
| 4175 *out = tls_sig_dsa; |
| 4176 return SECSuccess; |
| 4177 case ecKey: |
| 4178 *out = tls_sig_ecdsa; |
| 4179 return SECSuccess; |
| 4180 } |
| 4181 PORT_SetError(SEC_ERROR_INVALID_KEY); |
| 4182 return SECFailure; |
| 4183 } |
| 4184 |
| 4185 /* ssl3_TLSSignatureAlgorithmForKey returns the TLS 1.2 signature algorithm |
| 4186 * identifier for the given private key. */ |
| 4187 static SECStatus ssl3_TLSSignatureAlgorithmForPrivateKey( |
| 4188 SECKEYPrivateKey *key, TLS12SignatureAlgorithm *out) |
| 4189 { |
| 4190 return ssl3_TLSSignatureAlgorithmForKeyType(key->keyType, out); |
| 4191 } |
| 4192 |
| 4193 /* ssl3_TLSSignatureAlgorithmForCert returns the TLS 1.2 signature algorithm |
| 4194 * identifier for the given certificate. */ |
| 4195 static SECStatus ssl3_TLSSignatureAlgorithmForCertificate( |
| 4196 CERTCertificate *cert, TLS12SignatureAlgorithm *out) |
| 4197 { |
| 4198 SECKEYPublicKey *key; |
| 4199 |
| 4200 key = CERT_ExtractPublicKey(cert); |
| 4201 if (key == NULL) { |
| 4202 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); |
| 4203 return SECFailure; |
| 4204 } |
| 4205 |
| 4206 return ssl3_TLSSignatureAlgorithmForKeyType(key->keyType, out); |
| 4207 } |
| 4208 |
| 4209 /* ssl3_CheckSignatureAndHashAlgorithmConsistency checks that the signature |
| 4210 * algorithm identifier in |sigAndHash| is consistent with the public key in |
| 4211 * |cert|. If so, SECSuccess is returned. Otherwise, PORT_SetError is called |
| 4212 * and SECFailure is returned. */ |
| 4213 SECStatus ssl3_CheckSignatureAndHashAlgorithmConsistency( |
| 4214 const SSL3SignatureAndHashAlgorithm *sigAndHash, CERTCertificate* cert) |
| 4215 { |
| 4216 SECStatus rv; |
| 4217 TLS12SignatureAlgorithm sigAlg; |
| 4218 |
| 4219 rv = ssl3_TLSSignatureAlgorithmForCertificate(cert, &sigAlg); |
| 4220 if (rv != SECSuccess) { |
| 4221 return SECFailure; |
| 4222 } |
| 4223 if (sigAlg != sigAndHash->sigAlg) { |
| 4224 PORT_SetError(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM); |
| 4225 return SECFailure; |
| 4226 } |
| 4227 return SECSuccess; |
| 4228 } |
| 4229 |
| 4230 /* ssl3_ConsumeSignatureAndHashAlgorithm reads a SignatureAndHashAlgorithm |
| 4231 * structure from |b| and puts the resulting value into |out|. |b| and |length| |
| 4232 * are updated accordingly. |
| 4233 * |
| 4234 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ |
| 4235 SECStatus |
| 4236 ssl3_ConsumeSignatureAndHashAlgorithm(sslSocket *ss, |
| 4237 SSL3Opaque **b, |
| 4238 PRUint32 *length, |
| 4239 SSL3SignatureAndHashAlgorithm *out) { |
| 4240 unsigned char bytes[2]; |
| 4241 SECStatus rv; |
| 4242 |
| 4243 rv = ssl3_ConsumeHandshake(ss, bytes, sizeof(bytes), b, length); |
| 4244 if (rv != SECSuccess) { |
| 4245 return rv; |
| 4246 } |
| 4247 |
| 4248 out->hashAlg = ssl3_TLSHashFunctionToOID(bytes[0]); |
| 4249 if (out->hashAlg == SEC_OID_UNKNOWN) { |
| 4250 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 4251 return SECFailure; |
| 4252 } |
| 4253 |
| 4254 out->sigAlg = bytes[1]; |
| 4255 return SECSuccess; |
| 4256 } |
| 4257 |
3853 /************************************************************************** | 4258 /************************************************************************** |
3854 * end of Consume Handshake functions. | 4259 * end of Consume Handshake functions. |
3855 **************************************************************************/ | 4260 **************************************************************************/ |
3856 | 4261 |
3857 /* Extract the hashes of handshake messages to this point. | 4262 /* Extract the hashes of handshake messages to this point. |
3858 * Called from ssl3_SendCertificateVerify | 4263 * Called from ssl3_SendCertificateVerify |
3859 * ssl3_SendFinished | 4264 * ssl3_SendFinished |
3860 * ssl3_HandleHandshakeMessage | 4265 * ssl3_HandleHandshakeMessage |
3861 * | 4266 * |
3862 * Caller must hold the SSL3HandshakeLock. | 4267 * Caller must hold the SSL3HandshakeLock. |
3863 * Caller must hold a read or write lock on the Spec R/W lock. | 4268 * Caller must hold a read or write lock on the Spec R/W lock. |
3864 * (There is presently no way to assert on a Read lock.) | 4269 * (There is presently no way to assert on a Read lock.) |
3865 */ | 4270 */ |
3866 static SECStatus | 4271 static SECStatus |
3867 ssl3_ComputeHandshakeHashes(sslSocket * ss, | 4272 ssl3_ComputeHandshakeHashes(sslSocket * ss, |
3868 ssl3CipherSpec *spec, /* uses ->master_secret */ | 4273 ssl3CipherSpec *spec, /* uses ->master_secret */ |
3869 SSL3Hashes * hashes, /* output goes here. */ | 4274 SSL3Hashes * hashes, /* output goes here. */ |
3870 PRUint32 sender) | 4275 PRUint32 sender) |
3871 { | 4276 { |
3872 SECStatus rv = SECSuccess; | 4277 SECStatus rv = SECSuccess; |
3873 PRBool isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); | 4278 PRBool isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); |
3874 unsigned int outLength; | 4279 unsigned int outLength; |
3875 SSL3Opaque md5_inner[MAX_MAC_LENGTH]; | 4280 SSL3Opaque md5_inner[MAX_MAC_LENGTH]; |
3876 SSL3Opaque sha_inner[MAX_MAC_LENGTH]; | 4281 SSL3Opaque sha_inner[MAX_MAC_LENGTH]; |
3877 | 4282 |
3878 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 4283 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
| 4284 hashes->hashAlg = SEC_OID_UNKNOWN; |
3879 | 4285 |
3880 #ifndef NO_PKCS11_BYPASS | 4286 #ifndef NO_PKCS11_BYPASS |
3881 if (ss->opt.bypassPKCS11) { | 4287 if (ss->opt.bypassPKCS11) { |
3882 /* compute them without PKCS11 */ | 4288 /* compute them without PKCS11 */ |
3883 PRUint64 md5_cx[MAX_MAC_CONTEXT_LLONGS]; | 4289 PRUint64 md5_cx[MAX_MAC_CONTEXT_LLONGS]; |
3884 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; | 4290 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; |
3885 | 4291 |
3886 #define md5cx ((MD5Context *)md5_cx) | 4292 #define md5cx ((MD5Context *)md5_cx) |
3887 #define shacx ((SHA1Context *)sha_cx) | 4293 #define shacx ((SHA1Context *)sha_cx) |
3888 | 4294 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3932 PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength)); | 4338 PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength)); |
3933 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, | 4339 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, |
3934 mac_defs[mac_md5].pad_size)); | 4340 mac_defs[mac_md5].pad_size)); |
3935 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH))
; | 4341 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH))
; |
3936 | 4342 |
3937 MD5_Begin(md5cx); | 4343 MD5_Begin(md5cx); |
3938 MD5_Update(md5cx, spec->msItem.data, spec->msItem.len); | 4344 MD5_Update(md5cx, spec->msItem.data, spec->msItem.len); |
3939 MD5_Update(md5cx, mac_pad_2, mac_defs[mac_md5].pad_size); | 4345 MD5_Update(md5cx, mac_pad_2, mac_defs[mac_md5].pad_size); |
3940 MD5_Update(md5cx, md5_inner, MD5_LENGTH); | 4346 MD5_Update(md5cx, md5_inner, MD5_LENGTH); |
3941 } | 4347 } |
3942 » MD5_End(md5cx, hashes->md5, &outLength, MD5_LENGTH); | 4348 » MD5_End(md5cx, hashes->u.s.md5, &outLength, MD5_LENGTH); |
3943 | 4349 |
3944 » PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->md5, MD5_LENGTH)); | 4350 » PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->u.s.md5, MD5_LENGTH)); |
3945 | 4351 |
3946 if (!isTLS) { | 4352 if (!isTLS) { |
3947 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, | 4353 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, |
3948 mac_defs[mac_sha].pad_size)); | 4354 mac_defs[mac_sha].pad_size)); |
3949 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)
); | 4355 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)
); |
3950 | 4356 |
3951 SHA1_Begin(shacx); | 4357 SHA1_Begin(shacx); |
3952 SHA1_Update(shacx, spec->msItem.data, spec->msItem.len); | 4358 SHA1_Update(shacx, spec->msItem.data, spec->msItem.len); |
3953 SHA1_Update(shacx, mac_pad_2, mac_defs[mac_sha].pad_size); | 4359 SHA1_Update(shacx, mac_pad_2, mac_defs[mac_sha].pad_size); |
3954 SHA1_Update(shacx, sha_inner, SHA1_LENGTH); | 4360 SHA1_Update(shacx, sha_inner, SHA1_LENGTH); |
3955 } | 4361 } |
3956 » SHA1_End(shacx, hashes->sha, &outLength, SHA1_LENGTH); | 4362 » SHA1_End(shacx, hashes->u.s.sha, &outLength, SHA1_LENGTH); |
3957 | 4363 |
3958 » PRINT_BUF(60, (NULL, "SHA outer: result", hashes->sha, SHA1_LENGTH)); | 4364 » PRINT_BUF(60, (NULL, "SHA outer: result", hashes->u.s.sha, SHA1_LENGTH))
; |
3959 | 4365 |
| 4366 hashes->len = MD5_LENGTH + SHA1_LENGTH; |
3960 rv = SECSuccess; | 4367 rv = SECSuccess; |
3961 #undef md5cx | 4368 #undef md5cx |
3962 #undef shacx | 4369 #undef shacx |
3963 } else | 4370 } else |
3964 #endif | 4371 #endif |
3965 { | 4372 if (ss->ssl3.hs.tls12_handshake_hash) { |
| 4373 » PK11Context *h; |
| 4374 » unsigned int stateLen; |
| 4375 » unsigned char stackBuf[1024]; |
| 4376 » unsigned char *stateBuf = NULL; |
| 4377 |
| 4378 » if (!spec->master_secret) { |
| 4379 » PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); |
| 4380 » return SECFailure; |
| 4381 » } |
| 4382 |
| 4383 » h = ss->ssl3.hs.tls12_handshake_hash; |
| 4384 » stateBuf = PK11_SaveContextAlloc(h, stackBuf, |
| 4385 » » » » » sizeof(stackBuf), &stateLen); |
| 4386 » if (stateBuf == NULL) { |
| 4387 » ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); |
| 4388 » goto tls12Loser; |
| 4389 » } |
| 4390 » rv |= PK11_DigestFinal(h, hashes->u.raw, &hashes->len, |
| 4391 » » » sizeof(hashes->u.raw)); |
| 4392 » if (rv != SECSuccess) { |
| 4393 » ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); |
| 4394 » rv = SECFailure; |
| 4395 » goto tls12Loser; |
| 4396 » } |
| 4397 » /* If we ever support ciphersuites where the PRF hash isn't SHA-256 |
| 4398 » * then this will need to be updated. */ |
| 4399 » hashes->hashAlg = SEC_OID_SHA256; |
| 4400 » rv = SECSuccess; |
| 4401 |
| 4402 tls12Loser: |
| 4403 » if (stateBuf) { |
| 4404 » if (PK11_RestoreContext(ss->ssl3.hs.tls12_handshake_hash, stateBuf, |
| 4405 » » » » stateLen) != SECSuccess) { |
| 4406 » » ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); |
| 4407 » » rv = SECFailure; |
| 4408 » } |
| 4409 » if (stateBuf != stackBuf) { |
| 4410 » » PORT_ZFree(stateBuf, stateLen); |
| 4411 » } |
| 4412 » } |
| 4413 } else { |
3966 /* compute hases with PKCS11 */ | 4414 /* compute hases with PKCS11 */ |
3967 PK11Context * md5; | 4415 PK11Context * md5; |
3968 PK11Context * sha = NULL; | 4416 PK11Context * sha = NULL; |
3969 unsigned char *md5StateBuf = NULL; | 4417 unsigned char *md5StateBuf = NULL; |
3970 unsigned char *shaStateBuf = NULL; | 4418 unsigned char *shaStateBuf = NULL; |
3971 unsigned int md5StateLen, shaStateLen; | 4419 unsigned int md5StateLen, shaStateLen; |
3972 unsigned char md5StackBuf[256]; | 4420 unsigned char md5StackBuf[256]; |
3973 unsigned char shaStackBuf[512]; | 4421 unsigned char shaStackBuf[512]; |
3974 | 4422 |
3975 if (!spec->master_secret) { | 4423 if (!spec->master_secret) { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4044 | 4492 |
4045 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, | 4493 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, |
4046 mac_defs[mac_md5].pad_size)); | 4494 mac_defs[mac_md5].pad_size)); |
4047 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH))
; | 4495 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH))
; |
4048 | 4496 |
4049 rv |= PK11_DigestBegin(md5); | 4497 rv |= PK11_DigestBegin(md5); |
4050 rv |= PK11_DigestKey(md5, spec->master_secret); | 4498 rv |= PK11_DigestKey(md5, spec->master_secret); |
4051 rv |= PK11_DigestOp(md5, mac_pad_2, mac_defs[mac_md5].pad_size); | 4499 rv |= PK11_DigestOp(md5, mac_pad_2, mac_defs[mac_md5].pad_size); |
4052 rv |= PK11_DigestOp(md5, md5_inner, MD5_LENGTH); | 4500 rv |= PK11_DigestOp(md5, md5_inner, MD5_LENGTH); |
4053 } | 4501 } |
4054 » rv |= PK11_DigestFinal(md5, hashes->md5, &outLength, MD5_LENGTH); | 4502 » rv |= PK11_DigestFinal(md5, hashes->u.s.md5, &outLength, MD5_LENGTH); |
4055 PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH); | 4503 PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH); |
4056 if (rv != SECSuccess) { | 4504 if (rv != SECSuccess) { |
4057 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 4505 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
4058 rv = SECFailure; | 4506 rv = SECFailure; |
4059 goto loser; | 4507 goto loser; |
4060 } | 4508 } |
4061 | 4509 |
4062 » PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->md5, MD5_LENGTH)); | 4510 » PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->u.s.md5, MD5_LENGTH)); |
4063 | 4511 |
4064 if (!isTLS) { | 4512 if (!isTLS) { |
4065 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, | 4513 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, |
4066 mac_defs[mac_sha].pad_size)); | 4514 mac_defs[mac_sha].pad_size)); |
4067 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)
); | 4515 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)
); |
4068 | 4516 |
4069 rv |= PK11_DigestBegin(sha); | 4517 rv |= PK11_DigestBegin(sha); |
4070 rv |= PK11_DigestKey(sha,spec->master_secret); | 4518 rv |= PK11_DigestKey(sha,spec->master_secret); |
4071 rv |= PK11_DigestOp(sha, mac_pad_2, mac_defs[mac_sha].pad_size); | 4519 rv |= PK11_DigestOp(sha, mac_pad_2, mac_defs[mac_sha].pad_size); |
4072 rv |= PK11_DigestOp(sha, sha_inner, SHA1_LENGTH); | 4520 rv |= PK11_DigestOp(sha, sha_inner, SHA1_LENGTH); |
4073 } | 4521 } |
4074 » rv |= PK11_DigestFinal(sha, hashes->sha, &outLength, SHA1_LENGTH); | 4522 » rv |= PK11_DigestFinal(sha, hashes->u.s.sha, &outLength, SHA1_LENGTH); |
4075 PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH); | 4523 PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH); |
4076 if (rv != SECSuccess) { | 4524 if (rv != SECSuccess) { |
4077 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | 4525 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); |
4078 rv = SECFailure; | 4526 rv = SECFailure; |
4079 goto loser; | 4527 goto loser; |
4080 } | 4528 } |
4081 | 4529 |
4082 » PRINT_BUF(60, (NULL, "SHA outer: result", hashes->sha, SHA1_LENGTH)); | 4530 » PRINT_BUF(60, (NULL, "SHA outer: result", hashes->u.s.sha, SHA1_LENGTH))
; |
4083 | 4531 |
| 4532 hashes->len = MD5_LENGTH + SHA1_LENGTH; |
4084 rv = SECSuccess; | 4533 rv = SECSuccess; |
4085 | 4534 |
4086 loser: | 4535 loser: |
4087 if (md5StateBuf) { | 4536 if (md5StateBuf) { |
4088 if (PK11_RestoreContext(ss->ssl3.hs.md5, md5StateBuf, md5StateLen) | 4537 if (PK11_RestoreContext(ss->ssl3.hs.md5, md5StateBuf, md5StateLen) |
4089 != SECSuccess) | 4538 != SECSuccess) |
4090 { | 4539 { |
4091 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | 4540 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); |
4092 rv = SECFailure; | 4541 rv = SECFailure; |
4093 } | 4542 } |
(...skipping 1242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5336 SECKEY_DestroyPublicKey(serverKey); | 5785 SECKEY_DestroyPublicKey(serverKey); |
5337 return rv; /* err code already set. */ | 5786 return rv; /* err code already set. */ |
5338 } | 5787 } |
5339 | 5788 |
5340 /* Called from ssl3_HandleServerHelloDone(). */ | 5789 /* Called from ssl3_HandleServerHelloDone(). */ |
5341 static SECStatus | 5790 static SECStatus |
5342 ssl3_SendCertificateVerify(sslSocket *ss) | 5791 ssl3_SendCertificateVerify(sslSocket *ss) |
5343 { | 5792 { |
5344 SECStatus rv = SECFailure; | 5793 SECStatus rv = SECFailure; |
5345 PRBool isTLS; | 5794 PRBool isTLS; |
| 5795 PRBool isTLS12; |
5346 SECItem buf = {siBuffer, NULL, 0}; | 5796 SECItem buf = {siBuffer, NULL, 0}; |
5347 SSL3Hashes hashes; | 5797 SSL3Hashes hashes; |
| 5798 unsigned int len; |
| 5799 SSL3SignatureAndHashAlgorithm sigAndHash; |
5348 | 5800 |
5349 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | 5801 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); |
5350 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 5802 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
5351 | 5803 |
5352 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake", | 5804 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake", |
5353 SSL_GETPID(), ss->fd)); | 5805 SSL_GETPID(), ss->fd)); |
5354 | 5806 |
5355 ssl_GetSpecReadLock(ss); | 5807 ssl_GetSpecReadLock(ss); |
5356 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); | 5808 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); |
5357 ssl_ReleaseSpecReadLock(ss); | 5809 ssl_ReleaseSpecReadLock(ss); |
5358 if (rv != SECSuccess) { | 5810 if (rv != SECSuccess) { |
5359 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ | 5811 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ |
5360 } | 5812 } |
5361 | 5813 |
5362 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | 5814 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); |
| 5815 isTLS12 = (PRBool)(ss->version >= SSL_LIBRARY_VERSION_TLS_1_2); |
5363 if (ss->ssl3.platformClientKey) { | 5816 if (ss->ssl3.platformClientKey) { |
5364 #ifdef NSS_PLATFORM_CLIENT_AUTH | 5817 #ifdef NSS_PLATFORM_CLIENT_AUTH |
5365 rv = ssl3_PlatformSignHashes( | 5818 rv = ssl3_PlatformSignHashes( |
5366 &hashes, ss->ssl3.platformClientKey, &buf, isTLS, | 5819 &hashes, ss->ssl3.platformClientKey, &buf, isTLS, |
5367 CERT_GetCertKeyType( | 5820 CERT_GetCertKeyType( |
5368 &ss->ssl3.clientCertificate->subjectPublicKeyInfo)); | 5821 &ss->ssl3.clientCertificate->subjectPublicKeyInfo)); |
5369 ssl_FreePlatformKey(ss->ssl3.platformClientKey); | 5822 ssl_FreePlatformKey(ss->ssl3.platformClientKey); |
5370 ss->ssl3.platformClientKey = (PlatformKey)NULL; | 5823 ss->ssl3.platformClientKey = (PlatformKey)NULL; |
5371 #endif /* NSS_PLATFORM_CLIENT_AUTH */ | 5824 #endif /* NSS_PLATFORM_CLIENT_AUTH */ |
5372 } else { | 5825 } else { |
5373 rv = ssl3_SignHashes(&hashes, ss->ssl3.clientPrivateKey, &buf, isTLS); | 5826 rv = ssl3_SignHashes(&hashes, ss->ssl3.clientPrivateKey, &buf, isTLS); |
5374 if (rv == SECSuccess) { | 5827 if (rv == SECSuccess) { |
5375 PK11SlotInfo * slot; | 5828 PK11SlotInfo * slot; |
5376 sslSessionID * sid = ss->sec.ci.sid; | 5829 sslSessionID * sid = ss->sec.ci.sid; |
5377 | 5830 |
5378 /* Remember the info about the slot that did the signing. | 5831 /* Remember the info about the slot that did the signing. |
5379 ** Later, when doing an SSL restart handshake, verify this. | 5832 ** Later, when doing an SSL restart handshake, verify this. |
5380 ** These calls are mere accessors, and can't fail. | 5833 ** These calls are mere accessors, and can't fail. |
5381 */ | 5834 */ |
5382 slot = PK11_GetSlotFromPrivateKey(ss->ssl3.clientPrivateKey); | 5835 slot = PK11_GetSlotFromPrivateKey(ss->ssl3.clientPrivateKey); |
5383 sid->u.ssl3.clAuthSeries = PK11_GetSlotSeries(slot); | 5836 sid->u.ssl3.clAuthSeries = PK11_GetSlotSeries(slot); |
5384 sid->u.ssl3.clAuthSlotID = PK11_GetSlotID(slot); | 5837 sid->u.ssl3.clAuthSlotID = PK11_GetSlotID(slot); |
5385 sid->u.ssl3.clAuthModuleID = PK11_GetModuleID(slot); | 5838 sid->u.ssl3.clAuthModuleID = PK11_GetModuleID(slot); |
5386 sid->u.ssl3.clAuthValid = PR_TRUE; | 5839 sid->u.ssl3.clAuthValid = PR_TRUE; |
5387 PK11_FreeSlot(slot); | 5840 PK11_FreeSlot(slot); |
| 5841 |
| 5842 if (isTLS12) { |
| 5843 rv = ssl3_TLSSignatureAlgorithmForPrivateKey( |
| 5844 ss->ssl3.clientPrivateKey, &sigAndHash.sigAlg); |
| 5845 } |
5388 } | 5846 } |
5389 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | 5847 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); |
5390 ss->ssl3.clientPrivateKey = NULL; | 5848 ss->ssl3.clientPrivateKey = NULL; |
5391 } | 5849 } |
5392 if (rv != SECSuccess) { | 5850 if (rv != SECSuccess) { |
5393 goto done; /* err code was set by ssl3_SignHashes */ | 5851 goto done; /* err code was set by ssl3_SignHashes */ |
5394 } | 5852 } |
5395 | 5853 |
5396 rv = ssl3_AppendHandshakeHeader(ss, certificate_verify, buf.len + 2); | 5854 len = buf.len + 2 + (isTLS12 ? 2 : 0); |
| 5855 |
| 5856 rv = ssl3_AppendHandshakeHeader(ss, certificate_verify, len); |
5397 if (rv != SECSuccess) { | 5857 if (rv != SECSuccess) { |
5398 goto done; /* error code set by AppendHandshake */ | 5858 goto done; /* error code set by AppendHandshake */ |
5399 } | 5859 } |
| 5860 if (isTLS12) { |
| 5861 /* We always sign using the handshake hash function. It's possible that |
| 5862 * a server could support SHA-256 as the handshake hash but not as a |
| 5863 * signature hash. In that case we wouldn't be able to do client |
| 5864 * certificates with it. The alternative is to buffer all handshake |
| 5865 * messages. */ |
| 5866 sigAndHash.hashAlg = hashes.hashAlg; |
| 5867 |
| 5868 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); |
| 5869 if (rv != SECSuccess) { |
| 5870 goto done; /* err set by AppendHandshake. */ |
| 5871 } |
| 5872 } |
5400 rv = ssl3_AppendHandshakeVariable(ss, buf.data, buf.len, 2); | 5873 rv = ssl3_AppendHandshakeVariable(ss, buf.data, buf.len, 2); |
5401 if (rv != SECSuccess) { | 5874 if (rv != SECSuccess) { |
5402 goto done; /* error code set by AppendHandshake */ | 5875 goto done; /* error code set by AppendHandshake */ |
5403 } | 5876 } |
5404 | 5877 |
5405 done: | 5878 done: |
5406 if (buf.data) | 5879 if (buf.data) |
5407 PORT_Free(buf.data); | 5880 PORT_Free(buf.data); |
5408 return rv; | 5881 return rv; |
5409 } | 5882 } |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5497 | 5970 |
5498 rv = ssl3_NegotiateVersion(ss, version, PR_FALSE); | 5971 rv = ssl3_NegotiateVersion(ss, version, PR_FALSE); |
5499 if (rv != SECSuccess) { | 5972 if (rv != SECSuccess) { |
5500 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version | 5973 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version |
5501 : handshake_failure; | 5974 : handshake_failure; |
5502 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | 5975 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; |
5503 goto alert_loser; | 5976 goto alert_loser; |
5504 } | 5977 } |
5505 isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0); | 5978 isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0); |
5506 | 5979 |
| 5980 rv = ssl3_InitTLS12HandshakeHash(ss); |
| 5981 if (rv != SECSuccess) { |
| 5982 desc = internal_error; |
| 5983 goto alert_loser; |
| 5984 } |
| 5985 |
5507 rv = ssl3_ConsumeHandshake( | 5986 rv = ssl3_ConsumeHandshake( |
5508 ss, &ss->ssl3.hs.server_random, SSL3_RANDOM_LENGTH, &b, &length); | 5987 ss, &ss->ssl3.hs.server_random, SSL3_RANDOM_LENGTH, &b, &length); |
5509 if (rv != SECSuccess) { | 5988 if (rv != SECSuccess) { |
5510 goto loser; /* alert has been sent */ | 5989 goto loser; /* alert has been sent */ |
5511 } | 5990 } |
5512 | 5991 |
5513 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); | 5992 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); |
5514 if (rv != SECSuccess) { | 5993 if (rv != SECSuccess) { |
5515 goto loser; /* alert has been sent */ | 5994 goto loser; /* alert has been sent */ |
5516 } | 5995 } |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5833 ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | 6312 ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) |
5834 { | 6313 { |
5835 PRArenaPool * arena = NULL; | 6314 PRArenaPool * arena = NULL; |
5836 SECKEYPublicKey *peerKey = NULL; | 6315 SECKEYPublicKey *peerKey = NULL; |
5837 PRBool isTLS; | 6316 PRBool isTLS; |
5838 SECStatus rv; | 6317 SECStatus rv; |
5839 int errCode = SSL_ERROR_RX_MALFORMED_SERVER_KEY_EXCH; | 6318 int errCode = SSL_ERROR_RX_MALFORMED_SERVER_KEY_EXCH; |
5840 SSL3AlertDescription desc = illegal_parameter; | 6319 SSL3AlertDescription desc = illegal_parameter; |
5841 SSL3Hashes hashes; | 6320 SSL3Hashes hashes; |
5842 SECItem signature = {siBuffer, NULL, 0}; | 6321 SECItem signature = {siBuffer, NULL, 0}; |
| 6322 SSL3SignatureAndHashAlgorithm sigAndHash; |
| 6323 |
| 6324 sigAndHash.hashAlg = SEC_OID_UNKNOWN; |
5843 | 6325 |
5844 SSL_TRC(3, ("%d: SSL3[%d]: handle server_key_exchange handshake", | 6326 SSL_TRC(3, ("%d: SSL3[%d]: handle server_key_exchange handshake", |
5845 SSL_GETPID(), ss->fd)); | 6327 SSL_GETPID(), ss->fd)); |
5846 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); | 6328 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
5847 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 6329 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
5848 | 6330 |
5849 if (ss->ssl3.hs.ws != wait_server_key && | 6331 if (ss->ssl3.hs.ws != wait_server_key && |
5850 ss->ssl3.hs.ws != wait_server_cert) { | 6332 ss->ssl3.hs.ws != wait_server_cert) { |
5851 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH; | 6333 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH; |
5852 desc = unexpected_message; | 6334 desc = unexpected_message; |
(...skipping 14 matching lines...) Expand all Loading... |
5867 SECItem exponent = {siBuffer, NULL, 0}; | 6349 SECItem exponent = {siBuffer, NULL, 0}; |
5868 | 6350 |
5869 rv = ssl3_ConsumeHandshakeVariable(ss, &modulus, 2, &b, &length); | 6351 rv = ssl3_ConsumeHandshakeVariable(ss, &modulus, 2, &b, &length); |
5870 if (rv != SECSuccess) { | 6352 if (rv != SECSuccess) { |
5871 goto loser; /* malformed. */ | 6353 goto loser; /* malformed. */ |
5872 } | 6354 } |
5873 rv = ssl3_ConsumeHandshakeVariable(ss, &exponent, 2, &b, &length); | 6355 rv = ssl3_ConsumeHandshakeVariable(ss, &exponent, 2, &b, &length); |
5874 if (rv != SECSuccess) { | 6356 if (rv != SECSuccess) { |
5875 goto loser; /* malformed. */ | 6357 goto loser; /* malformed. */ |
5876 } | 6358 } |
| 6359 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { |
| 6360 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, &sigAndH
ash); |
| 6361 if (rv != SECSuccess) { |
| 6362 goto loser; /* malformed or unsupported. */ |
| 6363 } |
| 6364 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( |
| 6365 &sigAndHash, ss->sec.peerCert); |
| 6366 if (rv != SECSuccess) { |
| 6367 goto loser; |
| 6368 } |
| 6369 } |
5877 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); | 6370 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); |
5878 if (rv != SECSuccess) { | 6371 if (rv != SECSuccess) { |
5879 goto loser; /* malformed. */ | 6372 goto loser; /* malformed. */ |
5880 } | 6373 } |
5881 if (length != 0) { | 6374 if (length != 0) { |
5882 if (isTLS) | 6375 if (isTLS) |
5883 desc = decode_error; | 6376 desc = decode_error; |
5884 goto alert_loser; /* malformed. */ | 6377 goto alert_loser; /* malformed. */ |
5885 } | 6378 } |
5886 | 6379 |
5887 /* failures after this point are not malformed handshakes. */ | 6380 /* failures after this point are not malformed handshakes. */ |
5888 /* TLS: send decrypt_error if signature failed. */ | 6381 /* TLS: send decrypt_error if signature failed. */ |
5889 desc = isTLS ? decrypt_error : handshake_failure; | 6382 desc = isTLS ? decrypt_error : handshake_failure; |
5890 | 6383 |
5891 /* | 6384 /* |
5892 * check to make sure the hash is signed by right guy | 6385 * check to make sure the hash is signed by right guy |
5893 */ | 6386 */ |
5894 » rv = ssl3_ComputeExportRSAKeyHash(modulus, exponent, | 6387 » rv = ssl3_ComputeExportRSAKeyHash(sigAndHash.hashAlg, modulus, exponent, |
5895 &ss->ssl3.hs.client_random, | 6388 &ss->ssl3.hs.client_random, |
5896 &ss->ssl3.hs.server_random, | 6389 &ss->ssl3.hs.server_random, |
5897 &hashes, ss->opt.bypassPKCS11); | 6390 &hashes, ss->opt.bypassPKCS11); |
5898 if (rv != SECSuccess) { | 6391 if (rv != SECSuccess) { |
5899 errCode = | 6392 errCode = |
5900 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | 6393 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); |
5901 goto alert_loser; | 6394 goto alert_loser; |
5902 } | 6395 } |
5903 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, | 6396 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, |
5904 isTLS, ss->pkcs11PinArg); | 6397 isTLS, ss->pkcs11PinArg); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5957 goto loser; /* malformed. */ | 6450 goto loser; /* malformed. */ |
5958 } | 6451 } |
5959 if (dh_g.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_g)) | 6452 if (dh_g.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_g)) |
5960 goto alert_loser; | 6453 goto alert_loser; |
5961 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_Ys, 2, &b, &length); | 6454 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_Ys, 2, &b, &length); |
5962 if (rv != SECSuccess) { | 6455 if (rv != SECSuccess) { |
5963 goto loser; /* malformed. */ | 6456 goto loser; /* malformed. */ |
5964 } | 6457 } |
5965 if (dh_Ys.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_Ys)) | 6458 if (dh_Ys.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_Ys)) |
5966 goto alert_loser; | 6459 goto alert_loser; |
| 6460 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { |
| 6461 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, &sigAndH
ash); |
| 6462 if (rv != SECSuccess) { |
| 6463 goto loser; /* malformed or unsupported. */ |
| 6464 } |
| 6465 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( |
| 6466 &sigAndHash, ss->sec.peerCert); |
| 6467 if (rv != SECSuccess) { |
| 6468 goto loser; |
| 6469 } |
| 6470 } |
5967 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); | 6471 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); |
5968 if (rv != SECSuccess) { | 6472 if (rv != SECSuccess) { |
5969 goto loser; /* malformed. */ | 6473 goto loser; /* malformed. */ |
5970 } | 6474 } |
5971 if (length != 0) { | 6475 if (length != 0) { |
5972 if (isTLS) | 6476 if (isTLS) |
5973 desc = decode_error; | 6477 desc = decode_error; |
5974 goto alert_loser; /* malformed. */ | 6478 goto alert_loser; /* malformed. */ |
5975 } | 6479 } |
5976 | 6480 |
5977 PRINT_BUF(60, (NULL, "Server DH p", dh_p.data, dh_p.len)); | 6481 PRINT_BUF(60, (NULL, "Server DH p", dh_p.data, dh_p.len)); |
5978 PRINT_BUF(60, (NULL, "Server DH g", dh_g.data, dh_g.len)); | 6482 PRINT_BUF(60, (NULL, "Server DH g", dh_g.data, dh_g.len)); |
5979 PRINT_BUF(60, (NULL, "Server DH Ys", dh_Ys.data, dh_Ys.len)); | 6483 PRINT_BUF(60, (NULL, "Server DH Ys", dh_Ys.data, dh_Ys.len)); |
5980 | 6484 |
5981 /* failures after this point are not malformed handshakes. */ | 6485 /* failures after this point are not malformed handshakes. */ |
5982 /* TLS: send decrypt_error if signature failed. */ | 6486 /* TLS: send decrypt_error if signature failed. */ |
5983 desc = isTLS ? decrypt_error : handshake_failure; | 6487 desc = isTLS ? decrypt_error : handshake_failure; |
5984 | 6488 |
5985 /* | 6489 /* |
5986 * check to make sure the hash is signed by right guy | 6490 * check to make sure the hash is signed by right guy |
5987 */ | 6491 */ |
5988 » rv = ssl3_ComputeDHKeyHash(dh_p, dh_g, dh_Ys, | 6492 » rv = ssl3_ComputeDHKeyHash(sigAndHash.hashAlg, dh_p, dh_g, dh_Ys, |
5989 &ss->ssl3.hs.client_random, | 6493 &ss->ssl3.hs.client_random, |
5990 &ss->ssl3.hs.server_random, | 6494 &ss->ssl3.hs.server_random, |
5991 &hashes, ss->opt.bypassPKCS11); | 6495 &hashes, ss->opt.bypassPKCS11); |
5992 if (rv != SECSuccess) { | 6496 if (rv != SECSuccess) { |
5993 errCode = | 6497 errCode = |
5994 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | 6498 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); |
5995 goto alert_loser; | 6499 goto alert_loser; |
5996 } | 6500 } |
5997 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, | 6501 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, |
5998 isTLS, ss->pkcs11PinArg); | 6502 isTLS, ss->pkcs11PinArg); |
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6855 } | 7359 } |
6856 | 7360 |
6857 rv = ssl3_NegotiateVersion(ss, version, PR_TRUE); | 7361 rv = ssl3_NegotiateVersion(ss, version, PR_TRUE); |
6858 if (rv != SECSuccess) { | 7362 if (rv != SECSuccess) { |
6859 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version | 7363 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version |
6860 : handshake_failure; | 7364 : handshake_failure; |
6861 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | 7365 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; |
6862 goto alert_loser; | 7366 goto alert_loser; |
6863 } | 7367 } |
6864 | 7368 |
| 7369 rv = ssl3_InitTLS12HandshakeHash(ss); |
| 7370 if (rv != SECSuccess) { |
| 7371 desc = internal_error; |
| 7372 goto alert_loser; |
| 7373 } |
| 7374 |
6865 /* grab the client random data. */ | 7375 /* grab the client random data. */ |
6866 rv = ssl3_ConsumeHandshake( | 7376 rv = ssl3_ConsumeHandshake( |
6867 ss, &ss->ssl3.hs.client_random, SSL3_RANDOM_LENGTH, &b, &length); | 7377 ss, &ss->ssl3.hs.client_random, SSL3_RANDOM_LENGTH, &b, &length); |
6868 if (rv != SECSuccess) { | 7378 if (rv != SECSuccess) { |
6869 goto loser; /* malformed */ | 7379 goto loser; /* malformed */ |
6870 } | 7380 } |
6871 | 7381 |
6872 /* grab the client's SID, if present. */ | 7382 /* grab the client's SID, if present. */ |
6873 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); | 7383 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); |
6874 if (rv != SECSuccess) { | 7384 if (rv != SECSuccess) { |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7696 /* we don't even search for a cache hit here. It's just a miss. */ | 8206 /* we don't even search for a cache hit here. It's just a miss. */ |
7697 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_misses ); | 8207 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_misses ); |
7698 sid = ssl3_NewSessionID(ss, PR_TRUE); | 8208 sid = ssl3_NewSessionID(ss, PR_TRUE); |
7699 if (sid == NULL) { | 8209 if (sid == NULL) { |
7700 errCode = PORT_GetError(); | 8210 errCode = PORT_GetError(); |
7701 goto loser; /* memory error is set. */ | 8211 goto loser; /* memory error is set. */ |
7702 } | 8212 } |
7703 ss->sec.ci.sid = sid; | 8213 ss->sec.ci.sid = sid; |
7704 /* do not worry about memory leak of sid since it now belongs to ci */ | 8214 /* do not worry about memory leak of sid since it now belongs to ci */ |
7705 | 8215 |
| 8216 rv = ssl3_InitTLS12HandshakeHash(ss); |
| 8217 if (rv != SECSuccess) { |
| 8218 desc = internal_error; |
| 8219 goto alert_loser; |
| 8220 } |
| 8221 |
7706 /* We have to update the handshake hashes before we can send stuff */ | 8222 /* We have to update the handshake hashes before we can send stuff */ |
7707 rv = ssl3_UpdateHandshakeHashes(ss, buffer, length); | 8223 rv = ssl3_UpdateHandshakeHashes(ss, buffer, length); |
7708 if (rv != SECSuccess) { | 8224 if (rv != SECSuccess) { |
7709 errCode = PORT_GetError(); | 8225 errCode = PORT_GetError(); |
7710 goto loser; | 8226 goto loser; |
7711 } | 8227 } |
7712 | 8228 |
7713 ssl_GetXmitBufLock(ss); | 8229 ssl_GetXmitBufLock(ss); |
7714 rv = ssl3_SendServerHelloSequence(ss); | 8230 rv = ssl3_SendServerHelloSequence(ss); |
7715 ssl_ReleaseXmitBufLock(ss); | 8231 ssl_ReleaseXmitBufLock(ss); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7844 } | 8360 } |
7845 } | 8361 } |
7846 rv = ssl3_SetupPendingCipherSpec(ss); | 8362 rv = ssl3_SetupPendingCipherSpec(ss); |
7847 if (rv != SECSuccess) { | 8363 if (rv != SECSuccess) { |
7848 return rv; /* err set by ssl3_SetupPendingCipherSpec */ | 8364 return rv; /* err set by ssl3_SetupPendingCipherSpec */ |
7849 } | 8365 } |
7850 | 8366 |
7851 return SECSuccess; | 8367 return SECSuccess; |
7852 } | 8368 } |
7853 | 8369 |
| 8370 /* ssl3_PickSignatureHashFunction selects a hash function to use when signing |
| 8371 * elements of the handshake. Prior to TLS 1.2, the MD5/SHA1 combination is |
| 8372 * always used. With TLS 1.2, a client may advertise its support for signature |
| 8373 * and hash combinations. */ |
| 8374 SECStatus |
| 8375 ssl3_PickSignatureHashFunction(sslSocket *ss, |
| 8376 SSL3SignatureAndHashAlgorithm* out) |
| 8377 { |
| 8378 TLS12SignatureAlgorithm sigAlg; |
| 8379 unsigned int i, j; |
| 8380 /* hashPreference expresses our preferences for hash functions, most |
| 8381 * preferable first. */ |
| 8382 static const PRUint8 hashPreference[] = { |
| 8383 tls_hash_sha256, |
| 8384 tls_hash_sha384, |
| 8385 tls_hash_sha512, |
| 8386 tls_hash_sha1, |
| 8387 }; |
| 8388 |
| 8389 switch (ss->ssl3.hs.kea_def->kea) { |
| 8390 case kea_rsa: |
| 8391 case kea_rsa_export: |
| 8392 case kea_rsa_export_1024: |
| 8393 case kea_dhe_rsa: |
| 8394 case kea_dhe_rsa_export: |
| 8395 case kea_rsa_fips: |
| 8396 case kea_ecdh_rsa: |
| 8397 case kea_ecdhe_rsa: |
| 8398 sigAlg = tls_sig_rsa; |
| 8399 break; |
| 8400 case kea_dh_dss: |
| 8401 case kea_dh_dss_export: |
| 8402 case kea_dhe_dss: |
| 8403 case kea_dhe_dss_export: |
| 8404 sigAlg = tls_sig_dsa; |
| 8405 break; |
| 8406 case kea_ecdh_ecdsa: |
| 8407 case kea_ecdhe_ecdsa: |
| 8408 sigAlg = tls_sig_ecdsa; |
| 8409 break; |
| 8410 default: |
| 8411 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); |
| 8412 return SECFailure; |
| 8413 } |
| 8414 out->sigAlg = sigAlg; |
| 8415 |
| 8416 if (ss->version <= SSL_LIBRARY_VERSION_TLS_1_1) { |
| 8417 /* SEC_OID_UNKNOWN means the MD5/SHA1 combo hash used in TLS 1.1 and |
| 8418 * prior. */ |
| 8419 out->hashAlg = SEC_OID_UNKNOWN; |
| 8420 return SECSuccess; |
| 8421 } |
| 8422 |
| 8423 if (ss->ssl3.hs.numClientSigAndHash == 0) { |
| 8424 /* If the client didn't provide any signature_algorithms extension then |
| 8425 * we can assume that they support SHA-1: |
| 8426 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ |
| 8427 out->hashAlg = SEC_OID_SHA1; |
| 8428 return SECSuccess; |
| 8429 } |
| 8430 |
| 8431 |
| 8432 for (i = 0; i < sizeof(hashPreference); i++) { |
| 8433 for (j = 0; j < ss->ssl3.hs.numClientSigAndHash; j++) { |
| 8434 const SSL3SignatureAndHashAlgorithm* sh = |
| 8435 &ss->ssl3.hs.clientSigAndHash[j]; |
| 8436 if (sh->sigAlg == sigAlg && sh->hashAlg == hashPreference[i]) { |
| 8437 *out = *sh; |
| 8438 return SECSuccess; |
| 8439 } |
| 8440 } |
| 8441 } |
| 8442 |
| 8443 return SECFailure; |
| 8444 } |
| 8445 |
7854 | 8446 |
7855 static SECStatus | 8447 static SECStatus |
7856 ssl3_SendServerKeyExchange(sslSocket *ss) | 8448 ssl3_SendServerKeyExchange(sslSocket *ss) |
7857 { | 8449 { |
7858 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; | 8450 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; |
7859 SECStatus rv = SECFailure; | 8451 SECStatus rv = SECFailure; |
7860 int length; | 8452 int length; |
7861 PRBool isTLS; | 8453 PRBool isTLS; |
7862 SECItem signed_hash = {siBuffer, NULL, 0}; | 8454 SECItem signed_hash = {siBuffer, NULL, 0}; |
7863 SSL3Hashes hashes; | 8455 SSL3Hashes hashes; |
7864 SECKEYPublicKey * sdPub; /* public key for step-down */ | 8456 SECKEYPublicKey * sdPub; /* public key for step-down */ |
| 8457 SSL3SignatureAndHashAlgorithm sigAndHash; |
7865 | 8458 |
7866 SSL_TRC(3, ("%d: SSL3[%d]: send server_key_exchange handshake", | 8459 SSL_TRC(3, ("%d: SSL3[%d]: send server_key_exchange handshake", |
7867 SSL_GETPID(), ss->fd)); | 8460 SSL_GETPID(), ss->fd)); |
7868 | 8461 |
7869 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | 8462 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); |
7870 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | 8463 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); |
7871 | 8464 |
| 8465 if (SECSuccess != ssl3_PickSignatureHashFunction(ss, &sigAndHash)) { |
| 8466 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 8467 return SECFailure; |
| 8468 } |
| 8469 |
7872 switch (kea_def->exchKeyType) { | 8470 switch (kea_def->exchKeyType) { |
7873 case kt_rsa: | 8471 case kt_rsa: |
7874 /* Perform SSL Step-Down here. */ | 8472 /* Perform SSL Step-Down here. */ |
7875 sdPub = ss->stepDownKeyPair->pubKey; | 8473 sdPub = ss->stepDownKeyPair->pubKey; |
7876 PORT_Assert(sdPub != NULL); | 8474 PORT_Assert(sdPub != NULL); |
7877 if (!sdPub) { | 8475 if (!sdPub) { |
7878 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | 8476 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); |
7879 return SECFailure; | 8477 return SECFailure; |
7880 } | 8478 } |
7881 » rv = ssl3_ComputeExportRSAKeyHash(sdPub->u.rsa.modulus, | 8479 » rv = ssl3_ComputeExportRSAKeyHash(sigAndHash.hashAlg, |
| 8480 » » » » » sdPub->u.rsa.modulus, |
7882 sdPub->u.rsa.publicExponent, | 8481 sdPub->u.rsa.publicExponent, |
7883 &ss->ssl3.hs.client_random, | 8482 &ss->ssl3.hs.client_random, |
7884 &ss->ssl3.hs.server_random, | 8483 &ss->ssl3.hs.server_random, |
7885 &hashes, ss->opt.bypassPKCS11); | 8484 &hashes, ss->opt.bypassPKCS11); |
7886 if (rv != SECSuccess) { | 8485 if (rv != SECSuccess) { |
7887 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | 8486 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); |
7888 return rv; | 8487 return rv; |
7889 } | 8488 } |
7890 | 8489 |
7891 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | 8490 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); |
(...skipping 22 matching lines...) Expand all Loading... |
7914 goto loser; /* err set by AppendHandshake. */ | 8513 goto loser; /* err set by AppendHandshake. */ |
7915 } | 8514 } |
7916 | 8515 |
7917 rv = ssl3_AppendHandshakeVariable( | 8516 rv = ssl3_AppendHandshakeVariable( |
7918 ss, sdPub->u.rsa.publicExponent.data, | 8517 ss, sdPub->u.rsa.publicExponent.data, |
7919 sdPub->u.rsa.publicExponent.len, 2); | 8518 sdPub->u.rsa.publicExponent.len, 2); |
7920 if (rv != SECSuccess) { | 8519 if (rv != SECSuccess) { |
7921 goto loser; /* err set by AppendHandshake. */ | 8520 goto loser; /* err set by AppendHandshake. */ |
7922 } | 8521 } |
7923 | 8522 |
| 8523 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { |
| 8524 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); |
| 8525 if (rv != SECSuccess) { |
| 8526 goto loser; /* err set by AppendHandshake. */ |
| 8527 } |
| 8528 } |
| 8529 |
7924 rv = ssl3_AppendHandshakeVariable(ss, signed_hash.data, | 8530 rv = ssl3_AppendHandshakeVariable(ss, signed_hash.data, |
7925 signed_hash.len, 2); | 8531 signed_hash.len, 2); |
7926 if (rv != SECSuccess) { | 8532 if (rv != SECSuccess) { |
7927 goto loser; /* err set by AppendHandshake. */ | 8533 goto loser; /* err set by AppendHandshake. */ |
7928 } | 8534 } |
7929 PORT_Free(signed_hash.data); | 8535 PORT_Free(signed_hash.data); |
7930 return SECSuccess; | 8536 return SECSuccess; |
7931 | 8537 |
7932 #ifdef NSS_ENABLE_ECC | 8538 #ifdef NSS_ENABLE_ECC |
7933 case kt_ecdh: { | 8539 case kt_ecdh: { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8039 */ | 8645 */ |
8040 static SECStatus | 8646 static SECStatus |
8041 ssl3_HandleCertificateVerify(sslSocket *ss, SSL3Opaque *b, PRUint32 length, | 8647 ssl3_HandleCertificateVerify(sslSocket *ss, SSL3Opaque *b, PRUint32 length, |
8042 SSL3Hashes *hashes) | 8648 SSL3Hashes *hashes) |
8043 { | 8649 { |
8044 SECItem signed_hash = {siBuffer, NULL, 0}; | 8650 SECItem signed_hash = {siBuffer, NULL, 0}; |
8045 SECStatus rv; | 8651 SECStatus rv; |
8046 int errCode = SSL_ERROR_RX_MALFORMED_CERT_VERIFY; | 8652 int errCode = SSL_ERROR_RX_MALFORMED_CERT_VERIFY; |
8047 SSL3AlertDescription desc = handshake_failure; | 8653 SSL3AlertDescription desc = handshake_failure; |
8048 PRBool isTLS; | 8654 PRBool isTLS; |
| 8655 SSL3SignatureAndHashAlgorithm sigAndHash; |
8049 | 8656 |
8050 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_verify handshake", | 8657 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_verify handshake", |
8051 SSL_GETPID(), ss->fd)); | 8658 SSL_GETPID(), ss->fd)); |
8052 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); | 8659 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); |
8053 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); | 8660 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); |
8054 | 8661 |
8055 if (ss->ssl3.hs.ws != wait_cert_verify || ss->sec.peerCert == NULL) { | 8662 if (ss->ssl3.hs.ws != wait_cert_verify || ss->sec.peerCert == NULL) { |
8056 desc = unexpected_message; | 8663 desc = unexpected_message; |
8057 errCode = SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY; | 8664 errCode = SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY; |
8058 goto alert_loser; | 8665 goto alert_loser; |
8059 } | 8666 } |
8060 | 8667 |
| 8668 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { |
| 8669 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, |
| 8670 &sigAndHash); |
| 8671 if (rv != SECSuccess) { |
| 8672 goto loser; /* malformed or unsupported. */ |
| 8673 } |
| 8674 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( |
| 8675 &sigAndHash, ss->sec.peerCert); |
| 8676 if (rv != SECSuccess) { |
| 8677 goto loser; |
| 8678 } |
| 8679 |
| 8680 /* We only support CertificateVerify messages that use the handshake |
| 8681 * hash. */ |
| 8682 if (sigAndHash.hashAlg != hashes->hashAlg) { |
| 8683 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_FUNCTION); |
| 8684 return SECFailure; |
| 8685 } |
| 8686 } |
| 8687 |
8061 rv = ssl3_ConsumeHandshakeVariable(ss, &signed_hash, 2, &b, &length); | 8688 rv = ssl3_ConsumeHandshakeVariable(ss, &signed_hash, 2, &b, &length); |
8062 if (rv != SECSuccess) { | 8689 if (rv != SECSuccess) { |
8063 goto loser; /* malformed. */ | 8690 goto loser; /* malformed. */ |
8064 } | 8691 } |
8065 | 8692 |
8066 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | 8693 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); |
8067 | 8694 |
8068 /* XXX verify that the key & kea match */ | 8695 /* XXX verify that the key & kea match */ |
8069 rv = ssl3_VerifySignedHashes(hashes, ss->sec.peerCert, &signed_hash, | 8696 rv = ssl3_VerifySignedHashes(hashes, ss->sec.peerCert, &signed_hash, |
8070 isTLS, ss->pkcs11PinArg); | 8697 isTLS, ss->pkcs11PinArg); |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9166 const SSL3Finished * hashes, | 9793 const SSL3Finished * hashes, |
9167 TLSFinished * tlsFinished) | 9794 TLSFinished * tlsFinished) |
9168 { | 9795 { |
9169 const char * label; | 9796 const char * label; |
9170 unsigned int len; | 9797 unsigned int len; |
9171 SECStatus rv; | 9798 SECStatus rv; |
9172 | 9799 |
9173 label = isServer ? "server finished" : "client finished"; | 9800 label = isServer ? "server finished" : "client finished"; |
9174 len = 15; | 9801 len = 15; |
9175 | 9802 |
9176 rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->md5, | 9803 rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->u.raw, |
9177 » sizeof *hashes, tlsFinished->verify_data, | 9804 » hashes->len, tlsFinished->verify_data, |
9178 sizeof tlsFinished->verify_data); | 9805 sizeof tlsFinished->verify_data); |
9179 | 9806 |
9180 return rv; | 9807 return rv; |
9181 } | 9808 } |
9182 | 9809 |
9183 /* The calling function must acquire and release the appropriate | 9810 /* The calling function must acquire and release the appropriate |
9184 * lock (e.g., ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for | 9811 * lock (e.g., ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for |
9185 * ss->ssl3.crSpec). | 9812 * ss->ssl3.crSpec). |
9186 */ | 9813 */ |
9187 SECStatus | 9814 SECStatus |
9188 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label, | 9815 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label, |
9189 unsigned int labelLen, const unsigned char *val, unsigned int valLen, | 9816 unsigned int labelLen, const unsigned char *val, unsigned int valLen, |
9190 unsigned char *out, unsigned int outLen) | 9817 unsigned char *out, unsigned int outLen) |
9191 { | 9818 { |
9192 SECStatus rv = SECSuccess; | 9819 SECStatus rv = SECSuccess; |
9193 | 9820 |
9194 if (spec->master_secret && !spec->bypassCiphers) { | 9821 if (spec->master_secret && !spec->bypassCiphers) { |
9195 SECItem param = {siBuffer, NULL, 0}; | 9822 SECItem param = {siBuffer, NULL, 0}; |
| 9823 CK_MECHANISM_TYPE mech = CKM_TLS_PRF_GENERAL; |
| 9824 if (spec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { |
| 9825 mech = CKM_NSS_TLS_PRF_GENERAL_SHA256; |
| 9826 } |
9196 PK11Context *prf_context = | 9827 PK11Context *prf_context = |
9197 » PK11_CreateContextBySymKey(CKM_TLS_PRF_GENERAL, CKA_SIGN, | 9828 » PK11_CreateContextBySymKey(mech, CKA_SIGN, spec->master_secret, |
9198 » » » » spec->master_secret, ¶m); | 9829 » » » » ¶m); |
9199 unsigned int retLen; | 9830 unsigned int retLen; |
9200 | 9831 |
9201 if (!prf_context) | 9832 if (!prf_context) |
9202 return SECFailure; | 9833 return SECFailure; |
9203 | 9834 |
9204 rv = PK11_DigestBegin(prf_context); | 9835 rv = PK11_DigestBegin(prf_context); |
9205 rv |= PK11_DigestOp(prf_context, (unsigned char *) label, labelLen); | 9836 rv |= PK11_DigestOp(prf_context, (unsigned char *) label, labelLen); |
9206 rv |= PK11_DigestOp(prf_context, val, valLen); | 9837 rv |= PK11_DigestOp(prf_context, val, valLen); |
9207 rv |= PK11_DigestFinal(prf_context, out, &retLen, outLen); | 9838 rv |= PK11_DigestFinal(prf_context, out, &retLen, outLen); |
9208 PORT_Assert(rv != SECSuccess || retLen == outLen); | 9839 PORT_Assert(rv != SECSuccess || retLen == outLen); |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9522 else | 10153 else |
9523 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; | 10154 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; |
9524 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; | 10155 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; |
9525 rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof tlsFinished); | 10156 rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof tlsFinished); |
9526 if (rv != SECSuccess) | 10157 if (rv != SECSuccess) |
9527 goto fail; /* err set by AppendHandshake. */ | 10158 goto fail; /* err set by AppendHandshake. */ |
9528 rv = ssl3_AppendHandshake(ss, &tlsFinished, sizeof tlsFinished); | 10159 rv = ssl3_AppendHandshake(ss, &tlsFinished, sizeof tlsFinished); |
9529 if (rv != SECSuccess) | 10160 if (rv != SECSuccess) |
9530 goto fail; /* err set by AppendHandshake. */ | 10161 goto fail; /* err set by AppendHandshake. */ |
9531 } else { | 10162 } else { |
9532 » if (isServer) | 10163 » unsigned char *ssl3FinishedStorage; |
9533 » ss->ssl3.hs.finishedMsgs.sFinished[1] = hashes; | 10164 |
9534 » else | 10165 » if (isServer) { |
9535 » ss->ssl3.hs.finishedMsgs.sFinished[0] = hashes; | 10166 » ssl3FinishedStorage = &ss->ssl3.hs.finishedMsgs.sFinished[1][0]; |
9536 » ss->ssl3.hs.finishedBytes = sizeof hashes; | 10167 » } else { |
9537 » rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof hashes); | 10168 » ssl3FinishedStorage = &ss->ssl3.hs.finishedMsgs.sFinished[0][0]; |
| 10169 » } |
| 10170 » memcpy(ssl3FinishedStorage, hashes.u.raw, hashes.len); |
| 10171 » ss->ssl3.hs.finishedBytes = hashes.len; |
| 10172 » rv = ssl3_AppendHandshakeHeader(ss, finished, hashes.len); |
9538 if (rv != SECSuccess) | 10173 if (rv != SECSuccess) |
9539 goto fail; /* err set by AppendHandshake. */ | 10174 goto fail; /* err set by AppendHandshake. */ |
9540 » rv = ssl3_AppendHandshake(ss, &hashes, sizeof hashes); | 10175 » rv = ssl3_AppendHandshake(ss, hashes.u.raw, hashes.len); |
9541 if (rv != SECSuccess) | 10176 if (rv != SECSuccess) |
9542 goto fail; /* err set by AppendHandshake. */ | 10177 goto fail; /* err set by AppendHandshake. */ |
9543 } | 10178 } |
9544 rv = ssl3_FlushHandshake(ss, flags); | 10179 rv = ssl3_FlushHandshake(ss, flags); |
9545 if (rv != SECSuccess) { | 10180 if (rv != SECSuccess) { |
9546 goto fail; /* error code set by ssl3_FlushHandshake */ | 10181 goto fail; /* error code set by ssl3_FlushHandshake */ |
9547 } | 10182 } |
9548 | 10183 |
9549 ssl3_RecordKeyLog(ss); | 10184 ssl3_RecordKeyLog(ss); |
9550 | 10185 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9679 else | 10314 else |
9680 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; | 10315 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; |
9681 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; | 10316 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; |
9682 if (rv != SECSuccess || | 10317 if (rv != SECSuccess || |
9683 0 != NSS_SecureMemcmp(&tlsFinished, b, length)) { | 10318 0 != NSS_SecureMemcmp(&tlsFinished, b, length)) { |
9684 (void)SSL3_SendAlert(ss, alert_fatal, decrypt_error); | 10319 (void)SSL3_SendAlert(ss, alert_fatal, decrypt_error); |
9685 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | 10320 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); |
9686 return SECFailure; | 10321 return SECFailure; |
9687 } | 10322 } |
9688 } else { | 10323 } else { |
9689 » if (length != sizeof(SSL3Hashes)) { | 10324 » unsigned char *ssl3FinishedStorage; |
| 10325 |
| 10326 » if (length != hashes->len) { |
9690 (void)ssl3_IllegalParameter(ss); | 10327 (void)ssl3_IllegalParameter(ss); |
9691 PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED); | 10328 PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED); |
9692 return SECFailure; | 10329 return SECFailure; |
9693 } | 10330 } |
9694 | 10331 |
9695 » if (!isServer) | 10332 » if (!isServer) { |
9696 » ss->ssl3.hs.finishedMsgs.sFinished[1] = *hashes; | 10333 » ssl3FinishedStorage = &ss->ssl3.hs.finishedMsgs.sFinished[1][0]; |
9697 » else | 10334 » } else { |
9698 » ss->ssl3.hs.finishedMsgs.sFinished[0] = *hashes; | 10335 » ssl3FinishedStorage = &ss->ssl3.hs.finishedMsgs.sFinished[0][0]; |
9699 » ss->ssl3.hs.finishedBytes = sizeof *hashes; | 10336 » } |
9700 » if (0 != NSS_SecureMemcmp(hashes, b, length)) { | 10337 » memcpy(ssl3FinishedStorage, hashes->u.raw, hashes->len); |
| 10338 » ss->ssl3.hs.finishedBytes = hashes->len; |
| 10339 » if (0 != NSS_SecureMemcmp(hashes->u.raw, b, length)) { |
9701 (void)ssl3_HandshakeFailure(ss); | 10340 (void)ssl3_HandshakeFailure(ss); |
9702 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | 10341 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); |
9703 return SECFailure; | 10342 return SECFailure; |
9704 } | 10343 } |
9705 } | 10344 } |
9706 | 10345 |
9707 ssl_GetXmitBufLock(ss); /*************************************/ | 10346 ssl_GetXmitBufLock(ss); /*************************************/ |
9708 | 10347 |
9709 if ((isServer && !ss->ssl3.hs.isResuming) || | 10348 if ((isServer && !ss->ssl3.hs.isResuming) || |
9710 (!isServer && ss->ssl3.hs.isResuming)) { | 10349 (!isServer && ss->ssl3.hs.isResuming)) { |
(...skipping 1568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11279 SHA1_DestroyContext((SHA1Context *)ss->ssl3.hs.sha_cx, PR_FALSE); | 11918 SHA1_DestroyContext((SHA1Context *)ss->ssl3.hs.sha_cx, PR_FALSE); |
11280 MD5_DestroyContext((MD5Context *)ss->ssl3.hs.md5_cx, PR_FALSE); | 11919 MD5_DestroyContext((MD5Context *)ss->ssl3.hs.md5_cx, PR_FALSE); |
11281 } | 11920 } |
11282 #endif | 11921 #endif |
11283 if (ss->ssl3.hs.md5) { | 11922 if (ss->ssl3.hs.md5) { |
11284 PK11_DestroyContext(ss->ssl3.hs.md5,PR_TRUE); | 11923 PK11_DestroyContext(ss->ssl3.hs.md5,PR_TRUE); |
11285 } | 11924 } |
11286 if (ss->ssl3.hs.sha) { | 11925 if (ss->ssl3.hs.sha) { |
11287 PK11_DestroyContext(ss->ssl3.hs.sha,PR_TRUE); | 11926 PK11_DestroyContext(ss->ssl3.hs.sha,PR_TRUE); |
11288 } | 11927 } |
| 11928 if (ss->ssl3.hs.tls12_handshake_hash) { |
| 11929 PK11_DestroyContext(ss->ssl3.hs.tls12_handshake_hash,PR_TRUE); |
| 11930 } |
| 11931 if (ss->ssl3.hs.clientSigAndHash) { |
| 11932 PORT_Free(ss->ssl3.hs.clientSigAndHash); |
| 11933 } |
11289 if (ss->ssl3.hs.messages.buf) { | 11934 if (ss->ssl3.hs.messages.buf) { |
11290 PORT_Free(ss->ssl3.hs.messages.buf); | 11935 PORT_Free(ss->ssl3.hs.messages.buf); |
11291 ss->ssl3.hs.messages.buf = NULL; | 11936 ss->ssl3.hs.messages.buf = NULL; |
11292 ss->ssl3.hs.messages.len = 0; | 11937 ss->ssl3.hs.messages.len = 0; |
11293 ss->ssl3.hs.messages.space = 0; | 11938 ss->ssl3.hs.messages.space = 0; |
11294 } | 11939 } |
11295 | 11940 |
11296 /* free the SSL3Buffer (msg_body) */ | 11941 /* free the SSL3Buffer (msg_body) */ |
11297 PORT_Free(ss->ssl3.hs.msg_body.buf); | 11942 PORT_Free(ss->ssl3.hs.msg_body.buf); |
11298 | 11943 |
11299 /* free up the CipherSpecs */ | 11944 /* free up the CipherSpecs */ |
11300 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); | 11945 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); |
11301 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); | 11946 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); |
11302 | 11947 |
11303 /* Destroy the DTLS data */ | 11948 /* Destroy the DTLS data */ |
11304 if (IS_DTLS(ss)) { | 11949 if (IS_DTLS(ss)) { |
11305 dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); | 11950 dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); |
11306 if (ss->ssl3.hs.recvdFragments.buf) { | 11951 if (ss->ssl3.hs.recvdFragments.buf) { |
11307 PORT_Free(ss->ssl3.hs.recvdFragments.buf); | 11952 PORT_Free(ss->ssl3.hs.recvdFragments.buf); |
11308 } | 11953 } |
11309 } | 11954 } |
11310 | 11955 |
11311 ss->ssl3.initialized = PR_FALSE; | 11956 ss->ssl3.initialized = PR_FALSE; |
11312 | 11957 |
11313 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); | 11958 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); |
11314 } | 11959 } |
11315 | 11960 |
11316 /* End of ssl3con.c */ | 11961 /* End of ssl3con.c */ |
OLD | NEW |