blob: 585d080869083b1b2b45fdbdbe89ac53c583e7ca [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öller13339482019-03-28 13:30:15 +010020#include "rtc_base/memory/fifo_buffer.h"
Niels Möllere7547d52018-11-01 09:33:08 +010021#include "rtc_base/memory_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "rtc_base/message_digest.h"
23#include "rtc_base/ssl_adapter.h"
24#include "rtc_base/ssl_identity.h"
25#include "rtc_base/ssl_stream_adapter.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "rtc_base/stream.h"
Benjamin Wright7276b972019-03-06 11:51:34 -080027#include "test/field_trial.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000028
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020029using ::testing::Combine;
30using ::testing::tuple;
Benjamin Wright7276b972019-03-06 11:51:34 -080031using ::testing::Values;
32using ::testing::WithParamInterface;
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +020033
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000034static const int kBlockSize = 4096;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000035static const char kExporterLabel[] = "label";
36static const unsigned char kExporterContext[] = "context";
37static int kExporterContextLen = sizeof(kExporterContext);
38
39static const char kRSA_PRIVATE_KEY_PEM[] =
40 "-----BEGIN RSA PRIVATE KEY-----\n"
41 "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
42 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
43 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
44 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
45 "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
46 "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
47 "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
48 "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
49 "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
50 "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
51 "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
52 "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
53 "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
54 "UCXiYxSsu20QNVw=\n"
55 "-----END RSA PRIVATE KEY-----\n";
56
57static const char kCERT_PEM[] =
58 "-----BEGIN CERTIFICATE-----\n"
59 "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
60 "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
61 "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
62 "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
63 "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
64 "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
65 "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
66 "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
67 "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
68 "-----END CERTIFICATE-----\n";
69
Jian Cui0a8798b2017-11-16 16:58:02 -080070static const char kIntCert1[] =
71 "-----BEGIN CERTIFICATE-----\n"
72 "MIIEUjCCAjqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBljELMAkGA1UEBhMCVVMx\n"
73 "EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS\n"
74 "BgNVBAoMC0dvb2dsZSwgSW5jMQwwCgYDVQQLDANHVFAxFzAVBgNVBAMMDnRlbGVw\n"
75 "aG9ueS5nb29nMR0wGwYJKoZIhvcNAQkBFg5ndHBAZ29vZ2xlLmNvbTAeFw0xNzA5\n"
76 "MjYwNDA5MDNaFw0yMDA2MjIwNDA5MDNaMGQxCzAJBgNVBAYTAlVTMQswCQYDVQQI\n"
77 "DAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEXMBUGA1UECgwOdGVsZXBob255\n"
78 "Lmdvb2cxFzAVBgNVBAMMDnRlbGVwaG9ueS5nb29nMIGfMA0GCSqGSIb3DQEBAQUA\n"
79 "A4GNADCBiQKBgQDJXWeeU1v1+wlqkVobzI3aN7Uh2iVQA9YCdq5suuabtiD/qoOD\n"
80 "NKpmQqsx7WZGGWSZTDFEBaUpvIK7Hb+nzRqk6iioPCFOFuarm6GxO1xVneImMuE6\n"
81 "tuWb3YZPr+ikChJbl11y5UcSbg0QsbeUc+jHl5umNvrL85Y+z8SP0rxbBwIDAQAB\n"
82 "o2AwXjAdBgNVHQ4EFgQU7tdZobqlN8R8V72FQnRxmqq8tKswHwYDVR0jBBgwFoAU\n"
83 "5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC\n"
84 "AQYwDQYJKoZIhvcNAQELBQADggIBADObh9Z+z14FmP9zSenhFtq7hFnmNrSkklk8\n"
85 "eyYWXKfOuIriEQQBZsz76ZcnzStih8Rj+yQ0AXydk4fJ5LOwC2cUqQBar17g6Pd2\n"
86 "8g4SIL4azR9WvtiSvpuGlwp25b+yunaacDne6ebnf/MUiiKT5w61Xo3cEPVfl38e\n"
87 "/Up2l0bioid5enUTmg6LY6RxDO6tnZQkz3XD+nNSwT4ehtkqFpHYWjErj0BbkDM2\n"
88 "hiVc/JsYOZn3DmuOlHVHU6sKwqh3JEyvHO/d7DGzMGWHpHwv2mCTJq6l/sR95Tc2\n"
89 "GaQZgGDVNs9pdEouJCDm9e/PbQWRYhnat82PTkXx/6mDAAwdZlIi/pACzq8K4p7e\n"
90 "6hF0t8uKGnXJubHPXxlnJU6yxZ0yWmivAGjwWK4ur832gKlho4jeMDhiI/T3QPpl\n"
91 "iMNsIvxRhdD+GxJkQP1ezayw8s+Uc9KwKglrkBSRRDLCJUfPOvMmXLUDSTMX7kp4\n"
92 "/Ak1CA8dVLJIlfEjLBUuvAttlP7+7lsKNgxAjCxZkWLXIyGULzNPQwVWkGfCbrQs\n"
93 "XyMvSbFsSIb7blV7eLlmf9a+2RprUUkc2ALXLLCI9YQXmxm2beBfMyNmmebwBJzT\n"
94 "B0OR+5pFFNTJPoNlqpdrDsGrDu7JlUtk0ZLZzYyKXbgy2qXxfd4OWzXXjxpLMszZ\n"
95 "LDIpOAkj\n"
96 "-----END CERTIFICATE-----\n";
97
98static const char kCACert[] =
99 "-----BEGIN CERTIFICATE-----\n"
100 "MIIGETCCA/mgAwIBAgIJAKN9r/BdbGUJMA0GCSqGSIb3DQEBCwUAMIGWMQswCQYD\n"
101 "VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g\n"
102 "VmlldzEUMBIGA1UECgwLR29vZ2xlLCBJbmMxDDAKBgNVBAsMA0dUUDEXMBUGA1UE\n"
103 "AwwOdGVsZXBob255Lmdvb2cxHTAbBgkqhkiG9w0BCQEWDmd0cEBnb29nbGUuY29t\n"
104 "MB4XDTE3MDcyNzIzMDE0NVoXDTE3MDgyNjIzMDE0NVowgZYxCzAJBgNVBAYTAlVT\n"
105 "MRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQw\n"
106 "EgYDVQQKDAtHb29nbGUsIEluYzEMMAoGA1UECwwDR1RQMRcwFQYDVQQDDA50ZWxl\n"
107 "cGhvbnkuZ29vZzEdMBsGCSqGSIb3DQEJARYOZ3RwQGdvb2dsZS5jb20wggIiMA0G\n"
108 "CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCfvpF7aBV5Hp1EHsWoIlL3GeHwh8dS\n"
109 "lv9VQCegN9rD06Ny7MgcED5AiK2vqXmUmOVS+7NbATkdVYN/eozDhKtN3Q3n87kJ\n"
110 "Nt/TD/TcZZHOZIGsRPbrf2URK26E/5KzTzbzXVBOA1e+gSj+EBbltGqb01ZO5ErF\n"
111 "iPGViPM/HpYKdq6mfz2bS5PhU67XZMM2zvToyReQ/Fjm/6PJhwKSRXSgZF5djPhk\n"
112 "2LfOKMLS0AeZtd2C4DFsCU41lfLUkybioDgFuzTQ3TFi1K8A07KYTMmLY/yQppnf\n"
113 "SpNX58shlVhM+Ed37K1Z0rU0OfVCZ5P+KKaSSfMranjlU7zeUIhZYjqq/EYrEhbS\n"
114 "dLnNHwgJrqxzId3kq8uuLM6+VB7JZKnZLfT90GdAbX4+tutNe21smmogF9f80vEy\n"
115 "gM4tOp9rXrvz9vCwWHXVY9kdKemdLAsREoO6MS9k2ctK4jj80o2dROuFC6Q3e7mz\n"
116 "RjvZr5Tvi464c2o9o/jNlJ0O6q7V2eQzohD+7VnV5QPpRGXxlIeqpR2zoAg+WtRS\n"
117 "4OgHOVYiD3M6uAlggJA5pcDjMfkEZ+pkhtVcT4qMCEoruk6GbyPxS565oSHu16bH\n"
118 "EjeCqbZOVND5T3oA7nz6aQSs8sJabt0jmxUkGVnE+4ZDIuuRtkRma+0P/96Mtqor\n"
119 "OlpNWY1OBDY64QIDAQABo2AwXjAdBgNVHQ4EFgQU5GgKMUtcxkQ2dJrtNR5YOlIA\n"
120 "PDswHwYDVR0jBBgwFoAU5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUw\n"
121 "AwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAARQly5/bB6VUL2C\n"
122 "ykDYgWt48go407pAra6tL2kjpdfxV5PdL7iMZRkeht00vj+BVahIqZKrNOa/f5Fx\n"
123 "vlpahZFu0PDN436aQwRZ9qWut2qDOK0/z9Hhj6NWybquRFwMwqkPG/ivLMDU8Dmj\n"
124 "CIplpngPYNwXCs0KzdjSXYxqxJbwMjQXELD+/RcurY0oTtJMM1/2vKQMzw24UJqe\n"
125 "XLJAlsnd2AnWzWNUEviDZY89j9NdkHerBmV2gGzcU+X5lgOO5M8odBv0ZC9D+a6Z\n"
126 "QPZAOfdGVw60hhGvTW5s/s0dHwCpegRidhs0MD0fTmwwjYFBSmUx3Gztr4JTzOOr\n"
127 "7e5daJuak2ujQ5DqcGBvt1gePjSudb5brS7JQtN8tI/FyrnR4q/OuOwv1EvlC5RG\n"
128 "hLX+TXaWqFxB1Hd8ebKRR40mboFG6KcUI3lLBthDvQE7jnq48QfZMjlMQK0ZF1l7\n"
129 "SrlwRXWA74bU8CLJvnZKKo9p4TsTiDYGSYC6tNHKj5s3TGWL46oqGyZ0KdGNhrtC\n"
130 "rIGenMhth1vPYjyy0XuGBndXT85yi+IM2l8g8oU845+plxIhgpSI8bbC0oLwnhQ5\n"
131 "ARfsiYLkXDE7imSS0CSUmye76372mlzAIB1is4bBB/SzpPQtBuB9LDKtONgpSGHn\n"
132 "dGaXBy+qbVXVyGXaeEbIRjtJ6m92\n"
133 "-----END CERTIFICATE-----\n";
134
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000135class SSLStreamAdapterTestBase;
136
jbauche488a0d2015-11-19 05:17:58 -0800137class SSLDummyStreamBase : public rtc::StreamInterface,
138 public sigslot::has_slots<> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000139 public:
jbauche488a0d2015-11-19 05:17:58 -0800140 SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
Yves Gerey665174f2018-06-19 15:03:05 +0200141 const std::string& side,
jbauche488a0d2015-11-19 05:17:58 -0800142 rtc::StreamInterface* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200143 rtc::StreamInterface* out)
144 : test_base_(test), side_(side), in_(in), out_(out), first_packet_(true) {
jbauche488a0d2015-11-19 05:17:58 -0800145 in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
146 out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000147 }
148
jbauche488a0d2015-11-19 05:17:58 -0800149 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150
Yves Gerey665174f2018-06-19 15:03:05 +0200151 rtc::StreamResult Read(void* buffer,
152 size_t buffer_len,
153 size_t* read,
154 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155 rtc::StreamResult r;
156
157 r = in_->Read(buffer, buffer_len, read, error);
158 if (r == rtc::SR_BLOCK)
159 return rtc::SR_BLOCK;
160 if (r == rtc::SR_EOS)
161 return rtc::SR_EOS;
162
163 if (r != rtc::SR_SUCCESS) {
164 ADD_FAILURE();
165 return rtc::SR_ERROR;
166 }
167
168 return rtc::SR_SUCCESS;
169 }
170
171 // Catch readability events on in and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800172 void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000173 int mask = (rtc::SE_READ | rtc::SE_CLOSE);
174
175 if (sig & mask) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100176 RTC_LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
177 << " sig=" << sig << " forwarding upward";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000178 PostEvent(sig & mask, 0);
179 }
180 }
181
182 // Catch writeability events on out and pass them up.
jbauche488a0d2015-11-19 05:17:58 -0800183 void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000184 if (sig & rtc::SE_WRITE) {
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
188 PostEvent(sig & rtc::SE_WRITE, 0);
189 }
190 }
191
192 // Write to the outgoing FifoBuffer
Yves Gerey665174f2018-06-19 15:03:05 +0200193 rtc::StreamResult WriteData(const void* data,
194 size_t data_len,
195 size_t* written,
196 int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000197 return out_->Write(data, data_len, written, error);
198 }
199
Yves Gerey665174f2018-06-19 15:03:05 +0200200 rtc::StreamResult Write(const void* data,
201 size_t data_len,
202 size_t* written,
203 int* error) override;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000204
jbauche488a0d2015-11-19 05:17:58 -0800205 void Close() override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100206 RTC_LOG(LS_INFO) << "Closing outbound stream";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000207 out_->Close();
208 }
209
jbauche488a0d2015-11-19 05:17:58 -0800210 protected:
211 SSLStreamAdapterTestBase* test_base_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000212 const std::string side_;
jbauche488a0d2015-11-19 05:17:58 -0800213 rtc::StreamInterface* in_;
214 rtc::StreamInterface* out_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000215 bool first_packet_;
216};
217
jbauche488a0d2015-11-19 05:17:58 -0800218class SSLDummyStreamTLS : public SSLDummyStreamBase {
219 public:
220 SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
221 const std::string& side,
222 rtc::FifoBuffer* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200223 rtc::FifoBuffer* out)
224 : SSLDummyStreamBase(test, side, in, out) {}
jbauche488a0d2015-11-19 05:17:58 -0800225};
226
Yves Gerey665174f2018-06-19 15:03:05 +0200227class BufferQueueStream : public rtc::BufferQueue, public rtc::StreamInterface {
jbauche488a0d2015-11-19 05:17:58 -0800228 public:
229 BufferQueueStream(size_t capacity, size_t default_size)
Yves Gerey665174f2018-06-19 15:03:05 +0200230 : rtc::BufferQueue(capacity, default_size) {}
jbauche488a0d2015-11-19 05:17:58 -0800231
232 // Implementation of abstract StreamInterface methods.
233
234 // A buffer queue stream is always "open".
235 rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
236
237 // Reading a buffer queue stream will either succeed or block.
Yves Gerey665174f2018-06-19 15:03:05 +0200238 rtc::StreamResult Read(void* buffer,
239 size_t buffer_len,
240 size_t* read,
241 int* error) override {
jbauche488a0d2015-11-19 05:17:58 -0800242 if (!ReadFront(buffer, buffer_len, read)) {
243 return rtc::SR_BLOCK;
244 }
245 return rtc::SR_SUCCESS;
246 }
247
248 // Writing to a buffer queue stream will either succeed or block.
Yves Gerey665174f2018-06-19 15:03:05 +0200249 rtc::StreamResult Write(const void* data,
250 size_t data_len,
251 size_t* written,
252 int* error) override {
jbauche488a0d2015-11-19 05:17:58 -0800253 if (!WriteBack(data, data_len, written)) {
254 return rtc::SR_BLOCK;
255 }
256 return rtc::SR_SUCCESS;
257 }
258
259 // A buffer queue stream can not be closed.
260 void Close() override {}
261
262 protected:
Yves Gerey665174f2018-06-19 15:03:05 +0200263 void NotifyReadableForTest() override { PostEvent(rtc::SE_READ, 0); }
jbauche488a0d2015-11-19 05:17:58 -0800264
Yves Gerey665174f2018-06-19 15:03:05 +0200265 void NotifyWritableForTest() override { PostEvent(rtc::SE_WRITE, 0); }
jbauche488a0d2015-11-19 05:17:58 -0800266};
267
268class SSLDummyStreamDTLS : public SSLDummyStreamBase {
269 public:
270 SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
271 const std::string& side,
272 BufferQueueStream* in,
Yves Gerey665174f2018-06-19 15:03:05 +0200273 BufferQueueStream* out)
274 : SSLDummyStreamBase(test, side, in, out) {}
jbauche488a0d2015-11-19 05:17:58 -0800275};
276
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000277static const int kFifoBufferSize = 4096;
jbauche488a0d2015-11-19 05:17:58 -0800278static const int kBufferCapacity = 1;
279static const size_t kDefaultBufferSize = 2048;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000280
281class SSLStreamAdapterTestBase : public testing::Test,
282 public sigslot::has_slots<> {
283 public:
torbjorng4e572472015-10-08 09:42:49 -0700284 SSLStreamAdapterTestBase(
285 const std::string& client_cert_pem,
286 const std::string& client_private_key_pem,
287 bool dtls,
Benjamin Wright7276b972019-03-06 11:51:34 -0800288 bool legacy_tls_protocols = false,
torbjorng4e572472015-10-08 09:42:49 -0700289 rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
290 rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
jbauche488a0d2015-11-19 05:17:58 -0800291 : client_cert_pem_(client_cert_pem),
292 client_private_key_pem_(client_private_key_pem),
293 client_key_type_(client_key_type),
294 server_key_type_(server_key_type),
deadbeef37f5ecf2017-02-27 14:06:41 -0800295 client_stream_(nullptr),
296 server_stream_(nullptr),
297 client_identity_(nullptr),
298 server_identity_(nullptr),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200299 delay_(0),
300 mtu_(1460),
301 loss_(0),
302 lose_first_packet_(false),
303 damage_(false),
304 dtls_(dtls),
305 handshake_wait_(5000),
Benjamin Wright7276b972019-03-06 11:51:34 -0800306 identities_set_(false),
307 legacy_tls_protocols_(legacy_tls_protocols) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000308 // Set use of the test RNG to get predictable loss patterns.
309 rtc::SetRandomTestMode(true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000310 }
311
Steve Anton9de3aac2017-10-24 10:08:26 -0700312 ~SSLStreamAdapterTestBase() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000313 // Put it back for the next test.
314 rtc::SetRandomTestMode(false);
315 }
316
torbjorng7593aad2015-11-19 12:20:51 -0800317 void SetUp() override {
jbauche488a0d2015-11-19 05:17:58 -0800318 CreateStreams();
319
Benjamin Wright7276b972019-03-06 11:51:34 -0800320 // Enable legacy protocols if required
321 webrtc::test::ScopedFieldTrials trial(
322 legacy_tls_protocols_ ? "WebRTC-LegacyTlsProtocols/Enabled/" : "");
323
jbauche488a0d2015-11-19 05:17:58 -0800324 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
325 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
326
327 // Set up the slots
328 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
329 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
330
331 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
332 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
333 client_private_key_pem_, client_cert_pem_);
334 } else {
335 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
336 }
337 server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
338
339 client_ssl_->SetIdentity(client_identity_);
340 server_ssl_->SetIdentity(server_identity_);
341 }
342
torbjorng7593aad2015-11-19 12:20:51 -0800343 void TearDown() override {
jbauche488a0d2015-11-19 05:17:58 -0800344 client_ssl_.reset(nullptr);
345 server_ssl_.reset(nullptr);
346 }
347
348 virtual void CreateStreams() = 0;
349
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000350 // Recreate the client/server identities with the specified validity period.
351 // |not_before| and |not_after| are offsets from the current time in number
352 // of seconds.
353 void ResetIdentitiesWithValidity(int not_before, int not_after) {
jbauche488a0d2015-11-19 05:17:58 -0800354 CreateStreams();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355
356 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
357 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
358
359 client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
360 server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
361
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100362 time_t now = time(nullptr);
363
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000364 rtc::SSLIdentityParams client_params;
torbjorng4e572472015-10-08 09:42:49 -0700365 client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000366 client_params.common_name = "client";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100367 client_params.not_before = now + not_before;
368 client_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000369 client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
370
371 rtc::SSLIdentityParams server_params;
torbjorng4e572472015-10-08 09:42:49 -0700372 server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373 server_params.common_name = "server";
Torbjorn Granlund46c9cc02015-12-01 13:06:34 +0100374 server_params.not_before = now + not_before;
375 server_params.not_after = now + not_after;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000376 server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
377
378 client_ssl_->SetIdentity(client_identity_);
379 server_ssl_->SetIdentity(server_identity_);
380 }
381
Yves Gerey665174f2018-06-19 15:03:05 +0200382 virtual void OnEvent(rtc::StreamInterface* stream, int sig, int err) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100383 RTC_LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000384
385 if (sig & rtc::SE_READ) {
386 ReadData(stream);
387 }
388
389 if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
390 WriteData();
391 }
392 }
393
deadbeef89824f62016-09-30 11:55:43 -0700394 void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
395 unsigned char server_digest[20];
396 size_t server_digest_len;
397 unsigned char client_digest[20];
398 size_t client_digest_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000399 bool rv;
deadbeef89824f62016-09-30 11:55:43 -0700400 rtc::SSLPeerCertificateDigestError err;
401 rtc::SSLPeerCertificateDigestError expected_err =
402 expect_success
403 ? rtc::SSLPeerCertificateDigestError::NONE
404 : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000405
Mirko Bonadei675513b2017-11-09 11:09:25 +0100406 RTC_LOG(LS_INFO) << "Setting peer identities by digest";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000407
deadbeef89824f62016-09-30 11:55:43 -0700408 rv = server_identity_->certificate().ComputeDigest(
409 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000410 ASSERT_TRUE(rv);
deadbeef89824f62016-09-30 11:55:43 -0700411 rv = client_identity_->certificate().ComputeDigest(
412 rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
413 ASSERT_TRUE(rv);
414
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000415 if (!correct) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100416 RTC_LOG(LS_INFO) << "Setting bogus digest for server cert";
deadbeef89824f62016-09-30 11:55:43 -0700417 server_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000418 }
deadbeef89824f62016-09-30 11:55:43 -0700419 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
420 server_digest_len, &err);
421 EXPECT_EQ(expected_err, err);
422 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000423
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000424 if (!correct) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100425 RTC_LOG(LS_INFO) << "Setting bogus digest for client cert";
deadbeef89824f62016-09-30 11:55:43 -0700426 client_digest[0]++;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000427 }
deadbeef89824f62016-09-30 11:55:43 -0700428 rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
429 client_digest_len, &err);
430 EXPECT_EQ(expected_err, err);
431 EXPECT_EQ(expect_success, rv);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000432
433 identities_set_ = true;
434 }
435
Joachim Bauch831c5582015-05-20 12:48:41 +0200436 void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
437 rtc::SSLProtocolVersion client_version) {
438 server_ssl_->SetMaxProtocolVersion(server_version);
439 client_ssl_->SetMaxProtocolVersion(client_version);
440 }
441
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000442 void TestHandshake(bool expect_success = true) {
Yves Gerey665174f2018-06-19 15:03:05 +0200443 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
444 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000445
446 if (!dtls_) {
447 // Make sure we simulate a reliable network for TLS.
448 // This is just a check to make sure that people don't write wrong
449 // tests.
nissec16fa5e2017-02-07 07:18:43 -0800450 RTC_CHECK_EQ(1460, mtu_);
451 RTC_CHECK(!loss_);
452 RTC_CHECK(!lose_first_packet_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000453 }
454
455 if (!identities_set_)
deadbeef89824f62016-09-30 11:55:43 -0700456 SetPeerIdentitiesByDigest(true, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000457
458 // Start the handshake
459 int rv;
460
461 server_ssl_->SetServerRole();
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700462 rv = server_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000463 ASSERT_EQ(0, rv);
464
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700465 rv = client_ssl_->StartSSL();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000466 ASSERT_EQ(0, rv);
467
468 // Now run the handshake
469 if (expect_success) {
Yves Gerey665174f2018-06-19 15:03:05 +0200470 EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN) &&
471 (server_ssl_->GetState() == rtc::SS_OPEN),
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000472 handshake_wait_);
473 } else {
474 EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
475 handshake_wait_);
476 }
477 }
478
deadbeef89824f62016-09-30 11:55:43 -0700479 // This tests that the handshake can complete before the identity is
480 // verified, and the identity will be verified after the fact.
481 void TestHandshakeWithDelayedIdentity(bool valid_identity) {
482 server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
483 client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
484
485 if (!dtls_) {
486 // Make sure we simulate a reliable network for TLS.
487 // This is just a check to make sure that people don't write wrong
488 // tests.
nissec16fa5e2017-02-07 07:18:43 -0800489 RTC_CHECK_EQ(1460, mtu_);
490 RTC_CHECK(!loss_);
491 RTC_CHECK(!lose_first_packet_);
deadbeef89824f62016-09-30 11:55:43 -0700492 }
493
494 // Start the handshake
495 int rv;
496
497 server_ssl_->SetServerRole();
498 rv = server_ssl_->StartSSL();
499 ASSERT_EQ(0, rv);
500
501 rv = client_ssl_->StartSSL();
502 ASSERT_EQ(0, rv);
503
504 // Now run the handshake.
505 EXPECT_TRUE_WAIT(
506 client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
507 handshake_wait_);
508
509 // Until the identity has been verified, the state should still be
510 // SS_OPENING and writes should return SR_BLOCK.
511 EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
512 EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
513 unsigned char packet[1];
514 size_t sent;
515 EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
516 EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
517
518 // If we set an invalid identity at this point, SetPeerCertificateDigest
519 // should return false.
520 SetPeerIdentitiesByDigest(valid_identity, valid_identity);
521 // State should then transition to SS_OPEN or SS_CLOSED based on validation
522 // of the identity.
523 if (valid_identity) {
524 EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
525 EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
526 } else {
527 EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
528 EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
529 }
530 }
531
Yves Gerey665174f2018-06-19 15:03:05 +0200532 rtc::StreamResult DataWritten(SSLDummyStreamBase* from,
533 const void* data,
534 size_t data_len,
535 size_t* written,
536 int* error) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000537 // Randomly drop loss_ percent of packets
Peter Boström0c4e06b2015-10-07 12:23:21 +0200538 if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100539 RTC_LOG(LS_VERBOSE) << "Randomly dropping packet, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000540 *written = data_len;
541 return rtc::SR_SUCCESS;
542 }
543 if (dtls_ && (data_len > mtu_)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100544 RTC_LOG(LS_VERBOSE) << "Dropping packet > mtu, size=" << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000545 *written = data_len;
546 return rtc::SR_SUCCESS;
547 }
548
549 // Optionally damage application data (type 23). Note that we don't damage
550 // handshake packets and we damage the last byte to keep the header
551 // intact but break the MAC.
Yves Gerey665174f2018-06-19 15:03:05 +0200552 if (damage_ && (*static_cast<const unsigned char*>(data) == 23)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000553 std::vector<char> buf(data_len);
554
Mirko Bonadei675513b2017-11-09 11:09:25 +0100555 RTC_LOG(LS_VERBOSE) << "Damaging packet";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000556
557 memcpy(&buf[0], data, data_len);
558 buf[data_len - 1]++;
559
560 return from->WriteData(&buf[0], data_len, written, error);
561 }
562
563 return from->WriteData(data, data_len, written, error);
564 }
565
Yves Gerey665174f2018-06-19 15:03:05 +0200566 void SetDelay(int delay) { delay_ = delay; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000567 int GetDelay() { return delay_; }
568
Yves Gerey665174f2018-06-19 15:03:05 +0200569 void SetLoseFirstPacket(bool lose) { lose_first_packet_ = lose; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000570 bool GetLoseFirstPacket() { return lose_first_packet_; }
571
Yves Gerey665174f2018-06-19 15:03:05 +0200572 void SetLoss(int percent) { loss_ = percent; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000573
Yves Gerey665174f2018-06-19 15:03:05 +0200574 void SetDamage() { damage_ = true; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000575
Yves Gerey665174f2018-06-19 15:03:05 +0200576 void SetMtu(size_t mtu) { mtu_ = mtu; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000577
Yves Gerey665174f2018-06-19 15:03:05 +0200578 void SetHandshakeWait(int wait) { handshake_wait_ = wait; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000579
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800580 void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000581 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800582 client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000583 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800584 server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000585 }
586
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800587 bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000588 if (client)
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800589 return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000590 else
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800591 return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000592 }
593
jbauch555604a2016-04-26 03:13:22 -0700594 std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800595 std::unique_ptr<rtc::SSLCertChain> chain;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000596 if (client)
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800597 chain = client_ssl_->GetPeerSSLCertChain();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000598 else
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800599 chain = server_ssl_->GetPeerSSLCertChain();
Steve Antonf25303e2018-10-16 15:23:31 -0700600 return (chain && chain->GetSize()) ? chain->Get(0).Clone() : nullptr;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000601 }
602
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -0700603 bool GetSslCipherSuite(bool client, int* retval) {
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000604 if (client)
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700605 return client_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000606 else
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700607 return server_ssl_->GetSslCipherSuite(retval);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000608 }
609
torbjorng43166b82016-03-11 00:06:47 -0800610 int GetSslVersion(bool client) {
611 if (client)
612 return client_ssl_->GetSslVersion();
613 else
614 return server_ssl_->GetSslVersion();
615 }
616
Yves Gerey665174f2018-06-19 15:03:05 +0200617 bool ExportKeyingMaterial(const char* label,
618 const unsigned char* context,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000619 size_t context_len,
620 bool use_context,
621 bool client,
Yves Gerey665174f2018-06-19 15:03:05 +0200622 unsigned char* result,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000623 size_t result_len) {
624 if (client)
Yves Gerey665174f2018-06-19 15:03:05 +0200625 return client_ssl_->ExportKeyingMaterial(label, context, context_len,
626 use_context, result, result_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000627 else
Yves Gerey665174f2018-06-19 15:03:05 +0200628 return server_ssl_->ExportKeyingMaterial(label, context, context_len,
629 use_context, result, result_len);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000630 }
631
632 // To be implemented by subclasses.
633 virtual void WriteData() = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200634 virtual void ReadData(rtc::StreamInterface* stream) = 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000635 virtual void TestTransfer(int size) = 0;
636
637 protected:
jbauche488a0d2015-11-19 05:17:58 -0800638 std::string client_cert_pem_;
639 std::string client_private_key_pem_;
640 rtc::KeyParams client_key_type_;
641 rtc::KeyParams server_key_type_;
Yves Gerey665174f2018-06-19 15:03:05 +0200642 SSLDummyStreamBase* client_stream_; // freed by client_ssl_ destructor
643 SSLDummyStreamBase* server_stream_; // freed by server_ssl_ destructor
jbauch555604a2016-04-26 03:13:22 -0700644 std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
645 std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
Yves Gerey665174f2018-06-19 15:03:05 +0200646 rtc::SSLIdentity* client_identity_; // freed by client_ssl_ destructor
647 rtc::SSLIdentity* server_identity_; // freed by server_ssl_ destructor
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000648 int delay_;
649 size_t mtu_;
650 int loss_;
651 bool lose_first_packet_;
652 bool damage_;
653 bool dtls_;
654 int handshake_wait_;
655 bool identities_set_;
Benjamin Wright7276b972019-03-06 11:51:34 -0800656 bool legacy_tls_protocols_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000657};
658
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200659class SSLStreamAdapterTestTLS
660 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700661 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000662 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200663 SSLStreamAdapterTestTLS()
664 : SSLStreamAdapterTestBase("",
665 "",
666 false,
Benjamin Wright7276b972019-03-06 11:51:34 -0800667 false,
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200668 ::testing::get<0>(GetParam()),
jbauche488a0d2015-11-19 05:17:58 -0800669 ::testing::get<1>(GetParam())),
670 client_buffer_(kFifoBufferSize),
Yves Gerey665174f2018-06-19 15:03:05 +0200671 server_buffer_(kFifoBufferSize) {}
jbauche488a0d2015-11-19 05:17:58 -0800672
torbjorng7593aad2015-11-19 12:20:51 -0800673 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800674 client_stream_ =
675 new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
676 server_stream_ =
677 new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
678 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000679
680 // Test data transfer for TLS
nisseef8b61e2016-04-29 06:09:15 -0700681 void TestTransfer(int size) override {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100682 RTC_LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000683 // Create some dummy data to send.
684 size_t received;
685
686 send_stream_.ReserveSize(size);
687 for (int i = 0; i < size; ++i) {
688 char ch = static_cast<char>(i);
deadbeef37f5ecf2017-02-27 14:06:41 -0800689 send_stream_.Write(&ch, 1, nullptr, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000690 }
691 send_stream_.Rewind();
692
693 // Prepare the receive stream.
694 recv_stream_.ReserveSize(size);
695
696 // Start sending
697 WriteData();
698
699 // Wait for the client to close
700 EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
701
702 // Now check the data
703 recv_stream_.GetSize(&received);
704
705 EXPECT_EQ(static_cast<size_t>(size), received);
Yves Gerey665174f2018-06-19 15:03:05 +0200706 EXPECT_EQ(0,
707 memcmp(send_stream_.GetBuffer(), recv_stream_.GetBuffer(), size));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000708 }
709
nisseef8b61e2016-04-29 06:09:15 -0700710 void WriteData() override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000711 size_t position, tosend, size;
712 rtc::StreamResult rv;
713 size_t sent;
714 char block[kBlockSize];
715
716 send_stream_.GetSize(&size);
717 if (!size)
718 return;
719
720 for (;;) {
721 send_stream_.GetPosition(&position);
deadbeef37f5ecf2017-02-27 14:06:41 -0800722 if (send_stream_.Read(block, sizeof(block), &tosend, nullptr) !=
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000723 rtc::SR_EOS) {
724 rv = client_ssl_->Write(block, tosend, &sent, 0);
725
726 if (rv == rtc::SR_SUCCESS) {
727 send_stream_.SetPosition(position + sent);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100728 RTC_LOG(LS_VERBOSE) << "Sent: " << position + sent;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000729 } else if (rv == rtc::SR_BLOCK) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100730 RTC_LOG(LS_VERBOSE) << "Blocked...";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000731 send_stream_.SetPosition(position);
732 break;
733 } else {
734 ADD_FAILURE();
735 break;
736 }
737 } else {
738 // Now close
Mirko Bonadei675513b2017-11-09 11:09:25 +0100739 RTC_LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000740 client_ssl_->Close();
741 break;
742 }
743 }
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100744 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000745
Yves Gerey665174f2018-06-19 15:03:05 +0200746 void ReadData(rtc::StreamInterface* stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000747 char buffer[1600];
748 size_t bread;
749 int err2;
750 rtc::StreamResult r;
751
752 for (;;) {
753 r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
754
755 if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
756 // Unfortunately, errors are the way that the stream adapter
torbjorng7593aad2015-11-19 12:20:51 -0800757 // signals close in OpenSSL.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000758 stream->Close();
759 return;
760 }
761
762 if (r == rtc::SR_BLOCK)
763 break;
764
765 ASSERT_EQ(rtc::SR_SUCCESS, r);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100766 RTC_LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000767
deadbeef37f5ecf2017-02-27 14:06:41 -0800768 recv_stream_.Write(buffer, bread, nullptr, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000769 }
770 }
771
772 private:
jbauche488a0d2015-11-19 05:17:58 -0800773 rtc::FifoBuffer client_buffer_;
774 rtc::FifoBuffer server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000775 rtc::MemoryStream send_stream_;
776 rtc::MemoryStream recv_stream_;
777};
778
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200779class SSLStreamAdapterTestDTLS
780 : public SSLStreamAdapterTestBase,
torbjorng4e572472015-10-08 09:42:49 -0700781 public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000782 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200783 SSLStreamAdapterTestDTLS()
Benjamin Wright7276b972019-03-06 11:51:34 -0800784 : SSLStreamAdapterTestDTLS(/*legacy_tls_protocols=*/false) {}
785
786 SSLStreamAdapterTestDTLS(bool legacy_tls_protocols)
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200787 : SSLStreamAdapterTestBase("",
788 "",
789 true,
Benjamin Wright7276b972019-03-06 11:51:34 -0800790 legacy_tls_protocols,
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200791 ::testing::get<0>(GetParam()),
792 ::testing::get<1>(GetParam())),
jbauche488a0d2015-11-19 05:17:58 -0800793 client_buffer_(kBufferCapacity, kDefaultBufferSize),
794 server_buffer_(kBufferCapacity, kDefaultBufferSize),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200795 packet_size_(1000),
796 count_(0),
797 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000798
799 SSLStreamAdapterTestDTLS(const std::string& cert_pem,
Yves Gerey665174f2018-06-19 15:03:05 +0200800 const std::string& private_key_pem)
801 : SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
802 client_buffer_(kBufferCapacity, kDefaultBufferSize),
803 server_buffer_(kBufferCapacity, kDefaultBufferSize),
804 packet_size_(1000),
805 count_(0),
806 sent_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000807
torbjorng7593aad2015-11-19 12:20:51 -0800808 void CreateStreams() override {
jbauche488a0d2015-11-19 05:17:58 -0800809 client_stream_ =
810 new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
811 server_stream_ =
812 new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
813 }
814
nisseef8b61e2016-04-29 06:09:15 -0700815 void WriteData() override {
Yves Gerey665174f2018-06-19 15:03:05 +0200816 unsigned char* packet = new unsigned char[1600];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000817
jbauche488a0d2015-11-19 05:17:58 -0800818 while (sent_ < count_) {
torbjorng7593aad2015-11-19 12:20:51 -0800819 unsigned int rand_state = sent_;
820 packet[0] = sent_;
821 for (size_t i = 1; i < packet_size_; i++) {
822 // This is a simple LC PRNG. Keep in synch with identical code below.
823 rand_state = (rand_state * 251 + 19937) >> 7;
824 packet[i] = rand_state & 0xff;
825 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000826
827 size_t sent;
torbjorng7593aad2015-11-19 12:20:51 -0800828 rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000829 if (rv == rtc::SR_SUCCESS) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100830 RTC_LOG(LS_VERBOSE) << "Sent: " << sent_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000831 sent_++;
832 } else if (rv == rtc::SR_BLOCK) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100833 RTC_LOG(LS_VERBOSE) << "Blocked...";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000834 break;
835 } else {
836 ADD_FAILURE();
837 break;
838 }
jbauche488a0d2015-11-19 05:17:58 -0800839 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000840
Yves Gerey665174f2018-06-19 15:03:05 +0200841 delete[] packet;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000842 }
843
Yves Gerey665174f2018-06-19 15:03:05 +0200844 void ReadData(rtc::StreamInterface* stream) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000845 unsigned char buffer[2000];
846 size_t bread;
847 int err2;
848 rtc::StreamResult r;
849
850 for (;;) {
851 r = stream->Read(buffer, 2000, &bread, &err2);
852
853 if (r == rtc::SR_ERROR) {
854 // Unfortunately, errors are the way that the stream adapter
855 // signals close right now
856 stream->Close();
857 return;
858 }
859
860 if (r == rtc::SR_BLOCK)
861 break;
862
863 ASSERT_EQ(rtc::SR_SUCCESS, r);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100864 RTC_LOG(LS_VERBOSE) << "Read " << bread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000865
866 // Now parse the datagram
867 ASSERT_EQ(packet_size_, bread);
torbjorng7593aad2015-11-19 12:20:51 -0800868 unsigned char packet_num = buffer[0];
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000869
torbjorng7593aad2015-11-19 12:20:51 -0800870 unsigned int rand_state = packet_num;
871 for (size_t i = 1; i < packet_size_; i++) {
872 // This is a simple LC PRNG. Keep in synch with identical code above.
873 rand_state = (rand_state * 251 + 19937) >> 7;
874 ASSERT_EQ(rand_state & 0xff, buffer[i]);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000875 }
876 received_.insert(packet_num);
877 }
878 }
879
nisseef8b61e2016-04-29 06:09:15 -0700880 void TestTransfer(int count) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000881 count_ = count;
882
883 WriteData();
884
885 EXPECT_TRUE_WAIT(sent_ == count_, 10000);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100886 RTC_LOG(LS_INFO) << "sent_ == " << sent_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000887
888 if (damage_) {
889 WAIT(false, 2000);
890 EXPECT_EQ(0U, received_.size());
891 } else if (loss_ == 0) {
Yves Gerey665174f2018-06-19 15:03:05 +0200892 EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000893 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100894 RTC_LOG(LS_INFO) << "Sent " << sent_ << " packets; received "
895 << received_.size();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000896 }
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100897 }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000898
899 private:
jbauche488a0d2015-11-19 05:17:58 -0800900 BufferQueueStream client_buffer_;
901 BufferQueueStream server_buffer_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000902 size_t packet_size_;
903 int count_;
904 int sent_;
905 std::set<int> received_;
906};
907
Yves Gerey665174f2018-06-19 15:03:05 +0200908rtc::StreamResult SSLDummyStreamBase::Write(const void* data,
909 size_t data_len,
910 size_t* written,
911 int* error) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100912 RTC_LOG(LS_VERBOSE) << "Writing to loopback " << data_len;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000913
914 if (first_packet_) {
915 first_packet_ = false;
jbauche488a0d2015-11-19 05:17:58 -0800916 if (test_base_->GetLoseFirstPacket()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100917 RTC_LOG(LS_INFO) << "Losing initial packet of length " << data_len;
torbjorng7593aad2015-11-19 12:20:51 -0800918 *written = data_len; // Fake successful writing also to writer.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000919 return rtc::SR_SUCCESS;
920 }
921 }
922
jbauche488a0d2015-11-19 05:17:58 -0800923 return test_base_->DataWritten(this, data, data_len, written, error);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100924}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000925
926class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
927 public:
Yves Gerey665174f2018-06-19 15:03:05 +0200928 SSLStreamAdapterTestDTLSFromPEMStrings()
929 : SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000930};
931
Jian Cui0a8798b2017-11-16 16:58:02 -0800932// Test fixture for certificate chaining. Server will push more than one
933// certificate.
934class SSLStreamAdapterTestDTLSCertChain : public SSLStreamAdapterTestDTLS {
935 public:
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100936 SSLStreamAdapterTestDTLSCertChain() : SSLStreamAdapterTestDTLS("", "") {}
Jian Cui0a8798b2017-11-16 16:58:02 -0800937 void SetUp() override {
938 CreateStreams();
939
940 client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
941 server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
942
943 // Set up the slots
944 client_ssl_->SignalEvent.connect(
945 reinterpret_cast<SSLStreamAdapterTestBase*>(this),
946 &SSLStreamAdapterTestBase::OnEvent);
947 server_ssl_->SignalEvent.connect(
948 reinterpret_cast<SSLStreamAdapterTestBase*>(this),
949 &SSLStreamAdapterTestBase::OnEvent);
950
951 if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
952 client_identity_ = rtc::SSLIdentity::FromPEMStrings(
953 client_private_key_pem_, client_cert_pem_);
954 } else {
955 client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
956 }
957
958 client_ssl_->SetIdentity(client_identity_);
959 }
960};
961
Benjamin Wright7276b972019-03-06 11:51:34 -0800962// Enable legacy TLS protocols in DTLS.
963class SSLStreamAdapterTestDTLSLegacyProtocols
964 : public SSLStreamAdapterTestDTLS {
965 public:
966 SSLStreamAdapterTestDTLSLegacyProtocols()
967 : SSLStreamAdapterTestDTLS(/*legacy_tls_protocols=*/true) {}
968};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000969// Basic tests: TLS
970
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000971// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200972TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000973 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +0100974}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000975
Jian Cui0a8798b2017-11-16 16:58:02 -0800976TEST_P(SSLStreamAdapterTestTLS, GetPeerCertChainWithOneCertificate) {
977 TestHandshake();
978 std::unique_ptr<rtc::SSLCertChain> cert_chain =
979 client_ssl_->GetPeerSSLCertChain();
Jian Cui0a8798b2017-11-16 16:58:02 -0800980 ASSERT_NE(nullptr, cert_chain);
981 EXPECT_EQ(1u, cert_chain->GetSize());
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800982 EXPECT_EQ(cert_chain->Get(0).ToPEMString(),
983 server_identity_->certificate().ToPEMString());
Jian Cui0a8798b2017-11-16 16:58:02 -0800984}
985
986TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshake) {
987 server_identity_ = rtc::SSLIdentity::FromPEMChainStrings(
988 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kCACert);
989 server_ssl_->SetIdentity(server_identity_);
990 TestHandshake();
991 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
992 client_ssl_->GetPeerSSLCertChain();
993 ASSERT_NE(nullptr, peer_cert_chain);
994 ASSERT_EQ(2u, peer_cert_chain->GetSize());
995 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
996 EXPECT_EQ(kCACert, peer_cert_chain->Get(1).ToPEMString());
997}
998
David Benjaminea84b6b2017-12-01 17:25:45 -0500999TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshakeWithCopy) {
1000 std::unique_ptr<rtc::SSLIdentity> identity(
1001 rtc::SSLIdentity::FromPEMChainStrings(kRSA_PRIVATE_KEY_PEM,
1002 std::string(kCERT_PEM) + kCACert));
1003 server_identity_ = identity->GetReference();
1004 server_ssl_->SetIdentity(server_identity_);
1005 TestHandshake();
1006 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1007 client_ssl_->GetPeerSSLCertChain();
1008 ASSERT_NE(nullptr, peer_cert_chain);
1009 ASSERT_EQ(2u, peer_cert_chain->GetSize());
1010 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1011 EXPECT_EQ(kCACert, peer_cert_chain->Get(1).ToPEMString());
1012}
1013
Jian Cui0a8798b2017-11-16 16:58:02 -08001014TEST_F(SSLStreamAdapterTestDTLSCertChain, ThreeCertHandshake) {
1015 server_identity_ = rtc::SSLIdentity::FromPEMChainStrings(
1016 kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kIntCert1 + kCACert);
1017 server_ssl_->SetIdentity(server_identity_);
1018 TestHandshake();
1019 std::unique_ptr<rtc::SSLCertChain> peer_cert_chain =
1020 client_ssl_->GetPeerSSLCertChain();
1021 ASSERT_NE(nullptr, peer_cert_chain);
1022 ASSERT_EQ(3u, peer_cert_chain->GetSize());
1023 EXPECT_EQ(kCERT_PEM, peer_cert_chain->Get(0).ToPEMString());
1024 EXPECT_EQ(kIntCert1, peer_cert_chain->Get(1).ToPEMString());
1025 EXPECT_EQ(kCACert, peer_cert_chain->Get(2).ToPEMString());
1026}
1027
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001028// Test that closing the connection on one side updates the other side.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001029TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001030 TestHandshake();
1031 client_ssl_->Close();
1032 EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001033}
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +00001034
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001035// Test transfer -- trivial
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001036TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001037 TestHandshake();
1038 TestTransfer(100000);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001039}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001040
1041// Test read-write after close.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001042TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001043 TestHandshake();
1044 TestTransfer(100000);
1045 client_ssl_->Close();
1046
1047 rtc::StreamResult rv;
1048 char block[kBlockSize];
1049 size_t dummy;
1050
1051 // It's an error to write after closed.
deadbeef37f5ecf2017-02-27 14:06:41 -08001052 rv = client_ssl_->Write(block, sizeof(block), &dummy, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001053 ASSERT_EQ(rtc::SR_ERROR, rv);
1054
1055 // But after closed read gives you EOS.
deadbeef37f5ecf2017-02-27 14:06:41 -08001056 rv = client_ssl_->Read(block, sizeof(block), &dummy, nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001057 ASSERT_EQ(rtc::SR_EOS, rv);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001058}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001059
1060// Test a handshake with a bogus peer digest
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001061TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
deadbeef89824f62016-09-30 11:55:43 -07001062 SetPeerIdentitiesByDigest(false, true);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001063 TestHandshake(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001064}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001065
deadbeef89824f62016-09-30 11:55:43 -07001066TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
1067 TestHandshakeWithDelayedIdentity(true);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001068}
deadbeef89824f62016-09-30 11:55:43 -07001069
1070TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
1071 TestHandshakeWithDelayedIdentity(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001072}
deadbeef89824f62016-09-30 11:55:43 -07001073
1074// Test that the correct error is returned when SetPeerCertificateDigest is
1075// called with an unknown algorithm.
1076TEST_P(SSLStreamAdapterTestTLS,
1077 TestSetPeerCertificateDigestWithUnknownAlgorithm) {
1078 unsigned char server_digest[20];
1079 size_t server_digest_len;
1080 bool rv;
1081 rtc::SSLPeerCertificateDigestError err;
1082
1083 rv = server_identity_->certificate().ComputeDigest(
1084 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
1085 ASSERT_TRUE(rv);
1086
1087 rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
1088 server_digest_len, &err);
1089 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
1090 EXPECT_FALSE(rv);
1091}
1092
1093// Test that the correct error is returned when SetPeerCertificateDigest is
1094// called with an invalid digest length.
1095TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
1096 unsigned char server_digest[20];
1097 size_t server_digest_len;
1098 bool rv;
1099 rtc::SSLPeerCertificateDigestError err;
1100
1101 rv = server_identity_->certificate().ComputeDigest(
1102 rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
1103 ASSERT_TRUE(rv);
1104
1105 rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
1106 server_digest_len - 1, &err);
1107 EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
1108 EXPECT_FALSE(rv);
1109}
1110
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001111// Test moving a bunch of data
1112
1113// Basic tests: DTLS
1114// Test that we can make a handshake work
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001115TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001116 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001117}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001118
1119// Test that we can make a handshake work if the first packet in
1120// each direction is lost. This gives us predictable loss
1121// rather than having to tune random
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001122TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001123 SetLoseFirstPacket(true);
1124 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001125}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001126
1127// Test a handshake with loss and delay
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001128TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001129 SetLoseFirstPacket(true);
1130 SetDelay(2000);
1131 SetHandshakeWait(20000);
1132 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001133}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001134
1135// Test a handshake with small MTU
pbos@webrtc.org127ca3f2014-10-09 07:52:03 +00001136// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001137TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001138 SetMtu(700);
1139 SetHandshakeWait(20000);
1140 TestHandshake();
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001141}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001142
1143// Test transfer -- trivial
jbauche488a0d2015-11-19 05:17:58 -08001144TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001145 TestHandshake();
1146 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001147}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001148
jbauche488a0d2015-11-19 05:17:58 -08001149TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001150 TestHandshake();
1151 SetLoss(10);
1152 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001153}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001154
jbauche488a0d2015-11-19 05:17:58 -08001155TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001156 SetDamage(); // Must be called first because first packet
1157 // write happens at end of handshake.
1158 TestHandshake();
1159 TestTransfer(100);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001160}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001161
deadbeef89824f62016-09-30 11:55:43 -07001162TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
1163 TestHandshakeWithDelayedIdentity(true);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001164}
deadbeef89824f62016-09-30 11:55:43 -07001165
1166TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
1167 TestHandshakeWithDelayedIdentity(false);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001168}
deadbeef89824f62016-09-30 11:55:43 -07001169
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001170// Test DTLS-SRTP with all high ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001171TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001172 std::vector<int> high;
1173 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1174 SetDtlsSrtpCryptoSuites(high, true);
1175 SetDtlsSrtpCryptoSuites(high, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001176 TestHandshake();
1177
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001178 int client_cipher;
1179 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1180 int server_cipher;
1181 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001182
1183 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001184 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001185}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001186
1187// Test DTLS-SRTP with all low ciphers
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001188TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001189 std::vector<int> low;
1190 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1191 SetDtlsSrtpCryptoSuites(low, true);
1192 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001193 TestHandshake();
1194
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001195 int client_cipher;
1196 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1197 int server_cipher;
1198 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001199
1200 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001201 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001202}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001203
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001204// Test DTLS-SRTP with a mismatch -- should not converge
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001205TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001206 std::vector<int> high;
1207 high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1208 std::vector<int> low;
1209 low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1210 SetDtlsSrtpCryptoSuites(high, true);
1211 SetDtlsSrtpCryptoSuites(low, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001212 TestHandshake();
1213
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001214 int client_cipher;
1215 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1216 int server_cipher;
1217 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001218}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001219
1220// Test DTLS-SRTP with each side being mixed -- should select high
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001221TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001222 std::vector<int> mixed;
1223 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
1224 mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
1225 SetDtlsSrtpCryptoSuites(mixed, true);
1226 SetDtlsSrtpCryptoSuites(mixed, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001227 TestHandshake();
1228
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001229 int client_cipher;
1230 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1231 int server_cipher;
1232 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001233
1234 ASSERT_EQ(client_cipher, server_cipher);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001235 ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001236}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001237
jbauchcb560652016-08-04 05:20:32 -07001238// Test DTLS-SRTP with all GCM-128 ciphers.
1239TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
jbauchcb560652016-08-04 05:20:32 -07001240 std::vector<int> gcm128;
1241 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1242 SetDtlsSrtpCryptoSuites(gcm128, true);
1243 SetDtlsSrtpCryptoSuites(gcm128, false);
1244 TestHandshake();
1245
1246 int client_cipher;
1247 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1248 int server_cipher;
1249 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1250
1251 ASSERT_EQ(client_cipher, server_cipher);
1252 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001253}
jbauchcb560652016-08-04 05:20:32 -07001254
1255// Test DTLS-SRTP with all GCM-256 ciphers.
1256TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
jbauchcb560652016-08-04 05:20:32 -07001257 std::vector<int> gcm256;
1258 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1259 SetDtlsSrtpCryptoSuites(gcm256, true);
1260 SetDtlsSrtpCryptoSuites(gcm256, false);
1261 TestHandshake();
1262
1263 int client_cipher;
1264 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1265 int server_cipher;
1266 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1267
1268 ASSERT_EQ(client_cipher, server_cipher);
1269 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001270}
jbauchcb560652016-08-04 05:20:32 -07001271
1272// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
1273TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
jbauchcb560652016-08-04 05:20:32 -07001274 std::vector<int> gcm128;
1275 gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1276 std::vector<int> gcm256;
1277 gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1278 SetDtlsSrtpCryptoSuites(gcm128, true);
1279 SetDtlsSrtpCryptoSuites(gcm256, false);
1280 TestHandshake();
1281
1282 int client_cipher;
1283 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1284 int server_cipher;
1285 ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001286}
jbauchcb560652016-08-04 05:20:32 -07001287
1288// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
1289TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
jbauchcb560652016-08-04 05:20:32 -07001290 std::vector<int> gcmBoth;
1291 gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
1292 gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
1293 SetDtlsSrtpCryptoSuites(gcmBoth, true);
1294 SetDtlsSrtpCryptoSuites(gcmBoth, false);
1295 TestHandshake();
1296
1297 int client_cipher;
1298 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
1299 int server_cipher;
1300 ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
1301
1302 ASSERT_EQ(client_cipher, server_cipher);
1303 ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001304}
jbauchcb560652016-08-04 05:20:32 -07001305
1306// Test SRTP cipher suite lengths.
1307TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
1308 int key_len;
1309 int salt_len;
1310
Yves Gerey665174f2018-06-19 15:03:05 +02001311 ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_INVALID_CRYPTO_SUITE,
1312 &key_len, &salt_len));
jbauchcb560652016-08-04 05:20:32 -07001313
Yves Gerey665174f2018-06-19 15:03:05 +02001314 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AES128_CM_SHA1_32,
1315 &key_len, &salt_len));
1316 ASSERT_EQ(128 / 8, key_len);
1317 ASSERT_EQ(112 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001318
Yves Gerey665174f2018-06-19 15:03:05 +02001319 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AES128_CM_SHA1_80,
1320 &key_len, &salt_len));
1321 ASSERT_EQ(128 / 8, key_len);
1322 ASSERT_EQ(112 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001323
Yves Gerey665174f2018-06-19 15:03:05 +02001324 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AEAD_AES_128_GCM,
1325 &key_len, &salt_len));
1326 ASSERT_EQ(128 / 8, key_len);
1327 ASSERT_EQ(96 / 8, salt_len);
jbauchcb560652016-08-04 05:20:32 -07001328
Yves Gerey665174f2018-06-19 15:03:05 +02001329 ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(rtc::SRTP_AEAD_AES_256_GCM,
1330 &key_len, &salt_len));
1331 ASSERT_EQ(256 / 8, key_len);
1332 ASSERT_EQ(96 / 8, salt_len);
Mirko Bonadeic4dd7302019-02-25 09:12:02 +01001333}
jbauchcb560652016-08-04 05:20:32 -07001334
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001335// Test an exporter
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001336TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001337 TestHandshake();
1338 unsigned char client_out[20];
1339 unsigned char server_out[20];
1340
1341 bool result;
Yves Gerey665174f2018-06-19 15:03:05 +02001342 result = ExportKeyingMaterial(kExporterLabel, kExporterContext,
1343 kExporterContextLen, true, true, client_out,
1344 sizeof(client_out));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001345 ASSERT_TRUE(result);
1346
Yves Gerey665174f2018-06-19 15:03:05 +02001347 result = ExportKeyingMaterial(kExporterLabel, kExporterContext,
1348 kExporterContextLen, true, false, server_out,
1349 sizeof(server_out));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001350 ASSERT_TRUE(result);
1351
1352 ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
1353}
1354
1355// Test not yet valid certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001356TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001357 long one_day = 60 * 60 * 24;
1358 // Make the certificates not valid until one day later.
1359 ResetIdentitiesWithValidity(one_day, one_day);
1360 TestHandshake();
1361}
1362
1363// Test expired certificates are not rejected.
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001364TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001365 long one_day = 60 * 60 * 24;
1366 // Make the certificates already expired.
1367 ResetIdentitiesWithValidity(-one_day, -one_day);
1368 TestHandshake();
1369}
1370
1371// Test data transfer using certs created from strings.
torbjorng7593aad2015-11-19 12:20:51 -08001372TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001373 TestHandshake();
1374 TestTransfer(100);
1375}
1376
1377// Test getting the remote certificate.
torbjorng7593aad2015-11-19 12:20:51 -08001378TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001379 // Peer certificates haven't been received yet.
kwibergb4d01c42016-04-06 05:15:06 -07001380 ASSERT_FALSE(GetPeerCertificate(true));
1381 ASSERT_FALSE(GetPeerCertificate(false));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001382
1383 TestHandshake();
1384
1385 // The client should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001386 std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001387 GetPeerCertificate(true);
1388 ASSERT_TRUE(client_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001389
1390 // It's not kCERT_PEM.
1391 std::string client_peer_string = client_peer_cert->ToPEMString();
1392 ASSERT_NE(kCERT_PEM, client_peer_string);
1393
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001394 // The server should have a peer certificate after the handshake.
jbauch555604a2016-04-26 03:13:22 -07001395 std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
kwibergb4d01c42016-04-06 05:15:06 -07001396 GetPeerCertificate(false);
1397 ASSERT_TRUE(server_peer_cert);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001398
1399 // It's kCERT_PEM
1400 ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001401}
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001402
1403// Test getting the used DTLS ciphers.
Joachim Bauch831c5582015-05-20 12:48:41 +02001404// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
Benjamin Wright7276b972019-03-06 11:51:34 -08001405TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols, TestGetSslCipherSuite) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001406 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001407 TestHandshake();
1408
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001409 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001410 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001411 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001412 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001413
torbjorng43166b82016-03-11 00:06:47 -08001414 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1415 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1416
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001417 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001418 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1419 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001420}
1421
1422// Test getting the used DTLS 1.2 ciphers.
1423// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Benjamin Wright7276b972019-03-06 11:51:34 -08001424TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols,
1425 TestGetSslCipherSuiteDtls12Both) {
1426 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1427 TestHandshake();
1428
1429 int client_cipher;
1430 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1431 int server_cipher;
1432 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1433
1434 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1435 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1436
1437 ASSERT_EQ(client_cipher, server_cipher);
1438 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1439 server_cipher, ::testing::get<1>(GetParam()).type()));
1440}
1441
1442// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
1443TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols,
1444 TestGetSslCipherSuiteDtls12Client) {
1445 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
1446 TestHandshake();
1447
1448 int client_cipher;
1449 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
1450 int server_cipher;
1451 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
1452
1453 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
1454 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
1455
1456 ASSERT_EQ(client_cipher, server_cipher);
1457 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1458 server_cipher, ::testing::get<1>(GetParam()).type()));
1459}
1460
1461// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
1462TEST_P(SSLStreamAdapterTestDTLSLegacyProtocols,
1463 TestGetSslCipherSuiteDtls12Server) {
1464 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
1465 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));
1474
1475 ASSERT_EQ(client_cipher, server_cipher);
1476 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1477 server_cipher, ::testing::get<1>(GetParam()).type()));
1478}
1479
1480// Test getting the used DTLS 1.2 ciphers.
1481// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001482TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
Joachim Bauch831c5582015-05-20 12:48:41 +02001483 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
1484 TestHandshake();
1485
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001486 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001487 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001488 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001489 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001490
torbjorng43166b82016-03-11 00:06:47 -08001491 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1492 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
1493
Joachim Bauch831c5582015-05-20 12:48:41 +02001494 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001495 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1496 server_cipher, ::testing::get<1>(GetParam()).type()));
Joachim Bauch831c5582015-05-20 12:48:41 +02001497}
1498
Benjamin Wright7276b972019-03-06 11:51:34 -08001499// Test getting the used DTLS ciphers.
1500// DTLS 1.0 enabled for client and server, both will be upgraded to DTLS 1.2
1501TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
1502 SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
Joachim Bauch831c5582015-05-20 12:48:41 +02001503 TestHandshake();
1504
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001505 int client_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001506 ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
Guo-wei Shieh6caafbe2015-10-05 12:43:27 -07001507 int server_cipher;
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001508 ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
Joachim Bauch831c5582015-05-20 12:48:41 +02001509
Benjamin Wright7276b972019-03-06 11:51:34 -08001510 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
1511 ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
torbjorng43166b82016-03-11 00:06:47 -08001512
Joachim Bauch831c5582015-05-20 12:48:41 +02001513 ASSERT_EQ(client_cipher, server_cipher);
torbjorng43166b82016-03-11 00:06:47 -08001514 ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
1515 server_cipher, ::testing::get<1>(GetParam()).type()));
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001516}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +02001517
torbjorng4e572472015-10-08 09:42:49 -07001518// The RSA keysizes here might look strange, why not include the RFC's size
1519// 2048?. The reason is test case slowness; testing two sizes to exercise
1520// parametrization is sufficient.
Mirko Bonadeic84f6612019-01-31 12:20:57 +01001521INSTANTIATE_TEST_SUITE_P(
torbjorng4e572472015-10-08 09:42:49 -07001522 SSLStreamAdapterTestsTLS,
1523 SSLStreamAdapterTestTLS,
1524 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1525 rtc::KeyParams::RSA(1152, 65537),
1526 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1527 Values(rtc::KeyParams::RSA(1024, 65537),
1528 rtc::KeyParams::RSA(1152, 65537),
1529 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
Mirko Bonadeic84f6612019-01-31 12:20:57 +01001530INSTANTIATE_TEST_SUITE_P(
torbjorng4e572472015-10-08 09:42:49 -07001531 SSLStreamAdapterTestsDTLS,
1532 SSLStreamAdapterTestDTLS,
1533 Combine(Values(rtc::KeyParams::RSA(1024, 65537),
1534 rtc::KeyParams::RSA(1152, 65537),
1535 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
1536 Values(rtc::KeyParams::RSA(1024, 65537),
1537 rtc::KeyParams::RSA(1152, 65537),
1538 rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));