blob: abf98804629b57a6422daed936c473178025cc5e [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
Steve Anton10542f22019-01-11 09:11:00 -080016#include "rtc_base/buffer_queue.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "rtc_base/checks.h"
18#include "rtc_base/gunit.h"
19#include "rtc_base/helpers.h"
Niels Möllere7547d52018-11-01 09:33:08 +010020#include "rtc_base/memory_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "rtc_base/message_digest.h"
22#include "rtc_base/ssl_adapter.h"
23#include "rtc_base/ssl_identity.h"
24#include "rtc_base/ssl_stream_adapter.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "rtc_base/stream.h"
Benjamin Wright7276b972019-03-06 11:51:34 -080026#include "test/field_trial.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000027
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020028using ::testing::Combine;
29using ::testing::tuple;
Benjamin Wright7276b972019-03-06 11:51:34 -080030using ::testing::Values;
31using ::testing::WithParamInterface;
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020032
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033static const int kBlockSize = 4096;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000034static const char kExporterLabel[] = "label";
35static const unsigned char kExporterContext[] = "context";
36static int kExporterContextLen = sizeof(kExporterContext);
37
38static const char kRSA_PRIVATE_KEY_PEM[] =
39 "-----BEGIN RSA PRIVATE KEY-----\n"
40 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
41 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
42 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
43 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
44 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
45 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
46 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
47 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
48 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
49 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
50 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
51 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
52 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
53 "UCXiYxSsu20QNVw=\n"
54 "-----END RSA PRIVATE KEY-----\n";
55
56static const char kCERT_PEM[] =
57 "-----BEGIN CERTIFICATE-----\n"
58 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
59 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
60 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
61 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
62 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
63 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
64 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
65 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
66 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
67 "-----END CERTIFICATE-----\n";
68
Jian Cui0a8798b2017-11-16 16:58:02 -080069static const char kIntCert1[] =
70 "-----BEGIN CERTIFICATE-----\n"
71 "MIIEUjCCAjqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBljELMAkGA1UEBhMCVVMx\n"
72 "EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS\n"
73 "BgNVBAoMC0dvb2dsZSwgSW5jMQwwCgYDVQQLDANHVFAxFzAVBgNVBAMMDnRlbGVw\n"
74 "aG9ueS5nb29nMR0wGwYJKoZIhvcNAQkBFg5ndHBAZ29vZ2xlLmNvbTAeFw0xNzA5\n"
75 "MjYwNDA5MDNaFw0yMDA2MjIwNDA5MDNaMGQxCzAJBgNVBAYTAlVTMQswCQYDVQQI\n"
76 "DAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEXMBUGA1UECgwOdGVsZXBob255\n"
77 "Lmdvb2cxFzAVBgNVBAMMDnRlbGVwaG9ueS5nb29nMIGfMA0GCSqGSIb3DQEBAQUA\n"
78 "A4GNADCBiQKBgQDJXWeeU1v1+wlqkVobzI3aN7Uh2iVQA9YCdq5suuabtiD/qoOD\n"
79 "NKpmQqsx7WZGGWSZTDFEBaUpvIK7Hb+nzRqk6iioPCFOFuarm6GxO1xVneImMuE6\n"
80 "tuWb3YZPr+ikChJbl11y5UcSbg0QsbeUc+jHl5umNvrL85Y+z8SP0rxbBwIDAQAB\n"
81 "o2AwXjAdBgNVHQ4EFgQU7tdZobqlN8R8V72FQnRxmqq8tKswHwYDVR0jBBgwFoAU\n"
82 "5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC\n"
83 "AQYwDQYJKoZIhvcNAQELBQADggIBADObh9Z+z14FmP9zSenhFtq7hFnmNrSkklk8\n"
84 "eyYWXKfOuIriEQQBZsz76ZcnzStih8Rj+yQ0AXydk4fJ5LOwC2cUqQBar17g6Pd2\n"
85 "8g4SIL4azR9WvtiSvpuGlwp25b+yunaacDne6ebnf/MUiiKT5w61Xo3cEPVfl38e\n"
86 "/Up2l0bioid5enUTmg6LY6RxDO6tnZQkz3XD+nNSwT4ehtkqFpHYWjErj0BbkDM2\n"
87 "hiVc/JsYOZn3DmuOlHVHU6sKwqh3JEyvHO/d7DGzMGWHpHwv2mCTJq6l/sR95Tc2\n"
88 "GaQZgGDVNs9pdEouJCDm9e/PbQWRYhnat82PTkXx/6mDAAwdZlIi/pACzq8K4p7e\n"
89 "6hF0t8uKGnXJubHPXxlnJU6yxZ0yWmivAGjwWK4ur832gKlho4jeMDhiI/T3QPpl\n"
90 "iMNsIvxRhdD+GxJkQP1ezayw8s+Uc9KwKglrkBSRRDLCJUfPOvMmXLUDSTMX7kp4\n"
91 "/Ak1CA8dVLJIlfEjLBUuvAttlP7+7lsKNgxAjCxZkWLXIyGULzNPQwVWkGfCbrQs\n"
92 "XyMvSbFsSIb7blV7eLlmf9a+2RprUUkc2ALXLLCI9YQXmxm2beBfMyNmmebwBJzT\n"
93 "B0OR+5pFFNTJPoNlqpdrDsGrDu7JlUtk0ZLZzYyKXbgy2qXxfd4OWzXXjxpLMszZ\n"
94 "LDIpOAkj\n"
95 "-----END CERTIFICATE-----\n";
96
97static const char kCACert[] =
98 "-----BEGIN CERTIFICATE-----\n"
99 "MIIGETCCA/mgAwIBAgIJAKN9r/BdbGUJMA0GCSqGSIb3DQEBCwUAMIGWMQswCQYD\n"
100 "VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g\n"
101 "VmlldzEUMBIGA1UECgwLR29vZ2xlLCBJbmMxDDAKBgNVBAsMA0dUUDEXMBUGA1UE\n"
102 "AwwOdGVsZXBob255Lmdvb2cxHTAbBgkqhkiG9w0BCQEWDmd0cEBnb29nbGUuY29t\n"
103 "MB4XDTE3MDcyNzIzMDE0NVoXDTE3MDgyNjIzMDE0NVowgZYxCzAJBgNVBAYTAlVT\n"
104 "MRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQw\n"
105 "EgYDVQQKDAtHb29nbGUsIEluYzEMMAoGA1UECwwDR1RQMRcwFQYDVQQDDA50ZWxl\n"
106 "cGhvbnkuZ29vZzEdMBsGCSqGSIb3DQEJARYOZ3RwQGdvb2dsZS5jb20wggIiMA0G\n"
107 "CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCfvpF7aBV5Hp1EHsWoIlL3GeHwh8dS\n"
108 "lv9VQCegN9rD06Ny7MgcED5AiK2vqXmUmOVS+7NbATkdVYN/eozDhKtN3Q3n87kJ\n"
109 "Nt/TD/TcZZHOZIGsRPbrf2URK26E/5KzTzbzXVBOA1e+gSj+EBbltGqb01ZO5ErF\n"
110 "iPGViPM/HpYKdq6mfz2bS5PhU67XZMM2zvToyReQ/Fjm/6PJhwKSRXSgZF5djPhk\n"
111 "2LfOKMLS0AeZtd2C4DFsCU41lfLUkybioDgFuzTQ3TFi1K8A07KYTMmLY/yQppnf\n"
112 "SpNX58shlVhM+Ed37K1Z0rU0OfVCZ5P+KKaSSfMranjlU7zeUIhZYjqq/EYrEhbS\n"
113 "dLnNHwgJrqxzId3kq8uuLM6+VB7JZKnZLfT90GdAbX4+tutNe21smmogF9f80vEy\n"
114 "gM4tOp9rXrvz9vCwWHXVY9kdKemdLAsREoO6MS9k2ctK4jj80o2dROuFC6Q3e7mz\n"
115 "RjvZr5Tvi464c2o9o/jNlJ0O6q7V2eQzohD+7VnV5QPpRGXxlIeqpR2zoAg+WtRS\n"
116 "4OgHOVYiD3M6uAlggJA5pcDjMfkEZ+pkhtVcT4qMCEoruk6GbyPxS565oSHu16bH\n"
117 "EjeCqbZOVND5T3oA7nz6aQSs8sJabt0jmxUkGVnE+4ZDIuuRtkRma+0P/96Mtqor\n"
118 "OlpNWY1OBDY64QIDAQABo2AwXjAdBgNVHQ4EFgQU5GgKMUtcxkQ2dJrtNR5YOlIA\n"
119 "PDswHwYDVR0jBBgwFoAU5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUw\n"
120 "AwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAARQly5/bB6VUL2C\n"
121 "ykDYgWt48go407pAra6tL2kjpdfxV5PdL7iMZRkeht00vj+BVahIqZKrNOa/f5Fx\n"
122 "vlpahZFu0PDN436aQwRZ9qWut2qDOK0/z9Hhj6NWybquRFwMwqkPG/ivLMDU8Dmj\n"
123 "CIplpngPYNwXCs0KzdjSXYxqxJbwMjQXELD+/RcurY0oTtJMM1/2vKQMzw24UJqe\n"
124 "XLJAlsnd2AnWzWNUEviDZY89j9NdkHerBmV2gGzcU+X5lgOO5M8odBv0ZC9D+a6Z\n"
125 "QPZAOfdGVw60hhGvTW5s/s0dHwCpegRidhs0MD0fTmwwjYFBSmUx3Gztr4JTzOOr\n"
126 "7e5daJuak2ujQ5DqcGBvt1gePjSudb5brS7JQtN8tI/FyrnR4q/OuOwv1EvlC5RG\n"
127 "hLX+TXaWqFxB1Hd8ebKRR40mboFG6KcUI3lLBthDvQE7jnq48QfZMjlMQK0ZF1l7\n"
128 "SrlwRXWA74bU8CLJvnZKKo9p4TsTiDYGSYC6tNHKj5s3TGWL46oqGyZ0KdGNhrtC\n"
129 "rIGenMhth1vPYjyy0XuGBndXT85yi+IM2l8g8oU845+plxIhgpSI8bbC0oLwnhQ5\n"
130 "ARfsiYLkXDE7imSS0CSUmye76372mlzAIB1is4bBB/SzpPQtBuB9LDKtONgpSGHn\n"
131 "dGaXBy+qbVXVyGXaeEbIRjtJ6m92\n"
132 "-----END CERTIFICATE-----\n";
133
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134class SSLStreamAdapterTestBase;
135
jbauche488a0d2015-11-19 05:17:58 -0800136class SSLDummyStreamBase : public rtc::StreamInterface,
137 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000138 public:
jbauche488a0d2015-11-19 05:17:58 -0800139 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
Yves Gerey665174f2018-06-19 15:03:05 +0200140 const std::string& side,
jbauche488a0d2015-11-19 05:17:58 -0800141 rtc::StreamInterface* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200142 rtc::StreamInterface* out)
143 : test_base_(test), side_(side), in_(in), out_(out), first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -0800144 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
145 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000146 }
147
jbauche488a0d2015-11-19 05:17:58 -0800148 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000149
Yves Gerey665174f2018-06-19 15:03:05 +0200150 rtc::StreamResult Read(void* buffer,
151 size_t buffer_len,
152 size_t* read,
153 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154 rtc::StreamResult r;
155
156 r = in_->Read(buffer, buffer_len, read, error);
157 if (r == rtc::SR_BLOCK)
158 return rtc::SR_BLOCK;
159 if (r == rtc::SR_EOS)
160 return rtc::SR_EOS;
161
162 if (r != rtc::SR_SUCCESS) {
163 ADD_FAILURE();
164 return rtc::SR_ERROR;
165 }
166
167 return rtc::SR_SUCCESS;
168 }
169
170 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800171 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000172 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
173
174 if (sig & mask) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100175 RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
176 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000177 PostEvent(sig & mask, 0);
178 }
179 }
180
181 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800182 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000183 if (sig & rtc::SE_WRITE) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100184 RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
185 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000186
187 PostEvent(sig & rtc::SE_WRITE, 0);
188 }
189 }
190
191 // Write to the outgoing FifoBuffer
Yves Gerey665174f2018-06-19 15:03:05 +0200192 rtc::StreamResult WriteData(const void* data,
193 size_t data_len,
194 size_t* written,
195 int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000196 return out_->Write(data, data_len, written, error);
197 }
198
Yves Gerey665174f2018-06-19 15:03:05 +0200199 rtc::StreamResult Write(const void* data,
200 size_t data_len,
201 size_t* written,
202 int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000203
jbauche488a0d2015-11-19 05:17:58 -0800204 void Close() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100205 RTC_LOG(LS_INFO) << "Closing outbound stream";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206 out_->Close();
207 }
208
jbauche488a0d2015-11-19 05:17:58 -0800209 protected:
210 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000211 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800212 rtc::StreamInterface* in_;
213 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214 bool first_packet_;
215};
216
jbauche488a0d2015-11-19 05:17:58 -0800217class SSLDummyStreamTLS : public SSLDummyStreamBase {
218 public:
219 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
220 const std::string& side,
221 rtc::FifoBuffer* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200222 rtc::FifoBuffer* out)
223 : SSLDummyStreamBase(test, side, in, out) {}
jbauche488a0d2015-11-19 05:17:58 -0800224};
225
Yves Gerey665174f2018-06-19 15:03:05 +0200226class BufferQueueStream : public rtc::BufferQueue, public rtc::StreamInterface {
jbauche488a0d2015-11-19 05:17:58 -0800227 public:
228 BufferQueueStream(size_t capacity, size_t default_size)
Yves Gerey665174f2018-06-19 15:03:05 +0200229 : rtc::BufferQueue(capacity, default_size) {}
jbauche488a0d2015-11-19 05:17:58 -0800230
231 // Implementation of abstract StreamInterface methods.
232
233 // A buffer queue stream is always "open".
234 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
235
236 // Reading a buffer queue stream will either succeed or block.
Yves Gerey665174f2018-06-19 15:03:05 +0200237 rtc::StreamResult Read(void* buffer,
238 size_t buffer_len,
239 size_t* read,
240 int* error) override {
jbauche488a0d2015-11-19 05:17:58 -0800241 if (!ReadFront(buffer, buffer_len, read)) {
242 return rtc::SR_BLOCK;
243 }
244 return rtc::SR_SUCCESS;
245 }
246
247 // Writing to a buffer queue stream will either succeed or block.
Yves Gerey665174f2018-06-19 15:03:05 +0200248 rtc::StreamResult Write(const void* data,
249 size_t data_len,
250 size_t* written,
251 int* error) override {
jbauche488a0d2015-11-19 05:17:58 -0800252 if (!WriteBack(data, data_len, written)) {
253 return rtc::SR_BLOCK;
254 }
255 return rtc::SR_SUCCESS;
256 }
257
258 // A buffer queue stream can not be closed.
259 void Close() override {}
260
261 protected:
Yves Gerey665174f2018-06-19 15:03:05 +0200262 void NotifyReadableForTest() override { PostEvent(rtc::SE_READ, 0); }
jbauche488a0d2015-11-19 05:17:58 -0800263
Yves Gerey665174f2018-06-19 15:03:05 +0200264 void NotifyWritableForTest() override { PostEvent(rtc::SE_WRITE, 0); }
jbauche488a0d2015-11-19 05:17:58 -0800265};
266
267class SSLDummyStreamDTLS : public SSLDummyStreamBase {
268 public:
269 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
270 const std::string& side,
271 BufferQueueStream* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200272 BufferQueueStream* out)
273 : SSLDummyStreamBase(test, side, in, out) {}
jbauche488a0d2015-11-19 05:17:58 -0800274};
275
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000276static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800277static const int kBufferCapacity = 1;
278static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000279
280class SSLStreamAdapterTestBase : public testing::Test,
281 public sigslot::has_slots<> {
282 public:
torbjorng4e572472015-10-08 09:42:49 -0700283 SSLStreamAdapterTestBase(
284 const std::string& client_cert_pem,
285 const std::string& client_private_key_pem,
286 bool dtls,
Benjamin Wright7276b972019-03-06 11:51:34 -0800287 bool legacy_tls_protocols = false,
torbjorng4e572472015-10-08 09:42:49 -0700288 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
289 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800290 : client_cert_pem_(client_cert_pem),
291 client_private_key_pem_(client_private_key_pem),
292 client_key_type_(client_key_type),
293 server_key_type_(server_key_type),
deadbeef37f5ecf2017-02-27 14:06:41 -0800294 client_stream_(nullptr),
295 server_stream_(nullptr),
296 client_identity_(nullptr),
297 server_identity_(nullptr),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200298 delay_(0),
299 mtu_(1460),
300 loss_(0),
301 lose_first_packet_(false),
302 damage_(false),
303 dtls_(dtls),
304 handshake_wait_(5000),
Benjamin Wright7276b972019-03-06 11:51:34 -0800305 identities_set_(false),
306 legacy_tls_protocols_(legacy_tls_protocols) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000307 // Set use of the test RNG to get predictable loss patterns.
308 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000309 }
310
Steve Anton9de3aac2017-10-24 10:08:26 -0700311 ~SSLStreamAdapterTestBase() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000312 // Put it back for the next test.
313 rtc::SetRandomTestMode(false);
314 }
315
torbjorng7593aad2015-11-19 12:20:51 -0800316 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800317 CreateStreams();
318
Benjamin Wright7276b972019-03-06 11:51:34 -0800319 // Enable legacy protocols if required
320 webrtc::test::ScopedFieldTrials trial(
321 legacy_tls_protocols_ ? "WebRTC-LegacyTlsProtocols/Enabled/" : "");
322
jbauche488a0d2015-11-19 05:17:58 -0800323 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
324 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
325
326 // Set up the slots
327 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
328 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
329
330 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
331 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
332 client_private_key_pem_, client_cert_pem_);
333 } else {
334 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
335 }
336 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
337
338 client_ssl_->SetIdentity(client_identity_);
339 server_ssl_->SetIdentity(server_identity_);
340 }
341
torbjorng7593aad2015-11-19 12:20:51 -0800342 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800343 client_ssl_.reset(nullptr);
344 server_ssl_.reset(nullptr);
345 }
346
347 virtual void CreateStreams() = 0;
348
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000349 // Recreate the client/server identities with the specified validity period.
350 // |not_before| and |not_after| are offsets from the current time in number
351 // of seconds.
352 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800353 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000354
355 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
356 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
357
358 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
359 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
360
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100361 time_t now = time(nullptr);
362
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000363 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700364 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000365 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100366 client_params.not_before = now + not_before;
367 client_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000368 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
369
370 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700371 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000372 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100373 server_params.not_before = now + not_before;
374 server_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000375 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
376
377 client_ssl_->SetIdentity(client_identity_);
378 server_ssl_->SetIdentity(server_identity_);
379 }
380
Yves Gerey665174f2018-06-19 15:03:05 +0200381 virtual void OnEvent(rtc::StreamInterface* stream, int sig, int err) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100382 RTC_LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000383
384 if (sig & rtc::SE_READ) {
385 ReadData(stream);
386 }
387
388 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
389 WriteData();
390 }
391 }
392
deadbeef89824f62016-09-30 11:55:43 -0700393 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
394 unsigned char server_digest[20];
395 size_t server_digest_len;
396 unsigned char client_digest[20];
397 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000398 bool rv;
deadbeef89824f62016-09-30 11:55:43 -0700399 rtc::SSLPeerCertificateDigestError err;
400 rtc::SSLPeerCertificateDigestError expected_err =
401 expect_success
402 ? rtc::SSLPeerCertificateDigestError::NONE
403 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000404
Mirko Bonadei675513b2017-11-09 11:09:25 +0100405 RTC_LOG(LS_INFO) << "Setting peer identities by digest";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000406
deadbeef89824f62016-09-30 11:55:43 -0700407 rv = server_identity_->certificate().ComputeDigest(
408 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000409 ASSERT_TRUE(rv);
deadbeef89824f62016-09-30 11:55:43 -0700410 rv = client_identity_->certificate().ComputeDigest(
411 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
412 ASSERT_TRUE(rv);
413
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000414 if (!correct) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100415 RTC_LOG(LS_INFO) << "Setting bogus digest for server cert";
deadbeef89824f62016-09-30 11:55:43 -0700416 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000417 }
deadbeef89824f62016-09-30 11:55:43 -0700418 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
419 server_digest_len, &err);
420 EXPECT_EQ(expected_err, err);
421 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000422
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000423 if (!correct) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100424 RTC_LOG(LS_INFO) << "Setting bogus digest for client cert";
deadbeef89824f62016-09-30 11:55:43 -0700425 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000426 }
deadbeef89824f62016-09-30 11:55:43 -0700427 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
428 client_digest_len, &err);
429 EXPECT_EQ(expected_err, err);
430 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000431
432 identities_set_ = true;
433 }
434
Joachim Bauch831c5582015-05-20 12:48:41 +0200435 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
436 rtc::SSLProtocolVersion client_version) {
437 server_ssl_->SetMaxProtocolVersion(server_version);
438 client_ssl_->SetMaxProtocolVersion(client_version);
439 }
440
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000441 void TestHandshake(bool expect_success = true) {
Yves Gerey665174f2018-06-19 15:03:05 +0200442 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
443 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000444
445 if (!dtls_) {
446 // Make sure we simulate a reliable network for TLS.
447 // This is just a check to make sure that people don't write wrong
448 // tests.
nissec16fa5e2017-02-07 07:18:43 -0800449 RTC_CHECK_EQ(1460, mtu_);
450 RTC_CHECK(!loss_);
451 RTC_CHECK(!lose_first_packet_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000452 }
453
454 if (!identities_set_)
deadbeef89824f62016-09-30 11:55:43 -0700455 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000456
457 // Start the handshake
458 int rv;
459
460 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700461 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000462 ASSERT_EQ(0, rv);
463
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700464 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000465 ASSERT_EQ(0, rv);
466
467 // Now run the handshake
468 if (expect_success) {
Yves Gerey665174f2018-06-19 15:03:05 +0200469 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) &&
470 (server_ssl_->GetState() == rtc::SS_OPEN),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000471 handshake_wait_);
472 } else {
473 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
474 handshake_wait_);
475 }
476 }
477
deadbeef89824f62016-09-30 11:55:43 -0700478 // This tests that the handshake can complete before the identity is
479 // verified, and the identity will be verified after the fact.
480 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
481 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
482 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
483
484 if (!dtls_) {
485 // Make sure we simulate a reliable network for TLS.
486 // This is just a check to make sure that people don't write wrong
487 // tests.
nissec16fa5e2017-02-07 07:18:43 -0800488 RTC_CHECK_EQ(1460, mtu_);
489 RTC_CHECK(!loss_);
490 RTC_CHECK(!lose_first_packet_);
deadbeef89824f62016-09-30 11:55:43 -0700491 }
492
493 // Start the handshake
494 int rv;
495
496 server_ssl_->SetServerRole();
497 rv = server_ssl_->StartSSL();
498 ASSERT_EQ(0, rv);
499
500 rv = client_ssl_->StartSSL();
501 ASSERT_EQ(0, rv);
502
503 // Now run the handshake.
504 EXPECT_TRUE_WAIT(
505 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
506 handshake_wait_);
507
508 // Until the identity has been verified, the state should still be
509 // SS_OPENING and writes should return SR_BLOCK.
510 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
511 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
512 unsigned char packet[1];
513 size_t sent;
514 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
515 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
516
517 // If we set an invalid identity at this point, SetPeerCertificateDigest
518 // should return false.
519 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
520 // State should then transition to SS_OPEN or SS_CLOSED based on validation
521 // of the identity.
522 if (valid_identity) {
523 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
524 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
525 } else {
526 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
527 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
528 }
529 }
530
Yves Gerey665174f2018-06-19 15:03:05 +0200531 rtc::StreamResult DataWritten(SSLDummyStreamBase* from,
532 const void* data,
533 size_t data_len,
534 size_t* written,
535 int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000536 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200537 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100538 RTC_LOG(LS_VERBOSE) << "Randomly dropping packet, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000539 *written = data_len;
540 return rtc::SR_SUCCESS;
541 }
542 if (dtls_ && (data_len > mtu_)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100543 RTC_LOG(LS_VERBOSE) << "Dropping packet > mtu, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000544 *written = data_len;
545 return rtc::SR_SUCCESS;
546 }
547
548 // Optionally damage application data (type 23). Note that we don't damage
549 // handshake packets and we damage the last byte to keep the header
550 // intact but break the MAC.
Yves Gerey665174f2018-06-19 15:03:05 +0200551 if (damage_ && (*static_cast<const unsigned char*>(data) == 23)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000552 std::vector<char> buf(data_len);
553
Mirko Bonadei675513b2017-11-09 11:09:25 +0100554 RTC_LOG(LS_VERBOSE) << "Damaging packet";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000555
556 memcpy(&buf[0], data, data_len);
557 buf[data_len - 1]++;
558
559 return from->WriteData(&buf[0], data_len, written, error);
560 }
561
562 return from->WriteData(data, data_len, written, error);
563 }
564
Yves Gerey665174f2018-06-19 15:03:05 +0200565 void SetDelay(int delay) { delay_ = delay; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000566 int GetDelay() { return delay_; }
567
Yves Gerey665174f2018-06-19 15:03:05 +0200568 void SetLoseFirstPacket(bool lose) { lose_first_packet_ = lose; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000569 bool GetLoseFirstPacket() { return lose_first_packet_; }
570
Yves Gerey665174f2018-06-19 15:03:05 +0200571 void SetLoss(int percent) { loss_ = percent; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000572
Yves Gerey665174f2018-06-19 15:03:05 +0200573 void SetDamage() { damage_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000574
Yves Gerey665174f2018-06-19 15:03:05 +0200575 void SetMtu(size_t mtu) { mtu_ = mtu; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000576
Yves Gerey665174f2018-06-19 15:03:05 +0200577 void SetHandshakeWait(int wait) { handshake_wait_ = wait; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000578
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800579 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000580 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800581 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000582 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800583 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000584 }
585
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800586 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000587 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800588 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000589 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800590 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000591 }
592
jbauch555604a2016-04-26 03:13:22 -0700593 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800594 std::unique_ptr<rtc::SSLCertChain> chain;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000595 if (client)
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800596 chain = client_ssl_->GetPeerSSLCertChain();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000597 else
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800598 chain = server_ssl_->GetPeerSSLCertChain();
Steve Antonf25303e2018-10-16 15:23:31 -0700599 return (chain && chain->GetSize()) ? chain->Get(0).Clone() : nullptr;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000600 }
601
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700602 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000603 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700604 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000605 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700606 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000607 }
608
torbjorng43166b82016-03-11 00:06:47 -0800609 int GetSslVersion(bool client) {
610 if (client)
611 return client_ssl_->GetSslVersion();
612 else
613 return server_ssl_->GetSslVersion();
614 }
615
Yves Gerey665174f2018-06-19 15:03:05 +0200616 bool ExportKeyingMaterial(const char* label,
617 const unsigned char* context,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000618 size_t context_len,
619 bool use_context,
620 bool client,
Yves Gerey665174f2018-06-19 15:03:05 +0200621 unsigned char* result,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000622 size_t result_len) {
623 if (client)
Yves Gerey665174f2018-06-19 15:03:05 +0200624 return client_ssl_->ExportKeyingMaterial(label, context, context_len,
625 use_context, result, result_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000626 else
Yves Gerey665174f2018-06-19 15:03:05 +0200627 return server_ssl_->ExportKeyingMaterial(label, context, context_len,
628 use_context, result, result_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000629 }
630
631 // To be implemented by subclasses.
632 virtual void WriteData() = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200633 virtual void ReadData(rtc::StreamInterface* stream) = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000634 virtual void TestTransfer(int size) = 0;
635
636 protected:
jbauche488a0d2015-11-19 05:17:58 -0800637 std::string client_cert_pem_;
638 std::string client_private_key_pem_;
639 rtc::KeyParams client_key_type_;
640 rtc::KeyParams server_key_type_;
Yves Gerey665174f2018-06-19 15:03:05 +0200641 SSLDummyStreamBase* client_stream_; // freed by client_ssl_ destructor
642 SSLDummyStreamBase* server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700643 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
644 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
Yves Gerey665174f2018-06-19 15:03:05 +0200645 rtc::SSLIdentity* client_identity_; // freed by client_ssl_ destructor
646 rtc::SSLIdentity* server_identity_; // freed by server_ssl_ destructor
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000647 int delay_;
648 size_t mtu_;
649 int loss_;
650 bool lose_first_packet_;
651 bool damage_;
652 bool dtls_;
653 int handshake_wait_;
654 bool identities_set_;
Benjamin Wright7276b972019-03-06 11:51:34 -0800655 bool legacy_tls_protocols_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000656};
657
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200658class SSLStreamAdapterTestTLS
659 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700660 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000661 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200662 SSLStreamAdapterTestTLS()
663 : SSLStreamAdapterTestBase("",
664 "",
665 false,
Benjamin Wright7276b972019-03-06 11:51:34 -0800666 false,
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200667 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800668 ::testing::get<1>(GetParam())),
669 client_buffer_(kFifoBufferSize),
Yves Gerey665174f2018-06-19 15:03:05 +0200670 server_buffer_(kFifoBufferSize) {}
jbauche488a0d2015-11-19 05:17:58 -0800671
torbjorng7593aad2015-11-19 12:20:51 -0800672 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800673 client_stream_ =
674 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
675 server_stream_ =
676 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
677 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000678
679 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700680 void TestTransfer(int size) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100681 RTC_LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000682 // Create some dummy data to send.
683 size_t received;
684
685 send_stream_.ReserveSize(size);
686 for (int i = 0; i < size; ++i) {
687 char ch = static_cast<char>(i);
deadbeef37f5ecf2017-02-27 14:06:41 -0800688 send_stream_.Write(&ch, 1, nullptr, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000689 }
690 send_stream_.Rewind();
691
692 // Prepare the receive stream.
693 recv_stream_.ReserveSize(size);
694
695 // Start sending
696 WriteData();
697
698 // Wait for the client to close
699 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
700
701 // Now check the data
702 recv_stream_.GetSize(&received);
703
704 EXPECT_EQ(static_cast<size_t>(size), received);
Yves Gerey665174f2018-06-19 15:03:05 +0200705 EXPECT_EQ(0,
706 memcmp(send_stream_.GetBuffer(), recv_stream_.GetBuffer(), size));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000707 }
708
nisseef8b61e2016-04-29 06:09:15 -0700709 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000710 size_t position, tosend, size;
711 rtc::StreamResult rv;
712 size_t sent;
713 char block[kBlockSize];
714
715 send_stream_.GetSize(&size);
716 if (!size)
717 return;
718
719 for (;;) {
720 send_stream_.GetPosition(&position);
deadbeef37f5ecf2017-02-27 14:06:41 -0800721 if (send_stream_.Read(block, sizeof(block), &tosend, nullptr) !=
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000722 rtc::SR_EOS) {
723 rv = client_ssl_->Write(block, tosend, &sent, 0);
724
725 if (rv == rtc::SR_SUCCESS) {
726 send_stream_.SetPosition(position + sent);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100727 RTC_LOG(LS_VERBOSE) << "Sent: " << position + sent;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000728 } else if (rv == rtc::SR_BLOCK) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100729 RTC_LOG(LS_VERBOSE) << "Blocked...";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000730 send_stream_.SetPosition(position);
731 break;
732 } else {
733 ADD_FAILURE();
734 break;
735 }
736 } else {
737 // Now close
Mirko Bonadei675513b2017-11-09 11:09:25 +0100738 RTC_LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000739 client_ssl_->Close();
740 break;
741 }
742 }
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100743 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000744
Yves Gerey665174f2018-06-19 15:03:05 +0200745 void ReadData(rtc::StreamInterface* stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000746 char buffer[1600];
747 size_t bread;
748 int err2;
749 rtc::StreamResult r;
750
751 for (;;) {
752 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
753
754 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
755 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800756 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000757 stream->Close();
758 return;
759 }
760
761 if (r == rtc::SR_BLOCK)
762 break;
763
764 ASSERT_EQ(rtc::SR_SUCCESS, r);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100765 RTC_LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000766
deadbeef37f5ecf2017-02-27 14:06:41 -0800767 recv_stream_.Write(buffer, bread, nullptr, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000768 }
769 }
770
771 private:
jbauche488a0d2015-11-19 05:17:58 -0800772 rtc::FifoBuffer client_buffer_;
773 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000774 rtc::MemoryStream send_stream_;
775 rtc::MemoryStream recv_stream_;
776};
777
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200778class SSLStreamAdapterTestDTLS
779 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700780 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000781 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200782 SSLStreamAdapterTestDTLS()
Benjamin Wright7276b972019-03-06 11:51:34 -0800783 : SSLStreamAdapterTestDTLS(/*legacy_tls_protocols=*/false) {}
784
785 SSLStreamAdapterTestDTLS(bool legacy_tls_protocols)
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200786 : SSLStreamAdapterTestBase("",
787 "",
788 true,
Benjamin Wright7276b972019-03-06 11:51:34 -0800789 legacy_tls_protocols,
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200790 ::testing::get<0>(GetParam()),
791 ::testing::get<1>(GetParam())),
jbauche488a0d2015-11-19 05:17:58 -0800792 client_buffer_(kBufferCapacity, kDefaultBufferSize),
793 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200794 packet_size_(1000),
795 count_(0),
796 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000797
798 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
Yves Gerey665174f2018-06-19 15:03:05 +0200799 const std::string& private_key_pem)
800 : SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
801 client_buffer_(kBufferCapacity, kDefaultBufferSize),
802 server_buffer_(kBufferCapacity, kDefaultBufferSize),
803 packet_size_(1000),
804 count_(0),
805 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000806
torbjorng7593aad2015-11-19 12:20:51 -0800807 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800808 client_stream_ =
809 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
810 server_stream_ =
811 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
812 }
813
nisseef8b61e2016-04-29 06:09:15 -0700814 void WriteData() override {
Yves Gerey665174f2018-06-19 15:03:05 +0200815 unsigned char* packet = new unsigned char[1600];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000816
jbauche488a0d2015-11-19 05:17:58 -0800817 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800818 unsigned int rand_state = sent_;
819 packet[0] = sent_;
820 for (size_t i = 1; i < packet_size_; i++) {
821 // This is a simple LC PRNG. Keep in synch with identical code below.
822 rand_state = (rand_state * 251 + 19937) >> 7;
823 packet[i] = rand_state & 0xff;
824 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000825
826 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800827 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000828 if (rv == rtc::SR_SUCCESS) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100829 RTC_LOG(LS_VERBOSE) << "Sent: " << sent_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000830 sent_++;
831 } else if (rv == rtc::SR_BLOCK) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100832 RTC_LOG(LS_VERBOSE) << "Blocked...";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000833 break;
834 } else {
835 ADD_FAILURE();
836 break;
837 }
jbauche488a0d2015-11-19 05:17:58 -0800838 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000839
Yves Gerey665174f2018-06-19 15:03:05 +0200840 delete[] packet;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000841 }
842
Yves Gerey665174f2018-06-19 15:03:05 +0200843 void ReadData(rtc::StreamInterface* stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000844 unsigned char buffer[2000];
845 size_t bread;
846 int err2;
847 rtc::StreamResult r;
848
849 for (;;) {
850 r = stream->Read(buffer, 2000, &bread, &err2);
851
852 if (r == rtc::SR_ERROR) {
853 // Unfortunately, errors are the way that the stream adapter
854 // signals close right now
855 stream->Close();
856 return;
857 }
858
859 if (r == rtc::SR_BLOCK)
860 break;
861
862 ASSERT_EQ(rtc::SR_SUCCESS, r);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100863 RTC_LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000864
865 // Now parse the datagram
866 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800867 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000868
torbjorng7593aad2015-11-19 12:20:51 -0800869 unsigned int rand_state = packet_num;
870 for (size_t i = 1; i < packet_size_; i++) {
871 // This is a simple LC PRNG. Keep in synch with identical code above.
872 rand_state = (rand_state * 251 + 19937) >> 7;
873 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000874 }
875 received_.insert(packet_num);
876 }
877 }
878
nisseef8b61e2016-04-29 06:09:15 -0700879 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000880 count_ = count;
881
882 WriteData();
883
884 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100885 RTC_LOG(LS_INFO) << "sent_ == " << sent_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000886
887 if (damage_) {
888 WAIT(false, 2000);
889 EXPECT_EQ(0U, received_.size());
890 } else if (loss_ == 0) {
Yves Gerey665174f2018-06-19 15:03:05 +0200891 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000892 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100893 RTC_LOG(LS_INFO) << "Sent " << sent_ << " packets; received "
894 << received_.size();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000895 }
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100896 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000897
898 private:
jbauche488a0d2015-11-19 05:17:58 -0800899 BufferQueueStream client_buffer_;
900 BufferQueueStream server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000901 size_t packet_size_;
902 int count_;
903 int sent_;
904 std::set<int> received_;
905};
906
Yves Gerey665174f2018-06-19 15:03:05 +0200907rtc::StreamResult SSLDummyStreamBase::Write(const void* data,
908 size_t data_len,
909 size_t* written,
910 int* error) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100911 RTC_LOG(LS_VERBOSE) << "Writing to loopback " << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000912
913 if (first_packet_) {
914 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800915 if (test_base_->GetLoseFirstPacket()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100916 RTC_LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800917 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000918 return rtc::SR_SUCCESS;
919 }
920 }
921
jbauche488a0d2015-11-19 05:17:58 -0800922 return test_base_->DataWritten(this, data, data_len, written, error);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100923}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000924
925class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
926 public:
Yves Gerey665174f2018-06-19 15:03:05 +0200927 SSLStreamAdapterTestDTLSFromPEMStrings()
928 : SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000929};
930
Jian Cui0a8798b2017-11-16 16:58:02 -0800931// Test fixture for certificate chaining. Server will push more than one
932// certificate.
933class SSLStreamAdapterTestDTLSCertChain : public SSLStreamAdapterTestDTLS {
934 public:
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100935 SSLStreamAdapterTestDTLSCertChain() : SSLStreamAdapterTestDTLS("", "") {}
Jian Cui0a8798b2017-11-16 16:58:02 -0800936 void SetUp() override {
937 CreateStreams();
938
939 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
940 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
941
942 // Set up the slots
943 client_ssl_->SignalEvent.connect(
944 reinterpret_cast<SSLStreamAdapterTestBase*>(this),
945 &SSLStreamAdapterTestBase::OnEvent);
946 server_ssl_->SignalEvent.connect(
947 reinterpret_cast<SSLStreamAdapterTestBase*>(this),
948 &SSLStreamAdapterTestBase::OnEvent);
949
950 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
951 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
952 client_private_key_pem_, client_cert_pem_);
953 } else {
954 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
955 }
956
957 client_ssl_->SetIdentity(client_identity_);
958 }
959};
960
Benjamin Wright7276b972019-03-06 11:51:34 -0800961// Enable legacy TLS protocols in DTLS.
962class SSLStreamAdapterTestDTLSLegacyProtocols
963 : public SSLStreamAdapterTestDTLS {
964 public:
965 SSLStreamAdapterTestDTLSLegacyProtocols()
966 : SSLStreamAdapterTestDTLS(/*legacy_tls_protocols=*/true) {}
967};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000968// Basic tests: TLS
969
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000970// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200971TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000972 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100973}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000974
Jian Cui0a8798b2017-11-16 16:58:02 -0800975TEST_P(SSLStreamAdapterTestTLS, GetPeerCertChainWithOneCertificate) {
976 TestHandshake();
977 std::unique_ptr<rtc::SSLCertChain> cert_chain =
978 client_ssl_->GetPeerSSLCertChain();
Jian Cui0a8798b2017-11-16 16:58:02 -0800979 ASSERT_NE(nullptr, cert_chain);
980 EXPECT_EQ(1u, cert_chain->GetSize());
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800981 EXPECT_EQ(cert_chain->Get(0).ToPEMString(),
982 server_identity_->certificate().ToPEMString());
Jian Cui0a8798b2017-11-16 16:58:02 -0800983}
984
985TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshake) {
986 server_identity_ = rtc::SSLIdentity::FromPEMChainStrings(
987 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kCACert);
988 server_ssl_->SetIdentity(server_identity_);
989 TestHandshake();
990 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
991 client_ssl_->GetPeerSSLCertChain();
992 ASSERT_NE(nullptr, peer_cert_chain);
993 ASSERT_EQ(2u, peer_cert_chain->GetSize());
994 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
995 EXPECT_EQ(kCACert, peer_cert_chain->Get(1).ToPEMString());
996}
997
David Benjaminea84b6b2017-12-01 17:25:45 -0500998TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshakeWithCopy) {
999 std::unique_ptr<rtc::SSLIdentity> identity(
1000 rtc::SSLIdentity::FromPEMChainStrings(kRSA_PRIVATE_KEY_PEM,
1001 std::string(kCERT_PEM) + kCACert));
1002 server_identity_ = identity->GetReference();
1003 server_ssl_->SetIdentity(server_identity_);
1004 TestHandshake();
1005 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1006 client_ssl_->GetPeerSSLCertChain();
1007 ASSERT_NE(nullptr, peer_cert_chain);
1008 ASSERT_EQ(2u, peer_cert_chain->GetSize());
1009 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1010 EXPECT_EQ(kCACert, peer_cert_chain->Get(1).ToPEMString());
1011}
1012
Jian Cui0a8798b2017-11-16 16:58:02 -08001013TEST_F(SSLStreamAdapterTestDTLSCertChain, ThreeCertHandshake) {
1014 server_identity_ = rtc::SSLIdentity::FromPEMChainStrings(
1015 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kIntCert1 + kCACert);
1016 server_ssl_->SetIdentity(server_identity_);
1017 TestHandshake();
1018 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1019 client_ssl_->GetPeerSSLCertChain();
1020 ASSERT_NE(nullptr, peer_cert_chain);
1021 ASSERT_EQ(3u, peer_cert_chain->GetSize());
1022 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1023 EXPECT_EQ(kIntCert1, peer_cert_chain->Get(1).ToPEMString());
1024 EXPECT_EQ(kCACert, peer_cert_chain->Get(2).ToPEMString());
1025}
1026
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001027// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001028TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001029 TestHandshake();
1030 client_ssl_->Close();
1031 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001032}
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001033
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001034// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001035TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001036 TestHandshake();
1037 TestTransfer(100000);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001038}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001039
1040// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001041TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042 TestHandshake();
1043 TestTransfer(100000);
1044 client_ssl_->Close();
1045
1046 rtc::StreamResult rv;
1047 char block[kBlockSize];
1048 size_t dummy;
1049
1050 // It's an error to write after closed.
deadbeef37f5ecf2017-02-27 14:06:41 -08001051 rv = client_ssl_->Write(block, sizeof(block), &dummy, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001052 ASSERT_EQ(rtc::SR_ERROR, rv);
1053
1054 // But after closed read gives you EOS.
deadbeef37f5ecf2017-02-27 14:06:41 -08001055 rv = client_ssl_->Read(block, sizeof(block), &dummy, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001056 ASSERT_EQ(rtc::SR_EOS, rv);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001057}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001058
1059// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001060TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
deadbeef89824f62016-09-30 11:55:43 -07001061 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001062 TestHandshake(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001063}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001064
deadbeef89824f62016-09-30 11:55:43 -07001065TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
1066 TestHandshakeWithDelayedIdentity(true);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001067}
deadbeef89824f62016-09-30 11:55:43 -07001068
1069TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
1070 TestHandshakeWithDelayedIdentity(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001071}
deadbeef89824f62016-09-30 11:55:43 -07001072
1073// Test that the correct error is returned when SetPeerCertificateDigest is
1074// called with an unknown algorithm.
1075TEST_P(SSLStreamAdapterTestTLS,
1076 TestSetPeerCertificateDigestWithUnknownAlgorithm) {
1077 unsigned char server_digest[20];
1078 size_t server_digest_len;
1079 bool rv;
1080 rtc::SSLPeerCertificateDigestError err;
1081
1082 rv = server_identity_->certificate().ComputeDigest(
1083 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
1084 ASSERT_TRUE(rv);
1085
1086 rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
1087 server_digest_len, &err);
1088 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
1089 EXPECT_FALSE(rv);
1090}
1091
1092// Test that the correct error is returned when SetPeerCertificateDigest is
1093// called with an invalid digest length.
1094TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
1095 unsigned char server_digest[20];
1096 size_t server_digest_len;
1097 bool rv;
1098 rtc::SSLPeerCertificateDigestError err;
1099
1100 rv = server_identity_->certificate().ComputeDigest(
1101 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
1102 ASSERT_TRUE(rv);
1103
1104 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
1105 server_digest_len - 1, &err);
1106 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
1107 EXPECT_FALSE(rv);
1108}
1109
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001110// Test moving a bunch of data
1111
1112// Basic tests: DTLS
1113// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001114TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001115 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001116}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001117
1118// Test that we can make a handshake work if the first packet in
1119// each direction is lost. This gives us predictable loss
1120// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001121TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001122 SetLoseFirstPacket(true);
1123 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001124}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001125
1126// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001127TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001128 SetLoseFirstPacket(true);
1129 SetDelay(2000);
1130 SetHandshakeWait(20000);
1131 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001132}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001133
1134// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +00001135// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001136TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001137 SetMtu(700);
1138 SetHandshakeWait(20000);
1139 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001140}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001141
1142// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -08001143TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001144 TestHandshake();
1145 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001146}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001147
jbauche488a0d2015-11-19 05:17:58 -08001148TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001149 TestHandshake();
1150 SetLoss(10);
1151 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001152}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001153
jbauche488a0d2015-11-19 05:17:58 -08001154TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001155 SetDamage(); // Must be called first because first packet
1156 // write happens at end of handshake.
1157 TestHandshake();
1158 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001159}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001160
deadbeef89824f62016-09-30 11:55:43 -07001161TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
1162 TestHandshakeWithDelayedIdentity(true);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001163}
deadbeef89824f62016-09-30 11:55:43 -07001164
1165TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
1166 TestHandshakeWithDelayedIdentity(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001167}
deadbeef89824f62016-09-30 11:55:43 -07001168
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001169// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001170TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001171 std::vector<int> high;
1172 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1173 SetDtlsSrtpCryptoSuites(high, true);
1174 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001175 TestHandshake();
1176
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001177 int client_cipher;
1178 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1179 int server_cipher;
1180 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001181
1182 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001183 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001184}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001185
1186// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001187TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001188 std::vector<int> low;
1189 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1190 SetDtlsSrtpCryptoSuites(low, true);
1191 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001192 TestHandshake();
1193
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001194 int client_cipher;
1195 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1196 int server_cipher;
1197 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001198
1199 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001200 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001201}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001202
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001203// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001204TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001205 std::vector<int> high;
1206 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1207 std::vector<int> low;
1208 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1209 SetDtlsSrtpCryptoSuites(high, true);
1210 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001211 TestHandshake();
1212
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001213 int client_cipher;
1214 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1215 int server_cipher;
1216 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001217}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001218
1219// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001220TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001221 std::vector<int> mixed;
1222 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1223 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1224 SetDtlsSrtpCryptoSuites(mixed, true);
1225 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001226 TestHandshake();
1227
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001228 int client_cipher;
1229 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1230 int server_cipher;
1231 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001232
1233 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001234 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001235}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001236
jbauchcb560652016-08-04 05:20:32 -07001237// Test DTLS-SRTP with all GCM-128 ciphers.
1238TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
jbauchcb560652016-08-04 05:20:32 -07001239 std::vector<int> gcm128;
1240 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1241 SetDtlsSrtpCryptoSuites(gcm128, true);
1242 SetDtlsSrtpCryptoSuites(gcm128, false);
1243 TestHandshake();
1244
1245 int client_cipher;
1246 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1247 int server_cipher;
1248 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1249
1250 ASSERT_EQ(client_cipher, server_cipher);
1251 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001252}
jbauchcb560652016-08-04 05:20:32 -07001253
1254// Test DTLS-SRTP with all GCM-256 ciphers.
1255TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
jbauchcb560652016-08-04 05:20:32 -07001256 std::vector<int> gcm256;
1257 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1258 SetDtlsSrtpCryptoSuites(gcm256, true);
1259 SetDtlsSrtpCryptoSuites(gcm256, false);
1260 TestHandshake();
1261
1262 int client_cipher;
1263 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1264 int server_cipher;
1265 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1266
1267 ASSERT_EQ(client_cipher, server_cipher);
1268 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001269}
jbauchcb560652016-08-04 05:20:32 -07001270
1271// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1272TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
jbauchcb560652016-08-04 05:20:32 -07001273 std::vector<int> gcm128;
1274 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1275 std::vector<int> gcm256;
1276 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1277 SetDtlsSrtpCryptoSuites(gcm128, true);
1278 SetDtlsSrtpCryptoSuites(gcm256, false);
1279 TestHandshake();
1280
1281 int client_cipher;
1282 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1283 int server_cipher;
1284 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001285}
jbauchcb560652016-08-04 05:20:32 -07001286
1287// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1288TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
jbauchcb560652016-08-04 05:20:32 -07001289 std::vector<int> gcmBoth;
1290 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1291 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1292 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1293 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1294 TestHandshake();
1295
1296 int client_cipher;
1297 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1298 int server_cipher;
1299 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1300
1301 ASSERT_EQ(client_cipher, server_cipher);
1302 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001303}
jbauchcb560652016-08-04 05:20:32 -07001304
1305// Test SRTP cipher suite lengths.
1306TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1307 int key_len;
1308 int salt_len;
1309
Yves Gerey665174f2018-06-19 15:03:05 +02001310 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_INVALID_CRYPTO_SUITE,
1311 &key_len, &salt_len));
jbauchcb560652016-08-04 05:20:32 -07001312
Yves Gerey665174f2018-06-19 15:03:05 +02001313 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AES128_CM_SHA1_32,
1314 &key_len, &salt_len));
1315 ASSERT_EQ(128 / 8, key_len);
1316 ASSERT_EQ(112 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001317
Yves Gerey665174f2018-06-19 15:03:05 +02001318 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AES128_CM_SHA1_80,
1319 &key_len, &salt_len));
1320 ASSERT_EQ(128 / 8, key_len);
1321 ASSERT_EQ(112 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001322
Yves Gerey665174f2018-06-19 15:03:05 +02001323 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AEAD_AES_128_GCM,
1324 &key_len, &salt_len));
1325 ASSERT_EQ(128 / 8, key_len);
1326 ASSERT_EQ(96 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001327
Yves Gerey665174f2018-06-19 15:03:05 +02001328 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AEAD_AES_256_GCM,
1329 &key_len, &salt_len));
1330 ASSERT_EQ(256 / 8, key_len);
1331 ASSERT_EQ(96 / 8, salt_len);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001332}
jbauchcb560652016-08-04 05:20:32 -07001333
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001334// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001335TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001336 TestHandshake();
1337 unsigned char client_out[20];
1338 unsigned char server_out[20];
1339
1340 bool result;
Yves Gerey665174f2018-06-19 15:03:05 +02001341 result = ExportKeyingMaterial(kExporterLabel, kExporterContext,
1342 kExporterContextLen, true, true, client_out,
1343 sizeof(client_out));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001344 ASSERT_TRUE(result);
1345
Yves Gerey665174f2018-06-19 15:03:05 +02001346 result = ExportKeyingMaterial(kExporterLabel, kExporterContext,
1347 kExporterContextLen, true, false, server_out,
1348 sizeof(server_out));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001349 ASSERT_TRUE(result);
1350
1351 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1352}
1353
1354// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001355TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001356 long one_day = 60 * 60 * 24;
1357 // Make the certificates not valid until one day later.
1358 ResetIdentitiesWithValidity(one_day, one_day);
1359 TestHandshake();
1360}
1361
1362// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001363TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001364 long one_day = 60 * 60 * 24;
1365 // Make the certificates already expired.
1366 ResetIdentitiesWithValidity(-one_day, -one_day);
1367 TestHandshake();
1368}
1369
1370// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001371TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001372 TestHandshake();
1373 TestTransfer(100);
1374}
1375
1376// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001377TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001378 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001379 ASSERT_FALSE(GetPeerCertificate(true));
1380 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001381
1382 TestHandshake();
1383
1384 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001385 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001386 GetPeerCertificate(true);
1387 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001388
1389 // It's not kCERT_PEM.
1390 std::string client_peer_string = client_peer_cert->ToPEMString();
1391 ASSERT_NE(kCERT_PEM, client_peer_string);
1392
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001393 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001394 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001395 GetPeerCertificate(false);
1396 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001397
1398 // It's kCERT_PEM
1399 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001400}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001401
1402// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +02001403// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
Benjamin Wright7276b972019-03-06 11:51:34 -08001404TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols, TestGetSslCipherSuite) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001405 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001406 TestHandshake();
1407
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001408 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001409 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001410 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001411 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001412
torbjorng43166b82016-03-11 00:06:47 -08001413 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1414 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1415
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001416 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001417 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1418 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001419}
1420
1421// Test getting the used DTLS 1.2 ciphers.
1422// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Benjamin Wright7276b972019-03-06 11:51:34 -08001423TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols,
1424 TestGetSslCipherSuiteDtls12Both) {
1425 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1426 TestHandshake();
1427
1428 int client_cipher;
1429 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1430 int server_cipher;
1431 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1432
1433 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1434 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1435
1436 ASSERT_EQ(client_cipher, server_cipher);
1437 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1438 server_cipher, ::testing::get<1>(GetParam()).type()));
1439}
1440
1441// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
1442TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols,
1443 TestGetSslCipherSuiteDtls12Client) {
1444 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1445 TestHandshake();
1446
1447 int client_cipher;
1448 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1449 int server_cipher;
1450 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1451
1452 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1453 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1454
1455 ASSERT_EQ(client_cipher, server_cipher);
1456 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1457 server_cipher, ::testing::get<1>(GetParam()).type()));
1458}
1459
1460// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
1461TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols,
1462 TestGetSslCipherSuiteDtls12Server) {
1463 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1464 TestHandshake();
1465
1466 int client_cipher;
1467 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1468 int server_cipher;
1469 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1470
1471 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1472 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1473
1474 ASSERT_EQ(client_cipher, server_cipher);
1475 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1476 server_cipher, ::testing::get<1>(GetParam()).type()));
1477}
1478
1479// Test getting the used DTLS 1.2 ciphers.
1480// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001481TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001482 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1483 TestHandshake();
1484
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001485 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001486 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001487 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001488 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001489
torbjorng43166b82016-03-11 00:06:47 -08001490 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1491 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1492
Joachim Bauch831c5582015-05-20 12:48:41 +02001493 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001494 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1495 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001496}
1497
Benjamin Wright7276b972019-03-06 11:51:34 -08001498// Test getting the used DTLS ciphers.
1499// DTLS 1.0 enabled for client and server, both will be upgraded to DTLS 1.2
1500TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
1501 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
Joachim Bauch831c5582015-05-20 12:48:41 +02001502 TestHandshake();
1503
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001504 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001505 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001506 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001507 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001508
Benjamin Wright7276b972019-03-06 11:51:34 -08001509 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1510 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
torbjorng43166b82016-03-11 00:06:47 -08001511
Joachim Bauch831c5582015-05-20 12:48:41 +02001512 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001513 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1514 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001515}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001516
torbjorng4e572472015-10-08 09:42:49 -07001517// The RSA keysizes here might look strange, why not include the RFC's size
1518// 2048?. The reason is test case slowness; testing two sizes to exercise
1519// parametrization is sufficient.
Mirko Bonadeic84f6612019-01-31 12:20:57 +01001520INSTANTIATE_TEST_SUITE_P(
torbjorng4e572472015-10-08 09:42:49 -07001521 SSLStreamAdapterTestsTLS,
1522 SSLStreamAdapterTestTLS,
1523 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1524 rtc::KeyParams::RSA(1152, 65537),
1525 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1526 Values(rtc::KeyParams::RSA(1024, 65537),
1527 rtc::KeyParams::RSA(1152, 65537),
1528 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
Mirko Bonadeic84f6612019-01-31 12:20:57 +01001529INSTANTIATE_TEST_SUITE_P(
torbjorng4e572472015-10-08 09:42:49 -07001530 SSLStreamAdapterTestsDTLS,
1531 SSLStreamAdapterTestDTLS,
1532 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1533 rtc::KeyParams::RSA(1152, 65537),
1534 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1535 Values(rtc::KeyParams::RSA(1024, 65537),
1536 rtc::KeyParams::RSA(1152, 65537),
1537 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));