25 #include <gtest/gtest.h>
44 #include "../crypto/internal.h"
45 #include "../crypto/test/test_util.h"
47 #if defined(OPENSSL_WINDOWS)
56 #if defined(OPENSSL_THREADS)
65 #define TRACED_CALL(code) \
67 SCOPED_TRACE("<- called from here"); \
69 if (::testing::Test::HasFatalFailure()) { \
112 template <
typename T>
120 return index_ < 0 ? nullptr
135 "ECDHE-ECDSA-CHACHA20-POLY1305:"
136 "ECDHE-RSA-CHACHA20-POLY1305:"
137 "ECDHE-ECDSA-AES128-GCM-SHA256:"
138 "ECDHE-RSA-AES128-GCM-SHA256",
149 "ECDHE-ECDSA-CHACHA20-POLY1305:"
150 "ECDHE-RSA-CHACHA20-POLY1305:"
151 "ECDHE-ECDSA-AES128-GCM-SHA256:"
152 "ECDHE-RSA-AES128-GCM-SHA256:"
165 "ECDHE-ECDSA-CHACHA20-POLY1305:"
166 "ECDHE-RSA-CHACHA20-POLY1305:"
167 "ECDHE-ECDSA-AES128-GCM-SHA256:"
168 "ECDHE-RSA-AES128-GCM-SHA256",
177 "kRSA+AESGCM+AES128",
189 "AESGCM+AES128+aRSA",
198 "ECDHE-ECDSA-CHACHA20-POLY1305:"
199 "ECDHE-RSA-CHACHA20-POLY1305:"
200 "ECDHE-ECDSA-AES128-GCM-SHA256:"
201 "ECDHE-RSA-AES128-GCM-SHA256:"
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",
228 "[ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-ECDSA-AES128-GCM-SHA256]:"
229 "[ECDHE-RSA-CHACHA20-POLY1305]:"
230 "ECDHE-RSA-AES128-GCM-SHA256",
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",
260 "ALL:-CHACHA20:-AES256:-AES128:-ALL:"
263 "kECDHE:@STRENGTH:-ALL:"
281 "ECDHE-RSA-AES128-GCM-SHA256:"
282 "ECDHE-RSA-AES256-GCM-SHA384:"
291 "ECDHE-RSA-AES128-GCM-SHA256:"
292 "ECDHE-RSA-AES256-GCM-SHA384:"
294 "ECDHE-RSA-CHACHA20-POLY1305",
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",
317 "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!SSLv3",
325 "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!TLSv1.2",
334 "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!TLSv1.2+SSLv3",
343 "AES128-SHA: ECDHE-RSA-AES128-GCM-SHA256 AES256-SHA ,ECDHE-ECDSA-AES128-GCM-SHA256 ; AES128-GCM-SHA256",
358 "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256",
369 "COMPLEMENTOFDEFAULT",
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",
380 "[AES128-SHA | AES128-SHA256]",
407 "P-256:P-384:P-521:X25519",
416 "prime256v1:secp384r1:secp521r1:x25519",
438 bool in_group =
false;
462 const std::vector<ExpectedCipher> &expected) {
468 for (
size_t i = 0;
i < expected.size();
i++) {
479 TEST(GrowableArrayTest, Resize) {
489 for (
size_t i = 0;
i < 16;
i++) {
496 for (
size_t i = 0;
i <
array.size();
i++) {
501 TEST(GrowableArrayTest, MoveConstructor) {
503 for (
size_t i = 0;
i < 100;
i++) {
508 for (
size_t i = 0;
i < 100;
i++) {
513 TEST(GrowableArrayTest, GrowableArrayContainingGrowableArrays) {
521 for (
size_t i = 0;
i < 100;
i++) {
524 for (
size_t j = 0; j <
i; j++) {
534 for (
const TagAndArray &
elem : array_moved) {
540 for (
size_t j = 0; j <
count; j++) {
556 <<
"Cipher rule evaluated to:\n"
565 <<
"Cipher rule evaluated to:\n"
598 ASSERT_EQ(t.expected.size(),
ctx->supported_group_list.size());
599 for (
size_t i = 0;
i < t.expected.size();
i++) {
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=";
652 "MIIBZAIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
653 "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
654 "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUqAcEBXdvcmxkqQUCAwGJwKqBpwSB"
655 "pBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38"
656 "VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd"
657 "3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hg"
658 "b+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYGBgYGBgYGBgYGBgYGBgYGBgYG"
659 "BgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
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==";
762 "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
763 "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
764 "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
765 "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
766 "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
767 "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
768 "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
769 "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBOMDBAEF";
774 "MIIBdgIBAgICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
775 "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
776 "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
777 "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
778 "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
779 "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
780 "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
781 "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
786 "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
787 "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
788 "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
789 "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
790 "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
791 "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
792 "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
793 "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEFAAAA";
798 fprintf(
stderr,
"EVP_DecodedLength failed\n");
805 fprintf(
stderr,
"EVP_DecodeBase64 failed\n");
812 TEST(SSLTest, SessionEncoding) {
813 for (
const char *input_b64 : {
820 std::vector<uint8_t>
input;
826 bssl::UniquePtr<SSL_SESSION> session(
828 ASSERT_TRUE(session) <<
"SSL_SESSION_from_bytes failed";
832 bssl::UniquePtr<uint8_t> encoded;
835 <<
"SSL_SESSION_to_bytes failed";
836 encoded.reset(encoded_raw);
838 <<
"SSL_SESSION_to_bytes did not round-trip";
850 <<
"i2d_SSL_SESSION(NULL) returned invalid length";
859 <<
"i2d_SSL_SESSION(NULL) returned invalid length";
861 <<
"i2d_SSL_SESSION did not advance ptr correctly";
863 <<
"SSL_SESSION_to_bytes did not round-trip";
866 for (
const char *input_b64 : {
872 std::vector<uint8_t>
input;
878 bssl::UniquePtr<SSL_SESSION> session(
880 EXPECT_FALSE(session) <<
"SSL_SESSION_from_bytes unexpectedly succeeded";
893 TEST(SSLTest, DefaultVersion) {
903 TEST(SSLTest, CipherProperties) {
904 static const struct {
906 const char *standard_name;
915 "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
924 "TLS_RSA_WITH_AES_128_CBC_SHA",
933 "TLS_PSK_WITH_AES_256_CBC_SHA",
942 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
951 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
960 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
969 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
978 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
987 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
996 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
1005 "TLS_AES_256_GCM_SHA384",
1014 "TLS_AES_128_GCM_SHA256",
1023 "TLS_CHACHA20_POLY1305_SHA256",
1032 for (
const auto &t :
kTests) {
1054 size_t ticket_len) {
1055 std::vector<uint8_t> der;
1065 std::vector<uint8_t> ticket(ticket_len,
'a');
1066 bssl::UniquePtr<SSL_SESSION> session(
1074 #if defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
1098 size_t client_hello_len;
1102 *
out = std::vector<uint8_t>(client_hello, client_hello + client_hello_len);
1110 size_t ticket_len) {
1112 bssl::UniquePtr<SSL_SESSION> session =
1114 if (!
ctx || !session) {
1119 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
1126 std::vector<uint8_t> client_hello;
1136 struct PaddingVersions {
1137 uint16_t max_version, session_version;
1139 static const PaddingVersions kPaddingVersions[] = {
1151 struct PaddingTest {
1152 size_t input_len, padded_len;
1154 static const PaddingTest kPaddingTests[] = {
1176 for (
const PaddingVersions &versions : kPaddingVersions) {
1183 ASSERT_NE(base_len, 0
u) <<
"Baseline length could not be sampled";
1185 for (
const PaddingTest &
test : kPaddingTests) {
1187 ASSERT_LE(base_len,
test.input_len) <<
"Baseline ClientHello too long";
1191 1 +
test.input_len - base_len);
1193 <<
"ClientHello was not padded to expected length";
1203 return bssl::UniquePtr<X509>(
1212 return bssl::UniquePtr<EVP_PKEY>(
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";
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";
1261 if (!
ctx || !cert || !
key ||
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";
1287 static const char kKeyPEM[] =
1288 "-----BEGIN PRIVATE KEY-----\n"
1289 "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBw8IcnrUoEqc3VnJ\n"
1290 "TYlodwi1b8ldMHcO6NHJzgqLtGqhRANCAATmK2niv2Wfl74vHg2UikzVl2u3qR4N\n"
1291 "Rvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYaHPUdfvGULUvPciLB\n"
1292 "-----END PRIVATE KEY-----\n";
1308 auto ret = bssl::UniquePtr<CRYPTO_BUFFER>(
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"
1333 "-----END CERTIFICATE-----\n";
1338 bssl::UniquePtr<CRYPTO_BUFFER>
buffer) {
1343 return bssl::UniquePtr<X509>(
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";
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";
1433 if (client_ret == 1 && server_ret == 1) {
1449 if (server_ret > 0 ||
1451 fprintf(
stderr,
"Unexpected server result: %d %d\n", server_ret,
1460 fprintf(
stderr,
"Unexpected client result: %d %d\n", client_ret,
1466 if (server_ret == 0) {
1476 bssl::UniquePtr<SSL> *out_server,
1501 bool early_data =
false;
1505 bssl::UniquePtr<SSL> *out_server,
1508 bool shed_handshake_config =
true) {
1519 if (!
config.servername.empty() &&
1555 fprintf(
stderr,
"Failed to connect client and server.\n");
1562 fprintf(
stderr,
"Client did not receive a session.\n");
1573 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
1598 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
1635 size_t max_name_len = 16;
1661 bssl::ScopedCBB cbb;
1697 size_t ech_config_len;
1700 key.get(),
"public.example", 16)) {
1703 bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1708 ech_config_len,
key.get())) {
1716 size_t ech_config_list_len;
1718 &ech_config_list_len)) {
1721 bssl::UniquePtr<uint8_t> free_ech_config_list(ech_config_list);
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)));
1736 static const uint8_t kECHConfig[] = {
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,
1750 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03,
1754 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x61, 0x6d,
1759 size_t ech_config_len;
1762 "public.example", 16));
1763 bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1770 size_t ech_config2_len;
1773 "public.example", 16));
1774 bssl::UniquePtr<uint8_t> free_ech_config2(ech_config2);
1780 ech_config_len,
key.get()));
1782 ech_config2_len,
key2.get()));
1786 size_t ech_config_list_len;
1788 &ech_config_list_len));
1789 bssl::UniquePtr<uint8_t> free_ech_config_list(ech_config_list);
1792 size_t len = ech_config_len + ech_config2_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);
1799 TEST(SSLTest, ECHHasDuplicateConfigID) {
1801 std::vector<uint8_t> ids;
1806 {{1, 2, 3, 255},
false},
1807 {{1, 2, 3, 1},
true},
1817 size_t ech_config_len;
1819 key.get(),
"public.example", 16));
1820 bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1822 ech_config, ech_config_len,
key.get()));
1838 size_t public_key_len;
1845 std::vector<uint8_t> ech_config;
1848 ech_config.data(), ech_config.size(),
1856 ech_config.data(), ech_config.size(),
1861 truncated.
key =
key.get();
1865 ech_config.data(), ech_config.size(),
key.get()));
1870 wrong_kem.
key =
key.get();
1871 wrong_kem.
kem_id = 0x0010;
1874 ech_config.data(), ech_config.size(),
1880 TEST(SSLTest, ECHServerConfigsWithoutRetryConfigs) {
1884 size_t ech_config_len;
1887 "public.example", 16));
1888 bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
1894 ech_config_len,
key.get()));
1904 ech_config_len,
key.get()));
1909 TEST(SSLTest, UnsupportedECHConfig) {
1917 unsupported_version.
version = 0xffff;
1918 unsupported_version.
key =
key.get();
1919 std::vector<uint8_t> ech_config;
1922 ech_config.data(), ech_config.size(),
1927 unsupported_kdf.
key =
key.get();
1932 ech_config.data(), ech_config.size(),
1935 unsupported_aead.
key =
key.get();
1939 ech_config.data(), ech_config.size(),
1946 extensions.extensions = {0x00, 0x01, 0x00, 0x00};
1949 ech_config.data(), ech_config.size(),
1954 invalid_public_name.
key =
key.get();
1955 invalid_public_name.
public_name =
"dns_names_have_no_underscores.example";
1958 ech_config.data(), ech_config.size(),
1965 TEST(SSLTest, ECHClientRandomsMatch) {
1990 sizeof(client_random1)));
1993 sizeof(client_random2)));
2002 size_t *out_ech_len,
size_t max_name_len,
2006 size_t ech_config_len;
2009 1,
key.get(),
"public.example",
2013 bssl::UniquePtr<uint8_t> free_ech_config(ech_config);
2017 ech_config_len,
key.get())) {
2028 std::vector<uint8_t> client_hello;
2042 *out_client_hello_len = client_hello.size();
2051 size_t client_hello_len_baseline, ech_len_baseline;
2053 &ech_len_baseline, 128,
"example.com"));
2056 for (
size_t name_len : {1, 2, 32, 64, 127, 128}) {
2058 size_t client_hello_len, ech_len;
2061 EXPECT_EQ(client_hello_len, client_hello_len_baseline);
2066 size_t client_hello_len, ech_len;
2069 EXPECT_EQ(client_hello_len, client_hello_len_baseline);
2074 size_t client_hello_len_baseline2, ech_len_baseline2;
2076 &ech_len_baseline2, 128,
2078 EXPECT_EQ(ech_len_baseline2, ech_len_baseline + 32);
2081 EXPECT_GE(client_hello_len_baseline2, client_hello_len_baseline);
2083 for (
size_t name_len = 128 + 1; name_len < 128 + 32; name_len++) {
2087 EXPECT_TRUE(ech_len == ech_len_baseline || ech_len == ech_len_baseline2)
2089 EXPECT_TRUE(client_hello_len == client_hello_len_baseline ||
2090 client_hello_len == client_hello_len_baseline2)
2091 << client_hello_len;
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};
2118 "abcdefhijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789")));
2120 "abcdefhijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ-01234567899")));
2130 str_to_span(
"example.123456789000000000000000")));
2132 str_to_span(
"example.012345678900000000000000")));
2134 str_to_span(
"example.0x123456789abcdefABCDEF0")));
2136 str_to_span(
"example.0x0123456789abcdefABCDEF")));
2140 str_to_span(
"example.1234567890a")));
2142 str_to_span(
"example.01234567890a")));
2144 str_to_span(
"example.0x123456789abcdefg")));
2159 TEST(SSLTest, ECHBuiltinVerifier) {
2195 -----BEGIN CERTIFICATE-----
2196 MIIBRzCB7aADAgECAgEBMAoGCCqGSM49BAMCMBIxEDAOBgNVBAMTB1Rlc3QgQ0Ew
2197 IBcNMDAwMTAxMDAwMDAwWhgPMjA5OTAxMDEwMDAwMDBaMBIxEDAOBgNVBAMTB1Rl
2198 c3QgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT5JUjrI1DAxSpEl88UkmJw
2199 tAJqxo/YrSFo9V3MkcNkfTixi5p6MUtO8DazhEgekBcd2+tBAWtl7dy0qpvTqx92
2200 ozIwMDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTw6ftkexAI6o4r5FntJIfL
2201 GU5F4zAKBggqhkjOPQQDAgNJADBGAiEAiiNowddQeHZaZFIygwe6RW5/WG4sUXWC
2202 dkyl9CQzRaYCIQCFS1EvwZbZtMny27fYm1eeYciY0TkJTEi34H1KwyzzIA==
2203 -----END CERTIFICATE-----
2206 bssl::UniquePtr<EVP_PKEY> leaf_key = KeyFromPEM(R"(
2207 -----BEGIN PRIVATE KEY-----
2208 MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgj5WKHwHnziiyPauf
2209 7QukxTwtTyGZkk8qNdms4puJfxqhRANCAARNrkhxabALDlJrHtvkuDwvCWUF/oVC
2210 hr6PDITHi1lDlJzvVT4aXBH87sH2n2UV5zpx13NHkq1bIC8eRT8eOIe0
2211 -----END PRIVATE 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-----
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-----
2261 static const char kSecretName[] =
"secret.example";
2263 kSecretName, strlen(kSecretName)));
2268 for (
bool accept_ech : {
false,
true}) {
2270 for (
bool use_leaf_secret : {
false,
true}) {
2285 : leaf_public.get()));
2298 #if defined(OPENSSL_THREADS)
2301 TEST(SSLTest, ECHThreads) {
2306 size_t ech_config1_len;
2309 "public.example", 16));
2310 bssl::UniquePtr<uint8_t> free_ech_config1(ech_config1);
2314 size_t ech_config2_len;
2317 "public.example", 16));
2318 bssl::UniquePtr<uint8_t> free_ech_config2(ech_config2);
2324 ech_config1_len,
key1.get()));
2328 ech_config2_len,
key2.get()));
2330 ech_config1_len,
key1.get()));
2346 std::vector<std::thread>
threads;
2359 #endif // OPENSSL_THREADS
2362 std::vector<SSL_SESSION*> *
out =
2363 reinterpret_cast<std::vector<SSL_SESSION*>*
>(
arg);
2364 out->push_back(session);
2370 const std::vector<SSL_SESSION*> &expected) {
2374 if (
ptr != session) {
2385 if (
ptr !=
nullptr) {
2390 std::vector<SSL_SESSION*> actual, expected_copy;
2392 expected_copy = expected;
2394 std::sort(actual.begin(), actual.end());
2395 std::sort(expected_copy.begin(), expected_copy.end());
2397 return actual == expected_copy;
2419 TEST(SSLTest, InternalSessionCache) {
2424 std::vector<bssl::UniquePtr<SSL_SESSION>> sessions;
2425 for (
int i = 0;
i < 10;
i++) {
2434 for (
const auto &session : sessions) {
2440 ctx.get(), {sessions[9].get(), sessions[8].get(), sessions[7].get(),
2441 sessions[6].get(), sessions[5].get()}));
2447 ctx.get(), {sessions[9].get(), sessions[8].get(), sessions[7].get(),
2448 sessions[6].get(), sessions[5].get()}));
2456 ctx.get(), {collision.get(), sessions[9].get(), sessions[8].get(),
2457 sessions[6].get(), sessions[5].get()}));
2462 sessions[8].get(), sessions[5].get()}));
2470 sessions[8].get(), sessions[5].get()}));
2474 return static_cast<uint16_t>(seq >> 48);
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,
2508 client_ctx_ = CreateContext();
2510 server_ctx_ = CreateContext();
2523 server_ctx_.get(),
config,
2524 shed_handshake_config_);
2530 return GetParam().ssl_method == VersionParam::is_dtls;
2533 bool shed_handshake_config_ =
true;
2543 return i.param.name;
2566 EXPECT_GT(client_write_seq, server_read_seq);
2567 EXPECT_GT(server_write_seq, client_read_seq);
2570 EXPECT_EQ(client_write_seq, server_read_seq);
2571 EXPECT_EQ(server_write_seq, client_read_seq);
2661 BIO *other_wbio =
test_server ? client_wbio.get() : server_wbio.get();
2668 static const uint8_t kInvalidRecord[] =
"invalid record";
2670 BIO_write(other_wbio, kInvalidRecord,
sizeof(kInvalidRecord)));
2695 bssl::UniquePtr<SSL> ssl(
2712 for (
int i = 0;
i < 8;
i++) {
2721 invalid = {
'i',
'n',
'v',
'a',
'l',
'i',
'd'};
2723 bssl::UniquePtr<BIO> rbio(
2759 TEST(SSLTest, WriteAfterWrongVersionOnEarlyData) {
2772 bssl::UniquePtr<SSL_SESSION> session =
2824 TEST(SSLTest, SessionDuplication) {
2836 bssl::UniquePtr<SSL_SESSION> session1 =
2840 session1->not_resumable =
false;
2843 size_t s0_len, s1_len;
2846 bssl::UniquePtr<uint8_t> free_s0(s0_bytes);
2849 bssl::UniquePtr<uint8_t> free_s1(s1_bytes);
2871 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
2933 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
3036 int cert_der_len =
i2d_X509(cert_.get(), &cert_der);
3038 bssl::UniquePtr<uint8_t> free_cert_der(cert_der);
3041 SHA256(cert_der, cert_der_len, cert_sha256);
3067 size_t peer_sha256_len;
3078 std::vector<uint8_t> expected;
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}},
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}},
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,
3115 for (
const auto &t :
kTests) {
3122 const char *cipher_list =
"CHACHA20:ALL";
3126 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
3128 std::vector<uint8_t> client_hello;
3132 constexpr
size_t kRandomOffset = 1 + 2 + 2 +
3138 if (client_hello != t.expected) {
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++) {
3147 printf(
"0x%02x", client_hello[j]);
3148 if (j < client_hello.size() - 1) {
3152 if (
i + 12 >= client_hello.size()) {
3165 config.session = session;
3183 config.session = session;
3187 fprintf(
stderr,
"Failed to connect client and server.\n");
3192 fprintf(
stderr,
"Client and server were inconsistent.\n");
3197 fprintf(
stderr,
"Session was not reused.\n");
3204 fprintf(
stderr,
"Client did not receive a renewed session.\n");
3224 static const uint8_t kContext[] = {3};
3234 static const uint8_t kContext1[] = {1};
3235 static const uint8_t kContext2[] = {2};
3238 sizeof(kContext1)));
3243 bssl::UniquePtr<SSL_SESSION> session =
3253 sizeof(kContext2)));
3262 sizeof(kContext1)));
3276 static const uint8_t kContext[] = {3};
3279 sizeof(kContext))) {
3280 return ssl_select_cert_error;
3298 out_clock->
tv_sec = 1000;
3305 static const uint8_t kZeros[16] = {0};
3321 return encrypt ? 1 : 2;
3336 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
3340 static const uint8_t kZeros[16] = {0};
3341 const uint8_t *iv = ticket + 16;
3342 bssl::ScopedEVP_CIPHER_CTX
ctx;
3350 len =
static_cast<size_t>(len1 + len2);
3357 bssl::UniquePtr<SSL_SESSION> server_session(
3359 if (!server_session) {
3368 for (
bool server_test : {
false,
true}) {
3375 static const time_t kStartTime = 1000;
3397 bssl::UniquePtr<SSL_SESSION> session =
3423 time_t new_start_time = kStartTime +
timeout - 10;
3426 client_ctx_.get(), server_ctx_.get(), session.get());
3430 EXPECT_NE(session.get(), new_session.get());
3433 long session_time = 0;
3458 while (new_start_time < auth_end_time - 1000) {
3504 static const time_t kStartTime = 1001;
3527 bssl::UniquePtr<SSL_SESSION> session =
3531 session.get(),
true ));
3536 session.get(),
true ));
3542 bssl::UniquePtr<SSL_SESSION> new_session =
3549 session.get(),
true ));
3551 new_session.get(),
true ));
3558 session.get(),
false ));
3564 new_session.get(),
true ));
3582 static const uint8_t kSCTList[] = {0, 6, 0, 4, 5, 6, 7, 8};
3583 static const uint8_t kOCSPResponse[] = {1, 2, 3, 4};
3585 bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
3590 server_ctx2.get(), kSCTList,
sizeof(kSCTList)));
3592 sizeof(kOCSPResponse)));
3598 &kECDSAWithSHA256, 1));
3625 TEST(SSLTest, EarlyCallbackVersionSwitch) {
3637 if (!SSL_set_max_proto_version(client_hello->ssl, TLS1_2_VERSION)) {
3638 return ssl_select_cert_error;
3657 if (vers.ssl_method == VersionParam::is_tls) {
3688 if (vers.ssl_method == VersionParam::is_dtls) {
3757 static const uint8_t kALPNProtos[] = {0x03,
'f',
'o',
'o'};
3759 sizeof(kALPNProtos)),
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;
3790 shed_handshake_config_ =
false;
3809 shed_handshake_config_ =
false;
3818 shed_handshake_config_ =
true;
3828 const std::vector<X509 *> &expected) {
3833 for (
size_t i = 0;
i < expected.size();
i++) {
3856 intermediate.get()));
3858 intermediate.get()));
3882 {cert_.get(), intermediate.get()}));
3884 {cert_.get(), intermediate.get()}));
3892 {cert_.get(), cert_.get()}));
3895 {cert_.get(), cert_.get()}));
3904 fprintf(
stderr,
"Wanted SSL_R_BAD_WRITE_RETRY, got: %s.\n",
buf);
3909 fprintf(
stderr,
"Unexpected error following SSL_R_BAD_WRITE_RETRY.\n");
3921 for (
bool enable_partial_write : {
false,
true}) {
3929 if (enable_partial_write) {
3936 char data[] =
"hello!";
3937 static const int kChunkLen = 5;
3963 char data2[] =
"hello";
3988 for (
unsigned i = 0;
i <
count;
i++) {
3997 char data3[] =
"_____!";
3998 if (enable_partial_write) {
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,
4053 using CallbackType = decltype(
cb);
4056 ctx, [](
int is_write,
int cb_version,
int cb_type,
const void *
buf,
4058 CallbackType *cb_ptr =
reinterpret_cast<CallbackType *
>(
arg);
4059 (*cb_ptr)(is_write, cb_version, cb_type,
buf,
len, ssl);
4072 config.servername =
"host1";
4075 server_ctx_.get(), [](
SSL *ssl,
int *out_alert,
void *
arg) ->
int {
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;
4092 bssl::UniquePtr<SSL_SESSION> session =
4098 config.session = session.get();
4099 config.servername =
"host2";
4129 for (
bool use_zero_write : {
false,
true}) {
4157 if (use_zero_write) {
4164 static const char kMessage[] =
"hello world";
4165 char buf[
sizeof(kMessage)];
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)));
4214 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
4227 long der_len =
i2d_X509(cert.get(), &der);
4229 bssl::UniquePtr<uint8_t> free_der(der);
4232 long der2_len =
i2d_X509(cert2, &der2);
4234 bssl::UniquePtr<uint8_t> free_der2(der2);
4237 long der3_len =
i2d_X509(cert3, &der3);
4239 bssl::UniquePtr<uint8_t> free_der3(der3);
4246 TEST(SSLTest, SetChainAndKeyMismatch) {
4254 std::vector<CRYPTO_BUFFER*> chain = {
4260 key.get(),
nullptr));
4276 bssl::UniquePtr<CRYPTO_BUFFER> intermediate =
4279 std::vector<CRYPTO_BUFFER*> chain = {
4280 leaf.get(), intermediate.get(),
4283 chain.size(),
key.get(),
nullptr));
4290 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4291 return ssl_verify_ok;
4299 TEST(SSLTest, BuffersFailWithoutCustomVerify) {
4309 std::vector<CRYPTO_BUFFER*> chain = { leaf.get() };
4311 chain.size(),
key.get(),
nullptr));
4322 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4323 return ssl_verify_ok;
4339 std::vector<CRYPTO_BUFFER*> chain = { leaf.get() };
4341 chain.size(),
key.get(),
nullptr));
4345 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4346 return ssl_verify_ok;
4357 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4358 return ssl_verify_invalid;
4368 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4369 return ssl_verify_invalid;
4386 bssl::UniquePtr<CRYPTO_BUFFER> intermediate =
4389 std::vector<CRYPTO_BUFFER *> chain = {
4394 chain.size(),
key.get(),
nullptr));
4396 bssl::UniquePtr<CRYPTO_BUFFER> ca_name(
4408 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4409 return ssl_verify_ok;
4413 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
4414 return ssl_verify_ok;
4417 bool cert_cb_called =
false;
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;
4471 void **from_d,
int index,
4472 long argl,
void *
argp) {
4478 long argl,
void *
argp) {
4480 if (
state ==
nullptr) {
4510 max_out_len < in_len + 1) {
4516 *out_len = in_len + 1;
4522 SSL *ssl,
uint8_t *
out,
size_t *out_len,
size_t max_out_len,
4527 if (
state->retry_count > 0) {
4528 state->retry_count--;
4532 switch (
state->failure_mode) {
4546 if (in_len == 0 ||
in[in_len - 1] != 0xff) {
4550 if (max_out_len < in_len - 1) {
4555 *out_len = in_len - 1;
4566 bssl::UniquePtr<SSL> *out_client, bssl::UniquePtr<SSL> *out_server,
4579 state->retry_count = retry_count;
4580 state->failure_mode = failure_mode;
4598 out_client->reset();
4599 out_server->reset();
4604 testing::tuple<uint16_t, unsigned, ssl_test_ticket_aead_failure_mode>;
4617 const unsigned retry_count = testing::get<1>(GetParam());
4619 testing::get<2>(GetParam());
4637 failure_mode,
nullptr);
4638 switch (failure_mode) {
4655 failure_mode, session.get());
4656 switch (failure_mode) {
4680 for (
auto it =
ret.begin();
it !=
ret.end();) {
4681 if (*
it ==
'.' || *
it ==
'v') {
4687 char retry_count[256];
4688 snprintf(retry_count,
sizeof(retry_count),
"%d", std::get<1>(params.
param));
4692 switch (std::get<2>(params.
param)) {
4700 ret +=
"OpenSoftFail";
4703 ret +=
"OpenHardFail";
4710 TicketAEADMethodTests, TicketAEADMethodTest,
4726 (
const uint8_t *)
"\1a\2bb\3ccc", 9,
4727 (
const uint8_t *)
"\1x\1y\1a\1z", 8));
4732 (
const uint8_t *)
"\1a\2bb\3ccc", 9,
4733 (
const uint8_t *)
"\1x\1y\2bb\1z", 9));
4738 (
const uint8_t *)
"\1a\2bb\3ccc", 9,
4739 (
const uint8_t *)
"\1x\1y\3ccc\1z", 10));
4745 (
const uint8_t *)
"\1a\2bb\3ccc", 9,
4746 (
const uint8_t *)
"\3ccc\2bb\1a", 9));
4752 (
const uint8_t *)
"\1a\2bb\3ccc", 9,
4753 (
const uint8_t *)
"\1x\2yy\3zzz", 9));
4758 (
const uint8_t *)
"\1x\2yy\3zzz", 9));
4772 const std::vector<uint8_t> record = {1, 2, 3, 4, 5};
4773 std::vector<uint8_t>
prefix(
4775 body(record.size()),
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;
4792 bssl::OpenRecordResult::kOK);
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(
4816 record.insert(record.begin(),
prefix.begin(),
prefix.end());
4817 record.insert(record.end(),
suffix.begin(),
suffix.end());
4819 bssl::Span<uint8_t>
result;
4824 bssl::OpenRecordResult::kOK);
4829 TEST(SSLTest, SealRecordTrailingData) {
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(
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});
4851 bssl::Span<uint8_t>
result;
4856 bssl::OpenRecordResult::kOK);
4857 EXPECT_EQ(record_len, record.size() - 5);
4861 TEST(SSLTest, SealRecordInvalidSpanSize) {
4871 std::vector<uint8_t> record = {1, 2, 3, 4, 5};
4872 std::vector<uint8_t>
prefix(
4874 body(record.size()),
4877 auto expect_err = []() {
4914 TEST(SSLTest, NoCiphersAvailable) {
4921 ctx.get(),
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"));
4924 bssl::UniquePtr<SSL> ssl(
SSL_new(
ctx.get()));
4946 bssl::UniquePtr<SSL_SESSION> session =
4963 UniquePtr<SSL> ssl(
SSL_new(client_ctx_.get()));
5009 TEST(SSLTest, ShutdownIgnoresTickets) {
5021 ADD_FAILURE() <<
"New session callback called during SSL_shutdown";
5034 TEST(SSLTest, SignatureAlgorithmProperties) {
5061 for (
size_t i = 0;
i < in_len;
i++) {
5073 size_t uncompressed_len,
const uint8_t *
in,
5075 if (in_len != uncompressed_len) {
5081 if (*
out ==
nullptr) {
5085 for (
size_t i = 0;
i < in_len;
i++) {
5132 bssl::UniquePtr<SSL_CTX> handshaker_ctx(
5145 for (
bool early_data : {
false,
true}) {
5147 for (
bool is_resume : {
false,
true}) {
5166 if (early_data && is_resume) {
5187 bssl::UniquePtr<SSL> handshaker(
SSL_new(handshaker_ctx.get()));
5197 int handshake_err =
SSL_get_error(handshaker.get(), handshake_ret);
5203 handshake_err =
SSL_get_error(handshaker.get(), handshake_ret);
5206 ScopedCBB cbb_handback;
5215 MoveBIOs(server2.get(), handshaker.get());
5219 if (early_data && is_resume) {
5284 if (
ret.size() > 1) {
5289 snprintf(
buf,
sizeof(
buf) - 1,
"0x%02x",
v);
5300 bool matches =
false;
5301 if (expected.
size() == actual.
size()) {
5304 for (
size_t i = 0;
i < expected.
size();
i++) {
5305 if (expected[
i] != actual[
i]) {
5319 static const struct {
5320 std::vector<int>
input;
5322 std::vector<uint16_t> expected;
5326 {{1, 2, 3},
false, {}},
5362 static const struct {
5365 std::vector<uint16_t> expected;
5371 {
"RSA+",
false, {}},
5372 {
"RSA+SHA256:",
false, {}},
5373 {
":RSA+SHA256:",
false, {}},
5374 {
":RSA+SHA256+:",
false, {}},
5376 {
"\x01",
false, {}},
5377 {
"RSA+SHA256:RSA+SHA384:RSA+SHA256",
false, {}},
5378 {
"RSA-PSS+SHA256:rsa_pss_rsae_sha256",
false, {}},
5381 {
"RSA+SHA256:ed25519",
5384 {
"ECDSA+SHA256:RSA+SHA512",
5387 {
"ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256",
5418 TEST(SSLTest, ApplyHandoffRemovesUnsupportedCiphers) {
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,
5456 TEST(SSLTest, ApplyHandoffRemovesUnsupportedCurves) {
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,
5493 TEST(SSLTest, ZeroSizedWiteFlushesHandshakeMessages) {
5521 [](
SSL *ssl,
uint8_t *out_alert) { return ssl_verify_ok; });
5526 [](
SSL *ssl,
uint8_t *out_alert) { return ssl_verify_invalid; });
5530 [](
SSL *ssl,
void *
arg) {
5531 ADD_FAILURE() <<
"cert_cb unexpectedly called";
5538 server_ctx_.get()));
5546 bssl::UniquePtr<SSL_SESSION> session =
5551 unsigned session_id_length;
5558 #if defined(OPENSSL_THREADS)
5559 TEST_P(SSLVersionTest, SessionCacheThreads) {
5571 bssl::UniquePtr<SSL_SESSION> session1 =
5574 bssl::UniquePtr<SSL_SESSION> session2 =
5578 auto connect_with_session = [&](
SSL_SESSION *session) {
5580 config.session = session;
5583 server_ctx_.get(),
config));
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()); });
5605 std::vector<std::thread>
threads;
5606 for (
int i = 0;
i < 4;
i++) {
5608 connect_with_session(
nullptr);
5627 bssl::UniquePtr<SSL_SESSION> expired_session1 =
5630 bssl::UniquePtr<SSL_SESSION> expired_session2 =
5640 static const int kNumConnections = 256;
5642 std::vector<std::thread>
threads;
5644 for (
int i = 0;
i < kNumConnections;
i++) {
5645 connect_with_session(
nullptr);
5649 for (
int i = 0;
i < kNumConnections;
i++) {
5650 connect_with_session(
nullptr);
5657 for (
int i = 0;
i < kNumConnections;
i++) {
5658 connect_with_session(expired_session1.get());
5662 for (
int i = 0;
i < kNumConnections;
i++) {
5663 connect_with_session(session1.get());
5672 TEST_P(SSLVersionTest, SessionTicketThreads) {
5673 for (
bool renew_ticket : {
false,
true}) {
5683 bssl::UniquePtr<SSL_SESSION> session1 =
5686 bssl::UniquePtr<SSL_SESSION> session2 =
5690 auto connect_with_session = [&](
SSL_SESSION *session) {
5692 config.session = session;
5695 server_ctx_.get(),
config));
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()); });
5715 TEST(SSLTest, GetCertificateThreads) {
5739 TEST_P(SSLVersionTest, SessionPropertiesThreads) {
5756 [](
SSL *ssl,
uint8_t *out_alert) { return ssl_verify_ok; });
5759 [](
SSL *ssl,
uint8_t *out_alert) { return ssl_verify_ok; });
5762 bssl::UniquePtr<SSL_SESSION> session =
5767 UniquePtr<SSL> ssls[4];
5769 config.session = session.get();
5771 server_ctx_.get(),
config));
5773 server_ctx_.get(),
config));
5776 auto read_properties = [](
const SSL *ssl) {
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); });
5793 #endif // OPENSSL_THREADS
5797 "kNumQUICLevels is wrong");
5799 "kNumQUICLevels is wrong");
5801 "kNumQUICLevels is wrong");
5803 "kNumQUICLevels is wrong");
5810 return "early data";
5814 return "application";
5821 enum class Role { kClient, kServer };
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;
5842 return !levels_[
level].read_secret.empty();
5846 return !levels_[
level].write_secret.empty();
5853 if (HasReadSecret(
level)) {
5859 ADD_FAILURE() <<
"Unexpected early data read secret";
5863 ssl_encryption_level_t ack_level =
5865 if (!HasWriteSecret(ack_level)) {
5867 <<
" read secret configured before ACK write secret";
5871 if (cipher ==
nullptr) {
5882 levels_[
level].read_secret.assign(secret.
begin(), secret.
end());
5889 if (HasWriteSecret(
level)) {
5895 ADD_FAILURE() <<
"Unexpected early data write secret";
5899 if (cipher ==
nullptr) {
5904 levels_[
level].write_secret.assign(secret.
begin(), secret.
end());
5911 if (levels_[
level].write_secret.empty()) {
5913 <<
" write secret not yet configured";
5919 if (!allow_out_of_order_writes_) {
5922 ADD_FAILURE() <<
"unexpected handshake data at early data level";
5928 <<
" handshake data written after handshake keys installed";
5936 <<
" handshake data written after application keys installed";
5956 if (levels_[
level].write_secret.empty()) {
5958 <<
" write secret not yet configured";
5963 alert_level_ =
level;
5964 alert_ = alert_value;
5969 ssl_encryption_level_t
level,
5971 if (levels_[
level].read_secret.empty()) {
5976 if (peer_->levels_[
level].write_secret.empty()) {
5981 if (peer_->levels_[
level].write_secret != levels_[
level].read_secret) {
5982 ADD_FAILURE() <<
"peer write key does not match read key in level "
5986 if (peer_->levels_[
level].cipher != levels_[
level].cipher) {
5990 std::vector<uint8_t> *peer_data = &peer_->levels_[
level].write_data;
5992 out->assign(peer_data->begin(), peer_data->begin() +
num);
5993 peer_data->erase(peer_data->begin(), peer_data->begin() +
num);
6001 bool allow_out_of_order_writes_ =
false;
6002 bool has_alert_ =
false;
6058 static const uint8_t kALPNProtos[] = {0x03,
'f',
'o',
'o'};
6060 sizeof(kALPNProtos)),
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
6070 : SSL_TLSEXT_ERR_NOACK;
6076 return ex_data_.Get(ssl);
6083 std::vector<uint8_t>
data;
6089 allow_out_of_order_writes_ =
true;
6105 if (allow_out_of_order_writes_) {
6106 transport_->client()->AllowOutOfOrderWrites();
6107 transport_->server()->AllowOutOfOrderWrites();
6109 static const uint8_t client_transport_params[] = {0};
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())) {
6133 return RunQUICHandshakesAndExpectError(ExpectedError::kNoError);
6141 bool client_done =
false, server_done =
false;
6142 while (!client_done || !server_done) {
6144 if (!ProvideHandshakeData(
client_.get())) {
6145 ADD_FAILURE() <<
"ProvideHandshakeData(client_) failed";
6150 if (client_ret == 1) {
6153 if (expected_error == ExpectedError::kClientError) {
6156 ADD_FAILURE() <<
"Unexpected client output: " << client_ret <<
" "
6163 if (!ProvideHandshakeData(
server_.get())) {
6164 ADD_FAILURE() <<
"ProvideHandshakeData(server_) failed";
6169 if (server_ret == 1) {
6172 if (expected_error == ExpectedError::kServerError) {
6175 ADD_FAILURE() <<
"Unexpected server output: " << server_ret <<
" "
6181 return expected_error == ExpectedError::kNoError;
6188 !CompleteHandshakesForQUIC()) {
6193 if (!ProvideHandshakeData(
client_.get()) ||
6219 SetReadSecretCallback, SetWriteSecretCallback, AddHandshakeDataCallback,
6220 FlushFlightCallback, SendAlertCallback,
6226 const uint8_t *secret,
size_t secret_len) {
6227 return TransportFromSSL(ssl)->SetReadSecret(
6233 const uint8_t *secret,
size_t secret_len) {
6234 return TransportFromSSL(ssl)->SetWriteSecret(
6239 enum ssl_encryption_level_t
level,
6242 return TransportFromSSL(ssl)->WriteHandshakeData(
level,
6251 return TransportFromSSL(ssl)->SendAlert(
level, alert);
6263 std::vector<uint8_t> server_transport_params_ = {1};
6264 std::vector<uint8_t> server_quic_early_data_context_ = {2};
6266 bool allow_out_of_order_writes_ =
false;
6285 ExpectHandshakeSuccess();
6302 ExpectHandshakeSuccess();
6325 ExpectHandshakeSuccess();
6338 EXPECT_EQ(client_hello->session_id_len, 0u);
6339 return ssl_select_cert_success;
6345 ExpectHandshakeSuccess();
6375 ExpectHandshakeSuccess();
6387 bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6414 ExpectHandshakeSuccess();
6452 ExpectHandshakeSuccess();
6473 bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6477 static const uint8_t new_context[] = {4};
6479 sizeof(new_context)));
6516 ExpectHandshakeSuccess();
6526 server_quic_early_data_context_ = {};
6535 bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6549 bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6552 for (
bool reject_hrr : {
false,
true}) {
6602 ExpectHandshakeSuccess();
6622 bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
6632 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
6633 return ssl_verify_retry;
6646 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
6647 return ssl_verify_ok;
6665 bool cert_cb_ok =
false;
6667 [](
SSL *,
void *
arg) ->
int {
6668 return *static_cast<bool *>(arg) ? 1 : -1;
6674 if (client_ret != 1) {
6681 if (server_ret != 1) {
6693 FAIL() <<
"Unexpected SSL_get_error result: " << ssl_err;
6697 if (client_ret == 1 && server_ret == 1) {
6702 ExpectHandshakeSuccess();
6707 AllowOutOfOrderWrites();
6709 struct BufferedFlight {
6714 auto add_handshake_data = [](
SSL *ssl,
enum ssl_encryption_level_t
level,
6716 BufferedFlight *flight = buffered_flights.
Get(ssl);
6721 auto flush_flight = [](
SSL *ssl) ->
int {
6722 BufferedFlight *flight = buffered_flights.
Get(ssl);
6724 if (!flight->data[
level].empty()) {
6725 if (!TransportFromSSL(ssl)->WriteHandshakeData(
6726 static_cast<ssl_encryption_level_t
>(
level),
6727 flight->data[
level])) {
6730 flight->data[
level].clear();
6744 BufferedFlight client_flight, server_flight;
6745 buffered_flights.
Set(
client_.get(), &client_flight);
6746 buffered_flights.
Set(
server_.get(), &server_flight);
6750 ExpectHandshakeSuccess();
6758 AllowOutOfOrderWrites();
6760 auto add_handshake_data = [](
SSL *ssl,
enum ssl_encryption_level_t
level,
6831 std::vector<uint8_t>
data;
6862 for (
size_t i = 0;
i < limit;
i++) {
6891 uint8_t kJunk[] = {0x17, 0x0, 0x0, 0x4, 0xB, 0xE, 0xE, 0xF};
6893 kJunk,
sizeof(kJunk)));
6900 size_t received_len;
6912 uint8_t kClientParams[] = {1, 2, 3, 4};
6913 uint8_t kServerParams[] = {5, 6, 7};
6915 sizeof(kClientParams)));
6917 sizeof(kServerParams)));
6930 uint8_t kClientParams[] = {1, 2, 3, 4};
6931 static uint8_t kServerParams[] = {5, 6, 7};
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;
6959 ExpectHandshakeSuccess();
6982 ExpectHandshakeSuccess();
7000 ExpectHandshakeSuccess();
7047 ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError));
7057 ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kClientError));
7066 uint8_t kClientParams[] = {1, 2, 3, 4};
7067 uint8_t kServerParams[] = {5, 6, 7};
7071 sizeof(kClientParams)));
7073 sizeof(kServerParams)));
7086 uint8_t kClientParams[] = {1, 2, 3, 4};
7087 uint8_t kServerParams[] = {5, 6, 7};
7091 sizeof(kClientParams)));
7093 sizeof(kServerParams)));
7106 uint8_t kClientParams[] = {1, 2, 3, 4};
7107 uint8_t kServerParams[] = {5, 6, 7};
7111 sizeof(kClientParams)));
7113 sizeof(kServerParams)));
7115 ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError));
7124 uint8_t kClientParams[] = {1, 2, 3, 4};
7125 uint8_t kServerParams[] = {5, 6, 7};
7129 sizeof(kClientParams)));
7131 sizeof(kServerParams)));
7133 ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError));
7146 const uint8_t *data;
7148 if (!SSL_early_callback_ctx_extension_get(
7149 client_hello, TLSEXT_TYPE_quic_transport_parameters, &data,
7151 ADD_FAILURE() <<
"Could not find quic_transport_parameters extension";
7152 return ssl_select_cert_error;
7166 EXPECT_EQ(
sizeof(
int),
sizeof(ssl_private_key_result_t));
7175 UniquePtr<BIO_METHOD> bio_method(
BIO_meth_new(0,
nullptr));
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);
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);
7198 bio_method.get(), [](
BIO *bio,
int cmd,
long larg,
void *parg) ->
long {
7200 if (cmd == BIO_CTRL_FLUSH) {
7206 UniquePtr<BIO> client_bio(
BIO_new(bio_method.get()));
7211 UniquePtr<BIO> server_bio(
BIO_new(bio_method.get()));
7217 UniquePtr<SSL> client_outer(
SSL_new(client_ctx_.get()));
7220 SSL_set_bio(client_outer.get(), client_bio.get(), client_bio.get());
7221 client_bio.release();
7223 UniquePtr<SSL> server_outer(
SSL_new(server_ctx_.get()));
7226 SSL_set_bio(server_outer.get(), server_bio.get(), server_bio.get());
7227 server_bio.release();
7232 [](
SSL *ssl,
uint8_t *out_alert) -> ssl_verify_result_t {
7233 return ssl_verify_invalid;
7238 int client_err =
SSL_get_error(client_outer.get(), client_ret);
7252 int server_err =
SSL_get_error(server_outer.get(), server_ret);
7263 bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
7276 bssl::UniquePtr<SSL_SESSION> session =
7280 config.session = session.get();
7285 server_ctx_.get(),
config));
7291 server_ctx2.get(),
config));
7301 bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
7314 bssl::UniquePtr<SSL_SESSION> session =
7318 config.session = session.get();
7323 server_ctx_.get(),
config));
7329 server_ctx2.get(),
config));
7335 bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
7344 bssl::UniquePtr<SSL_SESSION> session =
7348 config.session = session.get();
7353 server_ctx_.get(),
config));
7359 server_ctx2.get(),
config));
7378 bssl::UniquePtr<SSL_SESSION> session =
7383 config.session = session.get();
7385 server_ctx_.get(),
config));
7392 TEST(SSLTest, WriteWhileExplicitRenegotiate) {
7399 ctx.get(),
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"));
7409 size_t num_writes = 0;
7422 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
7429 record[4] =
sizeof(record) - 5;
7433 static const size_t kKeyLen = 32;
7434 static const size_t kNonceLen = 12;
7436 uint8_t key_block[2
u * (kKeyLen + kNonceLen)];
7441 MakeSpan(key_block + kKeyLen + kKeyLen + kNonceLen, kNonceLen);
7445 for (
size_t i = 0;
i < 8;
i++) {
7456 ad[12] =
sizeof(
in);
7463 record[4] =
sizeof(record) - 5;
7465 ScopedEVP_AEAD_CTX aead;
7471 sizeof(record) - 5, nonce.
data(), nonce.
size(),
7472 in,
sizeof(
in), ad,
sizeof(ad)));
7474 #endif // BORINGSSL_UNSAFE_FUZZER_MODE
7486 for (
size_t i = 0;
i < num_writes;
i++) {
7520 TEST(SSLTest, CopyWithoutEarlyData) {
7532 bssl::UniquePtr<SSL_SESSION> session =
7547 bssl::UniquePtr<SSL_SESSION> session2(
7550 EXPECT_NE(session.get(), session2.get());
7562 bssl::UniquePtr<SSL_SESSION> session3(
7564 EXPECT_EQ(session2.get(), session3.get());
7567 TEST(SSLTest, ProcessTLS13NewSessionTicket) {
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,
7604 client.get(), kTicket,
sizeof(kTicket)));
7608 uint8_t *session_buf =
nullptr;
7609 size_t session_length = 0;
7612 bssl::UniquePtr<uint8_t> session_buf_free(session_buf);
7636 for (
bool take_ownership : {
true,
false}) {
7646 if (take_ownership) {
7670 for (
int i = 0;
i < 1024;
i++) {
7671 std::vector<uint8_t>
buffer(1024);
7695 std::vector<uint8_t> observed_alpn;
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;
7707 observed_alpn.clear();
7714 static const uint8_t kValidList[] = {0x03,
'f',
'o',
'o',
7715 0x03,
'b',
'a',
'r'};
7718 check_alpn_proto(kValidList);
7721 static const uint8_t kInvalidList[] = {0x04,
'f',
'o',
'o'};
7723 sizeof(kInvalidList)));
7727 check_alpn_proto({});
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-----
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-----
7764 bssl::UniquePtr<X509> good = CertFromPEM(kGoodKeyUsage);
7779 TEST(SSLTest, CanReleasePrivateKey) {
7808 server_ctx.get(),
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"));
7813 [](
SSL *ssl,
uint8_t *out_alert) { return ssl_verify_ok; });
7817 check_first_server_round_trip(
client.get(),
server.get());
7830 check_first_server_round_trip(
client.get(),
server.get());
7843 bssl::UniquePtr<SSL_SESSION> session =
7850 check_first_server_round_trip(
client.get(),
server.get());
7863 check_first_server_round_trip(
client.get(),
server.get());
7873 bssl::UniquePtr<SSL_SESSION> session =
7880 check_first_server_round_trip(
client.get(),
server.get());
7892 std::vector<uint16_t> *
out;
7894 bool callback_done =
false;
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));
7918 app_data_ptr->out->clear();
7920 CBS_init(&extensions, client_hello->extensions,
7921 client_hello->extensions_len);
7922 while (CBS_len(&extensions)) {
7925 if (!CBS_get_u16(&extensions, &type) ||
7926 !CBS_get_u16_length_prefixed(&extensions, &body)) {
7927 return ssl_select_cert_error;
7929 app_data_ptr->out->push_back(type);
7933 app_data_ptr->callback_done =
true;
7946 return app_data.callback_done;
7955 for (
bool offer_ech : {
false,
true}) {
7967 std::vector<uint16_t> order1, order2;
7990 static const int kNumIterations = 14;
7991 bool passed =
false;
7992 for (
int i = 0;
i < kNumIterations;
i++) {
7995 if (order1 != order2) {
8000 EXPECT_TRUE(passed) <<
"Extensions were not permuted";