blob: 1ba2f3e25938159b533d82320a495ad8c050ca22 [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
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000011#include <algorithm>
jbauch555604a2016-04-26 03:13:22 -070012#include <memory>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013#include <set>
14#include <string>
15
Harald Alvestrand8515d5a2020-03-20 22:51:32 +010016#include "absl/memory/memory.h"
Steve Anton10542f22019-01-11 09:11:00 -080017#include "rtc_base/buffer_queue.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/checks.h"
19#include "rtc_base/gunit.h"
20#include "rtc_base/helpers.h"
Niels Möller13339482019-03-28 13:30:15 +010021#include "rtc_base/memory/fifo_buffer.h"
Niels Möllere7547d52018-11-01 09:33:08 +010022#include "rtc_base/memory_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "rtc_base/message_digest.h"
Guido Urdaneta14bba6e2020-09-25 16:00:51 +020024#include "rtc_base/openssl_stream_adapter.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "rtc_base/ssl_adapter.h"
26#include "rtc_base/ssl_identity.h"
27#include "rtc_base/ssl_stream_adapter.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "rtc_base/stream.h"
Tommi04482982020-10-05 12:43:53 +000029#include "rtc_base/task_utils/pending_task_safety_flag.h"
30#include "rtc_base/task_utils/to_queued_task.h"
Harald Alvestrand13799132020-03-09 19:39:36 +010031#include "test/field_trial.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000032
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020033using ::testing::Combine;
34using ::testing::tuple;
Harald Alvestrand13799132020-03-09 19:39:36 +010035using ::testing::Values;
36using ::testing::WithParamInterface;
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020037
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000038static const int kBlockSize = 4096;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000039static const char kExporterLabel[] = "label";
40static const unsigned char kExporterContext[] = "context";
41static int kExporterContextLen = sizeof(kExporterContext);
42
Harald Alvestrand13799132020-03-09 19:39:36 +010043// A private key used for testing, broken into pieces in order to avoid
44// issues with Git's checks for private keys in repos.
45#define RSA_PRIVATE_KEY_HEADER "-----BEGIN RSA PRIVATE KEY-----\n"
46
47static const char kRSA_PRIVATE_KEY_PEM[] = RSA_PRIVATE_KEY_HEADER
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000048 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
49 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
50 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
51 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
52 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
53 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
54 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
55 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
56 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
57 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
58 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
59 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
60 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
61 "UCXiYxSsu20QNVw=\n"
62 "-----END RSA PRIVATE KEY-----\n";
63
Harald Alvestrand13799132020-03-09 19:39:36 +010064#undef RSA_PRIVATE_KEY_HEADER
65
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000066static const char kCERT_PEM[] =
67 "-----BEGIN CERTIFICATE-----\n"
68 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
69 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
70 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
71 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
72 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
73 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
74 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
75 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
76 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
77 "-----END CERTIFICATE-----\n";
78
Jian Cui0a8798b2017-11-16 16:58:02 -080079static const char kIntCert1[] =
80 "-----BEGIN CERTIFICATE-----\n"
81 "MIIEUjCCAjqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBljELMAkGA1UEBhMCVVMx\n"
82 "EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS\n"
83 "BgNVBAoMC0dvb2dsZSwgSW5jMQwwCgYDVQQLDANHVFAxFzAVBgNVBAMMDnRlbGVw\n"
84 "aG9ueS5nb29nMR0wGwYJKoZIhvcNAQkBFg5ndHBAZ29vZ2xlLmNvbTAeFw0xNzA5\n"
85 "MjYwNDA5MDNaFw0yMDA2MjIwNDA5MDNaMGQxCzAJBgNVBAYTAlVTMQswCQYDVQQI\n"
86 "DAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEXMBUGA1UECgwOdGVsZXBob255\n"
87 "Lmdvb2cxFzAVBgNVBAMMDnRlbGVwaG9ueS5nb29nMIGfMA0GCSqGSIb3DQEBAQUA\n"
88 "A4GNADCBiQKBgQDJXWeeU1v1+wlqkVobzI3aN7Uh2iVQA9YCdq5suuabtiD/qoOD\n"
89 "NKpmQqsx7WZGGWSZTDFEBaUpvIK7Hb+nzRqk6iioPCFOFuarm6GxO1xVneImMuE6\n"
90 "tuWb3YZPr+ikChJbl11y5UcSbg0QsbeUc+jHl5umNvrL85Y+z8SP0rxbBwIDAQAB\n"
91 "o2AwXjAdBgNVHQ4EFgQU7tdZobqlN8R8V72FQnRxmqq8tKswHwYDVR0jBBgwFoAU\n"
92 "5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC\n"
93 "AQYwDQYJKoZIhvcNAQELBQADggIBADObh9Z+z14FmP9zSenhFtq7hFnmNrSkklk8\n"
94 "eyYWXKfOuIriEQQBZsz76ZcnzStih8Rj+yQ0AXydk4fJ5LOwC2cUqQBar17g6Pd2\n"
95 "8g4SIL4azR9WvtiSvpuGlwp25b+yunaacDne6ebnf/MUiiKT5w61Xo3cEPVfl38e\n"
96 "/Up2l0bioid5enUTmg6LY6RxDO6tnZQkz3XD+nNSwT4ehtkqFpHYWjErj0BbkDM2\n"
97 "hiVc/JsYOZn3DmuOlHVHU6sKwqh3JEyvHO/d7DGzMGWHpHwv2mCTJq6l/sR95Tc2\n"
98 "GaQZgGDVNs9pdEouJCDm9e/PbQWRYhnat82PTkXx/6mDAAwdZlIi/pACzq8K4p7e\n"
99 "6hF0t8uKGnXJubHPXxlnJU6yxZ0yWmivAGjwWK4ur832gKlho4jeMDhiI/T3QPpl\n"
100 "iMNsIvxRhdD+GxJkQP1ezayw8s+Uc9KwKglrkBSRRDLCJUfPOvMmXLUDSTMX7kp4\n"
101 "/Ak1CA8dVLJIlfEjLBUuvAttlP7+7lsKNgxAjCxZkWLXIyGULzNPQwVWkGfCbrQs\n"
102 "XyMvSbFsSIb7blV7eLlmf9a+2RprUUkc2ALXLLCI9YQXmxm2beBfMyNmmebwBJzT\n"
103 "B0OR+5pFFNTJPoNlqpdrDsGrDu7JlUtk0ZLZzYyKXbgy2qXxfd4OWzXXjxpLMszZ\n"
104 "LDIpOAkj\n"
105 "-----END CERTIFICATE-----\n";
106
107static const char kCACert[] =
108 "-----BEGIN CERTIFICATE-----\n"
109 "MIIGETCCA/mgAwIBAgIJAKN9r/BdbGUJMA0GCSqGSIb3DQEBCwUAMIGWMQswCQYD\n"
110 "VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g\n"
111 "VmlldzEUMBIGA1UECgwLR29vZ2xlLCBJbmMxDDAKBgNVBAsMA0dUUDEXMBUGA1UE\n"
112 "AwwOdGVsZXBob255Lmdvb2cxHTAbBgkqhkiG9w0BCQEWDmd0cEBnb29nbGUuY29t\n"
113 "MB4XDTE3MDcyNzIzMDE0NVoXDTE3MDgyNjIzMDE0NVowgZYxCzAJBgNVBAYTAlVT\n"
114 "MRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQw\n"
115 "EgYDVQQKDAtHb29nbGUsIEluYzEMMAoGA1UECwwDR1RQMRcwFQYDVQQDDA50ZWxl\n"
116 "cGhvbnkuZ29vZzEdMBsGCSqGSIb3DQEJARYOZ3RwQGdvb2dsZS5jb20wggIiMA0G\n"
117 "CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCfvpF7aBV5Hp1EHsWoIlL3GeHwh8dS\n"
118 "lv9VQCegN9rD06Ny7MgcED5AiK2vqXmUmOVS+7NbATkdVYN/eozDhKtN3Q3n87kJ\n"
119 "Nt/TD/TcZZHOZIGsRPbrf2URK26E/5KzTzbzXVBOA1e+gSj+EBbltGqb01ZO5ErF\n"
120 "iPGViPM/HpYKdq6mfz2bS5PhU67XZMM2zvToyReQ/Fjm/6PJhwKSRXSgZF5djPhk\n"
121 "2LfOKMLS0AeZtd2C4DFsCU41lfLUkybioDgFuzTQ3TFi1K8A07KYTMmLY/yQppnf\n"
122 "SpNX58shlVhM+Ed37K1Z0rU0OfVCZ5P+KKaSSfMranjlU7zeUIhZYjqq/EYrEhbS\n"
123 "dLnNHwgJrqxzId3kq8uuLM6+VB7JZKnZLfT90GdAbX4+tutNe21smmogF9f80vEy\n"
124 "gM4tOp9rXrvz9vCwWHXVY9kdKemdLAsREoO6MS9k2ctK4jj80o2dROuFC6Q3e7mz\n"
125 "RjvZr5Tvi464c2o9o/jNlJ0O6q7V2eQzohD+7VnV5QPpRGXxlIeqpR2zoAg+WtRS\n"
126 "4OgHOVYiD3M6uAlggJA5pcDjMfkEZ+pkhtVcT4qMCEoruk6GbyPxS565oSHu16bH\n"
127 "EjeCqbZOVND5T3oA7nz6aQSs8sJabt0jmxUkGVnE+4ZDIuuRtkRma+0P/96Mtqor\n"
128 "OlpNWY1OBDY64QIDAQABo2AwXjAdBgNVHQ4EFgQU5GgKMUtcxkQ2dJrtNR5YOlIA\n"
129 "PDswHwYDVR0jBBgwFoAU5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUw\n"
130 "AwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAARQly5/bB6VUL2C\n"
131 "ykDYgWt48go407pAra6tL2kjpdfxV5PdL7iMZRkeht00vj+BVahIqZKrNOa/f5Fx\n"
132 "vlpahZFu0PDN436aQwRZ9qWut2qDOK0/z9Hhj6NWybquRFwMwqkPG/ivLMDU8Dmj\n"
133 "CIplpngPYNwXCs0KzdjSXYxqxJbwMjQXELD+/RcurY0oTtJMM1/2vKQMzw24UJqe\n"
134 "XLJAlsnd2AnWzWNUEviDZY89j9NdkHerBmV2gGzcU+X5lgOO5M8odBv0ZC9D+a6Z\n"
135 "QPZAOfdGVw60hhGvTW5s/s0dHwCpegRidhs0MD0fTmwwjYFBSmUx3Gztr4JTzOOr\n"
136 "7e5daJuak2ujQ5DqcGBvt1gePjSudb5brS7JQtN8tI/FyrnR4q/OuOwv1EvlC5RG\n"
137 "hLX+TXaWqFxB1Hd8ebKRR40mboFG6KcUI3lLBthDvQE7jnq48QfZMjlMQK0ZF1l7\n"
138 "SrlwRXWA74bU8CLJvnZKKo9p4TsTiDYGSYC6tNHKj5s3TGWL46oqGyZ0KdGNhrtC\n"
139 "rIGenMhth1vPYjyy0XuGBndXT85yi+IM2l8g8oU845+plxIhgpSI8bbC0oLwnhQ5\n"
140 "ARfsiYLkXDE7imSS0CSUmye76372mlzAIB1is4bBB/SzpPQtBuB9LDKtONgpSGHn\n"
141 "dGaXBy+qbVXVyGXaeEbIRjtJ6m92\n"
142 "-----END CERTIFICATE-----\n";
143
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000144class SSLStreamAdapterTestBase;
145
jbauche488a0d2015-11-19 05:17:58 -0800146class SSLDummyStreamBase : public rtc::StreamInterface,
147 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000148 public:
jbauche488a0d2015-11-19 05:17:58 -0800149 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
Yves Gerey665174f2018-06-19 15:03:05 +0200150 const std::string& side,
jbauche488a0d2015-11-19 05:17:58 -0800151 rtc::StreamInterface* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200152 rtc::StreamInterface* out)
153 : test_base_(test), side_(side), in_(in), out_(out), first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -0800154 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
155 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156 }
157
jbauche488a0d2015-11-19 05:17:58 -0800158 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000159
Yves Gerey665174f2018-06-19 15:03:05 +0200160 rtc::StreamResult Read(void* buffer,
161 size_t buffer_len,
162 size_t* read,
163 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000164 rtc::StreamResult r;
165
166 r = in_->Read(buffer, buffer_len, read, error);
167 if (r == rtc::SR_BLOCK)
168 return rtc::SR_BLOCK;
169 if (r == rtc::SR_EOS)
170 return rtc::SR_EOS;
171
172 if (r != rtc::SR_SUCCESS) {
173 ADD_FAILURE();
174 return rtc::SR_ERROR;
175 }
176
177 return rtc::SR_SUCCESS;
178 }
179
180 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800181 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000182 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
183
184 if (sig & mask) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100185 RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
186 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000187 PostEvent(sig & mask, 0);
188 }
189 }
190
191 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800192 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000193 if (sig & rtc::SE_WRITE) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100194 RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
195 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000196
197 PostEvent(sig & rtc::SE_WRITE, 0);
198 }
199 }
200
201 // Write to the outgoing FifoBuffer
Yves Gerey665174f2018-06-19 15:03:05 +0200202 rtc::StreamResult WriteData(const void* data,
203 size_t data_len,
204 size_t* written,
205 int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206 return out_->Write(data, data_len, written, error);
207 }
208
Yves Gerey665174f2018-06-19 15:03:05 +0200209 rtc::StreamResult Write(const void* data,
210 size_t data_len,
211 size_t* written,
212 int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000213
jbauche488a0d2015-11-19 05:17:58 -0800214 void Close() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100215 RTC_LOG(LS_INFO) << "Closing outbound stream";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000216 out_->Close();
217 }
218
Tommi04482982020-10-05 12:43:53 +0000219 private:
220 void PostEvent(int events, int err) {
221 thread_->PostTask(webrtc::ToQueuedTask(task_safety_, [this, events, err]() {
222 SignalEvent(this, events, err);
223 }));
224 }
225
226 webrtc::ScopedTaskSafety task_safety_;
227 rtc::Thread* const thread_ = rtc::Thread::Current();
jbauche488a0d2015-11-19 05:17:58 -0800228 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800230 rtc::StreamInterface* in_;
231 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000232 bool first_packet_;
233};
234
jbauche488a0d2015-11-19 05:17:58 -0800235class SSLDummyStreamTLS : public SSLDummyStreamBase {
236 public:
237 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
238 const std::string& side,
239 rtc::FifoBuffer* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200240 rtc::FifoBuffer* out)
241 : SSLDummyStreamBase(test, side, in, out) {}
jbauche488a0d2015-11-19 05:17:58 -0800242};
243
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200244class BufferQueueStream : public rtc::StreamInterface {
jbauche488a0d2015-11-19 05:17:58 -0800245 public:
246 BufferQueueStream(size_t capacity, size_t default_size)
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200247 : buffer_(capacity, default_size) {}
jbauche488a0d2015-11-19 05:17:58 -0800248
249 // Implementation of abstract StreamInterface methods.
250
251 // A buffer queue stream is always "open".
252 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
253
254 // Reading a buffer queue stream will either succeed or block.
Yves Gerey665174f2018-06-19 15:03:05 +0200255 rtc::StreamResult Read(void* buffer,
256 size_t buffer_len,
257 size_t* read,
258 int* error) override {
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200259 const bool was_writable = buffer_.is_writable();
260 if (!buffer_.ReadFront(buffer, buffer_len, read))
jbauche488a0d2015-11-19 05:17:58 -0800261 return rtc::SR_BLOCK;
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200262
263 if (!was_writable)
264 NotifyWritableForTest();
265
jbauche488a0d2015-11-19 05:17:58 -0800266 return rtc::SR_SUCCESS;
267 }
268
269 // Writing to a buffer queue stream will either succeed or block.
Yves Gerey665174f2018-06-19 15:03:05 +0200270 rtc::StreamResult Write(const void* data,
271 size_t data_len,
272 size_t* written,
273 int* error) override {
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200274 const bool was_readable = buffer_.is_readable();
275 if (!buffer_.WriteBack(data, data_len, written))
jbauche488a0d2015-11-19 05:17:58 -0800276 return rtc::SR_BLOCK;
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200277
278 if (!was_readable)
279 NotifyReadableForTest();
280
jbauche488a0d2015-11-19 05:17:58 -0800281 return rtc::SR_SUCCESS;
282 }
283
284 // A buffer queue stream can not be closed.
285 void Close() override {}
286
287 protected:
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200288 void NotifyReadableForTest() { PostEvent(rtc::SE_READ, 0); }
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200289 void NotifyWritableForTest() { PostEvent(rtc::SE_WRITE, 0); }
290
291 private:
Tommi04482982020-10-05 12:43:53 +0000292 void PostEvent(int events, int err) {
293 thread_->PostTask(webrtc::ToQueuedTask(task_safety_, [this, events, err]() {
294 SignalEvent(this, events, err);
295 }));
296 }
297
298 rtc::Thread* const thread_ = rtc::Thread::Current();
299 webrtc::ScopedTaskSafety task_safety_;
Tomas Gunnarssonb6bc09b2020-09-29 13:04:01 +0200300 rtc::BufferQueue buffer_;
jbauche488a0d2015-11-19 05:17:58 -0800301};
302
303class SSLDummyStreamDTLS : public SSLDummyStreamBase {
304 public:
305 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
306 const std::string& side,
307 BufferQueueStream* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200308 BufferQueueStream* out)
309 : SSLDummyStreamBase(test, side, in, out) {}
jbauche488a0d2015-11-19 05:17:58 -0800310};
311
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000312static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800313static const int kBufferCapacity = 1;
314static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000315
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200316class SSLStreamAdapterTestBase : public ::testing::Test,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000317 public sigslot::has_slots<> {
318 public:
torbjorng4e572472015-10-08 09:42:49 -0700319 SSLStreamAdapterTestBase(
320 const std::string& client_cert_pem,
321 const std::string& client_private_key_pem,
322 bool dtls,
323 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
324 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800325 : client_cert_pem_(client_cert_pem),
326 client_private_key_pem_(client_private_key_pem),
327 client_key_type_(client_key_type),
328 server_key_type_(server_key_type),
deadbeef37f5ecf2017-02-27 14:06:41 -0800329 client_stream_(nullptr),
330 server_stream_(nullptr),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200331 delay_(0),
332 mtu_(1460),
333 loss_(0),
334 lose_first_packet_(false),
335 damage_(false),
336 dtls_(dtls),
337 handshake_wait_(5000),
Benjamin Wrightaf1f8652019-04-01 18:25:23 +0000338 identities_set_(false) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000339 // Set use of the test RNG to get predictable loss patterns.
340 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000341 }
342
Steve Anton9de3aac2017-10-24 10:08:26 -0700343 ~SSLStreamAdapterTestBase() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000344 // Put it back for the next test.
345 rtc::SetRandomTestMode(false);
346 }
347
torbjorng7593aad2015-11-19 12:20:51 -0800348 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800349 CreateStreams();
350
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100351 client_ssl_ =
352 rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
353 server_ssl_ =
354 rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
jbauche488a0d2015-11-19 05:17:58 -0800355
356 // Set up the slots
357 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
358 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
359
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100360 std::unique_ptr<rtc::SSLIdentity> client_identity;
jbauche488a0d2015-11-19 05:17:58 -0800361 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100362 client_identity = rtc::SSLIdentity::CreateFromPEMStrings(
jbauche488a0d2015-11-19 05:17:58 -0800363 client_private_key_pem_, client_cert_pem_);
364 } else {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100365 client_identity = rtc::SSLIdentity::Create("client", client_key_type_);
jbauche488a0d2015-11-19 05:17:58 -0800366 }
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100367 auto server_identity = rtc::SSLIdentity::Create("server", server_key_type_);
jbauche488a0d2015-11-19 05:17:58 -0800368
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100369 client_ssl_->SetIdentity(std::move(client_identity));
370 server_ssl_->SetIdentity(std::move(server_identity));
jbauche488a0d2015-11-19 05:17:58 -0800371 }
372
torbjorng7593aad2015-11-19 12:20:51 -0800373 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800374 client_ssl_.reset(nullptr);
375 server_ssl_.reset(nullptr);
376 }
377
378 virtual void CreateStreams() = 0;
379
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000380 // Recreate the client/server identities with the specified validity period.
381 // |not_before| and |not_after| are offsets from the current time in number
382 // of seconds.
383 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800384 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000385
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100386 client_ssl_ =
387 rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
388 server_ssl_ =
389 rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000390
391 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
392 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
393
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100394 time_t now = time(nullptr);
395
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000396 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700397 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100399 client_params.not_before = now + not_before;
400 client_params.not_after = now + not_after;
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100401 auto client_identity = rtc::SSLIdentity::CreateForTest(client_params);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000402
403 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700404 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000405 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100406 server_params.not_before = now + not_before;
407 server_params.not_after = now + not_after;
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100408 auto server_identity = rtc::SSLIdentity::CreateForTest(server_params);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000409
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100410 client_ssl_->SetIdentity(std::move(client_identity));
411 server_ssl_->SetIdentity(std::move(server_identity));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000412 }
413
Yves Gerey665174f2018-06-19 15:03:05 +0200414 virtual void OnEvent(rtc::StreamInterface* stream, int sig, int err) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100415 RTC_LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000416
417 if (sig & rtc::SE_READ) {
418 ReadData(stream);
419 }
420
421 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
422 WriteData();
423 }
424 }
425
deadbeef89824f62016-09-30 11:55:43 -0700426 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
427 unsigned char server_digest[20];
428 size_t server_digest_len;
429 unsigned char client_digest[20];
430 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000431 bool rv;
deadbeef89824f62016-09-30 11:55:43 -0700432 rtc::SSLPeerCertificateDigestError err;
433 rtc::SSLPeerCertificateDigestError expected_err =
434 expect_success
435 ? rtc::SSLPeerCertificateDigestError::NONE
436 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000437
Mirko Bonadei675513b2017-11-09 11:09:25 +0100438 RTC_LOG(LS_INFO) << "Setting peer identities by digest";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000439
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100440 rv = server_identity()->certificate().ComputeDigest(
deadbeef89824f62016-09-30 11:55:43 -0700441 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000442 ASSERT_TRUE(rv);
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100443 rv = client_identity()->certificate().ComputeDigest(
deadbeef89824f62016-09-30 11:55:43 -0700444 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
445 ASSERT_TRUE(rv);
446
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000447 if (!correct) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100448 RTC_LOG(LS_INFO) << "Setting bogus digest for server cert";
deadbeef89824f62016-09-30 11:55:43 -0700449 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000450 }
deadbeef89824f62016-09-30 11:55:43 -0700451 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
452 server_digest_len, &err);
453 EXPECT_EQ(expected_err, err);
454 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000455
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000456 if (!correct) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100457 RTC_LOG(LS_INFO) << "Setting bogus digest for client cert";
deadbeef89824f62016-09-30 11:55:43 -0700458 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000459 }
deadbeef89824f62016-09-30 11:55:43 -0700460 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
461 client_digest_len, &err);
462 EXPECT_EQ(expected_err, err);
463 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000464
465 identities_set_ = true;
466 }
467
Joachim Bauch831c5582015-05-20 12:48:41 +0200468 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
469 rtc::SSLProtocolVersion client_version) {
470 server_ssl_->SetMaxProtocolVersion(server_version);
471 client_ssl_->SetMaxProtocolVersion(client_version);
472 }
473
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000474 void TestHandshake(bool expect_success = true) {
Yves Gerey665174f2018-06-19 15:03:05 +0200475 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
476 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000477
478 if (!dtls_) {
479 // Make sure we simulate a reliable network for TLS.
480 // This is just a check to make sure that people don't write wrong
481 // tests.
nissec16fa5e2017-02-07 07:18:43 -0800482 RTC_CHECK_EQ(1460, mtu_);
483 RTC_CHECK(!loss_);
484 RTC_CHECK(!lose_first_packet_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000485 }
486
487 if (!identities_set_)
deadbeef89824f62016-09-30 11:55:43 -0700488 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000489
490 // Start the handshake
491 int rv;
492
493 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700494 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000495 ASSERT_EQ(0, rv);
496
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700497 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000498 ASSERT_EQ(0, rv);
499
500 // Now run the handshake
501 if (expect_success) {
Yves Gerey665174f2018-06-19 15:03:05 +0200502 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) &&
503 (server_ssl_->GetState() == rtc::SS_OPEN),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000504 handshake_wait_);
505 } else {
506 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
507 handshake_wait_);
508 }
509 }
510
deadbeef89824f62016-09-30 11:55:43 -0700511 // This tests that the handshake can complete before the identity is
512 // verified, and the identity will be verified after the fact.
513 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
514 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
515 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
516
517 if (!dtls_) {
518 // Make sure we simulate a reliable network for TLS.
519 // This is just a check to make sure that people don't write wrong
520 // tests.
nissec16fa5e2017-02-07 07:18:43 -0800521 RTC_CHECK_EQ(1460, mtu_);
522 RTC_CHECK(!loss_);
523 RTC_CHECK(!lose_first_packet_);
deadbeef89824f62016-09-30 11:55:43 -0700524 }
525
526 // Start the handshake
527 int rv;
528
529 server_ssl_->SetServerRole();
530 rv = server_ssl_->StartSSL();
531 ASSERT_EQ(0, rv);
532
533 rv = client_ssl_->StartSSL();
534 ASSERT_EQ(0, rv);
535
536 // Now run the handshake.
537 EXPECT_TRUE_WAIT(
538 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
539 handshake_wait_);
540
541 // Until the identity has been verified, the state should still be
542 // SS_OPENING and writes should return SR_BLOCK.
543 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
544 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
545 unsigned char packet[1];
546 size_t sent;
547 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
548 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
549
550 // If we set an invalid identity at this point, SetPeerCertificateDigest
551 // should return false.
552 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
553 // State should then transition to SS_OPEN or SS_CLOSED based on validation
554 // of the identity.
555 if (valid_identity) {
556 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
557 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
558 } else {
559 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
560 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
561 }
562 }
563
Yves Gerey665174f2018-06-19 15:03:05 +0200564 rtc::StreamResult DataWritten(SSLDummyStreamBase* from,
565 const void* data,
566 size_t data_len,
567 size_t* written,
568 int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000569 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200570 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100571 RTC_LOG(LS_VERBOSE) << "Randomly dropping packet, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000572 *written = data_len;
573 return rtc::SR_SUCCESS;
574 }
575 if (dtls_ && (data_len > mtu_)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100576 RTC_LOG(LS_VERBOSE) << "Dropping packet > mtu, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000577 *written = data_len;
578 return rtc::SR_SUCCESS;
579 }
580
581 // Optionally damage application data (type 23). Note that we don't damage
582 // handshake packets and we damage the last byte to keep the header
583 // intact but break the MAC.
Yves Gerey665174f2018-06-19 15:03:05 +0200584 if (damage_ && (*static_cast<const unsigned char*>(data) == 23)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000585 std::vector<char> buf(data_len);
586
Mirko Bonadei675513b2017-11-09 11:09:25 +0100587 RTC_LOG(LS_VERBOSE) << "Damaging packet";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000588
589 memcpy(&buf[0], data, data_len);
590 buf[data_len - 1]++;
591
592 return from->WriteData(&buf[0], data_len, written, error);
593 }
594
595 return from->WriteData(data, data_len, written, error);
596 }
597
Yves Gerey665174f2018-06-19 15:03:05 +0200598 void SetDelay(int delay) { delay_ = delay; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000599 int GetDelay() { return delay_; }
600
Yves Gerey665174f2018-06-19 15:03:05 +0200601 void SetLoseFirstPacket(bool lose) { lose_first_packet_ = lose; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000602 bool GetLoseFirstPacket() { return lose_first_packet_; }
603
Yves Gerey665174f2018-06-19 15:03:05 +0200604 void SetLoss(int percent) { loss_ = percent; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000605
Yves Gerey665174f2018-06-19 15:03:05 +0200606 void SetDamage() { damage_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000607
Yves Gerey665174f2018-06-19 15:03:05 +0200608 void SetMtu(size_t mtu) { mtu_ = mtu; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000609
Yves Gerey665174f2018-06-19 15:03:05 +0200610 void SetHandshakeWait(int wait) { handshake_wait_ = wait; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000611
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800612 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000613 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800614 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000615 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800616 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000617 }
618
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800619 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000620 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800621 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000622 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800623 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000624 }
625
jbauch555604a2016-04-26 03:13:22 -0700626 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800627 std::unique_ptr<rtc::SSLCertChain> chain;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000628 if (client)
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800629 chain = client_ssl_->GetPeerSSLCertChain();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000630 else
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800631 chain = server_ssl_->GetPeerSSLCertChain();
Steve Antonf25303e2018-10-16 15:23:31 -0700632 return (chain && chain->GetSize()) ? chain->Get(0).Clone() : nullptr;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000633 }
634
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700635 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000636 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700637 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000638 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700639 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000640 }
641
torbjorng43166b82016-03-11 00:06:47 -0800642 int GetSslVersion(bool client) {
643 if (client)
644 return client_ssl_->GetSslVersion();
645 else
646 return server_ssl_->GetSslVersion();
647 }
648
Yves Gerey665174f2018-06-19 15:03:05 +0200649 bool ExportKeyingMaterial(const char* label,
650 const unsigned char* context,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000651 size_t context_len,
652 bool use_context,
653 bool client,
Yves Gerey665174f2018-06-19 15:03:05 +0200654 unsigned char* result,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000655 size_t result_len) {
656 if (client)
Yves Gerey665174f2018-06-19 15:03:05 +0200657 return client_ssl_->ExportKeyingMaterial(label, context, context_len,
658 use_context, result, result_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000659 else
Yves Gerey665174f2018-06-19 15:03:05 +0200660 return server_ssl_->ExportKeyingMaterial(label, context, context_len,
661 use_context, result, result_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000662 }
663
664 // To be implemented by subclasses.
665 virtual void WriteData() = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200666 virtual void ReadData(rtc::StreamInterface* stream) = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000667 virtual void TestTransfer(int size) = 0;
668
669 protected:
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100670 rtc::SSLIdentity* client_identity() const {
671 if (!client_ssl_) {
672 return nullptr;
673 }
674 return client_ssl_->GetIdentityForTesting();
675 }
676 rtc::SSLIdentity* server_identity() const {
677 if (!server_ssl_) {
678 return nullptr;
679 }
680 return server_ssl_->GetIdentityForTesting();
681 }
682
jbauche488a0d2015-11-19 05:17:58 -0800683 std::string client_cert_pem_;
684 std::string client_private_key_pem_;
685 rtc::KeyParams client_key_type_;
686 rtc::KeyParams server_key_type_;
Yves Gerey665174f2018-06-19 15:03:05 +0200687 SSLDummyStreamBase* client_stream_; // freed by client_ssl_ destructor
688 SSLDummyStreamBase* server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700689 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
690 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000691 int delay_;
692 size_t mtu_;
693 int loss_;
694 bool lose_first_packet_;
695 bool damage_;
696 bool dtls_;
697 int handshake_wait_;
698 bool identities_set_;
699};
700
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200701class SSLStreamAdapterTestTLS
702 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700703 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000704 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200705 SSLStreamAdapterTestTLS()
706 : SSLStreamAdapterTestBase("",
707 "",
708 false,
709 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800710 ::testing::get<1>(GetParam())),
711 client_buffer_(kFifoBufferSize),
Yves Gerey665174f2018-06-19 15:03:05 +0200712 server_buffer_(kFifoBufferSize) {}
jbauche488a0d2015-11-19 05:17:58 -0800713
torbjorng7593aad2015-11-19 12:20:51 -0800714 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800715 client_stream_ =
716 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
717 server_stream_ =
718 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
719 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000720
721 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700722 void TestTransfer(int size) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100723 RTC_LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000724 // Create some dummy data to send.
725 size_t received;
726
727 send_stream_.ReserveSize(size);
728 for (int i = 0; i < size; ++i) {
729 char ch = static_cast<char>(i);
deadbeef37f5ecf2017-02-27 14:06:41 -0800730 send_stream_.Write(&ch, 1, nullptr, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000731 }
732 send_stream_.Rewind();
733
734 // Prepare the receive stream.
735 recv_stream_.ReserveSize(size);
736
737 // Start sending
738 WriteData();
739
740 // Wait for the client to close
741 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
742
743 // Now check the data
744 recv_stream_.GetSize(&received);
745
746 EXPECT_EQ(static_cast<size_t>(size), received);
Yves Gerey665174f2018-06-19 15:03:05 +0200747 EXPECT_EQ(0,
748 memcmp(send_stream_.GetBuffer(), recv_stream_.GetBuffer(), size));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000749 }
750
nisseef8b61e2016-04-29 06:09:15 -0700751 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000752 size_t position, tosend, size;
753 rtc::StreamResult rv;
754 size_t sent;
755 char block[kBlockSize];
756
757 send_stream_.GetSize(&size);
758 if (!size)
759 return;
760
761 for (;;) {
762 send_stream_.GetPosition(&position);
deadbeef37f5ecf2017-02-27 14:06:41 -0800763 if (send_stream_.Read(block, sizeof(block), &tosend, nullptr) !=
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000764 rtc::SR_EOS) {
765 rv = client_ssl_->Write(block, tosend, &sent, 0);
766
767 if (rv == rtc::SR_SUCCESS) {
768 send_stream_.SetPosition(position + sent);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100769 RTC_LOG(LS_VERBOSE) << "Sent: " << position + sent;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000770 } else if (rv == rtc::SR_BLOCK) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100771 RTC_LOG(LS_VERBOSE) << "Blocked...";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000772 send_stream_.SetPosition(position);
773 break;
774 } else {
775 ADD_FAILURE();
776 break;
777 }
778 } else {
779 // Now close
Mirko Bonadei675513b2017-11-09 11:09:25 +0100780 RTC_LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000781 client_ssl_->Close();
782 break;
783 }
784 }
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100785 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000786
Yves Gerey665174f2018-06-19 15:03:05 +0200787 void ReadData(rtc::StreamInterface* stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000788 char buffer[1600];
789 size_t bread;
790 int err2;
791 rtc::StreamResult r;
792
793 for (;;) {
794 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
795
796 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
797 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800798 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000799 stream->Close();
800 return;
801 }
802
803 if (r == rtc::SR_BLOCK)
804 break;
805
806 ASSERT_EQ(rtc::SR_SUCCESS, r);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100807 RTC_LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000808
deadbeef37f5ecf2017-02-27 14:06:41 -0800809 recv_stream_.Write(buffer, bread, nullptr, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000810 }
811 }
812
813 private:
jbauche488a0d2015-11-19 05:17:58 -0800814 rtc::FifoBuffer client_buffer_;
815 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816 rtc::MemoryStream send_stream_;
817 rtc::MemoryStream recv_stream_;
818};
819
Harald Alvestrand13799132020-03-09 19:39:36 +0100820class SSLStreamAdapterTestDTLSBase : public SSLStreamAdapterTestBase {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000821 public:
Harald Alvestrand13799132020-03-09 19:39:36 +0100822 SSLStreamAdapterTestDTLSBase(rtc::KeyParams param1, rtc::KeyParams param2)
823 : SSLStreamAdapterTestBase("", "", true, param1, param2),
jbauche488a0d2015-11-19 05:17:58 -0800824 client_buffer_(kBufferCapacity, kDefaultBufferSize),
825 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200826 packet_size_(1000),
827 count_(0),
828 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000829
Harald Alvestrand13799132020-03-09 19:39:36 +0100830 SSLStreamAdapterTestDTLSBase(const std::string& cert_pem,
831 const std::string& private_key_pem)
Yves Gerey665174f2018-06-19 15:03:05 +0200832 : SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
833 client_buffer_(kBufferCapacity, kDefaultBufferSize),
834 server_buffer_(kBufferCapacity, kDefaultBufferSize),
835 packet_size_(1000),
836 count_(0),
837 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000838
torbjorng7593aad2015-11-19 12:20:51 -0800839 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800840 client_stream_ =
841 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
842 server_stream_ =
843 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
844 }
845
nisseef8b61e2016-04-29 06:09:15 -0700846 void WriteData() override {
Yves Gerey665174f2018-06-19 15:03:05 +0200847 unsigned char* packet = new unsigned char[1600];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000848
jbauche488a0d2015-11-19 05:17:58 -0800849 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800850 unsigned int rand_state = sent_;
851 packet[0] = sent_;
852 for (size_t i = 1; i < packet_size_; i++) {
853 // This is a simple LC PRNG. Keep in synch with identical code below.
854 rand_state = (rand_state * 251 + 19937) >> 7;
855 packet[i] = rand_state & 0xff;
856 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000857
858 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800859 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000860 if (rv == rtc::SR_SUCCESS) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100861 RTC_LOG(LS_VERBOSE) << "Sent: " << sent_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000862 sent_++;
863 } else if (rv == rtc::SR_BLOCK) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100864 RTC_LOG(LS_VERBOSE) << "Blocked...";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000865 break;
866 } else {
867 ADD_FAILURE();
868 break;
869 }
jbauche488a0d2015-11-19 05:17:58 -0800870 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000871
Yves Gerey665174f2018-06-19 15:03:05 +0200872 delete[] packet;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000873 }
874
Yves Gerey665174f2018-06-19 15:03:05 +0200875 void ReadData(rtc::StreamInterface* stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000876 unsigned char buffer[2000];
877 size_t bread;
878 int err2;
879 rtc::StreamResult r;
880
881 for (;;) {
882 r = stream->Read(buffer, 2000, &bread, &err2);
883
884 if (r == rtc::SR_ERROR) {
885 // Unfortunately, errors are the way that the stream adapter
886 // signals close right now
887 stream->Close();
888 return;
889 }
890
891 if (r == rtc::SR_BLOCK)
892 break;
893
894 ASSERT_EQ(rtc::SR_SUCCESS, r);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100895 RTC_LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000896
897 // Now parse the datagram
898 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800899 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000900
torbjorng7593aad2015-11-19 12:20:51 -0800901 unsigned int rand_state = packet_num;
902 for (size_t i = 1; i < packet_size_; i++) {
903 // This is a simple LC PRNG. Keep in synch with identical code above.
904 rand_state = (rand_state * 251 + 19937) >> 7;
905 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000906 }
907 received_.insert(packet_num);
908 }
909 }
910
nisseef8b61e2016-04-29 06:09:15 -0700911 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000912 count_ = count;
913
914 WriteData();
915
916 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100917 RTC_LOG(LS_INFO) << "sent_ == " << sent_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000918
919 if (damage_) {
920 WAIT(false, 2000);
921 EXPECT_EQ(0U, received_.size());
922 } else if (loss_ == 0) {
Yves Gerey665174f2018-06-19 15:03:05 +0200923 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000924 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100925 RTC_LOG(LS_INFO) << "Sent " << sent_ << " packets; received "
926 << received_.size();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000927 }
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100928 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000929
Harald Alvestrand13799132020-03-09 19:39:36 +0100930 protected:
jbauche488a0d2015-11-19 05:17:58 -0800931 BufferQueueStream client_buffer_;
932 BufferQueueStream server_buffer_;
Harald Alvestrand13799132020-03-09 19:39:36 +0100933
934 private:
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000935 size_t packet_size_;
936 int count_;
937 int sent_;
938 std::set<int> received_;
939};
940
Harald Alvestrand13799132020-03-09 19:39:36 +0100941class SSLStreamAdapterTestDTLS
942 : public SSLStreamAdapterTestDTLSBase,
943 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
944 public:
945 SSLStreamAdapterTestDTLS()
946 : SSLStreamAdapterTestDTLSBase(::testing::get<0>(GetParam()),
947 ::testing::get<1>(GetParam())) {}
948
949 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
950 const std::string& private_key_pem)
951 : SSLStreamAdapterTestDTLSBase(cert_pem, private_key_pem) {}
952};
953
Yves Gerey665174f2018-06-19 15:03:05 +0200954rtc::StreamResult SSLDummyStreamBase::Write(const void* data,
955 size_t data_len,
956 size_t* written,
957 int* error) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100958 RTC_LOG(LS_VERBOSE) << "Writing to loopback " << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000959
960 if (first_packet_) {
961 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800962 if (test_base_->GetLoseFirstPacket()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100963 RTC_LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800964 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000965 return rtc::SR_SUCCESS;
966 }
967 }
968
jbauche488a0d2015-11-19 05:17:58 -0800969 return test_base_->DataWritten(this, data, data_len, written, error);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100970}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000971
972class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
973 public:
Yves Gerey665174f2018-06-19 15:03:05 +0200974 SSLStreamAdapterTestDTLSFromPEMStrings()
975 : SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000976};
977
Jian Cui0a8798b2017-11-16 16:58:02 -0800978// Test fixture for certificate chaining. Server will push more than one
979// certificate.
980class SSLStreamAdapterTestDTLSCertChain : public SSLStreamAdapterTestDTLS {
981 public:
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100982 SSLStreamAdapterTestDTLSCertChain() : SSLStreamAdapterTestDTLS("", "") {}
Jian Cui0a8798b2017-11-16 16:58:02 -0800983 void SetUp() override {
984 CreateStreams();
985
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100986 client_ssl_ =
987 rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
988 server_ssl_ =
989 rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
Jian Cui0a8798b2017-11-16 16:58:02 -0800990
991 // Set up the slots
992 client_ssl_->SignalEvent.connect(
993 reinterpret_cast<SSLStreamAdapterTestBase*>(this),
994 &SSLStreamAdapterTestBase::OnEvent);
995 server_ssl_->SignalEvent.connect(
996 reinterpret_cast<SSLStreamAdapterTestBase*>(this),
997 &SSLStreamAdapterTestBase::OnEvent);
998
Harald Alvestrand8515d5a2020-03-20 22:51:32 +0100999 std::unique_ptr<rtc::SSLIdentity> client_identity;
Jian Cui0a8798b2017-11-16 16:58:02 -08001000 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001001 client_identity = rtc::SSLIdentity::CreateFromPEMStrings(
Jian Cui0a8798b2017-11-16 16:58:02 -08001002 client_private_key_pem_, client_cert_pem_);
1003 } else {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001004 client_identity = rtc::SSLIdentity::Create("client", client_key_type_);
Jian Cui0a8798b2017-11-16 16:58:02 -08001005 }
1006
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001007 client_ssl_->SetIdentity(std::move(client_identity));
Jian Cui0a8798b2017-11-16 16:58:02 -08001008 }
1009};
1010
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001011// Basic tests: TLS
1012
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001013// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001014TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001015 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001016}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001017
Jian Cui0a8798b2017-11-16 16:58:02 -08001018TEST_P(SSLStreamAdapterTestTLS, GetPeerCertChainWithOneCertificate) {
1019 TestHandshake();
1020 std::unique_ptr<rtc::SSLCertChain> cert_chain =
1021 client_ssl_->GetPeerSSLCertChain();
Jian Cui0a8798b2017-11-16 16:58:02 -08001022 ASSERT_NE(nullptr, cert_chain);
1023 EXPECT_EQ(1u, cert_chain->GetSize());
Taylor Brandstetterc3928662018-02-23 13:04:51 -08001024 EXPECT_EQ(cert_chain->Get(0).ToPEMString(),
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001025 server_identity()->certificate().ToPEMString());
Jian Cui0a8798b2017-11-16 16:58:02 -08001026}
1027
1028TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshake) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001029 auto server_identity = rtc::SSLIdentity::CreateFromPEMChainStrings(
Jian Cui0a8798b2017-11-16 16:58:02 -08001030 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kCACert);
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001031 server_ssl_->SetIdentity(std::move(server_identity));
Jian Cui0a8798b2017-11-16 16:58:02 -08001032 TestHandshake();
1033 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1034 client_ssl_->GetPeerSSLCertChain();
1035 ASSERT_NE(nullptr, peer_cert_chain);
1036 ASSERT_EQ(2u, peer_cert_chain->GetSize());
1037 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1038 EXPECT_EQ(kCACert, peer_cert_chain->Get(1).ToPEMString());
1039}
1040
David Benjaminea84b6b2017-12-01 17:25:45 -05001041TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshakeWithCopy) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001042 server_ssl_->SetIdentity(rtc::SSLIdentity::CreateFromPEMChainStrings(
1043 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kCACert));
David Benjaminea84b6b2017-12-01 17:25:45 -05001044 TestHandshake();
1045 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1046 client_ssl_->GetPeerSSLCertChain();
1047 ASSERT_NE(nullptr, peer_cert_chain);
1048 ASSERT_EQ(2u, peer_cert_chain->GetSize());
1049 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1050 EXPECT_EQ(kCACert, peer_cert_chain->Get(1).ToPEMString());
1051}
1052
Jian Cui0a8798b2017-11-16 16:58:02 -08001053TEST_F(SSLStreamAdapterTestDTLSCertChain, ThreeCertHandshake) {
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001054 server_ssl_->SetIdentity(rtc::SSLIdentity::CreateFromPEMChainStrings(
1055 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kIntCert1 + kCACert));
Jian Cui0a8798b2017-11-16 16:58:02 -08001056 TestHandshake();
1057 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1058 client_ssl_->GetPeerSSLCertChain();
1059 ASSERT_NE(nullptr, peer_cert_chain);
1060 ASSERT_EQ(3u, peer_cert_chain->GetSize());
1061 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1062 EXPECT_EQ(kIntCert1, peer_cert_chain->Get(1).ToPEMString());
1063 EXPECT_EQ(kCACert, peer_cert_chain->Get(2).ToPEMString());
1064}
1065
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001066// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001067TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001068 TestHandshake();
1069 client_ssl_->Close();
1070 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001071}
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001072
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001073// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001074TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001075 TestHandshake();
1076 TestTransfer(100000);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001077}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001078
1079// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001080TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001081 TestHandshake();
1082 TestTransfer(100000);
1083 client_ssl_->Close();
1084
1085 rtc::StreamResult rv;
1086 char block[kBlockSize];
1087 size_t dummy;
1088
1089 // It's an error to write after closed.
deadbeef37f5ecf2017-02-27 14:06:41 -08001090 rv = client_ssl_->Write(block, sizeof(block), &dummy, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001091 ASSERT_EQ(rtc::SR_ERROR, rv);
1092
1093 // But after closed read gives you EOS.
deadbeef37f5ecf2017-02-27 14:06:41 -08001094 rv = client_ssl_->Read(block, sizeof(block), &dummy, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001095 ASSERT_EQ(rtc::SR_EOS, rv);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001096}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001097
1098// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001099TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
deadbeef89824f62016-09-30 11:55:43 -07001100 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001101 TestHandshake(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001102}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001103
deadbeef89824f62016-09-30 11:55:43 -07001104TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
1105 TestHandshakeWithDelayedIdentity(true);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001106}
deadbeef89824f62016-09-30 11:55:43 -07001107
1108TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
1109 TestHandshakeWithDelayedIdentity(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001110}
deadbeef89824f62016-09-30 11:55:43 -07001111
1112// Test that the correct error is returned when SetPeerCertificateDigest is
1113// called with an unknown algorithm.
1114TEST_P(SSLStreamAdapterTestTLS,
1115 TestSetPeerCertificateDigestWithUnknownAlgorithm) {
1116 unsigned char server_digest[20];
1117 size_t server_digest_len;
1118 bool rv;
1119 rtc::SSLPeerCertificateDigestError err;
1120
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001121 rv = server_identity()->certificate().ComputeDigest(
deadbeef89824f62016-09-30 11:55:43 -07001122 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
1123 ASSERT_TRUE(rv);
1124
1125 rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
1126 server_digest_len, &err);
1127 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
1128 EXPECT_FALSE(rv);
1129}
1130
1131// Test that the correct error is returned when SetPeerCertificateDigest is
1132// called with an invalid digest length.
1133TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
1134 unsigned char server_digest[20];
1135 size_t server_digest_len;
1136 bool rv;
1137 rtc::SSLPeerCertificateDigestError err;
1138
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001139 rv = server_identity()->certificate().ComputeDigest(
deadbeef89824f62016-09-30 11:55:43 -07001140 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
1141 ASSERT_TRUE(rv);
1142
1143 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
1144 server_digest_len - 1, &err);
1145 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
1146 EXPECT_FALSE(rv);
1147}
1148
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001149// Test moving a bunch of data
1150
1151// Basic tests: DTLS
1152// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001153TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001154 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001155}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001156
1157// Test that we can make a handshake work if the first packet in
1158// each direction is lost. This gives us predictable loss
1159// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001160TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001161 SetLoseFirstPacket(true);
1162 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001163}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001164
1165// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001166TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001167 SetLoseFirstPacket(true);
1168 SetDelay(2000);
1169 SetHandshakeWait(20000);
1170 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001171}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001172
1173// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +00001174// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001175TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001176 SetMtu(700);
1177 SetHandshakeWait(20000);
1178 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001179}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001180
1181// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -08001182TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001183 TestHandshake();
1184 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001185}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001186
jbauche488a0d2015-11-19 05:17:58 -08001187TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001188 TestHandshake();
1189 SetLoss(10);
1190 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001191}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001192
jbauche488a0d2015-11-19 05:17:58 -08001193TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001194 SetDamage(); // Must be called first because first packet
1195 // write happens at end of handshake.
1196 TestHandshake();
1197 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001198}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001199
deadbeef89824f62016-09-30 11:55:43 -07001200TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
1201 TestHandshakeWithDelayedIdentity(true);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001202}
deadbeef89824f62016-09-30 11:55:43 -07001203
1204TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
1205 TestHandshakeWithDelayedIdentity(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001206}
deadbeef89824f62016-09-30 11:55:43 -07001207
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001208// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001209TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001210 std::vector<int> high;
1211 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1212 SetDtlsSrtpCryptoSuites(high, true);
1213 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001214 TestHandshake();
1215
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001216 int client_cipher;
1217 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1218 int server_cipher;
1219 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001220
1221 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001222 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001223}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001224
1225// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001226TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001227 std::vector<int> low;
1228 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1229 SetDtlsSrtpCryptoSuites(low, true);
1230 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001231 TestHandshake();
1232
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001233 int client_cipher;
1234 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1235 int server_cipher;
1236 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001237
1238 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001239 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001240}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001241
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001242// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001243TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001244 std::vector<int> high;
1245 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1246 std::vector<int> low;
1247 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1248 SetDtlsSrtpCryptoSuites(high, true);
1249 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001250 TestHandshake();
1251
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001252 int client_cipher;
1253 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1254 int server_cipher;
1255 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001256}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001257
1258// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001259TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001260 std::vector<int> mixed;
1261 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1262 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1263 SetDtlsSrtpCryptoSuites(mixed, true);
1264 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001265 TestHandshake();
1266
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001267 int client_cipher;
1268 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1269 int server_cipher;
1270 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001271
1272 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001273 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001274}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001275
jbauchcb560652016-08-04 05:20:32 -07001276// Test DTLS-SRTP with all GCM-128 ciphers.
1277TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
jbauchcb560652016-08-04 05:20:32 -07001278 std::vector<int> gcm128;
1279 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1280 SetDtlsSrtpCryptoSuites(gcm128, true);
1281 SetDtlsSrtpCryptoSuites(gcm128, false);
1282 TestHandshake();
1283
1284 int client_cipher;
1285 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1286 int server_cipher;
1287 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1288
1289 ASSERT_EQ(client_cipher, server_cipher);
1290 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001291}
jbauchcb560652016-08-04 05:20:32 -07001292
1293// Test DTLS-SRTP with all GCM-256 ciphers.
1294TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
jbauchcb560652016-08-04 05:20:32 -07001295 std::vector<int> gcm256;
1296 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1297 SetDtlsSrtpCryptoSuites(gcm256, true);
1298 SetDtlsSrtpCryptoSuites(gcm256, false);
1299 TestHandshake();
1300
1301 int client_cipher;
1302 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1303 int server_cipher;
1304 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1305
1306 ASSERT_EQ(client_cipher, server_cipher);
1307 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001308}
jbauchcb560652016-08-04 05:20:32 -07001309
1310// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1311TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
jbauchcb560652016-08-04 05:20:32 -07001312 std::vector<int> gcm128;
1313 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1314 std::vector<int> gcm256;
1315 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1316 SetDtlsSrtpCryptoSuites(gcm128, true);
1317 SetDtlsSrtpCryptoSuites(gcm256, false);
1318 TestHandshake();
1319
1320 int client_cipher;
1321 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1322 int server_cipher;
1323 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001324}
jbauchcb560652016-08-04 05:20:32 -07001325
1326// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1327TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
jbauchcb560652016-08-04 05:20:32 -07001328 std::vector<int> gcmBoth;
1329 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1330 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1331 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1332 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1333 TestHandshake();
1334
1335 int client_cipher;
1336 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1337 int server_cipher;
1338 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1339
1340 ASSERT_EQ(client_cipher, server_cipher);
1341 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001342}
jbauchcb560652016-08-04 05:20:32 -07001343
1344// Test SRTP cipher suite lengths.
1345TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1346 int key_len;
1347 int salt_len;
1348
Yves Gerey665174f2018-06-19 15:03:05 +02001349 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_INVALID_CRYPTO_SUITE,
1350 &key_len, &salt_len));
jbauchcb560652016-08-04 05:20:32 -07001351
Yves Gerey665174f2018-06-19 15:03:05 +02001352 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AES128_CM_SHA1_32,
1353 &key_len, &salt_len));
1354 ASSERT_EQ(128 / 8, key_len);
1355 ASSERT_EQ(112 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001356
Yves Gerey665174f2018-06-19 15:03:05 +02001357 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AES128_CM_SHA1_80,
1358 &key_len, &salt_len));
1359 ASSERT_EQ(128 / 8, key_len);
1360 ASSERT_EQ(112 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001361
Yves Gerey665174f2018-06-19 15:03:05 +02001362 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AEAD_AES_128_GCM,
1363 &key_len, &salt_len));
1364 ASSERT_EQ(128 / 8, key_len);
1365 ASSERT_EQ(96 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001366
Yves Gerey665174f2018-06-19 15:03:05 +02001367 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AEAD_AES_256_GCM,
1368 &key_len, &salt_len));
1369 ASSERT_EQ(256 / 8, key_len);
1370 ASSERT_EQ(96 / 8, salt_len);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001371}
jbauchcb560652016-08-04 05:20:32 -07001372
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001373// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001374TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001375 TestHandshake();
1376 unsigned char client_out[20];
1377 unsigned char server_out[20];
1378
1379 bool result;
Yves Gerey665174f2018-06-19 15:03:05 +02001380 result = ExportKeyingMaterial(kExporterLabel, kExporterContext,
1381 kExporterContextLen, true, true, client_out,
1382 sizeof(client_out));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001383 ASSERT_TRUE(result);
1384
Yves Gerey665174f2018-06-19 15:03:05 +02001385 result = ExportKeyingMaterial(kExporterLabel, kExporterContext,
1386 kExporterContextLen, true, false, server_out,
1387 sizeof(server_out));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001388 ASSERT_TRUE(result);
1389
1390 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1391}
1392
1393// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001394TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001395 long one_day = 60 * 60 * 24;
1396 // Make the certificates not valid until one day later.
1397 ResetIdentitiesWithValidity(one_day, one_day);
1398 TestHandshake();
1399}
1400
1401// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001402TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001403 long one_day = 60 * 60 * 24;
1404 // Make the certificates already expired.
1405 ResetIdentitiesWithValidity(-one_day, -one_day);
1406 TestHandshake();
1407}
1408
1409// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001410TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001411 TestHandshake();
1412 TestTransfer(100);
1413}
1414
1415// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001416TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001417 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001418 ASSERT_FALSE(GetPeerCertificate(true));
1419 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001420
1421 TestHandshake();
1422
1423 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001424 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001425 GetPeerCertificate(true);
1426 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001427
1428 // It's not kCERT_PEM.
1429 std::string client_peer_string = client_peer_cert->ToPEMString();
1430 ASSERT_NE(kCERT_PEM, client_peer_string);
1431
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001432 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001433 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001434 GetPeerCertificate(false);
1435 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001436
1437 // It's kCERT_PEM
1438 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001439}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001440
Joachim Bauch831c5582015-05-20 12:48:41 +02001441// Test getting the used DTLS 1.2 ciphers.
1442// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001443TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001444 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1445 TestHandshake();
1446
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001447 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001448 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001449 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001450 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001451
torbjorng43166b82016-03-11 00:06:47 -08001452 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1453 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1454
Joachim Bauch831c5582015-05-20 12:48:41 +02001455 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001456 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1457 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001458}
1459
Harald Alvestrand13799132020-03-09 19:39:36 +01001460// Test getting the used DTLS ciphers.
1461// DTLS 1.0 is max version for client and server, this will only work if
1462// legacy is enabled.
1463TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
1464 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
Benjamin Wrightaf1f8652019-04-01 18:25:23 +00001465 TestHandshake();
1466
1467 int client_cipher;
1468 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1469 int server_cipher;
1470 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1471
1472 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1473 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
torbjorng43166b82016-03-11 00:06:47 -08001474
Joachim Bauch831c5582015-05-20 12:48:41 +02001475 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001476 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1477 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001478}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001479
torbjorng4e572472015-10-08 09:42:49 -07001480// The RSA keysizes here might look strange, why not include the RFC's size
1481// 2048?. The reason is test case slowness; testing two sizes to exercise
1482// parametrization is sufficient.
Mirko Bonadeic84f6612019-01-31 12:20:57 +01001483INSTANTIATE_TEST_SUITE_P(
torbjorng4e572472015-10-08 09:42:49 -07001484 SSLStreamAdapterTestsTLS,
1485 SSLStreamAdapterTestTLS,
1486 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1487 rtc::KeyParams::RSA(1152, 65537),
1488 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1489 Values(rtc::KeyParams::RSA(1024, 65537),
1490 rtc::KeyParams::RSA(1152, 65537),
1491 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
Mirko Bonadeic84f6612019-01-31 12:20:57 +01001492INSTANTIATE_TEST_SUITE_P(
torbjorng4e572472015-10-08 09:42:49 -07001493 SSLStreamAdapterTestsDTLS,
1494 SSLStreamAdapterTestDTLS,
1495 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1496 rtc::KeyParams::RSA(1152, 65537),
1497 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1498 Values(rtc::KeyParams::RSA(1024, 65537),
1499 rtc::KeyParams::RSA(1152, 65537),
1500 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
Harald Alvestrand13799132020-03-09 19:39:36 +01001501
1502// Tests for enabling / disabling legacy TLS protocols in DTLS.
1503class SSLStreamAdapterTestDTLSLegacyProtocols
1504 : public SSLStreamAdapterTestDTLSBase {
1505 public:
1506 SSLStreamAdapterTestDTLSLegacyProtocols()
1507 : SSLStreamAdapterTestDTLSBase(rtc::KeyParams::ECDSA(rtc::EC_NIST_P256),
1508 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)) {
1509 }
1510
1511 // Do not use the SetUp version from the parent class.
1512 void SetUp() override {}
1513
1514 // The legacy TLS protocols flag is read when the OpenSSLStreamAdapter is
1515 // initialized, so we set the experiment while creationg client_ssl_
1516 // and server_ssl_.
1517
1518 void ConfigureClient(std::string experiment) {
1519 webrtc::test::ScopedFieldTrials trial(experiment);
1520 client_stream_ =
1521 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001522 client_ssl_ =
1523 rtc::SSLStreamAdapter::Create(absl::WrapUnique(client_stream_));
Harald Alvestrand13799132020-03-09 19:39:36 +01001524 client_ssl_->SignalEvent.connect(
1525 static_cast<SSLStreamAdapterTestBase*>(this),
1526 &SSLStreamAdapterTestBase::OnEvent);
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001527 auto client_identity = rtc::SSLIdentity::Create("client", client_key_type_);
1528 client_ssl_->SetIdentity(std::move(client_identity));
Harald Alvestrand13799132020-03-09 19:39:36 +01001529 }
1530
1531 void ConfigureServer(std::string experiment) {
1532 // webrtc::test::ScopedFieldTrials trial(experiment);
1533 server_stream_ =
1534 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001535 server_ssl_ =
1536 rtc::SSLStreamAdapter::Create(absl::WrapUnique(server_stream_));
Harald Alvestrand13799132020-03-09 19:39:36 +01001537 server_ssl_->SignalEvent.connect(
1538 static_cast<SSLStreamAdapterTestBase*>(this),
1539 &SSLStreamAdapterTestBase::OnEvent);
Harald Alvestrand8515d5a2020-03-20 22:51:32 +01001540 server_ssl_->SetIdentity(
1541 rtc::SSLIdentity::Create("server", server_key_type_));
Harald Alvestrand13799132020-03-09 19:39:36 +01001542 }
1543};
1544
1545// Test getting the used DTLS ciphers.
1546// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
1547TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols, TestGetSslCipherSuite) {
1548 ConfigureClient("");
1549 ConfigureServer("");
1550 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
1551 TestHandshake();
1552
1553 int client_cipher;
1554 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1555 int server_cipher;
1556 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1557
1558 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1559 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1560
1561 ASSERT_EQ(client_cipher, server_cipher);
1562}
1563
1564// Test getting the used DTLS 1.2 ciphers.
1565// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
1566TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1567 TestGetSslCipherSuiteDtls12Both) {
1568 ConfigureClient("");
1569 ConfigureServer("");
1570 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1571 TestHandshake();
1572
1573 int client_cipher;
1574 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1575 int server_cipher;
1576 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1577
1578 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1579 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1580
1581 ASSERT_EQ(client_cipher, server_cipher);
1582}
1583
1584// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
1585TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1586 TestGetSslCipherSuiteDtls12Client) {
1587 ConfigureClient("");
1588 ConfigureServer("");
1589 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1590 TestHandshake();
1591
1592 int client_cipher;
1593 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1594 int server_cipher;
1595 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1596
1597 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1598 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1599
1600 ASSERT_EQ(client_cipher, server_cipher);
1601}
1602
1603// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
1604TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1605 TestGetSslCipherSuiteDtls12Server) {
1606 ConfigureClient("");
1607 ConfigureServer("");
1608 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1609 TestHandshake();
1610
1611 int client_cipher;
1612 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1613 int server_cipher;
1614 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1615
1616 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1617 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1618
1619 ASSERT_EQ(client_cipher, server_cipher);
1620}
1621
1622// Client has legacy TLS versions disabled, server has DTLS 1.0 only.
1623// This is meant to cause a failure.
1624TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1625 TestGetSslVersionLegacyDisabledServer10) {
1626 ConfigureClient("WebRTC-LegacyTlsProtocols/Disabled/");
1627 ConfigureServer("");
1628 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1629 // Handshake should fail.
1630 TestHandshake(false);
1631}
1632
1633// Both client and server have legacy TLS versions disabled and support
1634// DTLS 1.2. This should work.
1635TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1636 TestGetSslVersionLegacyDisabledServer12) {
1637 ConfigureClient("WebRTC-LegacyTlsProtocols/Disabled/");
1638 ConfigureServer("WebRTC-LegacyTlsProtocols/Disabled/");
1639 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1640 TestHandshake();
1641}
1642
1643// Both client and server have legacy TLS versions enabled and support DTLS 1.0.
1644// This should work.
1645TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1646 TestGetSslVersionLegacyEnabledClient10Server10) {
1647 ConfigureClient("WebRTC-LegacyTlsProtocols/Enabled/");
1648 ConfigureServer("WebRTC-LegacyTlsProtocols/Enabled/");
1649 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
1650 TestHandshake();
1651}
1652
1653// Legacy protocols are disabled, max TLS version is 1.0
1654// This should be a configuration error, and handshake should fail.
1655TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1656 TestGetSslVersionLegacyDisabledClient10Server10) {
1657 ConfigureClient("WebRTC-LegacyTlsProtocols/Disabled/");
1658 ConfigureServer("WebRTC-LegacyTlsProtocols/Disabled/");
1659 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
1660 TestHandshake(false);
1661}
Guido Urdaneta14bba6e2020-09-25 16:00:51 +02001662
1663// Both client and server have legacy TLS versions enabled and support DTLS 1.0.
1664// This should work.
1665TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1666 TestGetSslVersionLegacyOverrideEnabledClient10Server10) {
1667 rtc::SetAllowLegacyTLSProtocols(true);
1668 ConfigureClient("");
1669 ConfigureServer("");
1670 // Remove override.
1671 rtc::SetAllowLegacyTLSProtocols(absl::nullopt);
1672 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
1673 TestHandshake();
1674}
1675
1676// Client has legacy TLS disabled and server has legacy TLS enabled via
1677// override. Handshake for DTLS 1.0 should fail.
1678TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1679 TestGetSslVersionLegacyOverrideDisabledClient10EnabledServer10) {
1680 rtc::SetAllowLegacyTLSProtocols(false);
1681 ConfigureClient("");
1682 rtc::SetAllowLegacyTLSProtocols(true);
1683 ConfigureServer("");
1684 // Remove override.
1685 rtc::SetAllowLegacyTLSProtocols(absl::nullopt);
1686 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
1687 TestHandshake(false);
1688}
1689
1690// Client has legacy TLS enabled and server has legacy TLS disabled via
1691// override. Handshake for DTLS 1.0 should fail.
1692TEST_F(SSLStreamAdapterTestDTLSLegacyProtocols,
1693 TestGetSslVersionLegacyOverrideEnabledClient10DisabledServer10) {
1694 rtc::SetAllowLegacyTLSProtocols(true);
1695 ConfigureClient("");
1696 rtc::SetAllowLegacyTLSProtocols(false);
1697 ConfigureServer("");
1698 // Remove override.
1699 rtc::SetAllowLegacyTLSProtocols(absl::nullopt);
1700 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
1701 TestHandshake(false);
1702}