1 // Copyright 2011 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/ssl/ssl_cipher_suite_names.h"
6
7 #include "net/ssl/ssl_connection_status_flags.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "third_party/boringssl/src/include/openssl/ssl.h"
10
11 namespace net {
12
13 namespace {
14
15 int kObsoleteVersion = SSL_CONNECTION_VERSION_TLS1;
16 int kModernVersion = SSL_CONNECTION_VERSION_TLS1_2;
17
18 uint16_t kModernCipherSuite =
19 0xc02f; /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */
20
21 uint16_t kObsoleteCipherObsoleteKeyExchange =
22 0x2f; /* TLS_RSA_WITH_AES_128_CBC_SHA */
23 uint16_t kObsoleteCipherModernKeyExchange =
24 0xc014; /* TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA */
25 uint16_t kModernCipherObsoleteKeyExchange =
26 0x9c; /* TLS_RSA_WITH_AES_128_GCM_SHA256 */
27 uint16_t kModernCipherModernKeyExchange =
28 0xc02f; /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */
29
30 uint16_t kObsoleteSignature = SSL_SIGN_RSA_PKCS1_SHA1;
31 uint16_t kModernSignature = SSL_SIGN_RSA_PSS_RSAE_SHA256;
32
MakeConnectionStatus(int version,uint16_t cipher_suite)33 int MakeConnectionStatus(int version, uint16_t cipher_suite) {
34 int connection_status = 0;
35
36 SSLConnectionStatusSetVersion(version, &connection_status);
37 SSLConnectionStatusSetCipherSuite(cipher_suite, &connection_status);
38
39 return connection_status;
40 }
41
TEST(CipherSuiteNamesTest,Basic)42 TEST(CipherSuiteNamesTest, Basic) {
43 const char *key_exchange, *cipher, *mac;
44 bool is_aead, is_tls13;
45
46 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
47 0x000a);
48 EXPECT_STREQ("RSA", key_exchange);
49 EXPECT_STREQ("3DES_EDE_CBC", cipher);
50 EXPECT_STREQ("HMAC-SHA1", mac);
51 EXPECT_FALSE(is_aead);
52 EXPECT_FALSE(is_tls13);
53
54 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
55 0x002f);
56 EXPECT_STREQ("RSA", key_exchange);
57 EXPECT_STREQ("AES_128_CBC", cipher);
58 EXPECT_STREQ("HMAC-SHA1", mac);
59 EXPECT_FALSE(is_aead);
60 EXPECT_FALSE(is_tls13);
61
62 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
63 0xc030);
64 EXPECT_STREQ("ECDHE_RSA", key_exchange);
65 EXPECT_STREQ("AES_256_GCM", cipher);
66 EXPECT_TRUE(is_aead);
67 EXPECT_FALSE(is_tls13);
68 EXPECT_EQ(nullptr, mac);
69
70 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
71 0xcca9);
72 EXPECT_STREQ("ECDHE_ECDSA", key_exchange);
73 EXPECT_STREQ("CHACHA20_POLY1305", cipher);
74 EXPECT_TRUE(is_aead);
75 EXPECT_FALSE(is_tls13);
76 EXPECT_EQ(nullptr, mac);
77
78 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
79 0xff31);
80 EXPECT_STREQ("???", key_exchange);
81 EXPECT_STREQ("???", cipher);
82 EXPECT_STREQ("???", mac);
83 EXPECT_FALSE(is_aead);
84 EXPECT_FALSE(is_tls13);
85
86 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
87 0x1301);
88 EXPECT_STREQ("AES_128_GCM", cipher);
89 EXPECT_TRUE(is_aead);
90 EXPECT_TRUE(is_tls13);
91 EXPECT_EQ(nullptr, mac);
92 EXPECT_EQ(nullptr, key_exchange);
93
94 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
95 0x1302);
96 EXPECT_STREQ("AES_256_GCM", cipher);
97 EXPECT_TRUE(is_aead);
98 EXPECT_TRUE(is_tls13);
99 EXPECT_EQ(nullptr, mac);
100 EXPECT_EQ(nullptr, key_exchange);
101
102 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
103 0x1303);
104 EXPECT_STREQ("CHACHA20_POLY1305", cipher);
105 EXPECT_TRUE(is_aead);
106 EXPECT_TRUE(is_tls13);
107 EXPECT_EQ(nullptr, mac);
108 EXPECT_EQ(nullptr, key_exchange);
109 }
110
TEST(CipherSuiteNamesTest,ParseSSLCipherString)111 TEST(CipherSuiteNamesTest, ParseSSLCipherString) {
112 uint16_t cipher_suite = 0;
113 EXPECT_TRUE(ParseSSLCipherString("0x0004", &cipher_suite));
114 EXPECT_EQ(0x00004u, cipher_suite);
115
116 EXPECT_TRUE(ParseSSLCipherString("0xBEEF", &cipher_suite));
117 EXPECT_EQ(0xBEEFu, cipher_suite);
118 }
119
TEST(CipherSuiteNamesTest,ParseSSLCipherStringFails)120 TEST(CipherSuiteNamesTest, ParseSSLCipherStringFails) {
121 const char* const cipher_strings[] = {
122 "0004",
123 "0x004",
124 "0xBEEFY",
125 };
126
127 for (const auto* cipher_string : cipher_strings) {
128 uint16_t cipher_suite = 0;
129 EXPECT_FALSE(ParseSSLCipherString(cipher_string, &cipher_suite));
130 }
131 }
132
TEST(CipherSuiteNamesTest,ObsoleteSSLStatusProtocol)133 TEST(CipherSuiteNamesTest, ObsoleteSSLStatusProtocol) {
134 // Obsolete
135 // Note all of these combinations are impossible; TLS 1.2 is necessary for
136 // kModernCipherSuite.
137 EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL,
138 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_SSL2,
139 kModernCipherSuite),
140 kModernSignature));
141 EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL,
142 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_SSL3,
143 kModernCipherSuite),
144 kModernSignature));
145 EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL,
146 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1,
147 kModernCipherSuite),
148 kModernSignature));
149 EXPECT_EQ(
150 OBSOLETE_SSL_MASK_PROTOCOL,
151 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1_1,
152 kModernCipherSuite),
153 kModernSignature));
154
155 // Modern
156 EXPECT_EQ(
157 OBSOLETE_SSL_NONE,
158 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1_2,
159 kModernCipherSuite),
160 kModernSignature));
161 EXPECT_EQ(OBSOLETE_SSL_NONE,
162 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_QUIC,
163 kModernCipherSuite),
164 kModernSignature));
165 }
166
TEST(CipherSuiteNamesTest,ObsoleteSSLStatusProtocolAndCipherSuite)167 TEST(CipherSuiteNamesTest, ObsoleteSSLStatusProtocolAndCipherSuite) {
168 // Cartesian combos
169 // As above, some of these combinations can't happen in practice.
170 EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_KEY_EXCHANGE |
171 OBSOLETE_SSL_MASK_CIPHER | OBSOLETE_SSL_MASK_SIGNATURE,
172 ObsoleteSSLStatus(
173 MakeConnectionStatus(kObsoleteVersion,
174 kObsoleteCipherObsoleteKeyExchange),
175 kObsoleteSignature));
176 EXPECT_EQ(OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_KEY_EXCHANGE |
177 OBSOLETE_SSL_MASK_CIPHER,
178 ObsoleteSSLStatus(
179 MakeConnectionStatus(kObsoleteVersion,
180 kObsoleteCipherObsoleteKeyExchange),
181 kModernSignature));
182 EXPECT_EQ(
183 OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_KEY_EXCHANGE,
184 ObsoleteSSLStatus(MakeConnectionStatus(kObsoleteVersion,
185 kModernCipherObsoleteKeyExchange),
186 kModernSignature));
187 EXPECT_EQ(
188 OBSOLETE_SSL_MASK_PROTOCOL | OBSOLETE_SSL_MASK_CIPHER,
189 ObsoleteSSLStatus(MakeConnectionStatus(kObsoleteVersion,
190 kObsoleteCipherModernKeyExchange),
191 kModernSignature));
192 EXPECT_EQ(
193 OBSOLETE_SSL_MASK_PROTOCOL,
194 ObsoleteSSLStatus(MakeConnectionStatus(kObsoleteVersion,
195 kModernCipherModernKeyExchange),
196 kModernSignature));
197 EXPECT_EQ(
198 OBSOLETE_SSL_MASK_KEY_EXCHANGE | OBSOLETE_SSL_MASK_CIPHER,
199 ObsoleteSSLStatus(MakeConnectionStatus(
200 kModernVersion, kObsoleteCipherObsoleteKeyExchange),
201 kModernSignature));
202 EXPECT_EQ(
203 OBSOLETE_SSL_MASK_KEY_EXCHANGE,
204 ObsoleteSSLStatus(MakeConnectionStatus(kModernVersion,
205 kModernCipherObsoleteKeyExchange),
206 kModernSignature));
207 EXPECT_EQ(
208 OBSOLETE_SSL_MASK_CIPHER,
209 ObsoleteSSLStatus(MakeConnectionStatus(kModernVersion,
210 kObsoleteCipherModernKeyExchange),
211 kModernSignature));
212 EXPECT_EQ(
213 OBSOLETE_SSL_NONE,
214 ObsoleteSSLStatus(
215 MakeConnectionStatus(kModernVersion, kModernCipherModernKeyExchange),
216 kModernSignature));
217 EXPECT_EQ(
218 OBSOLETE_SSL_NONE,
219 ObsoleteSSLStatus(MakeConnectionStatus(SSL_CONNECTION_VERSION_TLS1_3,
220 0x1301 /* AES_128_GCM_SHA256 */),
221 kModernSignature));
222
223 // Don't flag the signature as obsolete if not present. It may be an old cache
224 // entry or a key exchange that doesn't involve a signature. (Though, in the
225 // latter case, we would always flag a bad key exchange.)
226 EXPECT_EQ(
227 OBSOLETE_SSL_NONE,
228 ObsoleteSSLStatus(
229 MakeConnectionStatus(kModernVersion, kModernCipherModernKeyExchange),
230 0));
231 EXPECT_EQ(
232 OBSOLETE_SSL_MASK_KEY_EXCHANGE,
233 ObsoleteSSLStatus(MakeConnectionStatus(kModernVersion,
234 kModernCipherObsoleteKeyExchange),
235 0));
236
237 // Flag obsolete signatures.
238 EXPECT_EQ(
239 OBSOLETE_SSL_MASK_SIGNATURE,
240 ObsoleteSSLStatus(
241 MakeConnectionStatus(kModernVersion, kModernCipherModernKeyExchange),
242 kObsoleteSignature));
243 }
244
TEST(CipherSuiteNamesTest,HTTP2CipherSuites)245 TEST(CipherSuiteNamesTest, HTTP2CipherSuites) {
246 // Picked some random cipher suites.
247 EXPECT_FALSE(
248 IsTLSCipherSuiteAllowedByHTTP2(0x0 /* TLS_NULL_WITH_NULL_NULL */));
249 EXPECT_FALSE(IsTLSCipherSuiteAllowedByHTTP2(
250 0xc014 /* TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA */));
251 EXPECT_FALSE(IsTLSCipherSuiteAllowedByHTTP2(
252 0x9c /* TLS_RSA_WITH_AES_128_GCM_SHA256 */));
253
254 // Non-existent cipher suite.
255 EXPECT_FALSE(IsTLSCipherSuiteAllowedByHTTP2(0xffff)) << "Doesn't exist!";
256
257 // HTTP/2-compatible ones.
258 EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(
259 0xc02f /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */));
260 EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(
261 0xcca8 /* ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 */));
262 EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(
263 0xcca9 /* ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 */));
264 EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(0x1301 /* AES_128_GCM_SHA256 */));
265 EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(0x1302 /* AES_256_GCM_SHA384 */));
266 EXPECT_TRUE(IsTLSCipherSuiteAllowedByHTTP2(0x1303 /* CHACHA20_POLY1305 */));
267 }
268
269 } // anonymous namespace
270
271 } // namespace net
272