blob: 0344bd057ab2fec3ad77fc156076ba691d26bb2a [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>
13#include <set>
14#include <string>
15
16#include "webrtc/base/gunit.h"
17#include "webrtc/base/helpers.h"
18#include "webrtc/base/scoped_ptr.h"
19#include "webrtc/base/ssladapter.h"
20#include "webrtc/base/sslconfig.h"
21#include "webrtc/base/sslidentity.h"
22#include "webrtc/base/sslstreamadapter.h"
23#include "webrtc/base/stream.h"
henrike@webrtc.orgfded02c2014-09-19 13:10:10 +000024#include "webrtc/test/testsupport/gtest_disable.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000025
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
75class SSLDummyStream : public rtc::StreamInterface,
76 public sigslot::has_slots<> {
77 public:
78 explicit SSLDummyStream(SSLStreamAdapterTestBase *test,
79 const std::string &side,
80 rtc::FifoBuffer *in,
81 rtc::FifoBuffer *out) :
82 test_(test),
83 side_(side),
84 in_(in),
85 out_(out),
86 first_packet_(true) {
87 in_->SignalEvent.connect(this, &SSLDummyStream::OnEventIn);
88 out_->SignalEvent.connect(this, &SSLDummyStream::OnEventOut);
89 }
90
91 virtual rtc::StreamState GetState() const { return rtc::SS_OPEN; }
92
93 virtual rtc::StreamResult Read(void* buffer, size_t buffer_len,
94 size_t* read, int* error) {
95 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.
112 virtual void OnEventIn(rtc::StreamInterface *stream, int sig,
113 int err) {
114 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
115
116 if (sig & mask) {
117 LOG(LS_INFO) << "SSLDummyStream::OnEvent side=" << side_ << " sig="
118 << sig << " forwarding upward";
119 PostEvent(sig & mask, 0);
120 }
121 }
122
123 // Catch writeability events on out and pass them up.
124 virtual void OnEventOut(rtc::StreamInterface *stream, int sig,
125 int err) {
126 if (sig & rtc::SE_WRITE) {
127 LOG(LS_INFO) << "SSLDummyStream::OnEvent side=" << side_ << " sig="
128 << sig << " forwarding upward";
129
130 PostEvent(sig & rtc::SE_WRITE, 0);
131 }
132 }
133
134 // Write to the outgoing FifoBuffer
135 rtc::StreamResult WriteData(const void* data, size_t data_len,
136 size_t* written, int* error) {
137 return out_->Write(data, data_len, written, error);
138 }
139
140 // Defined later
141 virtual rtc::StreamResult Write(const void* data, size_t data_len,
142 size_t* written, int* error);
143
144 virtual void Close() {
145 LOG(LS_INFO) << "Closing outbound stream";
146 out_->Close();
147 }
148
149 private:
150 SSLStreamAdapterTestBase *test_;
151 const std::string side_;
152 rtc::FifoBuffer *in_;
153 rtc::FifoBuffer *out_;
154 bool first_packet_;
155};
156
157static const int kFifoBufferSize = 4096;
158
159class SSLStreamAdapterTestBase : public testing::Test,
160 public sigslot::has_slots<> {
161 public:
torbjorng4e572472015-10-08 09:42:49 -0700162 SSLStreamAdapterTestBase(
163 const std::string& client_cert_pem,
164 const std::string& client_private_key_pem,
165 bool dtls,
166 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
167 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200168 : client_buffer_(kFifoBufferSize),
169 server_buffer_(kFifoBufferSize),
170 client_stream_(
171 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_)),
172 server_stream_(
173 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_)),
174 client_ssl_(rtc::SSLStreamAdapter::Create(client_stream_)),
175 server_ssl_(rtc::SSLStreamAdapter::Create(server_stream_)),
176 client_identity_(NULL),
177 server_identity_(NULL),
178 delay_(0),
179 mtu_(1460),
180 loss_(0),
181 lose_first_packet_(false),
182 damage_(false),
183 dtls_(dtls),
184 handshake_wait_(5000),
185 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000186 // Set use of the test RNG to get predictable loss patterns.
187 rtc::SetRandomTestMode(true);
188
189 // Set up the slots
190 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
191 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
192
193 if (!client_cert_pem.empty() && !client_private_key_pem.empty()) {
194 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
195 client_private_key_pem, client_cert_pem);
196 } else {
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200197 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000198 }
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200199 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000200
201 client_ssl_->SetIdentity(client_identity_);
202 server_ssl_->SetIdentity(server_identity_);
203 }
204
205 ~SSLStreamAdapterTestBase() {
206 // Put it back for the next test.
207 rtc::SetRandomTestMode(false);
208 }
209
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000210 // Recreate the client/server identities with the specified validity period.
211 // |not_before| and |not_after| are offsets from the current time in number
212 // of seconds.
213 void ResetIdentitiesWithValidity(int not_before, int not_after) {
214 client_stream_ =
215 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_);
216 server_stream_ =
217 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_);
218
219 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
220 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
221
222 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
223 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
224
225 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700226 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000227 client_params.common_name = "client";
228 client_params.not_before = not_before;
229 client_params.not_after = not_after;
230 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
231
232 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700233 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000234 server_params.common_name = "server";
235 server_params.not_before = not_before;
236 server_params.not_after = not_after;
237 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
238
239 client_ssl_->SetIdentity(client_identity_);
240 server_ssl_->SetIdentity(server_identity_);
241 }
242
243 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
244 LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
245
246 if (sig & rtc::SE_READ) {
247 ReadData(stream);
248 }
249
250 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
251 WriteData();
252 }
253 }
254
255 void SetPeerIdentitiesByDigest(bool correct) {
256 unsigned char digest[20];
257 size_t digest_len;
258 bool rv;
259
260 LOG(LS_INFO) << "Setting peer identities by digest";
261
262 rv = server_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
263 digest, 20,
264 &digest_len);
265 ASSERT_TRUE(rv);
266 if (!correct) {
267 LOG(LS_INFO) << "Setting bogus digest for server cert";
268 digest[0]++;
269 }
270 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
271 digest_len);
272 ASSERT_TRUE(rv);
273
274
275 rv = client_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
276 digest, 20, &digest_len);
277 ASSERT_TRUE(rv);
278 if (!correct) {
279 LOG(LS_INFO) << "Setting bogus digest for client cert";
280 digest[0]++;
281 }
282 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
283 digest_len);
284 ASSERT_TRUE(rv);
285
286 identities_set_ = true;
287 }
288
Joachim Bauch831c5582015-05-20 12:48:41 +0200289 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
290 rtc::SSLProtocolVersion client_version) {
291 server_ssl_->SetMaxProtocolVersion(server_version);
292 client_ssl_->SetMaxProtocolVersion(client_version);
293 }
294
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000295 void TestHandshake(bool expect_success = true) {
296 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
297 rtc::SSL_MODE_TLS);
298 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
299 rtc::SSL_MODE_TLS);
300
301 if (!dtls_) {
302 // Make sure we simulate a reliable network for TLS.
303 // This is just a check to make sure that people don't write wrong
304 // tests.
305 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
306 }
307
308 if (!identities_set_)
309 SetPeerIdentitiesByDigest(true);
310
311 // Start the handshake
312 int rv;
313
314 server_ssl_->SetServerRole();
315 rv = server_ssl_->StartSSLWithPeer();
316 ASSERT_EQ(0, rv);
317
318 rv = client_ssl_->StartSSLWithPeer();
319 ASSERT_EQ(0, rv);
320
321 // Now run the handshake
322 if (expect_success) {
323 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
324 && (server_ssl_->GetState() == rtc::SS_OPEN),
325 handshake_wait_);
326 } else {
327 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
328 handshake_wait_);
329 }
330 }
331
332 rtc::StreamResult DataWritten(SSLDummyStream *from, const void *data,
333 size_t data_len, size_t *written,
334 int *error) {
335 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200336 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000337 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
338 *written = data_len;
339 return rtc::SR_SUCCESS;
340 }
341 if (dtls_ && (data_len > mtu_)) {
342 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len;
343 *written = data_len;
344 return rtc::SR_SUCCESS;
345 }
346
347 // Optionally damage application data (type 23). Note that we don't damage
348 // handshake packets and we damage the last byte to keep the header
349 // intact but break the MAC.
350 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
351 std::vector<char> buf(data_len);
352
353 LOG(LS_INFO) << "Damaging packet";
354
355 memcpy(&buf[0], data, data_len);
356 buf[data_len - 1]++;
357
358 return from->WriteData(&buf[0], data_len, written, error);
359 }
360
361 return from->WriteData(data, data_len, written, error);
362 }
363
364 void SetDelay(int delay) {
365 delay_ = delay;
366 }
367 int GetDelay() { return delay_; }
368
369 void SetLoseFirstPacket(bool lose) {
370 lose_first_packet_ = lose;
371 }
372 bool GetLoseFirstPacket() { return lose_first_packet_; }
373
374 void SetLoss(int percent) {
375 loss_ = percent;
376 }
377
378 void SetDamage() {
379 damage_ = true;
380 }
381
382 void SetMtu(size_t mtu) {
383 mtu_ = mtu;
384 }
385
386 void SetHandshakeWait(int wait) {
387 handshake_wait_ = wait;
388 }
389
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800390 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000391 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800392 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000393 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800394 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000395 }
396
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800397 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800399 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800401 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000402 }
403
404 bool GetPeerCertificate(bool client, rtc::SSLCertificate** cert) {
405 if (client)
406 return client_ssl_->GetPeerCertificate(cert);
407 else
408 return server_ssl_->GetPeerCertificate(cert);
409 }
410
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700411 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000412 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700413 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000414 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700415 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000416 }
417
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000418 bool ExportKeyingMaterial(const char *label,
419 const unsigned char *context,
420 size_t context_len,
421 bool use_context,
422 bool client,
423 unsigned char *result,
424 size_t result_len) {
425 if (client)
426 return client_ssl_->ExportKeyingMaterial(label,
427 context, context_len,
428 use_context,
429 result, result_len);
430 else
431 return server_ssl_->ExportKeyingMaterial(label,
432 context, context_len,
433 use_context,
434 result, result_len);
435 }
436
437 // To be implemented by subclasses.
438 virtual void WriteData() = 0;
439 virtual void ReadData(rtc::StreamInterface *stream) = 0;
440 virtual void TestTransfer(int size) = 0;
441
442 protected:
443 rtc::FifoBuffer client_buffer_;
444 rtc::FifoBuffer server_buffer_;
445 SSLDummyStream *client_stream_; // freed by client_ssl_ destructor
446 SSLDummyStream *server_stream_; // freed by server_ssl_ destructor
447 rtc::scoped_ptr<rtc::SSLStreamAdapter> client_ssl_;
448 rtc::scoped_ptr<rtc::SSLStreamAdapter> server_ssl_;
449 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
450 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
451 int delay_;
452 size_t mtu_;
453 int loss_;
454 bool lose_first_packet_;
455 bool damage_;
456 bool dtls_;
457 int handshake_wait_;
458 bool identities_set_;
459};
460
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200461class SSLStreamAdapterTestTLS
462 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700463 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000464 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200465 SSLStreamAdapterTestTLS()
466 : SSLStreamAdapterTestBase("",
467 "",
468 false,
469 ::testing::get<0>(GetParam()),
470 ::testing::get<1>(GetParam())){};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000471
472 // Test data transfer for TLS
473 virtual void TestTransfer(int size) {
474 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
475 // Create some dummy data to send.
476 size_t received;
477
478 send_stream_.ReserveSize(size);
479 for (int i = 0; i < size; ++i) {
480 char ch = static_cast<char>(i);
481 send_stream_.Write(&ch, 1, NULL, NULL);
482 }
483 send_stream_.Rewind();
484
485 // Prepare the receive stream.
486 recv_stream_.ReserveSize(size);
487
488 // Start sending
489 WriteData();
490
491 // Wait for the client to close
492 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
493
494 // Now check the data
495 recv_stream_.GetSize(&received);
496
497 EXPECT_EQ(static_cast<size_t>(size), received);
498 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
499 recv_stream_.GetBuffer(), size));
500 }
501
502 void WriteData() {
503 size_t position, tosend, size;
504 rtc::StreamResult rv;
505 size_t sent;
506 char block[kBlockSize];
507
508 send_stream_.GetSize(&size);
509 if (!size)
510 return;
511
512 for (;;) {
513 send_stream_.GetPosition(&position);
514 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
515 rtc::SR_EOS) {
516 rv = client_ssl_->Write(block, tosend, &sent, 0);
517
518 if (rv == rtc::SR_SUCCESS) {
519 send_stream_.SetPosition(position + sent);
520 LOG(LS_VERBOSE) << "Sent: " << position + sent;
521 } else if (rv == rtc::SR_BLOCK) {
522 LOG(LS_VERBOSE) << "Blocked...";
523 send_stream_.SetPosition(position);
524 break;
525 } else {
526 ADD_FAILURE();
527 break;
528 }
529 } else {
530 // Now close
531 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
532 client_ssl_->Close();
533 break;
534 }
535 }
536 };
537
538 virtual void ReadData(rtc::StreamInterface *stream) {
539 char buffer[1600];
540 size_t bread;
541 int err2;
542 rtc::StreamResult r;
543
544 for (;;) {
545 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
546
547 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
548 // Unfortunately, errors are the way that the stream adapter
549 // signals close in OpenSSL
550 stream->Close();
551 return;
552 }
553
554 if (r == rtc::SR_BLOCK)
555 break;
556
557 ASSERT_EQ(rtc::SR_SUCCESS, r);
558 LOG(LS_INFO) << "Read " << bread;
559
560 recv_stream_.Write(buffer, bread, NULL, NULL);
561 }
562 }
563
564 private:
565 rtc::MemoryStream send_stream_;
566 rtc::MemoryStream recv_stream_;
567};
568
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200569class SSLStreamAdapterTestDTLS
570 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700571 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000572 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200573 SSLStreamAdapterTestDTLS()
574 : SSLStreamAdapterTestBase("",
575 "",
576 true,
577 ::testing::get<0>(GetParam()),
578 ::testing::get<1>(GetParam())),
579 packet_size_(1000),
580 count_(0),
581 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000582
583 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
584 const std::string& private_key_pem) :
585 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
586 packet_size_(1000), count_(0), sent_(0) {
587 }
588
589 virtual void WriteData() {
590 unsigned char *packet = new unsigned char[1600];
591
592 do {
593 memset(packet, sent_ & 0xff, packet_size_);
594 *(reinterpret_cast<uint32_t *>(packet)) = sent_;
595
596 size_t sent;
597 int rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
598 if (rv == rtc::SR_SUCCESS) {
599 LOG(LS_VERBOSE) << "Sent: " << sent_;
600 sent_++;
601 } else if (rv == rtc::SR_BLOCK) {
602 LOG(LS_VERBOSE) << "Blocked...";
603 break;
604 } else {
605 ADD_FAILURE();
606 break;
607 }
608 } while (sent_ < count_);
609
610 delete [] packet;
611 }
612
613 virtual void ReadData(rtc::StreamInterface *stream) {
614 unsigned char buffer[2000];
615 size_t bread;
616 int err2;
617 rtc::StreamResult r;
618
619 for (;;) {
620 r = stream->Read(buffer, 2000, &bread, &err2);
621
622 if (r == rtc::SR_ERROR) {
623 // Unfortunately, errors are the way that the stream adapter
624 // signals close right now
625 stream->Close();
626 return;
627 }
628
629 if (r == rtc::SR_BLOCK)
630 break;
631
632 ASSERT_EQ(rtc::SR_SUCCESS, r);
633 LOG(LS_INFO) << "Read " << bread;
634
635 // Now parse the datagram
636 ASSERT_EQ(packet_size_, bread);
637 unsigned char* ptr_to_buffer = buffer;
638 uint32_t packet_num = *(reinterpret_cast<uint32_t *>(ptr_to_buffer));
639
640 for (size_t i = 4; i < packet_size_; i++) {
641 ASSERT_EQ((packet_num & 0xff), buffer[i]);
642 }
643 received_.insert(packet_num);
644 }
645 }
646
647 virtual void TestTransfer(int count) {
648 count_ = count;
649
650 WriteData();
651
652 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
653 LOG(LS_INFO) << "sent_ == " << sent_;
654
655 if (damage_) {
656 WAIT(false, 2000);
657 EXPECT_EQ(0U, received_.size());
658 } else if (loss_ == 0) {
659 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
660 } else {
661 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
662 received_.size();
663 }
664 };
665
666 private:
667 size_t packet_size_;
668 int count_;
669 int sent_;
670 std::set<int> received_;
671};
672
673
674rtc::StreamResult SSLDummyStream::Write(const void* data, size_t data_len,
675 size_t* written, int* error) {
676 *written = data_len;
677
678 LOG(LS_INFO) << "Writing to loopback " << data_len;
679
680 if (first_packet_) {
681 first_packet_ = false;
682 if (test_->GetLoseFirstPacket()) {
683 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
684 return rtc::SR_SUCCESS;
685 }
686 }
687
688 return test_->DataWritten(this, data, data_len, written, error);
689
690 return rtc::SR_SUCCESS;
691};
692
693class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
694 public:
695 SSLStreamAdapterTestDTLSFromPEMStrings() :
696 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
697 }
698};
699
700// Basic tests: TLS
701
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000702// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200703TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000704 TestHandshake();
705};
706
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000707// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200708TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000709 TestHandshake();
710 client_ssl_->Close();
711 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
712};
713
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000714// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200715TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000716 TestHandshake();
717 TestTransfer(100000);
718};
719
720// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200721TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000722 TestHandshake();
723 TestTransfer(100000);
724 client_ssl_->Close();
725
726 rtc::StreamResult rv;
727 char block[kBlockSize];
728 size_t dummy;
729
730 // It's an error to write after closed.
731 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
732 ASSERT_EQ(rtc::SR_ERROR, rv);
733
734 // But after closed read gives you EOS.
735 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
736 ASSERT_EQ(rtc::SR_EOS, rv);
737};
738
739// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200740TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000741 SetPeerIdentitiesByDigest(false);
742 TestHandshake(false);
743};
744
745// Test moving a bunch of data
746
747// Basic tests: DTLS
748// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200749TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000750 MAYBE_SKIP_TEST(HaveDtls);
751 TestHandshake();
752};
753
754// Test that we can make a handshake work if the first packet in
755// each direction is lost. This gives us predictable loss
756// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200757TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000758 MAYBE_SKIP_TEST(HaveDtls);
759 SetLoseFirstPacket(true);
760 TestHandshake();
761};
762
763// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200764TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000765 MAYBE_SKIP_TEST(HaveDtls);
766 SetLoseFirstPacket(true);
767 SetDelay(2000);
768 SetHandshakeWait(20000);
769 TestHandshake();
770};
771
772// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000773// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200774TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000775 MAYBE_SKIP_TEST(HaveDtls);
776 SetMtu(700);
777 SetHandshakeWait(20000);
778 TestHandshake();
779};
780
781// Test transfer -- trivial
Henrik Kjellandereecbab72015-09-16 19:19:04 +0200782// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005
783TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000784 MAYBE_SKIP_TEST(HaveDtls);
785 TestHandshake();
786 TestTransfer(100);
787};
788
Henrik Kjellandereecbab72015-09-16 19:19:04 +0200789// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005
790TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000791 MAYBE_SKIP_TEST(HaveDtls);
792 TestHandshake();
793 SetLoss(10);
794 TestTransfer(100);
795};
796
Henrik Kjellandereecbab72015-09-16 19:19:04 +0200797// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005
798TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000799 MAYBE_SKIP_TEST(HaveDtls);
800 SetDamage(); // Must be called first because first packet
801 // write happens at end of handshake.
802 TestHandshake();
803 TestTransfer(100);
804};
805
806// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200807TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000808 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800809 std::vector<int> high;
810 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
811 SetDtlsSrtpCryptoSuites(high, true);
812 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813 TestHandshake();
814
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800815 int client_cipher;
816 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
817 int server_cipher;
818 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000819
820 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800821 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000822};
823
824// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200825TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000826 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800827 std::vector<int> low;
828 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
829 SetDtlsSrtpCryptoSuites(low, true);
830 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000831 TestHandshake();
832
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800833 int client_cipher;
834 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
835 int server_cipher;
836 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000837
838 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800839 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000840};
841
842
843// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200844TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000845 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800846 std::vector<int> high;
847 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
848 std::vector<int> low;
849 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
850 SetDtlsSrtpCryptoSuites(high, true);
851 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000852 TestHandshake();
853
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800854 int client_cipher;
855 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
856 int server_cipher;
857 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000858};
859
860// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200861TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000862 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800863 std::vector<int> mixed;
864 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
865 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
866 SetDtlsSrtpCryptoSuites(mixed, true);
867 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000868 TestHandshake();
869
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800870 int client_cipher;
871 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
872 int server_cipher;
873 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000874
875 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800876 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000877};
878
879// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200880TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000881 MAYBE_SKIP_TEST(HaveExporter);
882 TestHandshake();
883 unsigned char client_out[20];
884 unsigned char server_out[20];
885
886 bool result;
887 result = ExportKeyingMaterial(kExporterLabel,
888 kExporterContext, kExporterContextLen,
889 true, true,
890 client_out, sizeof(client_out));
891 ASSERT_TRUE(result);
892
893 result = ExportKeyingMaterial(kExporterLabel,
894 kExporterContext, kExporterContextLen,
895 true, false,
896 server_out, sizeof(server_out));
897 ASSERT_TRUE(result);
898
899 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
900}
901
902// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200903TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000904 MAYBE_SKIP_TEST(HaveDtls);
905 long one_day = 60 * 60 * 24;
906 // Make the certificates not valid until one day later.
907 ResetIdentitiesWithValidity(one_day, one_day);
908 TestHandshake();
909}
910
911// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200912TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000913 MAYBE_SKIP_TEST(HaveDtls);
914 long one_day = 60 * 60 * 24;
915 // Make the certificates already expired.
916 ResetIdentitiesWithValidity(-one_day, -one_day);
917 TestHandshake();
918}
919
920// Test data transfer using certs created from strings.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200921TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000922 MAYBE_SKIP_TEST(HaveDtls);
923 TestHandshake();
924 TestTransfer(100);
925}
926
927// Test getting the remote certificate.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200928TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000929 MAYBE_SKIP_TEST(HaveDtls);
930
931 // Peer certificates haven't been received yet.
932 rtc::scoped_ptr<rtc::SSLCertificate> client_peer_cert;
933 ASSERT_FALSE(GetPeerCertificate(true, client_peer_cert.accept()));
934 ASSERT_FALSE(client_peer_cert != NULL);
935
936 rtc::scoped_ptr<rtc::SSLCertificate> server_peer_cert;
937 ASSERT_FALSE(GetPeerCertificate(false, server_peer_cert.accept()));
938 ASSERT_FALSE(server_peer_cert != NULL);
939
940 TestHandshake();
941
942 // The client should have a peer certificate after the handshake.
943 ASSERT_TRUE(GetPeerCertificate(true, client_peer_cert.accept()));
944 ASSERT_TRUE(client_peer_cert != NULL);
945
946 // It's not kCERT_PEM.
947 std::string client_peer_string = client_peer_cert->ToPEMString();
948 ASSERT_NE(kCERT_PEM, client_peer_string);
949
950 // It must not have a chain, because the test certs are self-signed.
951 rtc::SSLCertChain* client_peer_chain;
952 ASSERT_FALSE(client_peer_cert->GetChain(&client_peer_chain));
953
954 // The server should have a peer certificate after the handshake.
955 ASSERT_TRUE(GetPeerCertificate(false, server_peer_cert.accept()));
956 ASSERT_TRUE(server_peer_cert != NULL);
957
958 // It's kCERT_PEM
959 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
960
961 // It must not have a chain, because the test certs are self-signed.
962 rtc::SSLCertChain* server_peer_chain;
963 ASSERT_FALSE(server_peer_cert->GetChain(&server_peer_chain));
964}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000965
966// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +0200967// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700968TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000969 MAYBE_SKIP_TEST(HaveDtls);
Joachim Bauch831c5582015-05-20 12:48:41 +0200970 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000971 TestHandshake();
972
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700973 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700974 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700975 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700976 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000977
978 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -0700979 ASSERT_EQ(
980 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
981 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()),
982 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +0200983}
984
985// Test getting the used DTLS 1.2 ciphers.
986// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700987TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +0200988 MAYBE_SKIP_TEST(HaveDtls);
989 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
990 TestHandshake();
991
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700992 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700993 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700994 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700995 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +0200996
997 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -0700998 ASSERT_EQ(
999 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
1000 rtc::SSL_PROTOCOL_DTLS_12, ::testing::get<1>(GetParam()).type()),
1001 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +02001002}
1003
1004// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001005TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001006 MAYBE_SKIP_TEST(HaveDtls);
1007 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1008 TestHandshake();
1009
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001010 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001011 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001012 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001013 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001014
1015 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -07001016 ASSERT_EQ(
1017 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
1018 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()),
1019 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +02001020}
1021
1022// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001023TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001024 MAYBE_SKIP_TEST(HaveDtls);
1025 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1026 TestHandshake();
1027
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001028 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001029 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001030 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001031 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001032
1033 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -07001034 ASSERT_EQ(
1035 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
1036 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()),
1037 server_cipher);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001038}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001039
torbjorng4e572472015-10-08 09:42:49 -07001040// The RSA keysizes here might look strange, why not include the RFC's size
1041// 2048?. The reason is test case slowness; testing two sizes to exercise
1042// parametrization is sufficient.
1043INSTANTIATE_TEST_CASE_P(
1044 SSLStreamAdapterTestsTLS,
1045 SSLStreamAdapterTestTLS,
1046 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1047 rtc::KeyParams::RSA(1152, 65537),
1048 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1049 Values(rtc::KeyParams::RSA(1024, 65537),
1050 rtc::KeyParams::RSA(1152, 65537),
1051 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1052INSTANTIATE_TEST_CASE_P(
1053 SSLStreamAdapterTestsDTLS,
1054 SSLStreamAdapterTestDTLS,
1055 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1056 rtc::KeyParams::RSA(1152, 65537),
1057 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1058 Values(rtc::KeyParams::RSA(1024, 65537),
1059 rtc::KeyParams::RSA(1152, 65537),
1060 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));