- add sources.
[platform/framework/web/crosswalk.git] / src / net / third_party / nss / patches / ciphersuiteversion.patch
1 diff --git a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c
2 index bc54c99..1245393 100644
3 --- a/nss/lib/ssl/ssl3con.c
4 +++ b/nss/lib/ssl/ssl3con.c
5 @@ -631,8 +631,9 @@ void SSL_AtomicIncrementLong(long * x)
6  }
7  
8  static PRBool
9 -ssl3_CipherSuiteAllowedForVersion(ssl3CipherSuite cipherSuite,
10 -                                 SSL3ProtocolVersion version)
11 +ssl3_CipherSuiteAllowedForVersionRange(
12 +    ssl3CipherSuite cipherSuite,
13 +    const SSLVersionRange *vrange)
14  {
15      switch (cipherSuite) {
16      /* See RFC 4346 A.5. Export cipher suites must not be used in TLS 1.1 or
17 @@ -649,7 +650,9 @@ ssl3_CipherSuiteAllowedForVersion(ssl3CipherSuite cipherSuite,
18       *   SSL_DH_ANON_EXPORT_WITH_RC4_40_MD5:     never implemented
19       *   SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA:  never implemented
20       */
21 -       return version <= SSL_LIBRARY_VERSION_TLS_1_0;
22 +       return vrange->min <= SSL_LIBRARY_VERSION_TLS_1_0;
23 +    case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:
24 +    case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
25      case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
26      case TLS_RSA_WITH_AES_256_CBC_SHA256:
27      case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
28 @@ -661,7 +664,7 @@ ssl3_CipherSuiteAllowedForVersion(ssl3CipherSuite cipherSuite,
29      case TLS_RSA_WITH_AES_128_CBC_SHA256:
30      case TLS_RSA_WITH_AES_128_GCM_SHA256:
31      case TLS_RSA_WITH_NULL_SHA256:
32 -       return version >= SSL_LIBRARY_VERSION_TLS_1_2;
33 +       return vrange->max >= SSL_LIBRARY_VERSION_TLS_1_2;
34      default:
35         return PR_TRUE;
36      }
37 @@ -804,7 +807,8 @@ ssl3_config_match_init(sslSocket *ss)
38  }
39  
40  
41 -/* return PR_TRUE if suite matches policy and enabled state */
42 +/* return PR_TRUE if suite matches policy, enabled state and is applicable to
43 + * the given version range. */
44  /* It would be a REALLY BAD THING (tm) if we ever permitted the use
45  ** of a cipher that was NOT_ALLOWED.  So, if this is ever called with
46  ** policy == SSL_NOT_ALLOWED, report no match.
47 @@ -812,7 +816,8 @@ ssl3_config_match_init(sslSocket *ss)
48  /* adjust suite enabled to the availability of a token that can do the
49   * cipher suite. */
50  static PRBool
51 -config_match(ssl3CipherSuiteCfg *suite, int policy, PRBool enabled)
52 +config_match(ssl3CipherSuiteCfg *suite, int policy, PRBool enabled,
53 +            const SSLVersionRange *vrange)
54  {
55      PORT_Assert(policy != SSL_NOT_ALLOWED && enabled != PR_FALSE);
56      if (policy == SSL_NOT_ALLOWED || !enabled)
57 @@ -820,10 +825,13 @@ config_match(ssl3CipherSuiteCfg *suite, int policy, PRBool enabled)
58      return (PRBool)(suite->enabled &&
59                      suite->isPresent &&
60                     suite->policy != SSL_NOT_ALLOWED &&
61 -                   suite->policy <= policy);
62 +                   suite->policy <= policy &&
63 +                   ssl3_CipherSuiteAllowedForVersionRange(
64 +                        suite->cipher_suite, vrange));
65  }
66  
67 -/* return number of cipher suites that match policy and enabled state */
68 +/* return number of cipher suites that match policy, enabled state and are
69 + * applicable for the configured protocol version range. */
70  /* called from ssl3_SendClientHello and ssl3_ConstructV2CipherSpecsHack */
71  static int
72  count_cipher_suites(sslSocket *ss, int policy, PRBool enabled)
73 @@ -834,7 +842,7 @@ count_cipher_suites(sslSocket *ss, int policy, PRBool enabled)
74         return 0;
75      }
76      for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
77 -       if (config_match(&ss->cipherSuites[i], policy, enabled))
78 +       if (config_match(&ss->cipherSuites[i], policy, enabled, &ss->vrange))
79             count++;
80      }
81      if (count <= 0) {
82 @@ -5294,7 +5302,7 @@ ssl3_SendClientHello(sslSocket *ss, PRBool resending)
83      }
84      for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
85         ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
86 -       if (config_match(suite, ss->ssl3.policy, PR_TRUE)) {
87 +       if (config_match(suite, ss->ssl3.policy, PR_TRUE, &ss->vrange)) {
88             actual_count++;
89             if (actual_count > num_suites) {
90                 /* set error card removal/insertion error */
91 @@ -6359,15 +6367,19 @@ ssl3_HandleServerHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
92      for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
93         ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
94         if (temp == suite->cipher_suite) {
95 -           if (!config_match(suite, ss->ssl3.policy, PR_TRUE)) {
96 +           SSLVersionRange vrange = {ss->version, ss->version};
97 +           if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) {
98 +               /* config_match already checks whether the cipher suite is
99 +                * acceptable for the version, but the check is repeated here
100 +                * in order to give a more precise error code. */
101 +               if (!ssl3_CipherSuiteAllowedForVersionRange(temp, &vrange)) {
102 +                   desc    = handshake_failure;
103 +                   errCode = SSL_ERROR_CIPHER_DISALLOWED_FOR_VERSION;
104 +                   goto alert_loser;
105 +               }
106 +
107                 break;  /* failure */
108             }
109 -           if (!ssl3_CipherSuiteAllowedForVersion(suite->cipher_suite,
110 -                                                  ss->version)) {
111 -               desc    = handshake_failure;
112 -               errCode = SSL_ERROR_CIPHER_DISALLOWED_FOR_VERSION;
113 -               goto alert_loser;
114 -           }
115         
116             suite_found = PR_TRUE;
117             break;      /* success */
118 @@ -8008,6 +8020,9 @@ ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
119      */
120      if (sid) do {
121         ssl3CipherSuiteCfg *suite;
122 +#ifdef PARANOID
123 +       SSLVersionRange vrange = {ss->version, ss->version};
124 +#endif
125  
126         /* Check that the cached compression method is still enabled. */
127         if (!compressionEnabled(ss, sid->u.ssl3.compression))
128 @@ -8036,7 +8051,7 @@ ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
129          * The product policy won't change during the process lifetime.  
130          * Implemented ("isPresent") shouldn't change for servers.
131          */
132 -       if (!config_match(suite, ss->ssl3.policy, PR_TRUE))
133 +       if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange))
134             break;
135  #else
136         if (!suite->enabled)
137 @@ -8084,9 +8099,8 @@ ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
138      */
139      for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) {
140         ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j];
141 -       if (!config_match(suite, ss->ssl3.policy, PR_TRUE) ||
142 -           !ssl3_CipherSuiteAllowedForVersion(suite->cipher_suite,
143 -                                              ss->version)) {
144 +       SSLVersionRange vrange = {ss->version, ss->version};
145 +       if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) {
146             continue;
147         }
148         for (i = 0; i + 1 < suites.len; i += 2) {
149 @@ -8619,9 +8633,8 @@ ssl3_HandleV2ClientHello(sslSocket *ss, unsigned char *buffer, int length)
150      */
151      for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) {
152         ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j];
153 -       if (!config_match(suite, ss->ssl3.policy, PR_TRUE) ||
154 -           !ssl3_CipherSuiteAllowedForVersion(suite->cipher_suite,
155 -                                              ss->version)) {
156 +       SSLVersionRange vrange = {ss->version, ss->version};
157 +       if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) {
158             continue;
159         }
160         for (i = 0; i+2 < suite_length; i += 3) {
161 @@ -12324,7 +12337,7 @@ ssl3_ConstructV2CipherSpecsHack(sslSocket *ss, unsigned char *cs, int *size)
162      /* ssl3_config_match_init was called by the caller of this function. */
163      for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
164         ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
165 -       if (config_match(suite, SSL_ALLOWED, PR_TRUE)) {
166 +       if (config_match(suite, SSL_ALLOWED, PR_TRUE, &ss->vrange)) {
167             if (cs != NULL) {
168                 *cs++ = 0x00;
169                 *cs++ = (suite->cipher_suite >> 8) & 0xFF;