blob: 01685a1803bc551690aef52ce093911c2b904f5a [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"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018#include "webrtc/base/gunit.h"
19#include "webrtc/base/helpers.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000020#include "webrtc/base/ssladapter.h"
21#include "webrtc/base/sslconfig.h"
22#include "webrtc/base/sslidentity.h"
23#include "webrtc/base/sslstreamadapter.h"
24#include "webrtc/base/stream.h"
25
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020026using ::testing::WithParamInterface;
27using ::testing::Values;
28using ::testing::Combine;
29using ::testing::tuple;
30
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031static const int kBlockSize = 4096;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000032static const char kExporterLabel[] = "label";
33static const unsigned char kExporterContext[] = "context";
34static int kExporterContextLen = sizeof(kExporterContext);
35
36static const char kRSA_PRIVATE_KEY_PEM[] =
37 "-----BEGIN RSA PRIVATE KEY-----\n"
38 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
39 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
40 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
41 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
42 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
43 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
44 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
45 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
46 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
47 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
48 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
49 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
50 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
51 "UCXiYxSsu20QNVw=\n"
52 "-----END RSA PRIVATE KEY-----\n";
53
54static const char kCERT_PEM[] =
55 "-----BEGIN CERTIFICATE-----\n"
56 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
57 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
58 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
59 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
60 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
61 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
62 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
63 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
64 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
65 "-----END CERTIFICATE-----\n";
66
67#define MAYBE_SKIP_TEST(feature) \
68 if (!(rtc::SSLStreamAdapter::feature())) { \
69 LOG(LS_INFO) << "Feature disabled... skipping"; \
70 return; \
71 }
72
73class SSLStreamAdapterTestBase;
74
jbauche488a0d2015-11-19 05:17:58 -080075class SSLDummyStreamBase : public rtc::StreamInterface,
76 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000077 public:
jbauche488a0d2015-11-19 05:17:58 -080078 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
79 const std::string &side,
80 rtc::StreamInterface* in,
81 rtc::StreamInterface* out) :
82 test_base_(test),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083 side_(side),
84 in_(in),
85 out_(out),
86 first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -080087 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
88 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 }
90
jbauche488a0d2015-11-19 05:17:58 -080091 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000092
jbauche488a0d2015-11-19 05:17:58 -080093 rtc::StreamResult Read(void* buffer, size_t buffer_len,
94 size_t* read, int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000095 rtc::StreamResult r;
96
97 r = in_->Read(buffer, buffer_len, read, error);
98 if (r == rtc::SR_BLOCK)
99 return rtc::SR_BLOCK;
100 if (r == rtc::SR_EOS)
101 return rtc::SR_EOS;
102
103 if (r != rtc::SR_SUCCESS) {
104 ADD_FAILURE();
105 return rtc::SR_ERROR;
106 }
107
108 return rtc::SR_SUCCESS;
109 }
110
111 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800112 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
114
115 if (sig & mask) {
jbauche488a0d2015-11-19 05:17:58 -0800116 LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig="
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117 << sig << " forwarding upward";
118 PostEvent(sig & mask, 0);
119 }
120 }
121
122 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800123 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000124 if (sig & rtc::SE_WRITE) {
jbauche488a0d2015-11-19 05:17:58 -0800125 LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig="
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000126 << sig << " forwarding upward";
127
128 PostEvent(sig & rtc::SE_WRITE, 0);
129 }
130 }
131
132 // Write to the outgoing FifoBuffer
133 rtc::StreamResult WriteData(const void* data, size_t data_len,
jbauche488a0d2015-11-19 05:17:58 -0800134 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000135 return out_->Write(data, data_len, written, error);
136 }
137
jbauche488a0d2015-11-19 05:17:58 -0800138 rtc::StreamResult Write(const void* data, size_t data_len,
139 size_t* written, int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000140
jbauche488a0d2015-11-19 05:17:58 -0800141 void Close() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142 LOG(LS_INFO) << "Closing outbound stream";
143 out_->Close();
144 }
145
jbauche488a0d2015-11-19 05:17:58 -0800146 protected:
147 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000148 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800149 rtc::StreamInterface* in_;
150 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151 bool first_packet_;
152};
153
jbauche488a0d2015-11-19 05:17:58 -0800154class SSLDummyStreamTLS : public SSLDummyStreamBase {
155 public:
156 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
157 const std::string& side,
158 rtc::FifoBuffer* in,
159 rtc::FifoBuffer* out) :
160 SSLDummyStreamBase(test, side, in, out) {
161 }
162};
163
164class BufferQueueStream : public rtc::BufferQueue,
165 public rtc::StreamInterface {
166 public:
167 BufferQueueStream(size_t capacity, size_t default_size)
168 : rtc::BufferQueue(capacity, default_size) {
169 }
170
171 // Implementation of abstract StreamInterface methods.
172
173 // A buffer queue stream is always "open".
174 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
175
176 // Reading a buffer queue stream will either succeed or block.
177 rtc::StreamResult Read(void* buffer, size_t buffer_len,
178 size_t* read, int* error) override {
179 if (!ReadFront(buffer, buffer_len, read)) {
180 return rtc::SR_BLOCK;
181 }
182 return rtc::SR_SUCCESS;
183 }
184
185 // Writing to a buffer queue stream will either succeed or block.
186 rtc::StreamResult Write(const void* data, size_t data_len,
187 size_t* written, int* error) override {
188 if (!WriteBack(data, data_len, written)) {
189 return rtc::SR_BLOCK;
190 }
191 return rtc::SR_SUCCESS;
192 }
193
194 // A buffer queue stream can not be closed.
195 void Close() override {}
196
197 protected:
198 void NotifyReadableForTest() override {
199 PostEvent(rtc::SE_READ, 0);
200 }
201
202 void NotifyWritableForTest() override {
203 PostEvent(rtc::SE_WRITE, 0);
204 }
205};
206
207class SSLDummyStreamDTLS : public SSLDummyStreamBase {
208 public:
209 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
210 const std::string& side,
211 BufferQueueStream* in,
212 BufferQueueStream* out) :
213 SSLDummyStreamBase(test, side, in, out) {
214 }
215};
216
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000217static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800218static const int kBufferCapacity = 1;
219static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000220
221class SSLStreamAdapterTestBase : public testing::Test,
222 public sigslot::has_slots<> {
223 public:
torbjorng4e572472015-10-08 09:42:49 -0700224 SSLStreamAdapterTestBase(
225 const std::string& client_cert_pem,
226 const std::string& client_private_key_pem,
227 bool dtls,
228 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
229 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800230 : client_cert_pem_(client_cert_pem),
231 client_private_key_pem_(client_private_key_pem),
232 client_key_type_(client_key_type),
233 server_key_type_(server_key_type),
234 client_stream_(NULL),
235 server_stream_(NULL),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200236 client_identity_(NULL),
237 server_identity_(NULL),
238 delay_(0),
239 mtu_(1460),
240 loss_(0),
241 lose_first_packet_(false),
242 damage_(false),
243 dtls_(dtls),
244 handshake_wait_(5000),
245 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000246 // Set use of the test RNG to get predictable loss patterns.
247 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000248 }
249
250 ~SSLStreamAdapterTestBase() {
251 // Put it back for the next test.
252 rtc::SetRandomTestMode(false);
253 }
254
torbjorng7593aad2015-11-19 12:20:51 -0800255 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800256 CreateStreams();
257
258 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
259 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
260
261 // Set up the slots
262 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
263 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
264
265 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
266 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
267 client_private_key_pem_, client_cert_pem_);
268 } else {
269 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
270 }
271 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
272
273 client_ssl_->SetIdentity(client_identity_);
274 server_ssl_->SetIdentity(server_identity_);
275 }
276
torbjorng7593aad2015-11-19 12:20:51 -0800277 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800278 client_ssl_.reset(nullptr);
279 server_ssl_.reset(nullptr);
280 }
281
282 virtual void CreateStreams() = 0;
283
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000284 // Recreate the client/server identities with the specified validity period.
285 // |not_before| and |not_after| are offsets from the current time in number
286 // of seconds.
287 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800288 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000289
290 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
291 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
292
293 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
294 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
295
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100296 time_t now = time(nullptr);
297
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000298 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700299 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100301 client_params.not_before = now + not_before;
302 client_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000303 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
304
305 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700306 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000307 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100308 server_params.not_before = now + not_before;
309 server_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000310 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
311
312 client_ssl_->SetIdentity(client_identity_);
313 server_ssl_->SetIdentity(server_identity_);
314 }
315
316 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
317 LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
318
319 if (sig & rtc::SE_READ) {
320 ReadData(stream);
321 }
322
323 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
324 WriteData();
325 }
326 }
327
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700328 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
329 unsigned char server_digest[20];
330 size_t server_digest_len;
331 unsigned char client_digest[20];
332 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333 bool rv;
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700334 rtc::SSLPeerCertificateDigestError err;
335 rtc::SSLPeerCertificateDigestError expected_err =
336 expect_success
337 ? rtc::SSLPeerCertificateDigestError::NONE
338 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339
340 LOG(LS_INFO) << "Setting peer identities by digest";
341
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700342 rv = server_identity_->certificate().ComputeDigest(
343 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000344 ASSERT_TRUE(rv);
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700345 rv = client_identity_->certificate().ComputeDigest(
346 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
347 ASSERT_TRUE(rv);
348
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000349 if (!correct) {
350 LOG(LS_INFO) << "Setting bogus digest for server cert";
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700351 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352 }
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700353 err = client_ssl_->SetPeerCertificateDigest(
354 rtc::DIGEST_SHA_1, server_digest, server_digest_len);
355 EXPECT_EQ(expected_err, err);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000356
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000357 if (!correct) {
358 LOG(LS_INFO) << "Setting bogus digest for client cert";
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700359 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000360 }
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700361 err = server_ssl_->SetPeerCertificateDigest(
362 rtc::DIGEST_SHA_1, client_digest, client_digest_len);
363 EXPECT_EQ(expected_err, err);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000364
365 identities_set_ = true;
366 }
367
Joachim Bauch831c5582015-05-20 12:48:41 +0200368 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
369 rtc::SSLProtocolVersion client_version) {
370 server_ssl_->SetMaxProtocolVersion(server_version);
371 client_ssl_->SetMaxProtocolVersion(client_version);
372 }
373
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000374 void TestHandshake(bool expect_success = true) {
375 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
376 rtc::SSL_MODE_TLS);
377 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
378 rtc::SSL_MODE_TLS);
379
380 if (!dtls_) {
381 // Make sure we simulate a reliable network for TLS.
382 // This is just a check to make sure that people don't write wrong
383 // tests.
384 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
385 }
386
387 if (!identities_set_)
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700388 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000389
390 // Start the handshake
391 int rv;
392
393 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700394 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395 ASSERT_EQ(0, rv);
396
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700397 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 ASSERT_EQ(0, rv);
399
400 // Now run the handshake
401 if (expect_success) {
402 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
403 && (server_ssl_->GetState() == rtc::SS_OPEN),
404 handshake_wait_);
405 } else {
406 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
407 handshake_wait_);
408 }
409 }
410
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700411 // This tests that the handshake can complete before the identity is
412 // verified, and the identity will be verified after the fact.
413 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
414 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
415 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
416
417 if (!dtls_) {
418 // Make sure we simulate a reliable network for TLS.
419 // This is just a check to make sure that people don't write wrong
420 // tests.
421 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
422 }
423
424 // Start the handshake
425 int rv;
426
427 server_ssl_->SetServerRole();
428 rv = server_ssl_->StartSSL();
429 ASSERT_EQ(0, rv);
430
431 rv = client_ssl_->StartSSL();
432 ASSERT_EQ(0, rv);
433
434 // Now run the handshake.
435 EXPECT_TRUE_WAIT(
436 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
437 handshake_wait_);
438
439 // Until the identity has been verified, the state should still be
440 // SS_OPENING and writes should return SR_BLOCK.
441 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
442 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
443 unsigned char packet[1];
444 size_t sent;
445 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
446 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
447
448 // If we set an invalid identity at this point, SetPeerCertificateDigest
449 // should return false.
450 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
451 // State should then transition to SS_OPEN or SS_CLOSED based on validation
452 // of the identity.
453 if (valid_identity) {
454 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
455 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
456 } else {
457 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
458 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
459 }
460 }
461
jbauche488a0d2015-11-19 05:17:58 -0800462 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data,
463 size_t data_len, size_t *written,
464 int *error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000465 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200466 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000467 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
468 *written = data_len;
469 return rtc::SR_SUCCESS;
470 }
471 if (dtls_ && (data_len > mtu_)) {
472 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len;
473 *written = data_len;
474 return rtc::SR_SUCCESS;
475 }
476
477 // Optionally damage application data (type 23). Note that we don't damage
478 // handshake packets and we damage the last byte to keep the header
479 // intact but break the MAC.
480 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
481 std::vector<char> buf(data_len);
482
483 LOG(LS_INFO) << "Damaging packet";
484
485 memcpy(&buf[0], data, data_len);
486 buf[data_len - 1]++;
487
488 return from->WriteData(&buf[0], data_len, written, error);
489 }
490
491 return from->WriteData(data, data_len, written, error);
492 }
493
494 void SetDelay(int delay) {
495 delay_ = delay;
496 }
497 int GetDelay() { return delay_; }
498
499 void SetLoseFirstPacket(bool lose) {
500 lose_first_packet_ = lose;
501 }
502 bool GetLoseFirstPacket() { return lose_first_packet_; }
503
504 void SetLoss(int percent) {
505 loss_ = percent;
506 }
507
508 void SetDamage() {
509 damage_ = true;
510 }
511
512 void SetMtu(size_t mtu) {
513 mtu_ = mtu;
514 }
515
516 void SetHandshakeWait(int wait) {
517 handshake_wait_ = wait;
518 }
519
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800520 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000521 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800522 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000523 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800524 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000525 }
526
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800527 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000528 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800529 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000530 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800531 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000532 }
533
jbauch555604a2016-04-26 03:13:22 -0700534 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000535 if (client)
kwibergb4d01c42016-04-06 05:15:06 -0700536 return client_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000537 else
kwibergb4d01c42016-04-06 05:15:06 -0700538 return server_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000539 }
540
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700541 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000542 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700543 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000544 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700545 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000546 }
547
torbjorng43166b82016-03-11 00:06:47 -0800548 int GetSslVersion(bool client) {
549 if (client)
550 return client_ssl_->GetSslVersion();
551 else
552 return server_ssl_->GetSslVersion();
553 }
554
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000555 bool ExportKeyingMaterial(const char *label,
556 const unsigned char *context,
557 size_t context_len,
558 bool use_context,
559 bool client,
560 unsigned char *result,
561 size_t result_len) {
562 if (client)
563 return client_ssl_->ExportKeyingMaterial(label,
564 context, context_len,
565 use_context,
566 result, result_len);
567 else
568 return server_ssl_->ExportKeyingMaterial(label,
569 context, context_len,
570 use_context,
571 result, result_len);
572 }
573
574 // To be implemented by subclasses.
575 virtual void WriteData() = 0;
576 virtual void ReadData(rtc::StreamInterface *stream) = 0;
577 virtual void TestTransfer(int size) = 0;
578
579 protected:
jbauche488a0d2015-11-19 05:17:58 -0800580 std::string client_cert_pem_;
581 std::string client_private_key_pem_;
582 rtc::KeyParams client_key_type_;
583 rtc::KeyParams server_key_type_;
584 SSLDummyStreamBase *client_stream_; // freed by client_ssl_ destructor
585 SSLDummyStreamBase *server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700586 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
587 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000588 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
589 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
590 int delay_;
591 size_t mtu_;
592 int loss_;
593 bool lose_first_packet_;
594 bool damage_;
595 bool dtls_;
596 int handshake_wait_;
597 bool identities_set_;
598};
599
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200600class SSLStreamAdapterTestTLS
601 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700602 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000603 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200604 SSLStreamAdapterTestTLS()
605 : SSLStreamAdapterTestBase("",
606 "",
607 false,
608 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800609 ::testing::get<1>(GetParam())),
610 client_buffer_(kFifoBufferSize),
611 server_buffer_(kFifoBufferSize) {
612 }
613
torbjorng7593aad2015-11-19 12:20:51 -0800614 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800615 client_stream_ =
616 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
617 server_stream_ =
618 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
619 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000620
621 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700622 void TestTransfer(int size) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000623 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
624 // Create some dummy data to send.
625 size_t received;
626
627 send_stream_.ReserveSize(size);
628 for (int i = 0; i < size; ++i) {
629 char ch = static_cast<char>(i);
630 send_stream_.Write(&ch, 1, NULL, NULL);
631 }
632 send_stream_.Rewind();
633
634 // Prepare the receive stream.
635 recv_stream_.ReserveSize(size);
636
637 // Start sending
638 WriteData();
639
640 // Wait for the client to close
641 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
642
643 // Now check the data
644 recv_stream_.GetSize(&received);
645
646 EXPECT_EQ(static_cast<size_t>(size), received);
647 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
648 recv_stream_.GetBuffer(), size));
649 }
650
nisseef8b61e2016-04-29 06:09:15 -0700651 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000652 size_t position, tosend, size;
653 rtc::StreamResult rv;
654 size_t sent;
655 char block[kBlockSize];
656
657 send_stream_.GetSize(&size);
658 if (!size)
659 return;
660
661 for (;;) {
662 send_stream_.GetPosition(&position);
663 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
664 rtc::SR_EOS) {
665 rv = client_ssl_->Write(block, tosend, &sent, 0);
666
667 if (rv == rtc::SR_SUCCESS) {
668 send_stream_.SetPosition(position + sent);
669 LOG(LS_VERBOSE) << "Sent: " << position + sent;
670 } else if (rv == rtc::SR_BLOCK) {
671 LOG(LS_VERBOSE) << "Blocked...";
672 send_stream_.SetPosition(position);
673 break;
674 } else {
675 ADD_FAILURE();
676 break;
677 }
678 } else {
679 // Now close
680 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
681 client_ssl_->Close();
682 break;
683 }
684 }
685 };
686
nisseef8b61e2016-04-29 06:09:15 -0700687 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000688 char buffer[1600];
689 size_t bread;
690 int err2;
691 rtc::StreamResult r;
692
693 for (;;) {
694 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
695
696 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
697 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800698 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000699 stream->Close();
700 return;
701 }
702
703 if (r == rtc::SR_BLOCK)
704 break;
705
706 ASSERT_EQ(rtc::SR_SUCCESS, r);
707 LOG(LS_INFO) << "Read " << bread;
708
709 recv_stream_.Write(buffer, bread, NULL, NULL);
710 }
711 }
712
713 private:
jbauche488a0d2015-11-19 05:17:58 -0800714 rtc::FifoBuffer client_buffer_;
715 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000716 rtc::MemoryStream send_stream_;
717 rtc::MemoryStream recv_stream_;
718};
719
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200720class SSLStreamAdapterTestDTLS
721 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700722 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000723 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200724 SSLStreamAdapterTestDTLS()
725 : SSLStreamAdapterTestBase("",
726 "",
727 true,
728 ::testing::get<0>(GetParam()),
729 ::testing::get<1>(GetParam())),
jbauche488a0d2015-11-19 05:17:58 -0800730 client_buffer_(kBufferCapacity, kDefaultBufferSize),
731 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200732 packet_size_(1000),
733 count_(0),
734 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000735
736 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
737 const std::string& private_key_pem) :
738 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
jbauche488a0d2015-11-19 05:17:58 -0800739 client_buffer_(kBufferCapacity, kDefaultBufferSize),
740 server_buffer_(kBufferCapacity, kDefaultBufferSize),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000741 packet_size_(1000), count_(0), sent_(0) {
742 }
743
torbjorng7593aad2015-11-19 12:20:51 -0800744 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800745 client_stream_ =
746 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
747 server_stream_ =
748 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
749 }
750
nisseef8b61e2016-04-29 06:09:15 -0700751 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000752 unsigned char *packet = new unsigned char[1600];
753
jbauche488a0d2015-11-19 05:17:58 -0800754 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800755 unsigned int rand_state = sent_;
756 packet[0] = sent_;
757 for (size_t i = 1; i < packet_size_; i++) {
758 // This is a simple LC PRNG. Keep in synch with identical code below.
759 rand_state = (rand_state * 251 + 19937) >> 7;
760 packet[i] = rand_state & 0xff;
761 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000762
763 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800764 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000765 if (rv == rtc::SR_SUCCESS) {
766 LOG(LS_VERBOSE) << "Sent: " << sent_;
767 sent_++;
768 } else if (rv == rtc::SR_BLOCK) {
769 LOG(LS_VERBOSE) << "Blocked...";
770 break;
771 } else {
772 ADD_FAILURE();
773 break;
774 }
jbauche488a0d2015-11-19 05:17:58 -0800775 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000776
777 delete [] packet;
778 }
779
nisseef8b61e2016-04-29 06:09:15 -0700780 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000781 unsigned char buffer[2000];
782 size_t bread;
783 int err2;
784 rtc::StreamResult r;
785
786 for (;;) {
787 r = stream->Read(buffer, 2000, &bread, &err2);
788
789 if (r == rtc::SR_ERROR) {
790 // Unfortunately, errors are the way that the stream adapter
791 // signals close right now
792 stream->Close();
793 return;
794 }
795
796 if (r == rtc::SR_BLOCK)
797 break;
798
799 ASSERT_EQ(rtc::SR_SUCCESS, r);
800 LOG(LS_INFO) << "Read " << bread;
801
802 // Now parse the datagram
803 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800804 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000805
torbjorng7593aad2015-11-19 12:20:51 -0800806 unsigned int rand_state = packet_num;
807 for (size_t i = 1; i < packet_size_; i++) {
808 // This is a simple LC PRNG. Keep in synch with identical code above.
809 rand_state = (rand_state * 251 + 19937) >> 7;
810 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000811 }
812 received_.insert(packet_num);
813 }
814 }
815
nisseef8b61e2016-04-29 06:09:15 -0700816 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000817 count_ = count;
818
819 WriteData();
820
821 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
822 LOG(LS_INFO) << "sent_ == " << sent_;
823
824 if (damage_) {
825 WAIT(false, 2000);
826 EXPECT_EQ(0U, received_.size());
827 } else if (loss_ == 0) {
828 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
829 } else {
830 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
831 received_.size();
832 }
833 };
834
835 private:
jbauche488a0d2015-11-19 05:17:58 -0800836 BufferQueueStream client_buffer_;
837 BufferQueueStream server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000838 size_t packet_size_;
839 int count_;
840 int sent_;
841 std::set<int> received_;
842};
843
844
jbauche488a0d2015-11-19 05:17:58 -0800845rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000846 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000847 LOG(LS_INFO) << "Writing to loopback " << data_len;
848
849 if (first_packet_) {
850 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800851 if (test_base_->GetLoseFirstPacket()) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000852 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800853 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000854 return rtc::SR_SUCCESS;
855 }
856 }
857
jbauche488a0d2015-11-19 05:17:58 -0800858 return test_base_->DataWritten(this, data, data_len, written, error);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000859};
860
861class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
862 public:
863 SSLStreamAdapterTestDTLSFromPEMStrings() :
864 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
865 }
866};
867
868// Basic tests: TLS
869
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000870// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200871TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000872 TestHandshake();
873};
874
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000875// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200876TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000877 TestHandshake();
878 client_ssl_->Close();
879 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
880};
881
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000882// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200883TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000884 TestHandshake();
885 TestTransfer(100000);
886};
887
888// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200889TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000890 TestHandshake();
891 TestTransfer(100000);
892 client_ssl_->Close();
893
894 rtc::StreamResult rv;
895 char block[kBlockSize];
896 size_t dummy;
897
898 // It's an error to write after closed.
899 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
900 ASSERT_EQ(rtc::SR_ERROR, rv);
901
902 // But after closed read gives you EOS.
903 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
904 ASSERT_EQ(rtc::SR_EOS, rv);
905};
906
907// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200908TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700909 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000910 TestHandshake(false);
911};
912
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700913TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
914 TestHandshakeWithDelayedIdentity(true);
915};
916
917TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
918 TestHandshakeWithDelayedIdentity(false);
919};
920
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000921// Test moving a bunch of data
922
923// Basic tests: DTLS
924// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200925TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000926 MAYBE_SKIP_TEST(HaveDtls);
927 TestHandshake();
928};
929
930// Test that we can make a handshake work if the first packet in
931// each direction is lost. This gives us predictable loss
932// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200933TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000934 MAYBE_SKIP_TEST(HaveDtls);
935 SetLoseFirstPacket(true);
936 TestHandshake();
937};
938
939// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200940TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000941 MAYBE_SKIP_TEST(HaveDtls);
942 SetLoseFirstPacket(true);
943 SetDelay(2000);
944 SetHandshakeWait(20000);
945 TestHandshake();
946};
947
948// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000949// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200950TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000951 MAYBE_SKIP_TEST(HaveDtls);
952 SetMtu(700);
953 SetHandshakeWait(20000);
954 TestHandshake();
955};
956
957// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -0800958TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000959 MAYBE_SKIP_TEST(HaveDtls);
960 TestHandshake();
961 TestTransfer(100);
962};
963
jbauche488a0d2015-11-19 05:17:58 -0800964TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000965 MAYBE_SKIP_TEST(HaveDtls);
966 TestHandshake();
967 SetLoss(10);
968 TestTransfer(100);
969};
970
jbauche488a0d2015-11-19 05:17:58 -0800971TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000972 MAYBE_SKIP_TEST(HaveDtls);
973 SetDamage(); // Must be called first because first packet
974 // write happens at end of handshake.
975 TestHandshake();
976 TestTransfer(100);
977};
978
Taylor Brandstetter042041b2016-09-19 16:02:23 -0700979TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
980 TestHandshakeWithDelayedIdentity(true);
981};
982
983TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
984 TestHandshakeWithDelayedIdentity(false);
985};
986
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000987// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200988TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000989 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800990 std::vector<int> high;
991 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
992 SetDtlsSrtpCryptoSuites(high, true);
993 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000994 TestHandshake();
995
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800996 int client_cipher;
997 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
998 int server_cipher;
999 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001000
1001 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001002 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001003};
1004
1005// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001006TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001007 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001008 std::vector<int> low;
1009 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1010 SetDtlsSrtpCryptoSuites(low, true);
1011 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001012 TestHandshake();
1013
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001014 int client_cipher;
1015 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1016 int server_cipher;
1017 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001018
1019 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001020 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001021};
1022
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001023// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001024TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001025 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001026 std::vector<int> high;
1027 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1028 std::vector<int> low;
1029 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1030 SetDtlsSrtpCryptoSuites(high, true);
1031 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001032 TestHandshake();
1033
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001034 int client_cipher;
1035 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1036 int server_cipher;
1037 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001038};
1039
1040// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001041TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001043 std::vector<int> mixed;
1044 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1045 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1046 SetDtlsSrtpCryptoSuites(mixed, true);
1047 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001048 TestHandshake();
1049
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001050 int client_cipher;
1051 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1052 int server_cipher;
1053 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001054
1055 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001056 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001057};
1058
jbauchcb560652016-08-04 05:20:32 -07001059// Test DTLS-SRTP with all GCM-128 ciphers.
1060TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
1061 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1062 std::vector<int> gcm128;
1063 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1064 SetDtlsSrtpCryptoSuites(gcm128, true);
1065 SetDtlsSrtpCryptoSuites(gcm128, false);
1066 TestHandshake();
1067
1068 int client_cipher;
1069 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1070 int server_cipher;
1071 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1072
1073 ASSERT_EQ(client_cipher, server_cipher);
1074 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
1075};
1076
1077// Test DTLS-SRTP with all GCM-256 ciphers.
1078TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
1079 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1080 std::vector<int> gcm256;
1081 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1082 SetDtlsSrtpCryptoSuites(gcm256, true);
1083 SetDtlsSrtpCryptoSuites(gcm256, false);
1084 TestHandshake();
1085
1086 int client_cipher;
1087 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1088 int server_cipher;
1089 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1090
1091 ASSERT_EQ(client_cipher, server_cipher);
1092 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1093};
1094
1095// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1096TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
1097 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1098 std::vector<int> gcm128;
1099 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1100 std::vector<int> gcm256;
1101 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1102 SetDtlsSrtpCryptoSuites(gcm128, true);
1103 SetDtlsSrtpCryptoSuites(gcm256, false);
1104 TestHandshake();
1105
1106 int client_cipher;
1107 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1108 int server_cipher;
1109 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1110};
1111
1112// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1113TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
1114 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1115 std::vector<int> gcmBoth;
1116 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1117 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1118 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1119 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1120 TestHandshake();
1121
1122 int client_cipher;
1123 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1124 int server_cipher;
1125 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1126
1127 ASSERT_EQ(client_cipher, server_cipher);
1128 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1129};
1130
1131// Test SRTP cipher suite lengths.
1132TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1133 int key_len;
1134 int salt_len;
1135
1136 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(
1137 rtc::SRTP_INVALID_CRYPTO_SUITE, &key_len, &salt_len));
1138
1139 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1140 rtc::SRTP_AES128_CM_SHA1_32, &key_len, &salt_len));
1141 ASSERT_EQ(128/8, key_len);
1142 ASSERT_EQ(112/8, salt_len);
1143
1144 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1145 rtc::SRTP_AES128_CM_SHA1_80, &key_len, &salt_len));
1146 ASSERT_EQ(128/8, key_len);
1147 ASSERT_EQ(112/8, salt_len);
1148
1149 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1150 rtc::SRTP_AEAD_AES_128_GCM, &key_len, &salt_len));
1151 ASSERT_EQ(128/8, key_len);
1152 ASSERT_EQ(96/8, salt_len);
1153
1154 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1155 rtc::SRTP_AEAD_AES_256_GCM, &key_len, &salt_len));
1156 ASSERT_EQ(256/8, key_len);
1157 ASSERT_EQ(96/8, salt_len);
1158};
1159
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001160// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001161TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001162 MAYBE_SKIP_TEST(HaveExporter);
1163 TestHandshake();
1164 unsigned char client_out[20];
1165 unsigned char server_out[20];
1166
1167 bool result;
1168 result = ExportKeyingMaterial(kExporterLabel,
1169 kExporterContext, kExporterContextLen,
1170 true, true,
1171 client_out, sizeof(client_out));
1172 ASSERT_TRUE(result);
1173
1174 result = ExportKeyingMaterial(kExporterLabel,
1175 kExporterContext, kExporterContextLen,
1176 true, false,
1177 server_out, sizeof(server_out));
1178 ASSERT_TRUE(result);
1179
1180 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1181}
1182
1183// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001184TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001185 MAYBE_SKIP_TEST(HaveDtls);
1186 long one_day = 60 * 60 * 24;
1187 // Make the certificates not valid until one day later.
1188 ResetIdentitiesWithValidity(one_day, one_day);
1189 TestHandshake();
1190}
1191
1192// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001193TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001194 MAYBE_SKIP_TEST(HaveDtls);
1195 long one_day = 60 * 60 * 24;
1196 // Make the certificates already expired.
1197 ResetIdentitiesWithValidity(-one_day, -one_day);
1198 TestHandshake();
1199}
1200
1201// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001202TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001203 MAYBE_SKIP_TEST(HaveDtls);
1204 TestHandshake();
1205 TestTransfer(100);
1206}
1207
1208// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001209TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001210 MAYBE_SKIP_TEST(HaveDtls);
1211
1212 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001213 ASSERT_FALSE(GetPeerCertificate(true));
1214 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001215
1216 TestHandshake();
1217
1218 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001219 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001220 GetPeerCertificate(true);
1221 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001222
1223 // It's not kCERT_PEM.
1224 std::string client_peer_string = client_peer_cert->ToPEMString();
1225 ASSERT_NE(kCERT_PEM, client_peer_string);
1226
1227 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001228 ASSERT_FALSE(client_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001229
1230 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001231 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001232 GetPeerCertificate(false);
1233 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001234
1235 // It's kCERT_PEM
1236 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
1237
1238 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001239 ASSERT_FALSE(server_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001240}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001241
1242// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +02001243// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001244TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001245 MAYBE_SKIP_TEST(HaveDtls);
Joachim Bauch831c5582015-05-20 12:48:41 +02001246 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001247 TestHandshake();
1248
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001249 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001250 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001251 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001252 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001253
torbjorng43166b82016-03-11 00:06:47 -08001254 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1255 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1256
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001257 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001258 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1259 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001260}
1261
1262// Test getting the used DTLS 1.2 ciphers.
1263// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001264TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001265 MAYBE_SKIP_TEST(HaveDtls);
1266 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1267 TestHandshake();
1268
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001269 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001270 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001271 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001272 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001273
torbjorng43166b82016-03-11 00:06:47 -08001274 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1275 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1276
Joachim Bauch831c5582015-05-20 12:48:41 +02001277 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001278 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1279 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001280}
1281
1282// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001283TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001284 MAYBE_SKIP_TEST(HaveDtls);
1285 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1286 TestHandshake();
1287
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001288 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001289 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001290 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001291 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001292
torbjorng43166b82016-03-11 00:06:47 -08001293 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1294 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1295
Joachim Bauch831c5582015-05-20 12:48:41 +02001296 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001297 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1298 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001299}
1300
1301// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001302TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001303 MAYBE_SKIP_TEST(HaveDtls);
1304 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1305 TestHandshake();
1306
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001307 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001308 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001309 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001310 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001311
torbjorng43166b82016-03-11 00:06:47 -08001312 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1313 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1314
Joachim Bauch831c5582015-05-20 12:48:41 +02001315 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001316 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1317 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001318}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001319
torbjorng4e572472015-10-08 09:42:49 -07001320// The RSA keysizes here might look strange, why not include the RFC's size
1321// 2048?. The reason is test case slowness; testing two sizes to exercise
1322// parametrization is sufficient.
1323INSTANTIATE_TEST_CASE_P(
1324 SSLStreamAdapterTestsTLS,
1325 SSLStreamAdapterTestTLS,
1326 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1327 rtc::KeyParams::RSA(1152, 65537),
1328 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1329 Values(rtc::KeyParams::RSA(1024, 65537),
1330 rtc::KeyParams::RSA(1152, 65537),
1331 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1332INSTANTIATE_TEST_CASE_P(
1333 SSLStreamAdapterTestsDTLS,
1334 SSLStreamAdapterTestDTLS,
1335 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1336 rtc::KeyParams::RSA(1152, 65537),
1337 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1338 Values(rtc::KeyParams::RSA(1024, 65537),
1339 rtc::KeyParams::RSA(1152, 65537),
1340 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));