| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 identities_set_(false) { | 246 identities_set_(false) { |
| 247 // Set use of the test RNG to get predictable loss patterns. | 247 // Set use of the test RNG to get predictable loss patterns. |
| 248 rtc::SetRandomTestMode(true); | 248 rtc::SetRandomTestMode(true); |
| 249 } | 249 } |
| 250 | 250 |
| 251 ~SSLStreamAdapterTestBase() { | 251 ~SSLStreamAdapterTestBase() { |
| 252 // Put it back for the next test. | 252 // Put it back for the next test. |
| 253 rtc::SetRandomTestMode(false); | 253 rtc::SetRandomTestMode(false); |
| 254 } | 254 } |
| 255 | 255 |
| 256 virtual void SetUp() override { | 256 void SetUp() override { |
| 257 CreateStreams(); | 257 CreateStreams(); |
| 258 | 258 |
| 259 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); | 259 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); |
| 260 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); | 260 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); |
| 261 | 261 |
| 262 // Set up the slots | 262 // Set up the slots |
| 263 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | 263 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); |
| 264 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); | 264 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); |
| 265 | 265 |
| 266 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) { | 266 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) { |
| 267 client_identity_ = rtc::SSLIdentity::FromPEMStrings( | 267 client_identity_ = rtc::SSLIdentity::FromPEMStrings( |
| 268 client_private_key_pem_, client_cert_pem_); | 268 client_private_key_pem_, client_cert_pem_); |
| 269 } else { | 269 } else { |
| 270 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_); | 270 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_); |
| 271 } | 271 } |
| 272 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_); | 272 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_); |
| 273 | 273 |
| 274 client_ssl_->SetIdentity(client_identity_); | 274 client_ssl_->SetIdentity(client_identity_); |
| 275 server_ssl_->SetIdentity(server_identity_); | 275 server_ssl_->SetIdentity(server_identity_); |
| 276 } | 276 } |
| 277 | 277 |
| 278 virtual void TearDown() override { | 278 void TearDown() override { |
| 279 client_ssl_.reset(nullptr); | 279 client_ssl_.reset(nullptr); |
| 280 server_ssl_.reset(nullptr); | 280 server_ssl_.reset(nullptr); |
| 281 } | 281 } |
| 282 | 282 |
| 283 virtual void CreateStreams() = 0; | 283 virtual void CreateStreams() = 0; |
| 284 | 284 |
| 285 // Recreate the client/server identities with the specified validity period. | 285 // Recreate the client/server identities with the specified validity period. |
| 286 // |not_before| and |not_after| are offsets from the current time in number | 286 // |not_before| and |not_after| are offsets from the current time in number |
| 287 // of seconds. | 287 // of seconds. |
| 288 void ResetIdentitiesWithValidity(int not_before, int not_after) { | 288 void ResetIdentitiesWithValidity(int not_before, int not_after) { |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 SSLStreamAdapterTestTLS() | 539 SSLStreamAdapterTestTLS() |
| 540 : SSLStreamAdapterTestBase("", | 540 : SSLStreamAdapterTestBase("", |
| 541 "", | 541 "", |
| 542 false, | 542 false, |
| 543 ::testing::get<0>(GetParam()), | 543 ::testing::get<0>(GetParam()), |
| 544 ::testing::get<1>(GetParam())), | 544 ::testing::get<1>(GetParam())), |
| 545 client_buffer_(kFifoBufferSize), | 545 client_buffer_(kFifoBufferSize), |
| 546 server_buffer_(kFifoBufferSize) { | 546 server_buffer_(kFifoBufferSize) { |
| 547 } | 547 } |
| 548 | 548 |
| 549 virtual void CreateStreams() override { | 549 void CreateStreams() override { |
| 550 client_stream_ = | 550 client_stream_ = |
| 551 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_); | 551 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_); |
| 552 server_stream_ = | 552 server_stream_ = |
| 553 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_); | 553 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_); |
| 554 } | 554 } |
| 555 | 555 |
| 556 // Test data transfer for TLS | 556 // Test data transfer for TLS |
| 557 virtual void TestTransfer(int size) { | 557 virtual void TestTransfer(int size) { |
| 558 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes"; | 558 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes"; |
| 559 // Create some dummy data to send. | 559 // Create some dummy data to send. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 char buffer[1600]; | 623 char buffer[1600]; |
| 624 size_t bread; | 624 size_t bread; |
| 625 int err2; | 625 int err2; |
| 626 rtc::StreamResult r; | 626 rtc::StreamResult r; |
| 627 | 627 |
| 628 for (;;) { | 628 for (;;) { |
| 629 r = stream->Read(buffer, sizeof(buffer), &bread, &err2); | 629 r = stream->Read(buffer, sizeof(buffer), &bread, &err2); |
| 630 | 630 |
| 631 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) { | 631 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) { |
| 632 // Unfortunately, errors are the way that the stream adapter | 632 // Unfortunately, errors are the way that the stream adapter |
| 633 // signals close in OpenSSL | 633 // signals close in OpenSSL. |
| 634 stream->Close(); | 634 stream->Close(); |
| 635 return; | 635 return; |
| 636 } | 636 } |
| 637 | 637 |
| 638 if (r == rtc::SR_BLOCK) | 638 if (r == rtc::SR_BLOCK) |
| 639 break; | 639 break; |
| 640 | 640 |
| 641 ASSERT_EQ(rtc::SR_SUCCESS, r); | 641 ASSERT_EQ(rtc::SR_SUCCESS, r); |
| 642 LOG(LS_INFO) << "Read " << bread; | 642 LOG(LS_INFO) << "Read " << bread; |
| 643 | 643 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 669 sent_(0) {} | 669 sent_(0) {} |
| 670 | 670 |
| 671 SSLStreamAdapterTestDTLS(const std::string& cert_pem, | 671 SSLStreamAdapterTestDTLS(const std::string& cert_pem, |
| 672 const std::string& private_key_pem) : | 672 const std::string& private_key_pem) : |
| 673 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true), | 673 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true), |
| 674 client_buffer_(kBufferCapacity, kDefaultBufferSize), | 674 client_buffer_(kBufferCapacity, kDefaultBufferSize), |
| 675 server_buffer_(kBufferCapacity, kDefaultBufferSize), | 675 server_buffer_(kBufferCapacity, kDefaultBufferSize), |
| 676 packet_size_(1000), count_(0), sent_(0) { | 676 packet_size_(1000), count_(0), sent_(0) { |
| 677 } | 677 } |
| 678 | 678 |
| 679 virtual void CreateStreams() override { | 679 void CreateStreams() override { |
| 680 client_stream_ = | 680 client_stream_ = |
| 681 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_); | 681 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_); |
| 682 server_stream_ = | 682 server_stream_ = |
| 683 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_); | 683 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_); |
| 684 } | 684 } |
| 685 | 685 |
| 686 virtual void WriteData() { | 686 virtual void WriteData() { |
| 687 unsigned char *packet = new unsigned char[1600]; | 687 unsigned char *packet = new unsigned char[1600]; |
| 688 | 688 |
| 689 while (sent_ < count_) { | 689 while (sent_ < count_) { |
| 690 memset(packet, sent_ & 0xff, packet_size_); | 690 unsigned int rand_state = sent_; |
| 691 *(reinterpret_cast<uint32_t *>(packet)) = sent_; | 691 packet[0] = sent_; |
| 692 for (size_t i = 1; i < packet_size_; i++) { |
| 693 // This is a simple LC PRNG. Keep in synch with identical code below. |
| 694 rand_state = (rand_state * 251 + 19937) >> 7; |
| 695 packet[i] = rand_state & 0xff; |
| 696 } |
| 692 | 697 |
| 693 size_t sent; | 698 size_t sent; |
| 694 int rv = client_ssl_->Write(packet, packet_size_, &sent, 0); | 699 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0); |
| 695 if (rv == rtc::SR_SUCCESS) { | 700 if (rv == rtc::SR_SUCCESS) { |
| 696 LOG(LS_VERBOSE) << "Sent: " << sent_; | 701 LOG(LS_VERBOSE) << "Sent: " << sent_; |
| 697 sent_++; | 702 sent_++; |
| 698 } else if (rv == rtc::SR_BLOCK) { | 703 } else if (rv == rtc::SR_BLOCK) { |
| 699 LOG(LS_VERBOSE) << "Blocked..."; | 704 LOG(LS_VERBOSE) << "Blocked..."; |
| 700 break; | 705 break; |
| 701 } else { | 706 } else { |
| 702 ADD_FAILURE(); | 707 ADD_FAILURE(); |
| 703 break; | 708 break; |
| 704 } | 709 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 724 } | 729 } |
| 725 | 730 |
| 726 if (r == rtc::SR_BLOCK) | 731 if (r == rtc::SR_BLOCK) |
| 727 break; | 732 break; |
| 728 | 733 |
| 729 ASSERT_EQ(rtc::SR_SUCCESS, r); | 734 ASSERT_EQ(rtc::SR_SUCCESS, r); |
| 730 LOG(LS_INFO) << "Read " << bread; | 735 LOG(LS_INFO) << "Read " << bread; |
| 731 | 736 |
| 732 // Now parse the datagram | 737 // Now parse the datagram |
| 733 ASSERT_EQ(packet_size_, bread); | 738 ASSERT_EQ(packet_size_, bread); |
| 734 unsigned char* ptr_to_buffer = buffer; | 739 unsigned char packet_num = buffer[0]; |
| 735 uint32_t packet_num = *(reinterpret_cast<uint32_t *>(ptr_to_buffer)); | |
| 736 | 740 |
| 737 for (size_t i = 4; i < packet_size_; i++) { | 741 unsigned int rand_state = packet_num; |
| 738 ASSERT_EQ((packet_num & 0xff), buffer[i]); | 742 for (size_t i = 1; i < packet_size_; i++) { |
| 743 // This is a simple LC PRNG. Keep in synch with identical code above. |
| 744 rand_state = (rand_state * 251 + 19937) >> 7; |
| 745 ASSERT_EQ(rand_state & 0xff, buffer[i]); |
| 739 } | 746 } |
| 740 received_.insert(packet_num); | 747 received_.insert(packet_num); |
| 741 } | 748 } |
| 742 } | 749 } |
| 743 | 750 |
| 744 virtual void TestTransfer(int count) { | 751 virtual void TestTransfer(int count) { |
| 745 count_ = count; | 752 count_ = count; |
| 746 | 753 |
| 747 WriteData(); | 754 WriteData(); |
| 748 | 755 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 765 BufferQueueStream server_buffer_; | 772 BufferQueueStream server_buffer_; |
| 766 size_t packet_size_; | 773 size_t packet_size_; |
| 767 int count_; | 774 int count_; |
| 768 int sent_; | 775 int sent_; |
| 769 std::set<int> received_; | 776 std::set<int> received_; |
| 770 }; | 777 }; |
| 771 | 778 |
| 772 | 779 |
| 773 rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len, | 780 rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len, |
| 774 size_t* written, int* error) { | 781 size_t* written, int* error) { |
| 775 *written = data_len; | |
| 776 | |
| 777 LOG(LS_INFO) << "Writing to loopback " << data_len; | 782 LOG(LS_INFO) << "Writing to loopback " << data_len; |
| 778 | 783 |
| 779 if (first_packet_) { | 784 if (first_packet_) { |
| 780 first_packet_ = false; | 785 first_packet_ = false; |
| 781 if (test_base_->GetLoseFirstPacket()) { | 786 if (test_base_->GetLoseFirstPacket()) { |
| 782 LOG(LS_INFO) << "Losing initial packet of length " << data_len; | 787 LOG(LS_INFO) << "Losing initial packet of length " << data_len; |
| 788 *written = data_len; // Fake successful writing also to writer. |
| 783 return rtc::SR_SUCCESS; | 789 return rtc::SR_SUCCESS; |
| 784 } | 790 } |
| 785 } | 791 } |
| 786 | 792 |
| 787 return test_base_->DataWritten(this, data, data_len, written, error); | 793 return test_base_->DataWritten(this, data, data_len, written, error); |
| 788 }; | 794 }; |
| 789 | 795 |
| 790 class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS { | 796 class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS { |
| 791 public: | 797 public: |
| 792 SSLStreamAdapterTestDTLSFromPEMStrings() : | 798 SSLStreamAdapterTestDTLSFromPEMStrings() : |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1005 // Test expired certificates are not rejected. | 1011 // Test expired certificates are not rejected. |
| 1006 TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) { | 1012 TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) { |
| 1007 MAYBE_SKIP_TEST(HaveDtls); | 1013 MAYBE_SKIP_TEST(HaveDtls); |
| 1008 long one_day = 60 * 60 * 24; | 1014 long one_day = 60 * 60 * 24; |
| 1009 // Make the certificates already expired. | 1015 // Make the certificates already expired. |
| 1010 ResetIdentitiesWithValidity(-one_day, -one_day); | 1016 ResetIdentitiesWithValidity(-one_day, -one_day); |
| 1011 TestHandshake(); | 1017 TestHandshake(); |
| 1012 } | 1018 } |
| 1013 | 1019 |
| 1014 // Test data transfer using certs created from strings. | 1020 // Test data transfer using certs created from strings. |
| 1015 TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) { | 1021 TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) { |
| 1016 MAYBE_SKIP_TEST(HaveDtls); | 1022 MAYBE_SKIP_TEST(HaveDtls); |
| 1017 TestHandshake(); | 1023 TestHandshake(); |
| 1018 TestTransfer(100); | 1024 TestTransfer(100); |
| 1019 } | 1025 } |
| 1020 | 1026 |
| 1021 // Test getting the remote certificate. | 1027 // Test getting the remote certificate. |
| 1022 TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) { | 1028 TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) { |
| 1023 MAYBE_SKIP_TEST(HaveDtls); | 1029 MAYBE_SKIP_TEST(HaveDtls); |
| 1024 | 1030 |
| 1025 // Peer certificates haven't been received yet. | 1031 // Peer certificates haven't been received yet. |
| 1026 rtc::scoped_ptr<rtc::SSLCertificate> client_peer_cert; | 1032 rtc::scoped_ptr<rtc::SSLCertificate> client_peer_cert; |
| 1027 ASSERT_FALSE(GetPeerCertificate(true, client_peer_cert.accept())); | 1033 ASSERT_FALSE(GetPeerCertificate(true, client_peer_cert.accept())); |
| 1028 ASSERT_FALSE(client_peer_cert != NULL); | 1034 ASSERT_FALSE(client_peer_cert != NULL); |
| 1029 | 1035 |
| 1030 rtc::scoped_ptr<rtc::SSLCertificate> server_peer_cert; | 1036 rtc::scoped_ptr<rtc::SSLCertificate> server_peer_cert; |
| 1031 ASSERT_FALSE(GetPeerCertificate(false, server_peer_cert.accept())); | 1037 ASSERT_FALSE(GetPeerCertificate(false, server_peer_cert.accept())); |
| 1032 ASSERT_FALSE(server_peer_cert != NULL); | 1038 ASSERT_FALSE(server_peer_cert != NULL); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1145 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); | 1151 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); |
| 1146 INSTANTIATE_TEST_CASE_P( | 1152 INSTANTIATE_TEST_CASE_P( |
| 1147 SSLStreamAdapterTestsDTLS, | 1153 SSLStreamAdapterTestsDTLS, |
| 1148 SSLStreamAdapterTestDTLS, | 1154 SSLStreamAdapterTestDTLS, |
| 1149 Combine(Values(rtc::KeyParams::RSA(1024, 65537), | 1155 Combine(Values(rtc::KeyParams::RSA(1024, 65537), |
| 1150 rtc::KeyParams::RSA(1152, 65537), | 1156 rtc::KeyParams::RSA(1152, 65537), |
| 1151 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), | 1157 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), |
| 1152 Values(rtc::KeyParams::RSA(1024, 65537), | 1158 Values(rtc::KeyParams::RSA(1024, 65537), |
| 1153 rtc::KeyParams::RSA(1152, 65537), | 1159 rtc::KeyParams::RSA(1152, 65537), |
| 1154 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); | 1160 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); |
| OLD | NEW |