blob: 82036913e0ea7eaedc7ef134409a6a37767d1a61 [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"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000022#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
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000067class SSLStreamAdapterTestBase;
68
jbauche488a0d2015-11-19 05:17:58 -080069class SSLDummyStreamBase : public rtc::StreamInterface,
70 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000071 public:
jbauche488a0d2015-11-19 05:17:58 -080072 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
73 const std::string &side,
74 rtc::StreamInterface* in,
75 rtc::StreamInterface* out) :
76 test_base_(test),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000077 side_(side),
78 in_(in),
79 out_(out),
80 first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -080081 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
82 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083 }
84
jbauche488a0d2015-11-19 05:17:58 -080085 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086
jbauche488a0d2015-11-19 05:17:58 -080087 rtc::StreamResult Read(void* buffer, size_t buffer_len,
88 size_t* read, int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 rtc::StreamResult r;
90
91 r = in_->Read(buffer, buffer_len, read, error);
92 if (r == rtc::SR_BLOCK)
93 return rtc::SR_BLOCK;
94 if (r == rtc::SR_EOS)
95 return rtc::SR_EOS;
96
97 if (r != rtc::SR_SUCCESS) {
98 ADD_FAILURE();
99 return rtc::SR_ERROR;
100 }
101
102 return rtc::SR_SUCCESS;
103 }
104
105 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800106 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
108
109 if (sig & mask) {
skvlad3078b552017-01-18 15:29:35 -0800110 LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
111 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000112 PostEvent(sig & mask, 0);
113 }
114 }
115
116 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800117 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118 if (sig & rtc::SE_WRITE) {
skvlad3078b552017-01-18 15:29:35 -0800119 LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
120 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000121
122 PostEvent(sig & rtc::SE_WRITE, 0);
123 }
124 }
125
126 // Write to the outgoing FifoBuffer
127 rtc::StreamResult WriteData(const void* data, size_t data_len,
jbauche488a0d2015-11-19 05:17:58 -0800128 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000129 return out_->Write(data, data_len, written, error);
130 }
131
jbauche488a0d2015-11-19 05:17:58 -0800132 rtc::StreamResult Write(const void* data, size_t data_len,
133 size_t* written, int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134
jbauche488a0d2015-11-19 05:17:58 -0800135 void Close() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000136 LOG(LS_INFO) << "Closing outbound stream";
137 out_->Close();
138 }
139
jbauche488a0d2015-11-19 05:17:58 -0800140 protected:
141 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800143 rtc::StreamInterface* in_;
144 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000145 bool first_packet_;
146};
147
jbauche488a0d2015-11-19 05:17:58 -0800148class SSLDummyStreamTLS : public SSLDummyStreamBase {
149 public:
150 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
151 const std::string& side,
152 rtc::FifoBuffer* in,
153 rtc::FifoBuffer* out) :
154 SSLDummyStreamBase(test, side, in, out) {
155 }
156};
157
158class BufferQueueStream : public rtc::BufferQueue,
159 public rtc::StreamInterface {
160 public:
161 BufferQueueStream(size_t capacity, size_t default_size)
162 : rtc::BufferQueue(capacity, default_size) {
163 }
164
165 // Implementation of abstract StreamInterface methods.
166
167 // A buffer queue stream is always "open".
168 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
169
170 // Reading a buffer queue stream will either succeed or block.
171 rtc::StreamResult Read(void* buffer, size_t buffer_len,
172 size_t* read, int* error) override {
173 if (!ReadFront(buffer, buffer_len, read)) {
174 return rtc::SR_BLOCK;
175 }
176 return rtc::SR_SUCCESS;
177 }
178
179 // Writing to a buffer queue stream will either succeed or block.
180 rtc::StreamResult Write(const void* data, size_t data_len,
181 size_t* written, int* error) override {
182 if (!WriteBack(data, data_len, written)) {
183 return rtc::SR_BLOCK;
184 }
185 return rtc::SR_SUCCESS;
186 }
187
188 // A buffer queue stream can not be closed.
189 void Close() override {}
190
191 protected:
192 void NotifyReadableForTest() override {
193 PostEvent(rtc::SE_READ, 0);
194 }
195
196 void NotifyWritableForTest() override {
197 PostEvent(rtc::SE_WRITE, 0);
198 }
199};
200
201class SSLDummyStreamDTLS : public SSLDummyStreamBase {
202 public:
203 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
204 const std::string& side,
205 BufferQueueStream* in,
206 BufferQueueStream* out) :
207 SSLDummyStreamBase(test, side, in, out) {
208 }
209};
210
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000211static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800212static const int kBufferCapacity = 1;
213static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214
215class SSLStreamAdapterTestBase : public testing::Test,
216 public sigslot::has_slots<> {
217 public:
torbjorng4e572472015-10-08 09:42:49 -0700218 SSLStreamAdapterTestBase(
219 const std::string& client_cert_pem,
220 const std::string& client_private_key_pem,
221 bool dtls,
222 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
223 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800224 : client_cert_pem_(client_cert_pem),
225 client_private_key_pem_(client_private_key_pem),
226 client_key_type_(client_key_type),
227 server_key_type_(server_key_type),
228 client_stream_(NULL),
229 server_stream_(NULL),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200230 client_identity_(NULL),
231 server_identity_(NULL),
232 delay_(0),
233 mtu_(1460),
234 loss_(0),
235 lose_first_packet_(false),
236 damage_(false),
237 dtls_(dtls),
238 handshake_wait_(5000),
239 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000240 // Set use of the test RNG to get predictable loss patterns.
241 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000242 }
243
244 ~SSLStreamAdapterTestBase() {
245 // Put it back for the next test.
246 rtc::SetRandomTestMode(false);
247 }
248
torbjorng7593aad2015-11-19 12:20:51 -0800249 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800250 CreateStreams();
251
252 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
253 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
254
255 // Set up the slots
256 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
257 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
258
259 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
260 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
261 client_private_key_pem_, client_cert_pem_);
262 } else {
263 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
264 }
265 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
266
267 client_ssl_->SetIdentity(client_identity_);
268 server_ssl_->SetIdentity(server_identity_);
269 }
270
torbjorng7593aad2015-11-19 12:20:51 -0800271 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800272 client_ssl_.reset(nullptr);
273 server_ssl_.reset(nullptr);
274 }
275
276 virtual void CreateStreams() = 0;
277
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000278 // Recreate the client/server identities with the specified validity period.
279 // |not_before| and |not_after| are offsets from the current time in number
280 // of seconds.
281 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800282 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000283
284 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
285 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
286
287 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
288 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
289
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100290 time_t now = time(nullptr);
291
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000292 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700293 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000294 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100295 client_params.not_before = now + not_before;
296 client_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000297 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
298
299 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700300 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000301 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100302 server_params.not_before = now + not_before;
303 server_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000304 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
305
306 client_ssl_->SetIdentity(client_identity_);
307 server_ssl_->SetIdentity(server_identity_);
308 }
309
310 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
skvlad3078b552017-01-18 15:29:35 -0800311 LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000312
313 if (sig & rtc::SE_READ) {
314 ReadData(stream);
315 }
316
317 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
318 WriteData();
319 }
320 }
321
deadbeef89824f62016-09-30 11:55:43 -0700322 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
323 unsigned char server_digest[20];
324 size_t server_digest_len;
325 unsigned char client_digest[20];
326 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000327 bool rv;
deadbeef89824f62016-09-30 11:55:43 -0700328 rtc::SSLPeerCertificateDigestError err;
329 rtc::SSLPeerCertificateDigestError expected_err =
330 expect_success
331 ? rtc::SSLPeerCertificateDigestError::NONE
332 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333
334 LOG(LS_INFO) << "Setting peer identities by digest";
335
deadbeef89824f62016-09-30 11:55:43 -0700336 rv = server_identity_->certificate().ComputeDigest(
337 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000338 ASSERT_TRUE(rv);
deadbeef89824f62016-09-30 11:55:43 -0700339 rv = client_identity_->certificate().ComputeDigest(
340 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
341 ASSERT_TRUE(rv);
342
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000343 if (!correct) {
344 LOG(LS_INFO) << "Setting bogus digest for server cert";
deadbeef89824f62016-09-30 11:55:43 -0700345 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000346 }
deadbeef89824f62016-09-30 11:55:43 -0700347 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
348 server_digest_len, &err);
349 EXPECT_EQ(expected_err, err);
350 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000351
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352 if (!correct) {
353 LOG(LS_INFO) << "Setting bogus digest for client cert";
deadbeef89824f62016-09-30 11:55:43 -0700354 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355 }
deadbeef89824f62016-09-30 11:55:43 -0700356 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
357 client_digest_len, &err);
358 EXPECT_EQ(expected_err, err);
359 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000360
361 identities_set_ = true;
362 }
363
Joachim Bauch831c5582015-05-20 12:48:41 +0200364 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
365 rtc::SSLProtocolVersion client_version) {
366 server_ssl_->SetMaxProtocolVersion(server_version);
367 client_ssl_->SetMaxProtocolVersion(client_version);
368 }
369
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000370 void TestHandshake(bool expect_success = true) {
371 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
372 rtc::SSL_MODE_TLS);
373 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
374 rtc::SSL_MODE_TLS);
375
376 if (!dtls_) {
377 // Make sure we simulate a reliable network for TLS.
378 // This is just a check to make sure that people don't write wrong
379 // tests.
nissec8ee8822017-01-18 07:20:55 -0800380 RTC_CHECK((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000381 }
382
383 if (!identities_set_)
deadbeef89824f62016-09-30 11:55:43 -0700384 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000385
386 // Start the handshake
387 int rv;
388
389 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700390 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000391 ASSERT_EQ(0, rv);
392
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700393 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000394 ASSERT_EQ(0, rv);
395
396 // Now run the handshake
397 if (expect_success) {
398 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
399 && (server_ssl_->GetState() == rtc::SS_OPEN),
400 handshake_wait_);
401 } else {
402 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
403 handshake_wait_);
404 }
405 }
406
deadbeef89824f62016-09-30 11:55:43 -0700407 // This tests that the handshake can complete before the identity is
408 // verified, and the identity will be verified after the fact.
409 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
410 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
411 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
412
413 if (!dtls_) {
414 // Make sure we simulate a reliable network for TLS.
415 // This is just a check to make sure that people don't write wrong
416 // tests.
nissec8ee8822017-01-18 07:20:55 -0800417 RTC_CHECK((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
deadbeef89824f62016-09-30 11:55:43 -0700418 }
419
420 // Start the handshake
421 int rv;
422
423 server_ssl_->SetServerRole();
424 rv = server_ssl_->StartSSL();
425 ASSERT_EQ(0, rv);
426
427 rv = client_ssl_->StartSSL();
428 ASSERT_EQ(0, rv);
429
430 // Now run the handshake.
431 EXPECT_TRUE_WAIT(
432 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
433 handshake_wait_);
434
435 // Until the identity has been verified, the state should still be
436 // SS_OPENING and writes should return SR_BLOCK.
437 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
438 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
439 unsigned char packet[1];
440 size_t sent;
441 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
442 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
443
444 // If we set an invalid identity at this point, SetPeerCertificateDigest
445 // should return false.
446 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
447 // State should then transition to SS_OPEN or SS_CLOSED based on validation
448 // of the identity.
449 if (valid_identity) {
450 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
451 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
452 } else {
453 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
454 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
455 }
456 }
457
jbauche488a0d2015-11-19 05:17:58 -0800458 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data,
459 size_t data_len, size_t *written,
460 int *error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000461 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200462 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
skvlad3078b552017-01-18 15:29:35 -0800463 LOG(LS_VERBOSE) << "Randomly dropping packet, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000464 *written = data_len;
465 return rtc::SR_SUCCESS;
466 }
467 if (dtls_ && (data_len > mtu_)) {
skvlad3078b552017-01-18 15:29:35 -0800468 LOG(LS_VERBOSE) << "Dropping packet > mtu, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000469 *written = data_len;
470 return rtc::SR_SUCCESS;
471 }
472
473 // Optionally damage application data (type 23). Note that we don't damage
474 // handshake packets and we damage the last byte to keep the header
475 // intact but break the MAC.
476 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
477 std::vector<char> buf(data_len);
478
skvlad3078b552017-01-18 15:29:35 -0800479 LOG(LS_VERBOSE) << "Damaging packet";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000480
481 memcpy(&buf[0], data, data_len);
482 buf[data_len - 1]++;
483
484 return from->WriteData(&buf[0], data_len, written, error);
485 }
486
487 return from->WriteData(data, data_len, written, error);
488 }
489
490 void SetDelay(int delay) {
491 delay_ = delay;
492 }
493 int GetDelay() { return delay_; }
494
495 void SetLoseFirstPacket(bool lose) {
496 lose_first_packet_ = lose;
497 }
498 bool GetLoseFirstPacket() { return lose_first_packet_; }
499
500 void SetLoss(int percent) {
501 loss_ = percent;
502 }
503
504 void SetDamage() {
505 damage_ = true;
506 }
507
508 void SetMtu(size_t mtu) {
509 mtu_ = mtu;
510 }
511
512 void SetHandshakeWait(int wait) {
513 handshake_wait_ = wait;
514 }
515
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800516 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000517 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800518 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000519 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800520 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000521 }
522
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800523 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000524 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800525 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000526 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800527 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000528 }
529
jbauch555604a2016-04-26 03:13:22 -0700530 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000531 if (client)
kwibergb4d01c42016-04-06 05:15:06 -0700532 return client_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000533 else
kwibergb4d01c42016-04-06 05:15:06 -0700534 return server_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000535 }
536
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700537 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000538 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700539 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000540 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700541 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000542 }
543
torbjorng43166b82016-03-11 00:06:47 -0800544 int GetSslVersion(bool client) {
545 if (client)
546 return client_ssl_->GetSslVersion();
547 else
548 return server_ssl_->GetSslVersion();
549 }
550
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000551 bool ExportKeyingMaterial(const char *label,
552 const unsigned char *context,
553 size_t context_len,
554 bool use_context,
555 bool client,
556 unsigned char *result,
557 size_t result_len) {
558 if (client)
559 return client_ssl_->ExportKeyingMaterial(label,
560 context, context_len,
561 use_context,
562 result, result_len);
563 else
564 return server_ssl_->ExportKeyingMaterial(label,
565 context, context_len,
566 use_context,
567 result, result_len);
568 }
569
570 // To be implemented by subclasses.
571 virtual void WriteData() = 0;
572 virtual void ReadData(rtc::StreamInterface *stream) = 0;
573 virtual void TestTransfer(int size) = 0;
574
575 protected:
jbauche488a0d2015-11-19 05:17:58 -0800576 std::string client_cert_pem_;
577 std::string client_private_key_pem_;
578 rtc::KeyParams client_key_type_;
579 rtc::KeyParams server_key_type_;
580 SSLDummyStreamBase *client_stream_; // freed by client_ssl_ destructor
581 SSLDummyStreamBase *server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700582 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
583 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000584 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
585 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
586 int delay_;
587 size_t mtu_;
588 int loss_;
589 bool lose_first_packet_;
590 bool damage_;
591 bool dtls_;
592 int handshake_wait_;
593 bool identities_set_;
594};
595
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200596class SSLStreamAdapterTestTLS
597 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700598 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000599 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200600 SSLStreamAdapterTestTLS()
601 : SSLStreamAdapterTestBase("",
602 "",
603 false,
604 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800605 ::testing::get<1>(GetParam())),
606 client_buffer_(kFifoBufferSize),
607 server_buffer_(kFifoBufferSize) {
608 }
609
torbjorng7593aad2015-11-19 12:20:51 -0800610 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800611 client_stream_ =
612 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
613 server_stream_ =
614 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
615 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000616
617 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700618 void TestTransfer(int size) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000619 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
620 // Create some dummy data to send.
621 size_t received;
622
623 send_stream_.ReserveSize(size);
624 for (int i = 0; i < size; ++i) {
625 char ch = static_cast<char>(i);
626 send_stream_.Write(&ch, 1, NULL, NULL);
627 }
628 send_stream_.Rewind();
629
630 // Prepare the receive stream.
631 recv_stream_.ReserveSize(size);
632
633 // Start sending
634 WriteData();
635
636 // Wait for the client to close
637 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
638
639 // Now check the data
640 recv_stream_.GetSize(&received);
641
642 EXPECT_EQ(static_cast<size_t>(size), received);
643 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
644 recv_stream_.GetBuffer(), size));
645 }
646
nisseef8b61e2016-04-29 06:09:15 -0700647 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000648 size_t position, tosend, size;
649 rtc::StreamResult rv;
650 size_t sent;
651 char block[kBlockSize];
652
653 send_stream_.GetSize(&size);
654 if (!size)
655 return;
656
657 for (;;) {
658 send_stream_.GetPosition(&position);
659 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
660 rtc::SR_EOS) {
661 rv = client_ssl_->Write(block, tosend, &sent, 0);
662
663 if (rv == rtc::SR_SUCCESS) {
664 send_stream_.SetPosition(position + sent);
665 LOG(LS_VERBOSE) << "Sent: " << position + sent;
666 } else if (rv == rtc::SR_BLOCK) {
667 LOG(LS_VERBOSE) << "Blocked...";
668 send_stream_.SetPosition(position);
669 break;
670 } else {
671 ADD_FAILURE();
672 break;
673 }
674 } else {
675 // Now close
676 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
677 client_ssl_->Close();
678 break;
679 }
680 }
681 };
682
nisseef8b61e2016-04-29 06:09:15 -0700683 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000684 char buffer[1600];
685 size_t bread;
686 int err2;
687 rtc::StreamResult r;
688
689 for (;;) {
690 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
691
692 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
693 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800694 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000695 stream->Close();
696 return;
697 }
698
699 if (r == rtc::SR_BLOCK)
700 break;
701
702 ASSERT_EQ(rtc::SR_SUCCESS, r);
skvlad3078b552017-01-18 15:29:35 -0800703 LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000704
705 recv_stream_.Write(buffer, bread, NULL, NULL);
706 }
707 }
708
709 private:
jbauche488a0d2015-11-19 05:17:58 -0800710 rtc::FifoBuffer client_buffer_;
711 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000712 rtc::MemoryStream send_stream_;
713 rtc::MemoryStream recv_stream_;
714};
715
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200716class SSLStreamAdapterTestDTLS
717 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700718 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000719 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200720 SSLStreamAdapterTestDTLS()
721 : SSLStreamAdapterTestBase("",
722 "",
723 true,
724 ::testing::get<0>(GetParam()),
725 ::testing::get<1>(GetParam())),
jbauche488a0d2015-11-19 05:17:58 -0800726 client_buffer_(kBufferCapacity, kDefaultBufferSize),
727 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200728 packet_size_(1000),
729 count_(0),
730 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000731
732 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
733 const std::string& private_key_pem) :
734 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
jbauche488a0d2015-11-19 05:17:58 -0800735 client_buffer_(kBufferCapacity, kDefaultBufferSize),
736 server_buffer_(kBufferCapacity, kDefaultBufferSize),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000737 packet_size_(1000), count_(0), sent_(0) {
738 }
739
torbjorng7593aad2015-11-19 12:20:51 -0800740 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800741 client_stream_ =
742 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
743 server_stream_ =
744 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
745 }
746
nisseef8b61e2016-04-29 06:09:15 -0700747 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000748 unsigned char *packet = new unsigned char[1600];
749
jbauche488a0d2015-11-19 05:17:58 -0800750 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800751 unsigned int rand_state = sent_;
752 packet[0] = sent_;
753 for (size_t i = 1; i < packet_size_; i++) {
754 // This is a simple LC PRNG. Keep in synch with identical code below.
755 rand_state = (rand_state * 251 + 19937) >> 7;
756 packet[i] = rand_state & 0xff;
757 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000758
759 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800760 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000761 if (rv == rtc::SR_SUCCESS) {
762 LOG(LS_VERBOSE) << "Sent: " << sent_;
763 sent_++;
764 } else if (rv == rtc::SR_BLOCK) {
765 LOG(LS_VERBOSE) << "Blocked...";
766 break;
767 } else {
768 ADD_FAILURE();
769 break;
770 }
jbauche488a0d2015-11-19 05:17:58 -0800771 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000772
773 delete [] packet;
774 }
775
nisseef8b61e2016-04-29 06:09:15 -0700776 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000777 unsigned char buffer[2000];
778 size_t bread;
779 int err2;
780 rtc::StreamResult r;
781
782 for (;;) {
783 r = stream->Read(buffer, 2000, &bread, &err2);
784
785 if (r == rtc::SR_ERROR) {
786 // Unfortunately, errors are the way that the stream adapter
787 // signals close right now
788 stream->Close();
789 return;
790 }
791
792 if (r == rtc::SR_BLOCK)
793 break;
794
795 ASSERT_EQ(rtc::SR_SUCCESS, r);
skvlad3078b552017-01-18 15:29:35 -0800796 LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000797
798 // Now parse the datagram
799 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800800 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000801
torbjorng7593aad2015-11-19 12:20:51 -0800802 unsigned int rand_state = packet_num;
803 for (size_t i = 1; i < packet_size_; i++) {
804 // This is a simple LC PRNG. Keep in synch with identical code above.
805 rand_state = (rand_state * 251 + 19937) >> 7;
806 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000807 }
808 received_.insert(packet_num);
809 }
810 }
811
nisseef8b61e2016-04-29 06:09:15 -0700812 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813 count_ = count;
814
815 WriteData();
816
817 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
818 LOG(LS_INFO) << "sent_ == " << sent_;
819
820 if (damage_) {
821 WAIT(false, 2000);
822 EXPECT_EQ(0U, received_.size());
823 } else if (loss_ == 0) {
824 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
825 } else {
826 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
827 received_.size();
828 }
829 };
830
831 private:
jbauche488a0d2015-11-19 05:17:58 -0800832 BufferQueueStream client_buffer_;
833 BufferQueueStream server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834 size_t packet_size_;
835 int count_;
836 int sent_;
837 std::set<int> received_;
838};
839
840
jbauche488a0d2015-11-19 05:17:58 -0800841rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000842 size_t* written, int* error) {
skvlad3078b552017-01-18 15:29:35 -0800843 LOG(LS_VERBOSE) << "Writing to loopback " << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000844
845 if (first_packet_) {
846 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800847 if (test_base_->GetLoseFirstPacket()) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000848 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800849 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000850 return rtc::SR_SUCCESS;
851 }
852 }
853
jbauche488a0d2015-11-19 05:17:58 -0800854 return test_base_->DataWritten(this, data, data_len, written, error);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000855};
856
857class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
858 public:
859 SSLStreamAdapterTestDTLSFromPEMStrings() :
860 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
861 }
862};
863
864// Basic tests: TLS
865
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000866// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200867TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000868 TestHandshake();
869};
870
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000871// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200872TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000873 TestHandshake();
874 client_ssl_->Close();
875 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
876};
877
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000878// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200879TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000880 TestHandshake();
881 TestTransfer(100000);
882};
883
884// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200885TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000886 TestHandshake();
887 TestTransfer(100000);
888 client_ssl_->Close();
889
890 rtc::StreamResult rv;
891 char block[kBlockSize];
892 size_t dummy;
893
894 // It's an error to write after closed.
895 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
896 ASSERT_EQ(rtc::SR_ERROR, rv);
897
898 // But after closed read gives you EOS.
899 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
900 ASSERT_EQ(rtc::SR_EOS, rv);
901};
902
903// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200904TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
deadbeef89824f62016-09-30 11:55:43 -0700905 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000906 TestHandshake(false);
907};
908
deadbeef89824f62016-09-30 11:55:43 -0700909TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
910 TestHandshakeWithDelayedIdentity(true);
911};
912
913TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
914 TestHandshakeWithDelayedIdentity(false);
915};
916
917// Test that the correct error is returned when SetPeerCertificateDigest is
918// called with an unknown algorithm.
919TEST_P(SSLStreamAdapterTestTLS,
920 TestSetPeerCertificateDigestWithUnknownAlgorithm) {
921 unsigned char server_digest[20];
922 size_t server_digest_len;
923 bool rv;
924 rtc::SSLPeerCertificateDigestError err;
925
926 rv = server_identity_->certificate().ComputeDigest(
927 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
928 ASSERT_TRUE(rv);
929
930 rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
931 server_digest_len, &err);
932 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
933 EXPECT_FALSE(rv);
934}
935
936// Test that the correct error is returned when SetPeerCertificateDigest is
937// called with an invalid digest length.
938TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
939 unsigned char server_digest[20];
940 size_t server_digest_len;
941 bool rv;
942 rtc::SSLPeerCertificateDigestError err;
943
944 rv = server_identity_->certificate().ComputeDigest(
945 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
946 ASSERT_TRUE(rv);
947
948 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
949 server_digest_len - 1, &err);
950 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
951 EXPECT_FALSE(rv);
952}
953
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000954// Test moving a bunch of data
955
956// Basic tests: DTLS
957// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200958TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000959 TestHandshake();
960};
961
962// Test that we can make a handshake work if the first packet in
963// each direction is lost. This gives us predictable loss
964// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200965TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000966 SetLoseFirstPacket(true);
967 TestHandshake();
968};
969
970// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200971TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000972 SetLoseFirstPacket(true);
973 SetDelay(2000);
974 SetHandshakeWait(20000);
975 TestHandshake();
976};
977
978// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000979// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200980TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000981 SetMtu(700);
982 SetHandshakeWait(20000);
983 TestHandshake();
984};
985
986// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -0800987TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000988 TestHandshake();
989 TestTransfer(100);
990};
991
jbauche488a0d2015-11-19 05:17:58 -0800992TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000993 TestHandshake();
994 SetLoss(10);
995 TestTransfer(100);
996};
997
jbauche488a0d2015-11-19 05:17:58 -0800998TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000999 SetDamage(); // Must be called first because first packet
1000 // write happens at end of handshake.
1001 TestHandshake();
1002 TestTransfer(100);
1003};
1004
deadbeef89824f62016-09-30 11:55:43 -07001005TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
1006 TestHandshakeWithDelayedIdentity(true);
1007};
1008
1009TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
1010 TestHandshakeWithDelayedIdentity(false);
1011};
1012
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001013// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001014TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001015 std::vector<int> high;
1016 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1017 SetDtlsSrtpCryptoSuites(high, true);
1018 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001019 TestHandshake();
1020
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001021 int client_cipher;
1022 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1023 int server_cipher;
1024 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001025
1026 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001027 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001028};
1029
1030// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001031TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001032 std::vector<int> low;
1033 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1034 SetDtlsSrtpCryptoSuites(low, true);
1035 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001036 TestHandshake();
1037
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001038 int client_cipher;
1039 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1040 int server_cipher;
1041 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042
1043 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001044 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001045};
1046
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001047// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001048TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001049 std::vector<int> high;
1050 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1051 std::vector<int> low;
1052 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1053 SetDtlsSrtpCryptoSuites(high, true);
1054 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001055 TestHandshake();
1056
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001057 int client_cipher;
1058 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1059 int server_cipher;
1060 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001061};
1062
1063// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001064TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001065 std::vector<int> mixed;
1066 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1067 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1068 SetDtlsSrtpCryptoSuites(mixed, true);
1069 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001070 TestHandshake();
1071
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001072 int client_cipher;
1073 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1074 int server_cipher;
1075 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001076
1077 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001078 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001079};
1080
jbauchcb560652016-08-04 05:20:32 -07001081// Test DTLS-SRTP with all GCM-128 ciphers.
1082TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
jbauchcb560652016-08-04 05:20:32 -07001083 std::vector<int> gcm128;
1084 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1085 SetDtlsSrtpCryptoSuites(gcm128, true);
1086 SetDtlsSrtpCryptoSuites(gcm128, false);
1087 TestHandshake();
1088
1089 int client_cipher;
1090 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1091 int server_cipher;
1092 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1093
1094 ASSERT_EQ(client_cipher, server_cipher);
1095 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
1096};
1097
1098// Test DTLS-SRTP with all GCM-256 ciphers.
1099TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
jbauchcb560652016-08-04 05:20:32 -07001100 std::vector<int> gcm256;
1101 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1102 SetDtlsSrtpCryptoSuites(gcm256, true);
1103 SetDtlsSrtpCryptoSuites(gcm256, false);
1104 TestHandshake();
1105
1106 int client_cipher;
1107 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1108 int server_cipher;
1109 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1110
1111 ASSERT_EQ(client_cipher, server_cipher);
1112 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1113};
1114
1115// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1116TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
jbauchcb560652016-08-04 05:20:32 -07001117 std::vector<int> gcm128;
1118 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1119 std::vector<int> gcm256;
1120 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1121 SetDtlsSrtpCryptoSuites(gcm128, true);
1122 SetDtlsSrtpCryptoSuites(gcm256, false);
1123 TestHandshake();
1124
1125 int client_cipher;
1126 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1127 int server_cipher;
1128 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1129};
1130
1131// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1132TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
jbauchcb560652016-08-04 05:20:32 -07001133 std::vector<int> gcmBoth;
1134 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1135 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1136 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1137 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1138 TestHandshake();
1139
1140 int client_cipher;
1141 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1142 int server_cipher;
1143 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1144
1145 ASSERT_EQ(client_cipher, server_cipher);
1146 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1147};
1148
1149// Test SRTP cipher suite lengths.
1150TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1151 int key_len;
1152 int salt_len;
1153
1154 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(
1155 rtc::SRTP_INVALID_CRYPTO_SUITE, &key_len, &salt_len));
1156
1157 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1158 rtc::SRTP_AES128_CM_SHA1_32, &key_len, &salt_len));
1159 ASSERT_EQ(128/8, key_len);
1160 ASSERT_EQ(112/8, salt_len);
1161
1162 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1163 rtc::SRTP_AES128_CM_SHA1_80, &key_len, &salt_len));
1164 ASSERT_EQ(128/8, key_len);
1165 ASSERT_EQ(112/8, salt_len);
1166
1167 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1168 rtc::SRTP_AEAD_AES_128_GCM, &key_len, &salt_len));
1169 ASSERT_EQ(128/8, key_len);
1170 ASSERT_EQ(96/8, salt_len);
1171
1172 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1173 rtc::SRTP_AEAD_AES_256_GCM, &key_len, &salt_len));
1174 ASSERT_EQ(256/8, key_len);
1175 ASSERT_EQ(96/8, salt_len);
1176};
1177
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001178// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001179TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001180 TestHandshake();
1181 unsigned char client_out[20];
1182 unsigned char server_out[20];
1183
1184 bool result;
1185 result = ExportKeyingMaterial(kExporterLabel,
1186 kExporterContext, kExporterContextLen,
1187 true, true,
1188 client_out, sizeof(client_out));
1189 ASSERT_TRUE(result);
1190
1191 result = ExportKeyingMaterial(kExporterLabel,
1192 kExporterContext, kExporterContextLen,
1193 true, false,
1194 server_out, sizeof(server_out));
1195 ASSERT_TRUE(result);
1196
1197 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1198}
1199
1200// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001201TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001202 long one_day = 60 * 60 * 24;
1203 // Make the certificates not valid until one day later.
1204 ResetIdentitiesWithValidity(one_day, one_day);
1205 TestHandshake();
1206}
1207
1208// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001209TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001210 long one_day = 60 * 60 * 24;
1211 // Make the certificates already expired.
1212 ResetIdentitiesWithValidity(-one_day, -one_day);
1213 TestHandshake();
1214}
1215
1216// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001217TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001218 TestHandshake();
1219 TestTransfer(100);
1220}
1221
1222// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001223TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001224 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001225 ASSERT_FALSE(GetPeerCertificate(true));
1226 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001227
1228 TestHandshake();
1229
1230 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001231 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001232 GetPeerCertificate(true);
1233 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001234
1235 // It's not kCERT_PEM.
1236 std::string client_peer_string = client_peer_cert->ToPEMString();
1237 ASSERT_NE(kCERT_PEM, client_peer_string);
1238
1239 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001240 ASSERT_FALSE(client_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001241
1242 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001243 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001244 GetPeerCertificate(false);
1245 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001246
1247 // It's kCERT_PEM
1248 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
1249
1250 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001251 ASSERT_FALSE(server_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001252}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001253
1254// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +02001255// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001256TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001257 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001258 TestHandshake();
1259
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001260 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001261 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001262 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001263 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001264
torbjorng43166b82016-03-11 00:06:47 -08001265 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1266 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1267
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001268 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001269 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1270 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001271}
1272
1273// Test getting the used DTLS 1.2 ciphers.
1274// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001275TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001276 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1277 TestHandshake();
1278
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001279 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001280 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001281 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001282 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001283
torbjorng43166b82016-03-11 00:06:47 -08001284 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1285 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1286
Joachim Bauch831c5582015-05-20 12:48:41 +02001287 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001288 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1289 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001290}
1291
1292// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001293TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001294 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1295 TestHandshake();
1296
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001297 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001298 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001299 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001300 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001301
torbjorng43166b82016-03-11 00:06:47 -08001302 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1303 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1304
Joachim Bauch831c5582015-05-20 12:48:41 +02001305 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001306 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1307 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001308}
1309
1310// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001311TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001312 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1313 TestHandshake();
1314
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001315 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001316 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001317 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001318 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001319
torbjorng43166b82016-03-11 00:06:47 -08001320 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1321 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1322
Joachim Bauch831c5582015-05-20 12:48:41 +02001323 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001324 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1325 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001326}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001327
torbjorng4e572472015-10-08 09:42:49 -07001328// The RSA keysizes here might look strange, why not include the RFC's size
1329// 2048?. The reason is test case slowness; testing two sizes to exercise
1330// parametrization is sufficient.
1331INSTANTIATE_TEST_CASE_P(
1332 SSLStreamAdapterTestsTLS,
1333 SSLStreamAdapterTestTLS,
1334 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1335 rtc::KeyParams::RSA(1152, 65537),
1336 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1337 Values(rtc::KeyParams::RSA(1024, 65537),
1338 rtc::KeyParams::RSA(1152, 65537),
1339 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1340INSTANTIATE_TEST_CASE_P(
1341 SSLStreamAdapterTestsDTLS,
1342 SSLStreamAdapterTestDTLS,
1343 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1344 rtc::KeyParams::RSA(1152, 65537),
1345 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1346 Values(rtc::KeyParams::RSA(1024, 65537),
1347 rtc::KeyParams::RSA(1152, 65537),
1348 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));