1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2011 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <algorithm> 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <set> 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <string> 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 16e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch#include "webrtc/base/bufferqueue.h" 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/gunit.h" 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/helpers.h" 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/ssladapter.h" 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/sslconfig.h" 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/sslidentity.h" 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/sslstreamadapter.h" 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/stream.h" 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 26b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlundusing ::testing::WithParamInterface; 27b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlundusing ::testing::Values; 28b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlundusing ::testing::Combine; 29b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlundusing ::testing::tuple; 30b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int kBlockSize = 4096; 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const char kExporterLabel[] = "label"; 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const unsigned char kExporterContext[] = "context"; 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic int kExporterContextLen = sizeof(kExporterContext); 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const char kRSA_PRIVATE_KEY_PEM[] = 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "-----BEGIN RSA PRIVATE KEY-----\n" 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n" 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n" 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n" 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n" 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n" 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n" 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n" 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n" 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n" 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n" 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n" 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n" 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n" 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "UCXiYxSsu20QNVw=\n" 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "-----END RSA PRIVATE KEY-----\n"; 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const char kCERT_PEM[] = 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "-----BEGIN CERTIFICATE-----\n" 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n" 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n" 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n" 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n" 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n" 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n" 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n" 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n" 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n" 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org "-----END CERTIFICATE-----\n"; 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define MAYBE_SKIP_TEST(feature) \ 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!(rtc::SSLStreamAdapter::feature())) { \ 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Feature disabled... skipping"; \ 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; \ 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass SSLStreamAdapterTestBase; 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 75e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchclass SSLDummyStreamBase : public rtc::StreamInterface, 76e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch public sigslot::has_slots<> { 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 78e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamBase(SSLStreamAdapterTestBase* test, 79e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch const std::string &side, 80e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamInterface* in, 81e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamInterface* out) : 82e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch test_base_(test), 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org side_(side), 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org in_(in), 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org out_(out), 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org first_packet_(true) { 87e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn); 88e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut); 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 91e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamState GetState() const override { return rtc::SS_OPEN; } 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 93e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamResult Read(void* buffer, size_t buffer_len, 94e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch size_t* read, int* error) override { 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::StreamResult r; 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org r = in_->Read(buffer, buffer_len, read, error); 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r == rtc::SR_BLOCK) 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_BLOCK; 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r == rtc::SR_EOS) 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_EOS; 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r != rtc::SR_SUCCESS) { 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADD_FAILURE(); 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_ERROR; 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_SUCCESS; 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Catch readability events on in and pass them up. 112e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch void OnEventIn(rtc::StreamInterface* stream, int sig, int err) { 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int mask = (rtc::SE_READ | rtc::SE_CLOSE); 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (sig & mask) { 116e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig=" 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << sig << " forwarding upward"; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org PostEvent(sig & mask, 0); 119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Catch writeability events on out and pass them up. 123e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch void OnEventOut(rtc::StreamInterface* stream, int sig, int err) { 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (sig & rtc::SE_WRITE) { 125e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig=" 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org << sig << " forwarding upward"; 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org PostEvent(sig & rtc::SE_WRITE, 0); 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Write to the outgoing FifoBuffer 133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::StreamResult WriteData(const void* data, size_t data_len, 134e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch size_t* written, int* error) { 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return out_->Write(data, data_len, written, error); 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 138e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamResult Write(const void* data, size_t data_len, 139e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch size_t* written, int* error) override; 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 141e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch void Close() override { 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Closing outbound stream"; 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org out_->Close(); 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 146e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch protected: 147e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLStreamAdapterTestBase* test_base_; 148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const std::string side_; 149e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamInterface* in_; 150e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamInterface* out_; 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool first_packet_; 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 154e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchclass SSLDummyStreamTLS : public SSLDummyStreamBase { 155e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch public: 156e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamTLS(SSLStreamAdapterTestBase* test, 157e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch const std::string& side, 158e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::FifoBuffer* in, 159e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::FifoBuffer* out) : 160e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamBase(test, side, in, out) { 161e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 162e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch}; 163e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 164e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchclass BufferQueueStream : public rtc::BufferQueue, 165e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch public rtc::StreamInterface { 166e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch public: 167e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch BufferQueueStream(size_t capacity, size_t default_size) 168e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch : rtc::BufferQueue(capacity, default_size) { 169e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 170e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 171e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch // Implementation of abstract StreamInterface methods. 172e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 173e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch // A buffer queue stream is always "open". 174e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamState GetState() const override { return rtc::SS_OPEN; } 175e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 176e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch // Reading a buffer queue stream will either succeed or block. 177e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamResult Read(void* buffer, size_t buffer_len, 178e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch size_t* read, int* error) override { 179e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch if (!ReadFront(buffer, buffer_len, read)) { 180e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch return rtc::SR_BLOCK; 181e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 182e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch return rtc::SR_SUCCESS; 183e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 184e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 185e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch // Writing to a buffer queue stream will either succeed or block. 186e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamResult Write(const void* data, size_t data_len, 187e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch size_t* written, int* error) override { 188e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch if (!WriteBack(data, data_len, written)) { 189e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch return rtc::SR_BLOCK; 190e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 191e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch return rtc::SR_SUCCESS; 192e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 193e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 194e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch // A buffer queue stream can not be closed. 195e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch void Close() override {} 196e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 197e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch protected: 198e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch void NotifyReadableForTest() override { 199e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch PostEvent(rtc::SE_READ, 0); 200e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 201e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 202e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch void NotifyWritableForTest() override { 203e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch PostEvent(rtc::SE_WRITE, 0); 204e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 205e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch}; 206e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 207e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchclass SSLDummyStreamDTLS : public SSLDummyStreamBase { 208e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch public: 209e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test, 210e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch const std::string& side, 211e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch BufferQueueStream* in, 212e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch BufferQueueStream* out) : 213e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamBase(test, side, in, out) { 214e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 215e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch}; 216e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int kFifoBufferSize = 4096; 218e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchstatic const int kBufferCapacity = 1; 219e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchstatic const size_t kDefaultBufferSize = 2048; 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass SSLStreamAdapterTestBase : public testing::Test, 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public sigslot::has_slots<> { 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 2244e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng SSLStreamAdapterTestBase( 2254e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng const std::string& client_cert_pem, 2264e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng const std::string& client_private_key_pem, 2274e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng bool dtls, 2284e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT), 2294e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT)) 230e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch : client_cert_pem_(client_cert_pem), 231e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_private_key_pem_(client_private_key_pem), 232e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_key_type_(client_key_type), 233e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_key_type_(server_key_type), 234e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_stream_(NULL), 235e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_stream_(NULL), 236b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund client_identity_(NULL), 237b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund server_identity_(NULL), 238b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund delay_(0), 239b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund mtu_(1460), 240b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund loss_(0), 241b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund lose_first_packet_(false), 242b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund damage_(false), 243b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund dtls_(dtls), 244b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund handshake_wait_(5000), 245b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund identities_set_(false) { 246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Set use of the test RNG to get predictable loss patterns. 247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SetRandomTestMode(true); 248e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 249e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 250e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch ~SSLStreamAdapterTestBase() { 251e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch // Put it back for the next test. 252e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::SetRandomTestMode(false); 253e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 254e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 2557593aad1634c2ab88351a56eca108cb6af9a274etorbjorng void SetUp() override { 256e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch CreateStreams(); 257e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 258e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); 259e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); 260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Set up the slots 262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); 263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); 264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 265e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) { 266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_identity_ = rtc::SSLIdentity::FromPEMStrings( 267e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_private_key_pem_, client_cert_pem_); 268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 269e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_); 270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 271e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_); 272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->SetIdentity(client_identity_); 274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_->SetIdentity(server_identity_); 275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 276f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 2777593aad1634c2ab88351a56eca108cb6af9a274etorbjorng void TearDown() override { 278e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_ssl_.reset(nullptr); 279e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_ssl_.reset(nullptr); 280f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 282e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch virtual void CreateStreams() = 0; 283e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 284f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Recreate the client/server identities with the specified validity period. 285f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // |not_before| and |not_after| are offsets from the current time in number 286f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // of seconds. 287f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void ResetIdentitiesWithValidity(int not_before, int not_after) { 288e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch CreateStreams(); 289f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 290f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_)); 291f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_)); 292f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 293f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); 294f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent); 295f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 29646c9cc01901ecd3af0191872f9660b710d5fe757Torbjorn Granlund time_t now = time(nullptr); 29746c9cc01901ecd3af0191872f9660b710d5fe757Torbjorn Granlund 298f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSLIdentityParams client_params; 2994e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT); 300f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_params.common_name = "client"; 30146c9cc01901ecd3af0191872f9660b710d5fe757Torbjorn Granlund client_params.not_before = now + not_before; 30246c9cc01901ecd3af0191872f9660b710d5fe757Torbjorn Granlund client_params.not_after = now + not_after; 303f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params); 304f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 305f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSLIdentityParams server_params; 3064e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT); 307f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_params.common_name = "server"; 30846c9cc01901ecd3af0191872f9660b710d5fe757Torbjorn Granlund server_params.not_before = now + not_before; 30946c9cc01901ecd3af0191872f9660b710d5fe757Torbjorn Granlund server_params.not_after = now + not_after; 310f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params); 311f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 312f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->SetIdentity(client_identity_); 313f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_->SetIdentity(server_identity_); 314f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 315f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 316f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) { 317f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig; 318f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 319f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (sig & rtc::SE_READ) { 320f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ReadData(stream); 321f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 322f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 323f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) { 324f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteData(); 325f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 326f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 327f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 328f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetPeerIdentitiesByDigest(bool correct) { 329f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned char digest[20]; 330f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t digest_len; 331f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool rv; 332f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 333f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Setting peer identities by digest"; 334f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 335f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = server_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1, 336f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org digest, 20, 337f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org &digest_len); 338f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(rv); 339f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!correct) { 340f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Setting bogus digest for server cert"; 341f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org digest[0]++; 342f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 343f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest, 344f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org digest_len); 345f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(rv); 346f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 347f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 348f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = client_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1, 349f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org digest, 20, &digest_len); 350f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(rv); 351f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!correct) { 352f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Setting bogus digest for client cert"; 353f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org digest[0]++; 354f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 355f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest, 356f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org digest_len); 357f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(rv); 358f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 359f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org identities_set_ = true; 360f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 361f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 362831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch void SetupProtocolVersions(rtc::SSLProtocolVersion server_version, 363831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch rtc::SSLProtocolVersion client_version) { 364831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch server_ssl_->SetMaxProtocolVersion(server_version); 365831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch client_ssl_->SetMaxProtocolVersion(client_version); 366831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch } 367831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 368f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void TestHandshake(bool expect_success = true) { 369f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : 370f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSL_MODE_TLS); 371f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : 372f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSL_MODE_TLS); 373f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 374f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!dtls_) { 375f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make sure we simulate a reliable network for TLS. 376f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // This is just a check to make sure that people don't write wrong 377f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // tests. 378f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0)); 379f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 380f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 381f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!identities_set_) 382f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetPeerIdentitiesByDigest(true); 383f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 384f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Start the handshake 385f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int rv; 386f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 387f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_ssl_->SetServerRole(); 388f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = server_ssl_->StartSSLWithPeer(); 389f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(0, rv); 390f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 391f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = client_ssl_->StartSSLWithPeer(); 392f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(0, rv); 393f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 394f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Now run the handshake 395f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (expect_success) { 396f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) 397f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org && (server_ssl_->GetState() == rtc::SS_OPEN), 398f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org handshake_wait_); 399f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 400f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED, 401f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org handshake_wait_); 402f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 403f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 404f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 405e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data, 406e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch size_t data_len, size_t *written, 407e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch int *error) { 408f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Randomly drop loss_ percent of packets 4090c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) { 410f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len; 411f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *written = data_len; 412f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_SUCCESS; 413f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 414f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (dtls_ && (data_len > mtu_)) { 415f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len; 416f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *written = data_len; 417f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_SUCCESS; 418f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 419f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 420f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Optionally damage application data (type 23). Note that we don't damage 421f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // handshake packets and we damage the last byte to keep the header 422f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // intact but break the MAC. 423f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) { 424f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::vector<char> buf(data_len); 425f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 426f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Damaging packet"; 427f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 428f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memcpy(&buf[0], data, data_len); 429f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org buf[data_len - 1]++; 430f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 431f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return from->WriteData(&buf[0], data_len, written, error); 432f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 433f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 434f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return from->WriteData(data, data_len, written, error); 435f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 436f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 437f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetDelay(int delay) { 438f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delay_ = delay; 439f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 440f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int GetDelay() { return delay_; } 441f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 442f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetLoseFirstPacket(bool lose) { 443f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org lose_first_packet_ = lose; 444f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 445f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool GetLoseFirstPacket() { return lose_first_packet_; } 446f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 447f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetLoss(int percent) { 448f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org loss_ = percent; 449f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 450f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 451f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetDamage() { 452f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org damage_ = true; 453f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 454f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 455f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetMtu(size_t mtu) { 456f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org mtu_ = mtu; 457f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 458f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 459f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetHandshakeWait(int wait) { 460f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org handshake_wait_ = wait; 461f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 462f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 463521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) { 464f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (client) 465521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh client_ssl_->SetDtlsSrtpCryptoSuites(ciphers); 466f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org else 467521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh server_ssl_->SetDtlsSrtpCryptoSuites(ciphers); 468f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 469f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 470521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh bool GetDtlsSrtpCryptoSuite(bool client, int* retval) { 471f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (client) 472521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh return client_ssl_->GetDtlsSrtpCryptoSuite(retval); 473f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org else 474521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh return server_ssl_->GetDtlsSrtpCryptoSuite(retval); 475f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 476f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 477f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool GetPeerCertificate(bool client, rtc::SSLCertificate** cert) { 478f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (client) 479f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return client_ssl_->GetPeerCertificate(cert); 480f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org else 481f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return server_ssl_->GetPeerCertificate(cert); 482f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 483f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 4846caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh bool GetSslCipherSuite(bool client, int* retval) { 4853ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org if (client) 486456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh return client_ssl_->GetSslCipherSuite(retval); 4873ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org else 488456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh return server_ssl_->GetSslCipherSuite(retval); 4893ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org } 4903ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org 491f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool ExportKeyingMaterial(const char *label, 492f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const unsigned char *context, 493f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t context_len, 494f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool use_context, 495f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool client, 496f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned char *result, 497f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t result_len) { 498f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (client) 499f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return client_ssl_->ExportKeyingMaterial(label, 500f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org context, context_len, 501f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org use_context, 502f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result, result_len); 503f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org else 504f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return server_ssl_->ExportKeyingMaterial(label, 505f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org context, context_len, 506f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org use_context, 507f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result, result_len); 508f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 509f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 510f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // To be implemented by subclasses. 511f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void WriteData() = 0; 512f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void ReadData(rtc::StreamInterface *stream) = 0; 513f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void TestTransfer(int size) = 0; 514f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 515f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 516e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch std::string client_cert_pem_; 517e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch std::string client_private_key_pem_; 518e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::KeyParams client_key_type_; 519e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::KeyParams server_key_type_; 520e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamBase *client_stream_; // freed by client_ssl_ destructor 521e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch SSLDummyStreamBase *server_stream_; // freed by server_ssl_ destructor 522f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::scoped_ptr<rtc::SSLStreamAdapter> client_ssl_; 523f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::scoped_ptr<rtc::SSLStreamAdapter> server_ssl_; 524f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor 525f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor 526f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int delay_; 527f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t mtu_; 528f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int loss_; 529f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool lose_first_packet_; 530f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool damage_; 531f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool dtls_; 532f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int handshake_wait_; 533f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool identities_set_; 534f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 535f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 536b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlundclass SSLStreamAdapterTestTLS 537b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund : public SSLStreamAdapterTestBase, 5384e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> { 539f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 540b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund SSLStreamAdapterTestTLS() 541b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund : SSLStreamAdapterTestBase("", 542b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund "", 543b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund false, 544b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund ::testing::get<0>(GetParam()), 545e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch ::testing::get<1>(GetParam())), 546e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_buffer_(kFifoBufferSize), 547e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_buffer_(kFifoBufferSize) { 548e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 549e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 5507593aad1634c2ab88351a56eca108cb6af9a274etorbjorng void CreateStreams() override { 551e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_stream_ = 552e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_); 553e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_stream_ = 554e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_); 555e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 556f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 557f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Test data transfer for TLS 558f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void TestTransfer(int size) { 559f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Starting transfer test with " << size << " bytes"; 560f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Create some dummy data to send. 561f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t received; 562f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 563f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.ReserveSize(size); 564f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (int i = 0; i < size; ++i) { 565f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char ch = static_cast<char>(i); 566f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.Write(&ch, 1, NULL, NULL); 567f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 568f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.Rewind(); 569f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 570f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Prepare the receive stream. 571f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_stream_.ReserveSize(size); 572f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 573f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Start sending 574f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteData(); 575f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 576f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Wait for the client to close 577f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000); 578f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 579f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Now check the data 580f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_stream_.GetSize(&received); 581f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 582f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(static_cast<size_t>(size), received); 583f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(), 584f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_stream_.GetBuffer(), size)); 585f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 586f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 587f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void WriteData() { 588f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t position, tosend, size; 589f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::StreamResult rv; 590f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t sent; 591f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char block[kBlockSize]; 592f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 593f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.GetSize(&size); 594f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!size) 595f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; 596f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 597f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (;;) { 598f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.GetPosition(&position); 599f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (send_stream_.Read(block, sizeof(block), &tosend, NULL) != 600f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SR_EOS) { 601f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = client_ssl_->Write(block, tosend, &sent, 0); 602f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 603f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (rv == rtc::SR_SUCCESS) { 604f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.SetPosition(position + sent); 605f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "Sent: " << position + sent; 606f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else if (rv == rtc::SR_BLOCK) { 607f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "Blocked..."; 608f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org send_stream_.SetPosition(position); 609f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 610f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 611f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADD_FAILURE(); 612f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 613f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 614f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 615f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Now close 616f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Wrote " << position << " bytes. Closing"; 617f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->Close(); 618f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 619f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 620f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 621f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 622f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 623f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void ReadData(rtc::StreamInterface *stream) { 624f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char buffer[1600]; 625f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t bread; 626f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int err2; 627f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::StreamResult r; 628f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 629f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (;;) { 630f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org r = stream->Read(buffer, sizeof(buffer), &bread, &err2); 631f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 632f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r == rtc::SR_ERROR || r == rtc::SR_EOS) { 633f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Unfortunately, errors are the way that the stream adapter 6347593aad1634c2ab88351a56eca108cb6af9a274etorbjorng // signals close in OpenSSL. 635f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org stream->Close(); 636f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; 637f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 638f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 639f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r == rtc::SR_BLOCK) 640f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 641f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 642f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(rtc::SR_SUCCESS, r); 643f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Read " << bread; 644f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 645f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org recv_stream_.Write(buffer, bread, NULL, NULL); 646f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 647f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 648f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 649f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 650e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::FifoBuffer client_buffer_; 651e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch rtc::FifoBuffer server_buffer_; 652f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::MemoryStream send_stream_; 653f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::MemoryStream recv_stream_; 654f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 655f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 656b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlundclass SSLStreamAdapterTestDTLS 657b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund : public SSLStreamAdapterTestBase, 6584e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> { 659f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 660b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund SSLStreamAdapterTestDTLS() 661b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund : SSLStreamAdapterTestBase("", 662b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund "", 663b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund true, 664b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund ::testing::get<0>(GetParam()), 665b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund ::testing::get<1>(GetParam())), 666e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_buffer_(kBufferCapacity, kDefaultBufferSize), 667e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_buffer_(kBufferCapacity, kDefaultBufferSize), 668b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund packet_size_(1000), 669b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund count_(0), 670b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund sent_(0) {} 671f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 672f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SSLStreamAdapterTestDTLS(const std::string& cert_pem, 673f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const std::string& private_key_pem) : 674f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SSLStreamAdapterTestBase(cert_pem, private_key_pem, true), 675e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_buffer_(kBufferCapacity, kDefaultBufferSize), 676e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_buffer_(kBufferCapacity, kDefaultBufferSize), 677f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org packet_size_(1000), count_(0), sent_(0) { 678f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 679f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 6807593aad1634c2ab88351a56eca108cb6af9a274etorbjorng void CreateStreams() override { 681e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch client_stream_ = 682e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_); 683e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch server_stream_ = 684e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_); 685e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 686e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch 687f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void WriteData() { 688f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned char *packet = new unsigned char[1600]; 689f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 690e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch while (sent_ < count_) { 6917593aad1634c2ab88351a56eca108cb6af9a274etorbjorng unsigned int rand_state = sent_; 6927593aad1634c2ab88351a56eca108cb6af9a274etorbjorng packet[0] = sent_; 6937593aad1634c2ab88351a56eca108cb6af9a274etorbjorng for (size_t i = 1; i < packet_size_; i++) { 6947593aad1634c2ab88351a56eca108cb6af9a274etorbjorng // This is a simple LC PRNG. Keep in synch with identical code below. 6957593aad1634c2ab88351a56eca108cb6af9a274etorbjorng rand_state = (rand_state * 251 + 19937) >> 7; 6967593aad1634c2ab88351a56eca108cb6af9a274etorbjorng packet[i] = rand_state & 0xff; 6977593aad1634c2ab88351a56eca108cb6af9a274etorbjorng } 698f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 699f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t sent; 7007593aad1634c2ab88351a56eca108cb6af9a274etorbjorng rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0); 701f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (rv == rtc::SR_SUCCESS) { 702f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "Sent: " << sent_; 703f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org sent_++; 704f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else if (rv == rtc::SR_BLOCK) { 705f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_VERBOSE) << "Blocked..."; 706f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 707f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 708f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ADD_FAILURE(); 709f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 710f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 711e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch } 712f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 713f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete [] packet; 714f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 715f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 716f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void ReadData(rtc::StreamInterface *stream) { 717f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned char buffer[2000]; 718f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t bread; 719f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int err2; 720f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::StreamResult r; 721f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 722f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org for (;;) { 723f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org r = stream->Read(buffer, 2000, &bread, &err2); 724f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 725f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r == rtc::SR_ERROR) { 726f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Unfortunately, errors are the way that the stream adapter 727f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // signals close right now 728f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org stream->Close(); 729f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return; 730f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 731f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 732f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (r == rtc::SR_BLOCK) 733f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org break; 734f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 735f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(rtc::SR_SUCCESS, r); 736f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Read " << bread; 737f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 738f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Now parse the datagram 739f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(packet_size_, bread); 7407593aad1634c2ab88351a56eca108cb6af9a274etorbjorng unsigned char packet_num = buffer[0]; 741f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 7427593aad1634c2ab88351a56eca108cb6af9a274etorbjorng unsigned int rand_state = packet_num; 7437593aad1634c2ab88351a56eca108cb6af9a274etorbjorng for (size_t i = 1; i < packet_size_; i++) { 7447593aad1634c2ab88351a56eca108cb6af9a274etorbjorng // This is a simple LC PRNG. Keep in synch with identical code above. 7457593aad1634c2ab88351a56eca108cb6af9a274etorbjorng rand_state = (rand_state * 251 + 19937) >> 7; 7467593aad1634c2ab88351a56eca108cb6af9a274etorbjorng ASSERT_EQ(rand_state & 0xff, buffer[i]); 747f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 748f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org received_.insert(packet_num); 749f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 750f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 751f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 752f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual void TestTransfer(int count) { 753f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org count_ = count; 754f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 755f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteData(); 756f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 757f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_TRUE_WAIT(sent_ == count_, 10000); 758f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "sent_ == " << sent_; 759f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 760f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (damage_) { 761f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WAIT(false, 2000); 762f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ(0U, received_.size()); 763f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else if (loss_ == 0) { 764f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000); 765f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 766f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Sent " << sent_ << " packets; received " << 767f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org received_.size(); 768f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 769f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 770f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 771f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 772e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch BufferQueueStream client_buffer_; 773e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch BufferQueueStream server_buffer_; 774f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t packet_size_; 775f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int count_; 776f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int sent_; 777f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::set<int> received_; 778f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 779f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 780f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 781e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchrtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len, 782f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t* written, int* error) { 783f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Writing to loopback " << data_len; 784f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 785f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (first_packet_) { 786f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org first_packet_ = false; 787e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch if (test_base_->GetLoseFirstPacket()) { 788f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org LOG(LS_INFO) << "Losing initial packet of length " << data_len; 7897593aad1634c2ab88351a56eca108cb6af9a274etorbjorng *written = data_len; // Fake successful writing also to writer. 790f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return rtc::SR_SUCCESS; 791f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 792f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 793f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 794e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauch return test_base_->DataWritten(this, data, data_len, written, error); 795f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 796f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 797f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS { 798f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 799f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SSLStreamAdapterTestDTLSFromPEMStrings() : 800f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) { 801f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 802f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 803f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 804f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Basic tests: TLS 805f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 806f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that we can make a handshake work 807b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) { 808f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 809f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 810f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 811f1d751c7dede158bc9770e4d7c4cb07191ffdf3fjiayl@webrtc.org// Test that closing the connection on one side updates the other side. 812b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestTLS, TestTLSClose) { 813f1d751c7dede158bc9770e4d7c4cb07191ffdf3fjiayl@webrtc.org TestHandshake(); 814f1d751c7dede158bc9770e4d7c4cb07191ffdf3fjiayl@webrtc.org client_ssl_->Close(); 815f1d751c7dede158bc9770e4d7c4cb07191ffdf3fjiayl@webrtc.org EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_); 816f1d751c7dede158bc9770e4d7c4cb07191ffdf3fjiayl@webrtc.org}; 817f1d751c7dede158bc9770e4d7c4cb07191ffdf3fjiayl@webrtc.org 818f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test transfer -- trivial 819b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) { 820f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 821f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestTransfer(100000); 822f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 823f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 824f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test read-write after close. 825b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) { 826f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 827f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestTransfer(100000); 828f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_ssl_->Close(); 829f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 830f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::StreamResult rv; 831f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char block[kBlockSize]; 832f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_t dummy; 833f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 834f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It's an error to write after closed. 835f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL); 836f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(rtc::SR_ERROR, rv); 837f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 838f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // But after closed read gives you EOS. 839f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL); 840f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(rtc::SR_EOS, rv); 841f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 842f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 843f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test a handshake with a bogus peer digest 844b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) { 845f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetPeerIdentitiesByDigest(false); 846f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(false); 847f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 848f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 849f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test moving a bunch of data 850f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 851f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Basic tests: DTLS 852f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that we can make a handshake work 853b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) { 854f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 855f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 856f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 857f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 858f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test that we can make a handshake work if the first packet in 859f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// each direction is lost. This gives us predictable loss 860f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// rather than having to tune random 861b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) { 862f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 863f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetLoseFirstPacket(true); 864f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 865f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 866f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 867f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test a handshake with loss and delay 868b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) { 869f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 870f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetLoseFirstPacket(true); 871f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetDelay(2000); 872f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetHandshakeWait(20000); 873f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 874f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 875f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 876f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test a handshake with small MTU 877127ca3f8e5df9cd9c8a77dbf243ca5d99fbe7d96pbos@webrtc.org// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910 878b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) { 879f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 880f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetMtu(700); 881f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetHandshakeWait(20000); 882f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 883f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 884f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 885f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test transfer -- trivial 886e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchTEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) { 887f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 888f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 889f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestTransfer(100); 890f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 891f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 892e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchTEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) { 893f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 894f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 895f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetLoss(10); 896f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestTransfer(100); 897f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 898f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 899e488a0dbe4114ce51feeaf663ad4e2a6bd4b9a2bjbauchTEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) { 900f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 901f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org SetDamage(); // Must be called first because first packet 902f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // write happens at end of handshake. 903f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 904f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestTransfer(100); 905f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 906f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 907f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test DTLS-SRTP with all high ciphers 908b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { 909f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtlsSrtp); 910521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::vector<int> high; 911521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh high.push_back(rtc::SRTP_AES128_CM_SHA1_80); 912521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(high, true); 913521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(high, false); 914f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 915f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 916521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int client_cipher; 917521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher)); 918521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int server_cipher; 919521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher)); 920f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 921f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(client_cipher, server_cipher); 922521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80); 923f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 924f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 925f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test DTLS-SRTP with all low ciphers 926b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) { 927f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtlsSrtp); 928521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::vector<int> low; 929521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh low.push_back(rtc::SRTP_AES128_CM_SHA1_32); 930521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(low, true); 931521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(low, false); 932f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 933f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 934521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int client_cipher; 935521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher)); 936521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int server_cipher; 937521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher)); 938f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 939f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(client_cipher, server_cipher); 940521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32); 941f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 942f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 943f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 944f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test DTLS-SRTP with a mismatch -- should not converge 945b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) { 946f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtlsSrtp); 947521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::vector<int> high; 948521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh high.push_back(rtc::SRTP_AES128_CM_SHA1_80); 949521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::vector<int> low; 950521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh low.push_back(rtc::SRTP_AES128_CM_SHA1_32); 951521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(high, true); 952521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(low, false); 953f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 954f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 955521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int client_cipher; 956521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher)); 957521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int server_cipher; 958521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher)); 959f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 960f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 961f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test DTLS-SRTP with each side being mixed -- should select high 962b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) { 963f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtlsSrtp); 964521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::vector<int> mixed; 965521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80); 966521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32); 967521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(mixed, true); 968521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh SetDtlsSrtpCryptoSuites(mixed, false); 969f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 970f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 971521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int client_cipher; 972521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher)); 973521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh int server_cipher; 974521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher)); 975f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 976f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(client_cipher, server_cipher); 977521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80); 978f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 979f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 980f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test an exporter 981b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) { 982f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveExporter); 983f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 984f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned char client_out[20]; 985f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org unsigned char server_out[20]; 986f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 987f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool result; 988f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = ExportKeyingMaterial(kExporterLabel, 989f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kExporterContext, kExporterContextLen, 990f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true, true, 991f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org client_out, sizeof(client_out)); 992f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(result); 993f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 994f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org result = ExportKeyingMaterial(kExporterLabel, 995f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org kExporterContext, kExporterContextLen, 996f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org true, false, 997f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org server_out, sizeof(server_out)); 998f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(result); 999f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1000f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out))); 1001f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1002f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1003f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test not yet valid certificates are not rejected. 1004b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) { 1005f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 1006f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org long one_day = 60 * 60 * 24; 1007f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make the certificates not valid until one day later. 1008f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ResetIdentitiesWithValidity(one_day, one_day); 1009f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 1010f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1011f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1012f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test expired certificates are not rejected. 1013b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn GranlundTEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) { 1014f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 1015f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org long one_day = 60 * 60 * 24; 1016f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Make the certificates already expired. 1017f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ResetIdentitiesWithValidity(-one_day, -one_day); 1018f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 1019f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1020f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1021f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test data transfer using certs created from strings. 10227593aad1634c2ab88351a56eca108cb6af9a274etorbjorngTEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) { 1023f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 1024f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 1025f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestTransfer(100); 1026f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 1027f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1028f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Test getting the remote certificate. 10297593aad1634c2ab88351a56eca108cb6af9a274etorbjorngTEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) { 1030f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 1031f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1032f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Peer certificates haven't been received yet. 1033f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::scoped_ptr<rtc::SSLCertificate> client_peer_cert; 1034f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_FALSE(GetPeerCertificate(true, client_peer_cert.accept())); 1035f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_FALSE(client_peer_cert != NULL); 1036f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1037f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::scoped_ptr<rtc::SSLCertificate> server_peer_cert; 1038f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_FALSE(GetPeerCertificate(false, server_peer_cert.accept())); 1039f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_FALSE(server_peer_cert != NULL); 1040f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1041f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org TestHandshake(); 1042f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1043f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The client should have a peer certificate after the handshake. 1044f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(GetPeerCertificate(true, client_peer_cert.accept())); 1045f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(client_peer_cert != NULL); 1046f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1047f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It's not kCERT_PEM. 1048f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org std::string client_peer_string = client_peer_cert->ToPEMString(); 1049f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_NE(kCERT_PEM, client_peer_string); 1050f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1051f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It must not have a chain, because the test certs are self-signed. 1052f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSLCertChain* client_peer_chain; 1053f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_FALSE(client_peer_cert->GetChain(&client_peer_chain)); 1054f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1055f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The server should have a peer certificate after the handshake. 1056f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(GetPeerCertificate(false, server_peer_cert.accept())); 1057f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_TRUE(server_peer_cert != NULL); 1058f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1059f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It's kCERT_PEM 1060f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString()); 1061f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1062f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // It must not have a chain, because the test certs are self-signed. 1063f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org rtc::SSLCertChain* server_peer_chain; 1064f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ASSERT_FALSE(server_peer_cert->GetChain(&server_peer_chain)); 1065f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 10663ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org 10673ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org// Test getting the used DTLS ciphers. 1068831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used. 1069456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei ShiehTEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) { 10703ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org MAYBE_SKIP_TEST(HaveDtls); 1071831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10); 1072831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch TestHandshake(); 1073831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 10746caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int client_cipher; 1075456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher)); 10766caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int server_cipher; 1077456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher)); 1078831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 1079831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch ASSERT_EQ(client_cipher, server_cipher); 10804e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng ASSERT_EQ( 10814e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSLStreamAdapter::GetDefaultSslCipherForTest( 10824e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()), 10834e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng server_cipher); 1084831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch} 1085831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 1086831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch// Test getting the used DTLS 1.2 ciphers. 1087831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used. 1088456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei ShiehTEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) { 1089831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch MAYBE_SKIP_TEST(HaveDtls); 1090831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12); 1091831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch TestHandshake(); 1092831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 10936caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int client_cipher; 1094456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher)); 10956caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int server_cipher; 1096456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher)); 1097831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 1098831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch ASSERT_EQ(client_cipher, server_cipher); 10994e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng ASSERT_EQ( 11004e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSLStreamAdapter::GetDefaultSslCipherForTest( 11014e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSL_PROTOCOL_DTLS_12, ::testing::get<1>(GetParam()).type()), 11024e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng server_cipher); 1103831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch} 1104831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 1105831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used. 1106456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei ShiehTEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) { 1107831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch MAYBE_SKIP_TEST(HaveDtls); 1108831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12); 1109831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch TestHandshake(); 1110831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 11116caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int client_cipher; 1112456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher)); 11136caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int server_cipher; 1114456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher)); 1115831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 1116831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch ASSERT_EQ(client_cipher, server_cipher); 11174e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng ASSERT_EQ( 11184e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSLStreamAdapter::GetDefaultSslCipherForTest( 11194e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()), 11204e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng server_cipher); 1121831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch} 1122831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch 1123831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used. 1124456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei ShiehTEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) { 1125831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch MAYBE_SKIP_TEST(HaveDtls); 1126831c5585c7d2b4c4442e3c1255332f1c23b6a983Joachim Bauch SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10); 11273ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org TestHandshake(); 11283ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org 11296caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int client_cipher; 1130456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher)); 11316caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shieh int server_cipher; 1132456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher)); 11333ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org 11343ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org ASSERT_EQ(client_cipher, server_cipher); 11354e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng ASSERT_EQ( 11364e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSLStreamAdapter::GetDefaultSslCipherForTest( 11374e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()), 11384e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng server_cipher); 11393ee4fe5a940128cbfe76c8609a56c69c2aeb0175pthatcher@webrtc.org} 1140b6d4ec418504fd947c6f96829c73180e9487e203Torbjorn Granlund 11414e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng// The RSA keysizes here might look strange, why not include the RFC's size 11424e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng// 2048?. The reason is test case slowness; testing two sizes to exercise 11434e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng// parametrization is sufficient. 11444e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorngINSTANTIATE_TEST_CASE_P( 11454e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng SSLStreamAdapterTestsTLS, 11464e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng SSLStreamAdapterTestTLS, 11474e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng Combine(Values(rtc::KeyParams::RSA(1024, 65537), 11484e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::RSA(1152, 65537), 11494e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), 11504e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng Values(rtc::KeyParams::RSA(1024, 65537), 11514e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::RSA(1152, 65537), 11524e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); 11533542013f587f0858fb24fa8e554ec3c01a323da8sprang 11543542013f587f0858fb24fa8e554ec3c01a323da8sprang#if !defined(MEMORY_SANITIZER) 11553542013f587f0858fb24fa8e554ec3c01a323da8sprang// Fails under MemorySanitizer: 11563542013f587f0858fb24fa8e554ec3c01a323da8sprang// See https://code.google.com/p/webrtc/issues/detail?id=5381. 11574e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorngINSTANTIATE_TEST_CASE_P( 11584e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng SSLStreamAdapterTestsDTLS, 11594e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng SSLStreamAdapterTestDTLS, 11604e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng Combine(Values(rtc::KeyParams::RSA(1024, 65537), 11614e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::RSA(1152, 65537), 11624e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)), 11634e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng Values(rtc::KeyParams::RSA(1024, 65537), 11644e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::RSA(1152, 65537), 11654e572470a3f181a043f9f9b98cc0153b7195b9f5torbjorng rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)))); 11663542013f587f0858fb24fa8e554ec3c01a323da8sprang#endif 1167