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