blob: 9e156c0b3c1df82c0c3791edd6888080c31e4516 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12#include <algorithm>
jbauch555604a2016-04-26 03:13:22 -070013#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000014#include <set>
15#include <string>
16
jbauche488a0d2015-11-19 05:17:58 -080017#include "webrtc/base/bufferqueue.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018#include "webrtc/base/gunit.h"
19#include "webrtc/base/helpers.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000020#include "webrtc/base/ssladapter.h"
21#include "webrtc/base/sslconfig.h"
22#include "webrtc/base/sslidentity.h"
23#include "webrtc/base/sslstreamadapter.h"
24#include "webrtc/base/stream.h"
25
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020026using ::testing::WithParamInterface;
27using ::testing::Values;
28using ::testing::Combine;
29using ::testing::tuple;
30
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031static const int kBlockSize = 4096;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000032static const char kExporterLabel[] = "label";
33static const unsigned char kExporterContext[] = "context";
34static int kExporterContextLen = sizeof(kExporterContext);
35
36static const char kRSA_PRIVATE_KEY_PEM[] =
37 "-----BEGIN RSA PRIVATE KEY-----\n"
38 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
39 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
40 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
41 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
42 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
43 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
44 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
45 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
46 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
47 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
48 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
49 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
50 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
51 "UCXiYxSsu20QNVw=\n"
52 "-----END RSA PRIVATE KEY-----\n";
53
54static const char kCERT_PEM[] =
55 "-----BEGIN CERTIFICATE-----\n"
56 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
57 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
58 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
59 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
60 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
61 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
62 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
63 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
64 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
65 "-----END CERTIFICATE-----\n";
66
67#define MAYBE_SKIP_TEST(feature) \
68 if (!(rtc::SSLStreamAdapter::feature())) { \
69 LOG(LS_INFO) << "Feature disabled... skipping"; \
70 return; \
71 }
72
73class SSLStreamAdapterTestBase;
74
jbauche488a0d2015-11-19 05:17:58 -080075class SSLDummyStreamBase : public rtc::StreamInterface,
76 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000077 public:
jbauche488a0d2015-11-19 05:17:58 -080078 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
79 const std::string &side,
80 rtc::StreamInterface* in,
81 rtc::StreamInterface* out) :
82 test_base_(test),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083 side_(side),
84 in_(in),
85 out_(out),
86 first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -080087 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
88 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 }
90
jbauche488a0d2015-11-19 05:17:58 -080091 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000092
jbauche488a0d2015-11-19 05:17:58 -080093 rtc::StreamResult Read(void* buffer, size_t buffer_len,
94 size_t* read, int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000095 rtc::StreamResult r;
96
97 r = in_->Read(buffer, buffer_len, read, error);
98 if (r == rtc::SR_BLOCK)
99 return rtc::SR_BLOCK;
100 if (r == rtc::SR_EOS)
101 return rtc::SR_EOS;
102
103 if (r != rtc::SR_SUCCESS) {
104 ADD_FAILURE();
105 return rtc::SR_ERROR;
106 }
107
108 return rtc::SR_SUCCESS;
109 }
110
111 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800112 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
114
115 if (sig & mask) {
jbauche488a0d2015-11-19 05:17:58 -0800116 LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig="
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117 << sig << " forwarding upward";
118 PostEvent(sig & mask, 0);
119 }
120 }
121
122 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800123 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000124 if (sig & rtc::SE_WRITE) {
jbauche488a0d2015-11-19 05:17:58 -0800125 LOG(LS_INFO) << "SSLDummyStreamBase::OnEvent side=" << side_ << " sig="
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000126 << sig << " forwarding upward";
127
128 PostEvent(sig & rtc::SE_WRITE, 0);
129 }
130 }
131
132 // Write to the outgoing FifoBuffer
133 rtc::StreamResult WriteData(const void* data, size_t data_len,
jbauche488a0d2015-11-19 05:17:58 -0800134 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000135 return out_->Write(data, data_len, written, error);
136 }
137
jbauche488a0d2015-11-19 05:17:58 -0800138 rtc::StreamResult Write(const void* data, size_t data_len,
139 size_t* written, int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000140
jbauche488a0d2015-11-19 05:17:58 -0800141 void Close() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142 LOG(LS_INFO) << "Closing outbound stream";
143 out_->Close();
144 }
145
jbauche488a0d2015-11-19 05:17:58 -0800146 protected:
147 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000148 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800149 rtc::StreamInterface* in_;
150 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151 bool first_packet_;
152};
153
jbauche488a0d2015-11-19 05:17:58 -0800154class SSLDummyStreamTLS : public SSLDummyStreamBase {
155 public:
156 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
157 const std::string& side,
158 rtc::FifoBuffer* in,
159 rtc::FifoBuffer* out) :
160 SSLDummyStreamBase(test, side, in, out) {
161 }
162};
163
164class BufferQueueStream : public rtc::BufferQueue,
165 public rtc::StreamInterface {
166 public:
167 BufferQueueStream(size_t capacity, size_t default_size)
168 : rtc::BufferQueue(capacity, default_size) {
169 }
170
171 // Implementation of abstract StreamInterface methods.
172
173 // A buffer queue stream is always "open".
174 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
175
176 // Reading a buffer queue stream will either succeed or block.
177 rtc::StreamResult Read(void* buffer, size_t buffer_len,
178 size_t* read, int* error) override {
179 if (!ReadFront(buffer, buffer_len, read)) {
180 return rtc::SR_BLOCK;
181 }
182 return rtc::SR_SUCCESS;
183 }
184
185 // Writing to a buffer queue stream will either succeed or block.
186 rtc::StreamResult Write(const void* data, size_t data_len,
187 size_t* written, int* error) override {
188 if (!WriteBack(data, data_len, written)) {
189 return rtc::SR_BLOCK;
190 }
191 return rtc::SR_SUCCESS;
192 }
193
194 // A buffer queue stream can not be closed.
195 void Close() override {}
196
197 protected:
198 void NotifyReadableForTest() override {
199 PostEvent(rtc::SE_READ, 0);
200 }
201
202 void NotifyWritableForTest() override {
203 PostEvent(rtc::SE_WRITE, 0);
204 }
205};
206
207class SSLDummyStreamDTLS : public SSLDummyStreamBase {
208 public:
209 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
210 const std::string& side,
211 BufferQueueStream* in,
212 BufferQueueStream* out) :
213 SSLDummyStreamBase(test, side, in, out) {
214 }
215};
216
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000217static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800218static const int kBufferCapacity = 1;
219static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000220
221class SSLStreamAdapterTestBase : public testing::Test,
222 public sigslot::has_slots<> {
223 public:
torbjorng4e572472015-10-08 09:42:49 -0700224 SSLStreamAdapterTestBase(
225 const std::string& client_cert_pem,
226 const std::string& client_private_key_pem,
227 bool dtls,
228 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
229 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800230 : client_cert_pem_(client_cert_pem),
231 client_private_key_pem_(client_private_key_pem),
232 client_key_type_(client_key_type),
233 server_key_type_(server_key_type),
234 client_stream_(NULL),
235 server_stream_(NULL),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200236 client_identity_(NULL),
237 server_identity_(NULL),
238 delay_(0),
239 mtu_(1460),
240 loss_(0),
241 lose_first_packet_(false),
242 damage_(false),
243 dtls_(dtls),
244 handshake_wait_(5000),
245 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000246 // Set use of the test RNG to get predictable loss patterns.
247 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000248 }
249
250 ~SSLStreamAdapterTestBase() {
251 // Put it back for the next test.
252 rtc::SetRandomTestMode(false);
253 }
254
torbjorng7593aad2015-11-19 12:20:51 -0800255 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800256 CreateStreams();
257
258 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
259 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
260
261 // Set up the slots
262 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
263 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
264
265 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
266 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
267 client_private_key_pem_, client_cert_pem_);
268 } else {
269 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
270 }
271 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
272
273 client_ssl_->SetIdentity(client_identity_);
274 server_ssl_->SetIdentity(server_identity_);
275 }
276
torbjorng7593aad2015-11-19 12:20:51 -0800277 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800278 client_ssl_.reset(nullptr);
279 server_ssl_.reset(nullptr);
280 }
281
282 virtual void CreateStreams() = 0;
283
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000284 // Recreate the client/server identities with the specified validity period.
285 // |not_before| and |not_after| are offsets from the current time in number
286 // of seconds.
287 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800288 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000289
290 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
291 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
292
293 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
294 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
295
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100296 time_t now = time(nullptr);
297
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000298 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700299 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000300 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100301 client_params.not_before = now + not_before;
302 client_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000303 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
304
305 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700306 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000307 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100308 server_params.not_before = now + not_before;
309 server_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000310 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
311
312 client_ssl_->SetIdentity(client_identity_);
313 server_ssl_->SetIdentity(server_identity_);
314 }
315
316 virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
317 LOG(LS_INFO) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
318
319 if (sig & rtc::SE_READ) {
320 ReadData(stream);
321 }
322
323 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
324 WriteData();
325 }
326 }
327
deadbeef89824f62016-09-30 11:55:43 -0700328 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
329 unsigned char server_digest[20];
330 size_t server_digest_len;
331 unsigned char client_digest[20];
332 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000333 bool rv;
deadbeef89824f62016-09-30 11:55:43 -0700334 rtc::SSLPeerCertificateDigestError err;
335 rtc::SSLPeerCertificateDigestError expected_err =
336 expect_success
337 ? rtc::SSLPeerCertificateDigestError::NONE
338 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339
340 LOG(LS_INFO) << "Setting peer identities by digest";
341
deadbeef89824f62016-09-30 11:55:43 -0700342 rv = server_identity_->certificate().ComputeDigest(
343 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000344 ASSERT_TRUE(rv);
deadbeef89824f62016-09-30 11:55:43 -0700345 rv = client_identity_->certificate().ComputeDigest(
346 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
347 ASSERT_TRUE(rv);
348
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000349 if (!correct) {
350 LOG(LS_INFO) << "Setting bogus digest for server cert";
deadbeef89824f62016-09-30 11:55:43 -0700351 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352 }
deadbeef89824f62016-09-30 11:55:43 -0700353 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
354 server_digest_len, &err);
355 EXPECT_EQ(expected_err, err);
356 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000357
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000358 if (!correct) {
359 LOG(LS_INFO) << "Setting bogus digest for client cert";
deadbeef89824f62016-09-30 11:55:43 -0700360 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000361 }
deadbeef89824f62016-09-30 11:55:43 -0700362 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
363 client_digest_len, &err);
364 EXPECT_EQ(expected_err, err);
365 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000366
367 identities_set_ = true;
368 }
369
Joachim Bauch831c5582015-05-20 12:48:41 +0200370 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
371 rtc::SSLProtocolVersion client_version) {
372 server_ssl_->SetMaxProtocolVersion(server_version);
373 client_ssl_->SetMaxProtocolVersion(client_version);
374 }
375
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000376 void TestHandshake(bool expect_success = true) {
377 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
378 rtc::SSL_MODE_TLS);
379 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
380 rtc::SSL_MODE_TLS);
381
382 if (!dtls_) {
383 // Make sure we simulate a reliable network for TLS.
384 // This is just a check to make sure that people don't write wrong
385 // tests.
386 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
387 }
388
389 if (!identities_set_)
deadbeef89824f62016-09-30 11:55:43 -0700390 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000391
392 // Start the handshake
393 int rv;
394
395 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700396 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000397 ASSERT_EQ(0, rv);
398
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700399 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000400 ASSERT_EQ(0, rv);
401
402 // Now run the handshake
403 if (expect_success) {
404 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
405 && (server_ssl_->GetState() == rtc::SS_OPEN),
406 handshake_wait_);
407 } else {
408 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
409 handshake_wait_);
410 }
411 }
412
deadbeef89824f62016-09-30 11:55:43 -0700413 // This tests that the handshake can complete before the identity is
414 // verified, and the identity will be verified after the fact.
415 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
416 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
417 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
418
419 if (!dtls_) {
420 // Make sure we simulate a reliable network for TLS.
421 // This is just a check to make sure that people don't write wrong
422 // tests.
423 ASSERT((mtu_ == 1460) && (loss_ == 0) && (lose_first_packet_ == 0));
424 }
425
426 // Start the handshake
427 int rv;
428
429 server_ssl_->SetServerRole();
430 rv = server_ssl_->StartSSL();
431 ASSERT_EQ(0, rv);
432
433 rv = client_ssl_->StartSSL();
434 ASSERT_EQ(0, rv);
435
436 // Now run the handshake.
437 EXPECT_TRUE_WAIT(
438 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
439 handshake_wait_);
440
441 // Until the identity has been verified, the state should still be
442 // SS_OPENING and writes should return SR_BLOCK.
443 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
444 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
445 unsigned char packet[1];
446 size_t sent;
447 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
448 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
449
450 // If we set an invalid identity at this point, SetPeerCertificateDigest
451 // should return false.
452 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
453 // State should then transition to SS_OPEN or SS_CLOSED based on validation
454 // of the identity.
455 if (valid_identity) {
456 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
457 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
458 } else {
459 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
460 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
461 }
462 }
463
jbauche488a0d2015-11-19 05:17:58 -0800464 rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data,
465 size_t data_len, size_t *written,
466 int *error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000467 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200468 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000469 LOG(LS_INFO) << "Randomly dropping packet, size=" << data_len;
470 *written = data_len;
471 return rtc::SR_SUCCESS;
472 }
473 if (dtls_ && (data_len > mtu_)) {
474 LOG(LS_INFO) << "Dropping packet > mtu, size=" << data_len;
475 *written = data_len;
476 return rtc::SR_SUCCESS;
477 }
478
479 // Optionally damage application data (type 23). Note that we don't damage
480 // handshake packets and we damage the last byte to keep the header
481 // intact but break the MAC.
482 if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
483 std::vector<char> buf(data_len);
484
485 LOG(LS_INFO) << "Damaging packet";
486
487 memcpy(&buf[0], data, data_len);
488 buf[data_len - 1]++;
489
490 return from->WriteData(&buf[0], data_len, written, error);
491 }
492
493 return from->WriteData(data, data_len, written, error);
494 }
495
496 void SetDelay(int delay) {
497 delay_ = delay;
498 }
499 int GetDelay() { return delay_; }
500
501 void SetLoseFirstPacket(bool lose) {
502 lose_first_packet_ = lose;
503 }
504 bool GetLoseFirstPacket() { return lose_first_packet_; }
505
506 void SetLoss(int percent) {
507 loss_ = percent;
508 }
509
510 void SetDamage() {
511 damage_ = true;
512 }
513
514 void SetMtu(size_t mtu) {
515 mtu_ = mtu;
516 }
517
518 void SetHandshakeWait(int wait) {
519 handshake_wait_ = wait;
520 }
521
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800522 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000523 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800524 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000525 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800526 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000527 }
528
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800529 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000530 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800531 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000532 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800533 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000534 }
535
jbauch555604a2016-04-26 03:13:22 -0700536 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000537 if (client)
kwibergb4d01c42016-04-06 05:15:06 -0700538 return client_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000539 else
kwibergb4d01c42016-04-06 05:15:06 -0700540 return server_ssl_->GetPeerCertificate();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000541 }
542
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700543 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000544 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700545 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000546 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700547 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000548 }
549
torbjorng43166b82016-03-11 00:06:47 -0800550 int GetSslVersion(bool client) {
551 if (client)
552 return client_ssl_->GetSslVersion();
553 else
554 return server_ssl_->GetSslVersion();
555 }
556
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000557 bool ExportKeyingMaterial(const char *label,
558 const unsigned char *context,
559 size_t context_len,
560 bool use_context,
561 bool client,
562 unsigned char *result,
563 size_t result_len) {
564 if (client)
565 return client_ssl_->ExportKeyingMaterial(label,
566 context, context_len,
567 use_context,
568 result, result_len);
569 else
570 return server_ssl_->ExportKeyingMaterial(label,
571 context, context_len,
572 use_context,
573 result, result_len);
574 }
575
576 // To be implemented by subclasses.
577 virtual void WriteData() = 0;
578 virtual void ReadData(rtc::StreamInterface *stream) = 0;
579 virtual void TestTransfer(int size) = 0;
580
581 protected:
jbauche488a0d2015-11-19 05:17:58 -0800582 std::string client_cert_pem_;
583 std::string client_private_key_pem_;
584 rtc::KeyParams client_key_type_;
585 rtc::KeyParams server_key_type_;
586 SSLDummyStreamBase *client_stream_; // freed by client_ssl_ destructor
587 SSLDummyStreamBase *server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700588 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
589 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000590 rtc::SSLIdentity *client_identity_; // freed by client_ssl_ destructor
591 rtc::SSLIdentity *server_identity_; // freed by server_ssl_ destructor
592 int delay_;
593 size_t mtu_;
594 int loss_;
595 bool lose_first_packet_;
596 bool damage_;
597 bool dtls_;
598 int handshake_wait_;
599 bool identities_set_;
600};
601
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200602class SSLStreamAdapterTestTLS
603 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700604 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000605 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200606 SSLStreamAdapterTestTLS()
607 : SSLStreamAdapterTestBase("",
608 "",
609 false,
610 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800611 ::testing::get<1>(GetParam())),
612 client_buffer_(kFifoBufferSize),
613 server_buffer_(kFifoBufferSize) {
614 }
615
torbjorng7593aad2015-11-19 12:20:51 -0800616 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800617 client_stream_ =
618 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
619 server_stream_ =
620 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
621 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000622
623 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700624 void TestTransfer(int size) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000625 LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
626 // Create some dummy data to send.
627 size_t received;
628
629 send_stream_.ReserveSize(size);
630 for (int i = 0; i < size; ++i) {
631 char ch = static_cast<char>(i);
632 send_stream_.Write(&ch, 1, NULL, NULL);
633 }
634 send_stream_.Rewind();
635
636 // Prepare the receive stream.
637 recv_stream_.ReserveSize(size);
638
639 // Start sending
640 WriteData();
641
642 // Wait for the client to close
643 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
644
645 // Now check the data
646 recv_stream_.GetSize(&received);
647
648 EXPECT_EQ(static_cast<size_t>(size), received);
649 EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
650 recv_stream_.GetBuffer(), size));
651 }
652
nisseef8b61e2016-04-29 06:09:15 -0700653 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000654 size_t position, tosend, size;
655 rtc::StreamResult rv;
656 size_t sent;
657 char block[kBlockSize];
658
659 send_stream_.GetSize(&size);
660 if (!size)
661 return;
662
663 for (;;) {
664 send_stream_.GetPosition(&position);
665 if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
666 rtc::SR_EOS) {
667 rv = client_ssl_->Write(block, tosend, &sent, 0);
668
669 if (rv == rtc::SR_SUCCESS) {
670 send_stream_.SetPosition(position + sent);
671 LOG(LS_VERBOSE) << "Sent: " << position + sent;
672 } else if (rv == rtc::SR_BLOCK) {
673 LOG(LS_VERBOSE) << "Blocked...";
674 send_stream_.SetPosition(position);
675 break;
676 } else {
677 ADD_FAILURE();
678 break;
679 }
680 } else {
681 // Now close
682 LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
683 client_ssl_->Close();
684 break;
685 }
686 }
687 };
688
nisseef8b61e2016-04-29 06:09:15 -0700689 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000690 char buffer[1600];
691 size_t bread;
692 int err2;
693 rtc::StreamResult r;
694
695 for (;;) {
696 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
697
698 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
699 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800700 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000701 stream->Close();
702 return;
703 }
704
705 if (r == rtc::SR_BLOCK)
706 break;
707
708 ASSERT_EQ(rtc::SR_SUCCESS, r);
709 LOG(LS_INFO) << "Read " << bread;
710
711 recv_stream_.Write(buffer, bread, NULL, NULL);
712 }
713 }
714
715 private:
jbauche488a0d2015-11-19 05:17:58 -0800716 rtc::FifoBuffer client_buffer_;
717 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000718 rtc::MemoryStream send_stream_;
719 rtc::MemoryStream recv_stream_;
720};
721
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200722class SSLStreamAdapterTestDTLS
723 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700724 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000725 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200726 SSLStreamAdapterTestDTLS()
727 : SSLStreamAdapterTestBase("",
728 "",
729 true,
730 ::testing::get<0>(GetParam()),
731 ::testing::get<1>(GetParam())),
jbauche488a0d2015-11-19 05:17:58 -0800732 client_buffer_(kBufferCapacity, kDefaultBufferSize),
733 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200734 packet_size_(1000),
735 count_(0),
736 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000737
738 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
739 const std::string& private_key_pem) :
740 SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
jbauche488a0d2015-11-19 05:17:58 -0800741 client_buffer_(kBufferCapacity, kDefaultBufferSize),
742 server_buffer_(kBufferCapacity, kDefaultBufferSize),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000743 packet_size_(1000), count_(0), sent_(0) {
744 }
745
torbjorng7593aad2015-11-19 12:20:51 -0800746 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800747 client_stream_ =
748 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
749 server_stream_ =
750 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
751 }
752
nisseef8b61e2016-04-29 06:09:15 -0700753 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000754 unsigned char *packet = new unsigned char[1600];
755
jbauche488a0d2015-11-19 05:17:58 -0800756 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800757 unsigned int rand_state = sent_;
758 packet[0] = sent_;
759 for (size_t i = 1; i < packet_size_; i++) {
760 // This is a simple LC PRNG. Keep in synch with identical code below.
761 rand_state = (rand_state * 251 + 19937) >> 7;
762 packet[i] = rand_state & 0xff;
763 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000764
765 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800766 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000767 if (rv == rtc::SR_SUCCESS) {
768 LOG(LS_VERBOSE) << "Sent: " << sent_;
769 sent_++;
770 } else if (rv == rtc::SR_BLOCK) {
771 LOG(LS_VERBOSE) << "Blocked...";
772 break;
773 } else {
774 ADD_FAILURE();
775 break;
776 }
jbauche488a0d2015-11-19 05:17:58 -0800777 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000778
779 delete [] packet;
780 }
781
nisseef8b61e2016-04-29 06:09:15 -0700782 void ReadData(rtc::StreamInterface *stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000783 unsigned char buffer[2000];
784 size_t bread;
785 int err2;
786 rtc::StreamResult r;
787
788 for (;;) {
789 r = stream->Read(buffer, 2000, &bread, &err2);
790
791 if (r == rtc::SR_ERROR) {
792 // Unfortunately, errors are the way that the stream adapter
793 // signals close right now
794 stream->Close();
795 return;
796 }
797
798 if (r == rtc::SR_BLOCK)
799 break;
800
801 ASSERT_EQ(rtc::SR_SUCCESS, r);
802 LOG(LS_INFO) << "Read " << bread;
803
804 // Now parse the datagram
805 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800806 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000807
torbjorng7593aad2015-11-19 12:20:51 -0800808 unsigned int rand_state = packet_num;
809 for (size_t i = 1; i < packet_size_; i++) {
810 // This is a simple LC PRNG. Keep in synch with identical code above.
811 rand_state = (rand_state * 251 + 19937) >> 7;
812 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000813 }
814 received_.insert(packet_num);
815 }
816 }
817
nisseef8b61e2016-04-29 06:09:15 -0700818 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000819 count_ = count;
820
821 WriteData();
822
823 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
824 LOG(LS_INFO) << "sent_ == " << sent_;
825
826 if (damage_) {
827 WAIT(false, 2000);
828 EXPECT_EQ(0U, received_.size());
829 } else if (loss_ == 0) {
830 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
831 } else {
832 LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
833 received_.size();
834 }
835 };
836
837 private:
jbauche488a0d2015-11-19 05:17:58 -0800838 BufferQueueStream client_buffer_;
839 BufferQueueStream server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000840 size_t packet_size_;
841 int count_;
842 int sent_;
843 std::set<int> received_;
844};
845
846
jbauche488a0d2015-11-19 05:17:58 -0800847rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000848 size_t* written, int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000849 LOG(LS_INFO) << "Writing to loopback " << data_len;
850
851 if (first_packet_) {
852 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800853 if (test_base_->GetLoseFirstPacket()) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000854 LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800855 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000856 return rtc::SR_SUCCESS;
857 }
858 }
859
jbauche488a0d2015-11-19 05:17:58 -0800860 return test_base_->DataWritten(this, data, data_len, written, error);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000861};
862
863class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
864 public:
865 SSLStreamAdapterTestDTLSFromPEMStrings() :
866 SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
867 }
868};
869
870// Basic tests: TLS
871
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000872// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200873TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000874 TestHandshake();
875};
876
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000877// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200878TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000879 TestHandshake();
880 client_ssl_->Close();
881 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
882};
883
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000884// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200885TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000886 TestHandshake();
887 TestTransfer(100000);
888};
889
890// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200891TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000892 TestHandshake();
893 TestTransfer(100000);
894 client_ssl_->Close();
895
896 rtc::StreamResult rv;
897 char block[kBlockSize];
898 size_t dummy;
899
900 // It's an error to write after closed.
901 rv = client_ssl_->Write(block, sizeof(block), &dummy, NULL);
902 ASSERT_EQ(rtc::SR_ERROR, rv);
903
904 // But after closed read gives you EOS.
905 rv = client_ssl_->Read(block, sizeof(block), &dummy, NULL);
906 ASSERT_EQ(rtc::SR_EOS, rv);
907};
908
909// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200910TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
deadbeef89824f62016-09-30 11:55:43 -0700911 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000912 TestHandshake(false);
913};
914
deadbeef89824f62016-09-30 11:55:43 -0700915TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
916 TestHandshakeWithDelayedIdentity(true);
917};
918
919TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
920 TestHandshakeWithDelayedIdentity(false);
921};
922
923// Test that the correct error is returned when SetPeerCertificateDigest is
924// called with an unknown algorithm.
925TEST_P(SSLStreamAdapterTestTLS,
926 TestSetPeerCertificateDigestWithUnknownAlgorithm) {
927 unsigned char server_digest[20];
928 size_t server_digest_len;
929 bool rv;
930 rtc::SSLPeerCertificateDigestError err;
931
932 rv = server_identity_->certificate().ComputeDigest(
933 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
934 ASSERT_TRUE(rv);
935
936 rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
937 server_digest_len, &err);
938 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
939 EXPECT_FALSE(rv);
940}
941
942// Test that the correct error is returned when SetPeerCertificateDigest is
943// called with an invalid digest length.
944TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
945 unsigned char server_digest[20];
946 size_t server_digest_len;
947 bool rv;
948 rtc::SSLPeerCertificateDigestError err;
949
950 rv = server_identity_->certificate().ComputeDigest(
951 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
952 ASSERT_TRUE(rv);
953
954 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
955 server_digest_len - 1, &err);
956 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
957 EXPECT_FALSE(rv);
958}
959
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000960// Test moving a bunch of data
961
962// Basic tests: DTLS
963// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200964TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000965 MAYBE_SKIP_TEST(HaveDtls);
966 TestHandshake();
967};
968
969// Test that we can make a handshake work if the first packet in
970// each direction is lost. This gives us predictable loss
971// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200972TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000973 MAYBE_SKIP_TEST(HaveDtls);
974 SetLoseFirstPacket(true);
975 TestHandshake();
976};
977
978// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200979TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000980 MAYBE_SKIP_TEST(HaveDtls);
981 SetLoseFirstPacket(true);
982 SetDelay(2000);
983 SetHandshakeWait(20000);
984 TestHandshake();
985};
986
987// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +0000988// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200989TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000990 MAYBE_SKIP_TEST(HaveDtls);
991 SetMtu(700);
992 SetHandshakeWait(20000);
993 TestHandshake();
994};
995
996// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -0800997TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000998 MAYBE_SKIP_TEST(HaveDtls);
999 TestHandshake();
1000 TestTransfer(100);
1001};
1002
jbauche488a0d2015-11-19 05:17:58 -08001003TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001004 MAYBE_SKIP_TEST(HaveDtls);
1005 TestHandshake();
1006 SetLoss(10);
1007 TestTransfer(100);
1008};
1009
jbauche488a0d2015-11-19 05:17:58 -08001010TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001011 MAYBE_SKIP_TEST(HaveDtls);
1012 SetDamage(); // Must be called first because first packet
1013 // write happens at end of handshake.
1014 TestHandshake();
1015 TestTransfer(100);
1016};
1017
deadbeef89824f62016-09-30 11:55:43 -07001018TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
1019 TestHandshakeWithDelayedIdentity(true);
1020};
1021
1022TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
1023 TestHandshakeWithDelayedIdentity(false);
1024};
1025
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001026// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001027TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001028 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001029 std::vector<int> high;
1030 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1031 SetDtlsSrtpCryptoSuites(high, true);
1032 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001033 TestHandshake();
1034
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001035 int client_cipher;
1036 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1037 int server_cipher;
1038 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001039
1040 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001041 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042};
1043
1044// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001045TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001046 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001047 std::vector<int> low;
1048 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1049 SetDtlsSrtpCryptoSuites(low, true);
1050 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001051 TestHandshake();
1052
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001053 int client_cipher;
1054 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1055 int server_cipher;
1056 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001057
1058 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001059 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001060};
1061
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001062// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001063TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001064 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001065 std::vector<int> high;
1066 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1067 std::vector<int> low;
1068 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1069 SetDtlsSrtpCryptoSuites(high, true);
1070 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001071 TestHandshake();
1072
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001073 int client_cipher;
1074 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1075 int server_cipher;
1076 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001077};
1078
1079// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001080TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001081 MAYBE_SKIP_TEST(HaveDtlsSrtp);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001082 std::vector<int> mixed;
1083 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1084 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1085 SetDtlsSrtpCryptoSuites(mixed, true);
1086 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001087 TestHandshake();
1088
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001089 int client_cipher;
1090 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1091 int server_cipher;
1092 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001093
1094 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001095 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001096};
1097
jbauchcb560652016-08-04 05:20:32 -07001098// Test DTLS-SRTP with all GCM-128 ciphers.
1099TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
1100 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1101 std::vector<int> gcm128;
1102 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1103 SetDtlsSrtpCryptoSuites(gcm128, true);
1104 SetDtlsSrtpCryptoSuites(gcm128, false);
1105 TestHandshake();
1106
1107 int client_cipher;
1108 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1109 int server_cipher;
1110 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1111
1112 ASSERT_EQ(client_cipher, server_cipher);
1113 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
1114};
1115
1116// Test DTLS-SRTP with all GCM-256 ciphers.
1117TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
1118 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1119 std::vector<int> gcm256;
1120 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1121 SetDtlsSrtpCryptoSuites(gcm256, true);
1122 SetDtlsSrtpCryptoSuites(gcm256, false);
1123 TestHandshake();
1124
1125 int client_cipher;
1126 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1127 int server_cipher;
1128 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1129
1130 ASSERT_EQ(client_cipher, server_cipher);
1131 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1132};
1133
1134// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1135TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
1136 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1137 std::vector<int> gcm128;
1138 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1139 std::vector<int> gcm256;
1140 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1141 SetDtlsSrtpCryptoSuites(gcm128, true);
1142 SetDtlsSrtpCryptoSuites(gcm256, false);
1143 TestHandshake();
1144
1145 int client_cipher;
1146 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1147 int server_cipher;
1148 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1149};
1150
1151// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1152TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
1153 MAYBE_SKIP_TEST(HaveDtlsSrtp);
1154 std::vector<int> gcmBoth;
1155 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1156 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1157 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1158 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1159 TestHandshake();
1160
1161 int client_cipher;
1162 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1163 int server_cipher;
1164 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1165
1166 ASSERT_EQ(client_cipher, server_cipher);
1167 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
1168};
1169
1170// Test SRTP cipher suite lengths.
1171TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1172 int key_len;
1173 int salt_len;
1174
1175 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(
1176 rtc::SRTP_INVALID_CRYPTO_SUITE, &key_len, &salt_len));
1177
1178 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1179 rtc::SRTP_AES128_CM_SHA1_32, &key_len, &salt_len));
1180 ASSERT_EQ(128/8, key_len);
1181 ASSERT_EQ(112/8, salt_len);
1182
1183 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1184 rtc::SRTP_AES128_CM_SHA1_80, &key_len, &salt_len));
1185 ASSERT_EQ(128/8, key_len);
1186 ASSERT_EQ(112/8, salt_len);
1187
1188 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1189 rtc::SRTP_AEAD_AES_128_GCM, &key_len, &salt_len));
1190 ASSERT_EQ(128/8, key_len);
1191 ASSERT_EQ(96/8, salt_len);
1192
1193 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
1194 rtc::SRTP_AEAD_AES_256_GCM, &key_len, &salt_len));
1195 ASSERT_EQ(256/8, key_len);
1196 ASSERT_EQ(96/8, salt_len);
1197};
1198
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001199// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001200TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001201 MAYBE_SKIP_TEST(HaveExporter);
1202 TestHandshake();
1203 unsigned char client_out[20];
1204 unsigned char server_out[20];
1205
1206 bool result;
1207 result = ExportKeyingMaterial(kExporterLabel,
1208 kExporterContext, kExporterContextLen,
1209 true, true,
1210 client_out, sizeof(client_out));
1211 ASSERT_TRUE(result);
1212
1213 result = ExportKeyingMaterial(kExporterLabel,
1214 kExporterContext, kExporterContextLen,
1215 true, false,
1216 server_out, sizeof(server_out));
1217 ASSERT_TRUE(result);
1218
1219 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1220}
1221
1222// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001223TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001224 MAYBE_SKIP_TEST(HaveDtls);
1225 long one_day = 60 * 60 * 24;
1226 // Make the certificates not valid until one day later.
1227 ResetIdentitiesWithValidity(one_day, one_day);
1228 TestHandshake();
1229}
1230
1231// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001232TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001233 MAYBE_SKIP_TEST(HaveDtls);
1234 long one_day = 60 * 60 * 24;
1235 // Make the certificates already expired.
1236 ResetIdentitiesWithValidity(-one_day, -one_day);
1237 TestHandshake();
1238}
1239
1240// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001241TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001242 MAYBE_SKIP_TEST(HaveDtls);
1243 TestHandshake();
1244 TestTransfer(100);
1245}
1246
1247// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001248TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001249 MAYBE_SKIP_TEST(HaveDtls);
1250
1251 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001252 ASSERT_FALSE(GetPeerCertificate(true));
1253 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001254
1255 TestHandshake();
1256
1257 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001258 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001259 GetPeerCertificate(true);
1260 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001261
1262 // It's not kCERT_PEM.
1263 std::string client_peer_string = client_peer_cert->ToPEMString();
1264 ASSERT_NE(kCERT_PEM, client_peer_string);
1265
1266 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001267 ASSERT_FALSE(client_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001268
1269 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001270 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001271 GetPeerCertificate(false);
1272 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001273
1274 // It's kCERT_PEM
1275 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
1276
1277 // It must not have a chain, because the test certs are self-signed.
kwibergf5d47862016-03-15 12:53:24 -07001278 ASSERT_FALSE(server_peer_cert->GetChain());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001279}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001280
1281// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +02001282// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001283TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001284 MAYBE_SKIP_TEST(HaveDtls);
Joachim Bauch831c5582015-05-20 12:48:41 +02001285 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001286 TestHandshake();
1287
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001288 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001289 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001290 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001291 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001292
torbjorng43166b82016-03-11 00:06:47 -08001293 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1294 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1295
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001296 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001297 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1298 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001299}
1300
1301// Test getting the used DTLS 1.2 ciphers.
1302// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001303TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001304 MAYBE_SKIP_TEST(HaveDtls);
1305 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1306 TestHandshake();
1307
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001308 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001309 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001310 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001311 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001312
torbjorng43166b82016-03-11 00:06:47 -08001313 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1314 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1315
Joachim Bauch831c5582015-05-20 12:48:41 +02001316 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001317 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1318 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001319}
1320
1321// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001322TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001323 MAYBE_SKIP_TEST(HaveDtls);
1324 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1325 TestHandshake();
1326
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001327 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001328 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001329 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001330 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001331
torbjorng43166b82016-03-11 00:06:47 -08001332 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1333 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1334
Joachim Bauch831c5582015-05-20 12:48:41 +02001335 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001336 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1337 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001338}
1339
1340// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
torbjorng43166b82016-03-11 00:06:47 -08001341TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001342 MAYBE_SKIP_TEST(HaveDtls);
1343 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1344 TestHandshake();
1345
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001346 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001347 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001348 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001349 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001350
torbjorng43166b82016-03-11 00:06:47 -08001351 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1352 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1353
Joachim Bauch831c5582015-05-20 12:48:41 +02001354 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001355 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1356 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001357}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001358
torbjorng4e572472015-10-08 09:42:49 -07001359// The RSA keysizes here might look strange, why not include the RFC's size
1360// 2048?. The reason is test case slowness; testing two sizes to exercise
1361// parametrization is sufficient.
1362INSTANTIATE_TEST_CASE_P(
1363 SSLStreamAdapterTestsTLS,
1364 SSLStreamAdapterTestTLS,
1365 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1366 rtc::KeyParams::RSA(1152, 65537),
1367 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1368 Values(rtc::KeyParams::RSA(1024, 65537),
1369 rtc::KeyParams::RSA(1152, 65537),
1370 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
1371INSTANTIATE_TEST_CASE_P(
1372 SSLStreamAdapterTestsDTLS,
1373 SSLStreamAdapterTestDTLS,
1374 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1375 rtc::KeyParams::RSA(1152, 65537),
1376 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1377 Values(rtc::KeyParams::RSA(1024, 65537),
1378 rtc::KeyParams::RSA(1152, 65537),
1379 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));