Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * SSL3 Protocol | 2 * SSL3 Protocol |
| 3 * | 3 * |
| 4 * This Source Code Form is subject to the terms of the Mozilla Public | 4 * This Source Code Form is subject to the terms of the Mozilla Public |
| 5 * License, v. 2.0. If a copy of the MPL was not distributed with this | 5 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 7 | 7 |
| 8 /* ECC code moved here from ssl3con.c */ | 8 /* ECC code moved here from ssl3con.c */ |
| 9 /* $Id: ssl3ecc.c,v 1.29 2012/06/11 02:38:30 emaldona%redhat.com Exp $ */ | 9 /* $Id$ */ |
| 10 | 10 |
| 11 #include "nss.h" | 11 #include "nss.h" |
| 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 | 18 |
| 19 #include "sslimpl.h" | 19 #include "sslimpl.h" |
| (...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 962 } | 962 } |
| 963 } | 963 } |
| 964 } | 964 } |
| 965 | 965 |
| 966 /* Ask: is ANY ECC cipher suite enabled on this socket? */ | 966 /* Ask: is ANY ECC cipher suite enabled on this socket? */ |
| 967 /* Order(N^2). Yuk. Also, this ignores export policy. */ | 967 /* Order(N^2). Yuk. Also, this ignores export policy. */ |
| 968 PRBool | 968 PRBool |
| 969 ssl3_IsECCEnabled(sslSocket * ss) | 969 ssl3_IsECCEnabled(sslSocket * ss) |
| 970 { | 970 { |
| 971 const ssl3CipherSuite * suite; | 971 const ssl3CipherSuite * suite; |
| 972 PK11SlotInfo *slot; | |
| 972 | 973 |
| 974 /* make sure we can do ECC */ | |
| 975 slot = PK11_GetBestSlot(CKM_ECDH1_DERIVE, ss->pkcs11PinArg); | |
| 976 if (!slot) { | |
| 977 return PR_FALSE; | |
| 978 } | |
| 979 PK11_FreeSlot(slot); | |
| 980 | |
| 981 /* make sure an ECC cipher is enabled */ | |
| 973 for (suite = ecSuites; *suite; ++suite) { | 982 for (suite = ecSuites; *suite; ++suite) { |
| 974 PRBool enabled = PR_FALSE; | 983 PRBool enabled = PR_FALSE; |
| 975 SECStatus rv = ssl3_CipherPrefGet(ss, *suite, &enabled); | 984 SECStatus rv = ssl3_CipherPrefGet(ss, *suite, &enabled); |
| 976 | 985 |
| 977 PORT_Assert(rv == SECSuccess); /* else is coding error */ | 986 PORT_Assert(rv == SECSuccess); /* else is coding error */ |
| 978 if (rv == SECSuccess && enabled) | 987 if (rv == SECSuccess && enabled) |
| 979 return PR_TRUE; | 988 return PR_TRUE; |
| 980 } | 989 } |
| 981 return PR_FALSE; | 990 return PR_FALSE; |
| 982 } | 991 } |
| 983 | 992 |
| 984 #define BE(n) 0, n | 993 #define BE(n) 0, n |
| 985 | 994 |
| 986 #ifndef NSS_ECC_MORE_THAN_SUITE_B | |
| 987 /* Prefabricated TLS client hello extension, Elliptic Curves List, | 995 /* Prefabricated TLS client hello extension, Elliptic Curves List, |
| 988 * offers only 3 curves, the Suite B curves, 23-25 | 996 * offers only 3 curves, the Suite B curves, 23-25 |
| 989 */ | 997 */ |
| 990 static const PRUint8 EClist[12] = { | 998 static const PRUint8 suiteBECList[12] = { |
| 991 BE(10), /* Extension type */ | 999 BE(10), /* Extension type */ |
| 992 BE( 8), /* octets that follow ( 3 pairs + 1 length pair) */ | 1000 BE( 8), /* octets that follow ( 3 pairs + 1 length pair) */ |
| 993 BE( 6), /* octets that follow ( 3 pairs) */ | 1001 BE( 6), /* octets that follow ( 3 pairs) */ |
| 994 BE(23), BE(24), BE(25) | 1002 BE(23), BE(24), BE(25) |
| 995 }; | 1003 }; |
| 996 #else | 1004 |
| 997 /* Prefabricated TLS client hello extension, Elliptic Curves List, | 1005 /* Prefabricated TLS client hello extension, Elliptic Curves List, |
| 998 * offers curves 1-25. | 1006 * offers curves 1-25. |
| 999 */ | 1007 */ |
| 1000 static const PRUint8 EClist[56] = { | 1008 static const PRUint8 tlsECList[56] = { |
| 1001 BE(10), /* Extension type */ | 1009 BE(10), /* Extension type */ |
| 1002 BE(52), /* octets that follow (25 pairs + 1 length pair) */ | 1010 BE(52), /* octets that follow (25 pairs + 1 length pair) */ |
| 1003 BE(50), /* octets that follow (25 pairs) */ | 1011 BE(50), /* octets that follow (25 pairs) */ |
| 1004 BE( 1), BE( 2), BE( 3), BE( 4), BE( 5), BE( 6), BE( 7), | 1012 BE( 1), BE( 2), BE( 3), BE( 4), BE( 5), BE( 6), BE( 7), |
| 1005 BE( 8), BE( 9), BE(10), BE(11), BE(12), BE(13), BE(14), BE(15), | 1013 BE( 8), BE( 9), BE(10), BE(11), BE(12), BE(13), BE(14), BE(15), |
| 1006 BE(16), BE(17), BE(18), BE(19), BE(20), BE(21), BE(22), BE(23), | 1014 BE(16), BE(17), BE(18), BE(19), BE(20), BE(21), BE(22), BE(23), |
| 1007 BE(24), BE(25) | 1015 BE(24), BE(25) |
| 1008 }; | 1016 }; |
| 1009 #endif | |
| 1010 | 1017 |
| 1011 static const PRUint8 ECPtFmt[6] = { | 1018 static const PRUint8 ECPtFmt[6] = { |
| 1012 BE(11), /* Extension type */ | 1019 BE(11), /* Extension type */ |
| 1013 BE( 2), /* octets that follow */ | 1020 BE( 2), /* octets that follow */ |
| 1014 1, /* octets that follow */ | 1021 1, /* octets that follow */ |
| 1015 0 /* uncompressed type only */ | 1022 0 /* uncompressed type only */ |
| 1016 }; | 1023 }; |
| 1017 | 1024 |
| 1025 /* This function already presumes we can do ECC, ssl_IsECCEnabled must be | |
| 1026 * called before this function. It looks to see if we have a token which | |
| 1027 * is capable of doing smaller than SuiteB curves. If the token can, we | |
| 1028 * presume the token can do the whole SSL suite of curves. If it can't we | |
| 1029 * presume the token that allowed ECC to be enabled can only do suite B | |
| 1030 * curves. */ | |
| 1031 static PRBool | |
| 1032 ssl3_SuiteBOnly(sslSocket *ss) | |
| 1033 { | |
| 1034 #if 0 | |
| 1035 /* look to see if we can handle certs less than 163 bits */ | |
| 1036 PK11SlotInfo *slot = | |
| 1037 PK11_GetBestSlotWithAttributes(CKM_ECDH1_DERIVE, 0, 163, | |
| 1038 ss ? ss->pkcs11PinArg : NULL); | |
| 1039 | |
| 1040 if (!slot) { | |
| 1041 /* nope, presume we can only do suite B */ | |
| 1042 return PR_TRUE; | |
| 1043 } | |
| 1044 /* we can, presume we can do all curves */ | |
| 1045 PK11_FreeSlot(slot); | |
| 1046 return PR_FALSE; | |
| 1047 #else | |
| 1048 return PR_TRUE; | |
| 1049 #endif | |
| 1050 } | |
| 1051 | |
| 1018 /* Send our "canned" (precompiled) Supported Elliptic Curves extension, | 1052 /* Send our "canned" (precompiled) Supported Elliptic Curves extension, |
| 1019 * which says that we support all TLS-defined named curves. | 1053 * which says that we support all TLS-defined named curves. |
| 1020 */ | 1054 */ |
| 1021 PRInt32 | 1055 PRInt32 |
| 1022 ssl3_SendSupportedCurvesXtn( | 1056 ssl3_SendSupportedCurvesXtn( |
| 1023 sslSocket * ss, | 1057 sslSocket * ss, |
| 1024 PRBool append, | 1058 PRBool append, |
| 1025 PRUint32 maxBytes) | 1059 PRUint32 maxBytes) |
| 1026 { | 1060 { |
| 1061 int ECListSize = 0; | |
|
agl
2013/05/02 14:43:57
nit: starting with a capital letter is odd for a l
wtc
2013/05/02 22:32:00
Done.
| |
| 1062 const PRUint8 *ECList = NULL; | |
| 1063 | |
| 1027 if (!ss || !ssl3_IsECCEnabled(ss)) | 1064 if (!ss || !ssl3_IsECCEnabled(ss)) |
| 1028 return 0; | 1065 return 0; |
| 1029 if (append && maxBytes >= (sizeof EClist)) { | 1066 |
| 1030 » SECStatus rv = ssl3_AppendHandshake(ss, EClist, (sizeof EClist)); | 1067 if (ssl3_SuiteBOnly(ss)) { |
| 1068 » ECListSize = sizeof (suiteBECList); | |
| 1069 » ECList = suiteBECList; | |
| 1070 } else { | |
| 1071 » ECListSize = sizeof (tlsECList); | |
| 1072 » ECList = tlsECList; | |
| 1073 } | |
| 1074 | |
| 1075 if (append && maxBytes >= ECListSize) { | |
| 1076 » SECStatus rv = ssl3_AppendHandshake(ss, ECList, ECListSize); | |
| 1031 if (rv != SECSuccess) | 1077 if (rv != SECSuccess) |
| 1032 return -1; | 1078 return -1; |
| 1033 if (!ss->sec.isServer) { | 1079 if (!ss->sec.isServer) { |
| 1034 TLSExtensionData *xtnData = &ss->xtnData; | 1080 TLSExtensionData *xtnData = &ss->xtnData; |
| 1035 xtnData->advertised[xtnData->numAdvertised++] = | 1081 xtnData->advertised[xtnData->numAdvertised++] = |
| 1036 ssl_elliptic_curves_xtn; | 1082 ssl_elliptic_curves_xtn; |
| 1037 } | 1083 } |
| 1038 } | 1084 } |
| 1039 return (sizeof EClist); | 1085 return ECListSize; |
| 1086 } | |
| 1087 | |
| 1088 PRInt32 | |
| 1089 ssl3_GetSupportedECCCurveMask(sslSocket *ss) | |
| 1090 { | |
| 1091 if (ssl3_SuiteBOnly(ss)) { | |
| 1092 » return SSL3_SUITE_B_SUPPORTED_CURVES_MASK; | |
| 1093 } | |
| 1094 return SSL3_ALL_SUPPORTED_CURVES_MASK; | |
| 1040 } | 1095 } |
| 1041 | 1096 |
| 1042 /* Send our "canned" (precompiled) Supported Point Formats extension, | 1097 /* Send our "canned" (precompiled) Supported Point Formats extension, |
| 1043 * which says that we only support uncompressed points. | 1098 * which says that we only support uncompressed points. |
| 1044 */ | 1099 */ |
| 1045 PRInt32 | 1100 PRInt32 |
| 1046 ssl3_SendSupportedPointFormatsXtn( | 1101 ssl3_SendSupportedPointFormatsXtn( |
| 1047 sslSocket * ss, | 1102 sslSocket * ss, |
| 1048 PRBool append, | 1103 PRBool append, |
| 1049 PRUint32 maxBytes) | 1104 PRUint32 maxBytes) |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1158 ssl3_DisableECCSuites(ss, ecdhe_ecdsa_suites); | 1213 ssl3_DisableECCSuites(ss, ecdhe_ecdsa_suites); |
| 1159 return SECFailure; | 1214 return SECFailure; |
| 1160 | 1215 |
| 1161 loser: | 1216 loser: |
| 1162 /* no common curve supported */ | 1217 /* no common curve supported */ |
| 1163 ssl3_DisableECCSuites(ss, ecSuites); | 1218 ssl3_DisableECCSuites(ss, ecSuites); |
| 1164 return SECFailure; | 1219 return SECFailure; |
| 1165 } | 1220 } |
| 1166 | 1221 |
| 1167 #endif /* NSS_ENABLE_ECC */ | 1222 #endif /* NSS_ENABLE_ECC */ |
| OLD | NEW |