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 |