blob: fa4ed6ddbb35e89641eb977203e952719f10e0a0 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12#include <algorithm>
jbauch555604a2016-04-26 03:13:22 -070013#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000014#include <set>
15#include <string>
16
jbauche488a0d2015-11-19 05:17:58 -080017#include "webrtc/base/bufferqueue.h"
nissec8ee8822017-01-18 07:20:55 -080018#include "webrtc/base/checks.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019#include "webrtc/base/gunit.h"
20#include "webrtc/base/helpers.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000021#include "webrtc/base/ssladapter.h"
22#include "webrtc/base/sslconfig.h"
23#include "webrtc/base/sslidentity.h"
24#include "webrtc/base/sslstreamadapter.h"
25#include "webrtc/base/stream.h"
26
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020027using ::testing::WithParamInterface;
28using ::testing::Values;
29using ::testing::Combine;
30using ::testing::tuple;
31
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000032static const int kBlockSize = 4096;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033static const char kExporterLabel[] = "label";
34static const unsigned char kExporterContext[] = "context";
35static int kExporterContextLen = sizeof(kExporterContext);
36
37static const char kRSA_PRIVATE_KEY_PEM[] =
38 "-----BEGIN RSA PRIVATE KEY-----\n"
39 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
40 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
41 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
42 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
43 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
44 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
45 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
46 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
47 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
48 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
49 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
50 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
51 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
52 "UCXiYxSsu20QNVw=\n"
53 "-----END RSA PRIVATE KEY-----\n";
54
55static const char kCERT_PEM[] =
56 "-----BEGIN CERTIFICATE-----\n"
57 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
58 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
59 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
60 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
61 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
62 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
63 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
64 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
65 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
66 "-----END CERTIFICATE-----\n";
67
68#define MAYBE_SKIP_TEST(feature) \
69 if (!(rtc::SSLStreamAdapter::feature())) { \
70 LOG(LS_INFO) << "Feature disabled... skipping"; \
71 return; \
72 }
73
74class SSLStreamAdapterTestBase;
75
jbauche488a0d2015-11-19 05:17:58 -080076class SSLDummyStreamBase : public rtc::StreamInterface,
77 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000078 public:
jbauche488a0d2015-11-19 05:17:58 -080079 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
80 const std::string &side,
81 rtc::StreamInterface* in,
82 rtc::StreamInterface* out) :
83 test_base_(test),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084 side_(side),
85 in_(in),
86 out_(out),
87 first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -080088 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
89 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000090 }
91
jbauche488a0d2015-11-19 05:17:58 -080092 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000093
jbauche488a0d2015-11-19 05:17:58 -080094 rtc::StreamResult Read(void* buffer, size_t buffer_len,
95 size_t* read, int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000096 rtc::StreamResult r;
97
98 r = in_->Read(buffer, buffer_len, read, error);
99 if (r == rtc::SR_BLOCK)
100 return rtc::SR_BLOCK;
101 if (r == rtc::SR_EOS)
102 return rtc::SR_EOS;
103
104 if (r != rtc::SR_SUCCESS) {
105 ADD_FAILURE();
106 return rtc::SR_ERROR;
107 }
108
109 return rtc::SR_SUCCESS;
110 }
111
112 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800113 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
115
116 if (sig & mask) {
jbauche488a0d2015-11-19 05:17:58 -0800117 LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig="
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118 << sig << " forwarding upward";
119 PostEvent(sig & mask, 0);
120 }
121 }
122
123 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800124 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125 if (sig & rtc::SE_WRITE) {
jbauche488a0d2015-11-19 05:17:58 -0800126 LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig="
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000127 << sig << " forwarding upward";
128
129 PostEvent(sig & rtc::SE_WRITE, 0);
130 }
131 }
132
133 // Write to the outgoing FifoBuffer
134 rtc::StreamResult WriteData(const void* data, size_t data_len,
jbauche488a0d2015-11-19 05:17:58 -0800135 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000136 return out_->Write(data, data_len, written, error);
137 }
138
jbauche488a0d2015-11-19 05:17:58 -0800139 rtc::StreamResult Write(const void* data, size_t data_len,
140 size_t* written, int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000141
jbauche488a0d2015-11-19 05:17:58 -0800142 void Close() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000143 LOG(LS_INFO) << "Closing outbound stream";
144 out_->Close();
145 }
146
jbauche488a0d2015-11-19 05:17:58 -0800147 protected:
148 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000149 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800150 rtc::StreamInterface* in_;
151 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000152 bool first_packet_;
153};
154
jbauche488a0d2015-11-19 05:17:58 -0800155class SSLDummyStreamTLS : public SSLDummyStreamBase {
156 public:
157 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
158 const std::string& side,
159 rtc::FifoBuffer* in,
160 rtc::FifoBuffer* out) :
161 SSLDummyStreamBase(test, side, in, out) {
162 }
163};
164
165class BufferQueueStream : public rtc::BufferQueue,
166 public rtc::StreamInterface {
167 public:
168 BufferQueueStream(size_t capacity, size_t default_size)
169 : rtc::BufferQueue(capacity, default_size) {
170 }
171
172 // Implementation of abstract StreamInterface methods.
173
174 // A buffer queue stream is always "open".
175 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
176
177 // Reading a buffer queue stream will either succeed or block.
178 rtc::StreamResult Read(void* buffer, size_t buffer_len,
179 size_t* read, int* error) override {
180 if (!ReadFront(buffer, buffer_len, read)) {
181 return rtc::SR_BLOCK;
182 }
183 return rtc::SR_SUCCESS;
184 }
185
186 // Writing to a buffer queue stream will either succeed or block.
187 rtc::StreamResult Write(const void* data, size_t data_len,
188 size_t* written, int* error) override {
189 if (!WriteBack(data, data_len, written)) {
190 return rtc::SR_BLOCK;
191 }
192 return rtc::SR_SUCCESS;
193 }
194
195 // A buffer queue stream can not be closed.
196 void Close() override {}
197
198 protected:
199 void NotifyReadableForTest() override {
200 PostEvent(rtc::SE_READ, 0);
201 }
202
203 void NotifyWritableForTest() override {
204 PostEvent(rtc::SE_WRITE, 0);
205 }
206};
207
208class SSLDummyStreamDTLS : public SSLDummyStreamBase {
209 public:
210 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
211 const std::string& side,
212 BufferQueueStream* in,
213 BufferQueueStream* out) :
214 SSLDummyStreamBase(test, side, in, out) {
215 }
216};
217
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000218static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800219static const int kBufferCapacity = 1;
220static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000221
222class SSLStreamAdapterTestBase : public testing::Test,
223 public sigslot::has_slots<> {
224 public:
torbjorng4e572472015-10-08 09:42:49 -0700225 SSLStreamAdapterTestBase(
226 const std::string& client_cert_pem,
227 const std::string& client_private_key_pem,
228 bool dtls,
229 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
230 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800231 : client_cert_pem_(client_cert_pem),
232 client_private_key_pem_(client_private_key_pem),
233 client_key_type_(client_key_type),
234 server_key_type_(server_key_type),
235 client_stream_(NULL),
236 server_stream_(NULL),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200237 client_identity_(NULL),
238 server_identity_(NULL),
239 delay_(0),
240 mtu_(1460),
241 loss_(0),
242 lose_first_packet_(false),
243 damage_(false),
244 dtls_(dtls),
245 handshake_wait_(5000),
246 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000247 // Set use of the test RNG to get predictable loss patterns.
248 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000249 }
250
251 ~SSLStreamAdapterTestBase() {
252 // Put it back for the next test.
253 rtc::SetRandomTestMode(false);
254 }
255
torbjorng7593aad2015-11-19 12:20:51 -0800256 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800257 CreateStreams();
258
259 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
260 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
261
262 // Set up the slots
263 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
264 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
265
266 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
267 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
268 client_private_key_pem_, client_cert_pem_);
269 } else {
270 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
271 }
272 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
273
274 client_ssl_->SetIdentity(client_identity_);
275 server_ssl_->SetIdentity(server_identity_);
276 }
277
torbjorng7593aad2015-11-19 12:20:51 -0800278 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800279 client_ssl_.reset(nullptr);
280 server_ssl_.reset(nullptr);
281 }
282
283 virtual void CreateStreams() = 0;
284
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000285 // Recreate the client/server identities with the specified validity period.
286 // |not_before| and |not_after| are offsets from the current time in number
287 // of seconds.
288 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800289 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000290
291 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
292 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
293
294 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
295 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
296
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100297 time_t now = time(nullptr);
298
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000299 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700300 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000301 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100302 client_params.not_before = now + not_before;
303 client_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000304 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
305
306 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700307 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000308 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100309 server_params.not_before = now + not_before;
310 server_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
312
313 client_ssl_->SetIdentity(client_identity_);
314 server_ssl_->SetIdentity(server_identity_);
315 }
316
317 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
318 LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
319
320 if (sig & rtc::SE_READ) {
321 ReadData(stream);
322 }
323
324 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
325 WriteData();
326 }
327 }
328
deadbeef89824f62016-09-30 11:55:43 -0700329 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
330 unsigned char server_digest[20];
331 size_t server_digest_len;
332 unsigned char client_digest[20];
333 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000334 bool rv;
deadbeef89824f62016-09-30 11:55:43 -0700335 rtc::SSLPeerCertificateDigestError err;
336 rtc::SSLPeerCertificateDigestError expected_err =
337 expect_success
338 ? rtc::SSLPeerCertificateDigestError::NONE
339 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000340
341 LOG(LS_INFO) << "Setting peer identities by digest";
342
deadbeef89824f62016-09-30 11:55:43 -0700343 rv = server_identity_->certificate().ComputeDigest(
344 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000345 ASSERT_TRUE(rv);
deadbeef89824f62016-09-30 11:55:43 -0700346 rv = client_identity_->certificate().ComputeDigest(
347 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
348 ASSERT_TRUE(rv);
349
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000350 if (!correct) {
351 LOG(LS_INFO) << "Setting bogus digest for server cert";
deadbeef89824f62016-09-30 11:55:43 -0700352 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000353 }
deadbeef89824f62016-09-30 11:55:43 -0700354 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
355 server_digest_len, &err);
356 EXPECT_EQ(expected_err, err);
357 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000358
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000359 if (!correct) {
360 LOG(LS_INFO) << "Setting bogus digest for client cert";
deadbeef89824f62016-09-30 11:55:43 -0700361 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000362 }
deadbeef89824f62016-09-30 11:55:43 -0700363 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
364 client_digest_len, &err);
365 EXPECT_EQ(expected_err, err);
366 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000367
368 identities_set_ = true;
369 }
370
Joachim Bauch831c5582015-05-20 12:48:41 +0200371 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
372 rtc::SSLProtocolVersion client_version) {
373 server_ssl_->SetMaxProtocolVersion(server_version);
374 client_ssl_->SetMaxProtocolVersion(client_version);
375 }
376
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000377 void TestHandshake(bool expect_success = true) {
378 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
379 rtc::SSL_MODE_TLS);
380 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
381 rtc::SSL_MODE_TLS);
382
383 if (!dtls_) {
384 // Make sure we simulate a reliable network for TLS.
385 // This is just a check to make sure that people don't write wrong
386 // tests.
nissec8ee8822017-01-18 07:20:55 -0800387 RTC_CHECK((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000388 }
389
390 if (!identities_set_)
deadbeef89824f62016-09-30 11:55:43 -0700391 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000392
393 // Start the handshake
394 int rv;
395
396 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700397 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 ASSERT_EQ(0, rv);
399
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700400 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000401 ASSERT_EQ(0, rv);
402
403 // Now run the handshake
404 if (expect_success) {
405 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
406 && (server_ssl_->GetState() == rtc::SS_OPEN),
407 handshake_wait_);
408 } else {
409 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
410 handshake_wait_);
411 }
412 }
413
deadbeef89824f62016-09-30 11:55:43 -0700414 // This tests that the handshake can complete before the identity is
415 // verified, and the identity will be verified after the fact.
416 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
417 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
418 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
419
420 if (!dtls_) {
421 // Make sure we simulate a reliable network for TLS.
422 // This is just a check to make sure that people don't write wrong
423 // tests.
nissec8ee8822017-01-18 07:20:55 -0800424 RTC_CHECK((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
deadbeef89824f62016-09-30 11:55:43 -0700425 }
426
427 // Start the handshake
428 int rv;
429
430 server_ssl_->SetServerRole();
431 rv = server_ssl_->StartSSL();
432 ASSERT_EQ(0, rv);
433
434 rv = client_ssl_->StartSSL();
435 ASSERT_EQ(0, rv);
436
437 // Now run the handshake.
438 EXPECT_TRUE_WAIT(
439 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
440 handshake_wait_);
441
442 // Until the identity has been verified, the state should still be
443 // SS_OPENING and writes should return SR_BLOCK.
444 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
445 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
446 unsigned char packet[1];
447 size_t sent;
448 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
449 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
450
451 // If we set an invalid identity at this point, SetPeerCertificateDigest
452 // should return false.
453 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
454 // State should then transition to SS_OPEN or SS_CLOSED based on validation
455 // of the identity.
456 if (valid_identity) {
457 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
458 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
459 } else {
460 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
461 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
462 }
463 }
464
jbauche488a0d2015-11-19 05:17:58 -0800465 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data,
466 size_t data_len, size_t *written,
467 int *error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000468 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200469 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000470 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
471 *written = data_len;
472 return rtc::SR_SUCCESS;
473 }
474 if (dtls_ && (data_len > mtu_)) {
475 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len;
476 *written = data_len;
477 return rtc::SR_SUCCESS;
478 }
479
480 // Optionally damage application data (type 23). Note that we don't damage
481 // handshake packets and we damage the last byte to keep the header
482 // intact but break the MAC.
483 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
484 std::vector<char> buf(data_len);
485
486 LOG(LS_INFO) << "Damaging packet";
487
488 memcpy(&buf[0], data, data_len);
489 buf[data_len - 1]++;
490
491 return from->WriteData(&buf[0], data_len, written, error);
492 }
493
494 return from->WriteData(data, data_len, written, error);
495 }
496
497 void SetDelay(int delay) {
498 delay_ = delay;
499 }
500 int GetDelay() { return delay_; }
501
502 void SetLoseFirstPacket(bool lose) {
503 lose_first_packet_ = lose;
504 }
505 bool GetLoseFirstPacket() { return lose_first_packet_; }
506
507 void SetLoss(int percent) {
508 loss_ = percent;
509 }
510
511 void SetDamage() {
512 damage_ = true;
513 }
514
515 void SetMtu(size_t mtu) {
516 mtu_ = mtu;
517 }
518
519 void SetHandshakeWait(int wait) {
520 handshake_wait_ = wait;
521 }
522
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800523 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000524 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800525 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000526 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800527 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000528 }
529
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800530 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000531 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800532 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000533 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800534 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000535 }
536
jbauch555604a2016-04-26 03:13:22 -0700537 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000538 if (client)
kwibergb4d01c42016-04-06 05:15:06 -0700539 return client_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000540 else
kwibergb4d01c42016-04-06 05:15:06 -0700541 return server_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000542 }
543
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700544 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000545 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700546 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000547 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700548 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000549 }
550
torbjorng43166b82016-03-11 00:06:47 -0800551 int GetSslVersion(bool client) {
552 if (client)
553 return client_ssl_->GetSslVersion();
554 else
555 return server_ssl_->GetSslVersion();
556 }
557
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000558 bool ExportKeyingMaterial(const char *label,
559 const unsigned char *context,
560 size_t context_len,
561 bool use_context,
562 bool client,
563 unsigned char *result,
564 size_t result_len) {
565 if (client)
566 return client_ssl_->ExportKeyingMaterial(label,
567 context, context_len,
568 use_context,
569 result, result_len);
570 else
571 return server_ssl_->ExportKeyingMaterial(label,
572 context, context_len,
573 use_context,
574 result, result_len);
575 }
576
577 // To be implemented by subclasses.
578 virtual void WriteData() = 0;
579 virtual void ReadData(rtc::StreamInterface *stream) = 0;
580 virtual void TestTransfer(int size) = 0;
581
582 protected:
jbauche488a0d2015-11-19 05:17:58 -0800583 std::string client_cert_pem_;
584 std::string client_private_key_pem_;
585 rtc::KeyParams client_key_type_;
586 rtc::KeyParams server_key_type_;
587 SSLDummyStreamBase *client_stream_; // freed by client_ssl_ destructor
588 SSLDummyStreamBase *server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700589 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
590 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000591 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
592 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
593 int delay_;
594 size_t mtu_;
595 int loss_;
596 bool lose_first_packet_;
597 bool damage_;
598 bool dtls_;
599 int handshake_wait_;
600 bool identities_set_;
601};
602
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200603class SSLStreamAdapterTestTLS
604 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700605 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000606 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200607 SSLStreamAdapterTestTLS()
608 : SSLStreamAdapterTestBase("",
609 "",
610 false,
611 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800612 ::testing::get<1>(GetParam())),
613 client_buffer_(kFifoBufferSize),
614 server_buffer_(kFifoBufferSize) {
615 }
616
torbjorng7593aad2015-11-19 12:20:51 -0800617 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800618 client_stream_ =
619 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
620 server_stream_ =
621 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
622 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000623
624 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700625 void TestTransfer(int size) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000626 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
627 // Create some dummy data to send.
628 size_t received;
629
630 send_stream_.ReserveSize(size);
631 for (int i = 0; i < size; ++i) {
632 char ch = static_cast<char>(i);
633 send_stream_.Write(&ch, 1, NULL, NULL);
634 }
635 send_stream_.Rewind();
636
637 // Prepare the receive stream.
638 recv_stream_.ReserveSize(size);
639
640 // Start sending
641 WriteData();
642
643 // Wait for the client to close
644 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
645
646 // Now check the data
647 recv_stream_.GetSize(&received);
648
649 EXPECT_EQ(static_cast<size_t>(size), received);
650 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
651 recv_stream_.GetBuffer(), size));
652 }
653
nisseef8b61e2016-04-29 06:09:15 -0700654 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000655 size_t position, tosend, size;
656 rtc::StreamResult rv;
657 size_t sent;
658 char block[kBlockSize];
659
660 send_stream_.GetSize(&size);
661 if (!size)
662 return;
663
664 for (;;) {
665 send_stream_.GetPosition(&position);
666 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
667 rtc::SR_EOS) {
668 rv = client_ssl_->Write(block, tosend, &sent, 0);
669
670 if (rv == rtc::SR_SUCCESS) {
671 send_stream_.SetPosition(position + sent);
672 LOG(LS_VERBOSE) << "Sent: " << position + sent;
673 } else if (rv == rtc::SR_BLOCK) {
674 LOG(LS_VERBOSE) << "Blocked...";
675 send_stream_.SetPosition(position);
676 break;
677 } else {
678 ADD_FAILURE();
679 break;
680 }
681 } else {
682 // Now close
683 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
684 client_ssl_->Close();
685 break;
686 }
687 }
688 };
689
nisseef8b61e2016-04-29 06:09:15 -0700690 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000691 char buffer[1600];
692 size_t bread;
693 int err2;
694 rtc::StreamResult r;
695
696 for (;;) {
697 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
698
699 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
700 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800701 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702 stream->Close();
703 return;
704 }
705
706 if (r == rtc::SR_BLOCK)
707 break;
708
709 ASSERT_EQ(rtc::SR_SUCCESS, r);
710 LOG(LS_INFO) << "Read " << bread;
711
712 recv_stream_.Write(buffer, bread, NULL, NULL);
713 }
714 }
715
716 private:
jbauche488a0d2015-11-19 05:17:58 -0800717 rtc::FifoBuffer client_buffer_;
718 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000719 rtc::MemoryStream send_stream_;
720 rtc::MemoryStream recv_stream_;
721};
722
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200723class SSLStreamAdapterTestDTLS
724 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700725 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000726 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200727 SSLStreamAdapterTestDTLS()
728 : SSLStreamAdapterTestBase("",
729 "",
730 true,
731 ::testing::get<0>(GetParam()),
732 ::testing::get<1>(GetParam())),
jbauche488a0d2015-11-19 05:17:58 -0800733 client_buffer_(kBufferCapacity, kDefaultBufferSize),
734 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200735 packet_size_(1000),
736 count_(0),
737 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000738
739 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
740 const std::string& private_key_pem) :
741 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
jbauche488a0d2015-11-19 05:17:58 -0800742 client_buffer_(kBufferCapacity, kDefaultBufferSize),
743 server_buffer_(kBufferCapacity, kDefaultBufferSize),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000744 packet_size_(1000), count_(0), sent_(0) {
745 }
746
torbjorng7593aad2015-11-19 12:20:51 -0800747 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800748 client_stream_ =
749 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
750 server_stream_ =
751 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
752 }
753
nisseef8b61e2016-04-29 06:09:15 -0700754 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000755 unsigned char *packet = new unsigned char[1600];
756
jbauche488a0d2015-11-19 05:17:58 -0800757 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800758 unsigned int rand_state = sent_;
759 packet[0] = sent_;
760 for (size_t i = 1; i < packet_size_; i++) {
761 // This is a simple LC PRNG. Keep in synch with identical code below.
762 rand_state = (rand_state * 251 + 19937) >> 7;
763 packet[i] = rand_state & 0xff;
764 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000765
766 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800767 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000768 if (rv == rtc::SR_SUCCESS) {
769 LOG(LS_VERBOSE) << "Sent: " << sent_;
770 sent_++;
771 } else if (rv == rtc::SR_BLOCK) {
772 LOG(LS_VERBOSE) << "Blocked...";
773 break;
774 } else {
775 ADD_FAILURE();
776 break;
777 }
jbauche488a0d2015-11-19 05:17:58 -0800778 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000779
780 delete [] packet;
781 }
782
nisseef8b61e2016-04-29 06:09:15 -0700783 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000784 unsigned char buffer[2000];
785 size_t bread;
786 int err2;
787 rtc::StreamResult r;
788
789 for (;;) {
790 r = stream->Read(buffer, 2000, &bread, &err2);
791
792 if (r == rtc::SR_ERROR) {
793 // Unfortunately, errors are the way that the stream adapter
794 // signals close right now
795 stream->Close();
796 return;
797 }
798
799 if (r == rtc::SR_BLOCK)
800 break;
801
802 ASSERT_EQ(rtc::SR_SUCCESS, r);
803 LOG(LS_INFO) << "Read " << bread;
804
805 // Now parse the datagram
806 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800807 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000808
torbjorng7593aad2015-11-19 12:20:51 -0800809 unsigned int rand_state = packet_num;
810 for (size_t i = 1; i < packet_size_; i++) {
811 // This is a simple LC PRNG. Keep in synch with identical code above.
812 rand_state = (rand_state * 251 + 19937) >> 7;
813 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000814 }
815 received_.insert(packet_num);
816 }
817 }
818
nisseef8b61e2016-04-29 06:09:15 -0700819 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000820 count_ = count;
821
822 WriteData();
823
824 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
825 LOG(LS_INFO) << "sent_ == " << sent_;
826
827 if (damage_) {
828 WAIT(false, 2000);
829 EXPECT_EQ(0U, received_.size());
830 } else if (loss_ == 0) {
831 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
832 } else {
833 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
834 received_.size();
835 }
836 };
837
838 private:
jbauche488a0d2015-11-19 05:17:58 -0800839 BufferQueueStream client_buffer_;
840 BufferQueueStream server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000841 size_t packet_size_;
842 int count_;
843 int sent_;
844 std::set<int> received_;
845};
846
847
jbauche488a0d2015-11-19 05:17:58 -0800848rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000849 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000850 LOG(LS_INFO) << "Writing to loopback " << data_len;
851
852 if (first_packet_) {
853 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800854 if (test_base_->GetLoseFirstPacket()) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000855 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800856 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000857 return rtc::SR_SUCCESS;
858 }
859 }
860
jbauche488a0d2015-11-19 05:17:58 -0800861 return test_base_->DataWritten(this, data, data_len, written, error);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000862};
863
864class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
865 public:
866 SSLStreamAdapterTestDTLSFromPEMStrings() :
867 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
868 }
869};
870
871// Basic tests: TLS
872
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000873// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200874TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000875 TestHandshake();
876};
877
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000878// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200879TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000880 TestHandshake();
881 client_ssl_->Close();
882 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
883};
884
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000885// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200886TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000887 TestHandshake();
888 TestTransfer(100000);
889};
890
891// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200892TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000893 TestHandshake();
894 TestTransfer(100000);
895 client_ssl_->Close();
896
897 rtc::StreamResult rv;
898 char block[kBlockSize];
899 size_t dummy;
900
901 // It's an error to write after closed.
902 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
903 ASSERT_EQ(rtc::SR_ERROR, rv);
904
905 // But after closed read gives you EOS.
906 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
907 ASSERT_EQ(rtc::SR_EOS, rv);
908};
909
910// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200911TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
deadbeef89824f62016-09-30 11:55:43 -0700912 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000913 TestHandshake(false);
914};
915
deadbeef89824f62016-09-30 11:55:43 -0700916TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
917 TestHandshakeWithDelayedIdentity(true);
918};
919
920TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
921 TestHandshakeWithDelayedIdentity(false);
922};
923
924// Test that the correct error is returned when SetPeerCertificateDigest is
925// called with an unknown algorithm.
926TEST_P(SSLStreamAdapterTestTLS,
927 TestSetPeerCertificateDigestWithUnknownAlgorithm) {
928 unsigned char server_digest[20];
929 size_t server_digest_len;
930 bool rv;
931 rtc::SSLPeerCertificateDigestError err;
932
933 rv = server_identity_->certificate().ComputeDigest(
934 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
935 ASSERT_TRUE(rv);
936
937 rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
938 server_digest_len, &err);
939 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
940 EXPECT_FALSE(rv);
941}
942
943// Test that the correct error is returned when SetPeerCertificateDigest is
944// called with an invalid digest length.
945TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
946 unsigned char server_digest[20];
947 size_t server_digest_len;
948 bool rv;
949 rtc::SSLPeerCertificateDigestError err;
950
951 rv = server_identity_->certificate().ComputeDigest(
952 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
953 ASSERT_TRUE(rv);
954
955 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
956 server_digest_len - 1, &err);
957 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
958 EXPECT_FALSE(rv);
959}
960
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000961// Test moving a bunch of data
962
963// Basic tests: DTLS
964// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200965TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000966 MAYBE_SKIP_TEST(HaveDtls);
967 TestHandshake();
968};
969
970// Test that we can make a handshake work if the first packet in
971// each direction is lost. This gives us predictable loss
972// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200973TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000974 MAYBE_SKIP_TEST(HaveDtls);
975 SetLoseFirstPacket(true);
976 TestHandshake();
977};
978
979// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200980TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000981 MAYBE_SKIP_TEST(HaveDtls);
982 SetLoseFirstPacket(true);
983 SetDelay(2000);
984 SetHandshakeWait(20000);
985 TestHandshake();
986};
987
988// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000989// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200990TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000991 MAYBE_SKIP_TEST(HaveDtls);
992 SetMtu(700);
993 SetHandshakeWait(20000);
994 TestHandshake();
995};
996
997// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -0800998TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000999 MAYBE_SKIP_TEST(HaveDtls);
1000 TestHandshake();
1001 TestTransfer(100);
1002};
1003
jbauche488a0d2015-11-19 05:17:58 -08001004TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001005 MAYBE_SKIP_TEST(HaveDtls);
1006 TestHandshake();
1007 SetLoss(10);
1008 TestTransfer(100);
1009};
1010
jbauche488a0d2015-11-19 05:17:58 -08001011TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001012 MAYBE_SKIP_TEST(HaveDtls);
1013 SetDamage(); // Must be called first because first packet
1014 // write happens at end of handshake.
1015 TestHandshake();
1016 TestTransfer(100);
1017};
1018
deadbeef89824f62016-09-30 11:55:43 -07001019TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
1020 TestHandshakeWithDelayedIdentity(true);
1021};
1022
1023TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
1024 TestHandshakeWithDelayedIdentity(false);
1025};
1026
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001027// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001028TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001029 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001030 std::vector<int> high;
1031 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1032 SetDtlsSrtpCryptoSuites(high, true);
1033 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001034 TestHandshake();
1035
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001036 int client_cipher;
1037 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1038 int server_cipher;
1039 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001040
1041 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001042 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001043};
1044
1045// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001046TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001047 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001048 std::vector<int> low;
1049 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1050 SetDtlsSrtpCryptoSuites(low, true);
1051 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001052 TestHandshake();
1053
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001054 int client_cipher;
1055 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1056 int server_cipher;
1057 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001058
1059 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001060 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001061};
1062
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001063// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001064TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001065 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001066 std::vector<int> high;
1067 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1068 std::vector<int> low;
1069 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1070 SetDtlsSrtpCryptoSuites(high, true);
1071 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001072 TestHandshake();
1073
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001074 int client_cipher;
1075 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1076 int server_cipher;
1077 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001078};
1079
1080// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001081TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001082 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001083 std::vector<int> mixed;
1084 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1085 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1086 SetDtlsSrtpCryptoSuites(mixed, true);
1087 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001088 TestHandshake();
1089
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001090 int client_cipher;
1091 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1092 int server_cipher;
1093 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001094
1095 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001096 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001097};
1098
jbauchcb560652016-08-04 05:20:32 -07001099// Test DTLS-SRTP with all GCM-128 ciphers.
1100TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
1101 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1102 std::vector<int> gcm128;
1103 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1104 SetDtlsSrtpCryptoSuites(gcm128, true);
1105 SetDtlsSrtpCryptoSuites(gcm128, false);
1106 TestHandshake();
1107
1108 int client_cipher;
1109 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1110 int server_cipher;
1111 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1112
1113 ASSERT_EQ(client_cipher, server_cipher);
1114 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
1115};
1116
1117// Test DTLS-SRTP with all GCM-256 ciphers.
1118TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
1119 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1120 std::vector<int> gcm256;
1121 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1122 SetDtlsSrtpCryptoSuites(gcm256, true);
1123 SetDtlsSrtpCryptoSuites(gcm256, false);
1124 TestHandshake();
1125
1126 int client_cipher;
1127 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1128 int server_cipher;
1129 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1130
1131 ASSERT_EQ(client_cipher, server_cipher);
1132 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1133};
1134
1135// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1136TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
1137 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1138 std::vector<int> gcm128;
1139 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1140 std::vector<int> gcm256;
1141 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1142 SetDtlsSrtpCryptoSuites(gcm128, true);
1143 SetDtlsSrtpCryptoSuites(gcm256, false);
1144 TestHandshake();
1145
1146 int client_cipher;
1147 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1148 int server_cipher;
1149 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1150};
1151
1152// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1153TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
1154 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1155 std::vector<int> gcmBoth;
1156 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1157 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1158 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1159 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1160 TestHandshake();
1161
1162 int client_cipher;
1163 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1164 int server_cipher;
1165 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1166
1167 ASSERT_EQ(client_cipher, server_cipher);
1168 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1169};
1170
1171// Test SRTP cipher suite lengths.
1172TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1173 int key_len;
1174 int salt_len;
1175
1176 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(
1177 rtc::SRTP_INVALID_CRYPTO_SUITE, &key_len, &salt_len));
1178
1179 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1180 rtc::SRTP_AES128_CM_SHA1_32, &key_len, &salt_len));
1181 ASSERT_EQ(128/8, key_len);
1182 ASSERT_EQ(112/8, salt_len);
1183
1184 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1185 rtc::SRTP_AES128_CM_SHA1_80, &key_len, &salt_len));
1186 ASSERT_EQ(128/8, key_len);
1187 ASSERT_EQ(112/8, salt_len);
1188
1189 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1190 rtc::SRTP_AEAD_AES_128_GCM, &key_len, &salt_len));
1191 ASSERT_EQ(128/8, key_len);
1192 ASSERT_EQ(96/8, salt_len);
1193
1194 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1195 rtc::SRTP_AEAD_AES_256_GCM, &key_len, &salt_len));
1196 ASSERT_EQ(256/8, key_len);
1197 ASSERT_EQ(96/8, salt_len);
1198};
1199
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001200// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001201TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001202 MAYBE_SKIP_TEST(HaveExporter);
1203 TestHandshake();
1204 unsigned char client_out[20];
1205 unsigned char server_out[20];
1206
1207 bool result;
1208 result = ExportKeyingMaterial(kExporterLabel,
1209 kExporterContext, kExporterContextLen,
1210 true, true,
1211 client_out, sizeof(client_out));
1212 ASSERT_TRUE(result);
1213
1214 result = ExportKeyingMaterial(kExporterLabel,
1215 kExporterContext, kExporterContextLen,
1216 true, false,
1217 server_out, sizeof(server_out));
1218 ASSERT_TRUE(result);
1219
1220 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1221}
1222
1223// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001224TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001225 MAYBE_SKIP_TEST(HaveDtls);
1226 long one_day = 60 * 60 * 24;
1227 // Make the certificates not valid until one day later.
1228 ResetIdentitiesWithValidity(one_day, one_day);
1229 TestHandshake();
1230}
1231
1232// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001233TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001234 MAYBE_SKIP_TEST(HaveDtls);
1235 long one_day = 60 * 60 * 24;
1236 // Make the certificates already expired.
1237 ResetIdentitiesWithValidity(-one_day, -one_day);
1238 TestHandshake();
1239}
1240
1241// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001242TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001243 MAYBE_SKIP_TEST(HaveDtls);
1244 TestHandshake();
1245 TestTransfer(100);
1246}
1247
1248// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001249TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001250 MAYBE_SKIP_TEST(HaveDtls);
1251
1252 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001253 ASSERT_FALSE(GetPeerCertificate(true));
1254 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001255
1256 TestHandshake();
1257
1258 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001259 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001260 GetPeerCertificate(true);
1261 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001262
1263 // It's not kCERT_PEM.
1264 std::string client_peer_string = client_peer_cert->ToPEMString();
1265 ASSERT_NE(kCERT_PEM, client_peer_string);
1266
1267 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001268 ASSERT_FALSE(client_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001269
1270 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001271 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001272 GetPeerCertificate(false);
1273 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001274
1275 // It's kCERT_PEM
1276 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
1277
1278 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001279 ASSERT_FALSE(server_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001280}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001281
1282// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +02001283// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001284TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001285 MAYBE_SKIP_TEST(HaveDtls);
Joachim Bauch831c5582015-05-20 12:48:41 +02001286 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001287 TestHandshake();
1288
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001289 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001290 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001291 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001292 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001293
torbjorng43166b82016-03-11 00:06:47 -08001294 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1295 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1296
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001297 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001298 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1299 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001300}
1301
1302// Test getting the used DTLS 1.2 ciphers.
1303// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001304TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001305 MAYBE_SKIP_TEST(HaveDtls);
1306 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1307 TestHandshake();
1308
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001309 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001310 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001311 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001312 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001313
torbjorng43166b82016-03-11 00:06:47 -08001314 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1315 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1316
Joachim Bauch831c5582015-05-20 12:48:41 +02001317 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001318 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1319 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001320}
1321
1322// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001323TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001324 MAYBE_SKIP_TEST(HaveDtls);
1325 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1326 TestHandshake();
1327
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001328 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001329 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001330 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001331 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001332
torbjorng43166b82016-03-11 00:06:47 -08001333 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1334 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1335
Joachim Bauch831c5582015-05-20 12:48:41 +02001336 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001337 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1338 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001339}
1340
1341// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001342TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001343 MAYBE_SKIP_TEST(HaveDtls);
1344 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1345 TestHandshake();
1346
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001347 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001348 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001349 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001350 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001351
torbjorng43166b82016-03-11 00:06:47 -08001352 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1353 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1354
Joachim Bauch831c5582015-05-20 12:48:41 +02001355 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001356 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1357 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001358}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001359
torbjorng4e572472015-10-08 09:42:49 -07001360// The RSA keysizes here might look strange, why not include the RFC's size
1361// 2048?. The reason is test case slowness; testing two sizes to exercise
1362// parametrization is sufficient.
1363INSTANTIATE_TEST_CASE_P(
1364 SSLStreamAdapterTestsTLS,
1365 SSLStreamAdapterTestTLS,
1366 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1367 rtc::KeyParams::RSA(1152, 65537),
1368 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1369 Values(rtc::KeyParams::RSA(1024, 65537),
1370 rtc::KeyParams::RSA(1152, 65537),
1371 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1372INSTANTIATE_TEST_CASE_P(
1373 SSLStreamAdapterTestsDTLS,
1374 SSLStreamAdapterTestDTLS,
1375 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1376 rtc::KeyParams::RSA(1152, 65537),
1377 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1378 Values(rtc::KeyParams::RSA(1024, 65537),
1379 rtc::KeyParams::RSA(1152, 65537),
1380 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));