Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: net/socket/ssl_server_socket_unittest.cc

Issue 1518613002: Support for server session cache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@client_certs
Patch Set: Rebase only Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This test suite uses SSLClientSocket to test the implementation of 5 // This test suite uses SSLClientSocket to test the implementation of
6 // SSLServerSocket. In order to establish connections between the sockets 6 // SSLServerSocket. In order to establish connections between the sockets
7 // we need two additional classes: 7 // we need two additional classes:
8 // 1. FakeSocket 8 // 1. FakeSocket
9 // Connects SSL socket to FakeDataChannel. This class is just a stub. 9 // Connects SSL socket to FakeDataChannel. This class is just a stub.
10 // 10 //
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 namespace net { 66 namespace net {
67 67
68 namespace { 68 namespace {
69 69
70 const char kClientCertFileName[] = "client_1.pem"; 70 const char kClientCertFileName[] = "client_1.pem";
71 const char kClientPrivateKeyFileName[] = "client_1.pk8"; 71 const char kClientPrivateKeyFileName[] = "client_1.pk8";
72 const char kWrongClientCertFileName[] = "client_2.pem"; 72 const char kWrongClientCertFileName[] = "client_2.pem";
73 const char kWrongClientPrivateKeyFileName[] = "client_2.pk8"; 73 const char kWrongClientPrivateKeyFileName[] = "client_2.pk8";
74 const char kClientCertCAFileName[] = "client_1_ca.pem"; 74 const char kClientCertCAFileName[] = "client_1_ca.pem";
75 75
76 class FakeDataChannel { 76 class FakeDataChannel : public base::RefCountedThreadSafe<FakeDataChannel> {
davidben 2016/01/22 23:57:48 Reference-counted mutable classes are usually an i
ryanchung 2016/01/29 23:28:16 Done. Changed it back. These were used by both the
77 public: 77 public:
78 FakeDataChannel() 78 FakeDataChannel()
79 : read_buf_len_(0), 79 : read_buf_len_(0),
80 closed_(false), 80 closed_(false),
81 write_called_after_close_(false), 81 write_called_after_close_(false),
82 weak_factory_(this) { 82 weak_factory_(this) {
83 } 83 }
84 84
85 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 85 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
86 DCHECK(read_callback_.is_null()); 86 DCHECK(read_callback_.is_null());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 data_.push( 127 data_.push(
128 new DrainableIOBuffer(new StringIOBuffer(std::string("0", 1)), 1)); 128 new DrainableIOBuffer(new StringIOBuffer(std::string("0", 1)), 1));
129 if (!read_callback_.is_null()) { 129 if (!read_callback_.is_null()) {
130 base::ThreadTaskRunnerHandle::Get()->PostTask( 130 base::ThreadTaskRunnerHandle::Get()->PostTask(
131 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback, 131 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback,
132 weak_factory_.GetWeakPtr())); 132 weak_factory_.GetWeakPtr()));
133 } 133 }
134 } 134 }
135 135
136 private: 136 private:
137 ~FakeDataChannel() {}
138 friend class base::RefCountedThreadSafe<FakeDataChannel>;
139
137 void DoReadCallback() { 140 void DoReadCallback() {
138 if (read_callback_.is_null() || data_.empty()) 141 if (read_callback_.is_null() || data_.empty())
139 return; 142 return;
140 int copied = PropagateData(read_buf_, read_buf_len_); 143 int copied = PropagateData(read_buf_, read_buf_len_);
141 CompletionCallback callback = read_callback_; 144 CompletionCallback callback = read_callback_;
142 read_callback_.Reset(); 145 read_callback_.Reset();
143 read_buf_ = NULL; 146 read_buf_ = NULL;
144 read_buf_len_ = 0; 147 read_buf_len_ = 0;
145 callback.Run(copied); 148 callback.Run(copied);
146 } 149 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 // asynchronously. 184 // asynchronously.
182 bool write_called_after_close_; 185 bool write_called_after_close_;
183 186
184 base::WeakPtrFactory<FakeDataChannel> weak_factory_; 187 base::WeakPtrFactory<FakeDataChannel> weak_factory_;
185 188
186 DISALLOW_COPY_AND_ASSIGN(FakeDataChannel); 189 DISALLOW_COPY_AND_ASSIGN(FakeDataChannel);
187 }; 190 };
188 191
189 class FakeSocket : public StreamSocket { 192 class FakeSocket : public StreamSocket {
190 public: 193 public:
191 FakeSocket(FakeDataChannel* incoming_channel, 194 FakeSocket(const scoped_refptr<FakeDataChannel>& incoming_channel,
192 FakeDataChannel* outgoing_channel) 195 const scoped_refptr<FakeDataChannel>& outgoing_channel) {
193 : incoming_(incoming_channel), 196 incoming_ = incoming_channel;
194 outgoing_(outgoing_channel) { 197 outgoing_ = outgoing_channel;
195 } 198 }
196 199
197 ~FakeSocket() override {} 200 ~FakeSocket() override {}
198 201
199 int Read(IOBuffer* buf, 202 int Read(IOBuffer* buf,
200 int buf_len, 203 int buf_len,
201 const CompletionCallback& callback) override { 204 const CompletionCallback& callback) override {
202 // Read random number of bytes. 205 // Read random number of bytes.
203 buf_len = rand() % buf_len + 1; 206 buf_len = rand() % buf_len + 1;
204 return incoming_->Read(buf, buf_len, callback); 207 return incoming_->Read(buf, buf_len, callback);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 265
263 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {} 266 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
264 267
265 int64_t GetTotalReceivedBytes() const override { 268 int64_t GetTotalReceivedBytes() const override {
266 NOTIMPLEMENTED(); 269 NOTIMPLEMENTED();
267 return 0; 270 return 0;
268 } 271 }
269 272
270 private: 273 private:
271 BoundNetLog net_log_; 274 BoundNetLog net_log_;
272 FakeDataChannel* incoming_; 275 scoped_refptr<FakeDataChannel> incoming_;
273 FakeDataChannel* outgoing_; 276 scoped_refptr<FakeDataChannel> outgoing_;
274 277
275 DISALLOW_COPY_AND_ASSIGN(FakeSocket); 278 DISALLOW_COPY_AND_ASSIGN(FakeSocket);
276 }; 279 };
277 280
278 class TestSSLPrivateKey : public SSLPrivateKey { 281 class TestSSLPrivateKey : public SSLPrivateKey {
279 public: 282 public:
280 TestSSLPrivateKey(crypto::RSAPrivateKey* rsa_private_key) 283 TestSSLPrivateKey(crypto::RSAPrivateKey* rsa_private_key)
281 : rsa_private_key_(rsa_private_key) {} 284 : rsa_private_key_(rsa_private_key) {}
282 285
283 Type GetType() override { return SSLPrivateKey::Type::RSA; } 286 Type GetType() override { return SSLPrivateKey::Type::RSA; }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 scoped_ptr<crypto::RSAPrivateKey> rsa_private_key_; 334 scoped_ptr<crypto::RSAPrivateKey> rsa_private_key_;
332 335
333 DISALLOW_COPY_AND_ASSIGN(TestSSLPrivateKey); 336 DISALLOW_COPY_AND_ASSIGN(TestSSLPrivateKey);
334 }; 337 };
335 338
336 } // namespace 339 } // namespace
337 340
338 // Verify the correctness of the test helper classes first. 341 // Verify the correctness of the test helper classes first.
339 TEST(FakeSocketTest, DataTransfer) { 342 TEST(FakeSocketTest, DataTransfer) {
340 // Establish channels between two sockets. 343 // Establish channels between two sockets.
341 FakeDataChannel channel_1; 344 scoped_refptr<FakeDataChannel> channel_1(new FakeDataChannel());
342 FakeDataChannel channel_2; 345 scoped_refptr<FakeDataChannel> channel_2(new FakeDataChannel());
343 FakeSocket client(&channel_1, &channel_2); 346 FakeSocket client(channel_1, channel_2);
344 FakeSocket server(&channel_2, &channel_1); 347 FakeSocket server(channel_2, channel_1);
345 348
346 const char kTestData[] = "testing123"; 349 const char kTestData[] = "testing123";
347 const int kTestDataSize = strlen(kTestData); 350 const int kTestDataSize = strlen(kTestData);
348 const int kReadBufSize = 1024; 351 const int kReadBufSize = 1024;
349 scoped_refptr<IOBuffer> write_buf = new StringIOBuffer(kTestData); 352 scoped_refptr<IOBuffer> write_buf = new StringIOBuffer(kTestData);
350 scoped_refptr<IOBuffer> read_buf = new IOBuffer(kReadBufSize); 353 scoped_refptr<IOBuffer> read_buf = new IOBuffer(kReadBufSize);
351 354
352 // Write then read. 355 // Write then read.
353 int written = 356 int written =
354 server.Write(write_buf.get(), kTestDataSize, CompletionCallback()); 357 server.Write(write_buf.get(), kTestDataSize, CompletionCallback());
(...skipping 19 matching lines...) Expand all
374 EXPECT_LE(read, written); 377 EXPECT_LE(read, written);
375 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); 378 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
376 } 379 }
377 380
378 class SSLServerSocketTest : public PlatformTest { 381 class SSLServerSocketTest : public PlatformTest {
379 public: 382 public:
380 SSLServerSocketTest() 383 SSLServerSocketTest()
381 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), 384 : socket_factory_(ClientSocketFactory::GetDefaultFactory()),
382 cert_verifier_(new MockCertVerifier()), 385 cert_verifier_(new MockCertVerifier()),
383 client_cert_verifier_(new MockClientCertVerifier()), 386 client_cert_verifier_(new MockClientCertVerifier()),
384 transport_security_state_(new TransportSecurityState) { 387 transport_security_state_(new TransportSecurityState),
388 initialized_(false) {
385 cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID); 389 cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID);
386 client_cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID); 390 client_cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID);
387 } 391 }
388 392
389 protected: 393 protected:
390 void Initialize() { 394 void Initialize(bool reinitialize_server_context = false) {
davidben 2016/01/22 23:57:48 Style: no default arguments.
ryanchung 2016/01/29 23:28:16 Done.
395 scoped_refptr<FakeDataChannel> channel_1_ = new FakeDataChannel();
396 scoped_refptr<FakeDataChannel> channel_2_ = new FakeDataChannel();
391 scoped_ptr<ClientSocketHandle> client_connection(new ClientSocketHandle); 397 scoped_ptr<ClientSocketHandle> client_connection(new ClientSocketHandle);
392 client_connection->SetSocket( 398 client_connection->SetSocket(
393 scoped_ptr<StreamSocket>(new FakeSocket(&channel_1_, &channel_2_))); 399 scoped_ptr<StreamSocket>(new FakeSocket(channel_1_, channel_2_)));
394 scoped_ptr<StreamSocket> server_socket( 400 scoped_ptr<StreamSocket> server_socket(
395 new FakeSocket(&channel_2_, &channel_1_)); 401 new FakeSocket(channel_2_, channel_1_));
396 402
397 std::string server_cert_der; 403 std::string server_cert_der;
398 scoped_refptr<X509Certificate> server_cert( 404 if (!initialized_ || reinitialize_server_context) {
399 ReadTestCert("unittest.selfsigned.der", &server_cert_der)); 405 scoped_refptr<X509Certificate> server_cert(
400 scoped_ptr<crypto::RSAPrivateKey> server_private_key( 406 ReadTestCert("unittest.selfsigned.der", &server_cert_der));
401 ReadTestKey("unittest.key.bin")); 407 scoped_ptr<crypto::RSAPrivateKey> server_private_key(
408 ReadTestKey("unittest.key.bin"));
409 server_context_ = CreateSSLServerSocketContext(
410 server_cert.get(), *server_private_key, server_ssl_config_);
411 }
402 412
403 client_ssl_config_.false_start_enabled = false; 413 if (!initialized_) {
404 client_ssl_config_.channel_id_enabled = false; 414 client_ssl_config_.false_start_enabled = false;
415 client_ssl_config_.channel_id_enabled = false;
405 416
406 // Certificate provided by the host doesn't need authority. 417 // Certificate provided by the host doesn't need authority.
407 SSLConfig::CertAndStatus cert_and_status; 418 SSLConfig::CertAndStatus cert_and_status;
408 cert_and_status.cert_status = CERT_STATUS_AUTHORITY_INVALID; 419 cert_and_status.cert_status = CERT_STATUS_AUTHORITY_INVALID;
409 cert_and_status.der_cert = server_cert_der; 420 cert_and_status.der_cert = server_cert_der;
410 client_ssl_config_.allowed_bad_certs.push_back(cert_and_status); 421 client_ssl_config_.allowed_bad_certs.push_back(cert_and_status);
422
423 socket_factory_->ClearSSLSessionCache();
424 }
411 425
412 HostPortPair host_and_pair("unittest", 0); 426 HostPortPair host_and_pair("unittest", 0);
413 SSLClientSocketContext context; 427 SSLClientSocketContext context;
414 context.cert_verifier = cert_verifier_.get(); 428 context.cert_verifier = cert_verifier_.get();
415 context.transport_security_state = transport_security_state_.get(); 429 context.transport_security_state = transport_security_state_.get();
416 socket_factory_->ClearSSLSessionCache();
417 client_socket_ = socket_factory_->CreateSSLClientSocket( 430 client_socket_ = socket_factory_->CreateSSLClientSocket(
418 std::move(client_connection), host_and_pair, client_ssl_config_, 431 std::move(client_connection), host_and_pair, client_ssl_config_,
419 context); 432 context);
433
420 server_socket_ = 434 server_socket_ =
421 CreateSSLServerSocket(std::move(server_socket), server_cert.get(), 435 server_context_->CreateSSLServerSocket(std::move(server_socket));
422 *server_private_key, server_ssl_config_); 436 initialized_ = true;
423 } 437 }
424 438
425 void ConfigureClientCertsForClient(const char* cert_file_name, 439 void ConfigureClientCertsForClient(const char* cert_file_name,
426 const char* private_key_file_name) { 440 const char* private_key_file_name) {
427 scoped_refptr<X509Certificate> cert; 441 scoped_refptr<X509Certificate> cert;
428 scoped_refptr<net::SSLPrivateKey> key; 442 scoped_refptr<net::SSLPrivateKey> key;
429 if (cert_file_name && private_key_file_name) { 443 if (cert_file_name && private_key_file_name) {
430 cert = ImportCertFromFile(GetTestCertsDirectory(), cert_file_name); 444 cert = ImportCertFromFile(GetTestCertsDirectory(), cert_file_name);
431 key = new TestSSLPrivateKey(ReadTestKey(private_key_file_name)); 445 key = new TestSSLPrivateKey(ReadTestKey(private_key_file_name));
432 } 446 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 std::string key_string; 495 std::string key_string;
482 if (!base::ReadFileToString(key_path, &key_string)) 496 if (!base::ReadFileToString(key_path, &key_string))
483 return NULL; 497 return NULL;
484 std::vector<uint8_t> key_vector( 498 std::vector<uint8_t> key_vector(
485 reinterpret_cast<const uint8_t*>(key_string.data()), 499 reinterpret_cast<const uint8_t*>(key_string.data()),
486 reinterpret_cast<const uint8_t*>(key_string.data() + 500 reinterpret_cast<const uint8_t*>(key_string.data() +
487 key_string.length())); 501 key_string.length()));
488 return crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector); 502 return crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector);
489 } 503 }
490 504
491 FakeDataChannel channel_1_;
492 FakeDataChannel channel_2_;
493 SSLConfig client_ssl_config_; 505 SSLConfig client_ssl_config_;
494 SSLServerConfig server_ssl_config_; 506 SSLServerConfig server_ssl_config_;
495 scoped_ptr<SSLClientSocket> client_socket_; 507 scoped_ptr<SSLClientSocket> client_socket_;
496 scoped_ptr<SSLServerSocket> server_socket_; 508 scoped_ptr<SSLServerSocket> server_socket_;
497 ClientSocketFactory* socket_factory_; 509 ClientSocketFactory* socket_factory_;
498 scoped_ptr<MockCertVerifier> cert_verifier_; 510 scoped_ptr<MockCertVerifier> cert_verifier_;
499 scoped_ptr<MockClientCertVerifier> client_cert_verifier_; 511 scoped_ptr<MockClientCertVerifier> client_cert_verifier_;
500 scoped_ptr<TransportSecurityState> transport_security_state_; 512 scoped_ptr<TransportSecurityState> transport_security_state_;
513 scoped_ptr<SSLServerSocketContext> server_context_;
501 CertificateList trusted_certs_; 514 CertificateList trusted_certs_;
515 bool initialized_;
502 }; 516 };
503 517
504 // This test only executes creation of client and server sockets. This is to 518 // This test only executes creation of client and server sockets. This is to
505 // test that creation of sockets doesn't crash and have minimal code to run 519 // test that creation of sockets doesn't crash and have minimal code to run
506 // under valgrind in order to help debugging memory problems. 520 // under valgrind in order to help debugging memory problems.
507 TEST_F(SSLServerSocketTest, Initialize) { 521 TEST_F(SSLServerSocketTest, Initialize) {
508 Initialize(); 522 Initialize();
509 } 523 }
510 524
511 // This test executes Connect() on SSLClientSocket and Handshake() on 525 // This test executes Connect() on SSLClientSocket and Handshake() on
(...skipping 27 matching lines...) Expand all
539 SSLConnectionStatusToCipherSuite(ssl_info.connection_status); 553 SSLConnectionStatusToCipherSuite(ssl_info.connection_status);
540 const char* key_exchange; 554 const char* key_exchange;
541 const char* cipher; 555 const char* cipher;
542 const char* mac; 556 const char* mac;
543 bool is_aead; 557 bool is_aead;
544 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, cipher_suite); 558 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, cipher_suite);
545 EXPECT_STREQ("ECDHE_RSA", key_exchange); 559 EXPECT_STREQ("ECDHE_RSA", key_exchange);
546 EXPECT_TRUE(is_aead); 560 EXPECT_TRUE(is_aead);
547 } 561 }
548 562
563 // This tests makes sure the session cache is working
564 TEST_F(SSLServerSocketTest, HandshakeCached) {
565 Initialize();
566
567 TestCompletionCallback handshake_callback;
568 int server_ret = server_socket_->Handshake(handshake_callback.callback());
569 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
davidben 2016/01/22 23:57:48 I wouldn't bother with assertions like this one. T
ryanchung 2016/01/29 23:28:16 Done.
570
571 TestCompletionCallback connect_callback;
572 int client_ret = client_socket_->Connect(connect_callback.callback());
573 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
574
575 client_ret = connect_callback.GetResult(client_ret);
576 server_ret = handshake_callback.GetResult(server_ret);
577
578 ASSERT_EQ(OK, client_ret);
579 ASSERT_EQ(OK, server_ret);
580
581 // Make sure the cert status is expected.
582 SSLInfo ssl_info;
583 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
584 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
585 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
586
587 // Make sure the second connection is cached
588 Initialize();
589
590 TestCompletionCallback handshake_callback2;
591 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
592 ASSERT_TRUE(server_ret2 == OK || server_ret2 == ERR_IO_PENDING);
593
594 TestCompletionCallback connect_callback2;
595 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
596 ASSERT_TRUE(client_ret2 == OK || client_ret2 == ERR_IO_PENDING);
597
598 client_ret2 = connect_callback2.GetResult(client_ret2);
599 server_ret2 = handshake_callback2.GetResult(server_ret2);
600
601 ASSERT_EQ(OK, client_ret2);
602 ASSERT_EQ(OK, server_ret2);
603
604 // Make sure the cert status is expected.
605 SSLInfo ssl_info2;
606 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
607 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info2.cert_status);
608 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
609 }
610
611 // This tests makes sure the session cache separates out by server context
612 TEST_F(SSLServerSocketTest, HandshakeCachedContextSwitch) {
613 Initialize();
614
615 TestCompletionCallback handshake_callback;
616 int server_ret = server_socket_->Handshake(handshake_callback.callback());
617 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
618
619 TestCompletionCallback connect_callback;
620 int client_ret = client_socket_->Connect(connect_callback.callback());
621 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
622
623 client_ret = connect_callback.GetResult(client_ret);
624 server_ret = handshake_callback.GetResult(server_ret);
625
626 ASSERT_EQ(OK, client_ret);
627 ASSERT_EQ(OK, server_ret);
628
629 // Make sure the cert status is expected.
630 SSLInfo ssl_info;
631 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
632 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
633 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
634
635 // Make sure the second connection is NOT cached when using a new context.
636 Initialize(true);
637
638 TestCompletionCallback handshake_callback2;
639 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
640 ASSERT_TRUE(server_ret2 == OK || server_ret2 == ERR_IO_PENDING);
641
642 TestCompletionCallback connect_callback2;
643 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
644 ASSERT_TRUE(client_ret2 == OK || client_ret2 == ERR_IO_PENDING);
645
646 client_ret2 = connect_callback2.GetResult(client_ret2);
647 server_ret2 = handshake_callback2.GetResult(server_ret2);
648
649 ASSERT_EQ(OK, client_ret2);
650 ASSERT_EQ(OK, server_ret2);
651
652 // Make sure the cert status is expected.
653 SSLInfo ssl_info2;
654 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
655 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info2.cert_status);
656 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
657 }
658
549 // NSS ports don't support client certificates 659 // NSS ports don't support client certificates
550 #if defined(USE_OPENSSL) 660 #if defined(USE_OPENSSL)
551 661
552 // This test executes Connect() on SSLClientSocket and Handshake() on 662 // This test executes Connect() on SSLClientSocket and Handshake() on
553 // SSLServerSocket to make sure handshaking between the two sockets is 663 // SSLServerSocket to make sure handshaking between the two sockets is
554 // completed successfully, using client certificate. 664 // completed successfully, using client certificate.
555 TEST_F(SSLServerSocketTest, HandshakeWithClientCert) { 665 TEST_F(SSLServerSocketTest, HandshakeWithClientCert) {
556 scoped_refptr<X509Certificate> client_cert = 666 scoped_refptr<X509Certificate> client_cert =
557 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName); 667 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
558 ConfigureClientCertsForClient(kClientCertFileName, kClientPrivateKeyFileName); 668 ConfigureClientCertsForClient(kClientCertFileName, kClientPrivateKeyFileName);
(...skipping 16 matching lines...) Expand all
575 685
576 // Make sure the cert status is expected. 686 // Make sure the cert status is expected.
577 SSLInfo ssl_info; 687 SSLInfo ssl_info;
578 client_socket_->GetSSLInfo(&ssl_info); 688 client_socket_->GetSSLInfo(&ssl_info);
579 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status); 689 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
580 server_socket_->GetSSLInfo(&ssl_info); 690 server_socket_->GetSSLInfo(&ssl_info);
581 EXPECT_TRUE(ssl_info.cert.get()); 691 EXPECT_TRUE(ssl_info.cert.get());
582 EXPECT_TRUE(client_cert->Equals(ssl_info.cert.get())); 692 EXPECT_TRUE(client_cert->Equals(ssl_info.cert.get()));
583 } 693 }
584 694
695 // This test executes Connect() on SSLClientSocket and Handshake() twice on
696 // SSLServerSocket to make sure handshaking between the two sockets is
697 // completed successfully, using client certificate. The second connection is
698 // expected to succeed through the session cache.
699 TEST_F(SSLServerSocketTest, HandshakeWithClientCertCached) {
700 scoped_refptr<X509Certificate> client_cert =
701 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
702 ConfigureClientCertsForClient(kClientCertFileName, kClientPrivateKeyFileName);
703 ConfigureClientCertsForServer(true);
704 Initialize();
705
706 TestCompletionCallback handshake_callback;
707 int server_ret = server_socket_->Handshake(handshake_callback.callback());
708 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
709
710 TestCompletionCallback connect_callback;
711 int client_ret = client_socket_->Connect(connect_callback.callback());
712 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
713
714 client_ret = connect_callback.GetResult(client_ret);
715 server_ret = handshake_callback.GetResult(server_ret);
716
717 ASSERT_EQ(OK, client_ret);
718 ASSERT_EQ(OK, server_ret);
719
720 // Make sure the cert status is expected.
721 SSLInfo ssl_info;
722 client_socket_->GetSSLInfo(&ssl_info);
723 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
724 server_socket_->GetSSLInfo(&ssl_info);
725 EXPECT_TRUE(ssl_info.cert.get());
726 EXPECT_TRUE(client_cert->Equals(ssl_info.cert.get()));
727 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
728 server_socket_->Disconnect();
729 client_socket_->Disconnect();
730
731 // Create the connection again
732 Initialize();
733
734 TestCompletionCallback handshake_callback2;
735 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
736 ASSERT_TRUE(server_ret2 == OK || server_ret2 == ERR_IO_PENDING);
737
738 TestCompletionCallback connect_callback2;
739 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
740 ASSERT_TRUE(client_ret2 == OK || client_ret2 == ERR_IO_PENDING);
741
742 client_ret2 = connect_callback2.GetResult(client_ret2);
743 server_ret2 = handshake_callback2.GetResult(server_ret2);
744
745 ASSERT_EQ(OK, client_ret2);
746 ASSERT_EQ(OK, server_ret2);
747
748 // Make sure the cert status is expected.
749 SSLInfo ssl_info2;
750 client_socket_->GetSSLInfo(&ssl_info2);
751 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info2.cert_status);
752 server_socket_->GetSSLInfo(&ssl_info2);
753 EXPECT_TRUE(ssl_info2.cert.get());
754 EXPECT_TRUE(client_cert->Equals(ssl_info2.cert.get()));
755 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
756 }
757
585 TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSupplied) { 758 TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSupplied) {
586 ConfigureClientCertsForServer(true); 759 ConfigureClientCertsForServer(true);
587 Initialize(); 760 Initialize();
588 // Use the default setting for the client socket, which is to not send 761 // Use the default setting for the client socket, which is to not send
589 // a client certificate. This will cause the client to receive an 762 // a client certificate. This will cause the client to receive an
590 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the 763 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the
591 // requested cert_authorities from the CertificateRequest sent by the 764 // requested cert_authorities from the CertificateRequest sent by the
592 // server. 765 // server.
593 766
594 TestCompletionCallback handshake_callback; 767 TestCompletionCallback handshake_callback;
(...skipping 12 matching lines...) Expand all
607 // handshake message is as expected. 780 // handshake message is as expected.
608 scoped_refptr<X509Certificate> client_cert = 781 scoped_refptr<X509Certificate> client_cert =
609 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName); 782 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
610 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities)); 783 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities));
611 784
612 client_socket_->Disconnect(); 785 client_socket_->Disconnect();
613 786
614 EXPECT_EQ(ERR_FAILED, handshake_callback.GetResult(server_ret)); 787 EXPECT_EQ(ERR_FAILED, handshake_callback.GetResult(server_ret));
615 } 788 }
616 789
790 TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSuppliedCached) {
791 ConfigureClientCertsForServer(true);
792 Initialize();
793 // Use the default setting for the client socket, which is to not send
794 // a client certificate. This will cause the client to receive an
795 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the
796 // requested cert_authorities from the CertificateRequest sent by the
797 // server.
798
799 TestCompletionCallback handshake_callback;
800 int server_ret = server_socket_->Handshake(handshake_callback.callback());
801 ASSERT_EQ(server_ret, ERR_IO_PENDING);
802
803 TestCompletionCallback connect_callback;
804 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
805 connect_callback.GetResult(
806 client_socket_->Connect(connect_callback.callback())));
807
808 scoped_refptr<SSLCertRequestInfo> request_info = new SSLCertRequestInfo();
809 client_socket_->GetSSLCertRequestInfo(request_info.get());
810
811 // Check that the authority name that arrived in the CertificateRequest
812 // handshake message is as expected.
813 scoped_refptr<X509Certificate> client_cert =
814 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
815 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities));
816
817 client_socket_->Disconnect();
818
819 EXPECT_EQ(ERR_FAILED, handshake_callback.GetResult(server_ret));
820 server_socket_->Disconnect();
821
822 // Below, check that the cache didn't store the result of a failed handshake
823 Initialize();
824
825 TestCompletionCallback handshake_callback2;
826 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
827 ASSERT_EQ(server_ret2, ERR_IO_PENDING);
828
829 TestCompletionCallback connect_callback2;
830 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
831 connect_callback2.GetResult(
832 client_socket_->Connect(connect_callback2.callback())));
833
834 scoped_refptr<SSLCertRequestInfo> request_info2 = new SSLCertRequestInfo();
835 client_socket_->GetSSLCertRequestInfo(request_info2.get());
836
837 // Check that the authority name that arrived in the CertificateRequest
838 // handshake message is as expected.
839 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info2->cert_authorities));
840
841 client_socket_->Disconnect();
842
843 EXPECT_EQ(ERR_FAILED, handshake_callback2.GetResult(server_ret2));
844 }
845
617 TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSupplied) { 846 TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSupplied) {
618 scoped_refptr<X509Certificate> client_cert = 847 scoped_refptr<X509Certificate> client_cert =
619 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName); 848 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
620 ConfigureClientCertsForClient(kWrongClientCertFileName, 849 ConfigureClientCertsForClient(kWrongClientCertFileName,
621 kWrongClientPrivateKeyFileName); 850 kWrongClientPrivateKeyFileName);
622 ConfigureClientCertsForServer(true); 851 ConfigureClientCertsForServer(true);
623 Initialize(); 852 Initialize();
624 853
625 TestCompletionCallback handshake_callback; 854 TestCompletionCallback handshake_callback;
626 int server_ret = server_socket_->Handshake(handshake_callback.callback()); 855 int server_ret = server_socket_->Handshake(handshake_callback.callback());
627 EXPECT_EQ(server_ret, ERR_IO_PENDING); 856 EXPECT_EQ(server_ret, ERR_IO_PENDING);
628 857
629 TestCompletionCallback connect_callback; 858 TestCompletionCallback connect_callback;
630 int client_ret = client_socket_->Connect(connect_callback.callback()); 859 int client_ret = client_socket_->Connect(connect_callback.callback());
631 860
632 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT, 861 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
633 connect_callback.GetResult(client_ret)); 862 connect_callback.GetResult(client_ret));
634 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT, 863 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
635 handshake_callback.GetResult(server_ret)); 864 handshake_callback.GetResult(server_ret));
636 } 865 }
866
867 TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSuppliedCached) {
868 scoped_refptr<X509Certificate> client_cert =
869 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
870 ConfigureClientCertsForClient(kWrongClientCertFileName,
871 kWrongClientPrivateKeyFileName);
872 ConfigureClientCertsForServer(true);
873 Initialize();
874
875 TestCompletionCallback handshake_callback;
876 int server_ret = server_socket_->Handshake(handshake_callback.callback());
877 EXPECT_EQ(server_ret, ERR_IO_PENDING);
878
879 TestCompletionCallback connect_callback;
880 int client_ret = client_socket_->Connect(connect_callback.callback());
881
882 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
883 connect_callback.GetResult(client_ret));
884 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
885 handshake_callback.GetResult(server_ret));
886
887 client_socket_->Disconnect();
888 server_socket_->Disconnect();
889
890 // Below, check that the cache didn't store the result of a failed handshake
891 Initialize();
892
893 TestCompletionCallback handshake_callback2;
894 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
895 EXPECT_EQ(server_ret, ERR_IO_PENDING);
896
897 TestCompletionCallback connect_callback2;
898 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
899
900 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
901 connect_callback2.GetResult(client_ret2));
902 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
903 handshake_callback2.GetResult(server_ret2));
904 }
637 #endif // defined(USE_OPENSSL) 905 #endif // defined(USE_OPENSSL)
638 906
639 TEST_F(SSLServerSocketTest, DataTransfer) { 907 TEST_F(SSLServerSocketTest, DataTransfer) {
640 Initialize(); 908 Initialize();
641 909
642 // Establish connection. 910 // Establish connection.
643 TestCompletionCallback connect_callback; 911 TestCompletionCallback connect_callback;
644 int client_ret = client_socket_->Connect(connect_callback.callback()); 912 int client_ret = client_socket_->Connect(connect_callback.callback());
645 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); 913 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
646 914
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 int server_ret = server_socket_->Handshake(handshake_callback.callback()); 1111 int server_ret = server_socket_->Handshake(handshake_callback.callback());
844 1112
845 client_ret = connect_callback.GetResult(client_ret); 1113 client_ret = connect_callback.GetResult(client_ret);
846 server_ret = handshake_callback.GetResult(server_ret); 1114 server_ret = handshake_callback.GetResult(server_ret);
847 1115
848 ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, client_ret); 1116 ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, client_ret);
849 ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, server_ret); 1117 ASSERT_EQ(ERR_SSL_VERSION_OR_CIPHER_MISMATCH, server_ret);
850 } 1118 }
851 1119
852 } // namespace net 1120 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698