Chromium Code Reviews| Index: net/third_party/nss/ssl/ssl3ecc.c |
| =================================================================== |
| --- net/third_party/nss/ssl/ssl3ecc.c (revision 196870) |
| +++ net/third_party/nss/ssl/ssl3ecc.c (working copy) |
| @@ -6,7 +6,7 @@ |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| /* ECC code moved here from ssl3con.c */ |
| -/* $Id: ssl3ecc.c,v 1.29 2012/06/11 02:38:30 emaldona%redhat.com Exp $ */ |
| +/* $Id$ */ |
| #include "nss.h" |
| #include "cert.h" |
| @@ -969,7 +969,16 @@ |
| ssl3_IsECCEnabled(sslSocket * ss) |
| { |
| const ssl3CipherSuite * suite; |
| + PK11SlotInfo *slot; |
| + /* make sure we can do ECC */ |
| + slot = PK11_GetBestSlot(CKM_ECDH1_DERIVE, ss->pkcs11PinArg); |
| + if (!slot) { |
| + return PR_FALSE; |
| + } |
| + PK11_FreeSlot(slot); |
| + |
| + /* make sure an ECC cipher is enabled */ |
| for (suite = ecSuites; *suite; ++suite) { |
| PRBool enabled = PR_FALSE; |
| SECStatus rv = ssl3_CipherPrefGet(ss, *suite, &enabled); |
| @@ -983,21 +992,20 @@ |
| #define BE(n) 0, n |
| -#ifndef NSS_ECC_MORE_THAN_SUITE_B |
| /* Prefabricated TLS client hello extension, Elliptic Curves List, |
| * offers only 3 curves, the Suite B curves, 23-25 |
| */ |
| -static const PRUint8 EClist[12] = { |
| +static const PRUint8 suiteBECList[12] = { |
| BE(10), /* Extension type */ |
| BE( 8), /* octets that follow ( 3 pairs + 1 length pair) */ |
| BE( 6), /* octets that follow ( 3 pairs) */ |
| BE(23), BE(24), BE(25) |
| }; |
| -#else |
| + |
| /* Prefabricated TLS client hello extension, Elliptic Curves List, |
| * offers curves 1-25. |
| */ |
| -static const PRUint8 EClist[56] = { |
| +static const PRUint8 tlsECList[56] = { |
| BE(10), /* Extension type */ |
| BE(52), /* octets that follow (25 pairs + 1 length pair) */ |
| BE(50), /* octets that follow (25 pairs) */ |
| @@ -1006,7 +1014,6 @@ |
| BE(16), BE(17), BE(18), BE(19), BE(20), BE(21), BE(22), BE(23), |
| BE(24), BE(25) |
| }; |
| -#endif |
| static const PRUint8 ECPtFmt[6] = { |
| BE(11), /* Extension type */ |
| @@ -1015,6 +1022,33 @@ |
| 0 /* uncompressed type only */ |
| }; |
| +/* This function already presumes we can do ECC, ssl_IsECCEnabled must be |
| + * called before this function. It looks to see if we have a token which |
| + * is capable of doing smaller than SuiteB curves. If the token can, we |
| + * presume the token can do the whole SSL suite of curves. If it can't we |
| + * presume the token that allowed ECC to be enabled can only do suite B |
| + * curves. */ |
| +static PRBool |
| +ssl3_SuiteBOnly(sslSocket *ss) |
| +{ |
| +#if 0 |
| + /* look to see if we can handle certs less than 163 bits */ |
| + PK11SlotInfo *slot = |
| + PK11_GetBestSlotWithAttributes(CKM_ECDH1_DERIVE, 0, 163, |
| + ss ? ss->pkcs11PinArg : NULL); |
| + |
| + if (!slot) { |
| + /* nope, presume we can only do suite B */ |
| + return PR_TRUE; |
| + } |
| + /* we can, presume we can do all curves */ |
| + PK11_FreeSlot(slot); |
| + return PR_FALSE; |
| +#else |
| + return PR_TRUE; |
| +#endif |
| +} |
| + |
| /* Send our "canned" (precompiled) Supported Elliptic Curves extension, |
| * which says that we support all TLS-defined named curves. |
| */ |
| @@ -1024,10 +1058,22 @@ |
| PRBool append, |
| PRUint32 maxBytes) |
| { |
| + 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.
|
| + const PRUint8 *ECList = NULL; |
| + |
| if (!ss || !ssl3_IsECCEnabled(ss)) |
| return 0; |
| - if (append && maxBytes >= (sizeof EClist)) { |
| - SECStatus rv = ssl3_AppendHandshake(ss, EClist, (sizeof EClist)); |
| + |
| + if (ssl3_SuiteBOnly(ss)) { |
| + ECListSize = sizeof (suiteBECList); |
| + ECList = suiteBECList; |
| + } else { |
| + ECListSize = sizeof (tlsECList); |
| + ECList = tlsECList; |
| + } |
| + |
| + if (append && maxBytes >= ECListSize) { |
| + SECStatus rv = ssl3_AppendHandshake(ss, ECList, ECListSize); |
| if (rv != SECSuccess) |
| return -1; |
| if (!ss->sec.isServer) { |
| @@ -1036,9 +1082,18 @@ |
| ssl_elliptic_curves_xtn; |
| } |
| } |
| - return (sizeof EClist); |
| + return ECListSize; |
| } |
| +PRInt32 |
| +ssl3_GetSupportedECCCurveMask(sslSocket *ss) |
| +{ |
| + if (ssl3_SuiteBOnly(ss)) { |
| + return SSL3_SUITE_B_SUPPORTED_CURVES_MASK; |
| + } |
| + return SSL3_ALL_SUPPORTED_CURVES_MASK; |
| +} |
| + |
| /* Send our "canned" (precompiled) Supported Point Formats extension, |
| * which says that we only support uncompressed points. |
| */ |