blob: 67658ba6103ed8e6f4e0bf369ad5a1126cc07378 [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;
32static 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";
34static 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:
164 SSLStreamAdapterTestBase(const std::string& client_cert_pem,
165 const std::string& client_private_key_pem,
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200166 bool dtls,
167 rtc::KeyType client_key_type = rtc::KT_DEFAULT,
168 rtc::KeyType server_key_type = rtc::KT_DEFAULT)
169 : client_buffer_(kFifoBufferSize),
170 server_buffer_(kFifoBufferSize),
171 client_stream_(
172 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_)),
173 server_stream_(
174 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_)),
175 client_ssl_(rtc::SSLStreamAdapter::Create(client_stream_)),
176 server_ssl_(rtc::SSLStreamAdapter::Create(server_stream_)),
177 client_identity_(NULL),
178 server_identity_(NULL),
179 delay_(0),
180 mtu_(1460),
181 loss_(0),
182 lose_first_packet_(false),
183 damage_(false),
184 dtls_(dtls),
185 handshake_wait_(5000),
186 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000187 // Set use of the test RNG to get predictable loss patterns.
188 rtc::SetRandomTestMode(true);
189
190 // Set up the slots
191 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
192 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
193
194 if (!client_cert_pem.empty() && !client_private_key_pem.empty()) {
195 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
196 client_private_key_pem, client_cert_pem);
197 } else {
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200198 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000199 }
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200200 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000201
202 client_ssl_->SetIdentity(client_identity_);
203 server_ssl_->SetIdentity(server_identity_);
204 }
205
206 ~SSLStreamAdapterTestBase() {
207 // Put it back for the next test.
208 rtc::SetRandomTestMode(false);
209 }
210
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000211 // Recreate the client/server identities with the specified validity period.
212 // |not_before| and |not_after| are offsets from the current time in number
213 // of seconds.
214 void ResetIdentitiesWithValidity(int not_before, int not_after) {
215 client_stream_ =
216 new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_);
217 server_stream_ =
218 new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_);
219
220 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
221 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
222
223 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
224 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
225
226 rtc::SSLIdentityParams client_params;
227 client_params.common_name = "client";
228 client_params.not_before = not_before;
229 client_params.not_after = not_after;
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200230 client_params.key_type = rtc::KT_DEFAULT;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000231 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
232
233 rtc::SSLIdentityParams server_params;
234 server_params.common_name = "server";
235 server_params.not_before = not_before;
236 server_params.not_after = not_after;
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200237 server_params.key_type = rtc::KT_DEFAULT;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000238 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
239
240 client_ssl_->SetIdentity(client_identity_);
241 server_ssl_->SetIdentity(server_identity_);
242 }
243
244 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
245 LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
246
247 if (sig & rtc::SE_READ) {
248 ReadData(stream);
249 }
250
251 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
252 WriteData();
253 }
254 }
255
256 void SetPeerIdentitiesByDigest(bool correct) {
257 unsigned char digest[20];
258 size_t digest_len;
259 bool rv;
260
261 LOG(LS_INFO) << "Setting peer identities by digest";
262
263 rv = server_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
264 digest, 20,
265 &digest_len);
266 ASSERT_TRUE(rv);
267 if (!correct) {
268 LOG(LS_INFO) << "Setting bogus digest for server cert";
269 digest[0]++;
270 }
271 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
272 digest_len);
273 ASSERT_TRUE(rv);
274
275
276 rv = client_identity_->certificate().ComputeDigest(rtc::DIGEST_SHA_1,
277 digest, 20, &digest_len);
278 ASSERT_TRUE(rv);
279 if (!correct) {
280 LOG(LS_INFO) << "Setting bogus digest for client cert";
281 digest[0]++;
282 }
283 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
284 digest_len);
285 ASSERT_TRUE(rv);
286
287 identities_set_ = true;
288 }
289
Joachim Bauch831c5582015-05-20 12:48:41 +0200290 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
291 rtc::SSLProtocolVersion client_version) {
292 server_ssl_->SetMaxProtocolVersion(server_version);
293 client_ssl_->SetMaxProtocolVersion(client_version);
294 }
295
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000296 void TestHandshake(bool expect_success = true) {
297 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
298 rtc::SSL_MODE_TLS);
299 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
300 rtc::SSL_MODE_TLS);
301
302 if (!dtls_) {
303 // Make sure we simulate a reliable network for TLS.
304 // This is just a check to make sure that people don't write wrong
305 // tests.
306 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
307 }
308
309 if (!identities_set_)
310 SetPeerIdentitiesByDigest(true);
311
312 // Start the handshake
313 int rv;
314
315 server_ssl_->SetServerRole();
316 rv = server_ssl_->StartSSLWithPeer();
317 ASSERT_EQ(0, rv);
318
319 rv = client_ssl_->StartSSLWithPeer();
320 ASSERT_EQ(0, rv);
321
322 // Now run the handshake
323 if (expect_success) {
324 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
325 && (server_ssl_->GetState() == rtc::SS_OPEN),
326 handshake_wait_);
327 } else {
328 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
329 handshake_wait_);
330 }
331 }
332
333 rtc::StreamResult DataWritten(SSLDummyStream *from, const void *data,
334 size_t data_len, size_t *written,
335 int *error) {
336 // Randomly drop loss_ percent of packets
337 if (rtc::CreateRandomId() % 100 < static_cast<uint32>(loss_)) {
338 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
339 *written = data_len;
340 return rtc::SR_SUCCESS;
341 }
342 if (dtls_ && (data_len > mtu_)) {
343 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len;
344 *written = data_len;
345 return rtc::SR_SUCCESS;
346 }
347
348 // Optionally damage application data (type 23). Note that we don't damage
349 // handshake packets and we damage the last byte to keep the header
350 // intact but break the MAC.
351 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
352 std::vector<char> buf(data_len);
353
354 LOG(LS_INFO) << "Damaging packet";
355
356 memcpy(&buf[0], data, data_len);
357 buf[data_len - 1]++;
358
359 return from->WriteData(&buf[0], data_len, written, error);
360 }
361
362 return from->WriteData(data, data_len, written, error);
363 }
364
365 void SetDelay(int delay) {
366 delay_ = delay;
367 }
368 int GetDelay() { return delay_; }
369
370 void SetLoseFirstPacket(bool lose) {
371 lose_first_packet_ = lose;
372 }
373 bool GetLoseFirstPacket() { return lose_first_packet_; }
374
375 void SetLoss(int percent) {
376 loss_ = percent;
377 }
378
379 void SetDamage() {
380 damage_ = true;
381 }
382
383 void SetMtu(size_t mtu) {
384 mtu_ = mtu;
385 }
386
387 void SetHandshakeWait(int wait) {
388 handshake_wait_ = wait;
389 }
390
391 void SetDtlsSrtpCiphers(const std::vector<std::string> &ciphers,
392 bool client) {
393 if (client)
394 client_ssl_->SetDtlsSrtpCiphers(ciphers);
395 else
396 server_ssl_->SetDtlsSrtpCiphers(ciphers);
397 }
398
399 bool GetDtlsSrtpCipher(bool client, std::string *retval) {
400 if (client)
401 return client_ssl_->GetDtlsSrtpCipher(retval);
402 else
403 return server_ssl_->GetDtlsSrtpCipher(retval);
404 }
405
406 bool GetPeerCertificate(bool client, rtc::SSLCertificate** cert) {
407 if (client)
408 return client_ssl_->GetPeerCertificate(cert);
409 else
410 return server_ssl_->GetPeerCertificate(cert);
411 }
412
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000413 bool GetSslCipher(bool client, std::string *retval) {
414 if (client)
415 return client_ssl_->GetSslCipher(retval);
416 else
417 return server_ssl_->GetSslCipher(retval);
418 }
419
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000420 bool ExportKeyingMaterial(const char *label,
421 const unsigned char *context,
422 size_t context_len,
423 bool use_context,
424 bool client,
425 unsigned char *result,
426 size_t result_len) {
427 if (client)
428 return client_ssl_->ExportKeyingMaterial(label,
429 context, context_len,
430 use_context,
431 result, result_len);
432 else
433 return server_ssl_->ExportKeyingMaterial(label,
434 context, context_len,
435 use_context,
436 result, result_len);
437 }
438
439 // To be implemented by subclasses.
440 virtual void WriteData() = 0;
441 virtual void ReadData(rtc::StreamInterface *stream) = 0;
442 virtual void TestTransfer(int size) = 0;
443
444 protected:
445 rtc::FifoBuffer client_buffer_;
446 rtc::FifoBuffer server_buffer_;
447 SSLDummyStream *client_stream_; // freed by client_ssl_ destructor
448 SSLDummyStream *server_stream_; // freed by server_ssl_ destructor
449 rtc::scoped_ptr<rtc::SSLStreamAdapter> client_ssl_;
450 rtc::scoped_ptr<rtc::SSLStreamAdapter> server_ssl_;
451 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
452 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
453 int delay_;
454 size_t mtu_;
455 int loss_;
456 bool lose_first_packet_;
457 bool damage_;
458 bool dtls_;
459 int handshake_wait_;
460 bool identities_set_;
461};
462
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200463class SSLStreamAdapterTestTLS
464 : public SSLStreamAdapterTestBase,
465 public WithParamInterface<tuple<rtc::KeyType, rtc::KeyType>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000466 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200467 SSLStreamAdapterTestTLS()
468 : SSLStreamAdapterTestBase("",
469 "",
470 false,
471 ::testing::get<0>(GetParam()),
472 ::testing::get<1>(GetParam())){};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000473
474 // Test data transfer for TLS
475 virtual void TestTransfer(int size) {
476 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
477 // Create some dummy data to send.
478 size_t received;
479
480 send_stream_.ReserveSize(size);
481 for (int i = 0; i < size; ++i) {
482 char ch = static_cast<char>(i);
483 send_stream_.Write(&ch, 1, NULL, NULL);
484 }
485 send_stream_.Rewind();
486
487 // Prepare the receive stream.
488 recv_stream_.ReserveSize(size);
489
490 // Start sending
491 WriteData();
492
493 // Wait for the client to close
494 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
495
496 // Now check the data
497 recv_stream_.GetSize(&received);
498
499 EXPECT_EQ(static_cast<size_t>(size), received);
500 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
501 recv_stream_.GetBuffer(), size));
502 }
503
504 void WriteData() {
505 size_t position, tosend, size;
506 rtc::StreamResult rv;
507 size_t sent;
508 char block[kBlockSize];
509
510 send_stream_.GetSize(&size);
511 if (!size)
512 return;
513
514 for (;;) {
515 send_stream_.GetPosition(&position);
516 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
517 rtc::SR_EOS) {
518 rv = client_ssl_->Write(block, tosend, &sent, 0);
519
520 if (rv == rtc::SR_SUCCESS) {
521 send_stream_.SetPosition(position + sent);
522 LOG(LS_VERBOSE) << "Sent: " << position + sent;
523 } else if (rv == rtc::SR_BLOCK) {
524 LOG(LS_VERBOSE) << "Blocked...";
525 send_stream_.SetPosition(position);
526 break;
527 } else {
528 ADD_FAILURE();
529 break;
530 }
531 } else {
532 // Now close
533 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
534 client_ssl_->Close();
535 break;
536 }
537 }
538 };
539
540 virtual void ReadData(rtc::StreamInterface *stream) {
541 char buffer[1600];
542 size_t bread;
543 int err2;
544 rtc::StreamResult r;
545
546 for (;;) {
547 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
548
549 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
550 // Unfortunately, errors are the way that the stream adapter
551 // signals close in OpenSSL
552 stream->Close();
553 return;
554 }
555
556 if (r == rtc::SR_BLOCK)
557 break;
558
559 ASSERT_EQ(rtc::SR_SUCCESS, r);
560 LOG(LS_INFO) << "Read " << bread;
561
562 recv_stream_.Write(buffer, bread, NULL, NULL);
563 }
564 }
565
566 private:
567 rtc::MemoryStream send_stream_;
568 rtc::MemoryStream recv_stream_;
569};
570
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200571class SSLStreamAdapterTestDTLS
572 : public SSLStreamAdapterTestBase,
573 public WithParamInterface<tuple<rtc::KeyType, rtc::KeyType>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000574 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200575 SSLStreamAdapterTestDTLS()
576 : SSLStreamAdapterTestBase("",
577 "",
578 true,
579 ::testing::get<0>(GetParam()),
580 ::testing::get<1>(GetParam())),
581 packet_size_(1000),
582 count_(0),
583 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000584
585 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
586 const std::string& private_key_pem) :
587 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
588 packet_size_(1000), count_(0), sent_(0) {
589 }
590
591 virtual void WriteData() {
592 unsigned char *packet = new unsigned char[1600];
593
594 do {
595 memset(packet, sent_ & 0xff, packet_size_);
596 *(reinterpret_cast<uint32_t *>(packet)) = sent_;
597
598 size_t sent;
599 int rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
600 if (rv == rtc::SR_SUCCESS) {
601 LOG(LS_VERBOSE) << "Sent: " << sent_;
602 sent_++;
603 } else if (rv == rtc::SR_BLOCK) {
604 LOG(LS_VERBOSE) << "Blocked...";
605 break;
606 } else {
607 ADD_FAILURE();
608 break;
609 }
610 } while (sent_ < count_);
611
612 delete [] packet;
613 }
614
615 virtual void ReadData(rtc::StreamInterface *stream) {
616 unsigned char buffer[2000];
617 size_t bread;
618 int err2;
619 rtc::StreamResult r;
620
621 for (;;) {
622 r = stream->Read(buffer, 2000, &bread, &err2);
623
624 if (r == rtc::SR_ERROR) {
625 // Unfortunately, errors are the way that the stream adapter
626 // signals close right now
627 stream->Close();
628 return;
629 }
630
631 if (r == rtc::SR_BLOCK)
632 break;
633
634 ASSERT_EQ(rtc::SR_SUCCESS, r);
635 LOG(LS_INFO) << "Read " << bread;
636
637 // Now parse the datagram
638 ASSERT_EQ(packet_size_, bread);
639 unsigned char* ptr_to_buffer = buffer;
640 uint32_t packet_num = *(reinterpret_cast<uint32_t *>(ptr_to_buffer));
641
642 for (size_t i = 4; i < packet_size_; i++) {
643 ASSERT_EQ((packet_num & 0xff), buffer[i]);
644 }
645 received_.insert(packet_num);
646 }
647 }
648
649 virtual void TestTransfer(int count) {
650 count_ = count;
651
652 WriteData();
653
654 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
655 LOG(LS_INFO) << "sent_ == " << sent_;
656
657 if (damage_) {
658 WAIT(false, 2000);
659 EXPECT_EQ(0U, received_.size());
660 } else if (loss_ == 0) {
661 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
662 } else {
663 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
664 received_.size();
665 }
666 };
667
668 private:
669 size_t packet_size_;
670 int count_;
671 int sent_;
672 std::set<int> received_;
673};
674
675
676rtc::StreamResult SSLDummyStream::Write(const void* data, size_t data_len,
677 size_t* written, int* error) {
678 *written = data_len;
679
680 LOG(LS_INFO) << "Writing to loopback " << data_len;
681
682 if (first_packet_) {
683 first_packet_ = false;
684 if (test_->GetLoseFirstPacket()) {
685 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
686 return rtc::SR_SUCCESS;
687 }
688 }
689
690 return test_->DataWritten(this, data, data_len, written, error);
691
692 return rtc::SR_SUCCESS;
693};
694
695class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
696 public:
697 SSLStreamAdapterTestDTLSFromPEMStrings() :
698 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
699 }
700};
701
702// Basic tests: TLS
703
deadbeef9eb13652015-09-05 04:39:15 -0700704// Test that we cannot read/write if we have not yet handshaked.
705// This test only applies to NSS because OpenSSL has passthrough
706// semantics for I/O before the handshake is started.
707#if SSL_USE_NSS
708TEST_P(SSLStreamAdapterTestTLS, TestNoReadWriteBeforeConnect) {
709 rtc::StreamResult rv;
710 char block[kBlockSize];
711 size_t dummy;
712
713 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
714 ASSERT_EQ(rtc::SR_BLOCK, rv);
715
716 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
717 ASSERT_EQ(rtc::SR_BLOCK, rv);
718}
719#endif
720
721
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000722// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200723TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000724 TestHandshake();
725};
726
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000727// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200728TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000729 TestHandshake();
730 client_ssl_->Close();
731 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
732};
733
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000734// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200735TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000736 TestHandshake();
737 TestTransfer(100000);
738};
739
740// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200741TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000742 TestHandshake();
743 TestTransfer(100000);
744 client_ssl_->Close();
745
746 rtc::StreamResult rv;
747 char block[kBlockSize];
748 size_t dummy;
749
750 // It's an error to write after closed.
751 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
752 ASSERT_EQ(rtc::SR_ERROR, rv);
753
754 // But after closed read gives you EOS.
755 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
756 ASSERT_EQ(rtc::SR_EOS, rv);
757};
758
759// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200760TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000761 SetPeerIdentitiesByDigest(false);
762 TestHandshake(false);
763};
764
765// Test moving a bunch of data
766
767// Basic tests: DTLS
768// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200769TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000770 MAYBE_SKIP_TEST(HaveDtls);
771 TestHandshake();
772};
773
774// Test that we can make a handshake work if the first packet in
775// each direction is lost. This gives us predictable loss
776// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200777TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000778 MAYBE_SKIP_TEST(HaveDtls);
779 SetLoseFirstPacket(true);
780 TestHandshake();
781};
782
783// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200784TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000785 MAYBE_SKIP_TEST(HaveDtls);
786 SetLoseFirstPacket(true);
787 SetDelay(2000);
788 SetHandshakeWait(20000);
789 TestHandshake();
790};
791
792// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000793// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200794TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000795 MAYBE_SKIP_TEST(HaveDtls);
796 SetMtu(700);
797 SetHandshakeWait(20000);
798 TestHandshake();
799};
800
801// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200802TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000803 MAYBE_SKIP_TEST(HaveDtls);
804 TestHandshake();
805 TestTransfer(100);
806};
807
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200808TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000809 MAYBE_SKIP_TEST(HaveDtls);
810 TestHandshake();
811 SetLoss(10);
812 TestTransfer(100);
813};
814
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200815TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816 MAYBE_SKIP_TEST(HaveDtls);
817 SetDamage(); // Must be called first because first packet
818 // write happens at end of handshake.
819 TestHandshake();
820 TestTransfer(100);
821};
822
823// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200824TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000825 MAYBE_SKIP_TEST(HaveDtlsSrtp);
826 std::vector<std::string> high;
827 high.push_back(kAES_CM_HMAC_SHA1_80);
828 SetDtlsSrtpCiphers(high, true);
829 SetDtlsSrtpCiphers(high, false);
830 TestHandshake();
831
832 std::string client_cipher;
833 ASSERT_TRUE(GetDtlsSrtpCipher(true, &client_cipher));
834 std::string server_cipher;
835 ASSERT_TRUE(GetDtlsSrtpCipher(false, &server_cipher));
836
837 ASSERT_EQ(client_cipher, server_cipher);
838 ASSERT_EQ(client_cipher, kAES_CM_HMAC_SHA1_80);
839};
840
841// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200842TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000843 MAYBE_SKIP_TEST(HaveDtlsSrtp);
844 std::vector<std::string> low;
845 low.push_back(kAES_CM_HMAC_SHA1_32);
846 SetDtlsSrtpCiphers(low, true);
847 SetDtlsSrtpCiphers(low, false);
848 TestHandshake();
849
850 std::string client_cipher;
851 ASSERT_TRUE(GetDtlsSrtpCipher(true, &client_cipher));
852 std::string server_cipher;
853 ASSERT_TRUE(GetDtlsSrtpCipher(false, &server_cipher));
854
855 ASSERT_EQ(client_cipher, server_cipher);
856 ASSERT_EQ(client_cipher, kAES_CM_HMAC_SHA1_32);
857};
858
859
860// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200861TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000862 MAYBE_SKIP_TEST(HaveDtlsSrtp);
863 std::vector<std::string> high;
864 high.push_back(kAES_CM_HMAC_SHA1_80);
865 std::vector<std::string> low;
866 low.push_back(kAES_CM_HMAC_SHA1_32);
867 SetDtlsSrtpCiphers(high, true);
868 SetDtlsSrtpCiphers(low, false);
869 TestHandshake();
870
871 std::string client_cipher;
872 ASSERT_FALSE(GetDtlsSrtpCipher(true, &client_cipher));
873 std::string server_cipher;
874 ASSERT_FALSE(GetDtlsSrtpCipher(false, &server_cipher));
875};
876
877// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200878TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000879 MAYBE_SKIP_TEST(HaveDtlsSrtp);
880 std::vector<std::string> mixed;
881 mixed.push_back(kAES_CM_HMAC_SHA1_80);
882 mixed.push_back(kAES_CM_HMAC_SHA1_32);
883 SetDtlsSrtpCiphers(mixed, true);
884 SetDtlsSrtpCiphers(mixed, false);
885 TestHandshake();
886
887 std::string client_cipher;
888 ASSERT_TRUE(GetDtlsSrtpCipher(true, &client_cipher));
889 std::string server_cipher;
890 ASSERT_TRUE(GetDtlsSrtpCipher(false, &server_cipher));
891
892 ASSERT_EQ(client_cipher, server_cipher);
893 ASSERT_EQ(client_cipher, kAES_CM_HMAC_SHA1_80);
894};
895
896// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200897TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000898 MAYBE_SKIP_TEST(HaveExporter);
899 TestHandshake();
900 unsigned char client_out[20];
901 unsigned char server_out[20];
902
903 bool result;
904 result = ExportKeyingMaterial(kExporterLabel,
905 kExporterContext, kExporterContextLen,
906 true, true,
907 client_out, sizeof(client_out));
908 ASSERT_TRUE(result);
909
910 result = ExportKeyingMaterial(kExporterLabel,
911 kExporterContext, kExporterContextLen,
912 true, false,
913 server_out, sizeof(server_out));
914 ASSERT_TRUE(result);
915
916 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
917}
918
919// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200920TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000921 MAYBE_SKIP_TEST(HaveDtls);
922 long one_day = 60 * 60 * 24;
923 // Make the certificates not valid until one day later.
924 ResetIdentitiesWithValidity(one_day, one_day);
925 TestHandshake();
926}
927
928// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200929TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000930 MAYBE_SKIP_TEST(HaveDtls);
931 long one_day = 60 * 60 * 24;
932 // Make the certificates already expired.
933 ResetIdentitiesWithValidity(-one_day, -one_day);
934 TestHandshake();
935}
936
937// Test data transfer using certs created from strings.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200938TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000939 MAYBE_SKIP_TEST(HaveDtls);
940 TestHandshake();
941 TestTransfer(100);
942}
943
944// Test getting the remote certificate.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200945TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000946 MAYBE_SKIP_TEST(HaveDtls);
947
948 // Peer certificates haven't been received yet.
949 rtc::scoped_ptr<rtc::SSLCertificate> client_peer_cert;
950 ASSERT_FALSE(GetPeerCertificate(true, client_peer_cert.accept()));
951 ASSERT_FALSE(client_peer_cert != NULL);
952
953 rtc::scoped_ptr<rtc::SSLCertificate> server_peer_cert;
954 ASSERT_FALSE(GetPeerCertificate(false, server_peer_cert.accept()));
955 ASSERT_FALSE(server_peer_cert != NULL);
956
957 TestHandshake();
958
959 // The client should have a peer certificate after the handshake.
960 ASSERT_TRUE(GetPeerCertificate(true, client_peer_cert.accept()));
961 ASSERT_TRUE(client_peer_cert != NULL);
962
963 // It's not kCERT_PEM.
964 std::string client_peer_string = client_peer_cert->ToPEMString();
965 ASSERT_NE(kCERT_PEM, client_peer_string);
966
967 // It must not have a chain, because the test certs are self-signed.
968 rtc::SSLCertChain* client_peer_chain;
969 ASSERT_FALSE(client_peer_cert->GetChain(&client_peer_chain));
970
971 // The server should have a peer certificate after the handshake.
972 ASSERT_TRUE(GetPeerCertificate(false, server_peer_cert.accept()));
973 ASSERT_TRUE(server_peer_cert != NULL);
974
975 // It's kCERT_PEM
976 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
977
978 // It must not have a chain, because the test certs are self-signed.
979 rtc::SSLCertChain* server_peer_chain;
980 ASSERT_FALSE(server_peer_cert->GetChain(&server_peer_chain));
981}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000982
983// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +0200984// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200985TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipher) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000986 MAYBE_SKIP_TEST(HaveDtls);
Joachim Bauch831c5582015-05-20 12:48:41 +0200987 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000988 TestHandshake();
989
990 std::string client_cipher;
991 ASSERT_TRUE(GetSslCipher(true, &client_cipher));
992 std::string server_cipher;
993 ASSERT_TRUE(GetSslCipher(false, &server_cipher));
994
995 ASSERT_EQ(client_cipher, server_cipher);
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200996 ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher(
997 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam())),
998 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +0200999}
1000
1001// Test getting the used DTLS 1.2 ciphers.
1002// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001003TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001004 MAYBE_SKIP_TEST(HaveDtls);
1005 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1006 TestHandshake();
1007
1008 std::string client_cipher;
1009 ASSERT_TRUE(GetSslCipher(true, &client_cipher));
1010 std::string server_cipher;
1011 ASSERT_TRUE(GetSslCipher(false, &server_cipher));
1012
1013 ASSERT_EQ(client_cipher, server_cipher);
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001014 ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher(
1015 rtc::SSL_PROTOCOL_DTLS_12, ::testing::get<1>(GetParam())),
1016 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +02001017}
1018
1019// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001020TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001021 MAYBE_SKIP_TEST(HaveDtls);
1022 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1023 TestHandshake();
1024
1025 std::string client_cipher;
1026 ASSERT_TRUE(GetSslCipher(true, &client_cipher));
1027 std::string server_cipher;
1028 ASSERT_TRUE(GetSslCipher(false, &server_cipher));
1029
1030 ASSERT_EQ(client_cipher, server_cipher);
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001031 ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher(
1032 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam())),
1033 server_cipher);
Joachim Bauch831c5582015-05-20 12:48:41 +02001034}
1035
1036// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001037TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001038 MAYBE_SKIP_TEST(HaveDtls);
1039 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1040 TestHandshake();
1041
1042 std::string client_cipher;
1043 ASSERT_TRUE(GetSslCipher(true, &client_cipher));
1044 std::string server_cipher;
1045 ASSERT_TRUE(GetSslCipher(false, &server_cipher));
1046
1047 ASSERT_EQ(client_cipher, server_cipher);
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001048 ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher(
1049 rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam())),
1050 server_cipher);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001051}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001052
1053INSTANTIATE_TEST_CASE_P(SSLStreamAdapterTestsTLS,
1054 SSLStreamAdapterTestTLS,
1055 Combine(Values(rtc::KT_RSA, rtc::KT_ECDSA),
1056 Values(rtc::KT_RSA, rtc::KT_ECDSA)));
1057INSTANTIATE_TEST_CASE_P(SSLStreamAdapterTestsDTLS,
1058 SSLStreamAdapterTestDTLS,
1059 Combine(Values(rtc::KT_RSA, rtc::KT_ECDSA),
1060 Values(rtc::KT_RSA, rtc::KT_ECDSA)));