| OLD | NEW | 
|---|
|  | (Empty) | 
| 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 cipherSuit
     e, |  | 
| 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 cipherSuit
     e, |  | 
| 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 enable
     d) |  | 
| 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, PRU
     int32 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, PRUin
     t32 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, PRUin
     t32 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, PRUin
     t32 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 *buf
     fer, 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; |  | 
| OLD | NEW | 
|---|