ssl_test.cc
Go to the documentation of this file.
1 /* Copyright (c) 2014, Google Inc.
2  *
3  * Permission to use, copy, modify, and/or distribute this software for any
4  * purpose with or without fee is hereby granted, provided that the above
5  * copyright notice and this permission notice appear in all copies.
6  *
7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14 
15 #include <stdio.h>
16 #include <string.h>
17 #include <time.h>
18 
19 #include <algorithm>
20 #include <limits>
21 #include <string>
22 #include <utility>
23 #include <vector>
24 
25 #include <gtest/gtest.h>
26 
27 #include <openssl/aead.h>
28 #include <openssl/base64.h>
29 #include <openssl/bytestring.h>
30 #include <openssl/bio.h>
31 #include <openssl/cipher.h>
32 #include <openssl/crypto.h>
33 #include <openssl/curve25519.h>
34 #include <openssl/err.h>
35 #include <openssl/hmac.h>
36 #include <openssl/hpke.h>
37 #include <openssl/pem.h>
38 #include <openssl/sha.h>
39 #include <openssl/ssl.h>
40 #include <openssl/rand.h>
41 #include <openssl/x509.h>
42 
43 #include "internal.h"
44 #include "../crypto/internal.h"
45 #include "../crypto/test/test_util.h"
46 
47 #if defined(OPENSSL_WINDOWS)
48 // Windows defines struct timeval in winsock2.h.
50 #include <winsock2.h>
52 #else
53 #include <sys/time.h>
54 #endif
55 
56 #if defined(OPENSSL_THREADS)
57 #include <thread>
58 #endif
59 
60 
62 
63 namespace {
64 
65 #define TRACED_CALL(code) \
66  do { \
67  SCOPED_TRACE("<- called from here"); \
68  code; \
69  if (::testing::Test::HasFatalFailure()) { \
70  return; \
71  } \
72  } while (false)
73 
74 struct VersionParam {
76  enum { is_tls, is_dtls } ssl_method;
77  const char name[8];
78 };
79 
80 static const size_t kTicketKeyLen = 48;
81 
82 static const VersionParam kAllVersions[] = {
83  {TLS1_VERSION, VersionParam::is_tls, "TLS1"},
84  {TLS1_1_VERSION, VersionParam::is_tls, "TLS1_1"},
85  {TLS1_2_VERSION, VersionParam::is_tls, "TLS1_2"},
86  {TLS1_3_VERSION, VersionParam::is_tls, "TLS1_3"},
87  {DTLS1_VERSION, VersionParam::is_dtls, "DTLS1"},
88  {DTLS1_2_VERSION, VersionParam::is_dtls, "DTLS1_2"},
89 };
90 
92  unsigned long id;
94 };
95 
96 struct CipherTest {
97  // The rule string to apply.
98  const char *rule;
99  // The list of expected ciphers, in order.
100  std::vector<ExpectedCipher> expected;
101  // True if this cipher list should fail in strict mode.
103 };
104 
105 struct CurveTest {
106  // The rule string to apply.
107  const char *rule;
108  // The list of expected curves, in order.
109  std::vector<uint16_t> expected;
110 };
111 
112 template <typename T>
114  public:
116  index_ = SSL_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
117  }
118 
119  T *Get(const SSL *ssl) {
120  return index_ < 0 ? nullptr
121  : static_cast<T *>(SSL_get_ex_data(ssl, index_));
122  }
123 
124  bool Set(SSL *ssl, T *t) {
125  return index_ >= 0 && SSL_set_ex_data(ssl, index_, t);
126  }
127 
128  private:
129  int index_;
130 };
131 
132 static const CipherTest kCipherTests[] = {
133  // Selecting individual ciphers should work.
134  {
135  "ECDHE-ECDSA-CHACHA20-POLY1305:"
136  "ECDHE-RSA-CHACHA20-POLY1305:"
137  "ECDHE-ECDSA-AES128-GCM-SHA256:"
138  "ECDHE-RSA-AES128-GCM-SHA256",
139  {
144  },
145  false,
146  },
147  // + reorders selected ciphers to the end, keeping their relative order.
148  {
149  "ECDHE-ECDSA-CHACHA20-POLY1305:"
150  "ECDHE-RSA-CHACHA20-POLY1305:"
151  "ECDHE-ECDSA-AES128-GCM-SHA256:"
152  "ECDHE-RSA-AES128-GCM-SHA256:"
153  "+aRSA",
154  {
159  },
160  false,
161  },
162  // ! banishes ciphers from future selections.
163  {
164  "!aRSA:"
165  "ECDHE-ECDSA-CHACHA20-POLY1305:"
166  "ECDHE-RSA-CHACHA20-POLY1305:"
167  "ECDHE-ECDSA-AES128-GCM-SHA256:"
168  "ECDHE-RSA-AES128-GCM-SHA256",
169  {
172  },
173  false,
174  },
175  // Multiple masks can be ANDed in a single rule.
176  {
177  "kRSA+AESGCM+AES128",
178  {
180  },
181  false,
182  },
183  // - removes selected ciphers, but preserves their order for future
184  // selections. Select AES_128_GCM, but order the key exchanges RSA,
185  // ECDHE_RSA.
186  {
187  "ALL:-kECDHE:"
188  "-kRSA:-ALL:"
189  "AESGCM+AES128+aRSA",
190  {
193  },
194  false,
195  },
196  // Unknown selectors are no-ops, except in strict mode.
197  {
198  "ECDHE-ECDSA-CHACHA20-POLY1305:"
199  "ECDHE-RSA-CHACHA20-POLY1305:"
200  "ECDHE-ECDSA-AES128-GCM-SHA256:"
201  "ECDHE-RSA-AES128-GCM-SHA256:"
202  "BOGUS1",
203  {
208  },
209  true,
210  },
211  // Unknown selectors are no-ops, except in strict mode.
212  {
213  "ECDHE-ECDSA-CHACHA20-POLY1305:"
214  "ECDHE-RSA-CHACHA20-POLY1305:"
215  "ECDHE-ECDSA-AES128-GCM-SHA256:"
216  "ECDHE-RSA-AES128-GCM-SHA256:"
217  "-BOGUS2:+BOGUS3:!BOGUS4",
218  {
223  },
224  true,
225  },
226  // Square brackets specify equi-preference groups.
227  {
228  "[ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-ECDSA-AES128-GCM-SHA256]:"
229  "[ECDHE-RSA-CHACHA20-POLY1305]:"
230  "ECDHE-RSA-AES128-GCM-SHA256",
231  {
236  },
237  false,
238  },
239  // Standard names may be used instead of OpenSSL names.
240  {
241  "[TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256|"
242  "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256]:"
243  "[TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256]:"
244  "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
245  {
250  },
251  false,
252  },
253  // @STRENGTH performs a stable strength-sort of the selected ciphers and
254  // only the selected ciphers.
255  {
256  // To simplify things, banish all but {ECDHE_RSA,RSA} x
257  // {CHACHA20,AES_256_CBC,AES_128_CBC} x SHA1.
258  "!AESGCM:!3DES:"
259  // Order some ciphers backwards by strength.
260  "ALL:-CHACHA20:-AES256:-AES128:-ALL:"
261  // Select ECDHE ones and sort them by strength. Ties should resolve
262  // based on the order above.
263  "kECDHE:@STRENGTH:-ALL:"
264  // Now bring back everything uses RSA. ECDHE_RSA should be first, sorted
265  // by strength. Then RSA, backwards by strength.
266  "aRSA",
267  {
273  },
274  false,
275  },
276  // Additional masks after @STRENGTH get silently discarded.
277  //
278  // TODO(davidben): Make this an error. If not silently discarded, they get
279  // interpreted as + opcodes which are very different.
280  {
281  "ECDHE-RSA-AES128-GCM-SHA256:"
282  "ECDHE-RSA-AES256-GCM-SHA384:"
283  "@STRENGTH+AES256",
284  {
287  },
288  false,
289  },
290  {
291  "ECDHE-RSA-AES128-GCM-SHA256:"
292  "ECDHE-RSA-AES256-GCM-SHA384:"
293  "@STRENGTH+AES256:"
294  "ECDHE-RSA-CHACHA20-POLY1305",
295  {
299  },
300  false,
301  },
302  // Exact ciphers may not be used in multi-part rules; they are treated
303  // as unknown aliases.
304  {
305  "ECDHE-ECDSA-AES128-GCM-SHA256:"
306  "ECDHE-RSA-AES128-GCM-SHA256:"
307  "!ECDHE-RSA-AES128-GCM-SHA256+RSA:"
308  "!ECDSA+ECDHE-ECDSA-AES128-GCM-SHA256",
309  {
312  },
313  true,
314  },
315  // SSLv3 matches everything that existed before TLS 1.2.
316  {
317  "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!SSLv3",
318  {
320  },
321  false,
322  },
323  // TLSv1.2 matches everything added in TLS 1.2.
324  {
325  "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!TLSv1.2",
326  {
328  },
329  false,
330  },
331  // The two directives have no intersection. But each component is valid, so
332  // even in strict mode it is accepted.
333  {
334  "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!TLSv1.2+SSLv3",
335  {
338  },
339  false,
340  },
341  // Spaces, semi-colons and commas are separators.
342  {
343  "AES128-SHA: ECDHE-RSA-AES128-GCM-SHA256 AES256-SHA ,ECDHE-ECDSA-AES128-GCM-SHA256 ; AES128-GCM-SHA256",
344  {
350  },
351  // …but not in strict mode.
352  true,
353  },
354 };
355 
356 static const char *kBadRules[] = {
357  // Invalid brackets.
358  "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256",
359  "RSA]",
360  "[[RSA]]",
361  // Operators inside brackets.
362  "[+RSA]",
363  // Unknown directive.
364  "@BOGUS",
365  // Empty cipher lists error at SSL_CTX_set_cipher_list.
366  "",
367  "BOGUS",
368  // COMPLEMENTOFDEFAULT is empty.
369  "COMPLEMENTOFDEFAULT",
370  // Invalid command.
371  "?BAR",
372  // Special operators are not allowed if groups are used.
373  "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:+FOO",
374  "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:!FOO",
375  "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:-FOO",
376  "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:@STRENGTH",
377  // Opcode supplied, but missing selector.
378  "+",
379  // Spaces are forbidden in equal-preference groups.
380  "[AES128-SHA | AES128-SHA256]",
381 };
382 
383 static const char *kMustNotIncludeNull[] = {
384  "ALL",
385  "DEFAULT",
386  "HIGH",
387  "FIPS",
388  "SHA",
389  "SHA1",
390  "RSA",
391  "SSLv3",
392  "TLSv1",
393  "TLSv1.2",
394 };
395 
396 static const CurveTest kCurveTests[] = {
397  {
398  "P-256",
400  },
401  {
402  "P-256:CECPQ2",
404  },
405 
406  {
407  "P-256:P-384:P-521:X25519",
408  {
413  },
414  },
415  {
416  "prime256v1:secp384r1:secp521r1:x25519",
417  {
422  },
423  },
424 };
425 
426 static const char *kBadCurvesLists[] = {
427  "",
428  ":",
429  "::",
430  "P-256::X25519",
431  "RSA:P-256",
432  "P-256:RSA",
433  "X25519:P-256:",
434  ":X25519:P-256",
435 };
436 
438  bool in_group = false;
440  const STACK_OF(SSL_CIPHER) *ciphers = SSL_CTX_get_ciphers(ctx);
441  for (size_t i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
442  const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(ciphers, i);
443  if (!in_group && SSL_CTX_cipher_in_group(ctx, i)) {
444  ret += "\t[\n";
445  in_group = true;
446  }
447  ret += "\t";
448  if (in_group) {
449  ret += " ";
450  }
451  ret += SSL_CIPHER_get_name(cipher);
452  ret += "\n";
453  if (in_group && !SSL_CTX_cipher_in_group(ctx, i)) {
454  ret += "\t]\n";
455  in_group = false;
456  }
457  }
458  return ret;
459 }
460 
462  const std::vector<ExpectedCipher> &expected) {
463  const STACK_OF(SSL_CIPHER) *ciphers = SSL_CTX_get_ciphers(ctx);
464  if (sk_SSL_CIPHER_num(ciphers) != expected.size()) {
465  return false;
466  }
467 
468  for (size_t i = 0; i < expected.size(); i++) {
469  const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(ciphers, i);
470  if (expected[i].id != SSL_CIPHER_get_id(cipher) ||
471  expected[i].in_group_flag != !!SSL_CTX_cipher_in_group(ctx, i)) {
472  return false;
473  }
474  }
475 
476  return true;
477 }
478 
479 TEST(GrowableArrayTest, Resize) {
481  ASSERT_TRUE(array.empty());
482  EXPECT_EQ(array.size(), 0u);
483 
484  ASSERT_TRUE(array.Push(42));
485  ASSERT_TRUE(!array.empty());
486  EXPECT_EQ(array.size(), 1u);
487 
488  // Force a resize operation to occur
489  for (size_t i = 0; i < 16; i++) {
490  ASSERT_TRUE(array.Push(i + 1));
491  }
492 
493  EXPECT_EQ(array.size(), 17u);
494 
495  // Verify that expected values are still contained in array
496  for (size_t i = 0; i < array.size(); i++) {
497  EXPECT_EQ(array[i], i == 0 ? 42 : i);
498  }
499 }
500 
501 TEST(GrowableArrayTest, MoveConstructor) {
503  for (size_t i = 0; i < 100; i++) {
504  ASSERT_TRUE(array.Push(i));
505  }
506 
507  GrowableArray<size_t> array_moved(std::move(array));
508  for (size_t i = 0; i < 100; i++) {
509  EXPECT_EQ(array_moved[i], i);
510  }
511 }
512 
513 TEST(GrowableArrayTest, GrowableArrayContainingGrowableArrays) {
514  // Representative example of a struct that contains a GrowableArray.
515  struct TagAndArray {
516  size_t tag;
518  };
519 
521  for (size_t i = 0; i < 100; i++) {
522  TagAndArray elem;
523  elem.tag = i;
524  for (size_t j = 0; j < i; j++) {
525  ASSERT_TRUE(elem.array.Push(j));
526  }
528  }
529  EXPECT_EQ(array.size(), static_cast<size_t>(100));
530 
532  EXPECT_EQ(array_moved.size(), static_cast<size_t>(100));
533  size_t count = 0;
534  for (const TagAndArray &elem : array_moved) {
535  // Test the square bracket operator returns the same value as iteration.
536  EXPECT_EQ(&elem, &array_moved[count]);
537 
538  EXPECT_EQ(elem.tag, count);
539  EXPECT_EQ(elem.array.size(), count);
540  for (size_t j = 0; j < count; j++) {
541  EXPECT_EQ(elem.array[j], j);
542  }
543  count++;
544  }
545 }
546 
547 TEST(SSLTest, CipherRules) {
548  for (const CipherTest &t : kCipherTests) {
549  SCOPED_TRACE(t.rule);
550  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
551  ASSERT_TRUE(ctx);
552 
553  // Test lax mode.
554  ASSERT_TRUE(SSL_CTX_set_cipher_list(ctx.get(), t.rule));
555  EXPECT_TRUE(CipherListsEqual(ctx.get(), t.expected))
556  << "Cipher rule evaluated to:\n"
557  << CipherListToString(ctx.get());
558 
559  // Test strict mode.
560  if (t.strict_fail) {
562  } else {
564  EXPECT_TRUE(CipherListsEqual(ctx.get(), t.expected))
565  << "Cipher rule evaluated to:\n"
566  << CipherListToString(ctx.get());
567  }
568  }
569 
570  for (const char *rule : kBadRules) {
571  SCOPED_TRACE(rule);
572  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
573  ASSERT_TRUE(ctx);
574 
576  ERR_clear_error();
577  }
578 
579  for (const char *rule : kMustNotIncludeNull) {
580  SCOPED_TRACE(rule);
581  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
582  ASSERT_TRUE(ctx);
583 
585  for (const SSL_CIPHER *cipher : SSL_CTX_get_ciphers(ctx.get())) {
587  }
588  }
589 }
590 
591 TEST(SSLTest, CurveRules) {
592  for (const CurveTest &t : kCurveTests) {
593  SCOPED_TRACE(t.rule);
594  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
595  ASSERT_TRUE(ctx);
596 
597  ASSERT_TRUE(SSL_CTX_set1_curves_list(ctx.get(), t.rule));
598  ASSERT_EQ(t.expected.size(), ctx->supported_group_list.size());
599  for (size_t i = 0; i < t.expected.size(); i++) {
600  EXPECT_EQ(t.expected[i], ctx->supported_group_list[i]);
601  }
602  }
603 
604  for (const char *rule : kBadCurvesLists) {
605  SCOPED_TRACE(rule);
606  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
607  ASSERT_TRUE(ctx);
608 
610  ERR_clear_error();
611  }
612 }
613 
614 // kOpenSSLSession is a serialized SSL_SESSION.
615 static const char kOpenSSLSession[] =
616  "MIIFqgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
617  "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
618  "IWoJoQYCBFRDO46iBAICASyjggR6MIIEdjCCA16gAwIBAgIIK9dUvsPWSlUwDQYJ"
619  "KoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
620  "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTQxMDA4"
621  "MTIwNzU3WhcNMTUwMTA2MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
622  "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
623  "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
624  "AQUAA4IBDwAwggEKAoIBAQCcKeLrplAC+Lofy8t/wDwtB6eu72CVp0cJ4V3lknN6"
625  "huH9ct6FFk70oRIh/VBNBBz900jYy+7111Jm1b8iqOTQ9aT5C7SEhNcQFJvqzH3e"
626  "MPkb6ZSWGm1yGF7MCQTGQXF20Sk/O16FSjAynU/b3oJmOctcycWYkY0ytS/k3LBu"
627  "Id45PJaoMqjB0WypqvNeJHC3q5JjCB4RP7Nfx5jjHSrCMhw8lUMW4EaDxjaR9KDh"
628  "PLgjsk+LDIySRSRDaCQGhEOWLJZVLzLo4N6/UlctCHEllpBUSvEOyFga52qroGjg"
629  "rf3WOQ925MFwzd6AK+Ich0gDRg8sQfdLH5OuP1cfLfU1AgMBAAGjggFBMIIBPTAd"
630  "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
631  "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
632  "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
633  "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBQ7a+CcxsZByOpc+xpYFcIbnUMZ"
634  "hTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
635  "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
636  "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCa"
637  "OXCBdoqUy5bxyq+Wrh1zsyyCFim1PH5VU2+yvDSWrgDY8ibRGJmfff3r4Lud5kal"
638  "dKs9k8YlKD3ITG7P0YT/Rk8hLgfEuLcq5cc0xqmE42xJ+Eo2uzq9rYorc5emMCxf"
639  "5L0TJOXZqHQpOEcuptZQ4OjdYMfSxk5UzueUhA3ogZKRcRkdB3WeWRp+nYRhx4St"
640  "o2rt2A0MKmY9165GHUqMK9YaaXHDXqBu7Sefr1uSoAP9gyIJKeihMivsGqJ1TD6Z"
641  "cc6LMe+dN2P8cZEQHtD1y296ul4Mivqk3jatUVL8/hCwgch9A8O4PGZq9WqBfEWm"
642  "IyHh1dPtbg1lOXdYCWtjpAIEAKUDAgEUqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36S"
643  "YTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9B"
644  "sNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yE"
645  "OTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdA"
646  "i4gv7Y5oliyntgMBAQA=";
647 
648 // kCustomSession is a custom serialized SSL_SESSION generated by
649 // filling in missing fields from |kOpenSSLSession|. This includes
650 // providing |peer_sha256|, so |peer| is not serialized.
651 static const char kCustomSession[] =
652  "MIIBZAIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
653  "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
654  "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUqAcEBXdvcmxkqQUCAwGJwKqBpwSB"
655  "pBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38"
656  "VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd"
657  "3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hg"
658  "b+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYGBgYGBgYGBgYGBgYGBgYGBgYG"
659  "BgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
660 
661 // kBoringSSLSession is a serialized SSL_SESSION generated from bssl client.
662 static const char kBoringSSLSession[] =
663  "MIIRwQIBAQICAwMEAsAvBCDdoGxGK26mR+8lM0uq6+k9xYuxPnwAjpcF9n0Yli9R"
664  "kQQwbyshfWhdi5XQ1++7n2L1qqrcVlmHBPpr6yknT/u4pUrpQB5FZ7vqvNn8MdHf"
665  "9rWgoQYCBFXgs7uiBAICHCCjggR6MIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJ"
666  "KoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
667  "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEy"
668  "MTQ1MzE1WhcNMTUxMTEwMDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
669  "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
670  "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
671  "AQUAA4IBDwAwggEKAoIBAQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpo"
672  "PLuBinvhkXZo3DC133NpCBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU"
673  "792c7hFyNXSUCG7At8Ifi3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mce"
674  "Tv9iGKqSkSTlp8puy/9SZ/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/"
675  "RCh8/UKc8PaL+cxlt531qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eL"
676  "EucWQ72YZU8mUzXBoXGn0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAd"
677  "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
678  "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
679  "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
680  "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjG"
681  "GjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
682  "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
683  "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAb"
684  "qdWPZEHk0X7iKPCTHL6S3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovE"
685  "kQZSHwT+pyOPWQhsSjO+1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXd"
686  "X+s0WdbOpn6MStKAiBVloPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+"
687  "n0OTucD9sHV7EVj9XUxi51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779a"
688  "f07vR03r349Iz/KTzk95rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1y"
689  "TTlM80jBMOwyjZXmjRAhpAIEAKUDAgEUqQUCAwGJwKqBpwSBpOgebbmn9NRUtMWH"
690  "+eJpqA5JLMFSMCChOsvKey3toBaCNGU7HfAEiiXNuuAdCBoK262BjQc2YYfqFzqH"
691  "zuppopXCvhohx7j/tnCNZIMgLYt/O9SXK2RYI5z8FhCCHvB4CbD5G0LGl5EFP27s"
692  "Jb6S3aTTYPkQe8yZSlxevg6NDwmTogLO9F7UUkaYmVcMQhzssEE2ZRYNwSOU6KjE"
693  "0Yj+8fAiBtbQriIEIN2L8ZlpaVrdN5KFNdvcmOxJu81P8q53X55xQyGTnGWwsgMC"
694  "ARezggvvMIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJKoZIhvcNAQELBQAwSTEL"
695  "MAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2ds"
696  "ZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEyMTQ1MzE1WhcNMTUxMTEw"
697  "MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG"
698  "A1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UE"
699  "AwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB"
700  "AQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpoPLuBinvhkXZo3DC133Np"
701  "CBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU792c7hFyNXSUCG7At8If"
702  "i3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mceTv9iGKqSkSTlp8puy/9S"
703  "Z/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/RCh8/UKc8PaL+cxlt531"
704  "qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eLEucWQ72YZU8mUzXBoXGn"
705  "0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEF"
706  "BQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYB"
707  "BQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB"
708  "RzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9v"
709  "Y3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjGGjAMBgNVHRMBAf8EAjAA"
710  "MB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYK"
711  "KwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5j"
712  "b20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAbqdWPZEHk0X7iKPCTHL6S"
713  "3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovEkQZSHwT+pyOPWQhsSjO+"
714  "1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXdX+s0WdbOpn6MStKAiBVl"
715  "oPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+n0OTucD9sHV7EVj9XUxi"
716  "51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779af07vR03r349Iz/KTzk95"
717  "rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1yTTlM80jBMOwyjZXmjRAh"
718  "MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT"
719  "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i"
720  "YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG"
721  "EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy"
722  "bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
723  "AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP"
724  "VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv"
725  "h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE"
726  "ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ"
727  "EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC"
728  "DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7"
729  "qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD"
730  "VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov"
731  "L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig"
732  "JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ"
733  "MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+"
734  "3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI"
735  "hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI"
736  "Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X"
737  "Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm"
738  "X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40"
739  "fsg12DCCA30wggLmoAMCAQICAxK75jANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG"
740  "EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUg"
741  "Q2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTAyMDUyMTA0MDAwMFoXDTE4MDgyMTA0"
742  "MDAwMFowQjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xGzAZ"
743  "BgNVBAMTEkdlb1RydXN0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP"
744  "ADCCAQoCggEBANrMGGMw/fQXIxpWflvfPGw45HG3eJHUvKHYTPioQ7YD6U0hBwiI"
745  "2lgvZjkpvQV4i5046AW3an5xpObEYKaw74DkiSgPniXW7YPzraaRx5jJQhg1FJ2t"
746  "mEaSLk/K8YdDwRaVVy1Q74ktgHpXrfLuX2vSAI25FPgUFTXZwEaje3LIkb/JVSvN"
747  "0Jc+nCZkzN/Ogxlxyk7m1NV7qRnNVd7I7NJeOFPlXE+MLf5QIzb8ZubLjqQ5GQC3"
748  "lQI5kQsO/jgu0R0FmvZNPm8PBx2vLB6PYDni+jZTEznUXiYr2z2oFL0y6xgDKFIE"
749  "ceWrMz3hOLsHNoRinHnqFjD0X8Ar6HFr5PkCAwEAAaOB8DCB7TAfBgNVHSMEGDAW"
750  "gBRI5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHQ4EFgQUwHqYaI2J+6sFZAwRfap9"
751  "ZbjKzE4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMw"
752  "MTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5j"
753  "cmwwTgYDVR0gBEcwRTBDBgRVHSAAMDswOQYIKwYBBQUHAgEWLWh0dHBzOi8vd3d3"
754  "Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvcmVwb3NpdG9yeTANBgkqhkiG9w0BAQUF"
755  "AAOBgQB24RJuTksWEoYwBrKBCM/wCMfHcX5m7sLt1Dsf//DwyE7WQziwuTB9GNBV"
756  "g6JqyzYRnOhIZqNtf7gT1Ef+i1pcc/yu2RsyGTirlzQUqpbS66McFAhJtrvlke+D"
757  "NusdVm/K2rxzY5Dkf3s+Iss9B+1fOHSc4wNQTqGvmO5h8oQ/Eg==";
758 
759 // kBadSessionExtraField is a custom serialized SSL_SESSION generated by replacing
760 // the final (optional) element of |kCustomSession| with tag number 99.
761 static const char kBadSessionExtraField[] =
762  "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
763  "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
764  "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
765  "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
766  "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
767  "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
768  "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
769  "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBOMDBAEF";
770 
771 // kBadSessionVersion is a custom serialized SSL_SESSION generated by replacing
772 // the version of |kCustomSession| with 2.
773 static const char kBadSessionVersion[] =
774  "MIIBdgIBAgICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
775  "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
776  "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
777  "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
778  "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
779  "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
780  "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
781  "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
782 
783 // kBadSessionTrailingData is a custom serialized SSL_SESSION with trailing data
784 // appended.
785 static const char kBadSessionTrailingData[] =
786  "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
787  "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
788  "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
789  "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
790  "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
791  "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
792  "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
793  "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEFAAAA";
794 
795 static bool DecodeBase64(std::vector<uint8_t> *out, const char *in) {
796  size_t len;
797  if (!EVP_DecodedLength(&len, strlen(in))) {
798  fprintf(stderr, "EVP_DecodedLength failed\n");
799  return false;
800  }
801 
802  out->resize(len);
803  if (!EVP_DecodeBase64(out->data(), &len, len, (const uint8_t *)in,
804  strlen(in))) {
805  fprintf(stderr, "EVP_DecodeBase64 failed\n");
806  return false;
807  }
808  out->resize(len);
809  return true;
810 }
811 
812 TEST(SSLTest, SessionEncoding) {
813  for (const char *input_b64 : {
817  }) {
818  SCOPED_TRACE(std::string(input_b64));
819  // Decode the input.
820  std::vector<uint8_t> input;
821  ASSERT_TRUE(DecodeBase64(&input, input_b64));
822 
823  // Verify the SSL_SESSION decodes.
824  bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
825  ASSERT_TRUE(ssl_ctx);
826  bssl::UniquePtr<SSL_SESSION> session(
827  SSL_SESSION_from_bytes(input.data(), input.size(), ssl_ctx.get()));
828  ASSERT_TRUE(session) << "SSL_SESSION_from_bytes failed";
829 
830  // Verify the SSL_SESSION encoding round-trips.
831  size_t encoded_len;
832  bssl::UniquePtr<uint8_t> encoded;
833  uint8_t *encoded_raw;
834  ASSERT_TRUE(SSL_SESSION_to_bytes(session.get(), &encoded_raw, &encoded_len))
835  << "SSL_SESSION_to_bytes failed";
836  encoded.reset(encoded_raw);
837  EXPECT_EQ(Bytes(encoded.get(), encoded_len), Bytes(input))
838  << "SSL_SESSION_to_bytes did not round-trip";
839 
840  // Verify the SSL_SESSION also decodes with the legacy API.
841  const uint8_t *cptr = input.data();
842  session.reset(d2i_SSL_SESSION(NULL, &cptr, input.size()));
843  ASSERT_TRUE(session) << "d2i_SSL_SESSION failed";
844  EXPECT_EQ(cptr, input.data() + input.size());
845 
846  // Verify the SSL_SESSION encoding round-trips via the legacy API.
847  int len = i2d_SSL_SESSION(session.get(), NULL);
848  ASSERT_GT(len, 0) << "i2d_SSL_SESSION failed";
849  ASSERT_EQ(static_cast<size_t>(len), input.size())
850  << "i2d_SSL_SESSION(NULL) returned invalid length";
851 
852  encoded.reset((uint8_t *)OPENSSL_malloc(input.size()));
853  ASSERT_TRUE(encoded);
854 
855  uint8_t *ptr = encoded.get();
856  len = i2d_SSL_SESSION(session.get(), &ptr);
857  ASSERT_GT(len, 0) << "i2d_SSL_SESSION failed";
858  ASSERT_EQ(static_cast<size_t>(len), input.size())
859  << "i2d_SSL_SESSION(NULL) returned invalid length";
860  ASSERT_EQ(ptr, encoded.get() + input.size())
861  << "i2d_SSL_SESSION did not advance ptr correctly";
862  EXPECT_EQ(Bytes(encoded.get(), encoded_len), Bytes(input))
863  << "SSL_SESSION_to_bytes did not round-trip";
864  }
865 
866  for (const char *input_b64 : {
870  }) {
871  SCOPED_TRACE(std::string(input_b64));
872  std::vector<uint8_t> input;
873  ASSERT_TRUE(DecodeBase64(&input, input_b64));
874 
875  // Verify that the SSL_SESSION fails to decode.
876  bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
877  ASSERT_TRUE(ssl_ctx);
878  bssl::UniquePtr<SSL_SESSION> session(
879  SSL_SESSION_from_bytes(input.data(), input.size(), ssl_ctx.get()));
880  EXPECT_FALSE(session) << "SSL_SESSION_from_bytes unexpectedly succeeded";
881  ERR_clear_error();
882  }
883 }
884 
885 static void ExpectDefaultVersion(uint16_t min_version, uint16_t max_version,
886  const SSL_METHOD *(*method)(void)) {
887  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(method()));
888  ASSERT_TRUE(ctx);
889  EXPECT_EQ(min_version, SSL_CTX_get_min_proto_version(ctx.get()));
890  EXPECT_EQ(max_version, SSL_CTX_get_max_proto_version(ctx.get()));
891 }
892 
893 TEST(SSLTest, DefaultVersion) {
901 }
902 
903 TEST(SSLTest, CipherProperties) {
904  static const struct {
905  int id;
906  const char *standard_name;
907  int cipher_nid;
908  int digest_nid;
909  int kx_nid;
910  int auth_nid;
911  int prf_nid;
912  } kTests[] = {
913  {
915  "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
917  NID_sha1,
918  NID_kx_rsa,
919  NID_auth_rsa,
920  NID_md5_sha1,
921  },
922  {
924  "TLS_RSA_WITH_AES_128_CBC_SHA",
926  NID_sha1,
927  NID_kx_rsa,
928  NID_auth_rsa,
929  NID_md5_sha1,
930  },
931  {
933  "TLS_PSK_WITH_AES_256_CBC_SHA",
935  NID_sha1,
936  NID_kx_psk,
937  NID_auth_psk,
938  NID_md5_sha1,
939  },
940  {
942  "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
944  NID_sha1,
945  NID_kx_ecdhe,
946  NID_auth_rsa,
947  NID_md5_sha1,
948  },
949  {
951  "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
953  NID_sha1,
954  NID_kx_ecdhe,
955  NID_auth_rsa,
956  NID_md5_sha1,
957  },
958  {
960  "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
962  NID_undef,
963  NID_kx_ecdhe,
964  NID_auth_rsa,
965  NID_sha256,
966  },
967  {
969  "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
971  NID_undef,
972  NID_kx_ecdhe,
974  NID_sha256,
975  },
976  {
978  "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
980  NID_undef,
981  NID_kx_ecdhe,
983  NID_sha384,
984  },
985  {
987  "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
989  NID_sha1,
990  NID_kx_ecdhe,
991  NID_auth_psk,
992  NID_md5_sha1,
993  },
994  {
996  "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
998  NID_undef,
999  NID_kx_ecdhe,
1000  NID_auth_rsa,
1001  NID_sha256,
1002  },
1003  {
1005  "TLS_AES_256_GCM_SHA384",
1007  NID_undef,
1008  NID_kx_any,
1009  NID_auth_any,
1010  NID_sha384,
1011  },
1012  {
1014  "TLS_AES_128_GCM_SHA256",
1016  NID_undef,
1017  NID_kx_any,
1018  NID_auth_any,
1019  NID_sha256,
1020  },
1021  {
1023  "TLS_CHACHA20_POLY1305_SHA256",
1025  NID_undef,
1026  NID_kx_any,
1027  NID_auth_any,
1028  NID_sha256,
1029  },
1030  };
1031 
1032  for (const auto &t : kTests) {
1033  SCOPED_TRACE(t.standard_name);
1034 
1035  const SSL_CIPHER *cipher = SSL_get_cipher_by_value(t.id & 0xffff);
1036  ASSERT_TRUE(cipher);
1037  EXPECT_STREQ(t.standard_name, SSL_CIPHER_standard_name(cipher));
1038 
1039  bssl::UniquePtr<char> rfc_name(SSL_CIPHER_get_rfc_name(cipher));
1040  ASSERT_TRUE(rfc_name);
1041  EXPECT_STREQ(t.standard_name, rfc_name.get());
1042 
1043  EXPECT_EQ(t.cipher_nid, SSL_CIPHER_get_cipher_nid(cipher));
1044  EXPECT_EQ(t.digest_nid, SSL_CIPHER_get_digest_nid(cipher));
1045  EXPECT_EQ(t.kx_nid, SSL_CIPHER_get_kx_nid(cipher));
1046  EXPECT_EQ(t.auth_nid, SSL_CIPHER_get_auth_nid(cipher));
1047  EXPECT_EQ(t.prf_nid, SSL_CIPHER_get_prf_nid(cipher));
1048  }
1049 }
1050 
1051 // CreateSessionWithTicket returns a sample |SSL_SESSION| with the specified
1052 // version and ticket length or nullptr on failure.
1053 static bssl::UniquePtr<SSL_SESSION> CreateSessionWithTicket(uint16_t version,
1054  size_t ticket_len) {
1055  std::vector<uint8_t> der;
1056  if (!DecodeBase64(&der, kOpenSSLSession)) {
1057  return nullptr;
1058  }
1059 
1060  bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
1061  if (!ssl_ctx) {
1062  return nullptr;
1063  }
1064  // Use a garbage ticket.
1065  std::vector<uint8_t> ticket(ticket_len, 'a');
1066  bssl::UniquePtr<SSL_SESSION> session(
1067  SSL_SESSION_from_bytes(der.data(), der.size(), ssl_ctx.get()));
1068  if (!session ||
1069  !SSL_SESSION_set_protocol_version(session.get(), version) ||
1070  !SSL_SESSION_set_ticket(session.get(), ticket.data(), ticket.size())) {
1071  return nullptr;
1072  }
1073  // Fix up the timeout.
1074 #if defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
1075  SSL_SESSION_set_time(session.get(), 1234);
1076 #else
1077  SSL_SESSION_set_time(session.get(), time(nullptr));
1078 #endif
1079  return session;
1080 }
1081 
1082 static bool GetClientHello(SSL *ssl, std::vector<uint8_t> *out) {
1083  bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
1084  if (!bio) {
1085  return false;
1086  }
1087  // Do not configure a reading BIO, but record what's written to a memory BIO.
1088  BIO_up_ref(bio.get());
1089  SSL_set_bio(ssl, nullptr /* rbio */, bio.get());
1090  int ret = SSL_connect(ssl);
1091  if (ret > 0) {
1092  // SSL_connect should fail without a BIO to write to.
1093  return false;
1094  }
1095  ERR_clear_error();
1096 
1097  const uint8_t *client_hello;
1098  size_t client_hello_len;
1099  if (!BIO_mem_contents(bio.get(), &client_hello, &client_hello_len)) {
1100  return false;
1101  }
1102  *out = std::vector<uint8_t>(client_hello, client_hello + client_hello_len);
1103  return true;
1104 }
1105 
1106 // GetClientHelloLen creates a client SSL connection with the specified version
1107 // and ticket length. It returns the length of the ClientHello, not including
1108 // the record header, on success and zero on error.
1109 static size_t GetClientHelloLen(uint16_t max_version, uint16_t session_version,
1110  size_t ticket_len) {
1111  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
1112  bssl::UniquePtr<SSL_SESSION> session =
1113  CreateSessionWithTicket(session_version, ticket_len);
1114  if (!ctx || !session) {
1115  return 0;
1116  }
1117 
1118  // Set a one-element cipher list so the baseline ClientHello is unpadded.
1119  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
1120  if (!ssl || !SSL_set_session(ssl.get(), session.get()) ||
1121  !SSL_set_strict_cipher_list(ssl.get(), "ECDHE-RSA-AES128-GCM-SHA256") ||
1122  !SSL_set_max_proto_version(ssl.get(), max_version)) {
1123  return 0;
1124  }
1125 
1126  std::vector<uint8_t> client_hello;
1127  if (!GetClientHello(ssl.get(), &client_hello) ||
1128  client_hello.size() <= SSL3_RT_HEADER_LENGTH) {
1129  return 0;
1130  }
1131 
1132  return client_hello.size() - SSL3_RT_HEADER_LENGTH;
1133 }
1134 
1135 TEST(SSLTest, Padding) {
1136  struct PaddingVersions {
1137  uint16_t max_version, session_version;
1138  };
1139  static const PaddingVersions kPaddingVersions[] = {
1140  // Test the padding extension at TLS 1.2.
1142  // Test the padding extension at TLS 1.3 with a TLS 1.2 session, so there
1143  // will be no PSK binder after the padding extension.
1145  // Test the padding extension at TLS 1.3 with a TLS 1.3 session, so there
1146  // will be a PSK binder after the padding extension.
1148 
1149  };
1150 
1151  struct PaddingTest {
1152  size_t input_len, padded_len;
1153  };
1154  static const PaddingTest kPaddingTests[] = {
1155  // ClientHellos of length below 0x100 do not require padding.
1156  {0xfe, 0xfe},
1157  {0xff, 0xff},
1158  // ClientHellos of length 0x100 through 0x1fb are padded up to 0x200.
1159  {0x100, 0x200},
1160  {0x123, 0x200},
1161  {0x1fb, 0x200},
1162  // ClientHellos of length 0x1fc through 0x1ff get padded beyond 0x200. The
1163  // padding extension takes a minimum of four bytes plus one required
1164  // content
1165  // byte. (To work around yet more server bugs, we avoid empty final
1166  // extensions.)
1167  {0x1fc, 0x201},
1168  {0x1fd, 0x202},
1169  {0x1fe, 0x203},
1170  {0x1ff, 0x204},
1171  // Finally, larger ClientHellos need no padding.
1172  {0x200, 0x200},
1173  {0x201, 0x201},
1174  };
1175 
1176  for (const PaddingVersions &versions : kPaddingVersions) {
1177  SCOPED_TRACE(versions.max_version);
1178  SCOPED_TRACE(versions.session_version);
1179 
1180  // Sample a baseline length.
1181  size_t base_len =
1182  GetClientHelloLen(versions.max_version, versions.session_version, 1);
1183  ASSERT_NE(base_len, 0u) << "Baseline length could not be sampled";
1184 
1185  for (const PaddingTest &test : kPaddingTests) {
1186  SCOPED_TRACE(test.input_len);
1187  ASSERT_LE(base_len, test.input_len) << "Baseline ClientHello too long";
1188 
1189  size_t padded_len =
1190  GetClientHelloLen(versions.max_version, versions.session_version,
1191  1 + test.input_len - base_len);
1192  EXPECT_EQ(padded_len, test.padded_len)
1193  << "ClientHello was not padded to expected length";
1194  }
1195  }
1196 }
1197 
1198 static bssl::UniquePtr<X509> CertFromPEM(const char *pem) {
1199  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
1200  if (!bio) {
1201  return nullptr;
1202  }
1203  return bssl::UniquePtr<X509>(
1204  PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
1205 }
1206 
1207 static bssl::UniquePtr<EVP_PKEY> KeyFromPEM(const char *pem) {
1208  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
1209  if (!bio) {
1210  return nullptr;
1211  }
1212  return bssl::UniquePtr<EVP_PKEY>(
1213  PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
1214 }
1215 
1216 static bssl::UniquePtr<X509> GetTestCertificate() {
1217  static const char kCertPEM[] =
1218  "-----BEGIN CERTIFICATE-----\n"
1219  "MIICWDCCAcGgAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\n"
1220  "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n"
1221  "aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBF\n"
1222  "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n"
1223  "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n"
1224  "gQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLci\n"
1225  "HnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfV\n"
1226  "W28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo1AwTjAdBgNV\n"
1227  "HQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4f\n"
1228  "Zbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQA76Hht\n"
1229  "ldY9avcTGSwbwoiuIqv0jTL1fHFnzy3RHMLDh+Lpvolc5DSrSJHCP5WuK0eeJXhr\n"
1230  "T5oQpHL9z/cCDLAKCKRa4uV0fhEdOWBqyR9p8y5jJtye72t6CuFUV5iqcpF4BH4f\n"
1231  "j2VNHwsSrJwkD4QUGlUtH7vwnQmyCFxZMmWAJg==\n"
1232  "-----END CERTIFICATE-----\n";
1233  return CertFromPEM(kCertPEM);
1234 }
1235 
1236 static bssl::UniquePtr<EVP_PKEY> GetTestKey() {
1237  static const char kKeyPEM[] =
1238  "-----BEGIN RSA PRIVATE KEY-----\n"
1239  "MIICXgIBAAKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92\n"
1240  "kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiF\n"
1241  "KKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQAB\n"
1242  "AoGBAIBy09Fd4DOq/Ijp8HeKuCMKTHqTW1xGHshLQ6jwVV2vWZIn9aIgmDsvkjCe\n"
1243  "i6ssZvnbjVcwzSoByhjN8ZCf/i15HECWDFFh6gt0P5z0MnChwzZmvatV/FXCT0j+\n"
1244  "WmGNB/gkehKjGXLLcjTb6dRYVJSCZhVuOLLcbWIV10gggJQBAkEA8S8sGe4ezyyZ\n"
1245  "m4e9r95g6s43kPqtj5rewTsUxt+2n4eVodD+ZUlCULWVNAFLkYRTBCASlSrm9Xhj\n"
1246  "QpmWAHJUkQJBAOVzQdFUaewLtdOJoPCtpYoY1zd22eae8TQEmpGOR11L6kbxLQsk\n"
1247  "aMly/DOnOaa82tqAGTdqDEZgSNmCeKKknmECQAvpnY8GUOVAubGR6c+W90iBuQLj\n"
1248  "LtFp/9ihd2w/PoDwrHZaoUYVcT4VSfJQog/k7kjE4MYXYWL8eEKg3WTWQNECQQDk\n"
1249  "104Wi91Umd1PzF0ijd2jXOERJU1wEKe6XLkYYNHWQAe5l4J4MWj9OdxFXAxIuuR/\n"
1250  "tfDwbqkta4xcux67//khAkEAvvRXLHTaa6VFzTaiiO8SaFsHV3lQyXOtMrBpB5jd\n"
1251  "moZWgjHvB2W9Ckn7sDqsPB+U2tyX0joDdQEyuiMECDY8oQ==\n"
1252  "-----END RSA PRIVATE KEY-----\n";
1253  return KeyFromPEM(kKeyPEM);
1254 }
1255 
1256 static bssl::UniquePtr<SSL_CTX> CreateContextWithTestCertificate(
1257  const SSL_METHOD *method) {
1258  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
1259  bssl::UniquePtr<X509> cert = GetTestCertificate();
1260  bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
1261  if (!ctx || !cert || !key ||
1262  !SSL_CTX_use_certificate(ctx.get(), cert.get()) ||
1263  !SSL_CTX_use_PrivateKey(ctx.get(), key.get())) {
1264  return nullptr;
1265  }
1266  return ctx;
1267 }
1268 
1269 static bssl::UniquePtr<X509> GetECDSATestCertificate() {
1270  static const char kCertPEM[] =
1271  "-----BEGIN CERTIFICATE-----\n"
1272  "MIIBzzCCAXagAwIBAgIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC\n"
1273  "QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp\n"
1274  "dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ\n"
1275  "BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l\n"
1276  "dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni\n"
1277  "v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa\n"
1278  "HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw\n"
1279  "HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ\n"
1280  "BgcqhkjOPQQBA0gAMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E\n"
1281  "BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQ=\n"
1282  "-----END CERTIFICATE-----\n";
1283  return CertFromPEM(kCertPEM);
1284 }
1285 
1286 static bssl::UniquePtr<EVP_PKEY> GetECDSATestKey() {
1287  static const char kKeyPEM[] =
1288  "-----BEGIN PRIVATE KEY-----\n"
1289  "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBw8IcnrUoEqc3VnJ\n"
1290  "TYlodwi1b8ldMHcO6NHJzgqLtGqhRANCAATmK2niv2Wfl74vHg2UikzVl2u3qR4N\n"
1291  "Rvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYaHPUdfvGULUvPciLB\n"
1292  "-----END PRIVATE KEY-----\n";
1293  return KeyFromPEM(kKeyPEM);
1294 }
1295 
1296 static bssl::UniquePtr<CRYPTO_BUFFER> BufferFromPEM(const char *pem) {
1297  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
1298  char *name, *header;
1299  uint8_t *data;
1300  long data_len;
1301  if (!PEM_read_bio(bio.get(), &name, &header, &data,
1302  &data_len)) {
1303  return nullptr;
1304  }
1305  OPENSSL_free(name);
1307 
1308  auto ret = bssl::UniquePtr<CRYPTO_BUFFER>(
1309  CRYPTO_BUFFER_new(data, data_len, nullptr));
1310  OPENSSL_free(data);
1311  return ret;
1312 }
1313 
1314 static bssl::UniquePtr<CRYPTO_BUFFER> GetChainTestCertificateBuffer() {
1315  static const char kCertPEM[] =
1316  "-----BEGIN CERTIFICATE-----\n"
1317  "MIIC0jCCAbqgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UEAwwEQiBD\n"
1318  "QTAeFw0xNjAyMjgyMDI3MDNaFw0yNjAyMjUyMDI3MDNaMBgxFjAUBgNVBAMMDUNs\n"
1319  "aWVudCBDZXJ0IEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRvaz8\n"
1320  "CC/cshpCafJo4jLkHEoBqDLhdgFelJoAiQUyIqyWl2O7YHPnpJH+TgR7oelzNzt/\n"
1321  "kLRcH89M/TszB6zqyLTC4aqmvzKL0peD/jL2LWBucR0WXIvjA3zoRuF/x86+rYH3\n"
1322  "tHb+xs2PSs8EGL/Ev+ss+qTzTGEn26fuGNHkNw6tOwPpc+o8+wUtzf/kAthamo+c\n"
1323  "IDs2rQ+lP7+aLZTLeU/q4gcLutlzcK5imex5xy2jPkweq48kijK0kIzl1cPlA5d1\n"
1324  "z7C8jU50Pj9X9sQDJTN32j7UYRisJeeYQF8GaaN8SbrDI6zHgKzrRLyxDt/KQa9V\n"
1325  "iLeXANgZi+Xx9KgfAgMBAAGjLzAtMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYwFAYI\n"
1326  "KwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBFEVbmYl+2RtNw\n"
1327  "rDftRDF1v2QUbcN2ouSnQDHxeDQdSgasLzT3ui8iYu0Rw2WWcZ0DV5e0ztGPhWq7\n"
1328  "AO0B120aFRMOY+4+bzu9Q2FFkQqc7/fKTvTDzIJI5wrMnFvUfzzvxh3OHWMYSs/w\n"
1329  "giq33hTKeHEq6Jyk3btCny0Ycecyc3yGXH10sizUfiHlhviCkDuESk8mFDwDDzqW\n"
1330  "ZF0IipzFbEDHoIxLlm3GQxpiLoEV4k8KYJp3R5KBLFyxM6UGPz8h72mIPCJp2RuK\n"
1331  "MYgF91UDvVzvnYm6TfseM2+ewKirC00GOrZ7rEcFvtxnKSqYf4ckqfNdSU1Y+RRC\n"
1332  "1ngWZ7Ih\n"
1333  "-----END CERTIFICATE-----\n";
1334  return BufferFromPEM(kCertPEM);
1335 }
1336 
1337 static bssl::UniquePtr<X509> X509FromBuffer(
1338  bssl::UniquePtr<CRYPTO_BUFFER> buffer) {
1339  if (!buffer) {
1340  return nullptr;
1341  }
1342  const uint8_t *derp = CRYPTO_BUFFER_data(buffer.get());
1343  return bssl::UniquePtr<X509>(
1344  d2i_X509(NULL, &derp, CRYPTO_BUFFER_len(buffer.get())));
1345 }
1346 
1347 static bssl::UniquePtr<X509> GetChainTestCertificate() {
1349 }
1350 
1351 static bssl::UniquePtr<CRYPTO_BUFFER> GetChainTestIntermediateBuffer() {
1352  static const char kCertPEM[] =
1353  "-----BEGIN CERTIFICATE-----\n"
1354  "MIICwjCCAaqgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwFDESMBAGA1UEAwwJQyBS\n"
1355  "b290IENBMB4XDTE2MDIyODIwMjcwM1oXDTI2MDIyNTIwMjcwM1owDzENMAsGA1UE\n"
1356  "AwwEQiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALsSCYmDip2D\n"
1357  "GkjFxw7ykz26JSjELkl6ArlYjFJ3aT/SCh8qbS4gln7RH8CPBd78oFdfhIKQrwtZ\n"
1358  "3/q21ykD9BAS3qHe2YdcJfm8/kWAy5DvXk6NXU4qX334KofBAEpgdA/igEFq1P1l\n"
1359  "HAuIfZCpMRfT+i5WohVsGi8f/NgpRvVaMONLNfgw57mz1lbtFeBEISmX0kbsuJxF\n"
1360  "Qj/Bwhi5/0HAEXG8e7zN4cEx0yPRvmOATRdVb/8dW2pwOHRJq9R5M0NUkIsTSnL7\n"
1361  "6N/z8hRAHMsV3IudC5Yd7GXW1AGu9a+iKU+Q4xcZCoj0DC99tL4VKujrV1kAeqsM\n"
1362  "cz5/dKzi6+cCAwEAAaMjMCEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
1363  "AQYwDQYJKoZIhvcNAQELBQADggEBAIIeZiEeNhWWQ8Y4D+AGDwqUUeG8NjCbKrXQ\n"
1364  "BlHg5wZ8xftFaiP1Dp/UAezmx2LNazdmuwrYB8lm3FVTyaPDTKEGIPS4wJKHgqH1\n"
1365  "QPDhqNm85ey7TEtI9oYjsNim/Rb+iGkIAMXaxt58SzxbjvP0kMr1JfJIZbic9vye\n"
1366  "NwIspMFIpP3FB8ywyu0T0hWtCQgL4J47nigCHpOu58deP88fS/Nyz/fyGVWOZ76b\n"
1367  "WhWwgM3P3X95fQ3d7oFPR/bVh0YV+Cf861INwplokXgXQ3/TCQ+HNXeAMWn3JLWv\n"
1368  "XFwk8owk9dq/kQGdndGgy3KTEW4ctPX5GNhf3LJ9Q7dLji4ReQ4=\n"
1369  "-----END CERTIFICATE-----\n";
1370  return BufferFromPEM(kCertPEM);
1371 }
1372 
1373 static bssl::UniquePtr<X509> GetChainTestIntermediate() {
1375 }
1376 
1377 static bssl::UniquePtr<EVP_PKEY> GetChainTestKey() {
1378  static const char kKeyPEM[] =
1379  "-----BEGIN PRIVATE KEY-----\n"
1380  "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRvaz8CC/cshpC\n"
1381  "afJo4jLkHEoBqDLhdgFelJoAiQUyIqyWl2O7YHPnpJH+TgR7oelzNzt/kLRcH89M\n"
1382  "/TszB6zqyLTC4aqmvzKL0peD/jL2LWBucR0WXIvjA3zoRuF/x86+rYH3tHb+xs2P\n"
1383  "Ss8EGL/Ev+ss+qTzTGEn26fuGNHkNw6tOwPpc+o8+wUtzf/kAthamo+cIDs2rQ+l\n"
1384  "P7+aLZTLeU/q4gcLutlzcK5imex5xy2jPkweq48kijK0kIzl1cPlA5d1z7C8jU50\n"
1385  "Pj9X9sQDJTN32j7UYRisJeeYQF8GaaN8SbrDI6zHgKzrRLyxDt/KQa9ViLeXANgZ\n"
1386  "i+Xx9KgfAgMBAAECggEBAK0VjSJzkyPaamcyTVSWjo7GdaBGcK60lk657RjR+lK0\n"
1387  "YJ7pkej4oM2hdsVZFsP8Cs4E33nXLa/0pDsRov/qrp0WQm2skwqGMC1I/bZ0WRPk\n"
1388  "wHaDrBBfESWnJDX/AGpVtlyOjPmgmK6J2usMPihQUDkKdAYrVWJePrMIxt1q6BMe\n"
1389  "iczs3qriMmtY3bUc4UyUwJ5fhDLjshHvfuIpYQyI6EXZM6dZksn9LylXJnigY6QJ\n"
1390  "HxOYO0BDwOsZ8yQ8J8afLk88i0GizEkgE1z3REtQUwgWfxr1WV/ud+T6/ZhSAgH9\n"
1391  "042mQvSFZnIUSEsmCvjhWuAunfxHKCTcAoYISWfzWpkCgYEA7gpf3HHU5Tn+CgUn\n"
1392  "1X5uGpG3DmcMgfeGgs2r2f/IIg/5Ac1dfYILiybL1tN9zbyLCJfcbFpWBc9hJL6f\n"
1393  "CPc5hUiwWFJqBJewxQkC1Ae/HakHbip+IZ+Jr0842O4BAArvixk4Lb7/N2Ct9sTE\n"
1394  "NJO6RtK9lbEZ5uK61DglHy8CS2UCgYEA4ZC1o36kPAMQBggajgnucb2yuUEelk0f\n"
1395  "AEr+GI32MGE+93xMr7rAhBoqLg4AITyIfEnOSQ5HwagnIHonBbv1LV/Gf9ursx8Z\n"
1396  "YOGbvT8zzzC+SU1bkDzdjAYnFQVGIjMtKOBJ3K07++ypwX1fr4QsQ8uKL8WSOWwt\n"
1397  "Z3Bym6XiZzMCgYADnhy+2OwHX85AkLt+PyGlPbmuelpyTzS4IDAQbBa6jcuW/2wA\n"
1398  "UE2km75VUXmD+u2R/9zVuLm99NzhFhSMqlUxdV1YukfqMfP5yp1EY6m/5aW7QuIP\n"
1399  "2MDa7TVL9rIFMiVZ09RKvbBbQxjhuzPQKL6X/PPspnhiTefQ+dl2k9xREQKBgHDS\n"
1400  "fMfGNEeAEKezrfSVqxphE9/tXms3L+ZpnCaT+yu/uEr5dTIAawKoQ6i9f/sf1/Sy\n"
1401  "xedsqR+IB+oKrzIDDWMgoJybN4pkZ8E5lzhVQIjFjKgFdWLzzqyW9z1gYfABQPlN\n"
1402  "FiS20WX0vgP1vcKAjdNrHzc9zyHBpgQzDmAj3NZZAoGBAI8vKCKdH7w3aL5CNkZQ\n"
1403  "2buIeWNA2HZazVwAGG5F2TU/LmXfRKnG6dX5bkU+AkBZh56jNZy//hfFSewJB4Kk\n"
1404  "buB7ERSdaNbO21zXt9FEA3+z0RfMd/Zv2vlIWOSB5nzl/7UKti3sribK6s9ZVLfi\n"
1405  "SxpiPQ8d/hmSGwn4ksrWUsJD\n"
1406  "-----END PRIVATE KEY-----\n";
1407  return KeyFromPEM(kKeyPEM);
1408 }
1409 
1411  // Drive both their handshakes to completion.
1412  for (;;) {
1413  int client_ret = SSL_do_handshake(client);
1414  int client_err = SSL_get_error(client, client_ret);
1415  if (client_err != SSL_ERROR_NONE &&
1416  client_err != SSL_ERROR_WANT_READ &&
1417  client_err != SSL_ERROR_WANT_WRITE &&
1418  client_err != SSL_ERROR_PENDING_TICKET) {
1419  fprintf(stderr, "Client error: %s\n", SSL_error_description(client_err));
1420  return false;
1421  }
1422 
1423  int server_ret = SSL_do_handshake(server);
1424  int server_err = SSL_get_error(server, server_ret);
1425  if (server_err != SSL_ERROR_NONE &&
1426  server_err != SSL_ERROR_WANT_READ &&
1427  server_err != SSL_ERROR_WANT_WRITE &&
1428  server_err != SSL_ERROR_PENDING_TICKET) {
1429  fprintf(stderr, "Server error: %s\n", SSL_error_description(server_err));
1430  return false;
1431  }
1432 
1433  if (client_ret == 1 && server_ret == 1) {
1434  break;
1435  }
1436  }
1437 
1438  return true;
1439 }
1440 
1442  // NewSessionTickets are deferred on the server to |SSL_write|, and clients do
1443  // not pick them up until |SSL_read|.
1444  for (;;) {
1445  int server_ret = SSL_write(server, nullptr, 0);
1446  int server_err = SSL_get_error(server, server_ret);
1447  // The server may either succeed (|server_ret| is zero) or block on write
1448  // (|server_ret| is -1 and |server_err| is |SSL_ERROR_WANT_WRITE|).
1449  if (server_ret > 0 ||
1450  (server_ret < 0 && server_err != SSL_ERROR_WANT_WRITE)) {
1451  fprintf(stderr, "Unexpected server result: %d %d\n", server_ret,
1452  server_err);
1453  return false;
1454  }
1455 
1456  int client_ret = SSL_read(client, nullptr, 0);
1457  int client_err = SSL_get_error(client, client_ret);
1458  // The client must always block on read.
1459  if (client_ret != -1 || client_err != SSL_ERROR_WANT_READ) {
1460  fprintf(stderr, "Unexpected client result: %d %d\n", client_ret,
1461  client_err);
1462  return false;
1463  }
1464 
1465  // The server flushed everything it had to write.
1466  if (server_ret == 0) {
1467  return true;
1468  }
1469  }
1470 }
1471 
1472 // CreateClientAndServer creates a client and server |SSL| objects whose |BIO|s
1473 // are paired with each other. It does not run the handshake. The caller is
1474 // expected to configure the objects and drive the handshake as needed.
1475 static bool CreateClientAndServer(bssl::UniquePtr<SSL> *out_client,
1476  bssl::UniquePtr<SSL> *out_server,
1478  bssl::UniquePtr<SSL> client(SSL_new(client_ctx)), server(SSL_new(server_ctx));
1479  if (!client || !server) {
1480  return false;
1481  }
1484 
1485  BIO *bio1, *bio2;
1486  if (!BIO_new_bio_pair(&bio1, 0, &bio2, 0)) {
1487  return false;
1488  }
1489  // SSL_set_bio takes ownership.
1490  SSL_set_bio(client.get(), bio1, bio1);
1491  SSL_set_bio(server.get(), bio2, bio2);
1492 
1493  *out_client = std::move(client);
1494  *out_server = std::move(server);
1495  return true;
1496 }
1497 
1499  SSL_SESSION *session = nullptr;
1501  bool early_data = false;
1502 };
1503 
1504 static bool ConnectClientAndServer(bssl::UniquePtr<SSL> *out_client,
1505  bssl::UniquePtr<SSL> *out_server,
1507  const ClientConfig &config = ClientConfig(),
1508  bool shed_handshake_config = true) {
1509  bssl::UniquePtr<SSL> client, server;
1511  return false;
1512  }
1513  if (config.early_data) {
1515  }
1516  if (config.session) {
1517  SSL_set_session(client.get(), config.session);
1518  }
1519  if (!config.servername.empty() &&
1520  !SSL_set_tlsext_host_name(client.get(), config.servername.c_str())) {
1521  return false;
1522  }
1523 
1524  SSL_set_shed_handshake_config(client.get(), shed_handshake_config);
1525  SSL_set_shed_handshake_config(server.get(), shed_handshake_config);
1526 
1527  if (!CompleteHandshakes(client.get(), server.get())) {
1528  return false;
1529  }
1530 
1531  *out_client = std::move(client);
1532  *out_server = std::move(server);
1533  return true;
1534 }
1535 
1536 static bssl::UniquePtr<SSL_SESSION> g_last_session;
1537 
1538 static int SaveLastSession(SSL *ssl, SSL_SESSION *session) {
1539  // Save the most recent session.
1540  g_last_session.reset(session);
1541  return 1;
1542 }
1543 
1544 static bssl::UniquePtr<SSL_SESSION> CreateClientSession(
1546  const ClientConfig &config = ClientConfig()) {
1547  g_last_session = nullptr;
1549 
1550  // Connect client and server to get a session.
1551  bssl::UniquePtr<SSL> client, server;
1553  config) ||
1554  !FlushNewSessionTickets(client.get(), server.get())) {
1555  fprintf(stderr, "Failed to connect client and server.\n");
1556  return nullptr;
1557  }
1558 
1560 
1561  if (!g_last_session) {
1562  fprintf(stderr, "Client did not receive a session.\n");
1563  return nullptr;
1564  }
1565  return std::move(g_last_session);
1566 }
1567 
1568 // Test that |SSL_get_client_CA_list| echoes back the configured parameter even
1569 // before configuring as a server.
1570 TEST(SSLTest, ClientCAList) {
1571  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
1572  ASSERT_TRUE(ctx);
1573  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
1574  ASSERT_TRUE(ssl);
1575 
1576  bssl::UniquePtr<X509_NAME> name(X509_NAME_new());
1577  ASSERT_TRUE(name);
1578 
1579  bssl::UniquePtr<X509_NAME> name_dup(X509_NAME_dup(name.get()));
1580  ASSERT_TRUE(name_dup);
1581 
1583  ASSERT_TRUE(stack);
1584  ASSERT_TRUE(PushToStack(stack.get(), std::move(name_dup)));
1585 
1586  // |SSL_set_client_CA_list| takes ownership.
1587  SSL_set_client_CA_list(ssl.get(), stack.release());
1588 
1591  ASSERT_EQ(1u, sk_X509_NAME_num(result));
1592  EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(result, 0), name.get()));
1593 }
1594 
1595 TEST(SSLTest, AddClientCA) {
1596  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
1597  ASSERT_TRUE(ctx);
1598  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
1599  ASSERT_TRUE(ssl);
1600 
1601  bssl::UniquePtr<X509> cert1 = GetTestCertificate();
1602  bssl::UniquePtr<X509> cert2 = GetChainTestCertificate();
1603  ASSERT_TRUE(cert1 && cert2);
1604  X509_NAME *name1 = X509_get_subject_name(cert1.get());
1605  X509_NAME *name2 = X509_get_subject_name(cert2.get());
1606 
1607  EXPECT_EQ(0u, sk_X509_NAME_num(SSL_get_client_CA_list(ssl.get())));
1608 
1609  ASSERT_TRUE(SSL_add_client_CA(ssl.get(), cert1.get()));
1610  ASSERT_TRUE(SSL_add_client_CA(ssl.get(), cert2.get()));
1611 
1612  STACK_OF(X509_NAME) *list = SSL_get_client_CA_list(ssl.get());
1613  ASSERT_EQ(2u, sk_X509_NAME_num(list));
1614  EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 0), name1));
1615  EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 1), name2));
1616 
1617  ASSERT_TRUE(SSL_add_client_CA(ssl.get(), cert1.get()));
1618 
1619  list = SSL_get_client_CA_list(ssl.get());
1620  ASSERT_EQ(3u, sk_X509_NAME_num(list));
1621  EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 0), name1));
1622  EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 1), name2));
1623  EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 2), name1));
1624 }
1625 
1628  uint16_t config_id = 1;
1629  std::string public_name = "example.com";
1630  const EVP_HPKE_KEY *key = nullptr;
1631  // kem_id, if zero, takes its value from |key|.
1632  uint16_t kem_id = 0;
1633  // public_key, if empty takes its value from |key|.
1634  std::vector<uint8_t> public_key;
1635  size_t max_name_len = 16;
1636  // cipher_suites is a list of code points which should contain pairs of KDF
1637  // and AEAD IDs.
1638  std::vector<uint16_t> cipher_suites = {EVP_HPKE_HKDF_SHA256,
1640  std::vector<uint8_t> extensions;
1641 };
1642 
1643 // MakeECHConfig serializes an ECHConfig from |params| and writes it to
1644 // |*out|.
1645 bool MakeECHConfig(std::vector<uint8_t> *out,
1646  const ECHConfigParams &params) {
1647  uint16_t kem_id = params.kem_id == 0
1649  : params.kem_id;
1650  std::vector<uint8_t> public_key = params.public_key;
1651  if (public_key.empty()) {
1653  size_t len;
1654  if (!EVP_HPKE_KEY_public_key(params.key, public_key.data(), &len,
1655  public_key.size())) {
1656  return false;
1657  }
1658  public_key.resize(len);
1659  }
1660 
1661  bssl::ScopedCBB cbb;
1662  CBB contents, child;
1663  if (!CBB_init(cbb.get(), 64) ||
1664  !CBB_add_u16(cbb.get(), params.version) ||
1665  !CBB_add_u16_length_prefixed(cbb.get(), &contents) ||
1666  !CBB_add_u8(&contents, params.config_id) ||
1667  !CBB_add_u16(&contents, kem_id) ||
1669  !CBB_add_bytes(&child, public_key.data(), public_key.size()) ||
1671  return false;
1672  }
1673  for (uint16_t cipher_suite : params.cipher_suites) {
1674  if (!CBB_add_u16(&child, cipher_suite)) {
1675  return false;
1676  }
1677  }
1678  if (!CBB_add_u8(&contents, params.max_name_len) ||
1680  !CBB_add_bytes(
1681  &child, reinterpret_cast<const uint8_t *>(params.public_name.data()),
1682  params.public_name.size()) ||
1684  !CBB_add_bytes(&child, params.extensions.data(),
1685  params.extensions.size()) ||
1686  !CBB_flush(cbb.get())) {
1687  return false;
1688  }
1689 
1690  out->assign(CBB_data(cbb.get()), CBB_data(cbb.get()) + CBB_len(cbb.get()));
1691  return true;
1692 }
1693 
1694 static bssl::UniquePtr<SSL_ECH_KEYS> MakeTestECHKeys(uint8_t config_id = 1) {
1696  uint8_t *ech_config;
1697  size_t ech_config_len;
1699  !SSL_marshal_ech_config(&ech_config, &ech_config_len, config_id,
1700  key.get(), "public.example", 16)) {
1701  return nullptr;
1702  }
1703  bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1704 
1705  // Install a non-retry config.
1706  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
1707  if (!keys || !SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1, ech_config,
1708  ech_config_len, key.get())) {
1709  return nullptr;
1710  }
1711  return keys;
1712 }
1713 
1715  uint8_t *ech_config_list;
1716  size_t ech_config_list_len;
1717  if (!SSL_ECH_KEYS_marshal_retry_configs(keys, &ech_config_list,
1718  &ech_config_list_len)) {
1719  return false;
1720  }
1721  bssl::UniquePtr<uint8_t> free_ech_config_list(ech_config_list);
1722  return SSL_set1_ech_config_list(client, ech_config_list, ech_config_list_len);
1723 }
1724 
1725 // Test that |SSL_marshal_ech_config| and |SSL_ECH_KEYS_marshal_retry_configs|
1726 // output values as expected.
1727 TEST(SSLTest, MarshalECHConfig) {
1728  static const uint8_t kPrivateKey[X25519_PRIVATE_KEY_LEN] = {
1729  0xbc, 0xb5, 0x51, 0x29, 0x31, 0x10, 0x30, 0xc9, 0xed, 0x26, 0xde,
1730  0xd4, 0xb3, 0xdf, 0x3a, 0xce, 0x06, 0x8a, 0xee, 0x17, 0xab, 0xce,
1731  0xd7, 0xdb, 0xf3, 0x11, 0xe5, 0xa8, 0xf3, 0xb1, 0x8e, 0x24};
1734  kPrivateKey, sizeof(kPrivateKey)));
1735 
1736  static const uint8_t kECHConfig[] = {
1737  // version
1738  0xfe, 0x0d,
1739  // length
1740  0x00, 0x41,
1741  // contents.config_id
1742  0x01,
1743  // contents.kem_id
1744  0x00, 0x20,
1745  // contents.public_key
1746  0x00, 0x20, 0xa6, 0x9a, 0x41, 0x48, 0x5d, 0x32, 0x96, 0xa4, 0xe0, 0xc3,
1747  0x6a, 0xee, 0xf6, 0x63, 0x0f, 0x59, 0x32, 0x6f, 0xdc, 0xff, 0x81, 0x29,
1748  0x59, 0xa5, 0x85, 0xd3, 0x9b, 0x3b, 0xde, 0x98, 0x55, 0x5c,
1749  // contents.cipher_suites
1750  0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03,
1751  // contents.maximum_name_length
1752  0x10,
1753  // contents.public_name
1754  0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x61, 0x6d,
1755  0x70, 0x6c, 0x65,
1756  // contents.extensions
1757  0x00, 0x00};
1758  uint8_t *ech_config;
1759  size_t ech_config_len;
1760  ASSERT_TRUE(SSL_marshal_ech_config(&ech_config, &ech_config_len,
1761  /*config_id=*/1, key.get(),
1762  "public.example", 16));
1763  bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1764  EXPECT_EQ(Bytes(kECHConfig), Bytes(ech_config, ech_config_len));
1765 
1766  // Generate a second ECHConfig.
1769  uint8_t *ech_config2;
1770  size_t ech_config2_len;
1771  ASSERT_TRUE(SSL_marshal_ech_config(&ech_config2, &ech_config2_len,
1772  /*config_id=*/2, key2.get(),
1773  "public.example", 16));
1774  bssl::UniquePtr<uint8_t> free_ech_config2(ech_config2);
1775 
1776  // Install both ECHConfigs in an |SSL_ECH_KEYS|.
1777  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
1778  ASSERT_TRUE(keys);
1779  ASSERT_TRUE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1, ech_config,
1780  ech_config_len, key.get()));
1781  ASSERT_TRUE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1, ech_config2,
1782  ech_config2_len, key2.get()));
1783 
1784  // The ECHConfigList should be correctly serialized.
1785  uint8_t *ech_config_list;
1786  size_t ech_config_list_len;
1787  ASSERT_TRUE(SSL_ECH_KEYS_marshal_retry_configs(keys.get(), &ech_config_list,
1788  &ech_config_list_len));
1789  bssl::UniquePtr<uint8_t> free_ech_config_list(ech_config_list);
1790 
1791  // ECHConfigList is just the concatenation with a length prefix.
1792  size_t len = ech_config_len + ech_config2_len;
1793  std::vector<uint8_t> expected = {uint8_t(len >> 8), uint8_t(len)};
1794  expected.insert(expected.end(), ech_config, ech_config + ech_config_len);
1795  expected.insert(expected.end(), ech_config2, ech_config2 + ech_config2_len);
1796  EXPECT_EQ(Bytes(expected), Bytes(ech_config_list, ech_config_list_len));
1797 }
1798 
1799 TEST(SSLTest, ECHHasDuplicateConfigID) {
1800  const struct {
1801  std::vector<uint8_t> ids;
1802  bool has_duplicate;
1803  } kTests[] = {
1804  {{}, false},
1805  {{1}, false},
1806  {{1, 2, 3, 255}, false},
1807  {{1, 2, 3, 1}, true},
1808  };
1809  for (const auto &test : kTests) {
1810  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
1811  ASSERT_TRUE(keys);
1812  for (const uint8_t id : test.ids) {
1814  ASSERT_TRUE(
1816  uint8_t *ech_config;
1817  size_t ech_config_len;
1818  ASSERT_TRUE(SSL_marshal_ech_config(&ech_config, &ech_config_len, id,
1819  key.get(), "public.example", 16));
1820  bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1821  ASSERT_TRUE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1822  ech_config, ech_config_len, key.get()));
1823  }
1824 
1825  EXPECT_EQ(test.has_duplicate ? 1 : 0,
1827  }
1828 }
1829 
1830 // Test that |SSL_ECH_KEYS_add| checks consistency between the public and
1831 // private key.
1832 TEST(SSLTest, ECHKeyConsistency) {
1833  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
1834  ASSERT_TRUE(keys);
1838  size_t public_key_len;
1839  ASSERT_TRUE(EVP_HPKE_KEY_public_key(key.get(), public_key, &public_key_len,
1840  sizeof(public_key)));
1841 
1842  // Adding an ECHConfig with the matching public key succeeds.
1843  ECHConfigParams params;
1844  params.key = key.get();
1845  std::vector<uint8_t> ech_config;
1846  ASSERT_TRUE(MakeECHConfig(&ech_config, params));
1847  EXPECT_TRUE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1848  ech_config.data(), ech_config.size(),
1849  key.get()));
1850 
1851  // Adding an ECHConfig with the wrong public key is an error.
1852  bssl::ScopedEVP_HPKE_KEY wrong_key;
1853  ASSERT_TRUE(
1855  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1856  ech_config.data(), ech_config.size(),
1857  wrong_key.get()));
1858 
1859  // Adding an ECHConfig with a truncated public key is an error.
1860  ECHConfigParams truncated;
1861  truncated.key = key.get();
1862  truncated.public_key.assign(public_key, public_key + public_key_len - 1);
1863  ASSERT_TRUE(MakeECHConfig(&ech_config, truncated));
1864  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1865  ech_config.data(), ech_config.size(), key.get()));
1866 
1867  // Adding an ECHConfig with the right public key, but wrong KEM ID, is an
1868  // error.
1869  ECHConfigParams wrong_kem;
1870  wrong_kem.key = key.get();
1871  wrong_kem.kem_id = 0x0010; // DHKEM(P-256, HKDF-SHA256)
1872  ASSERT_TRUE(MakeECHConfig(&ech_config, wrong_kem));
1873  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1874  ech_config.data(), ech_config.size(),
1875  key.get()));
1876 }
1877 
1878 // Test that |SSL_CTX_set1_ech_keys| fails when the config list
1879 // has no retry configs.
1880 TEST(SSLTest, ECHServerConfigsWithoutRetryConfigs) {
1883  uint8_t *ech_config;
1884  size_t ech_config_len;
1885  ASSERT_TRUE(SSL_marshal_ech_config(&ech_config, &ech_config_len,
1886  /*config_id=*/1, key.get(),
1887  "public.example", 16));
1888  bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1889 
1890  // Install a non-retry config.
1891  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
1892  ASSERT_TRUE(keys);
1893  ASSERT_TRUE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/0, ech_config,
1894  ech_config_len, key.get()));
1895 
1896  // |keys| has no retry configs.
1897  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
1898  ASSERT_TRUE(ctx);
1899  EXPECT_FALSE(SSL_CTX_set1_ech_keys(ctx.get(), keys.get()));
1900 
1901  // Add the same ECHConfig to the list, but this time mark it as a retry
1902  // config.
1903  ASSERT_TRUE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1, ech_config,
1904  ech_config_len, key.get()));
1905  EXPECT_TRUE(SSL_CTX_set1_ech_keys(ctx.get(), keys.get()));
1906 }
1907 
1908 // Test that the server APIs reject ECHConfigs with unsupported features.
1909 TEST(SSLTest, UnsupportedECHConfig) {
1910  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
1911  ASSERT_TRUE(keys);
1914 
1915  // Unsupported versions are rejected.
1916  ECHConfigParams unsupported_version;
1917  unsupported_version.version = 0xffff;
1918  unsupported_version.key = key.get();
1919  std::vector<uint8_t> ech_config;
1920  ASSERT_TRUE(MakeECHConfig(&ech_config, unsupported_version));
1921  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1922  ech_config.data(), ech_config.size(),
1923  key.get()));
1924 
1925  // Unsupported cipher suites are rejected. (We only support HKDF-SHA256.)
1926  ECHConfigParams unsupported_kdf;
1927  unsupported_kdf.key = key.get();
1928  unsupported_kdf.cipher_suites = {0x002 /* HKDF-SHA384 */,
1930  ASSERT_TRUE(MakeECHConfig(&ech_config, unsupported_kdf));
1931  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1932  ech_config.data(), ech_config.size(),
1933  key.get()));
1934  ECHConfigParams unsupported_aead;
1935  unsupported_aead.key = key.get();
1936  unsupported_aead.cipher_suites = {EVP_HPKE_HKDF_SHA256, 0xffff};
1937  ASSERT_TRUE(MakeECHConfig(&ech_config, unsupported_aead));
1938  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1939  ech_config.data(), ech_config.size(),
1940  key.get()));
1941 
1942 
1943  // Unsupported extensions are rejected.
1945  extensions.key = key.get();
1946  extensions.extensions = {0x00, 0x01, 0x00, 0x00};
1947  ASSERT_TRUE(MakeECHConfig(&ech_config, extensions));
1948  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1949  ech_config.data(), ech_config.size(),
1950  key.get()));
1951 
1952  // Invalid public names are rejected.
1953  ECHConfigParams invalid_public_name;
1954  invalid_public_name.key = key.get();
1955  invalid_public_name.public_name = "dns_names_have_no_underscores.example";
1956  ASSERT_TRUE(MakeECHConfig(&ech_config, invalid_public_name));
1957  EXPECT_FALSE(SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1,
1958  ech_config.data(), ech_config.size(),
1959  key.get()));
1960 }
1961 
1962 // Test that |SSL_get_client_random| reports the correct value on both client
1963 // and server in ECH. The client sends two different random values. When ECH is
1964 // accepted, we should report the inner one.
1965 TEST(SSLTest, ECHClientRandomsMatch) {
1966  bssl::UniquePtr<SSL_CTX> server_ctx =
1968  bssl::UniquePtr<SSL_ECH_KEYS> keys = MakeTestECHKeys();
1969  ASSERT_TRUE(keys);
1971 
1972  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
1974  bssl::UniquePtr<SSL> client, server;
1976  server_ctx.get()));
1979 
1982 
1983  // An ECH server will fairly naturally record the inner ClientHello random,
1984  // but an ECH client may forget to update the random once ClientHelloInner is
1985  // selected.
1986  uint8_t client_random1[SSL3_RANDOM_SIZE];
1987  uint8_t client_random2[SSL3_RANDOM_SIZE];
1988  ASSERT_EQ(sizeof(client_random1),
1989  SSL_get_client_random(client.get(), client_random1,
1990  sizeof(client_random1)));
1991  ASSERT_EQ(sizeof(client_random2),
1992  SSL_get_client_random(server.get(), client_random2,
1993  sizeof(client_random2)));
1994  EXPECT_EQ(Bytes(client_random1), Bytes(client_random2));
1995 }
1996 
1997 // GetECHLength sets |*out_client_hello_len| and |*out_ech_len| to the lengths
1998 // of the ClientHello and ECH extension, respectively, when a client created
1999 // from |ctx| constructs a ClientHello with name |name| and an ECHConfig with
2000 // maximum name length |max_name_len|.
2001 static bool GetECHLength(SSL_CTX *ctx, size_t *out_client_hello_len,
2002  size_t *out_ech_len, size_t max_name_len,
2003  const char *name) {
2005  uint8_t *ech_config;
2006  size_t ech_config_len;
2008  !SSL_marshal_ech_config(&ech_config, &ech_config_len,
2009  /*config_id=*/1, key.get(), "public.example",
2010  max_name_len)) {
2011  return false;
2012  }
2013  bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
2014 
2015  bssl::UniquePtr<SSL_ECH_KEYS> keys(SSL_ECH_KEYS_new());
2016  if (!keys || !SSL_ECH_KEYS_add(keys.get(), /*is_retry_config=*/1, ech_config,
2017  ech_config_len, key.get())) {
2018  return false;
2019  }
2020 
2021  bssl::UniquePtr<SSL> ssl(SSL_new(ctx));
2022  if (!ssl || !InstallECHConfigList(ssl.get(), keys.get()) ||
2023  (name != nullptr && !SSL_set_tlsext_host_name(ssl.get(), name))) {
2024  return false;
2025  }
2026  SSL_set_connect_state(ssl.get());
2027 
2028  std::vector<uint8_t> client_hello;
2029  SSL_CLIENT_HELLO parsed;
2030  const uint8_t *unused;
2031  if (!GetClientHello(ssl.get(), &client_hello) ||
2033  ssl.get(), &parsed,
2034  // Skip record and handshake headers. This assumes the ClientHello
2035  // fits in one record.
2036  MakeConstSpan(client_hello)
2039  &parsed, TLSEXT_TYPE_encrypted_client_hello, &unused, out_ech_len)) {
2040  return false;
2041  }
2042  *out_client_hello_len = client_hello.size();
2043  return true;
2044 }
2045 
2046 TEST(SSLTest, ECHPadding) {
2047  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
2048  ASSERT_TRUE(ctx);
2049 
2050  // Sample lengths with max_name_len = 128 as baseline.
2051  size_t client_hello_len_baseline, ech_len_baseline;
2052  ASSERT_TRUE(GetECHLength(ctx.get(), &client_hello_len_baseline,
2053  &ech_len_baseline, 128, "example.com"));
2054 
2055  // Check that all name lengths under the server's maximum look the same.
2056  for (size_t name_len : {1, 2, 32, 64, 127, 128}) {
2057  SCOPED_TRACE(name_len);
2058  size_t client_hello_len, ech_len;
2059  ASSERT_TRUE(GetECHLength(ctx.get(), &client_hello_len, &ech_len, 128,
2060  std::string(name_len, 'a').c_str()));
2061  EXPECT_EQ(client_hello_len, client_hello_len_baseline);
2062  EXPECT_EQ(ech_len, ech_len_baseline);
2063  }
2064 
2065  // When sending no SNI, we must still pad as if we are sending one.
2066  size_t client_hello_len, ech_len;
2067  ASSERT_TRUE(
2068  GetECHLength(ctx.get(), &client_hello_len, &ech_len, 128, nullptr));
2069  EXPECT_EQ(client_hello_len, client_hello_len_baseline);
2070  EXPECT_EQ(ech_len, ech_len_baseline);
2071 
2072  // Name lengths above the maximum do not get named-based padding, but the
2073  // overall input is padded to a multiple of 32.
2074  size_t client_hello_len_baseline2, ech_len_baseline2;
2075  ASSERT_TRUE(GetECHLength(ctx.get(), &client_hello_len_baseline2,
2076  &ech_len_baseline2, 128,
2077  std::string(128 + 32, 'a').c_str()));
2078  EXPECT_EQ(ech_len_baseline2, ech_len_baseline + 32);
2079  // The ClientHello lengths may match if we are still under the threshold for
2080  // padding extension.
2081  EXPECT_GE(client_hello_len_baseline2, client_hello_len_baseline);
2082 
2083  for (size_t name_len = 128 + 1; name_len < 128 + 32; name_len++) {
2084  SCOPED_TRACE(name_len);
2085  ASSERT_TRUE(GetECHLength(ctx.get(), &client_hello_len, &ech_len, 128,
2086  std::string(name_len, 'a').c_str()));
2087  EXPECT_TRUE(ech_len == ech_len_baseline || ech_len == ech_len_baseline2)
2088  << ech_len;
2089  EXPECT_TRUE(client_hello_len == client_hello_len_baseline ||
2090  client_hello_len == client_hello_len_baseline2)
2091  << client_hello_len;
2092  }
2093 }
2094 
2095 TEST(SSLTest, ECHPublicName) {
2096  auto str_to_span = [](const char *str) -> Span<const uint8_t> {
2097  return MakeConstSpan(reinterpret_cast<const uint8_t *>(str), strlen(str));
2098  };
2099 
2100  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("")));
2101  EXPECT_TRUE(ssl_is_valid_ech_public_name(str_to_span("example.com")));
2102  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span(".example.com")));
2103  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("example.com.")));
2104  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("example..com")));
2105  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("www.-example.com")));
2106  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("www.example-.com")));
2107  EXPECT_FALSE(
2108  ssl_is_valid_ech_public_name(str_to_span("no_underscores.example")));
2110  str_to_span("invalid_chars.\x01.example")));
2112  str_to_span("invalid_chars.\xff.example")));
2113  static const uint8_t kWithNUL[] = {'t', 'e', 's', 't', 0};
2115 
2116  // Test an LDH label with every character and the maximum length.
2118  "abcdefhijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789")));
2120  "abcdefhijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-01234567899")));
2121 
2122  // Inputs with trailing numeric components are rejected.
2123  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("127.0.0.1")));
2124  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("example.1")));
2125  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("example.01")));
2126  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("example.0x01")));
2127  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("example.0X01")));
2128  // Leading zeros and values that overflow |uint32_t| are still rejected.
2130  str_to_span("example.123456789000000000000000")));
2132  str_to_span("example.012345678900000000000000")));
2134  str_to_span("example.0x123456789abcdefABCDEF0")));
2136  str_to_span("example.0x0123456789abcdefABCDEF")));
2137  // Adding a non-digit or non-hex character makes it a valid DNS name again.
2138  // Single-component numbers are rejected.
2140  str_to_span("example.1234567890a")));
2142  str_to_span("example.01234567890a")));
2144  str_to_span("example.0x123456789abcdefg")));
2145  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("1")));
2146  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("01")));
2147  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("0x01")));
2148  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("0X01")));
2149  // Numbers with trailing dots are rejected. (They are already rejected by the
2150  // LDH label rules, but the WHATWG URL parser additionally rejects them.)
2151  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("1.")));
2152  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("01.")));
2153  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("0x01.")));
2154  EXPECT_FALSE(ssl_is_valid_ech_public_name(str_to_span("0X01.")));
2155 }
2156 
2157 // When using the built-in verifier, test that |SSL_get0_ech_name_override| is
2158 // applied automatically.
2159 TEST(SSLTest, ECHBuiltinVerifier) {
2160  // These test certificates generated with the following Go program.
2161  /* clang-format off
2162 func main() {
2163  notBefore := time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC)
2164  notAfter := time.Date(2099, time.January, 1, 0, 0, 0, 0, time.UTC)
2165  rootKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
2166  rootTemplate := &x509.Certificate{
2167  SerialNumber: big.NewInt(1),
2168  Subject: pkix.Name{CommonName: "Test CA"},
2169  NotBefore: notBefore,
2170  NotAfter: notAfter,
2171  BasicConstraintsValid: true,
2172  IsCA: true,
2173  }
2174  rootDER, _ := x509.CreateCertificate(rand.Reader, rootTemplate, rootTemplate, &rootKey.PublicKey, rootKey)
2175  root, _ := x509.ParseCertificate(rootDER)
2176  pem.Encode(os.Stdout, &pem.Block{Type: "CERTIFICATE", Bytes: rootDER})
2177  leafKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
2178  leafKeyDER, _ := x509.MarshalPKCS8PrivateKey(leafKey)
2179  pem.Encode(os.Stdout, &pem.Block{Type: "PRIVATE KEY", Bytes: leafKeyDER})
2180  for i, name := range []string{"public.example", "secret.example"} {
2181  leafTemplate := &x509.Certificate{
2182  SerialNumber: big.NewInt(int64(i) + 2),
2183  Subject: pkix.Name{CommonName: name},
2184  NotBefore: notBefore,
2185  NotAfter: notAfter,
2186  BasicConstraintsValid: true,
2187  DNSNames: []string{name},
2188  }
2189  leafDER, _ := x509.CreateCertificate(rand.Reader, leafTemplate, root, &leafKey.PublicKey, rootKey)
2190  pem.Encode(os.Stdout, &pem.Block{Type: "CERTIFICATE", Bytes: leafDER})
2191  }
2192 }
2193 clang-format on */
2194  bssl::UniquePtr<X509> root = CertFromPEM(R"(
2195 -----BEGIN CERTIFICATE-----
2196 MIIBRzCB7aADAgECAgEBMAoGCCqGSM49BAMCMBIxEDAOBgNVBAMTB1Rlc3QgQ0Ew
2197 IBcNMDAwMTAxMDAwMDAwWhgPMjA5OTAxMDEwMDAwMDBaMBIxEDAOBgNVBAMTB1Rl
2198 c3QgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT5JUjrI1DAxSpEl88UkmJw
2199 tAJqxo/YrSFo9V3MkcNkfTixi5p6MUtO8DazhEgekBcd2+tBAWtl7dy0qpvTqx92
2200 ozIwMDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTw6ftkexAI6o4r5FntJIfL
2201 GU5F4zAKBggqhkjOPQQDAgNJADBGAiEAiiNowddQeHZaZFIygwe6RW5/WG4sUXWC
2202 dkyl9CQzRaYCIQCFS1EvwZbZtMny27fYm1eeYciY0TkJTEi34H1KwyzzIA==
2203 -----END CERTIFICATE-----
2204 )");
2205  ASSERT_TRUE(root);
2206  bssl::UniquePtr<EVP_PKEY> leaf_key = KeyFromPEM(R"(
2207 -----BEGIN PRIVATE KEY-----
2208 MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgj5WKHwHnziiyPauf
2209 7QukxTwtTyGZkk8qNdms4puJfxqhRANCAARNrkhxabALDlJrHtvkuDwvCWUF/oVC
2210 hr6PDITHi1lDlJzvVT4aXBH87sH2n2UV5zpx13NHkq1bIC8eRT8eOIe0
2211 -----END PRIVATE KEY-----
2212 )");
2213  ASSERT_TRUE(leaf_key);
2214  bssl::UniquePtr<X509> leaf_public = CertFromPEM(R"(
2215 -----BEGIN CERTIFICATE-----
2216 MIIBaDCCAQ6gAwIBAgIBAjAKBggqhkjOPQQDAjASMRAwDgYDVQQDEwdUZXN0IENB
2217 MCAXDTAwMDEwMTAwMDAwMFoYDzIwOTkwMTAxMDAwMDAwWjAZMRcwFQYDVQQDEw5w
2218 dWJsaWMuZXhhbXBsZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABE2uSHFpsAsO
2219 Umse2+S4PC8JZQX+hUKGvo8MhMeLWUOUnO9VPhpcEfzuwfafZRXnOnHXc0eSrVsg
2220 Lx5FPx44h7SjTDBKMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAU8On7ZHsQCOqO
2221 K+RZ7SSHyxlOReMwGQYDVR0RBBIwEIIOcHVibGljLmV4YW1wbGUwCgYIKoZIzj0E
2222 AwIDSAAwRQIhANqZRhDR/+QL05hsWXMYEwaiHifd9iakKoFEhKFchcF3AiBRAeXw
2223 wRGGT6+iPmTYM6N5/IDyAb5B9Ke38O6lLEsUwA==
2224 -----END CERTIFICATE-----
2225 )");
2226  ASSERT_TRUE(leaf_public);
2227  bssl::UniquePtr<X509> leaf_secret = CertFromPEM(R"(
2228 -----BEGIN CERTIFICATE-----
2229 MIIBaTCCAQ6gAwIBAgIBAzAKBggqhkjOPQQDAjASMRAwDgYDVQQDEwdUZXN0IENB
2230 MCAXDTAwMDEwMTAwMDAwMFoYDzIwOTkwMTAxMDAwMDAwWjAZMRcwFQYDVQQDEw5z
2231 ZWNyZXQuZXhhbXBsZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABE2uSHFpsAsO
2232 Umse2+S4PC8JZQX+hUKGvo8MhMeLWUOUnO9VPhpcEfzuwfafZRXnOnHXc0eSrVsg
2233 Lx5FPx44h7SjTDBKMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAU8On7ZHsQCOqO
2234 K+RZ7SSHyxlOReMwGQYDVR0RBBIwEIIOc2VjcmV0LmV4YW1wbGUwCgYIKoZIzj0E
2235 AwIDSQAwRgIhAPQdIz1xCFkc9WuSkxOxJDpywZiEp9SnKcxJ9nwrlRp3AiEA+O3+
2236 XRqE7XFhHL+7TNC2a9OOAjQsEF137YPWo+rhgko=
2237 -----END CERTIFICATE-----
2238 )");
2239  ASSERT_TRUE(leaf_secret);
2240 
2241  // Use different config IDs so that fuzzer mode, which breaks trial
2242  // decryption, will observe the key mismatch.
2243  bssl::UniquePtr<SSL_ECH_KEYS> keys = MakeTestECHKeys(/*config_id=*/1);
2244  ASSERT_TRUE(keys);
2245  bssl::UniquePtr<SSL_ECH_KEYS> wrong_keys = MakeTestECHKeys(/*config_id=*/2);
2246  ASSERT_TRUE(wrong_keys);
2247  bssl::UniquePtr<SSL_CTX> server_ctx =
2250  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
2252 
2253  // Configure the client to verify certificates and expect the secret name.
2254  // This is the name the client is trying to connect to. If ECH is rejected,
2255  // BoringSSL will internally override this setting with the public name.
2256  bssl::UniquePtr<X509_STORE> store(X509_STORE_new());
2257  ASSERT_TRUE(store);
2258  ASSERT_TRUE(X509_STORE_add_cert(store.get(), root.get()));
2259  SSL_CTX_set_cert_store(client_ctx.get(), store.release());
2261  static const char kSecretName[] = "secret.example";
2263  kSecretName, strlen(kSecretName)));
2264 
2265  // For simplicity, we only run through a pair of representative scenarios here
2266  // and rely on runner.go to verify that |SSL_get0_ech_name_override| behaves
2267  // correctly.
2268  for (bool accept_ech : {false, true}) {
2269  SCOPED_TRACE(accept_ech);
2270  for (bool use_leaf_secret : {false, true}) {
2271  SCOPED_TRACE(use_leaf_secret);
2272 
2273  // The server will reject ECH when configured with the wrong keys.
2275  server_ctx.get(), accept_ech ? keys.get() : wrong_keys.get()));
2276 
2277  bssl::UniquePtr<SSL> client, server;
2279  server_ctx.get()));
2281 
2282  // Configure the server with the selected certificate.
2283  ASSERT_TRUE(SSL_use_certificate(server.get(), use_leaf_secret
2284  ? leaf_secret.get()
2285  : leaf_public.get()));
2286  ASSERT_TRUE(SSL_use_PrivateKey(server.get(), leaf_key.get()));
2287 
2288  // The handshake may fail due to name mismatch or ECH reject. We check
2289  // |SSL_get_verify_result| to confirm the handshake got far enough.
2290  CompleteHandshakes(client.get(), server.get());
2291  EXPECT_EQ(accept_ech == use_leaf_secret ? X509_V_OK
2293  SSL_get_verify_result(client.get()));
2294  }
2295  }
2296 }
2297 
2298 #if defined(OPENSSL_THREADS)
2299 // Test that the server ECH config can be swapped out while the |SSL_CTX| is
2300 // in use on other threads. This test is intended to be run with TSan.
2301 TEST(SSLTest, ECHThreads) {
2302  // Generate a pair of ECHConfigs.
2305  uint8_t *ech_config1;
2306  size_t ech_config1_len;
2307  ASSERT_TRUE(SSL_marshal_ech_config(&ech_config1, &ech_config1_len,
2308  /*config_id=*/1, key1.get(),
2309  "public.example", 16));
2310  bssl::UniquePtr<uint8_t> free_ech_config1(ech_config1);
2313  uint8_t *ech_config2;
2314  size_t ech_config2_len;
2315  ASSERT_TRUE(SSL_marshal_ech_config(&ech_config2, &ech_config2_len,
2316  /*config_id=*/2, key2.get(),
2317  "public.example", 16));
2318  bssl::UniquePtr<uint8_t> free_ech_config2(ech_config2);
2319 
2320  // |keys1| contains the first config. |keys12| contains both.
2321  bssl::UniquePtr<SSL_ECH_KEYS> keys1(SSL_ECH_KEYS_new());
2322  ASSERT_TRUE(keys1);
2323  ASSERT_TRUE(SSL_ECH_KEYS_add(keys1.get(), /*is_retry_config=*/1, ech_config1,
2324  ech_config1_len, key1.get()));
2325  bssl::UniquePtr<SSL_ECH_KEYS> keys12(SSL_ECH_KEYS_new());
2326  ASSERT_TRUE(keys12);
2327  ASSERT_TRUE(SSL_ECH_KEYS_add(keys12.get(), /*is_retry_config=*/1, ech_config2,
2328  ech_config2_len, key2.get()));
2329  ASSERT_TRUE(SSL_ECH_KEYS_add(keys12.get(), /*is_retry_config=*/0, ech_config1,
2330  ech_config1_len, key1.get()));
2331 
2332  bssl::UniquePtr<SSL_CTX> server_ctx =
2334  ASSERT_TRUE(SSL_CTX_set1_ech_keys(server_ctx.get(), keys1.get()));
2335 
2336  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
2338  bssl::UniquePtr<SSL> client, server;
2340  server_ctx.get()));
2341  ASSERT_TRUE(InstallECHConfigList(client.get(), keys1.get()));
2342 
2343  // In parallel, complete the connection and reconfigure the ECHConfig. Note
2344  // |keys12| supports all the keys in |keys1|, so the handshake should complete
2345  // the same whichever the server uses.
2346  std::vector<std::thread> threads;
2347  threads.emplace_back([&] {
2351  });
2352  threads.emplace_back([&] {
2353  EXPECT_TRUE(SSL_CTX_set1_ech_keys(server_ctx.get(), keys12.get()));
2354  });
2355  for (auto &thread : threads) {
2356  thread.join();
2357  }
2358 }
2359 #endif // OPENSSL_THREADS
2360 
2361 static void AppendSession(SSL_SESSION *session, void *arg) {
2362  std::vector<SSL_SESSION*> *out =
2363  reinterpret_cast<std::vector<SSL_SESSION*>*>(arg);
2364  out->push_back(session);
2365 }
2366 
2367 // CacheEquals returns true if |ctx|'s session cache consists of |expected|, in
2368 // order.
2369 static bool CacheEquals(SSL_CTX *ctx,
2370  const std::vector<SSL_SESSION*> &expected) {
2371  // Check the linked list.
2372  SSL_SESSION *ptr = ctx->session_cache_head;
2373  for (SSL_SESSION *session : expected) {
2374  if (ptr != session) {
2375  return false;
2376  }
2377  // TODO(davidben): This is an absurd way to denote the end of the list.
2378  if (ptr->next ==
2379  reinterpret_cast<SSL_SESSION *>(&ctx->session_cache_tail)) {
2380  ptr = nullptr;
2381  } else {
2382  ptr = ptr->next;
2383  }
2384  }
2385  if (ptr != nullptr) {
2386  return false;
2387  }
2388 
2389  // Check the hash table.
2390  std::vector<SSL_SESSION*> actual, expected_copy;
2391  lh_SSL_SESSION_doall_arg(ctx->sessions, AppendSession, &actual);
2392  expected_copy = expected;
2393 
2394  std::sort(actual.begin(), actual.end());
2395  std::sort(expected_copy.begin(), expected_copy.end());
2396 
2397  return actual == expected_copy;
2398 }
2399 
2400 static bssl::UniquePtr<SSL_SESSION> CreateTestSession(uint32_t number) {
2401  bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
2402  if (!ssl_ctx) {
2403  return nullptr;
2404  }
2405  bssl::UniquePtr<SSL_SESSION> ret(SSL_SESSION_new(ssl_ctx.get()));
2406  if (!ret) {
2407  return nullptr;
2408  }
2409 
2411  OPENSSL_memcpy(id, &number, sizeof(number));
2412  if (!SSL_SESSION_set1_id(ret.get(), id, sizeof(id))) {
2413  return nullptr;
2414  }
2415  return ret;
2416 }
2417 
2418 // Test that the internal session cache behaves as expected.
2419 TEST(SSLTest, InternalSessionCache) {
2420  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
2421  ASSERT_TRUE(ctx);
2422 
2423  // Prepare 10 test sessions.
2424  std::vector<bssl::UniquePtr<SSL_SESSION>> sessions;
2425  for (int i = 0; i < 10; i++) {
2426  bssl::UniquePtr<SSL_SESSION> session = CreateTestSession(i);
2427  ASSERT_TRUE(session);
2428  sessions.push_back(std::move(session));
2429  }
2430 
2431  SSL_CTX_sess_set_cache_size(ctx.get(), 5);
2432 
2433  // Insert all the test sessions.
2434  for (const auto &session : sessions) {
2435  ASSERT_TRUE(SSL_CTX_add_session(ctx.get(), session.get()));
2436  }
2437 
2438  // Only the last five should be in the list.
2440  ctx.get(), {sessions[9].get(), sessions[8].get(), sessions[7].get(),
2441  sessions[6].get(), sessions[5].get()}));
2442 
2443  // Inserting an element already in the cache should fail and leave the cache
2444  // unchanged.
2445  ASSERT_FALSE(SSL_CTX_add_session(ctx.get(), sessions[7].get()));
2447  ctx.get(), {sessions[9].get(), sessions[8].get(), sessions[7].get(),
2448  sessions[6].get(), sessions[5].get()}));
2449 
2450  // Although collisions should be impossible (256-bit session IDs), the cache
2451  // must handle them gracefully.
2452  bssl::UniquePtr<SSL_SESSION> collision(CreateTestSession(7));
2453  ASSERT_TRUE(collision);
2454  ASSERT_TRUE(SSL_CTX_add_session(ctx.get(), collision.get()));
2456  ctx.get(), {collision.get(), sessions[9].get(), sessions[8].get(),
2457  sessions[6].get(), sessions[5].get()}));
2458 
2459  // Removing sessions behaves correctly.
2460  ASSERT_TRUE(SSL_CTX_remove_session(ctx.get(), sessions[6].get()));
2461  ASSERT_TRUE(CacheEquals(ctx.get(), {collision.get(), sessions[9].get(),
2462  sessions[8].get(), sessions[5].get()}));
2463 
2464  // Removing sessions requires an exact match.
2465  ASSERT_FALSE(SSL_CTX_remove_session(ctx.get(), sessions[0].get()));
2466  ASSERT_FALSE(SSL_CTX_remove_session(ctx.get(), sessions[7].get()));
2467 
2468  // The cache remains unchanged.
2469  ASSERT_TRUE(CacheEquals(ctx.get(), {collision.get(), sessions[9].get(),
2470  sessions[8].get(), sessions[5].get()}));
2471 }
2472 
2474  return static_cast<uint16_t>(seq >> 48);
2475 }
2476 
2477 static const uint8_t kTestName[] = {
2478  0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
2479  0x02, 0x41, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
2480  0x0c, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,
2481  0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x49,
2482  0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
2483  0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64,
2484 };
2485 
2486 // SSLVersionTest executes its test cases under all available protocol versions.
2487 // Test cases call |Connect| to create a connection using context objects with
2488 // the protocol version fixed to the current version under test.
2489 class SSLVersionTest : public ::testing::TestWithParam<VersionParam> {
2490  protected:
2492 
2493  void SetUp() { ResetContexts(); }
2494 
2495  bssl::UniquePtr<SSL_CTX> CreateContext() const {
2496  const SSL_METHOD *method = is_dtls() ? DTLS_method() : TLS_method();
2497  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(method));
2498  if (!ctx || !SSL_CTX_set_min_proto_version(ctx.get(), version()) ||
2500  return nullptr;
2501  }
2502  return ctx;
2503  }
2504 
2505  void ResetContexts() {
2506  ASSERT_TRUE(cert_);
2507  ASSERT_TRUE(key_);
2508  client_ctx_ = CreateContext();
2509  ASSERT_TRUE(client_ctx_);
2510  server_ctx_ = CreateContext();
2511  ASSERT_TRUE(server_ctx_);
2512  // Set up a server cert. Client certs can be set up explicitly.
2513  ASSERT_TRUE(UseCertAndKey(server_ctx_.get()));
2514  }
2515 
2516  bool UseCertAndKey(SSL_CTX *ctx) const {
2517  return SSL_CTX_use_certificate(ctx, cert_.get()) &&
2519  }
2520 
2522  return ConnectClientAndServer(&client_, &server_, client_ctx_.get(),
2523  server_ctx_.get(), config,
2524  shed_handshake_config_);
2525  }
2526 
2527  uint16_t version() const { return GetParam().version; }
2528 
2529  bool is_dtls() const {
2530  return GetParam().ssl_method == VersionParam::is_dtls;
2531  }
2532 
2533  bool shed_handshake_config_ = true;
2534  bssl::UniquePtr<SSL> client_, server_;
2535  bssl::UniquePtr<SSL_CTX> server_ctx_, client_ctx_;
2536  bssl::UniquePtr<X509> cert_;
2537  bssl::UniquePtr<EVP_PKEY> key_;
2538 };
2539 
2543  return i.param.name;
2544  });
2545 
2546 TEST_P(SSLVersionTest, SequenceNumber) {
2547  ASSERT_TRUE(Connect());
2548 
2549  // Drain any post-handshake messages to ensure there are no unread records
2550  // on either end.
2552 
2553  uint64_t client_read_seq = SSL_get_read_sequence(client_.get());
2554  uint64_t client_write_seq = SSL_get_write_sequence(client_.get());
2555  uint64_t server_read_seq = SSL_get_read_sequence(server_.get());
2556  uint64_t server_write_seq = SSL_get_write_sequence(server_.get());
2557 
2558  if (is_dtls()) {
2559  // Both client and server must be at epoch 1.
2560  EXPECT_EQ(EpochFromSequence(client_read_seq), 1);
2561  EXPECT_EQ(EpochFromSequence(client_write_seq), 1);
2562  EXPECT_EQ(EpochFromSequence(server_read_seq), 1);
2563  EXPECT_EQ(EpochFromSequence(server_write_seq), 1);
2564 
2565  // The next record to be written should exceed the largest received.
2566  EXPECT_GT(client_write_seq, server_read_seq);
2567  EXPECT_GT(server_write_seq, client_read_seq);
2568  } else {
2569  // The next record to be written should equal the next to be received.
2570  EXPECT_EQ(client_write_seq, server_read_seq);
2571  EXPECT_EQ(server_write_seq, client_read_seq);
2572  }
2573 
2574  // Send a record from client to server.
2575  uint8_t byte = 0;
2576  EXPECT_EQ(SSL_write(client_.get(), &byte, 1), 1);
2577  EXPECT_EQ(SSL_read(server_.get(), &byte, 1), 1);
2578 
2579  // The client write and server read sequence numbers should have
2580  // incremented.
2581  EXPECT_EQ(client_write_seq + 1, SSL_get_write_sequence(client_.get()));
2582  EXPECT_EQ(server_read_seq + 1, SSL_get_read_sequence(server_.get()));
2583 }
2584 
2585 TEST_P(SSLVersionTest, OneSidedShutdown) {
2586  // SSL_shutdown is a no-op in DTLS.
2587  if (is_dtls()) {
2588  return;
2589  }
2590  ASSERT_TRUE(Connect());
2591 
2592  // Shut down half the connection. |SSL_shutdown| will return 0 to signal only
2593  // one side has shut down.
2594  ASSERT_EQ(SSL_shutdown(client_.get()), 0);
2595 
2596  // Reading from the server should consume the EOF.
2597  uint8_t byte;
2598  ASSERT_EQ(SSL_read(server_.get(), &byte, 1), 0);
2600 
2601  // However, the server may continue to write data and then shut down the
2602  // connection.
2603  byte = 42;
2604  ASSERT_EQ(SSL_write(server_.get(), &byte, 1), 1);
2605  ASSERT_EQ(SSL_read(client_.get(), &byte, 1), 1);
2606  ASSERT_EQ(byte, 42);
2607 
2608  // The server may then shutdown the connection.
2609  EXPECT_EQ(SSL_shutdown(server_.get()), 1);
2610  EXPECT_EQ(SSL_shutdown(client_.get()), 1);
2611 }
2612 
2613 // Test that, after calling |SSL_shutdown|, |SSL_write| fails.
2614 TEST_P(SSLVersionTest, WriteAfterShutdown) {
2615  ASSERT_TRUE(Connect());
2616 
2617  for (SSL *ssl : {client_.get(), server_.get()}) {
2618  SCOPED_TRACE(SSL_is_server(ssl) ? "server" : "client");
2619 
2620  bssl::UniquePtr<BIO> mem(BIO_new(BIO_s_mem()));
2621  ASSERT_TRUE(mem);
2622  SSL_set0_wbio(ssl, bssl::UpRef(mem).release());
2623 
2624  // Shut down half the connection. |SSL_shutdown| will return 0 to signal
2625  // only one side has shut down.
2626  ASSERT_EQ(SSL_shutdown(ssl), 0);
2627 
2628  // |ssl| should have written an alert to the transport.
2629  const uint8_t *unused;
2630  size_t len;
2631  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2632  EXPECT_NE(0u, len);
2633  EXPECT_TRUE(BIO_reset(mem.get()));
2634 
2635  // Writing should fail.
2636  EXPECT_EQ(-1, SSL_write(ssl, "a", 1));
2637 
2638  // Nothing should be written to the transport.
2639  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2640  EXPECT_EQ(0u, len);
2641  }
2642 }
2643 
2644 // Test that, after sending a fatal alert in a failed |SSL_read|, |SSL_write|
2645 // fails.
2646 TEST_P(SSLVersionTest, WriteAfterReadSentFatalAlert) {
2647  // Decryption failures are not fatal in DTLS.
2648  if (is_dtls()) {
2649  return;
2650  }
2651 
2652  ASSERT_TRUE(Connect());
2653 
2654  // Save the write |BIO|s as the test will overwrite them.
2655  bssl::UniquePtr<BIO> client_wbio = bssl::UpRef(SSL_get_wbio(client_.get()));
2656  bssl::UniquePtr<BIO> server_wbio = bssl::UpRef(SSL_get_wbio(server_.get()));
2657 
2658  for (bool test_server : {false, true}) {
2659  SCOPED_TRACE(test_server ? "server" : "client");
2660  SSL *ssl = test_server ? server_.get() : client_.get();
2661  BIO *other_wbio = test_server ? client_wbio.get() : server_wbio.get();
2662 
2663  bssl::UniquePtr<BIO> mem(BIO_new(BIO_s_mem()));
2664  ASSERT_TRUE(mem);
2665  SSL_set0_wbio(ssl, bssl::UpRef(mem).release());
2666 
2667  // Read an invalid record from the peer.
2668  static const uint8_t kInvalidRecord[] = "invalid record";
2669  EXPECT_EQ(int{sizeof(kInvalidRecord)},
2670  BIO_write(other_wbio, kInvalidRecord, sizeof(kInvalidRecord)));
2671  char buf[256];
2672  EXPECT_EQ(-1, SSL_read(ssl, buf, sizeof(buf)));
2673 
2674  // |ssl| should have written an alert to the transport.
2675  const uint8_t *unused;
2676  size_t len;
2677  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2678  EXPECT_NE(0u, len);
2679  EXPECT_TRUE(BIO_reset(mem.get()));
2680 
2681  // Writing should fail.
2682  EXPECT_EQ(-1, SSL_write(ssl, "a", 1));
2683 
2684  // Nothing should be written to the transport.
2685  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2686  EXPECT_EQ(0u, len);
2687  }
2688 }
2689 
2690 // Test that, after sending a fatal alert from the handshake, |SSL_write| fails.
2691 TEST_P(SSLVersionTest, WriteAfterHandshakeSentFatalAlert) {
2692  for (bool test_server : {false, true}) {
2693  SCOPED_TRACE(test_server ? "server" : "client");
2694 
2695  bssl::UniquePtr<SSL> ssl(
2696  SSL_new(test_server ? server_ctx_.get() : client_ctx_.get()));
2697  ASSERT_TRUE(ssl);
2698  if (test_server) {
2699  SSL_set_accept_state(ssl.get());
2700  } else {
2701  SSL_set_connect_state(ssl.get());
2702  }
2703 
2704  std::vector<uint8_t> invalid;
2705  if (is_dtls()) {
2706  // In DTLS, invalid records are discarded. To cause the handshake to fail,
2707  // use a valid handshake record with invalid contents.
2708  invalid.push_back(SSL3_RT_HANDSHAKE);
2709  invalid.push_back(DTLS1_VERSION >> 8);
2710  invalid.push_back(DTLS1_VERSION & 0xff);
2711  // epoch and sequence_number
2712  for (int i = 0; i < 8; i++) {
2713  invalid.push_back(0);
2714  }
2715  // A one-byte fragment is invalid.
2716  invalid.push_back(0);
2717  invalid.push_back(1);
2718  // Arbitrary contents.
2719  invalid.push_back(0);
2720  } else {
2721  invalid = {'i', 'n', 'v', 'a', 'l', 'i', 'd'};
2722  }
2723  bssl::UniquePtr<BIO> rbio(
2724  BIO_new_mem_buf(invalid.data(), invalid.size()));
2725  ASSERT_TRUE(rbio);
2726  SSL_set0_rbio(ssl.get(), rbio.release());
2727 
2728  bssl::UniquePtr<BIO> mem(BIO_new(BIO_s_mem()));
2729  ASSERT_TRUE(mem);
2730  SSL_set0_wbio(ssl.get(), bssl::UpRef(mem).release());
2731 
2732  // The handshake should fail.
2733  EXPECT_EQ(-1, SSL_do_handshake(ssl.get()));
2734  EXPECT_EQ(SSL_ERROR_SSL, SSL_get_error(ssl.get(), -1));
2736 
2737  // |ssl| should have written an alert (and, in the client's case, a
2738  // ClientHello) to the transport.
2739  const uint8_t *unused;
2740  size_t len;
2741  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2742  EXPECT_NE(0u, len);
2743  EXPECT_TRUE(BIO_reset(mem.get()));
2744 
2745  // Writing should fail, with the same error as the handshake.
2746  EXPECT_EQ(-1, SSL_write(ssl.get(), "a", 1));
2747  EXPECT_EQ(SSL_ERROR_SSL, SSL_get_error(ssl.get(), -1));
2749 
2750  // Nothing should be written to the transport.
2751  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2752  EXPECT_EQ(0u, len);
2753  }
2754 }
2755 
2756 // Test that, after seeing TLS 1.2 in response to early data, |SSL_write|
2757 // continues to report |SSL_R_WRONG_VERSION_ON_EARLY_DATA|. See
2758 // https://crbug.com/1078515.
2759 TEST(SSLTest, WriteAfterWrongVersionOnEarlyData) {
2760  // Set up some 0-RTT-enabled contexts.
2761  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
2762  bssl::UniquePtr<SSL_CTX> server_ctx =
2770 
2771  // Get an early-data-capable session.
2772  bssl::UniquePtr<SSL_SESSION> session =
2774  ASSERT_TRUE(session);
2776 
2777  // Offer the session to the server, but now the server speaks TLS 1.2.
2778  bssl::UniquePtr<SSL> client, server;
2780  server_ctx.get()));
2781  SSL_set_session(client.get(), session.get());
2783 
2784  // The client handshake initially succeeds in the early data state.
2785  EXPECT_EQ(1, SSL_do_handshake(client.get()));
2787 
2788  // The server processes the ClientHello and negotiates TLS 1.2.
2789  EXPECT_EQ(-1, SSL_do_handshake(server.get()));
2792 
2793  // Capture the client's output.
2794  bssl::UniquePtr<BIO> mem(BIO_new(BIO_s_mem()));
2795  ASSERT_TRUE(mem);
2796  SSL_set0_wbio(client.get(), bssl::UpRef(mem).release());
2797 
2798  // The client processes the ServerHello and fails.
2799  EXPECT_EQ(-1, SSL_do_handshake(client.get()));
2804 
2805  // The client should have written an alert to the transport.
2806  const uint8_t *unused;
2807  size_t len;
2808  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2809  EXPECT_NE(0u, len);
2810  EXPECT_TRUE(BIO_reset(mem.get()));
2811 
2812  // Writing should fail, with the same error as the handshake.
2813  EXPECT_EQ(-1, SSL_write(client.get(), "a", 1));
2815  err = ERR_get_error();
2818 
2819  // Nothing should be written to the transport.
2820  ASSERT_TRUE(BIO_mem_contents(mem.get(), &unused, &len));
2821  EXPECT_EQ(0u, len);
2822 }
2823 
2824 TEST(SSLTest, SessionDuplication) {
2825  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
2826  bssl::UniquePtr<SSL_CTX> server_ctx =
2830 
2831  bssl::UniquePtr<SSL> client, server;
2833  server_ctx.get()));
2834 
2835  SSL_SESSION *session0 = SSL_get_session(client.get());
2836  bssl::UniquePtr<SSL_SESSION> session1 =
2838  ASSERT_TRUE(session1);
2839 
2840  session1->not_resumable = false;
2841 
2842  uint8_t *s0_bytes, *s1_bytes;
2843  size_t s0_len, s1_len;
2844 
2845  ASSERT_TRUE(SSL_SESSION_to_bytes(session0, &s0_bytes, &s0_len));
2846  bssl::UniquePtr<uint8_t> free_s0(s0_bytes);
2847 
2848  ASSERT_TRUE(SSL_SESSION_to_bytes(session1.get(), &s1_bytes, &s1_len));
2849  bssl::UniquePtr<uint8_t> free_s1(s1_bytes);
2850 
2851  EXPECT_EQ(Bytes(s0_bytes, s0_len), Bytes(s1_bytes, s1_len));
2852 }
2853 
2854 static void ExpectFDs(const SSL *ssl, int rfd, int wfd) {
2855  EXPECT_EQ(rfd, SSL_get_fd(ssl));
2856  EXPECT_EQ(rfd, SSL_get_rfd(ssl));
2857  EXPECT_EQ(wfd, SSL_get_wfd(ssl));
2858 
2859  // The wrapper BIOs are always equal when fds are equal, even if set
2860  // individually.
2861  if (rfd == wfd) {
2862  EXPECT_EQ(SSL_get_rbio(ssl), SSL_get_wbio(ssl));
2863  }
2864 }
2865 
2866 TEST(SSLTest, SetFD) {
2867  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
2868  ASSERT_TRUE(ctx);
2869 
2870  // Test setting different read and write FDs.
2871  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
2872  ASSERT_TRUE(ssl);
2873  EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
2874  EXPECT_TRUE(SSL_set_wfd(ssl.get(), 2));
2875  ExpectFDs(ssl.get(), 1, 2);
2876 
2877  // Test setting the same FD.
2878  ssl.reset(SSL_new(ctx.get()));
2879  ASSERT_TRUE(ssl);
2880  EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
2881  ExpectFDs(ssl.get(), 1, 1);
2882 
2883  // Test setting the same FD one side at a time.
2884  ssl.reset(SSL_new(ctx.get()));
2885  ASSERT_TRUE(ssl);
2886  EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
2887  EXPECT_TRUE(SSL_set_wfd(ssl.get(), 1));
2888  ExpectFDs(ssl.get(), 1, 1);
2889 
2890  // Test setting the same FD in the other order.
2891  ssl.reset(SSL_new(ctx.get()));
2892  ASSERT_TRUE(ssl);
2893  EXPECT_TRUE(SSL_set_wfd(ssl.get(), 1));
2894  EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
2895  ExpectFDs(ssl.get(), 1, 1);
2896 
2897  // Test changing the read FD partway through.
2898  ssl.reset(SSL_new(ctx.get()));
2899  ASSERT_TRUE(ssl);
2900  EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
2901  EXPECT_TRUE(SSL_set_rfd(ssl.get(), 2));
2902  ExpectFDs(ssl.get(), 2, 1);
2903 
2904  // Test changing the write FD partway through.
2905  ssl.reset(SSL_new(ctx.get()));
2906  ASSERT_TRUE(ssl);
2907  EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
2908  EXPECT_TRUE(SSL_set_wfd(ssl.get(), 2));
2909  ExpectFDs(ssl.get(), 1, 2);
2910 
2911  // Test a no-op change to the read FD partway through.
2912  ssl.reset(SSL_new(ctx.get()));
2913  ASSERT_TRUE(ssl);
2914  EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
2915  EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
2916  ExpectFDs(ssl.get(), 1, 1);
2917 
2918  // Test a no-op change to the write FD partway through.
2919  ssl.reset(SSL_new(ctx.get()));
2920  ASSERT_TRUE(ssl);
2921  EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
2922  EXPECT_TRUE(SSL_set_wfd(ssl.get(), 1));
2923  ExpectFDs(ssl.get(), 1, 1);
2924 
2925  // ASan builds will implicitly test that the internal |BIO| reference-counting
2926  // is correct.
2927 }
2928 
2929 TEST(SSLTest, SetBIO) {
2930  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
2931  ASSERT_TRUE(ctx);
2932 
2933  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
2934  bssl::UniquePtr<BIO> bio1(BIO_new(BIO_s_mem())), bio2(BIO_new(BIO_s_mem())),
2935  bio3(BIO_new(BIO_s_mem()));
2936  ASSERT_TRUE(ssl);
2937  ASSERT_TRUE(bio1);
2938  ASSERT_TRUE(bio2);
2939  ASSERT_TRUE(bio3);
2940 
2941  // SSL_set_bio takes one reference when the parameters are the same.
2942  BIO_up_ref(bio1.get());
2943  SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
2944 
2945  // Repeating the call does nothing.
2946  SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
2947 
2948  // It takes one reference each when the parameters are different.
2949  BIO_up_ref(bio2.get());
2950  BIO_up_ref(bio3.get());
2951  SSL_set_bio(ssl.get(), bio2.get(), bio3.get());
2952 
2953  // Repeating the call does nothing.
2954  SSL_set_bio(ssl.get(), bio2.get(), bio3.get());
2955 
2956  // It takes one reference when changing only wbio.
2957  BIO_up_ref(bio1.get());
2958  SSL_set_bio(ssl.get(), bio2.get(), bio1.get());
2959 
2960  // It takes one reference when changing only rbio and the two are different.
2961  BIO_up_ref(bio3.get());
2962  SSL_set_bio(ssl.get(), bio3.get(), bio1.get());
2963 
2964  // If setting wbio to rbio, it takes no additional references.
2965  SSL_set_bio(ssl.get(), bio3.get(), bio3.get());
2966 
2967  // From there, wbio may be switched to something else.
2968  BIO_up_ref(bio1.get());
2969  SSL_set_bio(ssl.get(), bio3.get(), bio1.get());
2970 
2971  // If setting rbio to wbio, it takes no additional references.
2972  SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
2973 
2974  // From there, rbio may be switched to something else, but, for historical
2975  // reasons, it takes a reference to both parameters.
2976  BIO_up_ref(bio1.get());
2977  BIO_up_ref(bio2.get());
2978  SSL_set_bio(ssl.get(), bio2.get(), bio1.get());
2979 
2980  // ASAN builds will implicitly test that the internal |BIO| reference-counting
2981  // is correct.
2982 }
2983 
2984 static int VerifySucceed(X509_STORE_CTX *store_ctx, void *arg) { return 1; }
2985 
2986 TEST_P(SSLVersionTest, GetPeerCertificate) {
2987  ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
2988 
2989  // Configure both client and server to accept any certificate.
2990  SSL_CTX_set_verify(client_ctx_.get(),
2992  nullptr);
2993  SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
2994  SSL_CTX_set_verify(server_ctx_.get(),
2996  nullptr);
2997  SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
2998 
2999  ASSERT_TRUE(Connect());
3000 
3001  // Client and server should both see the leaf certificate.
3002  bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server_.get()));
3003  ASSERT_TRUE(peer);
3004  ASSERT_EQ(X509_cmp(cert_.get(), peer.get()), 0);
3005 
3006  peer.reset(SSL_get_peer_certificate(client_.get()));
3007  ASSERT_TRUE(peer);
3008  ASSERT_EQ(X509_cmp(cert_.get(), peer.get()), 0);
3009 
3010  // However, for historical reasons, the X509 chain includes the leaf on the
3011  // client, but does not on the server.
3014  1u);
3015 
3018  1u);
3019 }
3020 
3021 TEST_P(SSLVersionTest, NoPeerCertificate) {
3022  SSL_CTX_set_verify(server_ctx_.get(), SSL_VERIFY_PEER, nullptr);
3023  SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
3024  SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
3025 
3026  ASSERT_TRUE(Connect());
3027 
3028  // Server should not see a peer certificate.
3029  bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server_.get()));
3030  ASSERT_FALSE(peer);
3032 }
3033 
3034 TEST_P(SSLVersionTest, RetainOnlySHA256OfCerts) {
3035  uint8_t *cert_der = NULL;
3036  int cert_der_len = i2d_X509(cert_.get(), &cert_der);
3037  ASSERT_GE(cert_der_len, 0);
3038  bssl::UniquePtr<uint8_t> free_cert_der(cert_der);
3039 
3040  uint8_t cert_sha256[SHA256_DIGEST_LENGTH];
3041  SHA256(cert_der, cert_der_len, cert_sha256);
3042 
3043  ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
3044 
3045  // Configure both client and server to accept any certificate, but the
3046  // server must retain only the SHA-256 of the peer.
3047  SSL_CTX_set_verify(client_ctx_.get(),
3049  nullptr);
3050  SSL_CTX_set_verify(server_ctx_.get(),
3052  nullptr);
3053  SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
3054  SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
3055  SSL_CTX_set_retain_only_sha256_of_client_certs(server_ctx_.get(), 1);
3056 
3057  ASSERT_TRUE(Connect());
3058 
3059  // The peer certificate has been dropped.
3060  bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server_.get()));
3061  EXPECT_FALSE(peer);
3062 
3063  SSL_SESSION *session = SSL_get_session(server_.get());
3065 
3066  const uint8_t *peer_sha256;
3067  size_t peer_sha256_len;
3068  SSL_SESSION_get0_peer_sha256(session, &peer_sha256, &peer_sha256_len);
3069  EXPECT_EQ(Bytes(cert_sha256), Bytes(peer_sha256, peer_sha256_len));
3070 }
3071 
3072 // Tests that our ClientHellos do not change unexpectedly. These are purely
3073 // change detection tests. If they fail as part of an intentional ClientHello
3074 // change, update the test vector.
3075 TEST(SSLTest, ClientHello) {
3076  struct {
3077  uint16_t max_version;
3078  std::vector<uint8_t> expected;
3079  } kTests[] = {
3080  {TLS1_VERSION,
3081  {0x16, 0x03, 0x01, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x56, 0x03, 0x01, 0x00,
3082  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3083  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3084  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xc0, 0x09,
3085  0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a,
3086  0x01, 0x00, 0x00, 0x1f, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01,
3087  0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00,
3088  0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00}},
3089  {TLS1_1_VERSION,
3090  {0x16, 0x03, 0x01, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x56, 0x03, 0x02, 0x00,
3091  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3092  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3093  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xc0, 0x09,
3094  0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a,
3095  0x01, 0x00, 0x00, 0x1f, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01,
3096  0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00,
3097  0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00}},
3098  {TLS1_2_VERSION,
3099  {0x16, 0x03, 0x01, 0x00, 0x82, 0x01, 0x00, 0x00, 0x7e, 0x03, 0x03, 0x00,
3100  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3101  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3102  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xcc, 0xa9,
3103  0xcc, 0xa8, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30, 0xc0, 0x09,
3104  0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f,
3105  0x00, 0x35, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x37, 0x00, 0x17, 0x00, 0x00,
3106  0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00,
3107  0x1d, 0x00, 0x17, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00,
3108  0x23, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x12, 0x04, 0x03, 0x08,
3109  0x04, 0x04, 0x01, 0x05, 0x03, 0x08, 0x05, 0x05, 0x01, 0x08, 0x06, 0x06,
3110  0x01, 0x02, 0x01}},
3111  // TODO(davidben): Add a change detector for TLS 1.3 once the spec and our
3112  // implementation has settled enough that it won't change.
3113  };
3114 
3115  for (const auto &t : kTests) {
3116  SCOPED_TRACE(t.max_version);
3117 
3118  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
3119  ASSERT_TRUE(ctx);
3120  // Our default cipher list varies by CPU capabilities, so manually place the
3121  // ChaCha20 ciphers in front.
3122  const char *cipher_list = "CHACHA20:ALL";
3123  ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), t.max_version));
3124  ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(ctx.get(), cipher_list));
3125 
3126  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
3127  ASSERT_TRUE(ssl);
3128  std::vector<uint8_t> client_hello;
3129  ASSERT_TRUE(GetClientHello(ssl.get(), &client_hello));
3130 
3131  // Zero the client_random.
3132  constexpr size_t kRandomOffset = 1 + 2 + 2 + // record header
3133  1 + 3 + // handshake message header
3134  2; // client_version
3135  ASSERT_GE(client_hello.size(), kRandomOffset + SSL3_RANDOM_SIZE);
3136  OPENSSL_memset(client_hello.data() + kRandomOffset, 0, SSL3_RANDOM_SIZE);
3137 
3138  if (client_hello != t.expected) {
3139  ADD_FAILURE() << "ClientHellos did not match.";
3140  // Print the value manually so it is easier to update the test vector.
3141  for (size_t i = 0; i < client_hello.size(); i += 12) {
3142  printf(" %c", i == 0 ? '{' : ' ');
3143  for (size_t j = i; j < client_hello.size() && j < i + 12; j++) {
3144  if (j > i) {
3145  printf(" ");
3146  }
3147  printf("0x%02x", client_hello[j]);
3148  if (j < client_hello.size() - 1) {
3149  printf(",");
3150  }
3151  }
3152  if (i + 12 >= client_hello.size()) {
3153  printf("}},");
3154  }
3155  printf("\n");
3156  }
3157  }
3158  }
3159 }
3160 
3162  SSL_SESSION *session, bool want_reused) {
3163  bssl::UniquePtr<SSL> client, server;
3165  config.session = session;
3166  EXPECT_TRUE(
3168 
3170 
3171  bool was_reused = !!SSL_session_reused(client.get());
3172  EXPECT_EQ(was_reused, want_reused);
3173 }
3174 
3175 static bssl::UniquePtr<SSL_SESSION> ExpectSessionRenewed(SSL_CTX *client_ctx,
3177  SSL_SESSION *session) {
3178  g_last_session = nullptr;
3180 
3181  bssl::UniquePtr<SSL> client, server;
3183  config.session = session;
3185  config) ||
3186  !FlushNewSessionTickets(client.get(), server.get())) {
3187  fprintf(stderr, "Failed to connect client and server.\n");
3188  return nullptr;
3189  }
3190 
3191  if (SSL_session_reused(client.get()) != SSL_session_reused(server.get())) {
3192  fprintf(stderr, "Client and server were inconsistent.\n");
3193  return nullptr;
3194  }
3195 
3196  if (!SSL_session_reused(client.get())) {
3197  fprintf(stderr, "Session was not reused.\n");
3198  return nullptr;
3199  }
3200 
3202 
3203  if (!g_last_session) {
3204  fprintf(stderr, "Client did not receive a renewed session.\n");
3205  return nullptr;
3206  }
3207  return std::move(g_last_session);
3208 }
3209 
3210 static void ExpectTicketKeyChanged(SSL_CTX *ctx, uint8_t *inout_key,
3211  bool changed) {
3212  uint8_t new_key[kTicketKeyLen];
3213  // May return 0, 1 or 48.
3215  if (changed) {
3216  ASSERT_NE(Bytes(inout_key, kTicketKeyLen), Bytes(new_key));
3217  } else {
3218  ASSERT_EQ(Bytes(inout_key, kTicketKeyLen), Bytes(new_key));
3219  }
3220  OPENSSL_memcpy(inout_key, new_key, kTicketKeyLen);
3221 }
3222 
3223 static int SwitchSessionIDContextSNI(SSL *ssl, int *out_alert, void *arg) {
3224  static const uint8_t kContext[] = {3};
3225 
3226  if (!SSL_set_session_id_context(ssl, kContext, sizeof(kContext))) {
3228  }
3229 
3230  return SSL_TLSEXT_ERR_OK;
3231 }
3232 
3233 TEST_P(SSLVersionTest, SessionIDContext) {
3234  static const uint8_t kContext1[] = {1};
3235  static const uint8_t kContext2[] = {2};
3236 
3237  ASSERT_TRUE(SSL_CTX_set_session_id_context(server_ctx_.get(), kContext1,
3238  sizeof(kContext1)));
3239 
3242 
3243  bssl::UniquePtr<SSL_SESSION> session =
3244  CreateClientSession(client_ctx_.get(), server_ctx_.get());
3245  ASSERT_TRUE(session);
3246 
3247  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3248  session.get(),
3249  true /* expect session reused */));
3250 
3251  // Change the session ID context.
3252  ASSERT_TRUE(SSL_CTX_set_session_id_context(server_ctx_.get(), kContext2,
3253  sizeof(kContext2)));
3254 
3255  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3256  session.get(),
3257  false /* expect session not reused */));
3258 
3259  // Change the session ID context back and install an SNI callback to switch
3260  // it.
3261  ASSERT_TRUE(SSL_CTX_set_session_id_context(server_ctx_.get(), kContext1,
3262  sizeof(kContext1)));
3263 
3264  SSL_CTX_set_tlsext_servername_callback(server_ctx_.get(),
3266 
3267  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3268  session.get(),
3269  false /* expect session not reused */));
3270 
3271  // Switch the session ID context with the early callback instead.
3272  SSL_CTX_set_tlsext_servername_callback(server_ctx_.get(), nullptr);
3274  server_ctx_.get(),
3275  [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
3276  static const uint8_t kContext[] = {3};
3277 
3278  if (!SSL_set_session_id_context(client_hello->ssl, kContext,
3279  sizeof(kContext))) {
3280  return ssl_select_cert_error;
3281  }
3282 
3283  return ssl_select_cert_success;
3284  });
3285 
3286  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3287  session.get(),
3288  false /* expect session not reused */));
3289 }
3290 
3292 
3293 static void CurrentTimeCallback(const SSL *ssl, timeval *out_clock) {
3294  *out_clock = g_current_time;
3295 }
3296 
3297 static void FrozenTimeCallback(const SSL *ssl, timeval *out_clock) {
3298  out_clock->tv_sec = 1000;
3299  out_clock->tv_usec = 0;
3300 }
3301 
3302 static int RenewTicketCallback(SSL *ssl, uint8_t *key_name, uint8_t *iv,
3303  EVP_CIPHER_CTX *ctx, HMAC_CTX *hmac_ctx,
3304  int encrypt) {
3305  static const uint8_t kZeros[16] = {0};
3306 
3307  if (encrypt) {
3308  OPENSSL_memcpy(key_name, kZeros, sizeof(kZeros));
3309  RAND_bytes(iv, 16);
3310  } else if (OPENSSL_memcmp(key_name, kZeros, 16) != 0) {
3311  return 0;
3312  }
3313 
3314  if (!HMAC_Init_ex(hmac_ctx, kZeros, sizeof(kZeros), EVP_sha256(), NULL) ||
3315  !EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, kZeros, iv, encrypt)) {
3316  return -1;
3317  }
3318 
3319  // Returning two from the callback in decrypt mode renews the
3320  // session in TLS 1.2 and below.
3321  return encrypt ? 1 : 2;
3322 }
3323 
3324 static bool GetServerTicketTime(long *out, const SSL_SESSION *session) {
3325  const uint8_t *ticket;
3326  size_t ticket_len;
3327  SSL_SESSION_get0_ticket(session, &ticket, &ticket_len);
3328  if (ticket_len < 16 + 16 + SHA256_DIGEST_LENGTH) {
3329  return false;
3330  }
3331 
3332  const uint8_t *ciphertext = ticket + 16 + 16;
3333  size_t len = ticket_len - 16 - 16 - SHA256_DIGEST_LENGTH;
3334  std::unique_ptr<uint8_t[]> plaintext(new uint8_t[len]);
3335 
3336 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
3337  // Fuzzer-mode tickets are unencrypted.
3339 #else
3340  static const uint8_t kZeros[16] = {0};
3341  const uint8_t *iv = ticket + 16;
3342  bssl::ScopedEVP_CIPHER_CTX ctx;
3343  int len1, len2;
3344  if (!EVP_DecryptInit_ex(ctx.get(), EVP_aes_128_cbc(), nullptr, kZeros, iv) ||
3345  !EVP_DecryptUpdate(ctx.get(), plaintext.get(), &len1, ciphertext, len) ||
3346  !EVP_DecryptFinal_ex(ctx.get(), plaintext.get() + len1, &len2)) {
3347  return false;
3348  }
3349 
3350  len = static_cast<size_t>(len1 + len2);
3351 #endif
3352 
3353  bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
3354  if (!ssl_ctx) {
3355  return false;
3356  }
3357  bssl::UniquePtr<SSL_SESSION> server_session(
3358  SSL_SESSION_from_bytes(plaintext.get(), len, ssl_ctx.get()));
3359  if (!server_session) {
3360  return false;
3361  }
3362 
3363  *out = SSL_SESSION_get_time(server_session.get());
3364  return true;
3365 }
3366 
3367 TEST_P(SSLVersionTest, SessionTimeout) {
3368  for (bool server_test : {false, true}) {
3369  SCOPED_TRACE(server_test);
3370 
3371  ResetContexts();
3374 
3375  static const time_t kStartTime = 1000;
3376  g_current_time.tv_sec = kStartTime;
3377 
3378  // We are willing to use a longer lifetime for TLS 1.3 sessions as
3379  // resumptions still perform ECDHE.
3380  const time_t timeout = version() == TLS1_3_VERSION
3383 
3384  // Both client and server must enforce session timeouts. We configure the
3385  // other side with a frozen clock so it never expires tickets.
3386  if (server_test) {
3387  SSL_CTX_set_current_time_cb(client_ctx_.get(), FrozenTimeCallback);
3389  } else {
3391  SSL_CTX_set_current_time_cb(server_ctx_.get(), FrozenTimeCallback);
3392  }
3393 
3394  // Configure a ticket callback which renews tickets.
3396 
3397  bssl::UniquePtr<SSL_SESSION> session =
3398  CreateClientSession(client_ctx_.get(), server_ctx_.get());
3399  ASSERT_TRUE(session);
3400 
3401  // Advance the clock just behind the timeout.
3402  g_current_time.tv_sec += timeout - 1;
3403 
3404  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3405  session.get(),
3406  true /* expect session reused */));
3407 
3408  // Advance the clock one more second.
3410 
3411  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3412  session.get(),
3413  false /* expect session not reused */));
3414 
3415  // Rewind the clock to before the session was minted.
3416  g_current_time.tv_sec = kStartTime - 1;
3417 
3418  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3419  session.get(),
3420  false /* expect session not reused */));
3421 
3422  // Renew the session 10 seconds before expiration.
3423  time_t new_start_time = kStartTime + timeout - 10;
3424  g_current_time.tv_sec = new_start_time;
3425  bssl::UniquePtr<SSL_SESSION> new_session = ExpectSessionRenewed(
3426  client_ctx_.get(), server_ctx_.get(), session.get());
3427  ASSERT_TRUE(new_session);
3428 
3429  // This new session is not the same object as before.
3430  EXPECT_NE(session.get(), new_session.get());
3431 
3432  // Check the sessions have timestamps measured from issuance.
3433  long session_time = 0;
3434  if (server_test) {
3435  ASSERT_TRUE(GetServerTicketTime(&session_time, new_session.get()));
3436  } else {
3437  session_time = SSL_SESSION_get_time(new_session.get());
3438  }
3439 
3440  ASSERT_EQ(session_time, g_current_time.tv_sec);
3441 
3442  if (version() == TLS1_3_VERSION) {
3443  // Renewal incorporates fresh key material in TLS 1.3, so we extend the
3444  // lifetime TLS 1.3.
3445  g_current_time.tv_sec = new_start_time + timeout - 1;
3446  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3447  new_session.get(),
3448  true /* expect session reused */));
3449 
3450  // The new session expires after the new timeout.
3451  g_current_time.tv_sec = new_start_time + timeout + 1;
3452  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3453  new_session.get(),
3454  false /* expect session ot reused */));
3455 
3456  // Renew the session until it begins just past the auth timeout.
3457  time_t auth_end_time = kStartTime + SSL_DEFAULT_SESSION_AUTH_TIMEOUT;
3458  while (new_start_time < auth_end_time - 1000) {
3459  // Get as close as possible to target start time.
3460  new_start_time =
3461  std::min(auth_end_time - 1000, new_start_time + timeout - 1);
3462  g_current_time.tv_sec = new_start_time;
3463  new_session = ExpectSessionRenewed(client_ctx_.get(), server_ctx_.get(),
3464  new_session.get());
3465  ASSERT_TRUE(new_session);
3466  }
3467 
3468  // Now the session's lifetime is bound by the auth timeout.
3469  g_current_time.tv_sec = auth_end_time - 1;
3470  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3471  new_session.get(),
3472  true /* expect session reused */));
3473 
3474  g_current_time.tv_sec = auth_end_time + 1;
3475  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3476  new_session.get(),
3477  false /* expect session ot reused */));
3478  } else {
3479  // The new session is usable just before the old expiration.
3480  g_current_time.tv_sec = kStartTime + timeout - 1;
3481  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3482  new_session.get(),
3483  true /* expect session reused */));
3484 
3485  // Renewal does not extend the lifetime, so it is not usable beyond the
3486  // old expiration.
3487  g_current_time.tv_sec = kStartTime + timeout + 1;
3488  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3489  new_session.get(),
3490  false /* expect session not reused */));
3491  }
3492  }
3493 }
3494 
3495 TEST_P(SSLVersionTest, DefaultTicketKeyInitialization) {
3496  static const uint8_t kZeroKey[kTicketKeyLen] = {};
3497  uint8_t ticket_key[kTicketKeyLen];
3498  ASSERT_EQ(1, SSL_CTX_get_tlsext_ticket_keys(server_ctx_.get(), ticket_key,
3499  kTicketKeyLen));
3500  ASSERT_NE(0, OPENSSL_memcmp(ticket_key, kZeroKey, kTicketKeyLen));
3501 }
3502 
3503 TEST_P(SSLVersionTest, DefaultTicketKeyRotation) {
3504  static const time_t kStartTime = 1001;
3505  g_current_time.tv_sec = kStartTime;
3506 
3507  // We use session reuse as a proxy for ticket decryption success, hence
3508  // disable session timeouts.
3510  SSL_CTX_set_session_psk_dhe_timeout(server_ctx_.get(),
3512 
3513  SSL_CTX_set_current_time_cb(client_ctx_.get(), FrozenTimeCallback);
3515 
3518 
3519  // Initialize ticket_key with the current key and check that it was
3520  // initialized to something, not all zeros.
3521  uint8_t ticket_key[kTicketKeyLen] = {0};
3522  TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
3523  true /* changed */));
3524 
3525  // Verify ticket resumption actually works.
3526  bssl::UniquePtr<SSL> client, server;
3527  bssl::UniquePtr<SSL_SESSION> session =
3528  CreateClientSession(client_ctx_.get(), server_ctx_.get());
3529  ASSERT_TRUE(session);
3530  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3531  session.get(), true /* reused */));
3532 
3533  // Advance time to just before key rotation.
3535  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3536  session.get(), true /* reused */));
3537  TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
3538  false /* NOT changed */));
3539 
3540  // Force key rotation.
3541  g_current_time.tv_sec += 1;
3542  bssl::UniquePtr<SSL_SESSION> new_session =
3543  CreateClientSession(client_ctx_.get(), server_ctx_.get());
3544  TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
3545  true /* changed */));
3546 
3547  // Resumption with both old and new ticket should work.
3548  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3549  session.get(), true /* reused */));
3550  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3551  new_session.get(), true /* reused */));
3552  TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
3553  false /* NOT changed */));
3554 
3555  // Force key rotation again. Resumption with the old ticket now fails.
3557  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3558  session.get(), false /* NOT reused */));
3559  TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
3560  true /* changed */));
3561 
3562  // But resumption with the newer session still works.
3563  TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
3564  new_session.get(), true /* reused */));
3565 }
3566 
3567 static int SwitchContext(SSL *ssl, int *out_alert, void *arg) {
3568  SSL_CTX *ctx = reinterpret_cast<SSL_CTX *>(arg);
3569  SSL_set_SSL_CTX(ssl, ctx);
3570  return SSL_TLSEXT_ERR_OK;
3571 }
3572 
3573 TEST_P(SSLVersionTest, SNICallback) {
3574  bssl::UniquePtr<X509> cert2 = GetECDSATestCertificate();
3575  ASSERT_TRUE(cert2);
3576  bssl::UniquePtr<EVP_PKEY> key2 = GetECDSATestKey();
3577  ASSERT_TRUE(key2);
3578 
3579  // Test that switching the |SSL_CTX| at the SNI callback behaves correctly.
3580  static const uint16_t kECDSAWithSHA256 = SSL_SIGN_ECDSA_SECP256R1_SHA256;
3581 
3582  static const uint8_t kSCTList[] = {0, 6, 0, 4, 5, 6, 7, 8};
3583  static const uint8_t kOCSPResponse[] = {1, 2, 3, 4};
3584 
3585  bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
3586  ASSERT_TRUE(server_ctx2);
3587  ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx2.get(), cert2.get()));
3588  ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx2.get(), key2.get()));
3590  server_ctx2.get(), kSCTList, sizeof(kSCTList)));
3591  ASSERT_TRUE(SSL_CTX_set_ocsp_response(server_ctx2.get(), kOCSPResponse,
3592  sizeof(kOCSPResponse)));
3593  // Historically signing preferences would be lost in some cases with the
3594  // SNI callback, which triggers the TLS 1.2 SHA-1 default. To ensure
3595  // this doesn't happen when |version| is TLS 1.2, configure the private
3596  // key to only sign SHA-256.
3598  &kECDSAWithSHA256, 1));
3599 
3601  SSL_CTX_set_tlsext_servername_arg(server_ctx_.get(), server_ctx2.get());
3602 
3603  SSL_CTX_enable_signed_cert_timestamps(client_ctx_.get());
3604  SSL_CTX_enable_ocsp_stapling(client_ctx_.get());
3605 
3606  ASSERT_TRUE(Connect());
3607 
3608  // The client should have received |cert2|.
3609  bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(client_.get()));
3610  ASSERT_TRUE(peer);
3611  EXPECT_EQ(X509_cmp(peer.get(), cert2.get()), 0);
3612 
3613  // The client should have received |server_ctx2|'s SCT list.
3614  const uint8_t *data;
3615  size_t len;
3617  EXPECT_EQ(Bytes(kSCTList), Bytes(data, len));
3618 
3619  // The client should have received |server_ctx2|'s OCSP response.
3621  EXPECT_EQ(Bytes(kOCSPResponse), Bytes(data, len));
3622 }
3623 
3624 // Test that the early callback can swap the maximum version.
3625 TEST(SSLTest, EarlyCallbackVersionSwitch) {
3626  bssl::UniquePtr<SSL_CTX> server_ctx =
3628  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
3633 
3635  server_ctx.get(),
3636  [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
3637  if (!SSL_set_max_proto_version(client_hello->ssl, TLS1_2_VERSION)) {
3638  return ssl_select_cert_error;
3639  }
3640 
3641  return ssl_select_cert_success;
3642  });
3643 
3644  bssl::UniquePtr<SSL> client, server;
3646  server_ctx.get()));
3648 }
3649 
3650 TEST(SSLTest, SetVersion) {
3651  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
3652  ASSERT_TRUE(ctx);
3653 
3654  // Set valid TLS versions.
3655  for (const auto &vers : kAllVersions) {
3656  SCOPED_TRACE(vers.name);
3657  if (vers.ssl_method == VersionParam::is_tls) {
3658  EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), vers.version));
3659  EXPECT_EQ(SSL_CTX_get_max_proto_version(ctx.get()), vers.version);
3660  EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), vers.version));
3661  EXPECT_EQ(SSL_CTX_get_min_proto_version(ctx.get()), vers.version);
3662  }
3663  }
3664 
3665  // Invalid TLS versions are rejected.
3672 
3673  // Zero is the default version.
3678 
3679  // SSL 3.0 is not available.
3681 
3682  ctx.reset(SSL_CTX_new(DTLS_method()));
3683  ASSERT_TRUE(ctx);
3684 
3685  // Set valid DTLS versions.
3686  for (const auto &vers : kAllVersions) {
3687  SCOPED_TRACE(vers.name);
3688  if (vers.ssl_method == VersionParam::is_dtls) {
3689  EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), vers.version));
3690  EXPECT_EQ(SSL_CTX_get_max_proto_version(ctx.get()), vers.version);
3691  EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), vers.version));
3692  EXPECT_EQ(SSL_CTX_get_min_proto_version(ctx.get()), vers.version);
3693  }
3694  }
3695 
3696  // Invalid DTLS versions are rejected.
3698  EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0xfefe /* DTLS 1.1 */));
3699  EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0xfffe /* DTLS 0.1 */));
3702  EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0xfefe /* DTLS 1.1 */));
3703  EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0xfffe /* DTLS 0.1 */));
3705 
3706  // Zero is the default version.
3711 }
3712 
3713 static const char *GetVersionName(uint16_t version) {
3714  switch (version) {
3715  case TLS1_VERSION:
3716  return "TLSv1";
3717  case TLS1_1_VERSION:
3718  return "TLSv1.1";
3719  case TLS1_2_VERSION:
3720  return "TLSv1.2";
3721  case TLS1_3_VERSION:
3722  return "TLSv1.3";
3723  case DTLS1_VERSION:
3724  return "DTLSv1";
3725  case DTLS1_2_VERSION:
3726  return "DTLSv1.2";
3727  default:
3728  return "???";
3729  }
3730 }
3731 
3733  ASSERT_TRUE(Connect());
3734 
3735  EXPECT_EQ(SSL_version(client_.get()), version());
3736  EXPECT_EQ(SSL_version(server_.get()), version());
3737 
3738  // Test the version name is reported as expected.
3739  const char *version_name = GetVersionName(version());
3740  EXPECT_EQ(strcmp(version_name, SSL_get_version(client_.get())), 0);
3741  EXPECT_EQ(strcmp(version_name, SSL_get_version(server_.get())), 0);
3742 
3743  // Test SSL_SESSION reports the same name.
3744  const char *client_name =
3746  const char *server_name =
3748  EXPECT_EQ(strcmp(version_name, client_name), 0);
3749  EXPECT_EQ(strcmp(version_name, server_name), 0);
3750 }
3751 
3752 // Tests that that |SSL_get_pending_cipher| is available during the ALPN
3753 // selection callback.
3754 TEST_P(SSLVersionTest, ALPNCipherAvailable) {
3755  ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
3756 
3757  static const uint8_t kALPNProtos[] = {0x03, 'f', 'o', 'o'};
3758  ASSERT_EQ(SSL_CTX_set_alpn_protos(client_ctx_.get(), kALPNProtos,
3759  sizeof(kALPNProtos)),
3760  0);
3761 
3762  // The ALPN callback does not fail the handshake on error, so have the
3763  // callback write a boolean.
3764  std::pair<uint16_t, bool> callback_state(version(), false);
3766  server_ctx_.get(),
3767  [](SSL *ssl, const uint8_t **out, uint8_t *out_len, const uint8_t *in,
3768  unsigned in_len, void *arg) -> int {
3769  auto state = reinterpret_cast<std::pair<uint16_t, bool> *>(arg);
3770  if (SSL_get_pending_cipher(ssl) != nullptr &&
3771  SSL_version(ssl) == state->first) {
3772  state->second = true;
3773  }
3774  return SSL_TLSEXT_ERR_NOACK;
3775  },
3776  &callback_state);
3777 
3778  ASSERT_TRUE(Connect());
3779 
3780  ASSERT_TRUE(callback_state.second);
3781 }
3782 
3783 TEST_P(SSLVersionTest, SSLClearSessionResumption) {
3784  // Skip this for TLS 1.3. TLS 1.3's ticket mechanism is incompatible with this
3785  // API pattern.
3786  if (version() == TLS1_3_VERSION) {
3787  return;
3788  }
3789 
3790  shed_handshake_config_ = false;
3791  ASSERT_TRUE(Connect());
3792 
3795 
3796  // Reset everything.
3797  ASSERT_TRUE(SSL_clear(client_.get()));
3798  ASSERT_TRUE(SSL_clear(server_.get()));
3799 
3800  // Attempt to connect a second time.
3802 
3803  // |SSL_clear| should implicitly offer the previous session to the server.
3806 }
3807 
3808 TEST_P(SSLVersionTest, SSLClearFailsWithShedding) {
3809  shed_handshake_config_ = false;
3810  ASSERT_TRUE(Connect());
3812 
3813  // Reset everything.
3814  ASSERT_TRUE(SSL_clear(client_.get()));
3815  ASSERT_TRUE(SSL_clear(server_.get()));
3816 
3817  // Now enable shedding, and connect a second time.
3818  shed_handshake_config_ = true;
3819  ASSERT_TRUE(Connect());
3821 
3822  // |SSL_clear| should now fail.
3823  ASSERT_FALSE(SSL_clear(client_.get()));
3824  ASSERT_FALSE(SSL_clear(server_.get()));
3825 }
3826 
3827 static bool ChainsEqual(STACK_OF(X509) * chain,
3828  const std::vector<X509 *> &expected) {
3829  if (sk_X509_num(chain) != expected.size()) {
3830  return false;
3831  }
3832 
3833  for (size_t i = 0; i < expected.size(); i++) {
3834  if (X509_cmp(sk_X509_value(chain, i), expected[i]) != 0) {
3835  return false;
3836  }
3837  }
3838 
3839  return true;
3840 }
3841 
3842 TEST_P(SSLVersionTest, AutoChain) {
3843  cert_ = GetChainTestCertificate();
3844  ASSERT_TRUE(cert_);
3845  key_ = GetChainTestKey();
3846  ASSERT_TRUE(key_);
3847  bssl::UniquePtr<X509> intermediate = GetChainTestIntermediate();
3848  ASSERT_TRUE(intermediate);
3849 
3850  ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
3851  ASSERT_TRUE(UseCertAndKey(server_ctx_.get()));
3852 
3853  // Configure both client and server to accept any certificate. Add
3854  // |intermediate| to the cert store.
3856  intermediate.get()));
3858  intermediate.get()));
3859  SSL_CTX_set_verify(client_ctx_.get(),
3861  nullptr);
3862  SSL_CTX_set_verify(server_ctx_.get(),
3864  nullptr);
3865  SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
3866  SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
3867 
3868  // By default, the client and server should each only send the leaf.
3869  ASSERT_TRUE(Connect());
3870 
3871  EXPECT_TRUE(
3872  ChainsEqual(SSL_get_peer_full_cert_chain(client_.get()), {cert_.get()}));
3873  EXPECT_TRUE(
3874  ChainsEqual(SSL_get_peer_full_cert_chain(server_.get()), {cert_.get()}));
3875 
3876  // If auto-chaining is enabled, then the intermediate is sent.
3877  SSL_CTX_clear_mode(client_ctx_.get(), SSL_MODE_NO_AUTO_CHAIN);
3878  SSL_CTX_clear_mode(server_ctx_.get(), SSL_MODE_NO_AUTO_CHAIN);
3879  ASSERT_TRUE(Connect());
3880 
3882  {cert_.get(), intermediate.get()}));
3884  {cert_.get(), intermediate.get()}));
3885 
3886  // Auto-chaining does not override explicitly-configured intermediates.
3887  ASSERT_TRUE(SSL_CTX_add1_chain_cert(client_ctx_.get(), cert_.get()));
3888  ASSERT_TRUE(SSL_CTX_add1_chain_cert(server_ctx_.get(), cert_.get()));
3889  ASSERT_TRUE(Connect());
3890 
3892  {cert_.get(), cert_.get()}));
3893 
3895  {cert_.get(), cert_.get()}));
3896 }
3897 
3898 static bool ExpectBadWriteRetry() {
3899  int err = ERR_get_error();
3900  if (ERR_GET_LIB(err) != ERR_LIB_SSL ||
3903  ERR_error_string_n(err, buf, sizeof(buf));
3904  fprintf(stderr, "Wanted SSL_R_BAD_WRITE_RETRY, got: %s.\n", buf);
3905  return false;
3906  }
3907 
3908  if (ERR_peek_error() != 0) {
3909  fprintf(stderr, "Unexpected error following SSL_R_BAD_WRITE_RETRY.\n");
3910  return false;
3911  }
3912 
3913  return true;
3914 }
3915 
3916 TEST_P(SSLVersionTest, SSLWriteRetry) {
3917  if (is_dtls()) {
3918  return;
3919  }
3920 
3921  for (bool enable_partial_write : {false, true}) {
3922  SCOPED_TRACE(enable_partial_write);
3923 
3924  // Connect a client and server.
3925  ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
3926 
3927  ASSERT_TRUE(Connect());
3928 
3929  if (enable_partial_write) {
3931  }
3932 
3933  // Write without reading until the buffer is full and we have an unfinished
3934  // write. Keep a count so we may reread it again later. "hello!" will be
3935  // written in two chunks, "hello" and "!".
3936  char data[] = "hello!";
3937  static const int kChunkLen = 5; // The length of "hello".
3938  unsigned count = 0;
3939  for (;;) {
3940  int ret = SSL_write(client_.get(), data, kChunkLen);
3941  if (ret <= 0) {
3943  break;
3944  }
3945 
3946  ASSERT_EQ(ret, 5);
3947 
3948  count++;
3949  }
3950 
3951  // Retrying with the same parameters is legal.
3952  ASSERT_EQ(
3953  SSL_get_error(client_.get(), SSL_write(client_.get(), data, kChunkLen)),
3955 
3956  // Retrying with the same buffer but shorter length is not legal.
3958  SSL_write(client_.get(), data, kChunkLen - 1)),
3959  SSL_ERROR_SSL);
3961 
3962  // Retrying with a different buffer pointer is not legal.
3963  char data2[] = "hello";
3965  SSL_write(client_.get(), data2, kChunkLen)),
3966  SSL_ERROR_SSL);
3968 
3969  // With |SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|, the buffer may move.
3972  SSL_write(client_.get(), data2, kChunkLen)),
3974 
3975  // |SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER| does not disable length checks.
3977  SSL_write(client_.get(), data2, kChunkLen - 1)),
3978  SSL_ERROR_SSL);
3980 
3981  // Retrying with a larger buffer is legal.
3983  SSL_write(client_.get(), data, kChunkLen + 1)),
3985 
3986  // Drain the buffer.
3987  char buf[20];
3988  for (unsigned i = 0; i < count; i++) {
3989  ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
3990  ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
3991  }
3992 
3993  // Now that there is space, a retry with a larger buffer should flush the
3994  // pending record, skip over that many bytes of input (on assumption they
3995  // are the same), and write the remainder. If SSL_MODE_ENABLE_PARTIAL_WRITE
3996  // is set, this will complete in two steps.
3997  char data3[] = "_____!";
3998  if (enable_partial_write) {
3999  ASSERT_EQ(SSL_write(client_.get(), data3, kChunkLen + 1), kChunkLen);
4000  ASSERT_EQ(SSL_write(client_.get(), data3 + kChunkLen, 1), 1);
4001  } else {
4002  ASSERT_EQ(SSL_write(client_.get(), data3, kChunkLen + 1), kChunkLen + 1);
4003  }
4004 
4005  // Check the last write was correct. The data will be spread over two
4006  // records, so SSL_read returns twice.
4007  ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
4008  ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
4009  ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), 1);
4010  ASSERT_EQ(buf[0], '!');
4011  }
4012 }
4013 
4014 TEST_P(SSLVersionTest, RecordCallback) {
4015  for (bool test_server : {true, false}) {
4017  ResetContexts();
4018 
4019  bool read_seen = false;
4020  bool write_seen = false;
4021  auto cb = [&](int is_write, int cb_version, int cb_type, const void *buf,
4022  size_t len, SSL *ssl) {
4023  if (cb_type != SSL3_RT_HEADER) {
4024  return;
4025  }
4026 
4027  // The callback does not report a version for records.
4028  EXPECT_EQ(0, cb_version);
4029 
4030  if (is_write) {
4031  write_seen = true;
4032  } else {
4033  read_seen = true;
4034  }
4035 
4036  // Sanity-check that the record header is plausible.
4037  CBS cbs;
4038  CBS_init(&cbs, reinterpret_cast<const uint8_t *>(buf), len);
4039  uint8_t type;
4040  uint16_t record_version, length;
4042  ASSERT_TRUE(CBS_get_u16(&cbs, &record_version));
4043  EXPECT_EQ(record_version & 0xff00, version() & 0xff00);
4044  if (is_dtls()) {
4045  uint16_t epoch;
4047  EXPECT_TRUE(epoch == 0 || epoch == 1) << "Invalid epoch: " << epoch;
4048  ASSERT_TRUE(CBS_skip(&cbs, 6));
4049  }
4051  EXPECT_EQ(0u, CBS_len(&cbs));
4052  };
4053  using CallbackType = decltype(cb);
4054  SSL_CTX *ctx = test_server ? server_ctx_.get() : client_ctx_.get();
4056  ctx, [](int is_write, int cb_version, int cb_type, const void *buf,
4057  size_t len, SSL *ssl, void *arg) {
4058  CallbackType *cb_ptr = reinterpret_cast<CallbackType *>(arg);
4059  (*cb_ptr)(is_write, cb_version, cb_type, buf, len, ssl);
4060  });
4062 
4063  ASSERT_TRUE(Connect());
4064 
4065  EXPECT_TRUE(read_seen);
4066  EXPECT_TRUE(write_seen);
4067  }
4068 }
4069 
4070 TEST_P(SSLVersionTest, GetServerName) {
4072  config.servername = "host1";
4073 
4075  server_ctx_.get(), [](SSL *ssl, int *out_alert, void *arg) -> int {
4076  // During the handshake, |SSL_get_servername| must match |config|.
4077  ClientConfig *config_p = reinterpret_cast<ClientConfig *>(arg);
4078  EXPECT_STREQ(config_p->servername.c_str(),
4079  SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name));
4080  return SSL_TLSEXT_ERR_OK;
4081  });
4082  SSL_CTX_set_tlsext_servername_arg(server_ctx_.get(), &config);
4083 
4085  // After the handshake, it must also be available.
4086  EXPECT_STREQ(config.servername.c_str(),
4088 
4089  // Establish a session under host1.
4092  bssl::UniquePtr<SSL_SESSION> session =
4093  CreateClientSession(client_ctx_.get(), server_ctx_.get(), config);
4094 
4095  // If the client resumes a session with a different name, |SSL_get_servername|
4096  // must return the new name.
4097  ASSERT_TRUE(session);
4098  config.session = session.get();
4099  config.servername = "host2";
4101  EXPECT_STREQ(config.servername.c_str(),
4103 }
4104 
4105 // Test that session cache mode bits are honored in the client session callback.
4106 TEST_P(SSLVersionTest, ClientSessionCacheMode) {
4108  EXPECT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
4109 
4111  EXPECT_TRUE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
4112 
4114  EXPECT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
4115 }
4116 
4117 // Test that all versions survive tiny write buffers. In particular, TLS 1.3
4118 // NewSessionTickets are written post-handshake. Servers that block
4119 // |SSL_do_handshake| on writing them will deadlock if clients are not draining
4120 // the buffer. Test that we do not do this.
4121 TEST_P(SSLVersionTest, SmallBuffer) {
4122  // DTLS is a datagram protocol and requires packet-sized buffers.
4123  if (is_dtls()) {
4124  return;
4125  }
4126 
4127  // Test both flushing NewSessionTickets with a zero-sized write and
4128  // non-zero-sized write.
4129  for (bool use_zero_write : {false, true}) {
4130  SCOPED_TRACE(use_zero_write);
4131 
4132  g_last_session = nullptr;
4134  SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
4135 
4136  bssl::UniquePtr<SSL> client(SSL_new(client_ctx_.get())),
4137  server(SSL_new(server_ctx_.get()));
4142 
4143  // Use a tiny buffer.
4144  BIO *bio1, *bio2;
4145  ASSERT_TRUE(BIO_new_bio_pair(&bio1, 1, &bio2, 1));
4146 
4147  // SSL_set_bio takes ownership.
4148  SSL_set_bio(client.get(), bio1, bio1);
4149  SSL_set_bio(server.get(), bio2, bio2);
4150 
4152  if (version() >= TLS1_3_VERSION) {
4153  // The post-handshake ticket should not have been processed yet.
4155  }
4156 
4157  if (use_zero_write) {
4160  }
4161 
4162  // Send some data from server to client. If |use_zero_write| is false, this
4163  // will also flush the NewSessionTickets.
4164  static const char kMessage[] = "hello world";
4165  char buf[sizeof(kMessage)];
4166  for (;;) {
4167  int server_ret = SSL_write(server.get(), kMessage, sizeof(kMessage));
4168  int server_err = SSL_get_error(server.get(), server_ret);
4169  int client_ret = SSL_read(client.get(), buf, sizeof(buf));
4170  int client_err = SSL_get_error(client.get(), client_ret);
4171 
4172  // The server will write a single record, so every iteration should see
4173  // |SSL_ERROR_WANT_WRITE| and |SSL_ERROR_WANT_READ|, until the final
4174  // iteration, where both will complete.
4175  if (server_ret > 0) {
4176  EXPECT_EQ(server_ret, static_cast<int>(sizeof(kMessage)));
4177  EXPECT_EQ(client_ret, static_cast<int>(sizeof(kMessage)));
4178  EXPECT_EQ(Bytes(buf), Bytes(kMessage));
4179  break;
4180  }
4181 
4182  ASSERT_EQ(server_ret, -1);
4183  ASSERT_EQ(server_err, SSL_ERROR_WANT_WRITE);
4184  ASSERT_EQ(client_ret, -1);
4185  ASSERT_EQ(client_err, SSL_ERROR_WANT_READ);
4186  }
4187 
4188  // The NewSessionTickets should have been flushed and processed.
4190  }
4191 }
4192 
4193 TEST(SSLTest, AddChainCertHack) {
4194  // Ensure that we don't accidently break the hack that we have in place to
4195  // keep curl and serf happy when they use an |X509| even after transfering
4196  // ownership.
4197 
4198  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
4199  ASSERT_TRUE(ctx);
4200  X509 *cert = GetTestCertificate().release();
4201  ASSERT_TRUE(cert);
4202  SSL_CTX_add0_chain_cert(ctx.get(), cert);
4203 
4204  // This should not trigger a use-after-free.
4205  X509_cmp(cert, cert);
4206 }
4207 
4209  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
4210  ASSERT_TRUE(ctx);
4211  bssl::UniquePtr<X509> cert = GetTestCertificate();
4212  ASSERT_TRUE(cert);
4213  ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
4214  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
4215  ASSERT_TRUE(ssl);
4216 
4217  X509 *cert2 = SSL_CTX_get0_certificate(ctx.get());
4218  ASSERT_TRUE(cert2);
4219  X509 *cert3 = SSL_get_certificate(ssl.get());
4220  ASSERT_TRUE(cert3);
4221 
4222  // The old and new certificates must be identical.
4223  EXPECT_EQ(0, X509_cmp(cert.get(), cert2));
4224  EXPECT_EQ(0, X509_cmp(cert.get(), cert3));
4225 
4226  uint8_t *der = nullptr;
4227  long der_len = i2d_X509(cert.get(), &der);
4228  ASSERT_LT(0, der_len);
4229  bssl::UniquePtr<uint8_t> free_der(der);
4230 
4231  uint8_t *der2 = nullptr;
4232  long der2_len = i2d_X509(cert2, &der2);
4233  ASSERT_LT(0, der2_len);
4234  bssl::UniquePtr<uint8_t> free_der2(der2);
4235 
4236  uint8_t *der3 = nullptr;
4237  long der3_len = i2d_X509(cert3, &der3);
4238  ASSERT_LT(0, der3_len);
4239  bssl::UniquePtr<uint8_t> free_der3(der3);
4240 
4241  // They must also encode identically.
4242  EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len));
4243  EXPECT_EQ(Bytes(der, der_len), Bytes(der3, der3_len));
4244 }
4245 
4246 TEST(SSLTest, SetChainAndKeyMismatch) {
4247  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_with_buffers_method()));
4248  ASSERT_TRUE(ctx);
4249 
4250  bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
4251  ASSERT_TRUE(key);
4252  bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
4253  ASSERT_TRUE(leaf);
4254  std::vector<CRYPTO_BUFFER*> chain = {
4255  leaf.get(),
4256  };
4257 
4258  // Should fail because |GetTestKey| doesn't match the chain-test certificate.
4259  ASSERT_FALSE(SSL_CTX_set_chain_and_key(ctx.get(), &chain[0], chain.size(),
4260  key.get(), nullptr));
4261  ERR_clear_error();
4262 }
4263 
4264 TEST(SSLTest, SetChainAndKey) {
4265  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4267  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4269 
4270  ASSERT_EQ(nullptr, SSL_CTX_get0_chain(server_ctx.get()));
4271 
4272  bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
4273  ASSERT_TRUE(key);
4274  bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
4275  ASSERT_TRUE(leaf);
4276  bssl::UniquePtr<CRYPTO_BUFFER> intermediate =
4278  ASSERT_TRUE(intermediate);
4279  std::vector<CRYPTO_BUFFER*> chain = {
4280  leaf.get(), intermediate.get(),
4281  };
4283  chain.size(), key.get(), nullptr));
4284 
4285  ASSERT_EQ(chain.size(),
4287 
4289  client_ctx.get(), SSL_VERIFY_PEER,
4290  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4291  return ssl_verify_ok;
4292  });
4293 
4294  bssl::UniquePtr<SSL> client, server;
4296  server_ctx.get()));
4297 }
4298 
4299 TEST(SSLTest, BuffersFailWithoutCustomVerify) {
4300  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4302  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4304 
4305  bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
4306  ASSERT_TRUE(key);
4307  bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
4308  ASSERT_TRUE(leaf);
4309  std::vector<CRYPTO_BUFFER*> chain = { leaf.get() };
4311  chain.size(), key.get(), nullptr));
4312 
4313  // Without SSL_CTX_set_custom_verify(), i.e. with everything in the default
4314  // configuration, certificate verification should fail.
4315  bssl::UniquePtr<SSL> client, server;
4317  server_ctx.get()));
4318 
4319  // Whereas with a verifier, the connection should succeed.
4321  client_ctx.get(), SSL_VERIFY_PEER,
4322  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4323  return ssl_verify_ok;
4324  });
4326  server_ctx.get()));
4327 }
4328 
4329 TEST(SSLTest, CustomVerify) {
4330  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4332  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4334 
4335  bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
4336  ASSERT_TRUE(key);
4337  bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
4338  ASSERT_TRUE(leaf);
4339  std::vector<CRYPTO_BUFFER*> chain = { leaf.get() };
4341  chain.size(), key.get(), nullptr));
4342 
4344  client_ctx.get(), SSL_VERIFY_PEER,
4345  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4346  return ssl_verify_ok;
4347  });
4348 
4349  bssl::UniquePtr<SSL> client, server;
4351  server_ctx.get()));
4352 
4353  // With SSL_VERIFY_PEER, ssl_verify_invalid should result in a dropped
4354  // connection.
4356  client_ctx.get(), SSL_VERIFY_PEER,
4357  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4358  return ssl_verify_invalid;
4359  });
4360 
4362  server_ctx.get()));
4363 
4364  // But with SSL_VERIFY_NONE, ssl_verify_invalid should not cause a dropped
4365  // connection.
4367  client_ctx.get(), SSL_VERIFY_NONE,
4368  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4369  return ssl_verify_invalid;
4370  });
4371 
4373  server_ctx.get()));
4374 }
4375 
4376 TEST(SSLTest, ClientCABuffers) {
4377  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4379  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
4381 
4382  bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
4383  ASSERT_TRUE(key);
4384  bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
4385  ASSERT_TRUE(leaf);
4386  bssl::UniquePtr<CRYPTO_BUFFER> intermediate =
4388  ASSERT_TRUE(intermediate);
4389  std::vector<CRYPTO_BUFFER *> chain = {
4390  leaf.get(),
4391  intermediate.get(),
4392  };
4394  chain.size(), key.get(), nullptr));
4395 
4396  bssl::UniquePtr<CRYPTO_BUFFER> ca_name(
4397  CRYPTO_BUFFER_new(kTestName, sizeof(kTestName), nullptr));
4398  ASSERT_TRUE(ca_name);
4401  ASSERT_TRUE(ca_names);
4402  ASSERT_TRUE(PushToStack(ca_names.get(), std::move(ca_name)));
4403  SSL_CTX_set0_client_CAs(server_ctx.get(), ca_names.release());
4404 
4405  // Configure client and server to accept all certificates.
4407  client_ctx.get(), SSL_VERIFY_PEER,
4408  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4409  return ssl_verify_ok;
4410  });
4412  server_ctx.get(), SSL_VERIFY_PEER,
4413  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
4414  return ssl_verify_ok;
4415  });
4416 
4417  bool cert_cb_called = false;
4419  client_ctx.get(),
4420  [](SSL *ssl, void *arg) -> int {
4421  const STACK_OF(CRYPTO_BUFFER) *peer_names =
4422  SSL_get0_server_requested_CAs(ssl);
4423  EXPECT_EQ(1u, sk_CRYPTO_BUFFER_num(peer_names));
4424  CRYPTO_BUFFER *peer_name = sk_CRYPTO_BUFFER_value(peer_names, 0);
4425  EXPECT_EQ(Bytes(kTestName), Bytes(CRYPTO_BUFFER_data(peer_name),
4426  CRYPTO_BUFFER_len(peer_name)));
4427  *reinterpret_cast<bool *>(arg) = true;
4428  return 1;
4429  },
4430  &cert_cb_called);
4431 
4432  bssl::UniquePtr<SSL> client, server;
4434  server_ctx.get()));
4435  EXPECT_TRUE(cert_cb_called);
4436 }
4437 
4438 // Configuring the empty cipher list, though an error, should still modify the
4439 // configuration.
4440 TEST(SSLTest, EmptyCipherList) {
4441  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
4442  ASSERT_TRUE(ctx);
4443 
4444  // Initially, the cipher list is not empty.
4446 
4447  // Configuring the empty cipher list fails.
4449  ERR_clear_error();
4450 
4451  // But the cipher list is still updated to empty.
4453 }
4454 
4455 // ssl_test_ticket_aead_failure_mode enumerates the possible ways in which the
4456 // test |SSL_TICKET_AEAD_METHOD| can fail.
4462 };
4463 
4465  unsigned retry_count;
4467 };
4468 
4470  const CRYPTO_EX_DATA *from,
4471  void **from_d, int index,
4472  long argl, void *argp) {
4473  abort();
4474 }
4475 
4476 static void ssl_test_ticket_aead_ex_index_free(void *parent, void *ptr,
4477  CRYPTO_EX_DATA *ad, int index,
4478  long argl, void *argp) {
4479  auto state = reinterpret_cast<ssl_test_ticket_aead_state*>(ptr);
4480  if (state == nullptr) {
4481  return;
4482  }
4483 
4485 }
4486 
4489 
4493  0, nullptr, nullptr, ssl_test_ticket_aead_ex_index_dup,
4495  });
4497 }
4498 
4500  return 1;
4501 }
4502 
4503 static int ssl_test_ticket_aead_seal(SSL *ssl, uint8_t *out, size_t *out_len,
4504  size_t max_out_len, const uint8_t *in,
4505  size_t in_len) {
4506  auto state = reinterpret_cast<ssl_test_ticket_aead_state *>(
4508 
4509  if (state->failure_mode == ssl_test_ticket_aead_seal_fail ||
4510  max_out_len < in_len + 1) {
4511  return 0;
4512  }
4513 
4514  OPENSSL_memmove(out, in, in_len);
4515  out[in_len] = 0xff;
4516  *out_len = in_len + 1;
4517 
4518  return 1;
4519 }
4520 
4521 static ssl_ticket_aead_result_t ssl_test_ticket_aead_open(
4522  SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out_len,
4523  const uint8_t *in, size_t in_len) {
4524  auto state = reinterpret_cast<ssl_test_ticket_aead_state *>(
4526 
4527  if (state->retry_count > 0) {
4528  state->retry_count--;
4529  return ssl_ticket_aead_retry;
4530  }
4531 
4532  switch (state->failure_mode) {
4534  break;
4536  // If |seal| failed then there shouldn't be any ticket to try and
4537  // decrypt.
4538  abort();
4539  break;
4543  return ssl_ticket_aead_error;
4544  }
4545 
4546  if (in_len == 0 || in[in_len - 1] != 0xff) {
4548  }
4549 
4550  if (max_out_len < in_len - 1) {
4551  return ssl_ticket_aead_error;
4552  }
4553 
4554  OPENSSL_memmove(out, in, in_len - 1);
4555  *out_len = in_len - 1;
4556  return ssl_ticket_aead_success;
4557 }
4558 
4563 };
4564 
4566  bssl::UniquePtr<SSL> *out_client, bssl::UniquePtr<SSL> *out_server,
4567  SSL_CTX *client_ctx, SSL_CTX *server_ctx, unsigned retry_count,
4568  ssl_test_ticket_aead_failure_mode failure_mode, SSL_SESSION *session) {
4569  bssl::UniquePtr<SSL> client(SSL_new(client_ctx)), server(SSL_new(server_ctx));
4574 
4575  auto state = reinterpret_cast<ssl_test_ticket_aead_state *>(
4577  ASSERT_TRUE(state);
4579  state->retry_count = retry_count;
4580  state->failure_mode = failure_mode;
4581 
4583  state));
4584 
4585  SSL_set_session(client.get(), session);
4586 
4587  BIO *bio1, *bio2;
4588  ASSERT_TRUE(BIO_new_bio_pair(&bio1, 0, &bio2, 0));
4589 
4590  // SSL_set_bio takes ownership.
4591  SSL_set_bio(client.get(), bio1, bio1);
4592  SSL_set_bio(server.get(), bio2, bio2);
4593 
4594  if (CompleteHandshakes(client.get(), server.get())) {
4595  *out_client = std::move(client);
4596  *out_server = std::move(server);
4597  } else {
4598  out_client->reset();
4599  out_server->reset();
4600  }
4601 }
4602 
4603 using TicketAEADMethodParam =
4604  testing::tuple<uint16_t, unsigned, ssl_test_ticket_aead_failure_mode>;
4605 
4607  : public ::testing::TestWithParam<TicketAEADMethodParam> {};
4608 
4610  bssl::UniquePtr<SSL_CTX> server_ctx =
4613  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
4615 
4616  const uint16_t version = testing::get<0>(GetParam());
4617  const unsigned retry_count = testing::get<1>(GetParam());
4618  const ssl_test_ticket_aead_failure_mode failure_mode =
4619  testing::get<2>(GetParam());
4620 
4625 
4631 
4633 
4634  bssl::UniquePtr<SSL> client, server;
4636  server_ctx.get(), retry_count,
4637  failure_mode, nullptr);
4638  switch (failure_mode) {
4643  break;
4646  return;
4647  }
4650 
4652  bssl::UniquePtr<SSL_SESSION> session = std::move(g_last_session);
4654  server_ctx.get(), retry_count,
4655  failure_mode, session.get());
4656  switch (failure_mode) {
4661  break;
4663  abort();
4664  break;
4667  break;
4672  }
4673 }
4674 
4677  std::string ret = GetVersionName(std::get<0>(params.param));
4678  // GTest only allows alphanumeric characters and '_' in the parameter
4679  // string. Additionally filter out the 'v' to get "TLS13" over "TLSv13".
4680  for (auto it = ret.begin(); it != ret.end();) {
4681  if (*it == '.' || *it == 'v') {
4682  it = ret.erase(it);
4683  } else {
4684  ++it;
4685  }
4686  }
4687  char retry_count[256];
4688  snprintf(retry_count, sizeof(retry_count), "%d", std::get<1>(params.param));
4689  ret += "_";
4690  ret += retry_count;
4691  ret += "Retries_";
4692  switch (std::get<2>(params.param)) {
4694  ret += "OK";
4695  break;
4697  ret += "SealFail";
4698  break;
4700  ret += "OpenSoftFail";
4701  break;
4703  ret += "OpenHardFail";
4704  break;
4705  }
4706  return ret;
4707 }
4708 
4710  TicketAEADMethodTests, TicketAEADMethodTest,
4712  testing::Values(0, 1, 2),
4718 
4719 TEST(SSLTest, SelectNextProto) {
4720  uint8_t *result;
4721  uint8_t result_len;
4722 
4723  // If there is an overlap, it should be returned.
4725  SSL_select_next_proto(&result, &result_len,
4726  (const uint8_t *)"\1a\2bb\3ccc", 9,
4727  (const uint8_t *)"\1x\1y\1a\1z", 8));
4728  EXPECT_EQ(Bytes("a"), Bytes(result, result_len));
4729 
4731  SSL_select_next_proto(&result, &result_len,
4732  (const uint8_t *)"\1a\2bb\3ccc", 9,
4733  (const uint8_t *)"\1x\1y\2bb\1z", 9));
4734  EXPECT_EQ(Bytes("bb"), Bytes(result, result_len));
4735 
4737  SSL_select_next_proto(&result, &result_len,
4738  (const uint8_t *)"\1a\2bb\3ccc", 9,
4739  (const uint8_t *)"\1x\1y\3ccc\1z", 10));
4740  EXPECT_EQ(Bytes("ccc"), Bytes(result, result_len));
4741 
4742  // Peer preference order takes precedence over local.
4744  SSL_select_next_proto(&result, &result_len,
4745  (const uint8_t *)"\1a\2bb\3ccc", 9,
4746  (const uint8_t *)"\3ccc\2bb\1a", 9));
4747  EXPECT_EQ(Bytes("a"), Bytes(result, result_len));
4748 
4749  // If there is no overlap, return the first local protocol.
4751  SSL_select_next_proto(&result, &result_len,
4752  (const uint8_t *)"\1a\2bb\3ccc", 9,
4753  (const uint8_t *)"\1x\2yy\3zzz", 9));
4754  EXPECT_EQ(Bytes("x"), Bytes(result, result_len));
4755 
4757  SSL_select_next_proto(&result, &result_len, nullptr, 0,
4758  (const uint8_t *)"\1x\2yy\3zzz", 9));
4759  EXPECT_EQ(Bytes("x"), Bytes(result, result_len));
4760 }
4761 
4762 TEST(SSLTest, SealRecord) {
4763  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
4767 
4768  bssl::UniquePtr<SSL> client, server;
4770  server_ctx.get()));
4771 
4772  const std::vector<uint8_t> record = {1, 2, 3, 4, 5};
4773  std::vector<uint8_t> prefix(
4774  bssl::SealRecordPrefixLen(client.get(), record.size())),
4775  body(record.size()),
4776  suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
4779  record));
4780 
4781  std::vector<uint8_t> sealed;
4782  sealed.insert(sealed.end(), prefix.begin(), prefix.end());
4783  sealed.insert(sealed.end(), body.begin(), body.end());
4784  sealed.insert(sealed.end(), suffix.begin(), suffix.end());
4785  std::vector<uint8_t> sealed_copy = sealed;
4786 
4787  bssl::Span<uint8_t> plaintext;
4788  size_t record_len;
4789  uint8_t alert = 255;
4790  EXPECT_EQ(bssl::OpenRecord(server.get(), &plaintext, &record_len, &alert,
4791  bssl::MakeSpan(sealed)),
4792  bssl::OpenRecordResult::kOK);
4793  EXPECT_EQ(record_len, sealed.size());
4794  EXPECT_EQ(plaintext, record);
4795  EXPECT_EQ(255, alert);
4796 }
4797 
4798 TEST(SSLTest, SealRecordInPlace) {
4799  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
4803 
4804  bssl::UniquePtr<SSL> client, server;
4806  server_ctx.get()));
4807 
4808  const std::vector<uint8_t> plaintext = {1, 2, 3, 4, 5};
4809  std::vector<uint8_t> record = plaintext;
4810  std::vector<uint8_t> prefix(
4811  bssl::SealRecordPrefixLen(client.get(), record.size())),
4812  suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
4815  record));
4816  record.insert(record.begin(), prefix.begin(), prefix.end());
4817  record.insert(record.end(), suffix.begin(), suffix.end());
4818 
4819  bssl::Span<uint8_t> result;
4820  size_t record_len;
4821  uint8_t alert;
4822  EXPECT_EQ(bssl::OpenRecord(server.get(), &result, &record_len, &alert,
4823  bssl::MakeSpan(record)),
4824  bssl::OpenRecordResult::kOK);
4825  EXPECT_EQ(record_len, record.size());
4827 }
4828 
4829 TEST(SSLTest, SealRecordTrailingData) {
4830  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
4834 
4835  bssl::UniquePtr<SSL> client, server;
4837  server_ctx.get()));
4838 
4839  const std::vector<uint8_t> plaintext = {1, 2, 3, 4, 5};
4840  std::vector<uint8_t> record = plaintext;
4841  std::vector<uint8_t> prefix(
4842  bssl::SealRecordPrefixLen(client.get(), record.size())),
4843  suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
4846  record));
4847  record.insert(record.begin(), prefix.begin(), prefix.end());
4848  record.insert(record.end(), suffix.begin(), suffix.end());
4849  record.insert(record.end(), {5, 4, 3, 2, 1});
4850 
4851  bssl::Span<uint8_t> result;
4852  size_t record_len;
4853  uint8_t alert;
4854  EXPECT_EQ(bssl::OpenRecord(server.get(), &result, &record_len, &alert,
4855  bssl::MakeSpan(record)),
4856  bssl::OpenRecordResult::kOK);
4857  EXPECT_EQ(record_len, record.size() - 5);
4859 }
4860 
4861 TEST(SSLTest, SealRecordInvalidSpanSize) {
4862  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLSv1_2_method())),
4866 
4867  bssl::UniquePtr<SSL> client, server;
4869  server_ctx.get()));
4870 
4871  std::vector<uint8_t> record = {1, 2, 3, 4, 5};
4872  std::vector<uint8_t> prefix(
4873  bssl::SealRecordPrefixLen(client.get(), record.size())),
4874  body(record.size()),
4875  suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
4876 
4877  auto expect_err = []() {
4878  int err = ERR_get_error();
4881  ERR_clear_error();
4882  };
4884  client.get(), bssl::MakeSpan(prefix.data(), prefix.size() - 1),
4885  bssl::MakeSpan(record), bssl::MakeSpan(suffix), record));
4886  expect_err();
4888  client.get(), bssl::MakeSpan(prefix.data(), prefix.size() + 1),
4889  bssl::MakeSpan(record), bssl::MakeSpan(suffix), record));
4890  expect_err();
4891 
4892  EXPECT_FALSE(
4894  bssl::MakeSpan(record.data(), record.size() - 1),
4895  bssl::MakeSpan(suffix), record));
4896  expect_err();
4897  EXPECT_FALSE(
4899  bssl::MakeSpan(record.data(), record.size() + 1),
4900  bssl::MakeSpan(suffix), record));
4901  expect_err();
4902 
4904  client.get(), bssl::MakeSpan(prefix), bssl::MakeSpan(record),
4905  bssl::MakeSpan(suffix.data(), suffix.size() - 1), record));
4906  expect_err();
4908  client.get(), bssl::MakeSpan(prefix), bssl::MakeSpan(record),
4909  bssl::MakeSpan(suffix.data(), suffix.size() + 1), record));
4910  expect_err();
4911 }
4912 
4913 // The client should gracefully handle no suitable ciphers being enabled.
4914 TEST(SSLTest, NoCiphersAvailable) {
4915  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
4916  ASSERT_TRUE(ctx);
4917 
4918  // Configure |client_ctx| with a cipher list that does not intersect with its
4919  // version configuration.
4921  ctx.get(), "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"));
4923 
4924  bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
4925  ASSERT_TRUE(ssl);
4926  SSL_set_connect_state(ssl.get());
4927 
4928  UniquePtr<BIO> rbio(BIO_new(BIO_s_mem())), wbio(BIO_new(BIO_s_mem()));
4929  ASSERT_TRUE(rbio);
4930  ASSERT_TRUE(wbio);
4931  SSL_set0_rbio(ssl.get(), rbio.release());
4932  SSL_set0_wbio(ssl.get(), wbio.release());
4933 
4934  int ret = SSL_do_handshake(ssl.get());
4935  EXPECT_EQ(-1, ret);
4936  EXPECT_EQ(SSL_ERROR_SSL, SSL_get_error(ssl.get(), ret));
4940 }
4941 
4942 TEST_P(SSLVersionTest, SessionVersion) {
4945 
4946  bssl::UniquePtr<SSL_SESSION> session =
4947  CreateClientSession(client_ctx_.get(), server_ctx_.get());
4948  ASSERT_TRUE(session);
4950 
4951  // Sessions in TLS 1.3 and later should be single-use.
4953  !!SSL_SESSION_should_be_single_use(session.get()));
4954 
4955  // Making fake sessions for testing works.
4956  session.reset(SSL_SESSION_new(client_ctx_.get()));
4957  ASSERT_TRUE(session);
4960 }
4961 
4962 TEST_P(SSLVersionTest, SSLPending) {
4963  UniquePtr<SSL> ssl(SSL_new(client_ctx_.get()));
4964  ASSERT_TRUE(ssl);
4965  EXPECT_EQ(0, SSL_pending(ssl.get()));
4966 
4967  ASSERT_TRUE(Connect());
4968  EXPECT_EQ(0, SSL_pending(client_.get()));
4969  EXPECT_EQ(0, SSL_has_pending(client_.get()));
4970 
4971  ASSERT_EQ(5, SSL_write(server_.get(), "hello", 5));
4972  ASSERT_EQ(5, SSL_write(server_.get(), "world", 5));
4973  EXPECT_EQ(0, SSL_pending(client_.get()));
4974  EXPECT_EQ(0, SSL_has_pending(client_.get()));
4975 
4976  char buf[10];
4977  ASSERT_EQ(1, SSL_peek(client_.get(), buf, 1));
4978  EXPECT_EQ(5, SSL_pending(client_.get()));
4979  EXPECT_EQ(1, SSL_has_pending(client_.get()));
4980 
4981  ASSERT_EQ(1, SSL_read(client_.get(), buf, 1));
4982  EXPECT_EQ(4, SSL_pending(client_.get()));
4983  EXPECT_EQ(1, SSL_has_pending(client_.get()));
4984 
4985  ASSERT_EQ(4, SSL_read(client_.get(), buf, 10));
4986  EXPECT_EQ(0, SSL_pending(client_.get()));
4987  if (is_dtls()) {
4988  // In DTLS, the two records would have been read as a single datagram and
4989  // buffered inside |client_|. Thus, |SSL_has_pending| should return true.
4990  //
4991  // This test is slightly unrealistic. It relies on |ConnectClientAndServer|
4992  // using a |BIO| pair, which does not preserve datagram boundaries. Reading
4993  // 1 byte, then 4 bytes, from the first record also relies on
4994  // https://crbug.com/boringssl/65. But it does test the codepaths. When
4995  // fixing either of these bugs, this test may need to be redone.
4996  EXPECT_EQ(1, SSL_has_pending(client_.get()));
4997  } else {
4998  // In TLS, we do not overread, so |SSL_has_pending| should report no data is
4999  // buffered.
5000  EXPECT_EQ(0, SSL_has_pending(client_.get()));
5001  }
5002 
5003  ASSERT_EQ(2, SSL_read(client_.get(), buf, 2));
5004  EXPECT_EQ(3, SSL_pending(client_.get()));
5005  EXPECT_EQ(1, SSL_has_pending(client_.get()));
5006 }
5007 
5008 // Test that post-handshake tickets consumed by |SSL_shutdown| are ignored.
5009 TEST(SSLTest, ShutdownIgnoresTickets) {
5010  bssl::UniquePtr<SSL_CTX> ctx(CreateContextWithTestCertificate(TLS_method()));
5011  ASSERT_TRUE(ctx);
5014 
5016 
5017  bssl::UniquePtr<SSL> client, server;
5019 
5020  SSL_CTX_sess_set_new_cb(ctx.get(), [](SSL *ssl, SSL_SESSION *session) -> int {
5021  ADD_FAILURE() << "New session callback called during SSL_shutdown";
5022  return 0;
5023  });
5024 
5025  // Send close_notify.
5026  EXPECT_EQ(0, SSL_shutdown(server.get()));
5027  EXPECT_EQ(0, SSL_shutdown(client.get()));
5028 
5029  // Receive close_notify.
5030  EXPECT_EQ(1, SSL_shutdown(server.get()));
5031  EXPECT_EQ(1, SSL_shutdown(client.get()));
5032 }
5033 
5034 TEST(SSLTest, SignatureAlgorithmProperties) {
5038 
5044 
5049  EXPECT_FALSE(
5051 
5057 }
5058 
5059 static int XORCompressFunc(SSL *ssl, CBB *out, const uint8_t *in,
5060  size_t in_len) {
5061  for (size_t i = 0; i < in_len; i++) {
5062  if (!CBB_add_u8(out, in[i] ^ 0x55)) {
5063  return 0;
5064  }
5065  }
5066 
5068 
5069  return 1;
5070 }
5071 
5073  size_t uncompressed_len, const uint8_t *in,
5074  size_t in_len) {
5075  if (in_len != uncompressed_len) {
5076  return 0;
5077  }
5078 
5079  uint8_t *data;
5080  *out = CRYPTO_BUFFER_alloc(&data, uncompressed_len);
5081  if (*out == nullptr) {
5082  return 0;
5083  }
5084 
5085  for (size_t i = 0; i < in_len; i++) {
5086  data[i] = in[i] ^ 0x55;
5087  }
5088 
5090 
5091  return 1;
5092 }
5093 
5094 TEST(SSLTest, CertCompression) {
5095  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
5096  bssl::UniquePtr<SSL_CTX> server_ctx(
5100 
5104  client_ctx.get(), 0x1234, XORCompressFunc, XORDecompressFunc));
5106  server_ctx.get(), 0x1234, XORCompressFunc, XORDecompressFunc));
5107 
5108  bssl::UniquePtr<SSL> client, server;
5110  server_ctx.get()));
5111 
5114 }
5115 
5116 void MoveBIOs(SSL *dest, SSL *src) {
5117  BIO *rbio = SSL_get_rbio(src);
5118  BIO_up_ref(rbio);
5119  SSL_set0_rbio(dest, rbio);
5120 
5121  BIO *wbio = SSL_get_wbio(src);
5122  BIO_up_ref(wbio);
5123  SSL_set0_wbio(dest, wbio);
5124 
5125  SSL_set0_rbio(src, nullptr);
5126  SSL_set0_wbio(src, nullptr);
5127 }
5128 
5129 TEST(SSLTest, Handoff) {
5130  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
5131  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
5132  bssl::UniquePtr<SSL_CTX> handshaker_ctx(
5136  ASSERT_TRUE(handshaker_ctx);
5137 
5141  uint8_t keys[48];
5143  SSL_CTX_set_tlsext_ticket_keys(handshaker_ctx.get(), &keys, sizeof(keys));
5144 
5145  for (bool early_data : {false, true}) {
5146  SCOPED_TRACE(early_data);
5147  for (bool is_resume : {false, true}) {
5148  SCOPED_TRACE(is_resume);
5149  bssl::UniquePtr<SSL> client, server;
5151  server_ctx.get()));
5152  SSL_set_early_data_enabled(client.get(), early_data);
5153  if (is_resume) {
5155  SSL_set_session(client.get(), g_last_session.get());
5156  if (early_data) {
5157  EXPECT_GT(g_last_session->ticket_max_early_data, 0u);
5158  }
5159  }
5160 
5161 
5162  int client_ret = SSL_do_handshake(client.get());
5163  int client_err = SSL_get_error(client.get(), client_ret);
5164 
5165  uint8_t byte_written;
5166  if (early_data && is_resume) {
5167  ASSERT_EQ(client_err, 0);
5169  // Attempt to write early data.
5170  byte_written = 43;
5171  EXPECT_EQ(SSL_write(client.get(), &byte_written, 1), 1);
5172  } else {
5173  ASSERT_EQ(client_err, SSL_ERROR_WANT_READ);
5174  }
5175 
5176  int server_ret = SSL_do_handshake(server.get());
5177  int server_err = SSL_get_error(server.get(), server_ret);
5178  ASSERT_EQ(server_err, SSL_ERROR_HANDOFF);
5179 
5180  ScopedCBB cbb;
5181  Array<uint8_t> handoff;
5183  ASSERT_TRUE(CBB_init(cbb.get(), 256));
5184  ASSERT_TRUE(SSL_serialize_handoff(server.get(), cbb.get(), &hello));
5185  ASSERT_TRUE(CBBFinishArray(cbb.get(), &handoff));
5186 
5187  bssl::UniquePtr<SSL> handshaker(SSL_new(handshaker_ctx.get()));
5188  // Note split handshakes determines 0-RTT support, for both the current
5189  // handshake and newly-issued tickets, entirely by |handshaker|. There is
5190  // no need to call |SSL_set_early_data_enabled| on |server|.
5191  SSL_set_early_data_enabled(handshaker.get(), 1);
5192  ASSERT_TRUE(SSL_apply_handoff(handshaker.get(), handoff));
5193 
5194  MoveBIOs(handshaker.get(), server.get());
5195 
5196  int handshake_ret = SSL_do_handshake(handshaker.get());
5197  int handshake_err = SSL_get_error(handshaker.get(), handshake_ret);
5198  ASSERT_EQ(handshake_err, SSL_ERROR_HANDBACK);
5199 
5200  // Double-check that additional calls to |SSL_do_handshake| continue
5201  // to get |SSL_ERROR_HANDBACK|.
5202  handshake_ret = SSL_do_handshake(handshaker.get());
5203  handshake_err = SSL_get_error(handshaker.get(), handshake_ret);
5204  ASSERT_EQ(handshake_err, SSL_ERROR_HANDBACK);
5205 
5206  ScopedCBB cbb_handback;
5207  Array<uint8_t> handback;
5208  ASSERT_TRUE(CBB_init(cbb_handback.get(), 1024));
5209  ASSERT_TRUE(SSL_serialize_handback(handshaker.get(), cbb_handback.get()));
5210  ASSERT_TRUE(CBBFinishArray(cbb_handback.get(), &handback));
5211 
5212  bssl::UniquePtr<SSL> server2(SSL_new(server_ctx.get()));
5213  ASSERT_TRUE(SSL_apply_handback(server2.get(), handback));
5214 
5215  MoveBIOs(server2.get(), handshaker.get());
5216  ASSERT_TRUE(CompleteHandshakes(client.get(), server2.get()));
5217  EXPECT_EQ(is_resume, SSL_session_reused(client.get()));
5218 
5219  if (early_data && is_resume) {
5220  // In this case, one byte of early data has already been written above.
5222  } else {
5223  byte_written = 42;
5224  EXPECT_EQ(SSL_write(client.get(), &byte_written, 1), 1);
5225  }
5226  uint8_t byte;
5227  EXPECT_EQ(SSL_read(server2.get(), &byte, 1), 1);
5228  EXPECT_EQ(byte_written, byte);
5229 
5230  byte = 44;
5231  EXPECT_EQ(SSL_write(server2.get(), &byte, 1), 1);
5232  EXPECT_EQ(SSL_read(client.get(), &byte, 1), 1);
5233  EXPECT_EQ(44, byte);
5234  }
5235  }
5236 }
5237 
5238 TEST(SSLTest, HandoffDeclined) {
5239  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
5240  bssl::UniquePtr<SSL_CTX> server_ctx(
5244 
5247 
5248  bssl::UniquePtr<SSL> client, server;
5250  server_ctx.get()));
5251 
5252  int client_ret = SSL_do_handshake(client.get());
5253  int client_err = SSL_get_error(client.get(), client_ret);
5254  ASSERT_EQ(client_err, SSL_ERROR_WANT_READ);
5255 
5256  int server_ret = SSL_do_handshake(server.get());
5257  int server_err = SSL_get_error(server.get(), server_ret);
5258  ASSERT_EQ(server_err, SSL_ERROR_HANDOFF);
5259 
5260  ScopedCBB cbb;
5262  ASSERT_TRUE(CBB_init(cbb.get(), 256));
5263  ASSERT_TRUE(SSL_serialize_handoff(server.get(), cbb.get(), &hello));
5264 
5266 
5268 
5269  uint8_t byte = 42;
5270  EXPECT_EQ(SSL_write(client.get(), &byte, 1), 1);
5271  EXPECT_EQ(SSL_read(server.get(), &byte, 1), 1);
5272  EXPECT_EQ(42, byte);
5273 
5274  byte = 43;
5275  EXPECT_EQ(SSL_write(server.get(), &byte, 1), 1);
5276  EXPECT_EQ(SSL_read(client.get(), &byte, 1), 1);
5277  EXPECT_EQ(43, byte);
5278 }
5279 
5281  std::string ret = "{";
5282 
5283  for (uint16_t v : sigalgs) {
5284  if (ret.size() > 1) {
5285  ret += ", ";
5286  }
5287 
5288  char buf[8];
5289  snprintf(buf, sizeof(buf) - 1, "0x%02x", v);
5290  buf[sizeof(buf)-1] = 0;
5291  ret += std::string(buf);
5292  }
5293 
5294  ret += "}";
5295  return ret;
5296 }
5297 
5299  Span<const uint16_t> actual) {
5300  bool matches = false;
5301  if (expected.size() == actual.size()) {
5302  matches = true;
5303 
5304  for (size_t i = 0; i < expected.size(); i++) {
5305  if (expected[i] != actual[i]) {
5306  matches = false;
5307  break;
5308  }
5309  }
5310  }
5311 
5312  if (!matches) {
5313  ADD_FAILURE() << "expected: " << SigAlgsToString(expected)
5314  << " got: " << SigAlgsToString(actual);
5315  }
5316 }
5317 
5318 TEST(SSLTest, SigAlgs) {
5319  static const struct {
5320  std::vector<int> input;
5321  bool ok;
5322  std::vector<uint16_t> expected;
5323  } kTests[] = {
5324  {{}, true, {}},
5325  {{1}, false, {}},
5326  {{1, 2, 3}, false, {}},
5327  {{NID_sha256, EVP_PKEY_ED25519}, false, {}},
5328  {{NID_sha256, EVP_PKEY_RSA, NID_sha256, EVP_PKEY_RSA}, false, {}},
5329 
5335  true,
5337  };
5338 
5339  UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
5340 
5341  unsigned n = 1;
5342  for (const auto &test : kTests) {
5343  SCOPED_TRACE(n++);
5344 
5345  const bool ok =
5346  SSL_CTX_set1_sigalgs(ctx.get(), test.input.data(), test.input.size());
5347  EXPECT_EQ(ok, test.ok);
5348 
5349  if (!ok) {
5350  ERR_clear_error();
5351  }
5352 
5353  if (!test.ok) {
5354  continue;
5355  }
5356 
5357  ExpectSigAlgsEqual(test.expected, ctx->cert->sigalgs);
5358  }
5359 }
5360 
5361 TEST(SSLTest, SigAlgsList) {
5362  static const struct {
5363  const char *input;
5364  bool ok;
5365  std::vector<uint16_t> expected;
5366  } kTests[] = {
5367  {"", false, {}},
5368  {":", false, {}},
5369  {"+", false, {}},
5370  {"RSA", false, {}},
5371  {"RSA+", false, {}},
5372  {"RSA+SHA256:", false, {}},
5373  {":RSA+SHA256:", false, {}},
5374  {":RSA+SHA256+:", false, {}},
5375  {"!", false, {}},
5376  {"\x01", false, {}},
5377  {"RSA+SHA256:RSA+SHA384:RSA+SHA256", false, {}},
5378  {"RSA-PSS+SHA256:rsa_pss_rsae_sha256", false, {}},
5379 
5380  {"RSA+SHA256", true, {SSL_SIGN_RSA_PKCS1_SHA256}},
5381  {"RSA+SHA256:ed25519",
5382  true,
5384  {"ECDSA+SHA256:RSA+SHA512",
5385  true,
5387  {"ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256",
5388  true,
5390  {"RSA-PSS+SHA256", true, {SSL_SIGN_RSA_PSS_RSAE_SHA256}},
5391  {"PSS+SHA256", true, {SSL_SIGN_RSA_PSS_RSAE_SHA256}},
5392  };
5393 
5394  UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
5395 
5396  unsigned n = 1;
5397  for (const auto &test : kTests) {
5398  SCOPED_TRACE(n++);
5399 
5400  const bool ok = SSL_CTX_set1_sigalgs_list(ctx.get(), test.input);
5401  EXPECT_EQ(ok, test.ok);
5402 
5403  if (!ok) {
5404  if (test.ok) {
5406  }
5407  ERR_clear_error();
5408  }
5409 
5410  if (!test.ok) {
5411  continue;
5412  }
5413 
5414  ExpectSigAlgsEqual(test.expected, ctx->cert->sigalgs);
5415  }
5416 }
5417 
5418 TEST(SSLTest, ApplyHandoffRemovesUnsupportedCiphers) {
5419  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
5420  bssl::UniquePtr<SSL> server(SSL_new(server_ctx.get()));
5421 
5422  // handoff is a handoff message that has been artificially modified to pretend
5423  // that only cipher 0x0A is supported. When it is applied to |server|, all
5424  // ciphers but that one should be removed.
5425  //
5426  // To make a new one of these, try sticking this in the |Handoff| test above:
5427  //
5428  // hexdump(stderr, "", handoff.data(), handoff.size());
5429  // sed -e 's/\(..\)/0x\1, /g'
5430  //
5431  // and modify serialize_features() to emit only cipher 0x0A.
5432 
5433  uint8_t handoff[] = {
5434  0x30, 0x81, 0x9a, 0x02, 0x01, 0x00, 0x04, 0x00, 0x04, 0x81, 0x82, 0x01,
5435  0x00, 0x00, 0x7e, 0x03, 0x03, 0x30, 0x8e, 0x8f, 0x79, 0xd2, 0x87, 0x39,
5436  0xc2, 0x23, 0x23, 0x13, 0xca, 0x3c, 0x80, 0x44, 0xfd, 0x80, 0x83, 0x62,
5437  0x3c, 0xcc, 0xf8, 0x76, 0xd3, 0x62, 0xbb, 0x54, 0xe3, 0xc4, 0x39, 0x24,
5438  0xa5, 0x00, 0x00, 0x1e, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30,
5439  0xcc, 0xa9, 0xcc, 0xa8, 0xc0, 0x09, 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14,
5440  0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00,
5441  0x00, 0x37, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00,
5442  0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00,
5443  0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00,
5444  0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01, 0x05, 0x03, 0x08,
5445  0x05, 0x05, 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x04, 0x02, 0x00,
5446  0x0a, 0x04, 0x0a, 0x00, 0x15, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00,
5447  0x1d,
5448  };
5449 
5451  ASSERT_TRUE(
5452  SSL_apply_handoff(server.get(), {handoff, OPENSSL_ARRAY_SIZE(handoff)}));
5454 }
5455 
5456 TEST(SSLTest, ApplyHandoffRemovesUnsupportedCurves) {
5457  bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
5458  bssl::UniquePtr<SSL> server(SSL_new(server_ctx.get()));
5459 
5460  // handoff is a handoff message that has been artificially modified to pretend
5461  // that only one curve is supported. When it is applied to |server|, all
5462  // curves but that one should be removed.
5463  //
5464  // See |ApplyHandoffRemovesUnsupportedCiphers| for how to make a new one of
5465  // these.
5466  uint8_t handoff[] = {
5467  0x30, 0x81, 0xc0, 0x02, 0x01, 0x00, 0x04, 0x00, 0x04, 0x81, 0x82, 0x01,
5468  0x00, 0x00, 0x7e, 0x03, 0x03, 0x98, 0x30, 0xce, 0xd9, 0xb0, 0xdf, 0x5f,
5469  0x82, 0x05, 0x4a, 0x43, 0x67, 0x7e, 0xdb, 0x6a, 0x4f, 0x21, 0x18, 0x4e,
5470  0x0d, 0x94, 0x63, 0x18, 0x8b, 0x54, 0x89, 0xdb, 0x8b, 0x1d, 0x84, 0xbc,
5471  0x09, 0x00, 0x00, 0x1e, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30,
5472  0xcc, 0xa9, 0xcc, 0xa8, 0xc0, 0x09, 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14,
5473  0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00,
5474  0x00, 0x37, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00,
5475  0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00,
5476  0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00,
5477  0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01, 0x05, 0x03, 0x08,
5478  0x05, 0x05, 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x04, 0x30, 0x00,
5479  0x02, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x8c, 0x00, 0x8d, 0x00,
5480  0x9c, 0x00, 0x9d, 0x13, 0x01, 0x13, 0x02, 0x13, 0x03, 0xc0, 0x09, 0xc0,
5481  0x0a, 0xc0, 0x13, 0xc0, 0x14, 0xc0, 0x2b, 0xc0, 0x2c, 0xc0, 0x2f, 0xc0,
5482  0x30, 0xc0, 0x35, 0xc0, 0x36, 0xcc, 0xa8, 0xcc, 0xa9, 0xcc, 0xac, 0x04,
5483  0x02, 0x00, 0x17,
5484  };
5485 
5486  // The zero length means that the default list of groups is used.
5487  EXPECT_EQ(0u, server->config->supported_group_list.size());
5488  ASSERT_TRUE(
5489  SSL_apply_handoff(server.get(), {handoff, OPENSSL_ARRAY_SIZE(handoff)}));
5490  EXPECT_EQ(1u, server->config->supported_group_list.size());
5491 }
5492 
5493 TEST(SSLTest, ZeroSizedWiteFlushesHandshakeMessages) {
5494  // If there are pending handshake mesages, an |SSL_write| of zero bytes should
5495  // flush them.
5496  bssl::UniquePtr<SSL_CTX> server_ctx(
5500 
5501  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
5504 
5505  bssl::UniquePtr<SSL> client, server;
5507  server_ctx.get()));
5508 
5509  BIO *client_wbio = SSL_get_wbio(client.get());
5510  EXPECT_EQ(0u, BIO_wpending(client_wbio));
5512  EXPECT_EQ(0u, BIO_wpending(client_wbio));
5513  EXPECT_EQ(0, SSL_write(client.get(), nullptr, 0));
5514  EXPECT_NE(0u, BIO_wpending(client_wbio));
5515 }
5516 
5517 TEST_P(SSLVersionTest, VerifyBeforeCertRequest) {
5518  // Configure the server to request client certificates.
5520  server_ctx_.get(), SSL_VERIFY_PEER,
5521  [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
5522 
5523  // Configure the client to reject the server certificate.
5525  client_ctx_.get(), SSL_VERIFY_PEER,
5526  [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_invalid; });
5527 
5528  // cert_cb should not be called. Verification should fail first.
5529  SSL_CTX_set_cert_cb(client_ctx_.get(),
5530  [](SSL *ssl, void *arg) {
5531  ADD_FAILURE() << "cert_cb unexpectedly called";
5532  return 0;
5533  },
5534  nullptr);
5535 
5536  bssl::UniquePtr<SSL> client, server;
5537  EXPECT_FALSE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
5538  server_ctx_.get()));
5539 }
5540 
5541 // Test that ticket-based sessions on the client get fake session IDs.
5542 TEST_P(SSLVersionTest, FakeIDsForTickets) {
5545 
5546  bssl::UniquePtr<SSL_SESSION> session =
5547  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5548  ASSERT_TRUE(session);
5549 
5550  EXPECT_TRUE(SSL_SESSION_has_ticket(session.get()));
5551  unsigned session_id_length;
5552  SSL_SESSION_get_id(session.get(), &session_id_length);
5553  EXPECT_NE(session_id_length, 0u);
5554 }
5555 
5556 // These tests test multi-threaded behavior. They are intended to run with
5557 // ThreadSanitizer.
5558 #if defined(OPENSSL_THREADS)
5559 TEST_P(SSLVersionTest, SessionCacheThreads) {
5560  SSL_CTX_set_options(server_ctx_.get(), SSL_OP_NO_TICKET);
5563 
5564  if (version() == TLS1_3_VERSION) {
5565  // Our TLS 1.3 implementation does not support stateful resumption.
5566  ASSERT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
5567  return;
5568  }
5569 
5570  // Establish two client sessions to test with.
5571  bssl::UniquePtr<SSL_SESSION> session1 =
5572  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5573  ASSERT_TRUE(session1);
5574  bssl::UniquePtr<SSL_SESSION> session2 =
5575  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5576  ASSERT_TRUE(session2);
5577 
5578  auto connect_with_session = [&](SSL_SESSION *session) {
5580  config.session = session;
5581  UniquePtr<SSL> client, server;
5582  EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
5583  server_ctx_.get(), config));
5584  };
5585 
5586  // Resume sessions in parallel with establishing new ones.
5587  {
5588  std::vector<std::thread> threads;
5589  threads.emplace_back([&] { connect_with_session(nullptr); });
5590  threads.emplace_back([&] { connect_with_session(nullptr); });
5591  threads.emplace_back([&] { connect_with_session(session1.get()); });
5592  threads.emplace_back([&] { connect_with_session(session1.get()); });
5593  threads.emplace_back([&] { connect_with_session(session2.get()); });
5594  threads.emplace_back([&] { connect_with_session(session2.get()); });
5595  for (auto &thread : threads) {
5596  thread.join();
5597  }
5598  }
5599 
5600  // Hit the maximum session cache size across multiple threads, to test the
5601  // size enforcement logic.
5602  size_t limit = SSL_CTX_sess_number(server_ctx_.get()) + 2;
5603  SSL_CTX_sess_set_cache_size(server_ctx_.get(), limit);
5604  {
5605  std::vector<std::thread> threads;
5606  for (int i = 0; i < 4; i++) {
5607  threads.emplace_back([&]() {
5608  connect_with_session(nullptr);
5609  EXPECT_LE(SSL_CTX_sess_number(server_ctx_.get()), limit);
5610  });
5611  }
5612  for (auto &thread : threads) {
5613  thread.join();
5614  }
5615  EXPECT_EQ(SSL_CTX_sess_number(server_ctx_.get()), limit);
5616  }
5617 
5618  // Reset the session cache, this time with a mock clock.
5619  ASSERT_NO_FATAL_FAILURE(ResetContexts());
5620  SSL_CTX_set_options(server_ctx_.get(), SSL_OP_NO_TICKET);
5624 
5625  // Make some sessions at an arbitrary start time. Then expire them.
5626  g_current_time.tv_sec = 1000;
5627  bssl::UniquePtr<SSL_SESSION> expired_session1 =
5628  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5629  ASSERT_TRUE(expired_session1);
5630  bssl::UniquePtr<SSL_SESSION> expired_session2 =
5631  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5632  ASSERT_TRUE(expired_session2);
5634 
5635  session1 = CreateClientSession(client_ctx_.get(), server_ctx_.get());
5636  ASSERT_TRUE(session1);
5637 
5638  // Every 256 connections, we flush stale sessions from the session cache. Test
5639  // this logic is correctly synchronized with other connection attempts.
5640  static const int kNumConnections = 256;
5641  {
5642  std::vector<std::thread> threads;
5643  threads.emplace_back([&] {
5644  for (int i = 0; i < kNumConnections; i++) {
5645  connect_with_session(nullptr);
5646  }
5647  });
5648  threads.emplace_back([&] {
5649  for (int i = 0; i < kNumConnections; i++) {
5650  connect_with_session(nullptr);
5651  }
5652  });
5653  threads.emplace_back([&] {
5654  // Never connect with |expired_session2|. The session cache eagerly
5655  // removes expired sessions when it sees them. Leaving |expired_session2|
5656  // untouched ensures it is instead cleared by periodic flushing.
5657  for (int i = 0; i < kNumConnections; i++) {
5658  connect_with_session(expired_session1.get());
5659  }
5660  });
5661  threads.emplace_back([&] {
5662  for (int i = 0; i < kNumConnections; i++) {
5663  connect_with_session(session1.get());
5664  }
5665  });
5666  for (auto &thread : threads) {
5667  thread.join();
5668  }
5669  }
5670 }
5671 
5672 TEST_P(SSLVersionTest, SessionTicketThreads) {
5673  for (bool renew_ticket : {false, true}) {
5674  SCOPED_TRACE(renew_ticket);
5675  ResetContexts();
5678  if (renew_ticket) {
5680  }
5681 
5682  // Establish two client sessions to test with.
5683  bssl::UniquePtr<SSL_SESSION> session1 =
5684  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5685  ASSERT_TRUE(session1);
5686  bssl::UniquePtr<SSL_SESSION> session2 =
5687  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5688  ASSERT_TRUE(session2);
5689 
5690  auto connect_with_session = [&](SSL_SESSION *session) {
5692  config.session = session;
5693  UniquePtr<SSL> client, server;
5694  EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
5695  server_ctx_.get(), config));
5696  };
5697 
5698  // Resume sessions in parallel with establishing new ones.
5699  {
5700  std::vector<std::thread> threads;
5701  threads.emplace_back([&] { connect_with_session(nullptr); });
5702  threads.emplace_back([&] { connect_with_session(nullptr); });
5703  threads.emplace_back([&] { connect_with_session(session1.get()); });
5704  threads.emplace_back([&] { connect_with_session(session1.get()); });
5705  threads.emplace_back([&] { connect_with_session(session2.get()); });
5706  threads.emplace_back([&] { connect_with_session(session2.get()); });
5707  for (auto &thread : threads) {
5708  thread.join();
5709  }
5710  }
5711  }
5712 }
5713 
5714 // SSL_CTX_get0_certificate needs to lock internally. Test this works.
5715 TEST(SSLTest, GetCertificateThreads) {
5716  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
5717  ASSERT_TRUE(ctx);
5718  bssl::UniquePtr<X509> cert = GetTestCertificate();
5719  ASSERT_TRUE(cert);
5720  ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
5721 
5722  // Existing code expects |SSL_CTX_get0_certificate| to be callable from two
5723  // threads concurrently. It originally was an immutable operation. Now we
5724  // implement it with a thread-safe cache, so it is worth testing.
5725  X509 *cert2_thread;
5727  [&] { cert2_thread = SSL_CTX_get0_certificate(ctx.get()); });
5728  X509 *cert2 = SSL_CTX_get0_certificate(ctx.get());
5729  thread.join();
5730 
5731  EXPECT_EQ(cert2, cert2_thread);
5732  EXPECT_EQ(0, X509_cmp(cert.get(), cert2));
5733 }
5734 
5735 // Functions which access properties on the negotiated session are thread-safe
5736 // where needed. Prior to TLS 1.3, clients resuming sessions and servers
5737 // performing stateful resumption will share an underlying SSL_SESSION object,
5738 // potentially across threads.
5739 TEST_P(SSLVersionTest, SessionPropertiesThreads) {
5740  if (version() == TLS1_3_VERSION) {
5741  // Our TLS 1.3 implementation does not support stateful resumption.
5742  ASSERT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
5743  return;
5744  }
5745 
5746  SSL_CTX_set_options(server_ctx_.get(), SSL_OP_NO_TICKET);
5749 
5750  ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
5751  ASSERT_TRUE(UseCertAndKey(server_ctx_.get()));
5752 
5753  // Configure mutual authentication, so we have more session state.
5755  client_ctx_.get(), SSL_VERIFY_PEER,
5756  [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
5758  server_ctx_.get(), SSL_VERIFY_PEER,
5759  [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
5760 
5761  // Establish a client session to test with.
5762  bssl::UniquePtr<SSL_SESSION> session =
5763  CreateClientSession(client_ctx_.get(), server_ctx_.get());
5764  ASSERT_TRUE(session);
5765 
5766  // Resume with it twice.
5767  UniquePtr<SSL> ssls[4];
5769  config.session = session.get();
5770  ASSERT_TRUE(ConnectClientAndServer(&ssls[0], &ssls[1], client_ctx_.get(),
5771  server_ctx_.get(), config));
5772  ASSERT_TRUE(ConnectClientAndServer(&ssls[2], &ssls[3], client_ctx_.get(),
5773  server_ctx_.get(), config));
5774 
5775  // Read properties in parallel.
5776  auto read_properties = [](const SSL *ssl) {
5778  bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(ssl));
5779  EXPECT_TRUE(peer);
5782  };
5783 
5784  std::vector<std::thread> threads;
5785  for (const auto &ssl_ptr : ssls) {
5786  const SSL *ssl = ssl_ptr.get();
5787  threads.emplace_back([=] { read_properties(ssl); });
5788  }
5789  for (auto &thread : threads) {
5790  thread.join();
5791  }
5792 }
5793 #endif // OPENSSL_THREADS
5794 
5795 constexpr size_t kNumQUICLevels = 4;
5796 static_assert(ssl_encryption_initial < kNumQUICLevels,
5797  "kNumQUICLevels is wrong");
5799  "kNumQUICLevels is wrong");
5801  "kNumQUICLevels is wrong");
5803  "kNumQUICLevels is wrong");
5804 
5805 const char *LevelToString(ssl_encryption_level_t level) {
5806  switch (level) {
5808  return "initial";
5810  return "early data";
5812  return "handshake";
5814  return "application";
5815  }
5816  return "<unknown>";
5817 }
5818 
5820  public:
5821  enum class Role { kClient, kServer };
5822 
5823  explicit MockQUICTransport(Role role) : role_(role) {
5824  // The caller is expected to configure initial secrets.
5825  levels_[ssl_encryption_initial].write_secret = {1};
5826  levels_[ssl_encryption_initial].read_secret = {1};
5827  }
5828 
5829  void set_peer(MockQUICTransport *peer) { peer_ = peer; }
5830 
5831  bool has_alert() const { return has_alert_; }
5832  ssl_encryption_level_t alert_level() const { return alert_level_; }
5833  uint8_t alert() const { return alert_; }
5834 
5835  bool PeerSecretsMatch(ssl_encryption_level_t level) const {
5836  return levels_[level].write_secret == peer_->levels_[level].read_secret &&
5837  levels_[level].read_secret == peer_->levels_[level].write_secret &&
5838  levels_[level].cipher == peer_->levels_[level].cipher;
5839  }
5840 
5841  bool HasReadSecret(ssl_encryption_level_t level) const {
5842  return !levels_[level].read_secret.empty();
5843  }
5844 
5845  bool HasWriteSecret(ssl_encryption_level_t level) const {
5846  return !levels_[level].write_secret.empty();
5847  }
5848 
5849  void AllowOutOfOrderWrites() { allow_out_of_order_writes_ = true; }
5850 
5851  bool SetReadSecret(ssl_encryption_level_t level, const SSL_CIPHER *cipher,
5852  Span<const uint8_t> secret) {
5853  if (HasReadSecret(level)) {
5854  ADD_FAILURE() << LevelToString(level) << " read secret configured twice";
5855  return false;
5856  }
5857 
5858  if (role_ == Role::kClient && level == ssl_encryption_early_data) {
5859  ADD_FAILURE() << "Unexpected early data read secret";
5860  return false;
5861  }
5862 
5863  ssl_encryption_level_t ack_level =
5865  if (!HasWriteSecret(ack_level)) {
5867  << " read secret configured before ACK write secret";
5868  return false;
5869  }
5870 
5871  if (cipher == nullptr) {
5872  ADD_FAILURE() << "Unexpected null cipher";
5873  return false;
5874  }
5875 
5877  SSL_CIPHER_get_id(cipher) != levels_[level].cipher) {
5878  ADD_FAILURE() << "Cipher suite inconsistent";
5879  return false;
5880  }
5881 
5882  levels_[level].read_secret.assign(secret.begin(), secret.end());
5883  levels_[level].cipher = SSL_CIPHER_get_id(cipher);
5884  return true;
5885  }
5886 
5887  bool SetWriteSecret(ssl_encryption_level_t level, const SSL_CIPHER *cipher,
5888  Span<const uint8_t> secret) {
5889  if (HasWriteSecret(level)) {
5890  ADD_FAILURE() << LevelToString(level) << " write secret configured twice";
5891  return false;
5892  }
5893 
5894  if (role_ == Role::kServer && level == ssl_encryption_early_data) {
5895  ADD_FAILURE() << "Unexpected early data write secret";
5896  return false;
5897  }
5898 
5899  if (cipher == nullptr) {
5900  ADD_FAILURE() << "Unexpected null cipher";
5901  return false;
5902  }
5903 
5904  levels_[level].write_secret.assign(secret.begin(), secret.end());
5905  levels_[level].cipher = SSL_CIPHER_get_id(cipher);
5906  return true;
5907  }
5908 
5909  bool WriteHandshakeData(ssl_encryption_level_t level,
5911  if (levels_[level].write_secret.empty()) {
5913  << " write secret not yet configured";
5914  return false;
5915  }
5916 
5917  // Although the levels are conceptually separate, BoringSSL finishes writing
5918  // data from a previous level before installing keys for the next level.
5919  if (!allow_out_of_order_writes_) {
5920  switch (level) {
5922  ADD_FAILURE() << "unexpected handshake data at early data level";
5923  return false;
5925  if (!levels_[ssl_encryption_handshake].write_secret.empty()) {
5926  ADD_FAILURE()
5927  << LevelToString(level)
5928  << " handshake data written after handshake keys installed";
5929  return false;
5930  }
5933  if (!levels_[ssl_encryption_application].write_secret.empty()) {
5934  ADD_FAILURE()
5935  << LevelToString(level)
5936  << " handshake data written after application keys installed";
5937  return false;
5938  }
5941  break;
5942  }
5943  }
5944 
5945  levels_[level].write_data.insert(levels_[level].write_data.end(),
5946  data.begin(), data.end());
5947  return true;
5948  }
5949 
5950  bool SendAlert(ssl_encryption_level_t level, uint8_t alert_value) {
5951  if (has_alert_) {
5952  ADD_FAILURE() << "duplicate alert sent";
5953  return false;
5954  }
5955 
5956  if (levels_[level].write_secret.empty()) {
5958  << " write secret not yet configured";
5959  return false;
5960  }
5961 
5962  has_alert_ = true;
5963  alert_level_ = level;
5964  alert_ = alert_value;
5965  return true;
5966  }
5967 
5968  bool ReadHandshakeData(std::vector<uint8_t> *out,
5969  ssl_encryption_level_t level,
5971  if (levels_[level].read_secret.empty()) {
5972  ADD_FAILURE() << "data read before keys configured in level " << level;
5973  return false;
5974  }
5975  // The peer may not have configured any keys yet.
5976  if (peer_->levels_[level].write_secret.empty()) {
5977  out->clear();
5978  return true;
5979  }
5980  // Check the peer computed the same key.
5981  if (peer_->levels_[level].write_secret != levels_[level].read_secret) {
5982  ADD_FAILURE() << "peer write key does not match read key in level "
5983  << level;
5984  return false;
5985  }
5986  if (peer_->levels_[level].cipher != levels_[level].cipher) {
5987  ADD_FAILURE() << "peer cipher does not match in level " << level;
5988  return false;
5989  }
5990  std::vector<uint8_t> *peer_data = &peer_->levels_[level].write_data;
5991  num = std::min(num, peer_data->size());
5992  out->assign(peer_data->begin(), peer_data->begin() + num);
5993  peer_data->erase(peer_data->begin(), peer_data->begin() + num);
5994  return true;
5995  }
5996 
5997  private:
5999  MockQUICTransport *peer_ = nullptr;
6000 
6001  bool allow_out_of_order_writes_ = false;
6002  bool has_alert_ = false;
6003  ssl_encryption_level_t alert_level_ = ssl_encryption_initial;
6004  uint8_t alert_ = 0;
6005 
6006  struct Level {
6007  std::vector<uint8_t> write_data;
6008  std::vector<uint8_t> write_secret;
6009  std::vector<uint8_t> read_secret;
6010  uint32_t cipher = 0;
6011  };
6013 };
6014 
6016  public:
6018  : client_(MockQUICTransport::Role::kClient),
6019  server_(MockQUICTransport::Role::kServer) {
6020  client_.set_peer(&server_);
6021  server_.set_peer(&client_);
6022  }
6023 
6025  client_.set_peer(nullptr);
6026  server_.set_peer(nullptr);
6027  }
6028 
6031 
6032  bool SecretsMatch(ssl_encryption_level_t level) const {
6033  // We only need to check |HasReadSecret| and |HasWriteSecret| on |client_|.
6034  // |PeerSecretsMatch| checks that |server_| is analogously configured.
6035  return client_.PeerSecretsMatch(level) &&
6036  client_.HasWriteSecret(level) &&
6037  (level == ssl_encryption_early_data || client_.HasReadSecret(level));
6038  }
6039 
6040  private:
6043 };
6044 
6046  protected:
6047  void SetUp() override {
6048  client_ctx_.reset(SSL_CTX_new(TLS_method()));
6050  ASSERT_TRUE(client_ctx_);
6051  ASSERT_TRUE(server_ctx_);
6052 
6053  SSL_CTX_set_min_proto_version(server_ctx_.get(), TLS1_3_VERSION);
6054  SSL_CTX_set_max_proto_version(server_ctx_.get(), TLS1_3_VERSION);
6055  SSL_CTX_set_min_proto_version(client_ctx_.get(), TLS1_3_VERSION);
6056  SSL_CTX_set_max_proto_version(client_ctx_.get(), TLS1_3_VERSION);
6057 
6058  static const uint8_t kALPNProtos[] = {0x03, 'f', 'o', 'o'};
6059  ASSERT_EQ(SSL_CTX_set_alpn_protos(client_ctx_.get(), kALPNProtos,
6060  sizeof(kALPNProtos)),
6061  0);
6063  server_ctx_.get(),
6064  [](SSL *ssl, const uint8_t **out, uint8_t *out_len, const uint8_t *in,
6065  unsigned in_len, void *arg) -> int {
6066  return SSL_select_next_proto(
6067  const_cast<uint8_t **>(out), out_len, in, in_len,
6068  kALPNProtos, sizeof(kALPNProtos)) == OPENSSL_NPN_NEGOTIATED
6069  ? SSL_TLSEXT_ERR_OK
6070  : SSL_TLSEXT_ERR_NOACK;
6071  },
6072  nullptr);
6073  }
6074 
6076  return ex_data_.Get(ssl);
6077  }
6078 
6080  SSL *ssl, size_t num = std::numeric_limits<size_t>::max()) {
6081  MockQUICTransport *transport = TransportFromSSL(ssl);
6082  ssl_encryption_level_t level = SSL_quic_read_level(ssl);
6083  std::vector<uint8_t> data;
6084  return transport->ReadHandshakeData(&data, level, num) &&
6085  SSL_provide_quic_data(ssl, level, data.data(), data.size());
6086  }
6087 
6089  allow_out_of_order_writes_ = true;
6090  }
6091 
6093  client_.reset(SSL_new(client_ctx_.get()));
6094  server_.reset(SSL_new(server_ctx_.get()));
6095  if (!client_ || !server_) {
6096  return false;
6097  }
6098 
6101 
6102  transport_.reset(new MockQUICTransportPair);
6103  ex_data_.Set(client_.get(), transport_->client());
6104  ex_data_.Set(server_.get(), transport_->server());
6105  if (allow_out_of_order_writes_) {
6106  transport_->client()->AllowOutOfOrderWrites();
6107  transport_->server()->AllowOutOfOrderWrites();
6108  }
6109  static const uint8_t client_transport_params[] = {0};
6110  if (!SSL_set_quic_transport_params(client_.get(), client_transport_params,
6111  sizeof(client_transport_params)) ||
6113  server_transport_params_.data(),
6114  server_transport_params_.size()) ||
6116  server_.get(), server_quic_early_data_context_.data(),
6117  server_quic_early_data_context_.size())) {
6118  return false;
6119  }
6120  return true;
6121  }
6122 
6123  enum class ExpectedError {
6124  kNoError,
6125  kClientError,
6126  kServerError,
6127  };
6128 
6129  // CompleteHandshakesForQUIC runs |SSL_do_handshake| on |client_| and
6130  // |server_| until each completes once. It returns true on success and false
6131  // on failure.
6133  return RunQUICHandshakesAndExpectError(ExpectedError::kNoError);
6134  }
6135 
6136  // Runs |SSL_do_handshake| on |client_| and |server_| until each completes
6137  // once. If |expect_client_error| is true, it will return true only if the
6138  // client handshake failed. Otherwise, it returns true if both handshakes
6139  // succeed and false otherwise.
6141  bool client_done = false, server_done = false;
6142  while (!client_done || !server_done) {
6143  if (!client_done) {
6144  if (!ProvideHandshakeData(client_.get())) {
6145  ADD_FAILURE() << "ProvideHandshakeData(client_) failed";
6146  return false;
6147  }
6148  int client_ret = SSL_do_handshake(client_.get());
6149  int client_err = SSL_get_error(client_.get(), client_ret);
6150  if (client_ret == 1) {
6151  client_done = true;
6152  } else if (client_ret != -1 || client_err != SSL_ERROR_WANT_READ) {
6153  if (expected_error == ExpectedError::kClientError) {
6154  return true;
6155  }
6156  ADD_FAILURE() << "Unexpected client output: " << client_ret << " "
6157  << client_err;
6158  return false;
6159  }
6160  }
6161 
6162  if (!server_done) {
6163  if (!ProvideHandshakeData(server_.get())) {
6164  ADD_FAILURE() << "ProvideHandshakeData(server_) failed";
6165  return false;
6166  }
6167  int server_ret = SSL_do_handshake(server_.get());
6168  int server_err = SSL_get_error(server_.get(), server_ret);
6169  if (server_ret == 1) {
6170  server_done = true;
6171  } else if (server_ret != -1 || server_err != SSL_ERROR_WANT_READ) {
6172  if (expected_error == ExpectedError::kServerError) {
6173  return true;
6174  }
6175  ADD_FAILURE() << "Unexpected server output: " << server_ret << " "
6176  << server_err;
6177  return false;
6178  }
6179  }
6180  }
6181  return expected_error == ExpectedError::kNoError;
6182  }
6183 
6184  bssl::UniquePtr<SSL_SESSION> CreateClientSessionForQUIC() {
6185  g_last_session = nullptr;
6186  SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
6187  if (!CreateClientAndServer() ||
6188  !CompleteHandshakesForQUIC()) {
6189  return nullptr;
6190  }
6191 
6192  // The server sent NewSessionTicket messages in the handshake.
6193  if (!ProvideHandshakeData(client_.get()) ||
6195  return nullptr;
6196  }
6197 
6198  return std::move(g_last_session);
6199  }
6200 
6207  EXPECT_FALSE(transport_->client()->has_alert());
6208  EXPECT_FALSE(transport_->server()->has_alert());
6209 
6210  // SSL_do_handshake is now idempotent.
6211  EXPECT_EQ(SSL_do_handshake(client_.get()), 1);
6212  EXPECT_EQ(SSL_do_handshake(server_.get()), 1);
6213  }
6214 
6215  // Returns a default SSL_QUIC_METHOD. Individual methods may be overwritten by
6216  // the test.
6218  return SSL_QUIC_METHOD{
6219  SetReadSecretCallback, SetWriteSecretCallback, AddHandshakeDataCallback,
6220  FlushFlightCallback, SendAlertCallback,
6221  };
6222  }
6223 
6224  static int SetReadSecretCallback(SSL *ssl, ssl_encryption_level_t level,
6225  const SSL_CIPHER *cipher,
6226  const uint8_t *secret, size_t secret_len) {
6227  return TransportFromSSL(ssl)->SetReadSecret(
6228  level, cipher, MakeConstSpan(secret, secret_len));
6229  }
6230 
6231  static int SetWriteSecretCallback(SSL *ssl, ssl_encryption_level_t level,
6232  const SSL_CIPHER *cipher,
6233  const uint8_t *secret, size_t secret_len) {
6234  return TransportFromSSL(ssl)->SetWriteSecret(
6235  level, cipher, MakeConstSpan(secret, secret_len));
6236  }
6237 
6239  enum ssl_encryption_level_t level,
6240  const uint8_t *data, size_t len) {
6242  return TransportFromSSL(ssl)->WriteHandshakeData(level,
6243  MakeConstSpan(data, len));
6244  }
6245 
6246  static int FlushFlightCallback(SSL *ssl) { return 1; }
6247 
6248  static int SendAlertCallback(SSL *ssl, ssl_encryption_level_t level,
6249  uint8_t alert) {
6251  return TransportFromSSL(ssl)->SendAlert(level, alert);
6252  }
6253 
6254  bssl::UniquePtr<SSL_CTX> client_ctx_;
6255  bssl::UniquePtr<SSL_CTX> server_ctx_;
6256 
6258  std::unique_ptr<MockQUICTransportPair> transport_;
6259 
6260  bssl::UniquePtr<SSL> client_;
6261  bssl::UniquePtr<SSL> server_;
6262 
6263  std::vector<uint8_t> server_transport_params_ = {1};
6264  std::vector<uint8_t> server_quic_early_data_context_ = {2};
6265 
6266  bool allow_out_of_order_writes_ = false;
6267 };
6268 
6269 UnownedSSLExData<MockQUICTransport> QUICMethodTest::ex_data_;
6270 
6271 // Test a full handshake and resumption work.
6273  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6274 
6275  g_last_session = nullptr;
6276 
6278  SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
6279  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6280  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6281 
6283  ASSERT_TRUE(CompleteHandshakesForQUIC());
6284 
6285  ExpectHandshakeSuccess();
6288 
6289  // The server sent NewSessionTicket messages in the handshake.
6291  ASSERT_TRUE(ProvideHandshakeData(client_.get()));
6294 
6295  // Create a second connection to verify resumption works.
6297  bssl::UniquePtr<SSL_SESSION> session = std::move(g_last_session);
6298  SSL_set_session(client_.get(), session.get());
6299 
6300  ASSERT_TRUE(CompleteHandshakesForQUIC());
6301 
6302  ExpectHandshakeSuccess();
6305 }
6306 
6307 // Test that HelloRetryRequest in QUIC works.
6308 TEST_F(QUICMethodTest, HelloRetryRequest) {
6309  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6310 
6311  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6312  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6313 
6314  // BoringSSL predicts the most preferred curve, so using different preferences
6315  // will trigger HelloRetryRequest.
6316  static const int kClientPrefs[] = {NID_X25519, NID_X9_62_prime256v1};
6317  ASSERT_TRUE(SSL_CTX_set1_curves(client_ctx_.get(), kClientPrefs,
6318  OPENSSL_ARRAY_SIZE(kClientPrefs)));
6319  static const int kServerPrefs[] = {NID_X9_62_prime256v1, NID_X25519};
6320  ASSERT_TRUE(SSL_CTX_set1_curves(server_ctx_.get(), kServerPrefs,
6321  OPENSSL_ARRAY_SIZE(kServerPrefs)));
6322 
6324  ASSERT_TRUE(CompleteHandshakesForQUIC());
6325  ExpectHandshakeSuccess();
6326 }
6327 
6328 // Test that the client does not send a legacy_session_id in the ClientHello.
6329 TEST_F(QUICMethodTest, NoLegacySessionId) {
6330  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6331 
6332  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6333  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6334  // Check that the session ID length is 0 in an early callback.
6336  server_ctx_.get(),
6337  [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
6338  EXPECT_EQ(client_hello->session_id_len, 0u);
6339  return ssl_select_cert_success;
6340  });
6341 
6343  ASSERT_TRUE(CompleteHandshakesForQUIC());
6344 
6345  ExpectHandshakeSuccess();
6346 }
6347 
6348 // Test that, even in a 1-RTT handshake, the server installs keys at the right
6349 // time. Half-RTT keys are available early, but 1-RTT read keys are deferred.
6350 TEST_F(QUICMethodTest, HalfRTTKeys) {
6351  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6352 
6353  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6354  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6356 
6357  // The client sends ClientHello.
6358  ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
6360 
6361  // The server reads ClientHello and sends ServerHello..Finished.
6362  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6363  ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
6365 
6366  // At this point, the server has half-RTT write keys, but it cannot access
6367  // 1-RTT read keys until client Finished.
6368  EXPECT_TRUE(transport_->server()->HasWriteSecret(ssl_encryption_application));
6369  EXPECT_FALSE(transport_->server()->HasReadSecret(ssl_encryption_application));
6370 
6371  // Finish up the client and server handshakes.
6372  ASSERT_TRUE(CompleteHandshakesForQUIC());
6373 
6374  // Both sides can now exchange 1-RTT data.
6375  ExpectHandshakeSuccess();
6376 }
6377 
6378 TEST_F(QUICMethodTest, ZeroRTTAccept) {
6379  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6380 
6382  SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
6383  SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
6384  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6385  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6386 
6387  bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6388  ASSERT_TRUE(session);
6389 
6391  SSL_set_session(client_.get(), session.get());
6392 
6393  // The client handshake should return immediately into the early data state.
6394  ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
6396  // The transport should have keys for sending 0-RTT data.
6397  EXPECT_TRUE(transport_->client()->HasWriteSecret(ssl_encryption_early_data));
6398 
6399  // The server will consume the ClientHello and also enter the early data
6400  // state.
6401  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6402  ASSERT_EQ(SSL_do_handshake(server_.get()), 1);
6405  // At this point, the server has half-RTT write keys, but it cannot access
6406  // 1-RTT read keys until client Finished.
6407  EXPECT_TRUE(transport_->server()->HasWriteSecret(ssl_encryption_application));
6408  EXPECT_FALSE(transport_->server()->HasReadSecret(ssl_encryption_application));
6409 
6410  // Finish up the client and server handshakes.
6411  ASSERT_TRUE(CompleteHandshakesForQUIC());
6412 
6413  // Both sides can now exchange 1-RTT data.
6414  ExpectHandshakeSuccess();
6421 
6422  // Finish handling post-handshake messages after the first 0-RTT resumption.
6423  EXPECT_TRUE(ProvideHandshakeData(client_.get()));
6425 
6426  // Perform a second 0-RTT resumption attempt, and confirm that 0-RTT is
6427  // accepted again.
6429  SSL_set_session(client_.get(), g_last_session.get());
6430 
6431  // The client handshake should return immediately into the early data state.
6432  ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
6434  // The transport should have keys for sending 0-RTT data.
6435  EXPECT_TRUE(transport_->client()->HasWriteSecret(ssl_encryption_early_data));
6436 
6437  // The server will consume the ClientHello and also enter the early data
6438  // state.
6439  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6440  ASSERT_EQ(SSL_do_handshake(server_.get()), 1);
6443  // At this point, the server has half-RTT write keys, but it cannot access
6444  // 1-RTT read keys until client Finished.
6445  EXPECT_TRUE(transport_->server()->HasWriteSecret(ssl_encryption_application));
6446  EXPECT_FALSE(transport_->server()->HasReadSecret(ssl_encryption_application));
6447 
6448  // Finish up the client and server handshakes.
6449  ASSERT_TRUE(CompleteHandshakesForQUIC());
6450 
6451  // Both sides can now exchange 1-RTT data.
6452  ExpectHandshakeSuccess();
6461 }
6462 
6463 TEST_F(QUICMethodTest, ZeroRTTRejectMismatchedParameters) {
6464  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6465 
6467  SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
6468  SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
6469  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6470  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6471 
6472 
6473  bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6474  ASSERT_TRUE(session);
6475 
6477  static const uint8_t new_context[] = {4};
6479  sizeof(new_context)));
6480  SSL_set_session(client_.get(), session.get());
6481 
6482  // The client handshake should return immediately into the early data
6483  // state.
6484  ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
6486  // The transport should have keys for sending 0-RTT data.
6487  EXPECT_TRUE(transport_->client()->HasWriteSecret(ssl_encryption_early_data));
6488 
6489  // The server will consume the ClientHello, but it will not accept 0-RTT.
6490  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6491  ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
6494  EXPECT_FALSE(transport_->server()->HasReadSecret(ssl_encryption_early_data));
6495 
6496  // The client consumes the server response and signals 0-RTT rejection.
6497  for (;;) {
6498  ASSERT_TRUE(ProvideHandshakeData(client_.get()));
6499  ASSERT_EQ(-1, SSL_do_handshake(client_.get()));
6500  int err = SSL_get_error(client_.get(), -1);
6502  break;
6503  }
6505  }
6506 
6507  // As in TLS over TCP, 0-RTT rejection is sticky.
6508  ASSERT_EQ(-1, SSL_do_handshake(client_.get()));
6510 
6511  // Finish up the client and server handshakes.
6513  ASSERT_TRUE(CompleteHandshakesForQUIC());
6514 
6515  // Both sides can now exchange 1-RTT data.
6516  ExpectHandshakeSuccess();
6523 }
6524 
6525 TEST_F(QUICMethodTest, NoZeroRTTTicketWithoutEarlyDataContext) {
6526  server_quic_early_data_context_ = {};
6527  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6528 
6530  SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
6531  SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
6532  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6533  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6534 
6535  bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6536  ASSERT_TRUE(session);
6538 }
6539 
6540 TEST_F(QUICMethodTest, ZeroRTTReject) {
6541  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6542 
6544  SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
6545  SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
6546  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6547  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6548 
6549  bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6550  ASSERT_TRUE(session);
6551 
6552  for (bool reject_hrr : {false, true}) {
6553  SCOPED_TRACE(reject_hrr);
6554 
6556  if (reject_hrr) {
6557  // Configure the server to prefer P-256, which will reject 0-RTT via
6558  // HelloRetryRequest.
6559  int p256 = NID_X9_62_prime256v1;
6560  ASSERT_TRUE(SSL_set1_curves(server_.get(), &p256, 1));
6561  } else {
6562  // Disable 0-RTT on the server, so it will reject it.
6564  }
6565  SSL_set_session(client_.get(), session.get());
6566 
6567  // The client handshake should return immediately into the early data state.
6568  ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
6570  // The transport should have keys for sending 0-RTT data.
6571  EXPECT_TRUE(
6572  transport_->client()->HasWriteSecret(ssl_encryption_early_data));
6573 
6574  // The server will consume the ClientHello, but it will not accept 0-RTT.
6575  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6576  ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
6579  EXPECT_FALSE(
6580  transport_->server()->HasReadSecret(ssl_encryption_early_data));
6581 
6582  // The client consumes the server response and signals 0-RTT rejection.
6583  for (;;) {
6584  ASSERT_TRUE(ProvideHandshakeData(client_.get()));
6585  ASSERT_EQ(-1, SSL_do_handshake(client_.get()));
6586  int err = SSL_get_error(client_.get(), -1);
6588  break;
6589  }
6591  }
6592 
6593  // As in TLS over TCP, 0-RTT rejection is sticky.
6594  ASSERT_EQ(-1, SSL_do_handshake(client_.get()));
6596 
6597  // Finish up the client and server handshakes.
6599  ASSERT_TRUE(CompleteHandshakesForQUIC());
6600 
6601  // Both sides can now exchange 1-RTT data.
6602  ExpectHandshakeSuccess();
6609  }
6610 }
6611 
6612 TEST_F(QUICMethodTest, NoZeroRTTKeysBeforeReverify) {
6613  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6614 
6616  SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
6617  SSL_CTX_set_reverify_on_resume(client_ctx_.get(), 1);
6618  SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
6619  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6620  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6621 
6622  bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6623  ASSERT_TRUE(session);
6624 
6626  SSL_set_session(client_.get(), session.get());
6627 
6628  // Configure the certificate (re)verification to never complete. The client
6629  // handshake should pause.
6631  client_.get(), SSL_VERIFY_PEER,
6632  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
6633  return ssl_verify_retry;
6634  });
6635  ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
6636  ASSERT_EQ(SSL_get_error(client_.get(), -1),
6638 
6639  // The early data keys have not yet been released.
6640  EXPECT_FALSE(transport_->client()->HasWriteSecret(ssl_encryption_early_data));
6641 
6642  // After the verification completes, the handshake progresses to the 0-RTT
6643  // point and releases keys.
6645  client_.get(), SSL_VERIFY_PEER,
6646  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
6647  return ssl_verify_ok;
6648  });
6649  ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
6651  EXPECT_TRUE(transport_->client()->HasWriteSecret(ssl_encryption_early_data));
6652 }
6653 
6654 // Test only releasing data to QUIC one byte at a time on request, to maximize
6655 // state machine pauses. Additionally, test that existing asynchronous callbacks
6656 // still work.
6658  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6659 
6660  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6661  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6663 
6664  // Install an asynchronous certificate callback.
6665  bool cert_cb_ok = false;
6666  SSL_set_cert_cb(server_.get(),
6667  [](SSL *, void *arg) -> int {
6668  return *static_cast<bool *>(arg) ? 1 : -1;
6669  },
6670  &cert_cb_ok);
6671 
6672  for (;;) {
6673  int client_ret = SSL_do_handshake(client_.get());
6674  if (client_ret != 1) {
6675  ASSERT_EQ(client_ret, -1);
6676  ASSERT_EQ(SSL_get_error(client_.get(), client_ret), SSL_ERROR_WANT_READ);
6677  ASSERT_TRUE(ProvideHandshakeData(client_.get(), 1));
6678  }
6679 
6680  int server_ret = SSL_do_handshake(server_.get());
6681  if (server_ret != 1) {
6682  ASSERT_EQ(server_ret, -1);
6683  int ssl_err = SSL_get_error(server_.get(), server_ret);
6684  switch (ssl_err) {
6685  case SSL_ERROR_WANT_READ:
6686  ASSERT_TRUE(ProvideHandshakeData(server_.get(), 1));
6687  break;
6689  ASSERT_FALSE(cert_cb_ok);
6690  cert_cb_ok = true;
6691  break;
6692  default:
6693  FAIL() << "Unexpected SSL_get_error result: " << ssl_err;
6694  }
6695  }
6696 
6697  if (client_ret == 1 && server_ret == 1) {
6698  break;
6699  }
6700  }
6701 
6702  ExpectHandshakeSuccess();
6703 }
6704 
6705 // Test buffering write data until explicit flushes.
6707  AllowOutOfOrderWrites();
6708 
6709  struct BufferedFlight {
6710  std::vector<uint8_t> data[kNumQUICLevels];
6711  };
6712  static UnownedSSLExData<BufferedFlight> buffered_flights;
6713 
6714  auto add_handshake_data = [](SSL *ssl, enum ssl_encryption_level_t level,
6715  const uint8_t *data, size_t len) -> int {
6716  BufferedFlight *flight = buffered_flights.Get(ssl);
6717  flight->data[level].insert(flight->data[level].end(), data, data + len);
6718  return 1;
6719  };
6720 
6721  auto flush_flight = [](SSL *ssl) -> int {
6722  BufferedFlight *flight = buffered_flights.Get(ssl);
6723  for (size_t level = 0; level < kNumQUICLevels; level++) {
6724  if (!flight->data[level].empty()) {
6725  if (!TransportFromSSL(ssl)->WriteHandshakeData(
6726  static_cast<ssl_encryption_level_t>(level),
6727  flight->data[level])) {
6728  return 0;
6729  }
6730  flight->data[level].clear();
6731  }
6732  }
6733  return 1;
6734  };
6735 
6736  SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6737  quic_method.add_handshake_data = add_handshake_data;
6738  quic_method.flush_flight = flush_flight;
6739 
6740  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6741  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6743 
6744  BufferedFlight client_flight, server_flight;
6745  buffered_flights.Set(client_.get(), &client_flight);
6746  buffered_flights.Set(server_.get(), &server_flight);
6747 
6748  ASSERT_TRUE(CompleteHandshakesForQUIC());
6749 
6750  ExpectHandshakeSuccess();
6751 }
6752 
6753 // Test that excess data at one level is rejected. That is, if a single
6754 // |SSL_provide_quic_data| call included both ServerHello and
6755 // EncryptedExtensions in a single chunk, BoringSSL notices and rejects this on
6756 // key change.
6757 TEST_F(QUICMethodTest, ExcessProvidedData) {
6758  AllowOutOfOrderWrites();
6759 
6760  auto add_handshake_data = [](SSL *ssl, enum ssl_encryption_level_t level,
6761  const uint8_t *data, size_t len) -> int {
6762  // Switch everything to the initial level.
6763  return TransportFromSSL(ssl)->WriteHandshakeData(ssl_encryption_initial,
6764  MakeConstSpan(data, len));
6765  };
6766 
6767  SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6768  quic_method.add_handshake_data = add_handshake_data;
6769 
6770  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6771  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6773 
6774  // Send the ClientHello and ServerHello through Finished.
6775  ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
6777  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6778  ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
6780 
6781  // The client is still waiting for the ServerHello at initial
6782  // encryption.
6784 
6785  // |add_handshake_data| incorrectly wrote everything at the initial level, so
6786  // this queues up ServerHello through Finished in one chunk.
6787  ASSERT_TRUE(ProvideHandshakeData(client_.get()));
6788 
6789  // The client reads ServerHello successfully, but then rejects the buffered
6790  // EncryptedExtensions on key change.
6791  ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
6796 
6797  // The client sends an alert in response to this. The alert is sent at
6798  // handshake level because we install write secrets before read secrets and
6799  // the error is discovered when installing the read secret. (How to send
6800  // alerts on protocol syntax errors near key changes is ambiguous in general.)
6801  ASSERT_TRUE(transport_->client()->has_alert());
6802  EXPECT_EQ(transport_->client()->alert_level(), ssl_encryption_handshake);
6803  EXPECT_EQ(transport_->client()->alert(), SSL_AD_UNEXPECTED_MESSAGE);
6804 
6805  // Sanity-check handshake secrets. The error is discovered while setting the
6806  // read secret, so only the write secret has been installed.
6807  EXPECT_TRUE(transport_->client()->HasWriteSecret(ssl_encryption_handshake));
6808  EXPECT_FALSE(transport_->client()->HasReadSecret(ssl_encryption_handshake));
6809 }
6810 
6811 // Test that |SSL_provide_quic_data| will reject data at the wrong level.
6812 TEST_F(QUICMethodTest, ProvideWrongLevel) {
6813  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6814 
6815  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6816  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6818 
6819  // Send the ClientHello and ServerHello through Finished.
6820  ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
6822  ASSERT_TRUE(ProvideHandshakeData(server_.get()));
6823  ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
6825 
6826  // The client is still waiting for the ServerHello at initial
6827  // encryption.
6829 
6830  // Data cannot be provided at the next level.
6831  std::vector<uint8_t> data;
6832  ASSERT_TRUE(
6833  transport_->client()->ReadHandshakeData(&data, ssl_encryption_initial));
6835  data.data(), data.size()));
6836  ERR_clear_error();
6837 
6838  // Progress to EncryptedExtensions.
6840  data.data(), data.size()));
6841  ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
6844 
6845  // Data cannot be provided at the previous level.
6846  ASSERT_TRUE(
6847  transport_->client()->ReadHandshakeData(&data, ssl_encryption_handshake));
6849  data.data(), data.size()));
6850 }
6851 
6852 TEST_F(QUICMethodTest, TooMuchData) {
6853  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6854 
6855  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6856  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6858 
6859  size_t limit =
6861  uint8_t b = 0;
6862  for (size_t i = 0; i < limit; i++) {
6863  ASSERT_TRUE(
6865  }
6866 
6867  EXPECT_FALSE(
6869 }
6870 
6871 // Provide invalid post-handshake data.
6872 TEST_F(QUICMethodTest, BadPostHandshake) {
6873  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6874 
6875  g_last_session = nullptr;
6876 
6878  SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
6879  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6880  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6882  ASSERT_TRUE(CompleteHandshakesForQUIC());
6883 
6884  EXPECT_EQ(SSL_do_handshake(client_.get()), 1);
6885  EXPECT_EQ(SSL_do_handshake(server_.get()), 1);
6887  EXPECT_FALSE(transport_->client()->has_alert());
6888  EXPECT_FALSE(transport_->server()->has_alert());
6889 
6890  // Junk sent as part of post-handshake data should cause an error.
6891  uint8_t kJunk[] = {0x17, 0x0, 0x0, 0x4, 0xB, 0xE, 0xE, 0xF};
6893  kJunk, sizeof(kJunk)));
6895 }
6896 
6898  Span<const uint8_t> expected) {
6899  const uint8_t *received;
6900  size_t received_len;
6901  SSL_get_peer_quic_transport_params(ssl, &received, &received_len);
6902  ASSERT_EQ(received_len, expected.size());
6903  EXPECT_EQ(Bytes(received, received_len), Bytes(expected));
6904 }
6905 
6906 TEST_F(QUICMethodTest, SetTransportParameters) {
6907  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6908  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6909  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6910 
6912  uint8_t kClientParams[] = {1, 2, 3, 4};
6913  uint8_t kServerParams[] = {5, 6, 7};
6914  ASSERT_TRUE(SSL_set_quic_transport_params(client_.get(), kClientParams,
6915  sizeof(kClientParams)));
6916  ASSERT_TRUE(SSL_set_quic_transport_params(server_.get(), kServerParams,
6917  sizeof(kServerParams)));
6918 
6919  ASSERT_TRUE(CompleteHandshakesForQUIC());
6920  ExpectReceivedTransportParamsEqual(client_.get(), kServerParams);
6921  ExpectReceivedTransportParamsEqual(server_.get(), kClientParams);
6922 }
6923 
6924 TEST_F(QUICMethodTest, SetTransportParamsInCallback) {
6925  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6926  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6927  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6928 
6930  uint8_t kClientParams[] = {1, 2, 3, 4};
6931  static uint8_t kServerParams[] = {5, 6, 7};
6932  ASSERT_TRUE(SSL_set_quic_transport_params(client_.get(), kClientParams,
6933  sizeof(kClientParams)));
6935  server_ctx_.get(), [](SSL *ssl, int *out_alert, void *arg) -> int {
6936  EXPECT_TRUE(SSL_set_quic_transport_params(ssl, kServerParams,
6937  sizeof(kServerParams)));
6938  return SSL_TLSEXT_ERR_OK;
6939  });
6940 
6941  ASSERT_TRUE(CompleteHandshakesForQUIC());
6942  ExpectReceivedTransportParamsEqual(client_.get(), kServerParams);
6943  ExpectReceivedTransportParamsEqual(server_.get(), kClientParams);
6944 }
6945 
6946 TEST_F(QUICMethodTest, ForbidCrossProtocolResumptionClient) {
6947  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6948 
6949  g_last_session = nullptr;
6950 
6952  SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
6953  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6954  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6955 
6957  ASSERT_TRUE(CompleteHandshakesForQUIC());
6958 
6959  ExpectHandshakeSuccess();
6962 
6963  // The server sent NewSessionTicket messages in the handshake.
6965  ASSERT_TRUE(ProvideHandshakeData(client_.get()));
6968 
6969  // Pretend that g_last_session came from a TLS-over-TCP connection.
6970  g_last_session.get()->is_quic = false;
6971 
6972  // Create a second connection and verify that resumption does not occur with
6973  // a session from a non-QUIC connection. This tests that the client does not
6974  // offer over QUIC a session believed to be received over TCP. The server
6975  // believes this is a QUIC session, so if the client offered the session, the
6976  // server would have resumed it.
6978  bssl::UniquePtr<SSL_SESSION> session = std::move(g_last_session);
6979  SSL_set_session(client_.get(), session.get());
6980 
6981  ASSERT_TRUE(CompleteHandshakesForQUIC());
6982  ExpectHandshakeSuccess();
6985 }
6986 
6987 TEST_F(QUICMethodTest, ForbidCrossProtocolResumptionServer) {
6988  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
6989 
6990  g_last_session = nullptr;
6991 
6993  SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
6994  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
6995  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
6996 
6998  ASSERT_TRUE(CompleteHandshakesForQUIC());
6999 
7000  ExpectHandshakeSuccess();
7003 
7004  // The server sent NewSessionTicket messages in the handshake.
7006  ASSERT_TRUE(ProvideHandshakeData(client_.get()));
7009 
7010  // Attempt a resumption with g_last_session using TLS_method.
7011  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
7013 
7014  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), nullptr));
7015 
7016  bssl::UniquePtr<SSL> client(SSL_new(client_ctx.get())),
7017  server(SSL_new(server_ctx_.get()));
7022 
7023  // The TLS-over-TCP client will refuse to resume with a quic session, so
7024  // mark is_quic = false to bypass the client check to test the server check.
7025  g_last_session.get()->is_quic = false;
7026  SSL_set_session(client.get(), g_last_session.get());
7027 
7028  BIO *bio1, *bio2;
7029  ASSERT_TRUE(BIO_new_bio_pair(&bio1, 0, &bio2, 0));
7030 
7031  // SSL_set_bio takes ownership.
7032  SSL_set_bio(client.get(), bio1, bio1);
7033  SSL_set_bio(server.get(), bio2, bio2);
7035 
7038 }
7039 
7040 TEST_F(QUICMethodTest, ClientRejectsMissingTransportParams) {
7041  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7042  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7043  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7044 
7047  ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError));
7048 }
7049 
7050 TEST_F(QUICMethodTest, ServerRejectsMissingTransportParams) {
7051  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7052  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7053  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7054 
7057  ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kClientError));
7058 }
7059 
7060 TEST_F(QUICMethodTest, QuicLegacyCodepointEnabled) {
7061  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7062  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7063  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7064 
7066  uint8_t kClientParams[] = {1, 2, 3, 4};
7067  uint8_t kServerParams[] = {5, 6, 7};
7070  ASSERT_TRUE(SSL_set_quic_transport_params(client_.get(), kClientParams,
7071  sizeof(kClientParams)));
7072  ASSERT_TRUE(SSL_set_quic_transport_params(server_.get(), kServerParams,
7073  sizeof(kServerParams)));
7074 
7075  ASSERT_TRUE(CompleteHandshakesForQUIC());
7076  ExpectReceivedTransportParamsEqual(client_.get(), kServerParams);
7077  ExpectReceivedTransportParamsEqual(server_.get(), kClientParams);
7078 }
7079 
7080 TEST_F(QUICMethodTest, QuicLegacyCodepointDisabled) {
7081  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7082  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7083  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7084 
7086  uint8_t kClientParams[] = {1, 2, 3, 4};
7087  uint8_t kServerParams[] = {5, 6, 7};
7090  ASSERT_TRUE(SSL_set_quic_transport_params(client_.get(), kClientParams,
7091  sizeof(kClientParams)));
7092  ASSERT_TRUE(SSL_set_quic_transport_params(server_.get(), kServerParams,
7093  sizeof(kServerParams)));
7094 
7095  ASSERT_TRUE(CompleteHandshakesForQUIC());
7096  ExpectReceivedTransportParamsEqual(client_.get(), kServerParams);
7097  ExpectReceivedTransportParamsEqual(server_.get(), kClientParams);
7098 }
7099 
7100 TEST_F(QUICMethodTest, QuicLegacyCodepointClientOnly) {
7101  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7102  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7103  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7104 
7106  uint8_t kClientParams[] = {1, 2, 3, 4};
7107  uint8_t kServerParams[] = {5, 6, 7};
7110  ASSERT_TRUE(SSL_set_quic_transport_params(client_.get(), kClientParams,
7111  sizeof(kClientParams)));
7112  ASSERT_TRUE(SSL_set_quic_transport_params(server_.get(), kServerParams,
7113  sizeof(kServerParams)));
7114 
7115  ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError));
7116 }
7117 
7118 TEST_F(QUICMethodTest, QuicLegacyCodepointServerOnly) {
7119  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7120  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7121  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7122 
7124  uint8_t kClientParams[] = {1, 2, 3, 4};
7125  uint8_t kServerParams[] = {5, 6, 7};
7128  ASSERT_TRUE(SSL_set_quic_transport_params(client_.get(), kClientParams,
7129  sizeof(kClientParams)));
7130  ASSERT_TRUE(SSL_set_quic_transport_params(server_.get(), kServerParams,
7131  sizeof(kServerParams)));
7132 
7133  ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError));
7134 }
7135 
7136 // Test that the default QUIC code point is consistent with
7137 // |TLSEXT_TYPE_quic_transport_parameters|. This test ensures we remember to
7138 // update the two values together.
7139 TEST_F(QUICMethodTest, QuicCodePointDefault) {
7140  const SSL_QUIC_METHOD quic_method = DefaultQUICMethod();
7141  ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
7142  ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
7144  server_ctx_.get(),
7145  [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
7146  const uint8_t *data;
7147  size_t len;
7148  if (!SSL_early_callback_ctx_extension_get(
7149  client_hello, TLSEXT_TYPE_quic_transport_parameters, &data,
7150  &len)) {
7151  ADD_FAILURE() << "Could not find quic_transport_parameters extension";
7152  return ssl_select_cert_error;
7153  }
7154  return ssl_select_cert_success;
7155  });
7156 
7158  ASSERT_TRUE(CompleteHandshakesForQUIC());
7159 }
7160 
7161 extern "C" {
7162 int BORINGSSL_enum_c_type_test(void);
7163 }
7164 
7165 TEST(SSLTest, EnumTypes) {
7166  EXPECT_EQ(sizeof(int), sizeof(ssl_private_key_result_t));
7168 }
7169 
7170 TEST_P(SSLVersionTest, DoubleSSLError) {
7171  // Connect the inner SSL connections.
7172  ASSERT_TRUE(Connect());
7173 
7174  // Make a pair of |BIO|s which wrap |client_| and |server_|.
7175  UniquePtr<BIO_METHOD> bio_method(BIO_meth_new(0, nullptr));
7176  ASSERT_TRUE(bio_method);
7178  bio_method.get(), [](BIO *bio, char *out, int len) -> int {
7179  SSL *ssl = static_cast<SSL *>(BIO_get_data(bio));
7180  int ret = SSL_read(ssl, out, len);
7181  int ssl_ret = SSL_get_error(ssl, ret);
7182  if (ssl_ret == SSL_ERROR_WANT_READ) {
7183  BIO_set_retry_read(bio);
7184  }
7185  return ret;
7186  }));
7188  bio_method.get(), [](BIO *bio, const char *in, int len) -> int {
7189  SSL *ssl = static_cast<SSL *>(BIO_get_data(bio));
7190  int ret = SSL_write(ssl, in, len);
7191  int ssl_ret = SSL_get_error(ssl, ret);
7192  if (ssl_ret == SSL_ERROR_WANT_WRITE) {
7193  BIO_set_retry_write(bio);
7194  }
7195  return ret;
7196  }));
7198  bio_method.get(), [](BIO *bio, int cmd, long larg, void *parg) -> long {
7199  // |SSL| objects require |BIO_flush| support.
7200  if (cmd == BIO_CTRL_FLUSH) {
7201  return 1;
7202  }
7203  return 0;
7204  }));
7205 
7206  UniquePtr<BIO> client_bio(BIO_new(bio_method.get()));
7207  ASSERT_TRUE(client_bio);
7208  BIO_set_data(client_bio.get(), client_.get());
7209  BIO_set_init(client_bio.get(), 1);
7210 
7211  UniquePtr<BIO> server_bio(BIO_new(bio_method.get()));
7212  ASSERT_TRUE(server_bio);
7213  BIO_set_data(server_bio.get(), server_.get());
7214  BIO_set_init(server_bio.get(), 1);
7215 
7216  // Wrap the inner connections in another layer of SSL.
7217  UniquePtr<SSL> client_outer(SSL_new(client_ctx_.get()));
7218  ASSERT_TRUE(client_outer);
7219  SSL_set_connect_state(client_outer.get());
7220  SSL_set_bio(client_outer.get(), client_bio.get(), client_bio.get());
7221  client_bio.release(); // |SSL_set_bio| takes ownership.
7222 
7223  UniquePtr<SSL> server_outer(SSL_new(server_ctx_.get()));
7224  ASSERT_TRUE(server_outer);
7225  SSL_set_accept_state(server_outer.get());
7226  SSL_set_bio(server_outer.get(), server_bio.get(), server_bio.get());
7227  server_bio.release(); // |SSL_set_bio| takes ownership.
7228 
7229  // Configure |client_outer| to reject the server certificate.
7231  client_outer.get(), SSL_VERIFY_PEER,
7232  [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
7233  return ssl_verify_invalid;
7234  });
7235 
7236  for (;;) {
7237  int client_ret = SSL_do_handshake(client_outer.get());
7238  int client_err = SSL_get_error(client_outer.get(), client_ret);
7239  if (client_err != SSL_ERROR_WANT_READ &&
7240  client_err != SSL_ERROR_WANT_WRITE) {
7241  // The client handshake should terminate on a certificate verification
7242  // error.
7243  EXPECT_EQ(SSL_ERROR_SSL, client_err);
7247  break;
7248  }
7249 
7250  // Run the server handshake and continue.
7251  int server_ret = SSL_do_handshake(server_outer.get());
7252  int server_err = SSL_get_error(server_outer.get(), server_ret);
7253  ASSERT_TRUE(server_err == SSL_ERROR_NONE ||
7254  server_err == SSL_ERROR_WANT_READ ||
7255  server_err == SSL_ERROR_WANT_WRITE);
7256  }
7257 }
7258 
7259 TEST_P(SSLVersionTest, SameKeyResume) {
7260  uint8_t key[48];
7261  RAND_bytes(key, sizeof(key));
7262 
7263  bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
7264  ASSERT_TRUE(server_ctx2);
7265  ASSERT_TRUE(UseCertAndKey(server_ctx2.get()));
7266  ASSERT_TRUE(
7267  SSL_CTX_set_tlsext_ticket_keys(server_ctx_.get(), key, sizeof(key)));
7268  ASSERT_TRUE(
7269  SSL_CTX_set_tlsext_ticket_keys(server_ctx2.get(), key, sizeof(key)));
7270 
7274 
7275  // Establish a session for |server_ctx_|.
7276  bssl::UniquePtr<SSL_SESSION> session =
7277  CreateClientSession(client_ctx_.get(), server_ctx_.get());
7278  ASSERT_TRUE(session);
7280  config.session = session.get();
7281 
7282  // Resuming with |server_ctx_| again works.
7283  bssl::UniquePtr<SSL> client, server;
7284  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7285  server_ctx_.get(), config));
7288 
7289  // Resuming with |server_ctx2| also works.
7290  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7291  server_ctx2.get(), config));
7294 }
7295 
7296 TEST_P(SSLVersionTest, DifferentKeyNoResume) {
7297  uint8_t key1[48], key2[48];
7298  RAND_bytes(key1, sizeof(key1));
7299  RAND_bytes(key2, sizeof(key2));
7300 
7301  bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
7302  ASSERT_TRUE(server_ctx2);
7303  ASSERT_TRUE(UseCertAndKey(server_ctx2.get()));
7304  ASSERT_TRUE(
7305  SSL_CTX_set_tlsext_ticket_keys(server_ctx_.get(), key1, sizeof(key1)));
7306  ASSERT_TRUE(
7307  SSL_CTX_set_tlsext_ticket_keys(server_ctx2.get(), key2, sizeof(key2)));
7308 
7312 
7313  // Establish a session for |server_ctx_|.
7314  bssl::UniquePtr<SSL_SESSION> session =
7315  CreateClientSession(client_ctx_.get(), server_ctx_.get());
7316  ASSERT_TRUE(session);
7318  config.session = session.get();
7319 
7320  // Resuming with |server_ctx_| again works.
7321  bssl::UniquePtr<SSL> client, server;
7322  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7323  server_ctx_.get(), config));
7326 
7327  // Resuming with |server_ctx2| does not work.
7328  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7329  server_ctx2.get(), config));
7332 }
7333 
7334 TEST_P(SSLVersionTest, UnrelatedServerNoResume) {
7335  bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
7336  ASSERT_TRUE(server_ctx2);
7337  ASSERT_TRUE(UseCertAndKey(server_ctx2.get()));
7338 
7342 
7343  // Establish a session for |server_ctx_|.
7344  bssl::UniquePtr<SSL_SESSION> session =
7345  CreateClientSession(client_ctx_.get(), server_ctx_.get());
7346  ASSERT_TRUE(session);
7348  config.session = session.get();
7349 
7350  // Resuming with |server_ctx_| again works.
7351  bssl::UniquePtr<SSL> client, server;
7352  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7353  server_ctx_.get(), config));
7356 
7357  // Resuming with |server_ctx2| does not work.
7358  ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7359  server_ctx2.get(), config));
7362 }
7363 
7365  const SSL_SESSION *session = SSL_get_session(ssl);
7366  unsigned len;
7367  const uint8_t *data = SSL_SESSION_get_id(session, &len);
7368  return MakeConstSpan(data, len);
7369 }
7370 
7371 TEST_P(SSLVersionTest, TicketSessionIDsMatch) {
7372  // This checks that the session IDs at client and server match after a ticket
7373  // resumption. It's unclear whether this should be true, but Envoy depends
7374  // on it in their tests so this will give an early signal if we break it.
7377 
7378  bssl::UniquePtr<SSL_SESSION> session =
7379  CreateClientSession(client_ctx_.get(), server_ctx_.get());
7380 
7381  bssl::UniquePtr<SSL> client, server;
7383  config.session = session.get();
7384  EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
7385  server_ctx_.get(), config));
7388 
7390 }
7391 
7392 TEST(SSLTest, WriteWhileExplicitRenegotiate) {
7393  bssl::UniquePtr<SSL_CTX> ctx(CreateContextWithTestCertificate(TLS_method()));
7394  ASSERT_TRUE(ctx);
7395 
7399  ctx.get(), "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"));
7400 
7401  bssl::UniquePtr<SSL> client, server;
7405 
7406  static const uint8_t kInput[] = {'h', 'e', 'l', 'l', 'o'};
7407 
7408  // Write "hello" until the buffer is full, so |client| has a pending write.
7409  size_t num_writes = 0;
7410  for (;;) {
7411  int ret = SSL_write(client.get(), kInput, sizeof(kInput));
7412  if (ret != int(sizeof(kInput))) {
7413  ASSERT_EQ(-1, ret);
7415  break;
7416  }
7417  num_writes++;
7418  }
7419 
7420  // Encrypt a HelloRequest.
7421  uint8_t in[] = {SSL3_MT_HELLO_REQUEST, 0, 0, 0};
7422 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
7423  // Fuzzer-mode records are unencrypted.
7424  uint8_t record[5 + sizeof(in)];
7425  record[0] = SSL3_RT_HANDSHAKE;
7426  record[1] = 3;
7427  record[2] = 3; // TLS 1.2
7428  record[3] = 0;
7429  record[4] = sizeof(record) - 5;
7430  memcpy(record + 5, in, sizeof(in));
7431 #else
7432  // Extract key material from |server|.
7433  static const size_t kKeyLen = 32;
7434  static const size_t kNonceLen = 12;
7435  ASSERT_EQ(2u * (kKeyLen + kNonceLen), SSL_get_key_block_len(server.get()));
7436  uint8_t key_block[2u * (kKeyLen + kNonceLen)];
7437  ASSERT_TRUE(
7438  SSL_generate_key_block(server.get(), key_block, sizeof(key_block)));
7439  Span<uint8_t> key = MakeSpan(key_block + kKeyLen, kKeyLen);
7440  Span<uint8_t> nonce =
7441  MakeSpan(key_block + kKeyLen + kKeyLen + kNonceLen, kNonceLen);
7442 
7443  uint8_t ad[13];
7444  uint64_t seq = SSL_get_write_sequence(server.get());
7445  for (size_t i = 0; i < 8; i++) {
7446  // The nonce is XORed with the sequence number.
7447  nonce[11 - i] ^= uint8_t(seq);
7448  ad[7 - i] = uint8_t(seq);
7449  seq >>= 8;
7450  }
7451 
7452  ad[8] = SSL3_RT_HANDSHAKE;
7453  ad[9] = 3;
7454  ad[10] = 3; // TLS 1.2
7455  ad[11] = 0;
7456  ad[12] = sizeof(in);
7457 
7458  uint8_t record[5 + sizeof(in) + 16];
7459  record[0] = SSL3_RT_HANDSHAKE;
7460  record[1] = 3;
7461  record[2] = 3; // TLS 1.2
7462  record[3] = 0;
7463  record[4] = sizeof(record) - 5;
7464 
7465  ScopedEVP_AEAD_CTX aead;
7467  key.data(), key.size(),
7468  EVP_AEAD_DEFAULT_TAG_LENGTH, nullptr));
7469  size_t len;
7470  ASSERT_TRUE(EVP_AEAD_CTX_seal(aead.get(), record + 5, &len,
7471  sizeof(record) - 5, nonce.data(), nonce.size(),
7472  in, sizeof(in), ad, sizeof(ad)));
7473  ASSERT_EQ(sizeof(record) - 5, len);
7474 #endif // BORINGSSL_UNSAFE_FUZZER_MODE
7475 
7476  ASSERT_EQ(int(sizeof(record)),
7477  BIO_write(SSL_get_wbio(server.get()), record, sizeof(record)));
7478 
7479  // |SSL_read| should pick up the HelloRequest.
7480  uint8_t byte;
7481  ASSERT_EQ(-1, SSL_read(client.get(), &byte, 1));
7483 
7484  // Drain the data from the |client|.
7485  uint8_t buf[sizeof(kInput)];
7486  for (size_t i = 0; i < num_writes; i++) {
7487  ASSERT_EQ(int(sizeof(buf)), SSL_read(server.get(), buf, sizeof(buf)));
7489  }
7490 
7491  // |client| should be able to finish the pending write and continue to write,
7492  // despite the paused HelloRequest.
7493  ASSERT_EQ(int(sizeof(kInput)),
7494  SSL_write(client.get(), kInput, sizeof(kInput)));
7495  ASSERT_EQ(int(sizeof(buf)), SSL_read(server.get(), buf, sizeof(buf)));
7497 
7498  ASSERT_EQ(int(sizeof(kInput)),
7499  SSL_write(client.get(), kInput, sizeof(kInput)));
7500  ASSERT_EQ(int(sizeof(buf)), SSL_read(server.get(), buf, sizeof(buf)));
7502 
7503  // |SSL_read| is stuck until we acknowledge the HelloRequest.
7504  ASSERT_EQ(-1, SSL_read(client.get(), &byte, 1));
7506 
7508  ASSERT_EQ(-1, SSL_read(client.get(), &byte, 1));
7510 
7511  // We never renegotiate as a server.
7512  ASSERT_EQ(-1, SSL_read(server.get(), buf, sizeof(buf)));
7517 }
7518 
7519 
7520 TEST(SSLTest, CopyWithoutEarlyData) {
7521  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
7522  bssl::UniquePtr<SSL_CTX> server_ctx(
7526 
7531 
7532  bssl::UniquePtr<SSL_SESSION> session =
7534  ASSERT_TRUE(session);
7535 
7536  // The client should attempt early data with |session|.
7537  bssl::UniquePtr<SSL> client, server;
7539  server_ctx.get()));
7540  SSL_set_session(client.get(), session.get());
7542  ASSERT_EQ(1, SSL_do_handshake(client.get()));
7544 
7545  // |SSL_SESSION_copy_without_early_data| should disable early data but
7546  // still resume the session.
7547  bssl::UniquePtr<SSL_SESSION> session2(
7548  SSL_SESSION_copy_without_early_data(session.get()));
7549  ASSERT_TRUE(session2);
7550  EXPECT_NE(session.get(), session2.get());
7552  server_ctx.get()));
7553  SSL_set_session(client.get(), session2.get());
7559 
7560  // |SSL_SESSION_copy_without_early_data| should be a reference count increase
7561  // when passed an early-data-incapable session.
7562  bssl::UniquePtr<SSL_SESSION> session3(
7563  SSL_SESSION_copy_without_early_data(session2.get()));
7564  EXPECT_EQ(session2.get(), session3.get());
7565 }
7566 
7567 TEST(SSLTest, ProcessTLS13NewSessionTicket) {
7568  // Configure client and server to negotiate TLS 1.3 only.
7569  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
7570  bssl::UniquePtr<SSL_CTX> server_ctx(
7578 
7579  bssl::UniquePtr<SSL> client, server;
7581  server_ctx.get()));
7583 
7584  // Process a TLS 1.3 NewSessionTicket.
7585  static const uint8_t kTicket[] = {
7586  0x04, 0x00, 0x00, 0xb2, 0x00, 0x02, 0xa3, 0x00, 0x04, 0x03, 0x02, 0x01,
7587  0x01, 0x00, 0x00, 0xa0, 0x01, 0x06, 0x09, 0x11, 0x16, 0x19, 0x21, 0x26,
7588  0x29, 0x31, 0x36, 0x39, 0x41, 0x46, 0x49, 0x51, 0x03, 0x06, 0x09, 0x13,
7589  0x16, 0x19, 0x23, 0x26, 0x29, 0x33, 0x36, 0x39, 0x43, 0x46, 0x49, 0x53,
7590  0xf7, 0x00, 0x29, 0xec, 0xf2, 0xc4, 0xa4, 0x41, 0xfc, 0x30, 0x17, 0x2e,
7591  0x9f, 0x7c, 0xa8, 0xaf, 0x75, 0x70, 0xf0, 0x1f, 0xc7, 0x98, 0xf7, 0xcf,
7592  0x5a, 0x5a, 0x6b, 0x5b, 0xfe, 0xf1, 0xe7, 0x3a, 0xe8, 0xf7, 0x6c, 0xd2,
7593  0xa8, 0xa6, 0x92, 0x5b, 0x96, 0x8d, 0xde, 0xdb, 0xd3, 0x20, 0x6a, 0xcb,
7594  0x69, 0x06, 0xf4, 0x91, 0x85, 0x2e, 0xe6, 0x5e, 0x0c, 0x59, 0xf2, 0x9e,
7595  0x9b, 0x79, 0x91, 0x24, 0x7e, 0x4a, 0x32, 0x3d, 0xbe, 0x4b, 0x80, 0x70,
7596  0xaf, 0xd0, 0x1d, 0xe2, 0xca, 0x05, 0x35, 0x09, 0x09, 0x05, 0x0f, 0xbb,
7597  0xc4, 0xae, 0xd7, 0xc4, 0xed, 0xd7, 0xae, 0x35, 0xc8, 0x73, 0x63, 0x78,
7598  0x64, 0xc9, 0x7a, 0x1f, 0xed, 0x7a, 0x9a, 0x47, 0x44, 0xfd, 0x50, 0xf7,
7599  0xb7, 0xe0, 0x64, 0xa9, 0x02, 0xc1, 0x5c, 0x23, 0x18, 0x3f, 0xc4, 0xcf,
7600  0x72, 0x02, 0x59, 0x2d, 0xe1, 0xaa, 0x61, 0x72, 0x00, 0x04, 0x5a, 0x5a,
7601  0x00, 0x00,
7602  };
7603  bssl::UniquePtr<SSL_SESSION> session(SSL_process_tls13_new_session_ticket(
7604  client.get(), kTicket, sizeof(kTicket)));
7605  ASSERT_TRUE(session);
7606  ASSERT_TRUE(SSL_SESSION_has_ticket(session.get()));
7607 
7608  uint8_t *session_buf = nullptr;
7609  size_t session_length = 0;
7610  ASSERT_TRUE(
7611  SSL_SESSION_to_bytes(session.get(), &session_buf, &session_length));
7612  bssl::UniquePtr<uint8_t> session_buf_free(session_buf);
7613  ASSERT_TRUE(session_buf);
7614  ASSERT_GT(session_length, 0u);
7615 
7616  // Servers cannot call |SSL_process_tls13_new_session_ticket|.
7618  sizeof(kTicket)));
7619 
7620  // Clients cannot call |SSL_process_tls13_new_session_ticket| before the
7621  // handshake completes.
7622  bssl::UniquePtr<SSL> client2(SSL_new(client_ctx.get()));
7623  ASSERT_TRUE(client2);
7624  SSL_set_connect_state(client2.get());
7625  ASSERT_FALSE(SSL_process_tls13_new_session_ticket(client2.get(), kTicket,
7626  sizeof(kTicket)));
7627 }
7628 
7629 TEST(SSLTest, BIO) {
7630  bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
7631  bssl::UniquePtr<SSL_CTX> server_ctx(
7635 
7636  for (bool take_ownership : {true, false}) {
7637  // For simplicity, get the handshake out of the way first.
7638  bssl::UniquePtr<SSL> client, server;
7640  server_ctx.get()));
7641 
7642  // Wrap |client| in an SSL BIO.
7643  bssl::UniquePtr<BIO> client_bio(BIO_new(BIO_f_ssl()));
7644  ASSERT_TRUE(client_bio);
7645  ASSERT_EQ(1, BIO_set_ssl(client_bio.get(), client.get(), take_ownership));
7646  if (take_ownership) {
7647  client.release();
7648  }
7649 
7650  // Flushing the BIO should not crash.
7651  EXPECT_EQ(1, BIO_flush(client_bio.get()));
7652 
7653  // Exchange some data.
7654  EXPECT_EQ(5, BIO_write(client_bio.get(), "hello", 5));
7655  uint8_t buf[5];
7656  ASSERT_EQ(5, SSL_read(server.get(), buf, sizeof(buf)));
7657  EXPECT_EQ(Bytes("hello"), Bytes(buf));
7658 
7659  EXPECT_EQ(5, SSL_write(server.get(), "world", 5));
7660  ASSERT_EQ(5, BIO_read(client_bio.get(), buf, sizeof(buf)));
7661  EXPECT_EQ(Bytes("world"), Bytes(buf));
7662 
7663  // |BIO_should_read| should work.
7664  EXPECT_EQ(-1, BIO_read(client_bio.get(), buf, sizeof(buf)));
7665  EXPECT_TRUE(BIO_should_read(client_bio.get()));
7666 
7667  // Writing data should eventually exceed the buffer size and fail, reporting
7668  // |BIO_should_write|.
7669  int ret;
7670  for (int i = 0; i < 1024; i++) {
7671  std::vector<uint8_t> buffer(1024);
7672  ret = BIO_write(client_bio.get(), buffer.data(), buffer.size());
7673  if (ret <= 0) {
7674  break;
7675  }
7676  }
7677  EXPECT_EQ(-1, ret);
7678  EXPECT_TRUE(BIO_should_write(client_bio.get()));
7679  }
7680 }
7681 
7682 TEST(SSLTest, ALPNConfig) {
7683  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
7684  ASSERT_TRUE(ctx);
7685  bssl::UniquePtr<X509> cert = GetTestCertificate();
7686  bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
7687  ASSERT_TRUE(cert);
7688  ASSERT_TRUE(key);
7689  ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
7690  ASSERT_TRUE(SSL_CTX_use_PrivateKey(ctx.get(), key.get()));
7691 
7692  // Set up some machinery to check the configured ALPN against what is actually
7693  // sent over the wire. Note that the ALPN callback is only called when the
7694  // client offers ALPN.
7695  std::vector<uint8_t> observed_alpn;
7697  ctx.get(),
7698  [](SSL *ssl, const uint8_t **out, uint8_t *out_len, const uint8_t *in,
7699  unsigned in_len, void *arg) -> int {
7700  std::vector<uint8_t> *observed_alpn_ptr =
7701  static_cast<std::vector<uint8_t> *>(arg);
7702  observed_alpn_ptr->assign(in, in + in_len);
7703  return SSL_TLSEXT_ERR_NOACK;
7704  },
7705  &observed_alpn);
7706  auto check_alpn_proto = [&](Span<const uint8_t> expected) {
7707  observed_alpn.clear();
7708  bssl::UniquePtr<SSL> client, server;
7710  EXPECT_EQ(Bytes(expected), Bytes(observed_alpn));
7711  };
7712 
7713  // Note that |SSL_CTX_set_alpn_protos|'s return value is reversed.
7714  static const uint8_t kValidList[] = {0x03, 'f', 'o', 'o',
7715  0x03, 'b', 'a', 'r'};
7716  EXPECT_EQ(0,
7717  SSL_CTX_set_alpn_protos(ctx.get(), kValidList, sizeof(kValidList)));
7718  check_alpn_proto(kValidList);
7719 
7720  // Invalid lists are rejected.
7721  static const uint8_t kInvalidList[] = {0x04, 'f', 'o', 'o'};
7722  EXPECT_EQ(1, SSL_CTX_set_alpn_protos(ctx.get(), kInvalidList,
7723  sizeof(kInvalidList)));
7724 
7725  // Empty lists are valid and are interpreted as disabling ALPN.
7726  EXPECT_EQ(0, SSL_CTX_set_alpn_protos(ctx.get(), nullptr, 0));
7727  check_alpn_proto({});
7728 }
7729 
7730 // Test that the key usage checker can correctly handle issuerUID and
7731 // subjectUID. See https://crbug.com/1199744.
7732 TEST(SSLTest, KeyUsageWithUIDs) {
7733  static const char kGoodKeyUsage[] = R"(
7734 -----BEGIN CERTIFICATE-----
7735 MIIB7DCCAZOgAwIBAgIJANlMBNpJfb/rMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT
7736 AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn
7737 aXRzIFB0eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQsw
7738 CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu
7739 ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp
7740 4r9ln5e+Lx4NlIpM1Zdrt6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsW
7741 Ghz1HX7xlC1Lz3IiwYEEABI0VoIEABI0VqNgMF4wHQYDVR0OBBYEFKuE0qyrlfCC
7742 ThZ4B1VXX+QmjYLRMB8GA1UdIwQYMBaAFKuE0qyrlfCCThZ4B1VXX+QmjYLRMA4G
7743 A1UdDwEB/wQEAwIHgDAMBgNVHRMEBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIEWJ
7744 34EcqW5MHwLIA1hZ2Tj/jV2QjN02KLxis9mFsqDKAiAMlMTkzsM51vVs9Ohqa+Rc
7745 4Z7qDhjIhiF4dM0uEDYRVA==
7746 -----END CERTIFICATE-----
7747 )";
7748  static const char kBadKeyUsage[] = R"(
7749 -----BEGIN CERTIFICATE-----
7750 MIIB7jCCAZOgAwIBAgIJANlMBNpJfb/rMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT
7751 AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn
7752 aXRzIFB0eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQsw
7753 CQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJu
7754 ZXQgV2lkZ2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp
7755 4r9ln5e+Lx4NlIpM1Zdrt6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsW
7756 Ghz1HX7xlC1Lz3IiwYEEABI0VoIEABI0VqNgMF4wHQYDVR0OBBYEFKuE0qyrlfCC
7757 ThZ4B1VXX+QmjYLRMB8GA1UdIwQYMBaAFKuE0qyrlfCCThZ4B1VXX+QmjYLRMA4G
7758 A1UdDwEB/wQEAwIDCDAMBgNVHRMEBTADAQH/MAoGCCqGSM49BAMCA0kAMEYCIQC6
7759 taYBUDu2gcZC6EMk79FBHArYI0ucF+kzvETegZCbBAIhANtObFec5gtso/47moPD
7760 RHrQbWsFUakETXL9QMlegh5t
7761 -----END CERTIFICATE-----
7762 )";
7763 
7764  bssl::UniquePtr<X509> good = CertFromPEM(kGoodKeyUsage);
7765  ASSERT_TRUE(good);
7766  bssl::UniquePtr<X509> bad = CertFromPEM(kBadKeyUsage);
7767  ASSERT_TRUE(bad);
7768 
7769  // We check key usage when configuring EC certificates to distinguish ECDSA
7770  // and ECDH.
7771  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
7772  ASSERT_TRUE(ctx);
7773  EXPECT_TRUE(SSL_CTX_use_certificate(ctx.get(), good.get()));
7775 }
7776 
7777 // Test that |SSL_can_release_private_key| reports true as early as expected.
7778 // The internal asserts in the library check we do not report true too early.
7779 TEST(SSLTest, CanReleasePrivateKey) {
7780  bssl::UniquePtr<SSL_CTX> client_ctx =
7784 
7785  // Note this assumes the transport buffer is large enough to fit the client
7786  // and server first flights. We check this with |SSL_ERROR_WANT_READ|. If the
7787  // transport buffer was too small it would return |SSL_ERROR_WANT_WRITE|.
7788  auto check_first_server_round_trip = [&](SSL *client, SSL *server) {
7789  // Write the ClientHello.
7792 
7793  // Consume the ClientHello and write the server flight.
7796 
7798  };
7799 
7800  {
7801  SCOPED_TRACE("TLS 1.2 ECDHE");
7802  bssl::UniquePtr<SSL_CTX> server_ctx(
7805  ASSERT_TRUE(
7808  server_ctx.get(), "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"));
7809  // Configure the server to request client certificates, so we can also test
7810  // the client half.
7812  server_ctx.get(), SSL_VERIFY_PEER,
7813  [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
7814  bssl::UniquePtr<SSL> client, server;
7816  server_ctx.get()));
7817  check_first_server_round_trip(client.get(), server.get());
7818 
7819  // Consume the server flight and write the client response. The client still
7820  // has a Finished message to consume but can also release its key early.
7821  ASSERT_EQ(-1, SSL_do_handshake(client.get()));
7824 
7825  // However, a client that has not disabled renegotiation can never release
7826  // the key.
7828  server_ctx.get()));
7830  check_first_server_round_trip(client.get(), server.get());
7831  ASSERT_EQ(-1, SSL_do_handshake(client.get()));
7834  }
7835 
7836  {
7837  SCOPED_TRACE("TLS 1.2 resumption");
7838  bssl::UniquePtr<SSL_CTX> server_ctx(
7841  ASSERT_TRUE(
7843  bssl::UniquePtr<SSL_SESSION> session =
7845  ASSERT_TRUE(session);
7846  bssl::UniquePtr<SSL> client, server;
7848  server_ctx.get()));
7849  SSL_set_session(client.get(), session.get());
7850  check_first_server_round_trip(client.get(), server.get());
7851  }
7852 
7853  {
7854  SCOPED_TRACE("TLS 1.3 1-RTT");
7855  bssl::UniquePtr<SSL_CTX> server_ctx(
7858  ASSERT_TRUE(
7860  bssl::UniquePtr<SSL> client, server;
7862  server_ctx.get()));
7863  check_first_server_round_trip(client.get(), server.get());
7864  }
7865 
7866  {
7867  SCOPED_TRACE("TLS 1.3 resumption");
7868  bssl::UniquePtr<SSL_CTX> server_ctx(
7871  ASSERT_TRUE(
7873  bssl::UniquePtr<SSL_SESSION> session =
7875  ASSERT_TRUE(session);
7876  bssl::UniquePtr<SSL> client, server;
7878  server_ctx.get()));
7879  SSL_set_session(client.get(), session.get());
7880  check_first_server_round_trip(client.get(), server.get());
7881  }
7882 }
7883 
7884 // GetExtensionOrder sets |*out| to the list of extensions a client attached to
7885 // |ctx| will send in the ClientHello. If |ech_keys| is non-null, the client
7886 // will offer ECH with the public component. If |decrypt_ech| is true, |*out|
7887 // will be set to the ClientHelloInner's extensions, rather than
7888 // ClientHelloOuter.
7889 static bool GetExtensionOrder(SSL_CTX *client_ctx, std::vector<uint16_t> *out,
7890  SSL_ECH_KEYS *ech_keys, bool decrypt_ech) {
7891  struct AppData {
7892  std::vector<uint16_t> *out;
7893  bool decrypt_ech;
7894  bool callback_done = false;
7895  };
7896  AppData app_data;
7897  app_data.out = out;
7898  app_data.decrypt_ech = decrypt_ech;
7899 
7900  bssl::UniquePtr<SSL_CTX> server_ctx =
7902  if (!server_ctx || //
7903  !SSL_CTX_set_app_data(server_ctx.get(), &app_data) ||
7904  (decrypt_ech && !SSL_CTX_set1_ech_keys(server_ctx.get(), ech_keys))) {
7905  return false;
7906  }
7907 
7908  // Configure the server to record the ClientHello extension order. We use a
7909  // server rather than |GetClientHello| so it can decrypt ClientHelloInner.
7911  server_ctx.get(),
7912  [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
7913  AppData *app_data_ptr = static_cast<AppData *>(
7914  SSL_CTX_get_app_data(SSL_get_SSL_CTX(client_hello->ssl)));
7915  EXPECT_EQ(app_data_ptr->decrypt_ech ? 1 : 0,
7916  SSL_ech_accepted(client_hello->ssl));
7917 
7918  app_data_ptr->out->clear();
7919  CBS extensions;
7920  CBS_init(&extensions, client_hello->extensions,
7921  client_hello->extensions_len);
7922  while (CBS_len(&extensions)) {
7923  uint16_t type;
7924  CBS body;
7925  if (!CBS_get_u16(&extensions, &type) ||
7926  !CBS_get_u16_length_prefixed(&extensions, &body)) {
7927  return ssl_select_cert_error;
7928  }
7929  app_data_ptr->out->push_back(type);
7930  }
7931 
7932  // Don't bother completing the handshake.
7933  app_data_ptr->callback_done = true;
7934  return ssl_select_cert_error;
7935  });
7936 
7937  bssl::UniquePtr<SSL> client, server;
7939  (ech_keys != nullptr && !InstallECHConfigList(client.get(), ech_keys))) {
7940  return false;
7941  }
7942 
7943  // Run the handshake far enough to process the ClientHello.
7944  SSL_do_handshake(client.get());
7945  SSL_do_handshake(server.get());
7946  return app_data.callback_done;
7947 }
7948 
7949 // Test that, when extension permutation is enabled, the ClientHello extension
7950 // order changes, both with and without ECH, and in both ClientHelloInner and
7951 // ClientHelloOuter.
7952 TEST(SSLTest, PermuteExtensions) {
7953  bssl::UniquePtr<SSL_ECH_KEYS> keys = MakeTestECHKeys();
7954  ASSERT_TRUE(keys);
7955  for (bool offer_ech : {false, true}) {
7956  SCOPED_TRACE(offer_ech);
7957  SSL_ECH_KEYS *maybe_keys = offer_ech ? keys.get() : nullptr;
7958  for (bool decrypt_ech : {false, true}) {
7960  if (!offer_ech && decrypt_ech) {
7961  continue;
7962  }
7963 
7964  // When extension permutation is disabled, the order should be consistent.
7965  bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
7966  ASSERT_TRUE(ctx);
7967  std::vector<uint16_t> order1, order2;
7968  ASSERT_TRUE(
7969  GetExtensionOrder(ctx.get(), &order1, maybe_keys, decrypt_ech));
7970  ASSERT_TRUE(
7971  GetExtensionOrder(ctx.get(), &order2, maybe_keys, decrypt_ech));
7972  EXPECT_EQ(order1, order2);
7973 
7974  ctx.reset(SSL_CTX_new(TLS_method()));
7975  ASSERT_TRUE(ctx);
7977 
7978  // When extension permutation is enabled, each ClientHello should have a
7979  // different order.
7980  //
7981  // This test is inherently flaky, so we run it multiple times. We send at
7982  // least five extensions by default from TLS 1.3: supported_versions,
7983  // key_share, supported_groups, psk_key_exchange_modes, and
7984  // signature_algorithms. That means the probability of a false negative is
7985  // at most 1/120. Repeating the test 14 times lowers false negative rate
7986  // to under 2^-96.
7987  ASSERT_TRUE(
7988  GetExtensionOrder(ctx.get(), &order1, maybe_keys, decrypt_ech));
7989  EXPECT_GE(order1.size(), 5u);
7990  static const int kNumIterations = 14;
7991  bool passed = false;
7992  for (int i = 0; i < kNumIterations; i++) {
7993  ASSERT_TRUE(
7994  GetExtensionOrder(ctx.get(), &order2, maybe_keys, decrypt_ech));
7995  if (order1 != order2) {
7996  passed = true;
7997  break;
7998  }
7999  }
8000  EXPECT_TRUE(passed) << "Extensions were not permuted";
8001  }
8002  }
8003 }
8004 
8005 } // namespace
testing::TestParamInfo::param
ParamType param
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-param-util.h:60
NID_aes_128_gcm
#define NID_aes_128_gcm
Definition: nid.h:3963
BSSL_NAMESPACE_BEGIN::QUICMethodTest::AllowOutOfOrderWrites
void AllowOutOfOrderWrites()
Definition: ssl_test.cc:6088
SSL_CTX_set_session_psk_dhe_timeout
#define SSL_CTX_set_session_psk_dhe_timeout
Definition: boringssl_prefix_symbols.h:197
SSL_MODE_NO_AUTO_CHAIN
#define SSL_MODE_NO_AUTO_CHAIN
Definition: ssl.h:775
xds_interop_client.str
str
Definition: xds_interop_client.py:487
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
BSSL_NAMESPACE_BEGIN::MockQUICTransport::SetWriteSecret
bool SetWriteSecret(ssl_encryption_level_t level, const SSL_CIPHER *cipher, Span< const uint8_t > secret)
Definition: ssl_test.cc:5887
BSSL_NAMESPACE_BEGIN::MockQUICTransport::MockQUICTransport
MockQUICTransport(Role role)
Definition: ssl_test.cc:5823
SSL_CTX_cipher_in_group
#define SSL_CTX_cipher_in_group
Definition: boringssl_prefix_symbols.h:75
BSSL_NAMESPACE_BEGIN::SwitchSessionIDContextSNI
static int SwitchSessionIDContextSNI(SSL *ssl, int *out_alert, void *arg)
Definition: ssl_test.cc:3223
SSL_R_WRONG_VERSION_ON_EARLY_DATA
#define SSL_R_WRONG_VERSION_ON_EARLY_DATA
Definition: ssl.h:5545
BSSL_NAMESPACE_BEGIN::CipherListToString
static std::string CipherListToString(SSL_CTX *ctx)
Definition: ssl_test.cc:437
check_naked_includes.changed
bool changed
Definition: check_naked_includes.py:49
BSSL_NAMESPACE_BEGIN::TicketAEADMethodTest
Definition: ssl_test.cc:4606
BSSL_NAMESPACE_BEGIN::ConnectClientAndServerWithTicketMethod
static void ConnectClientAndServerWithTicketMethod(bssl::UniquePtr< SSL > *out_client, bssl::UniquePtr< SSL > *out_server, SSL_CTX *client_ctx, SSL_CTX *server_ctx, unsigned retry_count, ssl_test_ticket_aead_failure_mode failure_mode, SSL_SESSION *session)
Definition: ssl_test.cc:4565
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:444
ssl_cipher_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:520
SSL_get_signature_algorithm_key_type
#define SSL_get_signature_algorithm_key_type
Definition: boringssl_prefix_symbols.h:381
X509_STORE_new
#define X509_STORE_new
Definition: boringssl_prefix_symbols.h:2545
NID_md5_sha1
#define NID_md5_sha1
Definition: nid.h:603
SSL_AD_UNEXPECTED_MESSAGE
#define SSL_AD_UNEXPECTED_MESSAGE
Definition: ssl.h:3795
OPENSSL_NPN_NEGOTIATED
#define OPENSSL_NPN_NEGOTIATED
Definition: ssl.h:3013
SSL_ech_accepted
#define SSL_ech_accepted
Definition: boringssl_prefix_symbols.h:302
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_ex_index_free
static void ssl_test_ticket_aead_ex_index_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int index, long argl, void *argp)
Definition: ssl_test.cc:4476
check_banned_filenames.bad
bad
Definition: check_banned_filenames.py:26
SSL_CTX_set_tlsext_servername_callback
#define SSL_CTX_set_tlsext_servername_callback
Definition: boringssl_prefix_symbols.h:206
EVP_PKEY_EC
#define EVP_PKEY_EC
Definition: evp.h:178
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2060
SSL_CTX_set_verify
#define SSL_CTX_set_verify
Definition: boringssl_prefix_symbols.h:218
BSSL_NAMESPACE_BEGIN::QUICMethodTest::TransportFromSSL
static MockQUICTransport * TransportFromSSL(const SSL *ssl)
Definition: ssl_test.cc:6075
BSSL_NAMESPACE_BEGIN::TEST
TEST(SSLTest, PermuteExtensions)
Definition: ssl_test.cc:7952
SSL_CIPHER_get_name
#define SSL_CIPHER_get_name
Definition: boringssl_prefix_symbols.h:53
transport_
grpc_transport * transport_
Definition: binder_transport_test.cc:105
CBB_flush
#define CBB_flush
Definition: boringssl_prefix_symbols.h:1045
CBB_data
#define CBB_data
Definition: boringssl_prefix_symbols.h:1040
BSSL_NAMESPACE_BEGIN::MockQUICTransport::AllowOutOfOrderWrites
void AllowOutOfOrderWrites()
Definition: ssl_test.cc:5849
EVP_md5_sha1
const OPENSSL_EXPORT EVP_MD * EVP_md5_sha1(void)
test_server.argp
argp
Definition: test_server.py:33
public_key
Definition: hrss.c:1881
CBB_init
#define CBB_init
Definition: boringssl_prefix_symbols.h:1047
X509_get_subject_name
#define X509_get_subject_name
Definition: boringssl_prefix_symbols.h:2672
write_data
void write_data(uv_stream_t *dest, size_t size, uv_buf_t buf, uv_write_cb cb)
Definition: libuv/docs/code/uvtee/main.c:37
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
BSSL_NAMESPACE_BEGIN::ExpectDefaultVersion
static void ExpectDefaultVersion(uint16_t min_version, uint16_t max_version, const SSL_METHOD *(*method)(void))
Definition: ssl_test.cc:885
RAND_bytes
#define RAND_bytes
Definition: boringssl_prefix_symbols.h:2060
SSL_shutdown
#define SSL_shutdown
Definition: boringssl_prefix_symbols.h:515
CBS_get_u16
#define CBS_get_u16
Definition: boringssl_prefix_symbols.h:1073
regen-readme.it
it
Definition: regen-readme.py:15
BIO_meth_set_read
#define BIO_meth_set_read
Definition: boringssl_prefix_symbols.h:811
NID_kx_ecdhe
#define NID_kx_ecdhe
Definition: nid.h:4212
BIO_wpending
#define BIO_wpending
Definition: boringssl_prefix_symbols.h:869
SSL_SESSION_set1_id
#define SSL_SESSION_set1_id
Definition: boringssl_prefix_symbols.h:264
SSL_SESSION_DUP_ALL
#define SSL_SESSION_DUP_ALL
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3173
SSL_SIGN_RSA_PSS_RSAE_SHA256
#define SSL_SIGN_RSA_PSS_RSAE_SHA256
Definition: ssl.h:1073
SSL_SESSION_set_protocol_version
#define SSL_SESSION_set_protocol_version
Definition: boringssl_prefix_symbols.h:267
Span::size
size_t size() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:133
Bytes
Definition: boringssl-with-bazel/src/crypto/test/test_util.h:38
SSL_set_session_id_context
#define SSL_set_session_id_context
Definition: boringssl_prefix_symbols.h:492
cbs_st
Definition: bytestring.h:39
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_seal
static int ssl_test_ticket_aead_seal(SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out_len, const uint8_t *in, size_t in_len)
Definition: ssl_test.cc:4503
BSSL_NAMESPACE_BEGIN::kBadSessionTrailingData
static const char kBadSessionTrailingData[]
Definition: ssl_test.cc:785
OPENSSL_memcmp
static int OPENSSL_memcmp(const void *s1, const void *s2, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:811
NID_aes_128_cbc
#define NID_aes_128_cbc
Definition: nid.h:1933
SSL_CIPHER_get_rfc_name
#define SSL_CIPHER_get_rfc_name
Definition: boringssl_prefix_symbols.h:56
SSL_connect
#define SSL_connect
Definition: boringssl_prefix_symbols.h:294
ctx
Definition: benchmark-async.c:30
SSL_set_quic_use_legacy_codepoint
#define SSL_set_quic_use_legacy_codepoint
Definition: boringssl_prefix_symbols.h:485
SSL_SESSION_set_time
#define SSL_SESSION_set_time
Definition: boringssl_prefix_symbols.h:269
CRYPTO_BUFFER_alloc
#define CRYPTO_BUFFER_alloc
Definition: boringssl_prefix_symbols.h:1114
BSSL_NAMESPACE_BEGIN::CompleteHandshakes
static bool CompleteHandshakes(SSL *client, SSL *server)
Definition: ssl_test.cc:1410
NID_X9_62_prime256v1
#define NID_X9_62_prime256v1
Definition: nid.h:1914
BSSL_NAMESPACE_BEGIN::SaveLastSession
static int SaveLastSession(SSL *ssl, SSL_SESSION *session)
Definition: ssl_test.cc:1538
X509_VERIFY_PARAM_set1_host
#define X509_VERIFY_PARAM_set1_host
Definition: boringssl_prefix_symbols.h:2593
SSL_DEFAULT_SESSION_PSK_DHE_TIMEOUT
#define SSL_DEFAULT_SESSION_PSK_DHE_TIMEOUT
Definition: ssl.h:1989
SSL_CIPHER_get_digest_nid
#define SSL_CIPHER_get_digest_nid
Definition: boringssl_prefix_symbols.h:47
CBS_skip
#define CBS_skip
Definition: boringssl_prefix_symbols.h:1092
Connect
static int Connect(uint16_t port)
Definition: bssl_shim.cc:98
BSSL_NAMESPACE_BEGIN::ExpectFDs
static void ExpectFDs(const SSL *ssl, int rfd, int wfd)
Definition: ssl_test.cc:2854
SSL_CTX_set_options
#define SSL_CTX_set_options
Definition: boringssl_prefix_symbols.h:182
BSSL_NAMESPACE_BEGIN::CipherListsEqual
static bool CipherListsEqual(SSL_CTX *ctx, const std::vector< ExpectedCipher > &expected)
Definition: ssl_test.cc:461
SSL_set_quic_transport_params
#define SSL_set_quic_transport_params
Definition: boringssl_prefix_symbols.h:484
NID_kx_any
#define NID_kx_any
Definition: nid.h:4232
BSSL_NAMESPACE_BEGIN::QUICMethodTest::AddHandshakeDataCallback
static int AddHandshakeDataCallback(SSL *ssl, enum ssl_encryption_level_t level, const uint8_t *data, size_t len)
Definition: ssl_test.cc:6238
SSL_CTX_set_strict_cipher_list
#define SSL_CTX_set_strict_cipher_list
Definition: boringssl_prefix_symbols.h:201
bio_st
Definition: bio.h:822
BSSL_NAMESPACE_BEGIN::GetECHLength
static bool GetECHLength(SSL_CTX *ctx, size_t *out_client_hello_len, size_t *out_ech_len, size_t max_name_len, const char *name)
Definition: ssl_test.cc:2001
grpc::testing::key2
const char key2[]
Definition: client_context_test_peer_test.cc:33
BSSL_NAMESPACE_BEGIN::g_ssl_test_ticket_aead_ex_index
static int g_ssl_test_ticket_aead_ex_index
Definition: ssl_test.cc:4488
BSSL_NAMESPACE_BEGIN::SSLVersionTest::UseCertAndKey
bool UseCertAndKey(SSL_CTX *ctx) const
Definition: ssl_test.cc:2516
SSL_process_tls13_new_session_ticket
#define SSL_process_tls13_new_session_ticket
Definition: boringssl_prefix_symbols.h:419
DTLS1_2_VERSION
#define DTLS1_2_VERSION
Definition: ssl.h:656
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_seal_fail
@ ssl_test_ticket_aead_seal_fail
Definition: ssl_test.cc:4459
BSSL_NAMESPACE_BEGIN::MockQUICTransport::ReadHandshakeData
bool ReadHandshakeData(std::vector< uint8_t > *out, ssl_encryption_level_t level, size_t num=std::numeric_limits< size_t >::max())
Definition: ssl_test.cc:5968
BSSL_NAMESPACE_BEGIN::ECHConfigParams
Definition: ssl_test.cc:1626
ssl_renegotiate_explicit
ssl_renegotiate_explicit
Definition: ssl.h:4094
BSSL_NAMESPACE_BEGIN::VersionParam::version
uint16_t version
Definition: ssl_test.cc:75
X25519_PRIVATE_KEY_LEN
#define X25519_PRIVATE_KEY_LEN
Definition: curve25519.h:36
BSSL_NAMESPACE_BEGIN::ExpectSessionRenewed
static bssl::UniquePtr< SSL_SESSION > ExpectSessionRenewed(SSL_CTX *client_ctx, SSL_CTX *server_ctx, SSL_SESSION *session)
Definition: ssl_test.cc:3175
NID_auth_psk
#define NID_auth_psk
Definition: nid.h:4228
grpc_core::RefCountedPtr::get
T * get() const
Definition: ref_counted_ptr.h:146
TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:450
SSL_CTX_get_min_proto_version
#define SSL_CTX_get_min_proto_version
Definition: boringssl_prefix_symbols.h:102
NID_auth_rsa
#define NID_auth_rsa
Definition: nid.h:4220
SSL_set_accept_state
#define SSL_set_accept_state
Definition: boringssl_prefix_symbols.h:450
keys
const void * keys
Definition: abseil-cpp/absl/random/internal/randen.cc:49
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
BIO_should_write
#define BIO_should_write
Definition: boringssl_prefix_symbols.h:862
EVP_sha384
const OPENSSL_EXPORT EVP_MD * EVP_sha384(void)
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_open_hard_fail
@ ssl_test_ticket_aead_open_hard_fail
Definition: ssl_test.cc:4461
CertFromPEM
static bssl::UniquePtr< X509 > CertFromPEM(const char *pem)
Definition: x509_test.cc:1052
SSL_CTX_get0_certificate
#define SSL_CTX_get0_certificate
Definition: boringssl_prefix_symbols.h:85
SSL_get_early_data_reason
#define SSL_get_early_data_reason
Definition: boringssl_prefix_symbols.h:339
EVP_PKEY_RSA_PSS
#define EVP_PKEY_RSA_PSS
Definition: evp.h:176
test
Definition: spinlock_test.cc:36
check_version.warning
string warning
Definition: check_version.py:46
SSL_SESSION_copy_without_early_data
#define SSL_SESSION_copy_without_early_data
Definition: boringssl_prefix_symbols.h:239
kInput
static const uint8_t kInput[]
Definition: chacha_test.cc:44
client
Definition: examples/python/async_streaming/client.py:1
SSL3_CK_RSA_DES_192_CBC3_SHA
#define SSL3_CK_RSA_DES_192_CBC3_SHA
Definition: ssl3.h:147
SSL_ERROR_WANT_READ
#define SSL_ERROR_WANT_READ
Definition: ssl.h:494
ssl_method
static const BIO_METHOD ssl_method
Definition: bio_ssl.cc:183
SSL_set_session
#define SSL_set_session
Definition: boringssl_prefix_symbols.h:491
internal.h
GrowableArray::size
size_t size() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:387
SSL_ERROR_SSL
#define SSL_ERROR_SSL
Definition: ssl.h:485
BSSL_NAMESPACE_BEGIN::ExpectSessionReused
static void ExpectSessionReused(SSL_CTX *client_ctx, SSL_CTX *server_ctx, SSL_SESSION *session, bool want_reused)
Definition: ssl_test.cc:3161
BSSL_NAMESPACE_BEGIN::CipherTest::strict_fail
bool strict_fail
Definition: ssl_test.cc:102
SSL_CTX_set_timeout
#define SSL_CTX_set_timeout
Definition: boringssl_prefix_symbols.h:203
SSL_VERIFY_NONE
#define SSL_VERIFY_NONE
Definition: ssl.h:2373
SSL_SESS_CACHE_SERVER
#define SSL_SESS_CACHE_SERVER
Definition: ssl.h:1940
bio.h
TLS1_CK_RSA_WITH_AES_128_SHA
#define TLS1_CK_RSA_WITH_AES_128_SHA
Definition: tls1.h:317
SSL_CTX_add0_chain_cert
#define SSL_CTX_add0_chain_cert
Definition: boringssl_prefix_symbols.h:68
SSL_get_rfd
#define SSL_get_rfd
Definition: boringssl_prefix_symbols.h:369
SSL3_SSL_SESSION_ID_LENGTH
#define SSL3_SSL_SESSION_ID_LENGTH
Definition: ssl3.h:200
string.h
BSSL_NAMESPACE_BEGIN::QUICMethodTest::CreateClientSessionForQUIC
bssl::UniquePtr< SSL_SESSION > CreateClientSessionForQUIC()
Definition: ssl_test.cc:6184
OPENSSL_ARRAY_SIZE
#define OPENSSL_ARRAY_SIZE(array)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:179
SSL_R_CERTIFICATE_VERIFY_FAILED
#define SSL_R_CERTIFICATE_VERIFY_FAILED
Definition: ssl.h:5393
SSL3_MT_HELLO_REQUEST
#define SSL3_MT_HELLO_REQUEST
Definition: ssl3.h:298
sk_X509_num
#define sk_X509_num
Definition: boringssl_prefix_symbols.h:587
CBB_add_u16_length_prefixed
#define CBB_add_u16_length_prefixed
Definition: boringssl_prefix_symbols.h:1028
BSSL_NAMESPACE_BEGIN::QUICMethodTest::RunQUICHandshakesAndExpectError
bool RunQUICHandshakesAndExpectError(ExpectedError expected_error)
Definition: ssl_test.cc:6140
CBB_add_u8
#define CBB_add_u8
Definition: boringssl_prefix_symbols.h:1036
ssl_quic_method_st::flush_flight
int(* flush_flight)(SSL *ssl)
Definition: ssl.h:3350
SSL_CTX_set1_curves
#define SSL_CTX_set1_curves
Definition: boringssl_prefix_symbols.h:142
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
TLS1_CK_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:373
BSSL_NAMESPACE_BEGIN::ECHConfigParams::version
uint16_t version
Definition: ssl_test.cc:1627
SSL_CTX_set_cert_verify_callback
#define SSL_CTX_set_cert_verify_callback
Definition: boringssl_prefix_symbols.h:155
BSSL_NAMESPACE_BEGIN::ExpectTicketKeyChanged
static void ExpectTicketKeyChanged(SSL_CTX *ctx, uint8_t *inout_key, bool changed)
Definition: ssl_test.cc:3210
printf
_Use_decl_annotations_ int __cdecl printf(const char *_Format,...)
Definition: cs_driver.c:91
EXPECT_GT
#define EXPECT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2036
array
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern array
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/array.c:111
SSL_get_curve_id
#define SSL_get_curve_id
Definition: boringssl_prefix_symbols.h:336
BIO_reset
#define BIO_reset
Definition: boringssl_prefix_symbols.h:834
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_ex_index_dup
static int ssl_test_ticket_aead_ex_index_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, void **from_d, int index, long argl, void *argp)
Definition: ssl_test.cc:4469
SSL_set_mode
#define SSL_set_mode
Definition: boringssl_prefix_symbols.h:471
test_server
Definition: test_server.py:1
SSL_TLSEXT_ERR_OK
#define SSL_TLSEXT_ERR_OK
Definition: ssl.h:2755
BSSL_NAMESPACE_BEGIN::kCustomSession
static const char kCustomSession[]
Definition: ssl_test.cc:651
hpke.h
BSSL_NAMESPACE_BEGIN::ECHConfigParams::key
const EVP_HPKE_KEY * key
Definition: ssl_test.cc:1630
SSL_R_EXCESS_HANDSHAKE_DATA
#define SSL_R_EXCESS_HANDSHAKE_DATA
Definition: ssl.h:5522
CRYPTO_BUFFER_len
#define CRYPTO_BUFFER_len
Definition: boringssl_prefix_symbols.h:1118
elem
Timer elem
Definition: event_engine/iomgr_event_engine/timer_heap_test.cc:109
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
ERR_print_errors_fp
#define ERR_print_errors_fp
Definition: boringssl_prefix_symbols.h:1437
BSSL_NAMESPACE_BEGIN::KeyFromPEM
static bssl::UniquePtr< EVP_PKEY > KeyFromPEM(const char *pem)
Definition: ssl_test.cc:1207
TRACED_CALL
#define TRACED_CALL(code)
Definition: ssl_test.cc:65
SSL_CTX_sess_set_new_cb
#define SSL_CTX_sess_set_new_cb
Definition: boringssl_prefix_symbols.h:134
BSSL_NAMESPACE_BEGIN::GetChainTestIntermediateBuffer
static bssl::UniquePtr< CRYPTO_BUFFER > GetChainTestIntermediateBuffer()
Definition: ssl_test.cc:1351
SSL_CTX_get_tlsext_ticket_keys
#define SSL_CTX_get_tlsext_ticket_keys
Definition: boringssl_prefix_symbols.h:109
error_ref_leak.err
err
Definition: error_ref_leak.py:35
BSSL_NAMESPACE_BEGIN::TicketAEADMethodParam
testing::tuple< uint16_t, unsigned, ssl_test_ticket_aead_failure_mode > TicketAEADMethodParam
Definition: ssl_test.cc:4604
SSL_ERROR_NONE
#define SSL_ERROR_NONE
Definition: ssl.h:481
ciphertext
const char * ciphertext
Definition: protobuf/src/google/protobuf/stubs/strutil_unittest.cc:86
SSL_CTX_set_session_cache_mode
#define SSL_CTX_set_session_cache_mode
Definition: boringssl_prefix_symbols.h:195
Span::end
T * end() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:138
SSL_version
#define SSL_version
Definition: boringssl_prefix_symbols.h:531
BSSL_NAMESPACE_BEGIN::UnownedSSLExData::index_
int index_
Definition: ssl_test.cc:129
BSSL_NAMESPACE_BEGIN::UnownedSSLExData::Get
T * Get(const SSL *ssl)
Definition: ssl_test.cc:119
GetCertificate
static bool GetCertificate(SSL *ssl, bssl::UniquePtr< X509 > *out_x509, bssl::UniquePtr< STACK_OF(X509)> *out_chain, bssl::UniquePtr< EVP_PKEY > *out_pkey)
Definition: third_party/boringssl-with-bazel/src/ssl/test/test_config.cc:870
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::~MockQUICTransportPair
~MockQUICTransportPair()
Definition: ssl_test.cc:6024
BSSL_NAMESPACE_BEGIN::MockQUICTransport::has_alert
bool has_alert() const
Definition: ssl_test.cc:5831
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::client
MockQUICTransport * client()
Definition: ssl_test.cc:6029
BSSL_NAMESPACE_BEGIN::UnownedSSLExData
Definition: ssl_test.cc:113
SealRecord
bool SealRecord(SSL *ssl, const Span< uint8_t > out_prefix, const Span< uint8_t > out, Span< uint8_t > out_suffix, const Span< const uint8_t > in)
Definition: tls_record.cc:661
ASSERT_GE
#define ASSERT_GE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2072
SSL_set_bio
#define SSL_set_bio
Definition: boringssl_prefix_symbols.h:452
CBS_len
#define CBS_len
Definition: boringssl_prefix_symbols.h:1089
u
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:351
SSL_SESS_CACHE_OFF
#define SSL_SESS_CACHE_OFF
Definition: ssl.h:1933
kTests
static const HKDFTestVector kTests[]
Definition: hkdf_test.cc:41
evp_hpke_key_st
Definition: hpke.h:319
SSL_select_next_proto
#define SSL_select_next_proto
Definition: boringssl_prefix_symbols.h:429
SSL_CTX_set_retain_only_sha256_of_client_certs
#define SSL_CTX_set_retain_only_sha256_of_client_certs
Definition: boringssl_prefix_symbols.h:192
BSSL_NAMESPACE_BEGIN::CurveTest
Definition: ssl_test.cc:105
SSL_SIGN_RSA_PSS_RSAE_SHA384
#define SSL_SIGN_RSA_PSS_RSAE_SHA384
Definition: ssl.h:1074
SSL_SESSION_from_bytes
#define SSL_SESSION_from_bytes
Definition: boringssl_prefix_symbols.h:242
SSL_do_handshake
#define SSL_do_handshake
Definition: boringssl_prefix_symbols.h:297
BSSL_NAMESPACE_BEGIN::MockQUICTransport::Level::write_secret
std::vector< uint8_t > write_secret
Definition: ssl_test.cc:6008
pem.h
testing::TestParamInfo
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-param-util.h:56
ctx
static struct test_ctx ctx
Definition: test-ipc-send-recv.c:65
crypto_buffer_st
Definition: third_party/boringssl-with-bazel/src/crypto/pool/internal.h:31
EVP_PKEY_RSA
#define EVP_PKEY_RSA
Definition: evp.h:175
setup.name
name
Definition: setup.py:542
SSL_R_NO_CIPHERS_AVAILABLE
#define SSL_R_NO_CIPHERS_AVAILABLE
Definition: ssl.h:5442
i2d_X509
#define i2d_X509
Definition: boringssl_prefix_symbols.h:3274
client_
std::unique_ptr< SubProcess > client_
Definition: server_crash_test.cc:121
BSSL_NAMESPACE_BEGIN::QUICMethodTest::CreateClientAndServer
bool CreateClientAndServer()
Definition: ssl_test.cc:6092
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_get_ex_index
static int ssl_test_ticket_aead_get_ex_index()
Definition: ssl_test.cc:4490
SSL_CTX_sess_number
#define SSL_CTX_sess_number
Definition: boringssl_prefix_symbols.h:131
BIO_write
#define BIO_write
Definition: boringssl_prefix_symbols.h:870
version
Definition: version.py:1
CRYPTO_once
#define CRYPTO_once
Definition: boringssl_prefix_symbols.h:1182
grpc::Version
std::string Version()
Return gRPC library version.
Definition: version_cc.cc:28
ASSERT_LE
#define ASSERT_LE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2064
EXPECT_LE
#define EXPECT_LE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2030
BSSL_NAMESPACE_BEGIN::ChainsEqual
static bool ChainsEqual(STACK_OF(X509) *chain, const std::vector< X509 * > &expected)
Definition: ssl_test.cc:3827
to
size_t to
Definition: abseil-cpp/absl/container/internal/layout_test.cc:1385
PEM_read_bio
#define PEM_read_bio
Definition: boringssl_prefix_symbols.h:1940
SSL_renegotiate
#define SSL_renegotiate
Definition: boringssl_prefix_symbols.h:425
cipher_suites
static const char * cipher_suites
Definition: ssl_utils.cc:78
cbs
const CBS * cbs
Definition: third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h:107
BSSL_NAMESPACE_BEGIN::INSTANTIATE_TEST_SUITE_P
INSTANTIATE_TEST_SUITE_P(TicketAEADMethodTests, TicketAEADMethodTest, testing::Combine(testing::Values(TLS1_2_VERSION, TLS1_3_VERSION), testing::Values(0, 1, 2), testing::Values(ssl_test_ticket_aead_ok, ssl_test_ticket_aead_seal_fail, ssl_test_ticket_aead_open_soft_fail, ssl_test_ticket_aead_open_hard_fail)), TicketAEADMethodParamToString)
CurrentTimeCallback
static void CurrentTimeCallback(const SSL *ssl, timeval *out_clock)
Definition: third_party/boringssl-with-bazel/src/ssl/test/test_config.cc:721
SSL_CIPHER_get_cipher_nid
#define SSL_CIPHER_get_cipher_nid
Definition: boringssl_prefix_symbols.h:46
sk_SSL_CIPHER_value
#define sk_SSL_CIPHER_value
Definition: boringssl_prefix_symbols.h:572
X509_V_OK
#define X509_V_OK
Definition: x509.h:1918
SSL3_RANDOM_SIZE
#define SSL3_RANDOM_SIZE
Definition: ssl3.h:204
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair
Definition: ssl_test.cc:6015
BIO_read
#define BIO_read
Definition: boringssl_prefix_symbols.h:831
BSSL_NAMESPACE_BEGIN::kBadSessionExtraField
static const char kBadSessionExtraField[]
Definition: ssl_test.cc:761
BSSL_NAMESPACE_BEGIN::VerifySucceed
static int VerifySucceed(X509_STORE_CTX *store_ctx, void *arg)
Definition: ssl_test.cc:2984
TLSv1_2_method
#define TLSv1_2_method
Definition: boringssl_prefix_symbols.h:545
CBS_init
#define CBS_init
Definition: boringssl_prefix_symbols.h:1085
EVP_sha256
const OPENSSL_EXPORT EVP_MD * EVP_sha256(void)
NID_sha384
#define NID_sha384
Definition: nid.h:2998
SSL_SIGN_RSA_PKCS1_SHA256
#define SSL_SIGN_RSA_PKCS1_SHA256
Definition: ssl.h:1066
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
BSSL_NAMESPACE_BEGIN::ExpectSigAlgsEqual
void ExpectSigAlgsEqual(Span< const uint16_t > expected, Span< const uint16_t > actual)
Definition: ssl_test.cc:5298
X509_NAME_cmp
#define X509_NAME_cmp
Definition: boringssl_prefix_symbols.h:2376
BSSL_NAMESPACE_BEGIN::MakeTestECHKeys
static bssl::UniquePtr< SSL_ECH_KEYS > MakeTestECHKeys(uint8_t config_id=1)
Definition: ssl_test.cc:1694
BIO_set_ssl
#define BIO_set_ssl
Definition: boringssl_prefix_symbols.h:23
evp_cipher_ctx_st
Definition: cipher.h:536
SSL_CIPHER_get_auth_nid
#define SSL_CIPHER_get_auth_nid
Definition: boringssl_prefix_symbols.h:44
BSSL_NAMESPACE_BEGIN::TEST_P
TEST_P(SSLVersionTest, TicketSessionIDsMatch)
Definition: ssl_test.cc:7371
client_ctx
Definition: benchmark-multi-accept.c:75
ssl_ctx_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3404
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:835
SSL_reset_early_data_reject
#define SSL_reset_early_data_reject
Definition: boringssl_prefix_symbols.h:428
SSL_clear
#define SSL_clear
Definition: boringssl_prefix_symbols.h:290
SSL_ERROR_WANT_RENEGOTIATE
#define SSL_ERROR_WANT_RENEGOTIATE
Definition: ssl.h:587
ssl_quic_method_st::add_handshake_data
int(* add_handshake_data)(SSL *ssl, enum ssl_encryption_level_t level, const uint8_t *data, size_t len)
Definition: ssl.h:3345
T
#define T(upbtypeconst, upbtype, ctype, default_value)
ERR_get_error
#define ERR_get_error
Definition: boringssl_prefix_symbols.h:1419
SSL_get_fd
#define SSL_get_fd
Definition: boringssl_prefix_symbols.h:345
BSSL_NAMESPACE_BEGIN::UnownedSSLExData::UnownedSSLExData
UnownedSSLExData()
Definition: ssl_test.cc:115
BSSL_NAMESPACE_BEGIN::kSSLTestTicketMethod
static const SSL_TICKET_AEAD_METHOD kSSLTestTicketMethod
Definition: ssl_test.cc:4559
threads
static uv_thread_t * threads
Definition: threadpool.c:38
PEM_read_bio_PrivateKey
EVP_PKEY * PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u)
Definition: pem_pkey.c:71
BSSL_NAMESPACE_BEGIN::kBadCurvesLists
static const char * kBadCurvesLists[]
Definition: ssl_test.cc:426
BSSL_NAMESPACE_BEGIN::ExpectReceivedTransportParamsEqual
static void ExpectReceivedTransportParamsEqual(const SSL *ssl, Span< const uint8_t > expected)
Definition: ssl_test.cc:6897
TLS1_CK_CHACHA20_POLY1305_SHA256
#define TLS1_CK_CHACHA20_POLY1305_SHA256
Definition: tls1.h:457
testing::Test
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:402
server_
Server *const server_
Definition: chttp2_server.cc:260
EVP_PKEY_ED25519
#define EVP_PKEY_ED25519
Definition: evp.h:179
SSL_CTX_set_max_proto_version
#define SSL_CTX_set_max_proto_version
Definition: boringssl_prefix_symbols.h:173
BSSL_NAMESPACE_BEGIN::QUICMethodTest::SendAlertCallback
static int SendAlertCallback(SSL *ssl, ssl_encryption_level_t level, uint8_t alert)
Definition: ssl_test.cc:6248
EVP_HPKE_KEY_kem
#define EVP_HPKE_KEY_kem
Definition: boringssl_prefix_symbols.h:1555
SSL_get_client_CA_list
#define SSL_get_client_CA_list
Definition: boringssl_prefix_symbols.h:331
BSSL_NAMESPACE_BEGIN::QUICMethodTest::transport_
std::unique_ptr< MockQUICTransportPair > transport_
Definition: ssl_test.cc:6258
EVP_HPKE_KEY_public_key
#define EVP_HPKE_KEY_public_key
Definition: boringssl_prefix_symbols.h:1558
testing::TestWithParam
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1883
BSSL_NAMESPACE_BEGIN::SSLVersionTest::ResetContexts
void ResetContexts()
Definition: ssl_test.cc:2505
python_utils.port_server.stderr
stderr
Definition: port_server.py:51
SSL_CTX_set_permute_extensions
#define SSL_CTX_set_permute_extensions
Definition: boringssl_prefix_symbols.h:183
SSL_CTX_set1_curves_list
#define SSL_CTX_set1_curves_list
Definition: boringssl_prefix_symbols.h:143
BSSL_NAMESPACE_BEGIN::SSLVersionTest
Definition: ssl_test.cc:2489
NID_auth_ecdsa
#define NID_auth_ecdsa
Definition: nid.h:4224
EVP_DecryptInit_ex
#define EVP_DecryptInit_ex
Definition: boringssl_prefix_symbols.h:1504
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
SSL_SESSION_new
SSL_SESSION * SSL_SESSION_new(const SSL_CTX *ctx)
Definition: ssl_session.cc:957
BSSL_NAMESPACE_BEGIN::MockQUICTransport::Level::write_data
std::vector< uint8_t > write_data
Definition: ssl_test.cc:6007
BSSL_NAMESPACE_BEGIN::TEST_F
TEST_F(QUICMethodTest, QuicCodePointDefault)
Definition: ssl_test.cc:7139
SSL_SESSION_early_data_capable
#define SSL_SESSION_early_data_capable
Definition: boringssl_prefix_symbols.h:240
SSL_CTX_set1_sigalgs
#define SSL_CTX_set1_sigalgs
Definition: boringssl_prefix_symbols.h:146
client
static uv_tcp_t client
Definition: test-callback-stack.c:33
EVP_AEAD_DEFAULT_TAG_LENGTH
#define EVP_AEAD_DEFAULT_TAG_LENGTH
Definition: aead.h:240
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::SecretsMatch
bool SecretsMatch(ssl_encryption_level_t level) const
Definition: ssl_test.cc:6032
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::client_
MockQUICTransport client_
Definition: ssl_test.cc:6041
BSSL_NAMESPACE_BEGIN::QUICMethodTest::SetUp
void SetUp() override
Definition: ssl_test.cc:6047
TLSv1_1_method
#define TLSv1_1_method
Definition: boringssl_prefix_symbols.h:542
BSSL_NAMESPACE_BEGIN::GetTestCertificate
static bssl::UniquePtr< X509 > GetTestCertificate()
Definition: ssl_test.cc:1216
SSL_CTX_set_ocsp_response
#define SSL_CTX_set_ocsp_response
Definition: boringssl_prefix_symbols.h:181
SSL_process_quic_post_handshake
#define SSL_process_quic_post_handshake
Definition: boringssl_prefix_symbols.h:418
OPENSSL_malloc
#define OPENSSL_malloc
Definition: boringssl_prefix_symbols.h:1885
SSL_SIGN_RSA_PKCS1_SHA512
#define SSL_SIGN_RSA_PKCS1_SHA512
Definition: ssl.h:1068
from
size_t from
Definition: abseil-cpp/absl/container/internal/layout_test.cc:1384
SSL_CTX_set_custom_verify
#define SSL_CTX_set_custom_verify
Definition: boringssl_prefix_symbols.h:161
bytestring.h
BSSL_NAMESPACE_BEGIN::GetECDSATestCertificate
static bssl::UniquePtr< X509 > GetECDSATestCertificate()
Definition: ssl_test.cc:1269
BSSL_NAMESPACE_BEGIN::MockQUICTransport::set_peer
void set_peer(MockQUICTransport *peer)
Definition: ssl_test.cc:5829
SSL_CTX_set_cert_cb
#define SSL_CTX_set_cert_cb
Definition: boringssl_prefix_symbols.h:153
hello
static z_const char hello[]
Definition: bloaty/third_party/zlib/test/example.c:29
BIO_new_mem_buf
#define BIO_new_mem_buf
Definition: boringssl_prefix_symbols.h:820
NID_kx_psk
#define NID_kx_psk
Definition: nid.h:4216
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
SSL_get0_peer_certificates
#define SSL_get0_peer_certificates
Definition: boringssl_prefix_symbols.h:319
SSL_CTX_add1_chain_cert
#define SSL_CTX_add1_chain_cert
Definition: boringssl_prefix_symbols.h:69
SSL_set_SSL_CTX
#define SSL_set_SSL_CTX
Definition: boringssl_prefix_symbols.h:449
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
SSL_decline_handoff
bool SSL_decline_handoff(SSL *ssl)
Definition: handoff.cc:104
CBB_add_u16
#define CBB_add_u16
Definition: boringssl_prefix_symbols.h:1027
SSL_CTX_set1_sigalgs_list
#define SSL_CTX_set1_sigalgs_list
Definition: boringssl_prefix_symbols.h:147
SSL_SESSION_set_ticket
#define SSL_SESSION_set_ticket
Definition: boringssl_prefix_symbols.h:268
BIO_new_bio_pair
#define BIO_new_bio_pair
Definition: boringssl_prefix_symbols.h:815
SSL_set_ex_data
#define SSL_set_ex_data
Definition: boringssl_prefix_symbols.h:462
PEM_read_bio_X509
#define PEM_read_bio_X509
Definition: boringssl_prefix_symbols.h:1955
TLS1_1_VERSION
#define TLS1_1_VERSION
Definition: ssl.h:651
SCOPED_TRACE
#define SCOPED_TRACE(message)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2264
sk_CRYPTO_BUFFER_new_null
#define sk_CRYPTO_BUFFER_new_null
Definition: boringssl_prefix_symbols.h:557
ERR_LIB_SSL
@ ERR_LIB_SSL
Definition: err.h:307
SSL_get_error
#define SSL_get_error
Definition: boringssl_prefix_symbols.h:340
EVP_PKEY_NONE
#define EVP_PKEY_NONE
Definition: evp.h:174
SSL_CTX_remove_session
#define SSL_CTX_remove_session
Definition: boringssl_prefix_symbols.h:116
ERR_GET_REASON
#define ERR_GET_REASON(packed_error)
Definition: err.h:171
callback_state
Definition: connected_channel.cc:43
SSL_get_verify_result
#define SSL_get_verify_result
Definition: boringssl_prefix_symbols.h:392
invalid
@ invalid
Definition: base64_test.cc:39
SSL_CTX_new
#define SSL_CTX_new
Definition: boringssl_prefix_symbols.h:115
SSL_CIPHER_standard_name
#define SSL_CIPHER_standard_name
Definition: boringssl_prefix_symbols.h:61
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
Array< uint8_t >
BSSL_NAMESPACE_BEGIN::MockQUICTransport::alert
uint8_t alert() const
Definition: ssl_test.cc:5833
ASSERT_LT
#define ASSERT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2068
BSSL_NAMESPACE_BEGIN::GetECDSATestKey
static bssl::UniquePtr< EVP_PKEY > GetECDSATestKey()
Definition: ssl_test.cc:1286
STACK_OF
#define STACK_OF(type)
Definition: stack.h:125
SSL_set1_ech_config_list
#define SSL_set1_ech_config_list
Definition: boringssl_prefix_symbols.h:443
array
Definition: undname.c:101
BSSL_NAMESPACE_BEGIN::MockQUICTransport::HasWriteSecret
bool HasWriteSecret(ssl_encryption_level_t level) const
Definition: ssl_test.cc:5845
BSSL_NAMESPACE_BEGIN::MockQUICTransport
Definition: ssl_test.cc:5819
ssl_quic_method_st
Definition: ssl.h:3289
BSSL_NAMESPACE_BEGIN::MockQUICTransport::SetReadSecret
bool SetReadSecret(ssl_encryption_level_t level, const SSL_CIPHER *cipher, Span< const uint8_t > secret)
Definition: ssl_test.cc:5851
SSL_ECH_KEYS_add
#define SSL_ECH_KEYS_add
Definition: boringssl_prefix_symbols.h:233
grpc::testing::key1
const char key1[]
Definition: client_context_test_peer_test.cc:32
BSSL_NAMESPACE_BEGIN::SwitchContext
static int SwitchContext(SSL *ssl, int *out_alert, void *arg)
Definition: ssl_test.cc:3567
config
struct config_s config
tag
static void * tag(intptr_t t)
Definition: bad_client.cc:318
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
BSSL_NAMESPACE_BEGIN::AppendSession
static void AppendSession(SSL_SESSION *session, void *arg)
Definition: ssl_test.cc:2361
SSL_get_peer_cert_chain
#define SSL_get_peer_cert_chain
Definition: boringssl_prefix_symbols.h:355
NID_sha256
#define NID_sha256
Definition: nid.h:2993
root
RefCountedPtr< grpc_tls_certificate_provider > root
Definition: xds_server_config_fetcher.cc:223
CBB_add_u8_length_prefixed
#define CBB_add_u8_length_prefixed
Definition: boringssl_prefix_symbols.h:1037
ssl_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3698
SSL_key_update
#define SSL_key_update
Definition: boringssl_prefix_symbols.h:406
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
ssl_early_callback_ctx
Definition: ssl.h:4186
SSL_get_client_random
#define SSL_get_client_random
Definition: boringssl_prefix_symbols.h:332
TLS1_CK_RSA_WITH_AES_256_SHA
#define TLS1_CK_RSA_WITH_AES_256_SHA
Definition: tls1.h:324
SSL_CTX_set_quic_method
#define SSL_CTX_set_quic_method
Definition: boringssl_prefix_symbols.h:188
BIO_s_mem
#define BIO_s_mem
Definition: boringssl_prefix_symbols.h:839
BSSL_NAMESPACE_BEGIN::kMustNotIncludeNull
static const char * kMustNotIncludeNull[]
Definition: ssl_test.cc:383
EVP_HPKE_KEY_init
#define EVP_HPKE_KEY_init
Definition: boringssl_prefix_symbols.h:1554
BSSL_NAMESPACE_BEGIN::ECHConfigParams::public_key
std::vector< uint8_t > public_key
Definition: ssl_test.cc:1634
SSL_quic_read_level
#define SSL_quic_read_level
Definition: boringssl_prefix_symbols.h:422
ssl_early_data_unsupported_for_session
ssl_early_data_unsupported_for_session
Definition: ssl.h:3569
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
BSSL_NAMESPACE_BEGIN::ClientConfig::servername
std::string servername
Definition: ssl_test.cc:1500
EVP_HPKE_HKDF_SHA256
#define EVP_HPKE_HKDF_SHA256
Definition: hpke.h:55
SSL_provide_quic_data
#define SSL_provide_quic_data
Definition: boringssl_prefix_symbols.h:420
transport
grpc_transport transport
Definition: filter_fuzzer.cc:146
SSL_early_callback_ctx_extension_get
#define SSL_early_callback_ctx_extension_get
Definition: boringssl_prefix_symbols.h:299
NID_aes_256_cbc
#define NID_aes_256_cbc
Definition: nid.h:1973
ssl_encryption_initial
ssl_encryption_initial
Definition: ssl.h:3282
BSSL_NAMESPACE_BEGIN::kTicketKeyLen
static const size_t kTicketKeyLen
Definition: ssl_test.cc:80
BSSL_NAMESPACE_BEGIN::CreateClientSession
static bssl::UniquePtr< SSL_SESSION > CreateClientSession(SSL_CTX *client_ctx, SSL_CTX *server_ctx, const ClientConfig &config=ClientConfig())
Definition: ssl_test.cc:1544
BSSL_NAMESPACE_BEGIN::ExpectBadWriteRetry
static bool ExpectBadWriteRetry()
Definition: ssl_test.cc:3898
sha.h
BSSL_NAMESPACE_BEGIN::kCurveTests
static const CurveTest kCurveTests[]
Definition: ssl_test.cc:396
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_failure_mode
ssl_test_ticket_aead_failure_mode
Definition: ssl_test.cc:4457
SSL_session_reused
#define SSL_session_reused
Definition: boringssl_prefix_symbols.h:433
conf.version
string version
Definition: doc/python/sphinx/conf.py:36
TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:451
SSL_marshal_ech_config
#define SSL_marshal_ech_config
Definition: boringssl_prefix_symbols.h:411
ERR_peek_error
#define ERR_peek_error
Definition: boringssl_prefix_symbols.h:1428
GrowableArray
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:370
X509_STORE_add_cert
#define X509_STORE_add_cert
Definition: boringssl_prefix_symbols.h:2524
BORINGSSL_enum_c_type_test
int BORINGSSL_enum_c_type_test(void)
Definition: ssl_c_test.c:5
TLS1_CK_PSK_WITH_AES_256_CBC_SHA
#define TLS1_CK_PSK_WITH_AES_256_CBC_SHA
Definition: tls1.h:296
decrypt_ech
static bool decrypt_ech(SSL_HANDSHAKE *hs, uint8_t *out_alert, const SSL_CLIENT_HELLO *client_hello)
Definition: handshake_server.cc:507
SSL3_HM_HEADER_LENGTH
#define SSL3_HM_HEADER_LENGTH
Definition: ssl3.h:208
BSSL_NAMESPACE_BEGIN::CreateContextWithTestCertificate
static bssl::UniquePtr< SSL_CTX > CreateContextWithTestCertificate(const SSL_METHOD *method)
Definition: ssl_test.cc:1256
DTLS_method
#define DTLS_method
Definition: boringssl_prefix_symbols.h:25
SSL_get_rbio
#define SSL_get_rbio
Definition: boringssl_prefix_symbols.h:366
BSSL_NAMESPACE_BEGIN::g_current_time
static timeval g_current_time
Definition: ssl_test.cc:3291
BSSL_NAMESPACE_BEGIN::kBoringSSLSession
static const char kBoringSSLSession[]
Definition: ssl_test.cc:662
framework.rpc.grpc_csds.ClientConfig
ClientConfig
Definition: grpc_csds.py:40
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
EVP_AEAD_CTX_seal
#define EVP_AEAD_CTX_seal
Definition: boringssl_prefix_symbols.h:1454
BSSL_NAMESPACE_BEGIN::MockQUICTransport::role_
Role role_
Definition: ssl_test.cc:5998
OPENSSL_memcpy
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:819
ERR_GET_LIB
#define ERR_GET_LIB(packed_error)
Definition: err.h:166
BSSL_NAMESPACE_END
#define BSSL_NAMESPACE_END
Definition: base.h:480
header
struct absl::base_internal::@2940::AllocList::Header header
BSSL_NAMESPACE_BEGIN::kCipherTests
static const CipherTest kCipherTests[]
Definition: ssl_test.cc:132
CBS_get_u8
#define CBS_get_u8
Definition: boringssl_prefix_symbols.h:1082
EVP_DecodeBase64
#define EVP_DecodeBase64
Definition: boringssl_prefix_symbols.h:1495
SSL_TLSEXT_ERR_NOACK
#define SSL_TLSEXT_ERR_NOACK
Definition: ssl.h:2758
BIO_f_ssl
#define BIO_f_ssl
Definition: boringssl_prefix_symbols.h:22
BSSL_NAMESPACE_BEGIN::GetTestKey
static bssl::UniquePtr< EVP_PKEY > GetTestKey()
Definition: ssl_test.cc:1236
BSSL_NAMESPACE_BEGIN::ECHConfigParams::max_name_len
size_t max_name_len
Definition: ssl_test.cc:1635
CRYPTO_ONCE_INIT
#define CRYPTO_ONCE_INIT
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:471
SSL_CURVE_SECP521R1
#define SSL_CURVE_SECP521R1
Definition: ssl.h:2329
BSSL_NAMESPACE_BEGIN::XORDecompressFunc
static int XORDecompressFunc(SSL *ssl, CRYPTO_BUFFER **out, size_t uncompressed_len, const uint8_t *in, size_t in_len)
Definition: ssl_test.cc:5072
regen-readme.cmd
cmd
Definition: regen-readme.py:21
SSL_CTX_enable_ocsp_stapling
#define SSL_CTX_enable_ocsp_stapling
Definition: boringssl_prefix_symbols.h:80
BIO_set_data
#define BIO_set_data
Definition: boringssl_prefix_symbols.h:845
err.h
BIO_up_ref
#define BIO_up_ref
Definition: boringssl_prefix_symbols.h:866
BSSL_NAMESPACE_BEGIN::QUICMethodTest::CompleteHandshakesForQUIC
bool CompleteHandshakesForQUIC()
Definition: ssl_test.cc:6132
crypto.h
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_state
Definition: ssl_test.cc:4464
cipher.h
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::MockQUICTransportPair
MockQUICTransportPair()
Definition: ssl_test.cc:6017
arg
Definition: cmdline.cc:40
BSSL_NAMESPACE_BEGIN::QUICMethodTest::client_ctx_
bssl::UniquePtr< SSL_CTX > client_ctx_
Definition: ssl_test.cc:6254
SSL_ERROR_HANDBACK
#define SSL_ERROR_HANDBACK
Definition: ssl.h:580
EVP_AEAD_CTX_init
#define EVP_AEAD_CTX_init
Definition: boringssl_prefix_symbols.h:1449
number
int32_t number
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:850
HMAC_Init_ex
#define HMAC_Init_ex
Definition: boringssl_prefix_symbols.h:1793
FAIL
@ FAIL
Definition: call_creds.cc:42
SSL_CTX_enable_signed_cert_timestamps
#define SSL_CTX_enable_signed_cert_timestamps
Definition: boringssl_prefix_symbols.h:81
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::server_
MockQUICTransport server_
Definition: ssl_test.cc:6042
epoch
int64_t epoch(int year, int yday, int hour, int min, int sec)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:10172
SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL
#define SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL
Definition: ssl.h:2175
SSL_has_pending
#define SSL_has_pending
Definition: boringssl_prefix_symbols.h:398
NID_X25519
#define NID_X25519
Definition: nid.h:4195
OPENSSL_MSVC_PRAGMA
OPENSSL_MSVC_PRAGMA(warning(disable:4702))
Definition: e_aes.c:69
index_
size_t index_
Definition: xds_cluster_resolver.cc:169
BSSL_NAMESPACE_BEGIN::SSLVersionTest::cert_
bssl::UniquePtr< X509 > cert_
Definition: ssl_test.cc:2536
googletest-filter-unittest.child
child
Definition: bloaty/third_party/googletest/googletest/test/googletest-filter-unittest.py:62
SSL_VERIFY_PEER
#define SSL_VERIFY_PEER
Definition: ssl.h:2379
base64.h
SSL_SESSION_to_bytes
#define SSL_SESSION_to_bytes
Definition: boringssl_prefix_symbols.h:272
BIO_meth_set_write
#define BIO_meth_set_write
Definition: boringssl_prefix_symbols.h:812
SSL_set_tlsext_host_name
#define SSL_set_tlsext_host_name
Definition: boringssl_prefix_symbols.h:501
BSSL_NAMESPACE_BEGIN::kBadSessionVersion
static const char kBadSessionVersion[]
Definition: ssl_test.cc:773
SSL_CTX_set_reverify_on_resume
#define SSL_CTX_set_reverify_on_resume
Definition: boringssl_prefix_symbols.h:193
NID_undef
#define NID_undef
Definition: nid.h:85
TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
Definition: tls1.h:408
BSSL_NAMESPACE_BEGIN::GetChainTestCertificateBuffer
static bssl::UniquePtr< CRYPTO_BUFFER > GetChainTestCertificateBuffer()
Definition: ssl_test.cc:1314
SSL_is_server
#define SSL_is_server
Definition: boringssl_prefix_symbols.h:404
stack
NodeStack stack
Definition: cord_rep_btree.cc:356
SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER
#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER
Definition: ssl.h:769
BSSL_NAMESPACE_BEGIN::VersionParam
Definition: ssl_test.cc:74
key_
RlsLb::RequestKey key_
Definition: rls.cc:659
NID_des_ede3_cbc
#define NID_des_ede3_cbc
Definition: nid.h:287
SSL_set_quic_early_data_context
#define SSL_set_quic_early_data_context
Definition: boringssl_prefix_symbols.h:482
CRYPTO_BUFFER_new
#define CRYPTO_BUFFER_new
Definition: boringssl_prefix_symbols.h:1119
SSL_DEFAULT_SESSION_TIMEOUT
#define SSL_DEFAULT_SESSION_TIMEOUT
Definition: ssl.h:1984
SSL_CTX_set_signed_cert_timestamp_list
#define SSL_CTX_set_signed_cert_timestamp_list
Definition: boringssl_prefix_symbols.h:198
SSL_ECH_KEYS_new
#define SSL_ECH_KEYS_new
Definition: boringssl_prefix_symbols.h:237
BSSL_NAMESPACE_BEGIN::GetVersionName
static const char * GetVersionName(uint16_t version)
Definition: ssl_test.cc:3713
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
BSSL_NAMESPACE_BEGIN::ConnectClientAndServer
static bool ConnectClientAndServer(bssl::UniquePtr< SSL > *out_client, bssl::UniquePtr< SSL > *out_server, SSL_CTX *client_ctx, SSL_CTX *server_ctx, const ClientConfig &config=ClientConfig(), bool shed_handshake_config=true)
Definition: ssl_test.cc:1504
BSSL_NAMESPACE_BEGIN::MockQUICTransport::Role
Role
Definition: ssl_test.cc:5821
conf.extensions
list extensions
Definition: doc/python/sphinx/conf.py:54
SSL_R_BAD_WRITE_RETRY
#define SSL_R_BAD_WRITE_RETRY
Definition: ssl.h:5386
SSL_SESSION_dup
OPENSSL_EXPORT UniquePtr< SSL_SESSION > SSL_SESSION_dup(SSL_SESSION *session, int dup_flags)
Definition: ssl_session.cc:191
BIO_new
#define BIO_new
Definition: boringssl_prefix_symbols.h:814
SSL_CTX_set_signing_algorithm_prefs
#define SSL_CTX_set_signing_algorithm_prefs
Definition: boringssl_prefix_symbols.h:199
BSSL_NAMESPACE_BEGIN::SSLVersionTest::is_dtls
bool is_dtls() const
Definition: ssl_test.cc:2529
SSL_SESSION_should_be_single_use
#define SSL_SESSION_should_be_single_use
Definition: boringssl_prefix_symbols.h:271
buffer
char buffer[1024]
Definition: libuv/docs/code/idle-compute/main.c:8
SSL_CURVE_X25519
#define SSL_CURVE_X25519
Definition: ssl.h:2330
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_max_overhead
static size_t ssl_test_ticket_aead_max_overhead(SSL *ssl)
Definition: ssl_test.cc:4499
SSL_CIPHER_get_kx_nid
#define SSL_CIPHER_get_kx_nid
Definition: boringssl_prefix_symbols.h:50
min
#define min(a, b)
Definition: qsort.h:83
BSSL_NAMESPACE_BEGIN::FrozenTimeCallback
static void FrozenTimeCallback(const SSL *ssl, timeval *out_clock)
Definition: ssl_test.cc:3297
SSL_quic_write_level
#define SSL_quic_write_level
Definition: boringssl_prefix_symbols.h:423
aead.h
OpenRecord
OpenRecordResult OpenRecord(SSL *ssl, Span< uint8_t > *out, size_t *out_record_len, uint8_t *out_alert, const Span< uint8_t > in)
Definition: tls_record.cc:605
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
ERR_error_string_n
#define ERR_error_string_n
Definition: boringssl_prefix_symbols.h:1416
BSSL_NAMESPACE_BEGIN::QUICMethodTest::server_ctx_
bssl::UniquePtr< SSL_CTX > server_ctx_
Definition: ssl_test.cc:6255
ADD_FAILURE
#define ADD_FAILURE()
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1911
BSSL_NAMESPACE_BEGIN::g_ssl_test_ticket_aead_ex_index_once
static CRYPTO_once_t g_ssl_test_ticket_aead_ex_index_once
Definition: ssl_test.cc:4487
BSSL_NAMESPACE_BEGIN::MakeECHConfig
bool MakeECHConfig(std::vector< uint8_t > *out, const ECHConfigParams &params)
Definition: ssl_test.cc:1645
SSL_error_description
#define SSL_error_description
Definition: boringssl_prefix_symbols.h:306
NID_sha1
#define NID_sha1
Definition: nid.h:372
SSL_SESS_CACHE_CLIENT
#define SSL_SESS_CACHE_CLIENT
Definition: ssl.h:1937
BSSL_NAMESPACE_BEGIN::SSLVersionTest::server_ctx_
bssl::UniquePtr< SSL_CTX > server_ctx_
Definition: ssl_test.cc:2535
Span< const uint8_t >
BSSL_NAMESPACE_BEGIN::MockQUICTransport::Level
Definition: ssl_test.cc:6006
BSSL_NAMESPACE_BEGIN::SSLVersionTest::SSLVersionTest
SSLVersionTest()
Definition: ssl_test.cc:2491
grpc_core::UniquePtr
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
Definition: src/core/lib/gprpp/memory.h:43
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
SSL_set_custom_verify
#define SSL_set_custom_verify
Definition: boringssl_prefix_symbols.h:458
tests.qps.qps_worker.dest
dest
Definition: qps_worker.py:45
SSL_get_ciphers
#define SSL_get_ciphers
Definition: boringssl_prefix_symbols.h:330
SSL_get_version
#define SSL_get_version
Definition: boringssl_prefix_symbols.h:393
SSL_CTX_set_tlsext_servername_arg
#define SSL_CTX_set_tlsext_servername_arg
Definition: boringssl_prefix_symbols.h:205
BSSL_NAMESPACE_BEGIN::QUICMethodTest::ex_data_
static UnownedSSLExData< MockQUICTransport > ex_data_
Definition: ssl_test.cc:6257
NID_sha512
#define NID_sha512
Definition: nid.h:3003
ssl_select_cert_error
ssl_select_cert_error
Definition: ssl.h:4214
SSL_CTX_set_msg_callback
#define SSL_CTX_set_msg_callback
Definition: boringssl_prefix_symbols.h:177
SSL_SESSION_get_id
#define SSL_SESSION_get_id
Definition: boringssl_prefix_symbols.h:253
ssl_early_data_accepted
ssl_early_data_accepted
Definition: ssl.h:3559
NID_kx_rsa
#define NID_kx_rsa
Definition: nid.h:4208
BSSL_NAMESPACE_BEGIN::CreateSessionWithTicket
static bssl::UniquePtr< SSL_SESSION > CreateSessionWithTicket(uint16_t version, size_t ticket_len)
Definition: ssl_test.cc:1053
ssl_ticket_aead_success
ssl_ticket_aead_success
Definition: ssl.h:2226
BSSL_NAMESPACE_BEGIN::MockQUICTransport::SendAlert
bool SendAlert(ssl_encryption_level_t level, uint8_t alert_value)
Definition: ssl_test.cc:5950
BSSL_NAMESPACE_BEGIN::kBadRules
static const char * kBadRules[]
Definition: ssl_test.cc:356
ssl_client_hello_init
bool ssl_client_hello_init(const SSL *ssl, SSL_CLIENT_HELLO *out, Span< const uint8_t > body)
Definition: extensions.cc:211
ssl.h
BSSL_NAMESPACE_BEGIN::QUICMethodTest
Definition: ssl_test.cc:6045
SSL_CTX_set0_client_CAs
#define SSL_CTX_set0_client_CAs
Definition: boringssl_prefix_symbols.h:139
SSL_SESSION_get_version
#define SSL_SESSION_get_version
Definition: boringssl_prefix_symbols.h:259
push
int push(void *desc, unsigned char *buf, unsigned len)
Definition: bloaty/third_party/zlib/test/infcover.c:463
SSL_CTX_set_early_data_enabled
#define SSL_CTX_set_early_data_enabled
Definition: boringssl_prefix_symbols.h:166
SSL_set_app_data
#define SSL_set_app_data(s, arg)
Definition: ssl.h:4717
SSL_CTX_sess_set_cache_size
#define SSL_CTX_sess_set_cache_size
Definition: boringssl_prefix_symbols.h:132
ssl_is_valid_ech_public_name
bool ssl_is_valid_ech_public_name(Span< const uint8_t > public_name)
Definition: encrypted_client_hello.cc:338
BSSL_NAMESPACE_BEGIN::ECHConfigParams::config_id
uint16_t config_id
Definition: ssl_test.cc:1628
NID_aes_256_gcm
#define NID_aes_256_gcm
Definition: nid.h:3991
SSL_set0_rbio
#define SSL_set0_rbio
Definition: boringssl_prefix_symbols.h:436
BSSL_NAMESPACE_BEGIN::ClientConfig
Definition: ssl_test.cc:1498
mem
void * mem
Definition: libc.cpp:91
SSL3_VERSION
#define SSL3_VERSION
Definition: ssl.h:649
SSL_ERROR_WANT_WRITE
#define SSL_ERROR_WANT_WRITE
Definition: ssl.h:499
BSSL_NAMESPACE_BEGIN::kTestName
static const uint8_t kTestName[]
Definition: ssl_test.cc:2477
SHA256
#define SHA256
Definition: boringssl_prefix_symbols.h:2154
BSSL_NAMESPACE_BEGIN::GetServerTicketTime
static bool GetServerTicketTime(long *out, const SSL_SESSION *session)
Definition: ssl_test.cc:3324
SSL_can_release_private_key
#define SSL_can_release_private_key
Definition: boringssl_prefix_symbols.h:287
BSSL_NAMESPACE_BEGIN::UnownedSSLExData::Set
bool Set(SSL *ssl, T *t)
Definition: ssl_test.cc:124
SSL3_RT_HANDSHAKE
#define SSL3_RT_HANDSHAKE
Definition: ssl3.h:273
ERR_ERROR_STRING_BUF_LEN
#define ERR_ERROR_STRING_BUF_LEN
Definition: err.h:406
BSSL_NAMESPACE_BEGIN::SSLVersionTest::SetUp
void SetUp()
Definition: ssl_test.cc:2493
BSSL_NAMESPACE_BEGIN::MockQUICTransport::HasReadSecret
bool HasReadSecret(ssl_encryption_level_t level) const
Definition: ssl_test.cc:5841
EXPECT_STREQ
#define EXPECT_STREQ(s1, s2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2095
d2i_X509
#define d2i_X509
Definition: boringssl_prefix_symbols.h:3031
SSL_CTX_set_cipher_list
#define SSL_CTX_set_cipher_list
Definition: boringssl_prefix_symbols.h:157
SSL_ECH_KEYS_marshal_retry_configs
#define SSL_ECH_KEYS_marshal_retry_configs
Definition: boringssl_prefix_symbols.h:236
SSL_get_wfd
#define SSL_get_wfd
Definition: boringssl_prefix_symbols.h:395
TLS1_3_VERSION
#define TLS1_3_VERSION
Definition: ssl.h:653
EVP_HPKE_KEM_id
#define EVP_HPKE_KEM_id
Definition: boringssl_prefix_symbols.h:1549
ssl_session_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3787
SealRecordSuffixLen
size_t SealRecordSuffixLen(const SSL *ssl, const size_t plaintext_len)
Definition: tls_record.cc:648
SSL_KEY_UPDATE_NOT_REQUESTED
#define SSL_KEY_UPDATE_NOT_REQUESTED
Definition: ssl.h:425
BIO_meth_new
#define BIO_meth_new
Definition: boringssl_prefix_symbols.h:805
EVP_CipherInit_ex
#define EVP_CipherInit_ex
Definition: boringssl_prefix_symbols.h:1493
BSSL_NAMESPACE_BEGIN::GetClientHello
static bool GetClientHello(SSL *ssl, std::vector< uint8_t > *out)
Definition: ssl_test.cc:1082
ares::byte
unsigned char byte
Definition: ares-test.h:33
BSSL_NAMESPACE_BEGIN::QUICMethodTest::DefaultQUICMethod
SSL_QUIC_METHOD DefaultQUICMethod()
Definition: ssl_test.cc:6217
SSL_SIGN_ED25519
#define SSL_SIGN_ED25519
Definition: ssl.h:1076
SSL_CTX_set_handoff_mode
void SSL_CTX_set_handoff_mode(SSL_CTX *ctx, bool on)
Definition: ssl_lib.cc:406
SSL_get_app_data
#define SSL_get_app_data(s)
Definition: ssl.h:4718
SSL_CTX_set_current_time_cb
#define SSL_CTX_set_current_time_cb
Definition: boringssl_prefix_symbols.h:160
CBB_add_bytes
#define CBB_add_bytes
Definition: boringssl_prefix_symbols.h:1025
BSSL_NAMESPACE_BEGIN::kNumQUICLevels
constexpr size_t kNumQUICLevels
Definition: ssl_test.cc:5795
contents
string_view contents
Definition: elf.cc:597
TLS1_2_VERSION
#define TLS1_2_VERSION
Definition: ssl.h:652
CBBFinishArray
OPENSSL_EXPORT bool CBBFinishArray(CBB *cbb, Array< uint8_t > *out)
Definition: ssl_lib.cc:190
Span::begin
T * begin() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:136
SSL_is_signature_algorithm_rsa_pss
#define SSL_is_signature_algorithm_rsa_pss
Definition: boringssl_prefix_symbols.h:405
BSSL_NAMESPACE_BEGIN::DecodeBase64
static bool DecodeBase64(std::vector< uint8_t > *out, const char *in)
Definition: ssl_test.cc:795
BSSL_NAMESPACE_BEGIN::g_last_session
static bssl::UniquePtr< SSL_SESSION > g_last_session
Definition: ssl_test.cc:1536
BSSL_NAMESPACE_BEGIN
Definition: trust_token_test.cc:45
server_ctx
Definition: benchmark-multi-accept.c:67
TLS_with_buffers_method
#define TLS_with_buffers_method
Definition: boringssl_prefix_symbols.h:540
TLS_method
#define TLS_method
Definition: boringssl_prefix_symbols.h:538
timeval::tv_sec
long tv_sec
Definition: setup_once.h:121
ASSERT_NO_FATAL_FAILURE
#define ASSERT_NO_FATAL_FAILURE(statement)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2199
BSSL_NAMESPACE_BEGIN::kOpenSSLSession
static const char kOpenSSLSession[]
Definition: ssl_test.cc:615
rand.h
BSSL_NAMESPACE_BEGIN::VersionParam::is_tls
@ is_tls
Definition: ssl_test.cc:76
TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
Definition: tls1.h:409
SSL_SESSION_has_peer_sha256
#define SSL_SESSION_has_peer_sha256
Definition: boringssl_prefix_symbols.h:260
SSL_early_data_accepted
#define SSL_early_data_accepted
Definition: boringssl_prefix_symbols.h:300
key
const char * key
Definition: hpack_parser_table.cc:164
testing::Values
internal::ValueArray< T... > Values(T... v)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:335
BSSL_NAMESPACE_BEGIN::QUICMethodTest::FlushFlightCallback
static int FlushFlightCallback(SSL *ssl)
Definition: ssl_test.cc:6246
SSL_SIGN_RSA_PKCS1_MD5_SHA1
#define SSL_SIGN_RSA_PKCS1_MD5_SHA1
Definition: ssl.h:1081
BSSL_NAMESPACE_BEGIN::QUICMethodTest::SetReadSecretCallback
static int SetReadSecretCallback(SSL *ssl, ssl_encryption_level_t level, const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len)
Definition: ssl_test.cc:6224
timeval::tv_usec
long tv_usec
Definition: setup_once.h:122
DTLSv1_2_method
#define DTLSv1_2_method
Definition: boringssl_prefix_symbols.h:29
BSSL_NAMESPACE_BEGIN::BufferFromPEM
static bssl::UniquePtr< CRYPTO_BUFFER > BufferFromPEM(const char *pem)
Definition: ssl_test.cc:1296
x509_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:139
EVP_hpke_x25519_hkdf_sha256
#define EVP_hpke_x25519_hkdf_sha256
Definition: boringssl_prefix_symbols.h:1734
suffix
unsigned char suffix[65536]
Definition: bloaty/third_party/zlib/examples/gun.c:164
SSL_set_client_CA_list
#define SSL_set_client_CA_list
Definition: boringssl_prefix_symbols.h:456
BSSL_NAMESPACE_BEGIN::ECHConfigParams::cipher_suites
std::vector< uint16_t > cipher_suites
Definition: ssl_test.cc:1638
EVP_HPKE_KEY_generate
#define EVP_HPKE_KEY_generate
Definition: boringssl_prefix_symbols.h:1553
BSSL_NAMESPACE_BEGIN::GetExtensionOrder
static bool GetExtensionOrder(SSL_CTX *client_ctx, std::vector< uint16_t > *out, SSL_ECH_KEYS *ech_keys, bool decrypt_ech)
Definition: ssl_test.cc:7889
SSL_set_max_proto_version
#define SSL_set_max_proto_version
Definition: boringssl_prefix_symbols.h:468
BSSL_NAMESPACE_BEGIN::SSLVersionTest::key_
bssl::UniquePtr< EVP_PKEY > key_
Definition: ssl_test.cc:2537
X509_V_ERR_HOSTNAME_MISMATCH
#define X509_V_ERR_HOSTNAME_MISMATCH
Definition: x509.h:1989
BSSL_NAMESPACE_BEGIN::GetChainTestIntermediate
static bssl::UniquePtr< X509 > GetChainTestIntermediate()
Definition: ssl_test.cc:1373
ssl_encryption_application
ssl_encryption_application
Definition: ssl.h:3285
SSL_get_ex_new_index
#define SSL_get_ex_new_index
Definition: boringssl_prefix_symbols.h:343
SSL_use_PrivateKey
#define SSL_use_PrivateKey
Definition: boringssl_prefix_symbols.h:520
EVP_DecryptUpdate
#define EVP_DecryptUpdate
Definition: boringssl_prefix_symbols.h:1505
BSSL_NAMESPACE_BEGIN::kAllVersions
static const VersionParam kAllVersions[]
Definition: ssl_test.cc:82
TLS1_VERSION
#define TLS1_VERSION
Definition: ssl.h:650
server
Definition: examples/python/async_streaming/server.py:1
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
SSL_CTX_set_cert_store
#define SSL_CTX_set_cert_store
Definition: boringssl_prefix_symbols.h:154
EVP_HPKE_AES_128_GCM
#define EVP_HPKE_AES_128_GCM
Definition: hpke.h:64
BSSL_NAMESPACE_BEGIN::ECHConfigParams::public_name
std::string public_name
Definition: ssl_test.cc:1629
SSL_ERROR_ZERO_RETURN
#define SSL_ERROR_ZERO_RETURN
Definition: ssl.h:518
SSL_CIPHER_get_prf_nid
#define SSL_CIPHER_get_prf_nid
Definition: boringssl_prefix_symbols.h:54
SSL_CURVE_CECPQ2
#define SSL_CURVE_CECPQ2
Definition: ssl.h:2331
timeval
Definition: setup_once.h:113
NID_auth_any
#define NID_auth_any
Definition: nid.h:4236
SSL_SESSION_has_ticket
#define SSL_SESSION_has_ticket
Definition: boringssl_prefix_symbols.h:261
SSL_set_wfd
#define SSL_set_wfd
Definition: boringssl_prefix_symbols.h:514
SSL_CURVE_SECP256R1
#define SSL_CURVE_SECP256R1
Definition: ssl.h:2327
SSL_CTX_add_cert_compression_alg
#define SSL_CTX_add_cert_compression_alg
Definition: boringssl_prefix_symbols.h:70
BSSL_NAMESPACE_BEGIN::InstallECHConfigList
static bool InstallECHConfigList(SSL *client, const SSL_ECH_KEYS *keys)
Definition: ssl_test.cc:1714
SSL_MODE_ENABLE_PARTIAL_WRITE
#define SSL_MODE_ENABLE_PARTIAL_WRITE
Definition: ssl.h:762
index
int index
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1184
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
BSSL_NAMESPACE_BEGIN::TicketAEADMethodParamToString
std::string TicketAEADMethodParamToString(const testing::TestParamInfo< TicketAEADMethodParam > &params)
Definition: ssl_test.cc:4675
SSL_set0_wbio
#define SSL_set0_wbio
Definition: boringssl_prefix_symbols.h:438
testing::Combine
internal::CartesianProductHolder< Generator... > Combine(const Generator &... g)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:410
SSL_CTX_clear_mode
#define SSL_CTX_clear_mode
Definition: boringssl_prefix_symbols.h:78
hmac_ctx_st
Definition: hmac.h:158
SSL_get0_signed_cert_timestamp_list
#define SSL_get0_signed_cert_timestamp_list
Definition: boringssl_prefix_symbols.h:324
BSSL_NAMESPACE_BEGIN::ECHConfigParams::kem_id
uint16_t kem_id
Definition: ssl_test.cc:1632
SSL_pending
#define SSL_pending
Definition: boringssl_prefix_symbols.h:417
sk_X509_value
#define sk_X509_value
Definition: boringssl_prefix_symbols.h:590
SSL_VERIFY_FAIL_IF_NO_PEER_CERT
#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT
Definition: ssl.h:2384
SSL_add_client_CA
#define SSL_add_client_CA
Definition: boringssl_prefix_symbols.h:279
SHA256_DIGEST_LENGTH
#define SHA256_DIGEST_LENGTH
Definition: sha.h:155
SSL_CIPHER_get_id
#define SSL_CIPHER_get_id
Definition: boringssl_prefix_symbols.h:48
BSSL_NAMESPACE_BEGIN::RenewTicketCallback
static int RenewTicketCallback(SSL *ssl, uint8_t *key_name, uint8_t *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hmac_ctx, int encrypt)
Definition: ssl_test.cc:3302
ScopedEVP_HPKE_KEY
internal::StackAllocated< EVP_HPKE_KEY, void, EVP_HPKE_KEY_zero, EVP_HPKE_KEY_cleanup > ScopedEVP_HPKE_KEY
Definition: hpke.h:340
DTLSv1_method
#define DTLSv1_method
Definition: boringssl_prefix_symbols.h:34
SSL_get_key_block_len
#define SSL_get_key_block_len
Definition: boringssl_prefix_symbols.h:349
SSL_get_ex_data
#define SSL_get_ex_data
Definition: boringssl_prefix_symbols.h:341
BSSL_NAMESPACE_BEGIN::CreateTestSession
static bssl::UniquePtr< SSL_SESSION > CreateTestSession(uint32_t number)
Definition: ssl_test.cc:2400
BSSL_NAMESPACE_BEGIN::LevelToString
const char * LevelToString(ssl_encryption_level_t level)
Definition: ssl_test.cc:5805
BIO_meth_set_ctrl
#define BIO_meth_set_ctrl
Definition: boringssl_prefix_symbols.h:807
EVP_DecodedLength
#define EVP_DecodedLength
Definition: boringssl_prefix_symbols.h:1500
PushToStack
std::enable_if<!internal::StackTraits< Stack >::kIsConst, bool >::type PushToStack(Stack *sk, UniquePtr< typename internal::StackTraits< Stack >::Type > elem)
Definition: stack.h:515
ssl_method_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3392
SSL_set_rfd
#define SSL_set_rfd
Definition: boringssl_prefix_symbols.h:490
SSL_apply_handoff
bool SSL_apply_handoff(SSL *ssl, Span< const uint8_t > handoff)
Definition: handoff.cc:238
prefix
static const char prefix[]
Definition: head_of_line_blocking.cc:28
xds_manager.num
num
Definition: xds_manager.py:56
curve25519.h
BSSL_NAMESPACE_BEGIN::QUICMethodTest::server_
bssl::UniquePtr< SSL > server_
Definition: ssl_test.cc:6261
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1973
SSL_set_shed_handshake_config
#define SSL_set_shed_handshake_config
Definition: boringssl_prefix_symbols.h:493
ASSERT_FALSE
#define ASSERT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1976
OPENSSL_memmove
static void * OPENSSL_memmove(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:827
ok
bool ok
Definition: async_end2end_test.cc:197
ssl_ticket_aead_ignore_ticket
ssl_ticket_aead_ignore_ticket
Definition: ssl.h:2233
arg
struct arg arg
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
ERR_clear_error
#define ERR_clear_error
Definition: boringssl_prefix_symbols.h:1413
EVP_DecryptFinal_ex
#define EVP_DecryptFinal_ex
Definition: boringssl_prefix_symbols.h:1502
ssl_ticket_aead_retry
ssl_ticket_aead_retry
Definition: ssl.h:2230
TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:445
SSL_CTX_set1_ech_keys
#define SSL_CTX_set1_ech_keys
Definition: boringssl_prefix_symbols.h:144
BSSL_NAMESPACE_BEGIN::CipherTest::expected
std::vector< ExpectedCipher > expected
Definition: ssl_test.cc:100
SSL_generate_key_block
#define SSL_generate_key_block
Definition: boringssl_prefix_symbols.h:309
TLS1_CK_AES_128_GCM_SHA256
#define TLS1_CK_AES_128_GCM_SHA256
Definition: tls1.h:455
SSL_CTX_set_msg_callback_arg
#define SSL_CTX_set_msg_callback_arg
Definition: boringssl_prefix_symbols.h:178
BSSL_NAMESPACE_BEGIN::ExpectedCipher::in_group_flag
int in_group_flag
Definition: ssl_test.cc:93
SSL_get_cipher_by_value
#define SSL_get_cipher_by_value
Definition: boringssl_prefix_symbols.h:328
SSL_quic_max_handshake_flight_len
#define SSL_quic_max_handshake_flight_len
Definition: boringssl_prefix_symbols.h:421
SSL_CTX_use_certificate
#define SSL_CTX_use_certificate
Definition: boringssl_prefix_symbols.h:228
BSSL_NAMESPACE_BEGIN::SSLVersionTest::server_
bssl::UniquePtr< SSL > server_
Definition: ssl_test.cc:2534
SSL_R_BUFFER_TOO_SMALL
#define SSL_R_BUFFER_TOO_SMALL
Definition: ssl.h:5389
BSSL_NAMESPACE_BEGIN::CacheEquals
static bool CacheEquals(SSL_CTX *ctx, const std::vector< SSL_SESSION * > &expected)
Definition: ssl_test.cc:2369
tests.unit._signal_handling_test.client_name
client_name
Definition: _signal_handling_test.py:37
BSSL_NAMESPACE_BEGIN::XORCompressFunc
static int XORCompressFunc(SSL *ssl, CBB *out, const uint8_t *in, size_t in_len)
Definition: ssl_test.cc:5059
sk_X509_NAME_new_null
#define sk_X509_NAME_new_null
Definition: boringssl_prefix_symbols.h:580
SSL_use_certificate
#define SSL_use_certificate
Definition: boringssl_prefix_symbols.h:526
BSSL_NAMESPACE_BEGIN::MockQUICTransport::WriteHandshakeData
bool WriteHandshakeData(ssl_encryption_level_t level, Span< const uint8_t > data)
Definition: ssl_test.cc:5909
config_s
Definition: bloaty/third_party/zlib/deflate.c:120
BSSL_NAMESPACE_BEGIN::QUICMethodTest::SetWriteSecretCallback
static int SetWriteSecretCallback(SSL *ssl, ssl_encryption_level_t level, const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len)
Definition: ssl_test.cc:6231
BSSL_NAMESPACE_BEGIN::GetClientHelloLen
static size_t GetClientHelloLen(uint16_t max_version, uint16_t session_version, size_t ticket_len)
Definition: ssl_test.cc:1109
EXPECT_GE
#define EXPECT_GE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2034
BSSL_NAMESPACE_BEGIN::QUICMethodTest::client_
bssl::UniquePtr< SSL > client_
Definition: ssl_test.cc:6260
SSL_get_write_sequence
#define SSL_get_write_sequence
Definition: boringssl_prefix_symbols.h:396
BSSL_NAMESPACE_BEGIN::ExpectedCipher
Definition: ssl_test.cc:91
OPENSSL_NPN_NO_OVERLAP
#define OPENSSL_NPN_NO_OVERLAP
Definition: ssl.h:3014
input
std::string input
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc:197
SSL_TLSEXT_ERR_ALERT_FATAL
#define SSL_TLSEXT_ERR_ALERT_FATAL
Definition: ssl.h:2757
release
return ret release()
Definition: doc/python/sphinx/conf.py:37
SSL_CTX_set_session_id_context
#define SSL_CTX_set_session_id_context
Definition: boringssl_prefix_symbols.h:196
X509_NAME_dup
OPENSSL_EXPORT X509_NAME * X509_NAME_dup(X509_NAME *xn)
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
EVP_aead_chacha20_poly1305
#define EVP_aead_chacha20_poly1305
Definition: boringssl_prefix_symbols.h:1694
SSL_CTX_set_alpn_protos
#define SSL_CTX_set_alpn_protos
Definition: boringssl_prefix_symbols.h:151
SSL_CTX_set_ticket_aead_method
#define SSL_CTX_set_ticket_aead_method
Definition: boringssl_prefix_symbols.h:202
i2d_SSL_SESSION
#define i2d_SSL_SESSION
Definition: boringssl_prefix_symbols.h:552
SSL_SESSION_get0_ticket
#define SSL_SESSION_get0_ticket
Definition: boringssl_prefix_symbols.h:250
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_open
static ssl_ticket_aead_result_t ssl_test_ticket_aead_open(SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out_len, const uint8_t *in, size_t in_len)
Definition: ssl_test.cc:4521
BSSL_NAMESPACE_BEGIN::SSLVersionTest::Connect
bool Connect(const ClientConfig &config=ClientConfig())
Definition: ssl_test.cc:2521
SSL_new
#define SSL_new
Definition: boringssl_prefix_symbols.h:414
TLSv1_method
#define TLSv1_method
Definition: boringssl_prefix_symbols.h:548
SSL_ERROR_EARLY_DATA_REJECTED
#define SSL_ERROR_EARLY_DATA_REJECTED
Definition: ssl.h:570
SSL_CTX_use_PrivateKey
#define SSL_CTX_use_PrivateKey
Definition: boringssl_prefix_symbols.h:222
SSL_peek
#define SSL_peek
Definition: boringssl_prefix_symbols.h:416
SSL_ECH_KEYS_has_duplicate_config_id
#define SSL_ECH_KEYS_has_duplicate_config_id
Definition: boringssl_prefix_symbols.h:235
BSSL_NAMESPACE_BEGIN::SSLVersionTest::version
uint16_t version() const
Definition: ssl_test.cc:2527
TLS1_CK_AES_256_GCM_SHA384
#define TLS1_CK_AES_256_GCM_SHA384
Definition: tls1.h:456
plaintext
const char * plaintext
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/strutil_unittest.cc:85
SSL_set_renegotiate_mode
#define SSL_set_renegotiate_mode
Definition: boringssl_prefix_symbols.h:488
ssl_encryption_early_data
ssl_encryption_early_data
Definition: ssl.h:3283
BSSL_NAMESPACE_BEGIN::FlushNewSessionTickets
static bool FlushNewSessionTickets(SSL *client, SSL *server)
Definition: ssl_test.cc:1441
BSSL_NAMESPACE_BEGIN::ECHConfigParams::extensions
std::vector< uint8_t > extensions
Definition: ssl_test.cc:1640
BSSL_NAMESPACE_BEGIN::ExpectedCipher::id
unsigned long id
Definition: ssl_test.cc:92
ssl_early_callback_ctx::ssl
SSL * ssl
Definition: ssl.h:4187
SSL_CURVE_SECP384R1
#define SSL_CURVE_SECP384R1
Definition: ssl.h:2328
SSL_get_current_cipher
#define SSL_get_current_cipher
Definition: boringssl_prefix_symbols.h:333
BSSL_NAMESPACE_BEGIN::CurveTest::expected
std::vector< uint16_t > expected
Definition: ssl_test.cc:109
CRYPTO_once_t
uint32_t CRYPTO_once_t
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:470
SSL_get_wbio
#define SSL_get_wbio
Definition: boringssl_prefix_symbols.h:394
Span::data
T * data() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:132
TLSEXT_TYPE_encrypted_client_hello
#define TLSEXT_TYPE_encrypted_client_hello
Definition: tls1.h:251
SSL_ERROR_WANT_X509_LOOKUP
#define SSL_ERROR_WANT_X509_LOOKUP
Definition: ssl.h:507
CBB_len
#define CBB_len
Definition: boringssl_prefix_symbols.h:1049
SSL_set_connect_state
#define SSL_set_connect_state
Definition: boringssl_prefix_symbols.h:457
BSSL_NAMESPACE_BEGIN::GetChainTestKey
static bssl::UniquePtr< EVP_PKEY > GetChainTestKey()
Definition: ssl_test.cc:1377
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_state::retry_count
unsigned retry_count
Definition: ssl_test.cc:4465
EVP_HPKE_MAX_PUBLIC_KEY_LENGTH
#define EVP_HPKE_MAX_PUBLIC_KEY_LENGTH
Definition: hpke.h:132
SSL_get_peer_quic_transport_params
#define SSL_get_peer_quic_transport_params
Definition: boringssl_prefix_symbols.h:359
SSL_SESS_CACHE_BOTH
#define SSL_SESS_CACHE_BOTH
Definition: ssl.h:1943
TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:441
SSL_write
#define SSL_write
Definition: boringssl_prefix_symbols.h:533
client.level
level
Definition: examples/python/async_streaming/client.py:118
BSSL_NAMESPACE_BEGIN::QUICMethodTest::ExpectedError
ExpectedError
Definition: ssl_test.cc:6123
SSL_set_early_data_enabled
#define SSL_set_early_data_enabled
Definition: boringssl_prefix_symbols.h:459
BSSL_NAMESPACE_BEGIN::X509FromBuffer
static bssl::UniquePtr< X509 > X509FromBuffer(bssl::UniquePtr< CRYPTO_BUFFER > buffer)
Definition: ssl_test.cc:1337
SSL_CTX_get0_param
#define SSL_CTX_get0_param
Definition: boringssl_prefix_symbols.h:88
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
testing::ValuesIn
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:297
SSL_CTX_add_session
#define SSL_CTX_add_session
Definition: boringssl_prefix_symbols.h:73
BSSL_NAMESPACE_BEGIN::CipherTest::rule
const char * rule
Definition: ssl_test.cc:98
SSL_in_early_data
#define SSL_in_early_data
Definition: boringssl_prefix_symbols.h:399
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_open_soft_fail
@ ssl_test_ticket_aead_open_soft_fail
Definition: ssl_test.cc:4460
BIO_flush
#define BIO_flush
Definition: boringssl_prefix_symbols.h:786
SSL_get_signature_algorithm_digest
#define SSL_get_signature_algorithm_digest
Definition: boringssl_prefix_symbols.h:380
SealRecordPrefixLen
size_t SealRecordPrefixLen(const SSL *ssl, const size_t record_len)
Definition: tls_record.cc:644
SSL_CTX_get0_chain
#define SSL_CTX_get0_chain
Definition: boringssl_prefix_symbols.h:86
SSL_DEFAULT_SESSION_AUTH_TIMEOUT
#define SSL_DEFAULT_SESSION_AUTH_TIMEOUT
Definition: ssl.h:1994
BSSL_NAMESPACE_BEGIN::QUICMethodTest::ProvideHandshakeData
static bool ProvideHandshakeData(SSL *ssl, size_t num=std::numeric_limits< size_t >::max())
Definition: ssl_test.cc:6079
SSL_get_peer_full_cert_chain
#define SSL_get_peer_full_cert_chain
Definition: boringssl_prefix_symbols.h:358
SSL_CTX_set_min_proto_version
#define SSL_CTX_set_min_proto_version
Definition: boringssl_prefix_symbols.h:175
ASSERT_GT
#define ASSERT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2076
BSSL_NAMESPACE_BEGIN::SSLVersionTest::CreateContext
bssl::UniquePtr< SSL_CTX > CreateContext() const
Definition: ssl_test.cc:2495
sk_SSL_CIPHER_num
#define sk_SSL_CIPHER_num
Definition: boringssl_prefix_symbols.h:570
BSSL_NAMESPACE_BEGIN::CreateClientAndServer
static bool CreateClientAndServer(bssl::UniquePtr< SSL > *out_client, bssl::UniquePtr< SSL > *out_server, SSL_CTX *client_ctx, SSL_CTX *server_ctx)
Definition: ssl_test.cc:1475
SSL_get_servername
#define SSL_get_servername
Definition: boringssl_prefix_symbols.h:374
SSL_get_session
#define SSL_get_session
Definition: boringssl_prefix_symbols.h:376
SSL3_RT_HEADER
#define SSL3_RT_HEADER
Definition: ssl3.h:277
length
std::size_t length
Definition: abseil-cpp/absl/time/internal/test_util.cc:57
TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA
#define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA
Definition: tls1.h:299
BSSL_NAMESPACE_BEGIN::GetChainTestCertificate
static bssl::UniquePtr< X509 > GetChainTestCertificate()
Definition: ssl_test.cc:1347
SSL_CTX_get_max_proto_version
#define SSL_CTX_get_max_proto_version
Definition: boringssl_prefix_symbols.h:101
SSL_get_peer_certificate
#define SSL_get_peer_certificate
Definition: boringssl_prefix_symbols.h:356
DTLS1_VERSION
#define DTLS1_VERSION
Definition: ssl.h:655
method
NSString * method
Definition: ProtoMethod.h:28
SSL_CTX_set_tlsext_ticket_key_cb
#define SSL_CTX_set_tlsext_ticket_key_cb
Definition: boringssl_prefix_symbols.h:209
SSL_set_fd
#define SSL_set_fd
Definition: boringssl_prefix_symbols.h:463
EVP_aes_128_cbc
const OPENSSL_EXPORT EVP_CIPHER * EVP_aes_128_cbc(void)
ssl_ticket_aead_method_st
Definition: ssl.h:2241
crypto_ex_data_st
Definition: ex_data.h:194
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_state::failure_mode
ssl_test_ticket_aead_failure_mode failure_mode
Definition: ssl_test.cc:4466
BSSL_NAMESPACE_BEGIN::SessionIDOf
Span< const uint8_t > SessionIDOf(const SSL *ssl)
Definition: ssl_test.cc:7364
SSL_OP_NO_TICKET
#define SSL_OP_NO_TICKET
Definition: ssl.h:709
SSL_SESSION_get_time
#define SSL_SESSION_get_time
Definition: boringssl_prefix_symbols.h:257
ssl_encryption_handshake
ssl_encryption_handshake
Definition: ssl.h:3284
SSL_get_certificate
#define SSL_get_certificate
Definition: boringssl_prefix_symbols.h:327
BSSL_NAMESPACE_BEGIN::MockQUICTransport::alert_level
ssl_encryption_level_t alert_level() const
Definition: ssl_test.cc:5832
ssl_ech_keys_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3940
OPENSSL_free
#define OPENSSL_free
Definition: boringssl_prefix_symbols.h:1869
BSSL_NAMESPACE_BEGIN::MockQUICTransportPair::server
MockQUICTransport * server()
Definition: ssl_test.cc:6030
SSL_set_strict_cipher_list
#define SSL_set_strict_cipher_list
Definition: boringssl_prefix_symbols.h:499
X509_NAME_new
#define X509_NAME_new
Definition: boringssl_prefix_symbols.h:2391
ssl_select_cert_success
ssl_select_cert_success
Definition: ssl.h:4208
SSL_CTX_set_alpn_select_cb
#define SSL_CTX_set_alpn_select_cb
Definition: boringssl_prefix_symbols.h:152
SSL_CTX_set_select_certificate_cb
#define SSL_CTX_set_select_certificate_cb
Definition: boringssl_prefix_symbols.h:194
X509_cmp
#define X509_cmp
Definition: boringssl_prefix_symbols.h:2623
SSL_serialize_handback
bool SSL_serialize_handback(const SSL *ssl, CBB *out)
Definition: handoff.cc:279
absl::MakeSpan
constexpr Span< T > MakeSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:661
TLSEXT_NAMETYPE_host_name
#define TLSEXT_NAMETYPE_host_name
Definition: ssl.h:2721
OPENSSL_FALLTHROUGH
#define OPENSSL_FALLTHROUGH
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:201
NID_chacha20_poly1305
#define NID_chacha20_poly1305
Definition: nid.h:4204
ssl_ticket_aead_error
ssl_ticket_aead_error
Definition: ssl.h:2236
SSL_SESSION_get_protocol_version
#define SSL_SESSION_get_protocol_version
Definition: boringssl_prefix_symbols.h:255
SSL_SESSION_get0_peer_sha256
#define SSL_SESSION_get0_peer_sha256
Definition: boringssl_prefix_symbols.h:248
sk_CRYPTO_BUFFER_num
#define sk_CRYPTO_BUFFER_num
Definition: boringssl_prefix_symbols.h:558
X509_name_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:95
SSL_serialize_handoff
bool SSL_serialize_handoff(const SSL *ssl, CBB *out, SSL_CLIENT_HELLO *out_hello)
Definition: handoff.cc:76
SSL_get0_ocsp_response
#define SSL_get0_ocsp_response
Definition: boringssl_prefix_symbols.h:316
SSL_set_cert_cb
#define SSL_set_cert_cb
Definition: boringssl_prefix_symbols.h:453
x509_store_ctx_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:312
SSL_get_read_sequence
#define SSL_get_read_sequence
Definition: boringssl_prefix_symbols.h:368
SSL3_RT_HEADER_LENGTH
#define SSL3_RT_HEADER_LENGTH
Definition: ssl3.h:206
thread
static uv_thread_t thread
Definition: test-async-null-cb.c:29
SSL_ERROR_WANT_CERTIFICATE_VERIFY
#define SSL_ERROR_WANT_CERTIFICATE_VERIFY
Definition: ssl.h:577
SSL_CTX_set_app_data
#define SSL_CTX_set_app_data(ctx, arg)
Definition: ssl.h:4723
if
if(p->owned &&p->wrapped !=NULL)
Definition: call.c:42
TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:440
BSSL_NAMESPACE_BEGIN::MockQUICTransport::PeerSecretsMatch
bool PeerSecretsMatch(ssl_encryption_level_t level) const
Definition: ssl_test.cc:5835
timeout
uv_timer_t timeout
Definition: libuv/docs/code/uvwget/main.c:9
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
SSL_CTX_get_cert_store
#define SSL_CTX_get_cert_store
Definition: boringssl_prefix_symbols.h:90
hmac.h
BSSL_NAMESPACE_BEGIN::ssl_test_ticket_aead_ok
@ ssl_test_ticket_aead_ok
Definition: ssl_test.cc:4458
SSL_R_NO_RENEGOTIATION
#define SSL_R_NO_RENEGOTIATION
Definition: ssl.h:5449
SSL_read
#define SSL_read
Definition: boringssl_prefix_symbols.h:424
SSL_CTX_set_tlsext_ticket_keys
#define SSL_CTX_set_tlsext_ticket_keys
Definition: boringssl_prefix_symbols.h:210
SSL_apply_handback
bool SSL_apply_handback(SSL *ssl, Span< const uint8_t > handback)
Definition: handoff.cc:442
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
BSSL_NAMESPACE_BEGIN::MoveBIOs
void MoveBIOs(SSL *dest, SSL *src)
Definition: ssl_test.cc:5116
BSSL_NAMESPACE_BEGIN::QUICMethodTest::ExpectHandshakeSuccess
void ExpectHandshakeSuccess()
Definition: ssl_test.cc:6201
SSL_CTX_get_ciphers
#define SSL_CTX_get_ciphers
Definition: boringssl_prefix_symbols.h:91
CRYPTO_BUFFER_data
#define CRYPTO_BUFFER_data
Definition: boringssl_prefix_symbols.h:1115
BSSL_NAMESPACE_BEGIN::EpochFromSequence
static uint16_t EpochFromSequence(uint64_t seq)
Definition: ssl_test.cc:2473
BSSL_NAMESPACE_BEGIN::CipherTest
Definition: ssl_test.cc:96
id
uint32_t id
Definition: flow_control_fuzzer.cc:70
SSL_CTX_set_chain_and_key
#define SSL_CTX_set_chain_and_key
Definition: boringssl_prefix_symbols.h:156
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056
BSSL_NAMESPACE_BEGIN::MockQUICTransport::Level::read_secret
std::vector< uint8_t > read_secret
Definition: ssl_test.cc:6009
BSSL_NAMESPACE_BEGIN::SigAlgsToString
static std::string SigAlgsToString(Span< const uint16_t > sigalgs)
Definition: ssl_test.cc:5280
BIO_should_read
#define BIO_should_read
Definition: boringssl_prefix_symbols.h:860
run_interop_tests.server_name
server_name
Definition: run_interop_tests.py:1510
d2i_SSL_SESSION
OPENSSL_EXPORT SSL_SESSION * d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, long length)
BSSL_NAMESPACE_BEGIN::CurveTest::rule
const char * rule
Definition: ssl_test.cc:107
SSL_SIGN_ECDSA_SECP384R1_SHA384
#define SSL_SIGN_ECDSA_SECP384R1_SHA384
Definition: ssl.h:1071
x509.h
BIO_mem_contents
#define BIO_mem_contents
Definition: boringssl_prefix_symbols.h:803
SSL_set1_curves
#define SSL_set1_curves
Definition: boringssl_prefix_symbols.h:440
BIO_set_init
#define BIO_set_init
Definition: boringssl_prefix_symbols.h:849
absl::MakeConstSpan
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:707
SSL_SIGN_ECDSA_SECP256R1_SHA256
#define SSL_SIGN_ECDSA_SECP256R1_SHA256
Definition: ssl.h:1070
cbb_st
Definition: bytestring.h:375
SSL_ERROR_PENDING_TICKET
#define SSL_ERROR_PENDING_TICKET
Definition: ssl.h:564
ssl_renegotiate_freely
ssl_renegotiate_freely
Definition: ssl.h:4092
SSL_ERROR_HANDOFF
#define SSL_ERROR_HANDOFF
Definition: ssl.h:579


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:21