blob: a3e8d9c637980f6ca4d1453283c9915874d40e0e [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;
guoweis318166b2015-11-18 19:03:38 -080032static const char kAES_CM_HMAC_SHA1_80[] = "AES_CM_128_HMAC_SHA1_80";
33static const char kAES_CM_HMAC_SHA1_32[] = "AES_CM_128_HMAC_SHA1_32";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000034static const char kExporterLabel[] = "label";
35static const unsigned char kExporterContext[] = "context";
36static int kExporterContextLen = sizeof(kExporterContext);
37
38static const char kRSA_PRIVATE_KEY_PEM[] =
39 "-----BEGIN RSA PRIVATE KEY-----\n"
40 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
41 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
42 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
43 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
44 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
45 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
46 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
47 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
48 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
49 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
50 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
51 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
52 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
53 "UCXiYxSsu20QNVw=\n"
54 "-----END RSA PRIVATE KEY-----\n";
55
56static const char kCERT_PEM[] =
57 "-----BEGIN CERTIFICATE-----\n"
58 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
59 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
60 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
61 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
62 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
63 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
64 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
65 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
66 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
67 "-----END CERTIFICATE-----\n";
68
69#define MAYBE_SKIP_TEST(feature) \
70 if (!(rtc::SSLStreamAdapter::feature())) { \
71 LOG(LS_INFO) << "Feature disabled... skipping"; \
72 return; \
73 }
74
75class SSLStreamAdapterTestBase;
76
77class SSLDummyStream : public rtc::StreamInterface,
78 public sigslot::has_slots<> {
79 public:
80 explicit SSLDummyStream(SSLStreamAdapterTestBase *test,
81 const std::string &side,
82 rtc::FifoBuffer *in,
83 rtc::FifoBuffer *out) :
84 test_(test),
85 side_(side),
86 in_(in),
87 out_(out),
88 first_packet_(true) {
89 in_->SignalEvent.connect(this, &SSLDummyStream::OnEventIn);
90 out_->SignalEvent.connect(this, &SSLDummyStream::OnEventOut);
91 }
92
93 virtual rtc::StreamState GetState() const { return rtc::SS_OPEN; }
94
95 virtual rtc::StreamResult Read(void* buffer, size_t buffer_len,
96 size_t* read, int* error) {
97 rtc::StreamResult r;
98
99 r = in_->Read(buffer, buffer_len, read, error);
100 if (r == rtc::SR_BLOCK)
101 return rtc::SR_BLOCK;
102 if (r == rtc::SR_EOS)
103 return rtc::SR_EOS;
104
105 if (r != rtc::SR_SUCCESS) {
106 ADD_FAILURE();
107 return rtc::SR_ERROR;
108 }
109
110 return rtc::SR_SUCCESS;
111 }
112
113 // Catch readability events on in and pass them up.
114 virtual void OnEventIn(rtc::StreamInterface *stream, int sig,
115 int err) {
116 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
117
118 if (sig & mask) {
119 LOG(LS_INFO) << "SSLDummyStream::OnEvent side=" << side_ << " sig="
120 << sig << " forwarding upward";
121 PostEvent(sig & mask, 0);
122 }
123 }
124
125 // Catch writeability events on out and pass them up.
126 virtual void OnEventOut(rtc::StreamInterface *stream, int sig,
127 int err) {
128 if (sig & rtc::SE_WRITE) {
129 LOG(LS_INFO) << "SSLDummyStream::OnEvent side=" << side_ << " sig="
130 << sig << " forwarding upward";
131
132 PostEvent(sig & rtc::SE_WRITE, 0);
133 }
134 }
135
136 // Write to the outgoing FifoBuffer
137 rtc::StreamResult WriteData(const void* data, size_t data_len,
138 size_t* written, int* error) {
139 return out_->Write(data, data_len, written, error);
140 }
141
142 // Defined later
143 virtual rtc::StreamResult Write(const void* data, size_t data_len,
144 size_t* written, int* error);
145
146 virtual void Close() {
147 LOG(LS_INFO) << "Closing outbound stream";
148 out_->Close();
149 }
150
151 private:
152 SSLStreamAdapterTestBase *test_;
153 const std::string side_;
154 rtc::FifoBuffer *in_;
155 rtc::FifoBuffer *out_;
156 bool first_packet_;
157};
158
159static const int kFifoBufferSize = 4096;
160
161class SSLStreamAdapterTestBase : public testing::Test,
162 public sigslot::has_slots<> {
163 public:
torbjorng4e572472015-10-08 09:42:49 -0700164 SSLStreamAdapterTestBase(
165 const std::string& client_cert_pem,
166 const std::string& client_private_key_pem,
167 bool dtls,
168 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
169 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200170 : client_buffer_(kFifoBufferSize),
171 server_buffer_(kFifoBufferSize),
172 client_stream_(
173 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_)),
174 server_stream_(
175 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_)),
176 client_ssl_(rtc::SSLStreamAdapter::Create(client_stream_)),
177 server_ssl_(rtc::SSLStreamAdapter::Create(server_stream_)),
178 client_identity_(NULL),
179 server_identity_(NULL),
180 delay_(0),
181 mtu_(1460),
182 loss_(0),
183 lose_first_packet_(false),
184 damage_(false),
185 dtls_(dtls),
186 handshake_wait_(5000),
187 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000188 // Set use of the test RNG to get predictable loss patterns.
189 rtc::SetRandomTestMode(true);
190
191 // Set up the slots
192 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
193 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
194
195 if (!client_cert_pem.empty() && !client_private_key_pem.empty()) {
196 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
197 client_private_key_pem, client_cert_pem);
198 } else {
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200199 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000200 }
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200201 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000202
203 client_ssl_->SetIdentity(client_identity_);
204 server_ssl_->SetIdentity(server_identity_);
205 }
206
207 ~SSLStreamAdapterTestBase() {
208 // Put it back for the next test.
209 rtc::SetRandomTestMode(false);
210 }
211
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000212 // Recreate the client/server identities with the specified validity period.
213 // |not_before| and |not_after| are offsets from the current time in number
214 // of seconds.
215 void ResetIdentitiesWithValidity(int not_before, int not_after) {
216 client_stream_ =
217 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_);
218 server_stream_ =
219 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_);
220
221 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
222 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
223
224 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
225 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
226
227 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700228 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229 client_params.common_name = "client";
230 client_params.not_before = not_before;
231 client_params.not_after = not_after;
232 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
233
234 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700235 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000236 server_params.common_name = "server";
237 server_params.not_before = not_before;
238 server_params.not_after = not_after;
239 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
240
241 client_ssl_->SetIdentity(client_identity_);
242 server_ssl_->SetIdentity(server_identity_);
243 }
244
245 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
246 LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
247
248 if (sig & rtc::SE_READ) {
249 ReadData(stream);
250 }
251
252 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
253 WriteData();
254 }
255 }
256
257 void SetPeerIdentitiesByDigest(bool correct) {
258 unsigned char digest[20];
259 size_t digest_len;
260 bool rv;
261
262 LOG(LS_INFO) << "Setting peer identities by digest";
263
264 rv = server_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
265 digest, 20,
266 &digest_len);
267 ASSERT_TRUE(rv);
268 if (!correct) {
269 LOG(LS_INFO) << "Setting bogus digest for server cert";
270 digest[0]++;
271 }
272 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
273 digest_len);
274 ASSERT_TRUE(rv);
275
276
277 rv = client_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
278 digest, 20, &digest_len);
279 ASSERT_TRUE(rv);
280 if (!correct) {
281 LOG(LS_INFO) << "Setting bogus digest for client cert";
282 digest[0]++;
283 }
284 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
285 digest_len);
286 ASSERT_TRUE(rv);
287
288 identities_set_ = true;
289 }
290
Joachim Bauch831c5582015-05-20 12:48:41 +0200291 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
292 rtc::SSLProtocolVersion client_version) {
293 server_ssl_->SetMaxProtocolVersion(server_version);
294 client_ssl_->SetMaxProtocolVersion(client_version);
295 }
296
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000297 void TestHandshake(bool expect_success = true) {
298 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
299 rtc::SSL_MODE_TLS);
300 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
301 rtc::SSL_MODE_TLS);
302
303 if (!dtls_) {
304 // Make sure we simulate a reliable network for TLS.
305 // This is just a check to make sure that people don't write wrong
306 // tests.
307 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
308 }
309
310 if (!identities_set_)
311 SetPeerIdentitiesByDigest(true);
312
313 // Start the handshake
314 int rv;
315
316 server_ssl_->SetServerRole();
317 rv = server_ssl_->StartSSLWithPeer();
318 ASSERT_EQ(0, rv);
319
320 rv = client_ssl_->StartSSLWithPeer();
321 ASSERT_EQ(0, rv);
322
323 // Now run the handshake
324 if (expect_success) {
325 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
326 && (server_ssl_->GetState() == rtc::SS_OPEN),
327 handshake_wait_);
328 } else {
329 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
330 handshake_wait_);
331 }
332 }
333
334 rtc::StreamResult DataWritten(SSLDummyStream *from, const void *data,
335 size_t data_len, size_t *written,
336 int *error) {
337 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200338 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
340 *written = data_len;
341 return rtc::SR_SUCCESS;
342 }
343 if (dtls_ && (data_len > mtu_)) {
344 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len;
345 *written = data_len;
346 return rtc::SR_SUCCESS;
347 }
348
349 // Optionally damage application data (type 23). Note that we don't damage
350 // handshake packets and we damage the last byte to keep the header
351 // intact but break the MAC.
352 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
353 std::vector<char> buf(data_len);
354
355 LOG(LS_INFO) << "Damaging packet";
356
357 memcpy(&buf[0], data, data_len);
358 buf[data_len - 1]++;
359
360 return from->WriteData(&buf[0], data_len, written, error);
361 }
362
363 return from->WriteData(data, data_len, written, error);
364 }
365
366 void SetDelay(int delay) {
367 delay_ = delay;
368 }
369 int GetDelay() { return delay_; }
370
371 void SetLoseFirstPacket(bool lose) {
372 lose_first_packet_ = lose;
373 }
374 bool GetLoseFirstPacket() { return lose_first_packet_; }
375
376 void SetLoss(int percent) {
377 loss_ = percent;
378 }
379
380 void SetDamage() {
381 damage_ = true;
382 }
383
384 void SetMtu(size_t mtu) {
385 mtu_ = mtu;
386 }
387
388 void SetHandshakeWait(int wait) {
389 handshake_wait_ = wait;
390 }
391
guoweis318166b2015-11-18 19:03:38 -0800392 void SetDtlsSrtpCiphers(const std::vector<std::string> &ciphers,
393 bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000394 if (client)
guoweis318166b2015-11-18 19:03:38 -0800395 client_ssl_->SetDtlsSrtpCiphers(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000396 else
guoweis318166b2015-11-18 19:03:38 -0800397 server_ssl_->SetDtlsSrtpCiphers(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 }
399
guoweis318166b2015-11-18 19:03:38 -0800400 bool GetDtlsSrtpCipher(bool client, std::string *retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000401 if (client)
guoweis318166b2015-11-18 19:03:38 -0800402 return client_ssl_->GetDtlsSrtpCipher(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000403 else
guoweis318166b2015-11-18 19:03:38 -0800404 return server_ssl_->GetDtlsSrtpCipher(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000405 }
406
407 bool GetPeerCertificate(bool client, rtc::SSLCertificate** cert) {
408 if (client)
409 return client_ssl_->GetPeerCertificate(cert);
410 else
411 return server_ssl_->GetPeerCertificate(cert);
412 }
413
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700414 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000415 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700416 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000417 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700418 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000419 }
420
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000421 bool ExportKeyingMaterial(const char *label,
422 const unsigned char *context,
423 size_t context_len,
424 bool use_context,
425 bool client,
426 unsigned char *result,
427 size_t result_len) {
428 if (client)
429 return client_ssl_->ExportKeyingMaterial(label,
430 context, context_len,
431 use_context,
432 result, result_len);
433 else
434 return server_ssl_->ExportKeyingMaterial(label,
435 context, context_len,
436 use_context,
437 result, result_len);
438 }
439
440 // To be implemented by subclasses.
441 virtual void WriteData() = 0;
442 virtual void ReadData(rtc::StreamInterface *stream) = 0;
443 virtual void TestTransfer(int size) = 0;
444
445 protected:
446 rtc::FifoBuffer client_buffer_;
447 rtc::FifoBuffer server_buffer_;
448 SSLDummyStream *client_stream_; // freed by client_ssl_ destructor
449 SSLDummyStream *server_stream_; // freed by server_ssl_ destructor
450 rtc::scoped_ptr<rtc::SSLStreamAdapter> client_ssl_;
451 rtc::scoped_ptr<rtc::SSLStreamAdapter> server_ssl_;
452 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
453 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
454 int delay_;
455 size_t mtu_;
456 int loss_;
457 bool lose_first_packet_;
458 bool damage_;
459 bool dtls_;
460 int handshake_wait_;
461 bool identities_set_;
462};
463
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200464class SSLStreamAdapterTestTLS
465 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700466 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000467 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200468 SSLStreamAdapterTestTLS()
469 : SSLStreamAdapterTestBase("",
470 "",
471 false,
472 ::testing::get<0>(GetParam()),
473 ::testing::get<1>(GetParam())){};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000474
475 // Test data transfer for TLS
476 virtual void TestTransfer(int size) {
477 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
478 // Create some dummy data to send.
479 size_t received;
480
481 send_stream_.ReserveSize(size);
482 for (int i = 0; i < size; ++i) {
483 char ch = static_cast<char>(i);
484 send_stream_.Write(&ch, 1, NULL, NULL);
485 }
486 send_stream_.Rewind();
487
488 // Prepare the receive stream.
489 recv_stream_.ReserveSize(size);
490
491 // Start sending
492 WriteData();
493
494 // Wait for the client to close
495 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
496
497 // Now check the data
498 recv_stream_.GetSize(&received);
499
500 EXPECT_EQ(static_cast<size_t>(size), received);
501 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
502 recv_stream_.GetBuffer(), size));
503 }
504
505 void WriteData() {
506 size_t position, tosend, size;
507 rtc::StreamResult rv;
508 size_t sent;
509 char block[kBlockSize];
510
511 send_stream_.GetSize(&size);
512 if (!size)
513 return;
514
515 for (;;) {
516 send_stream_.GetPosition(&position);
517 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
518 rtc::SR_EOS) {
519 rv = client_ssl_->Write(block, tosend, &sent, 0);
520
521 if (rv == rtc::SR_SUCCESS) {
522 send_stream_.SetPosition(position + sent);
523 LOG(LS_VERBOSE) << "Sent: " << position + sent;
524 } else if (rv == rtc::SR_BLOCK) {
525 LOG(LS_VERBOSE) << "Blocked...";
526 send_stream_.SetPosition(position);
527 break;
528 } else {
529 ADD_FAILURE();
530 break;
531 }
532 } else {
533 // Now close
534 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
535 client_ssl_->Close();
536 break;
537 }
538 }
539 };
540
541 virtual void ReadData(rtc::StreamInterface *stream) {
542 char buffer[1600];
543 size_t bread;
544 int err2;
545 rtc::StreamResult r;
546
547 for (;;) {
548 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
549
550 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
551 // Unfortunately, errors are the way that the stream adapter
552 // signals close in OpenSSL
553 stream->Close();
554 return;
555 }
556
557 if (r == rtc::SR_BLOCK)
558 break;
559
560 ASSERT_EQ(rtc::SR_SUCCESS, r);
561 LOG(LS_INFO) << "Read " << bread;
562
563 recv_stream_.Write(buffer, bread, NULL, NULL);
564 }
565 }
566
567 private:
568 rtc::MemoryStream send_stream_;
569 rtc::MemoryStream recv_stream_;
570};
571
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200572class SSLStreamAdapterTestDTLS
573 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700574 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000575 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200576 SSLStreamAdapterTestDTLS()
577 : SSLStreamAdapterTestBase("",
578 "",
579 true,
580 ::testing::get<0>(GetParam()),
581 ::testing::get<1>(GetParam())),
582 packet_size_(1000),
583 count_(0),
584 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000585
586 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
587 const std::string& private_key_pem) :
588 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
589 packet_size_(1000), count_(0), sent_(0) {
590 }
591
592 virtual void WriteData() {
593 unsigned char *packet = new unsigned char[1600];
594
595 do {
596 memset(packet, sent_ & 0xff, packet_size_);
597 *(reinterpret_cast<uint32_t *>(packet)) = sent_;
598
599 size_t sent;
600 int rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
601 if (rv == rtc::SR_SUCCESS) {
602 LOG(LS_VERBOSE) << "Sent: " << sent_;
603 sent_++;
604 } else if (rv == rtc::SR_BLOCK) {
605 LOG(LS_VERBOSE) << "Blocked...";
606 break;
607 } else {
608 ADD_FAILURE();
609 break;
610 }
611 } while (sent_ < count_);
612
613 delete [] packet;
614 }
615
616 virtual void ReadData(rtc::StreamInterface *stream) {
617 unsigned char buffer[2000];
618 size_t bread;
619 int err2;
620 rtc::StreamResult r;
621
622 for (;;) {
623 r = stream->Read(buffer, 2000, &bread, &err2);
624
625 if (r == rtc::SR_ERROR) {
626 // Unfortunately, errors are the way that the stream adapter
627 // signals close right now
628 stream->Close();
629 return;
630 }
631
632 if (r == rtc::SR_BLOCK)
633 break;
634
635 ASSERT_EQ(rtc::SR_SUCCESS, r);
636 LOG(LS_INFO) << "Read " << bread;
637
638 // Now parse the datagram
639 ASSERT_EQ(packet_size_, bread);
640 unsigned char* ptr_to_buffer = buffer;
641 uint32_t packet_num = *(reinterpret_cast<uint32_t *>(ptr_to_buffer));
642
643 for (size_t i = 4; i < packet_size_; i++) {
644 ASSERT_EQ((packet_num & 0xff), buffer[i]);
645 }
646 received_.insert(packet_num);
647 }
648 }
649
650 virtual void TestTransfer(int count) {
651 count_ = count;
652
653 WriteData();
654
655 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
656 LOG(LS_INFO) << "sent_ == " << sent_;
657
658 if (damage_) {
659 WAIT(false, 2000);
660 EXPECT_EQ(0U, received_.size());
661 } else if (loss_ == 0) {
662 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
663 } else {
664 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
665 received_.size();
666 }
667 };
668
669 private:
670 size_t packet_size_;
671 int count_;
672 int sent_;
673 std::set<int> received_;
674};
675
676
677rtc::StreamResult SSLDummyStream::Write(const void* data, size_t data_len,
678 size_t* written, int* error) {
679 *written = data_len;
680
681 LOG(LS_INFO) << "Writing to loopback " << data_len;
682
683 if (first_packet_) {
684 first_packet_ = false;
685 if (test_->GetLoseFirstPacket()) {
686 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
687 return rtc::SR_SUCCESS;
688 }
689 }
690
691 return test_->DataWritten(this, data, data_len, written, error);
692
693 return rtc::SR_SUCCESS;
694};
695
696class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
697 public:
698 SSLStreamAdapterTestDTLSFromPEMStrings() :
699 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
700 }
701};
702
703// Basic tests: TLS
704
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000705// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200706TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000707 TestHandshake();
708};
709
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000710// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200711TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000712 TestHandshake();
713 client_ssl_->Close();
714 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
715};
716
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000717// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200718TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000719 TestHandshake();
720 TestTransfer(100000);
721};
722
723// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200724TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000725 TestHandshake();
726 TestTransfer(100000);
727 client_ssl_->Close();
728
729 rtc::StreamResult rv;
730 char block[kBlockSize];
731 size_t dummy;
732
733 // It's an error to write after closed.
734 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
735 ASSERT_EQ(rtc::SR_ERROR, rv);
736
737 // But after closed read gives you EOS.
738 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
739 ASSERT_EQ(rtc::SR_EOS, rv);
740};
741
742// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200743TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000744 SetPeerIdentitiesByDigest(false);
745 TestHandshake(false);
746};
747
748// Test moving a bunch of data
749
750// Basic tests: DTLS
751// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200752TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000753 MAYBE_SKIP_TEST(HaveDtls);
754 TestHandshake();
755};
756
757// Test that we can make a handshake work if the first packet in
758// each direction is lost. This gives us predictable loss
759// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200760TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000761 MAYBE_SKIP_TEST(HaveDtls);
762 SetLoseFirstPacket(true);
763 TestHandshake();
764};
765
766// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200767TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000768 MAYBE_SKIP_TEST(HaveDtls);
769 SetLoseFirstPacket(true);
770 SetDelay(2000);
771 SetHandshakeWait(20000);
772 TestHandshake();
773};
774
775// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000776// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200777TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000778 MAYBE_SKIP_TEST(HaveDtls);
779 SetMtu(700);
780 SetHandshakeWait(20000);
781 TestHandshake();
782};
783
784// Test transfer -- trivial
Henrik Kjellandereecbab72015-09-16 19:19:04 +0200785// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005
786TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000787 MAYBE_SKIP_TEST(HaveDtls);
788 TestHandshake();
789 TestTransfer(100);
790};
791
Henrik Kjellandereecbab72015-09-16 19:19:04 +0200792// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005
793TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000794 MAYBE_SKIP_TEST(HaveDtls);
795 TestHandshake();
796 SetLoss(10);
797 TestTransfer(100);
798};
799
Henrik Kjellandereecbab72015-09-16 19:19:04 +0200800// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=5005
801TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000802 MAYBE_SKIP_TEST(HaveDtls);
803 SetDamage(); // Must be called first because first packet
804 // write happens at end of handshake.
805 TestHandshake();
806 TestTransfer(100);
807};
808
809// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200810TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000811 MAYBE_SKIP_TEST(HaveDtlsSrtp);
guoweis318166b2015-11-18 19:03:38 -0800812 std::vector<std::string> high;
813 high.push_back(kAES_CM_HMAC_SHA1_80);
814 SetDtlsSrtpCiphers(high, true);
815 SetDtlsSrtpCiphers(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816 TestHandshake();
817
guoweis318166b2015-11-18 19:03:38 -0800818 std::string client_cipher;
819 ASSERT_TRUE(GetDtlsSrtpCipher(true, &client_cipher));
820 std::string server_cipher;
821 ASSERT_TRUE(GetDtlsSrtpCipher(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000822
823 ASSERT_EQ(client_cipher, server_cipher);
guoweis318166b2015-11-18 19:03:38 -0800824 ASSERT_EQ(client_cipher, kAES_CM_HMAC_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000825};
826
827// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200828TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000829 MAYBE_SKIP_TEST(HaveDtlsSrtp);
guoweis318166b2015-11-18 19:03:38 -0800830 std::vector<std::string> low;
831 low.push_back(kAES_CM_HMAC_SHA1_32);
832 SetDtlsSrtpCiphers(low, true);
833 SetDtlsSrtpCiphers(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834 TestHandshake();
835
guoweis318166b2015-11-18 19:03:38 -0800836 std::string client_cipher;
837 ASSERT_TRUE(GetDtlsSrtpCipher(true, &client_cipher));
838 std::string server_cipher;
839 ASSERT_TRUE(GetDtlsSrtpCipher(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000840
841 ASSERT_EQ(client_cipher, server_cipher);
guoweis318166b2015-11-18 19:03:38 -0800842 ASSERT_EQ(client_cipher, kAES_CM_HMAC_SHA1_32);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000843};
844
845
846// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200847TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000848 MAYBE_SKIP_TEST(HaveDtlsSrtp);
guoweis318166b2015-11-18 19:03:38 -0800849 std::vector<std::string> high;
850 high.push_back(kAES_CM_HMAC_SHA1_80);
851 std::vector<std::string> low;
852 low.push_back(kAES_CM_HMAC_SHA1_32);
853 SetDtlsSrtpCiphers(high, true);
854 SetDtlsSrtpCiphers(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000855 TestHandshake();
856
guoweis318166b2015-11-18 19:03:38 -0800857 std::string client_cipher;
858 ASSERT_FALSE(GetDtlsSrtpCipher(true, &client_cipher));
859 std::string server_cipher;
860 ASSERT_FALSE(GetDtlsSrtpCipher(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000861};
862
863// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200864TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000865 MAYBE_SKIP_TEST(HaveDtlsSrtp);
guoweis318166b2015-11-18 19:03:38 -0800866 std::vector<std::string> mixed;
867 mixed.push_back(kAES_CM_HMAC_SHA1_80);
868 mixed.push_back(kAES_CM_HMAC_SHA1_32);
869 SetDtlsSrtpCiphers(mixed, true);
870 SetDtlsSrtpCiphers(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000871 TestHandshake();
872
guoweis318166b2015-11-18 19:03:38 -0800873 std::string client_cipher;
874 ASSERT_TRUE(GetDtlsSrtpCipher(true, &client_cipher));
875 std::string server_cipher;
876 ASSERT_TRUE(GetDtlsSrtpCipher(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000877
878 ASSERT_EQ(client_cipher, server_cipher);
guoweis318166b2015-11-18 19:03:38 -0800879 ASSERT_EQ(client_cipher, kAES_CM_HMAC_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000880};
881
882// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200883TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000884 MAYBE_SKIP_TEST(HaveExporter);
885 TestHandshake();
886 unsigned char client_out[20];
887 unsigned char server_out[20];
888
889 bool result;
890 result = ExportKeyingMaterial(kExporterLabel,
891 kExporterContext, kExporterContextLen,
892 true, true,
893 client_out, sizeof(client_out));
894 ASSERT_TRUE(result);
895
896 result = ExportKeyingMaterial(kExporterLabel,
897 kExporterContext, kExporterContextLen,
898 true, false,
899 server_out, sizeof(server_out));
900 ASSERT_TRUE(result);
901
902 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
903}
904
905// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200906TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000907 MAYBE_SKIP_TEST(HaveDtls);
908 long one_day = 60 * 60 * 24;
909 // Make the certificates not valid until one day later.
910 ResetIdentitiesWithValidity(one_day, one_day);
911 TestHandshake();
912}
913
914// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200915TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000916 MAYBE_SKIP_TEST(HaveDtls);
917 long one_day = 60 * 60 * 24;
918 // Make the certificates already expired.
919 ResetIdentitiesWithValidity(-one_day, -one_day);
920 TestHandshake();
921}
922
923// Test data transfer using certs created from strings.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200924TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000925 MAYBE_SKIP_TEST(HaveDtls);
926 TestHandshake();
927 TestTransfer(100);
928}
929
930// Test getting the remote certificate.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200931TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000932 MAYBE_SKIP_TEST(HaveDtls);
933
934 // Peer certificates haven't been received yet.
935 rtc::scoped_ptr<rtc::SSLCertificate> client_peer_cert;
936 ASSERT_FALSE(GetPeerCertificate(true, client_peer_cert.accept()));
937 ASSERT_FALSE(client_peer_cert != NULL);
938
939 rtc::scoped_ptr<rtc::SSLCertificate> server_peer_cert;
940 ASSERT_FALSE(GetPeerCertificate(false, server_peer_cert.accept()));
941 ASSERT_FALSE(server_peer_cert != NULL);
942
943 TestHandshake();
944
945 // The client should have a peer certificate after the handshake.
946 ASSERT_TRUE(GetPeerCertificate(true, client_peer_cert.accept()));
947 ASSERT_TRUE(client_peer_cert != NULL);
948
949 // It's not kCERT_PEM.
950 std::string client_peer_string = client_peer_cert->ToPEMString();
951 ASSERT_NE(kCERT_PEM, client_peer_string);
952
953 // It must not have a chain, because the test certs are self-signed.
954 rtc::SSLCertChain* client_peer_chain;
955 ASSERT_FALSE(client_peer_cert->GetChain(&client_peer_chain));
956
957 // The server should have a peer certificate after the handshake.
958 ASSERT_TRUE(GetPeerCertificate(false, server_peer_cert.accept()));
959 ASSERT_TRUE(server_peer_cert != NULL);
960
961 // It's kCERT_PEM
962 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
963
964 // It must not have a chain, because the test certs are self-signed.
965 rtc::SSLCertChain* server_peer_chain;
966 ASSERT_FALSE(server_peer_cert->GetChain(&server_peer_chain));
967}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000968
969// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +0200970// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700971TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000972 MAYBE_SKIP_TEST(HaveDtls);
Joachim Bauch831c5582015-05-20 12:48:41 +0200973 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000974 TestHandshake();
975
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700976 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700977 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700978 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700979 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000980
981 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -0700982 ASSERT_EQ(
983 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
984 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()),
985 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +0200986}
987
988// Test getting the used DTLS 1.2 ciphers.
989// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700990TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +0200991 MAYBE_SKIP_TEST(HaveDtls);
992 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
993 TestHandshake();
994
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700995 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700996 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700997 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700998 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +0200999
1000 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -07001001 ASSERT_EQ(
1002 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
1003 rtc::SSL_PROTOCOL_DTLS_12, ::testing::get<1>(GetParam()).type()),
1004 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +02001005}
1006
1007// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001008TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001009 MAYBE_SKIP_TEST(HaveDtls);
1010 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1011 TestHandshake();
1012
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001013 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001014 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001015 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001016 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001017
1018 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -07001019 ASSERT_EQ(
1020 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
1021 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()),
1022 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +02001023}
1024
1025// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001026TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001027 MAYBE_SKIP_TEST(HaveDtls);
1028 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1029 TestHandshake();
1030
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001031 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001032 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001033 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001034 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001035
1036 ASSERT_EQ(client_cipher, server_cipher);
torbjorng4e572472015-10-08 09:42:49 -07001037 ASSERT_EQ(
1038 rtc::SSLStreamAdapter::GetDefaultSslCipherForTest(
1039 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam()).type()),
1040 server_cipher);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001041}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001042
torbjorng4e572472015-10-08 09:42:49 -07001043// The RSA keysizes here might look strange, why not include the RFC's size
1044// 2048?. The reason is test case slowness; testing two sizes to exercise
1045// parametrization is sufficient.
1046INSTANTIATE_TEST_CASE_P(
1047 SSLStreamAdapterTestsTLS,
1048 SSLStreamAdapterTestTLS,
1049 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1050 rtc::KeyParams::RSA(1152, 65537),
1051 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1052 Values(rtc::KeyParams::RSA(1024, 65537),
1053 rtc::KeyParams::RSA(1152, 65537),
1054 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1055INSTANTIATE_TEST_CASE_P(
1056 SSLStreamAdapterTestsDTLS,
1057 SSLStreamAdapterTestDTLS,
1058 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1059 rtc::KeyParams::RSA(1152, 65537),
1060 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1061 Values(rtc::KeyParams::RSA(1024, 65537),
1062 rtc::KeyParams::RSA(1152, 65537),
1063 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));