blob: 51921f143153a171b3573edabd571f265fc9fe22 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#if HAVE_CONFIG_H
12#include "config.h"
13#endif // HAVE_CONFIG_H
14
15#if HAVE_OPENSSL_SSL_H
16
17#include "webrtc/base/opensslstreamadapter.h"
18
19#include <openssl/bio.h>
20#include <openssl/crypto.h>
21#include <openssl/err.h>
22#include <openssl/rand.h>
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +000023#include <openssl/tls1.h>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000024#include <openssl/x509v3.h>
25
26#include <vector>
27
28#include "webrtc/base/common.h"
29#include "webrtc/base/logging.h"
henrike@webrtc.orgd89b69a2014-11-06 17:23:09 +000030#include "webrtc/base/safe_conversions.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031#include "webrtc/base/stream.h"
32#include "webrtc/base/openssl.h"
33#include "webrtc/base/openssladapter.h"
34#include "webrtc/base/openssldigest.h"
35#include "webrtc/base/opensslidentity.h"
36#include "webrtc/base/stringutils.h"
37#include "webrtc/base/thread.h"
38
39namespace rtc {
40
41#if (OPENSSL_VERSION_NUMBER >= 0x10001000L)
42#define HAVE_DTLS_SRTP
43#endif
44
45#ifdef HAVE_DTLS_SRTP
46// SRTP cipher suite table
47struct SrtpCipherMapEntry {
48 const char* external_name;
49 const char* internal_name;
50};
51
52// This isn't elegant, but it's better than an external reference
53static SrtpCipherMapEntry SrtpCipherMap[] = {
54 {"AES_CM_128_HMAC_SHA1_80", "SRTP_AES128_CM_SHA1_80"},
55 {"AES_CM_128_HMAC_SHA1_32", "SRTP_AES128_CM_SHA1_32"},
56 {NULL, NULL}
57};
58#endif
59
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +000060#ifndef OPENSSL_IS_BORINGSSL
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +000061// Cipher name table. Maps internal OpenSSL cipher ids to the RFC name.
62struct SslCipherMapEntry {
63 uint32_t openssl_id;
64 const char* rfc_name;
65};
66
67#define DEFINE_CIPHER_ENTRY_SSL3(name) {SSL3_CK_##name, "TLS_"#name}
68#define DEFINE_CIPHER_ENTRY_TLS1(name) {TLS1_CK_##name, "TLS_"#name}
69
70// There currently is no method available to get a RFC-compliant name for a
71// cipher suite from BoringSSL, so we need to define the mapping manually here.
72// This should go away once BoringSSL supports "SSL_CIPHER_standard_name"
73// (as available in OpenSSL if compiled with tracing enabled) or a similar
74// method.
75static const SslCipherMapEntry kSslCipherMap[] = {
76 // TLS v1.0 ciphersuites from RFC2246.
77 DEFINE_CIPHER_ENTRY_SSL3(RSA_RC4_128_SHA),
78 {SSL3_CK_RSA_DES_192_CBC3_SHA,
79 "TLS_RSA_WITH_3DES_EDE_CBC_SHA"},
80
81 // AES ciphersuites from RFC3268.
82 {TLS1_CK_RSA_WITH_AES_128_SHA,
83 "TLS_RSA_WITH_AES_128_CBC_SHA"},
84 {TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
85 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"},
86 {TLS1_CK_RSA_WITH_AES_256_SHA,
87 "TLS_RSA_WITH_AES_256_CBC_SHA"},
88 {TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
89 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"},
90
91 // ECC ciphersuites from RFC4492.
92 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_RC4_128_SHA),
93 {TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA,
94 "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"},
95 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_128_CBC_SHA),
96 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_256_CBC_SHA),
97
98 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_RC4_128_SHA),
99 {TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA,
100 "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"},
101 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_128_CBC_SHA),
102 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_256_CBC_SHA),
103
104 // TLS v1.2 ciphersuites.
105 {TLS1_CK_RSA_WITH_AES_128_SHA256,
106 "TLS_RSA_WITH_AES_128_CBC_SHA256"},
107 {TLS1_CK_RSA_WITH_AES_256_SHA256,
108 "TLS_RSA_WITH_AES_256_CBC_SHA256"},
109 {TLS1_CK_DHE_RSA_WITH_AES_128_SHA256,
110 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"},
111 {TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
112 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"},
113
114 // TLS v1.2 GCM ciphersuites from RFC5288.
115 DEFINE_CIPHER_ENTRY_TLS1(RSA_WITH_AES_128_GCM_SHA256),
116 DEFINE_CIPHER_ENTRY_TLS1(RSA_WITH_AES_256_GCM_SHA384),
117 DEFINE_CIPHER_ENTRY_TLS1(DHE_RSA_WITH_AES_128_GCM_SHA256),
118 DEFINE_CIPHER_ENTRY_TLS1(DHE_RSA_WITH_AES_256_GCM_SHA384),
119 DEFINE_CIPHER_ENTRY_TLS1(DH_RSA_WITH_AES_128_GCM_SHA256),
120 DEFINE_CIPHER_ENTRY_TLS1(DH_RSA_WITH_AES_256_GCM_SHA384),
121
122 // ECDH HMAC based ciphersuites from RFC5289.
123 {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256,
124 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"},
125 {TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384,
126 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"},
127 {TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
128 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
129 {TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
130 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"},
131
132 // ECDH GCM based ciphersuites from RFC5289.
133 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_128_GCM_SHA256),
134 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_256_GCM_SHA384),
135 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_128_GCM_SHA256),
136 DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_256_GCM_SHA384),
137
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000138 {0, NULL}
139};
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +0000140#endif // #ifndef OPENSSL_IS_BORINGSSL
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000141
142// Default cipher used between OpenSSL/BoringSSL stream adapters.
143// This needs to be updated when the default of the SSL library changes.
Joachim Bauch831c5582015-05-20 12:48:41 +0200144static const char kDefaultSslCipher10[] =
145 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA";
146
147#ifdef OPENSSL_IS_BORINGSSL
148static const char kDefaultSslCipher12[] =
149 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256";
150// Fallback cipher for DTLS 1.2 if hardware-accelerated AES-GCM is unavailable.
151static const char kDefaultSslCipher12NoAesGcm[] =
152 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256";
153#else // !OPENSSL_IS_BORINGSSL
154// OpenSSL sorts differently than BoringSSL, so the default cipher doesn't
155// change between TLS 1.0 and TLS 1.2 with the current setup.
156static const char kDefaultSslCipher12[] =
157 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA";
158#endif
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000159
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000160//////////////////////////////////////////////////////////////////////
161// StreamBIO
162//////////////////////////////////////////////////////////////////////
163
164static int stream_write(BIO* h, const char* buf, int num);
165static int stream_read(BIO* h, char* buf, int size);
166static int stream_puts(BIO* h, const char* str);
167static long stream_ctrl(BIO* h, int cmd, long arg1, void* arg2);
168static int stream_new(BIO* h);
169static int stream_free(BIO* data);
170
davidben@webrtc.org36d5c3c2015-01-22 23:06:17 +0000171// TODO(davidben): This should be const once BoringSSL is assumed.
172static BIO_METHOD methods_stream = {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000173 BIO_TYPE_BIO,
174 "stream",
175 stream_write,
176 stream_read,
177 stream_puts,
178 0,
179 stream_ctrl,
180 stream_new,
181 stream_free,
182 NULL,
183};
184
davidben@webrtc.org36d5c3c2015-01-22 23:06:17 +0000185static BIO_METHOD* BIO_s_stream() { return(&methods_stream); }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000186
187static BIO* BIO_new_stream(StreamInterface* stream) {
188 BIO* ret = BIO_new(BIO_s_stream());
189 if (ret == NULL)
190 return NULL;
191 ret->ptr = stream;
192 return ret;
193}
194
195// bio methods return 1 (or at least non-zero) on success and 0 on failure.
196
197static int stream_new(BIO* b) {
198 b->shutdown = 0;
199 b->init = 1;
200 b->num = 0; // 1 means end-of-stream
201 b->ptr = 0;
202 return 1;
203}
204
205static int stream_free(BIO* b) {
206 if (b == NULL)
207 return 0;
208 return 1;
209}
210
211static int stream_read(BIO* b, char* out, int outl) {
212 if (!out)
213 return -1;
214 StreamInterface* stream = static_cast<StreamInterface*>(b->ptr);
215 BIO_clear_retry_flags(b);
216 size_t read;
217 int error;
218 StreamResult result = stream->Read(out, outl, &read, &error);
219 if (result == SR_SUCCESS) {
henrike@webrtc.orgd89b69a2014-11-06 17:23:09 +0000220 return checked_cast<int>(read);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000221 } else if (result == SR_EOS) {
222 b->num = 1;
223 } else if (result == SR_BLOCK) {
224 BIO_set_retry_read(b);
225 }
226 return -1;
227}
228
229static int stream_write(BIO* b, const char* in, int inl) {
230 if (!in)
231 return -1;
232 StreamInterface* stream = static_cast<StreamInterface*>(b->ptr);
233 BIO_clear_retry_flags(b);
234 size_t written;
235 int error;
236 StreamResult result = stream->Write(in, inl, &written, &error);
237 if (result == SR_SUCCESS) {
henrike@webrtc.orgd89b69a2014-11-06 17:23:09 +0000238 return checked_cast<int>(written);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000239 } else if (result == SR_BLOCK) {
240 BIO_set_retry_write(b);
241 }
242 return -1;
243}
244
245static int stream_puts(BIO* b, const char* str) {
henrike@webrtc.orgd89b69a2014-11-06 17:23:09 +0000246 return stream_write(b, str, checked_cast<int>(strlen(str)));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000247}
248
249static long stream_ctrl(BIO* b, int cmd, long num, void* ptr) {
henrike@webrtc.org14abcc72014-05-16 16:54:44 +0000250 RTC_UNUSED(num);
251 RTC_UNUSED(ptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000252
253 switch (cmd) {
254 case BIO_CTRL_RESET:
255 return 0;
256 case BIO_CTRL_EOF:
257 return b->num;
258 case BIO_CTRL_WPENDING:
259 case BIO_CTRL_PENDING:
260 return 0;
261 case BIO_CTRL_FLUSH:
262 return 1;
Henrik Lundinf4baca52015-06-10 09:45:58 +0200263 case BIO_CTRL_DGRAM_QUERY_MTU:
264 // openssl defaults to mtu=256 unless we return something here.
265 // The handshake doesn't actually need to send packets above 1k,
266 // so this seems like a sensible value that should work in most cases.
267 // Webrtc uses the same value for video packets.
268 return 1200;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000269 default:
270 return 0;
271 }
272}
273
274/////////////////////////////////////////////////////////////////////////////
275// OpenSSLStreamAdapter
276/////////////////////////////////////////////////////////////////////////////
277
278OpenSSLStreamAdapter::OpenSSLStreamAdapter(StreamInterface* stream)
279 : SSLStreamAdapter(stream),
280 state_(SSL_NONE),
281 role_(SSL_CLIENT),
282 ssl_read_needs_write_(false), ssl_write_needs_read_(false),
283 ssl_(NULL), ssl_ctx_(NULL),
284 custom_verification_succeeded_(false),
Joachim Bauch831c5582015-05-20 12:48:41 +0200285 ssl_mode_(SSL_MODE_TLS),
286 ssl_max_version_(SSL_PROTOCOL_TLS_11) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000287}
288
289OpenSSLStreamAdapter::~OpenSSLStreamAdapter() {
290 Cleanup();
291}
292
293void OpenSSLStreamAdapter::SetIdentity(SSLIdentity* identity) {
294 ASSERT(!identity_);
295 identity_.reset(static_cast<OpenSSLIdentity*>(identity));
296}
297
298void OpenSSLStreamAdapter::SetServerRole(SSLRole role) {
299 role_ = role;
300}
301
302bool OpenSSLStreamAdapter::GetPeerCertificate(SSLCertificate** cert) const {
303 if (!peer_certificate_)
304 return false;
305
306 *cert = peer_certificate_->GetReference();
307 return true;
308}
309
310bool OpenSSLStreamAdapter::SetPeerCertificateDigest(const std::string
311 &digest_alg,
312 const unsigned char*
313 digest_val,
314 size_t digest_len) {
315 ASSERT(!peer_certificate_);
316 ASSERT(peer_certificate_digest_algorithm_.size() == 0);
317 ASSERT(ssl_server_name_.empty());
318 size_t expected_len;
319
320 if (!OpenSSLDigest::GetDigestSize(digest_alg, &expected_len)) {
321 LOG(LS_WARNING) << "Unknown digest algorithm: " << digest_alg;
322 return false;
323 }
324 if (expected_len != digest_len)
325 return false;
326
327 peer_certificate_digest_value_.SetData(digest_val, digest_len);
328 peer_certificate_digest_algorithm_ = digest_alg;
329
330 return true;
331}
332
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +0000333#ifndef OPENSSL_IS_BORINGSSL
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000334const char* OpenSSLStreamAdapter::GetRfcSslCipherName(
335 const SSL_CIPHER* cipher) {
336 ASSERT(cipher != NULL);
337 for (const SslCipherMapEntry* entry = kSslCipherMap; entry->rfc_name;
338 ++entry) {
339 if (cipher->id == entry->openssl_id) {
340 return entry->rfc_name;
341 }
342 }
343 return NULL;
344}
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +0000345#endif
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000346
347bool OpenSSLStreamAdapter::GetSslCipher(std::string* cipher) {
348 if (state_ != SSL_CONNECTED)
349 return false;
350
351 const SSL_CIPHER* current_cipher = SSL_get_current_cipher(ssl_);
352 if (current_cipher == NULL) {
353 return false;
354 }
355
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +0000356#ifdef OPENSSL_IS_BORINGSSL
357 char* cipher_name = SSL_CIPHER_get_rfc_name(current_cipher);
358#else
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000359 const char* cipher_name = GetRfcSslCipherName(current_cipher);
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +0000360#endif
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000361 if (cipher_name == NULL) {
362 return false;
363 }
364
365 *cipher = cipher_name;
pthatcher@webrtc.orgf7bb6e72015-02-28 01:41:07 +0000366#ifdef OPENSSL_IS_BORINGSSL
367 OPENSSL_free(cipher_name);
368#endif
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000369 return true;
370}
371
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000372// Key Extractor interface
373bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label,
374 const uint8* context,
375 size_t context_len,
376 bool use_context,
377 uint8* result,
378 size_t result_len) {
379#ifdef HAVE_DTLS_SRTP
380 int i;
381
382 i = SSL_export_keying_material(ssl_, result, result_len,
383 label.c_str(), label.length(),
384 const_cast<uint8 *>(context),
385 context_len, use_context);
386
387 if (i != 1)
388 return false;
389
390 return true;
391#else
392 return false;
393#endif
394}
395
396bool OpenSSLStreamAdapter::SetDtlsSrtpCiphers(
397 const std::vector<std::string>& ciphers) {
398#ifdef HAVE_DTLS_SRTP
399 std::string internal_ciphers;
400
401 if (state_ != SSL_NONE)
402 return false;
403
404 for (std::vector<std::string>::const_iterator cipher = ciphers.begin();
405 cipher != ciphers.end(); ++cipher) {
406 bool found = false;
407 for (SrtpCipherMapEntry *entry = SrtpCipherMap; entry->internal_name;
408 ++entry) {
409 if (*cipher == entry->external_name) {
410 found = true;
411 if (!internal_ciphers.empty())
412 internal_ciphers += ":";
413 internal_ciphers += entry->internal_name;
414 break;
415 }
416 }
417
418 if (!found) {
419 LOG(LS_ERROR) << "Could not find cipher: " << *cipher;
420 return false;
421 }
422 }
423
424 if (internal_ciphers.empty())
425 return false;
426
427 srtp_ciphers_ = internal_ciphers;
428 return true;
429#else
430 return false;
431#endif
432}
433
434bool OpenSSLStreamAdapter::GetDtlsSrtpCipher(std::string* cipher) {
435#ifdef HAVE_DTLS_SRTP
436 ASSERT(state_ == SSL_CONNECTED);
437 if (state_ != SSL_CONNECTED)
438 return false;
439
henrike@webrtc.orgc10ecea2015-01-07 17:59:28 +0000440 const SRTP_PROTECTION_PROFILE *srtp_profile =
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000441 SSL_get_selected_srtp_profile(ssl_);
442
443 if (!srtp_profile)
444 return false;
445
446 for (SrtpCipherMapEntry *entry = SrtpCipherMap;
447 entry->internal_name; ++entry) {
448 if (!strcmp(entry->internal_name, srtp_profile->name)) {
449 *cipher = entry->external_name;
450 return true;
451 }
452 }
453
454 ASSERT(false); // This should never happen
455
456 return false;
457#else
458 return false;
459#endif
460}
461
462int OpenSSLStreamAdapter::StartSSLWithServer(const char* server_name) {
463 ASSERT(server_name != NULL && server_name[0] != '\0');
464 ssl_server_name_ = server_name;
465 return StartSSL();
466}
467
468int OpenSSLStreamAdapter::StartSSLWithPeer() {
469 ASSERT(ssl_server_name_.empty());
470 // It is permitted to specify peer_certificate_ only later.
471 return StartSSL();
472}
473
474void OpenSSLStreamAdapter::SetMode(SSLMode mode) {
475 ASSERT(state_ == SSL_NONE);
476 ssl_mode_ = mode;
477}
478
Joachim Bauch831c5582015-05-20 12:48:41 +0200479void OpenSSLStreamAdapter::SetMaxProtocolVersion(SSLProtocolVersion version) {
480 ASSERT(ssl_ctx_ == NULL);
481 ssl_max_version_ = version;
482}
483
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000484//
485// StreamInterface Implementation
486//
487
488StreamResult OpenSSLStreamAdapter::Write(const void* data, size_t data_len,
489 size_t* written, int* error) {
490 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Write(" << data_len << ")";
491
492 switch (state_) {
493 case SSL_NONE:
494 // pass-through in clear text
495 return StreamAdapterInterface::Write(data, data_len, written, error);
496
497 case SSL_WAIT:
498 case SSL_CONNECTING:
499 return SR_BLOCK;
500
501 case SSL_CONNECTED:
502 break;
503
504 case SSL_ERROR:
505 case SSL_CLOSED:
506 default:
507 if (error)
508 *error = ssl_error_code_;
509 return SR_ERROR;
510 }
511
512 // OpenSSL will return an error if we try to write zero bytes
513 if (data_len == 0) {
514 if (written)
515 *written = 0;
516 return SR_SUCCESS;
517 }
518
519 ssl_write_needs_read_ = false;
520
henrike@webrtc.orgd89b69a2014-11-06 17:23:09 +0000521 int code = SSL_write(ssl_, data, checked_cast<int>(data_len));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000522 int ssl_error = SSL_get_error(ssl_, code);
523 switch (ssl_error) {
524 case SSL_ERROR_NONE:
525 LOG(LS_VERBOSE) << " -- success";
526 ASSERT(0 < code && static_cast<unsigned>(code) <= data_len);
527 if (written)
528 *written = code;
529 return SR_SUCCESS;
530 case SSL_ERROR_WANT_READ:
531 LOG(LS_VERBOSE) << " -- error want read";
532 ssl_write_needs_read_ = true;
533 return SR_BLOCK;
534 case SSL_ERROR_WANT_WRITE:
535 LOG(LS_VERBOSE) << " -- error want write";
536 return SR_BLOCK;
537
538 case SSL_ERROR_ZERO_RETURN:
539 default:
540 Error("SSL_write", (ssl_error ? ssl_error : -1), false);
541 if (error)
542 *error = ssl_error_code_;
543 return SR_ERROR;
544 }
545 // not reached
546}
547
548StreamResult OpenSSLStreamAdapter::Read(void* data, size_t data_len,
549 size_t* read, int* error) {
550 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Read(" << data_len << ")";
551 switch (state_) {
552 case SSL_NONE:
553 // pass-through in clear text
554 return StreamAdapterInterface::Read(data, data_len, read, error);
555
556 case SSL_WAIT:
557 case SSL_CONNECTING:
558 return SR_BLOCK;
559
560 case SSL_CONNECTED:
561 break;
562
563 case SSL_CLOSED:
564 return SR_EOS;
565
566 case SSL_ERROR:
567 default:
568 if (error)
569 *error = ssl_error_code_;
570 return SR_ERROR;
571 }
572
573 // Don't trust OpenSSL with zero byte reads
574 if (data_len == 0) {
575 if (read)
576 *read = 0;
577 return SR_SUCCESS;
578 }
579
580 ssl_read_needs_write_ = false;
581
henrike@webrtc.orgd89b69a2014-11-06 17:23:09 +0000582 int code = SSL_read(ssl_, data, checked_cast<int>(data_len));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000583 int ssl_error = SSL_get_error(ssl_, code);
584 switch (ssl_error) {
585 case SSL_ERROR_NONE:
586 LOG(LS_VERBOSE) << " -- success";
587 ASSERT(0 < code && static_cast<unsigned>(code) <= data_len);
588 if (read)
589 *read = code;
590
591 if (ssl_mode_ == SSL_MODE_DTLS) {
592 // Enforce atomic reads -- this is a short read
593 unsigned int pending = SSL_pending(ssl_);
594
595 if (pending) {
596 LOG(LS_INFO) << " -- short DTLS read. flushing";
597 FlushInput(pending);
598 if (error)
599 *error = SSE_MSG_TRUNC;
600 return SR_ERROR;
601 }
602 }
603 return SR_SUCCESS;
604 case SSL_ERROR_WANT_READ:
605 LOG(LS_VERBOSE) << " -- error want read";
606 return SR_BLOCK;
607 case SSL_ERROR_WANT_WRITE:
608 LOG(LS_VERBOSE) << " -- error want write";
609 ssl_read_needs_write_ = true;
610 return SR_BLOCK;
611 case SSL_ERROR_ZERO_RETURN:
612 LOG(LS_VERBOSE) << " -- remote side closed";
613 return SR_EOS;
614 break;
615 default:
616 LOG(LS_VERBOSE) << " -- error " << code;
617 Error("SSL_read", (ssl_error ? ssl_error : -1), false);
618 if (error)
619 *error = ssl_error_code_;
620 return SR_ERROR;
621 }
622 // not reached
623}
624
625void OpenSSLStreamAdapter::FlushInput(unsigned int left) {
626 unsigned char buf[2048];
627
628 while (left) {
629 // This should always succeed
630 int toread = (sizeof(buf) < left) ? sizeof(buf) : left;
631 int code = SSL_read(ssl_, buf, toread);
632
633 int ssl_error = SSL_get_error(ssl_, code);
634 ASSERT(ssl_error == SSL_ERROR_NONE);
635
636 if (ssl_error != SSL_ERROR_NONE) {
637 LOG(LS_VERBOSE) << " -- error " << code;
638 Error("SSL_read", (ssl_error ? ssl_error : -1), false);
639 return;
640 }
641
642 LOG(LS_VERBOSE) << " -- flushed " << code << " bytes";
643 left -= code;
644 }
645}
646
647void OpenSSLStreamAdapter::Close() {
648 Cleanup();
649 ASSERT(state_ == SSL_CLOSED || state_ == SSL_ERROR);
650 StreamAdapterInterface::Close();
651}
652
653StreamState OpenSSLStreamAdapter::GetState() const {
654 switch (state_) {
655 case SSL_WAIT:
656 case SSL_CONNECTING:
657 return SS_OPENING;
658 case SSL_CONNECTED:
659 return SS_OPEN;
660 default:
661 return SS_CLOSED;
662 };
663 // not reached
664}
665
666void OpenSSLStreamAdapter::OnEvent(StreamInterface* stream, int events,
667 int err) {
668 int events_to_signal = 0;
669 int signal_error = 0;
670 ASSERT(stream == this->stream());
671 if ((events & SE_OPEN)) {
672 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent SE_OPEN";
673 if (state_ != SSL_WAIT) {
674 ASSERT(state_ == SSL_NONE);
675 events_to_signal |= SE_OPEN;
676 } else {
677 state_ = SSL_CONNECTING;
678 if (int err = BeginSSL()) {
679 Error("BeginSSL", err, true);
680 return;
681 }
682 }
683 }
684 if ((events & (SE_READ|SE_WRITE))) {
685 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent"
686 << ((events & SE_READ) ? " SE_READ" : "")
687 << ((events & SE_WRITE) ? " SE_WRITE" : "");
688 if (state_ == SSL_NONE) {
689 events_to_signal |= events & (SE_READ|SE_WRITE);
690 } else if (state_ == SSL_CONNECTING) {
691 if (int err = ContinueSSL()) {
692 Error("ContinueSSL", err, true);
693 return;
694 }
695 } else if (state_ == SSL_CONNECTED) {
696 if (((events & SE_READ) && ssl_write_needs_read_) ||
697 (events & SE_WRITE)) {
698 LOG(LS_VERBOSE) << " -- onStreamWriteable";
699 events_to_signal |= SE_WRITE;
700 }
701 if (((events & SE_WRITE) && ssl_read_needs_write_) ||
702 (events & SE_READ)) {
703 LOG(LS_VERBOSE) << " -- onStreamReadable";
704 events_to_signal |= SE_READ;
705 }
706 }
707 }
708 if ((events & SE_CLOSE)) {
709 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent(SE_CLOSE, " << err << ")";
710 Cleanup();
711 events_to_signal |= SE_CLOSE;
712 // SE_CLOSE is the only event that uses the final parameter to OnEvent().
713 ASSERT(signal_error == 0);
714 signal_error = err;
715 }
716 if (events_to_signal)
717 StreamAdapterInterface::OnEvent(stream, events_to_signal, signal_error);
718}
719
720int OpenSSLStreamAdapter::StartSSL() {
721 ASSERT(state_ == SSL_NONE);
722
723 if (StreamAdapterInterface::GetState() != SS_OPEN) {
724 state_ = SSL_WAIT;
725 return 0;
726 }
727
728 state_ = SSL_CONNECTING;
729 if (int err = BeginSSL()) {
730 Error("BeginSSL", err, false);
731 return err;
732 }
733
734 return 0;
735}
736
737int OpenSSLStreamAdapter::BeginSSL() {
738 ASSERT(state_ == SSL_CONNECTING);
739 // The underlying stream has open. If we are in peer-to-peer mode
740 // then a peer certificate must have been specified by now.
741 ASSERT(!ssl_server_name_.empty() ||
742 !peer_certificate_digest_algorithm_.empty());
743 LOG(LS_INFO) << "BeginSSL: "
744 << (!ssl_server_name_.empty() ? ssl_server_name_ :
745 "with peer");
746
747 BIO* bio = NULL;
748
749 // First set up the context
750 ASSERT(ssl_ctx_ == NULL);
751 ssl_ctx_ = SetupSSLContext();
752 if (!ssl_ctx_)
753 return -1;
754
755 bio = BIO_new_stream(static_cast<StreamInterface*>(stream()));
756 if (!bio)
757 return -1;
758
759 ssl_ = SSL_new(ssl_ctx_);
760 if (!ssl_) {
761 BIO_free(bio);
762 return -1;
763 }
764
765 SSL_set_app_data(ssl_, this);
766
767 SSL_set_bio(ssl_, bio, bio); // the SSL object owns the bio now.
Joachim Baucha3980202015-06-02 23:07:43 +0200768#ifndef OPENSSL_IS_BORINGSSL
Joachim Bauch5ca688b2015-05-20 10:40:15 +0200769 if (ssl_mode_ == SSL_MODE_DTLS) {
770 // Enable read-ahead for DTLS so whole packets are read from internal BIO
Joachim Baucha3980202015-06-02 23:07:43 +0200771 // before parsing. This is done internally by BoringSSL for DTLS.
Joachim Bauch5ca688b2015-05-20 10:40:15 +0200772 SSL_set_read_ahead(ssl_, 1);
773 }
Joachim Baucha3980202015-06-02 23:07:43 +0200774#endif
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000775
776 SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE |
777 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
778
jiayl@webrtc.org11c6bde2014-08-28 16:14:38 +0000779 // Specify an ECDH group for ECDHE ciphers, otherwise they cannot be
780 // negotiated when acting as the server. Use NIST's P-256 which is commonly
781 // supported.
782 EC_KEY* ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
783 if (ecdh == NULL)
784 return -1;
785 SSL_set_options(ssl_, SSL_OP_SINGLE_ECDH_USE);
786 SSL_set_tmp_ecdh(ssl_, ecdh);
787 EC_KEY_free(ecdh);
788
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000789 // Do the connect
790 return ContinueSSL();
791}
792
793int OpenSSLStreamAdapter::ContinueSSL() {
794 LOG(LS_VERBOSE) << "ContinueSSL";
795 ASSERT(state_ == SSL_CONNECTING);
796
797 // Clear the DTLS timer
798 Thread::Current()->Clear(this, MSG_TIMEOUT);
799
800 int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_);
801 int ssl_error;
802 switch (ssl_error = SSL_get_error(ssl_, code)) {
803 case SSL_ERROR_NONE:
804 LOG(LS_VERBOSE) << " -- success";
805
806 if (!SSLPostConnectionCheck(ssl_, ssl_server_name_.c_str(), NULL,
807 peer_certificate_digest_algorithm_)) {
808 LOG(LS_ERROR) << "TLS post connection check failed";
809 return -1;
810 }
811
812 state_ = SSL_CONNECTED;
813 StreamAdapterInterface::OnEvent(stream(), SE_OPEN|SE_READ|SE_WRITE, 0);
814 break;
815
816 case SSL_ERROR_WANT_READ: {
817 LOG(LS_VERBOSE) << " -- error want read";
818 struct timeval timeout;
819 if (DTLSv1_get_timeout(ssl_, &timeout)) {
820 int delay = timeout.tv_sec * 1000 + timeout.tv_usec/1000;
821
822 Thread::Current()->PostDelayed(delay, this, MSG_TIMEOUT, 0);
823 }
824 }
825 break;
826
827 case SSL_ERROR_WANT_WRITE:
828 LOG(LS_VERBOSE) << " -- error want write";
829 break;
830
831 case SSL_ERROR_ZERO_RETURN:
832 default:
833 LOG(LS_VERBOSE) << " -- error " << code;
834 return (ssl_error != 0) ? ssl_error : -1;
835 }
836
837 return 0;
838}
839
840void OpenSSLStreamAdapter::Error(const char* context, int err, bool signal) {
841 LOG(LS_WARNING) << "OpenSSLStreamAdapter::Error("
842 << context << ", " << err << ")";
843 state_ = SSL_ERROR;
844 ssl_error_code_ = err;
845 Cleanup();
846 if (signal)
847 StreamAdapterInterface::OnEvent(stream(), SE_CLOSE, err);
848}
849
850void OpenSSLStreamAdapter::Cleanup() {
851 LOG(LS_INFO) << "Cleanup";
852
853 if (state_ != SSL_ERROR) {
854 state_ = SSL_CLOSED;
855 ssl_error_code_ = 0;
856 }
857
858 if (ssl_) {
jiayl@webrtc.orgf1d751c2014-09-25 16:38:46 +0000859 int ret = SSL_shutdown(ssl_);
860 if (ret < 0) {
861 LOG(LS_WARNING) << "SSL_shutdown failed, error = "
862 << SSL_get_error(ssl_, ret);
863 }
864
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000865 SSL_free(ssl_);
866 ssl_ = NULL;
867 }
868 if (ssl_ctx_) {
869 SSL_CTX_free(ssl_ctx_);
870 ssl_ctx_ = NULL;
871 }
872 identity_.reset();
873 peer_certificate_.reset();
874
875 // Clear the DTLS timer
876 Thread::Current()->Clear(this, MSG_TIMEOUT);
877}
878
879
880void OpenSSLStreamAdapter::OnMessage(Message* msg) {
881 // Process our own messages and then pass others to the superclass
882 if (MSG_TIMEOUT == msg->message_id) {
883 LOG(LS_INFO) << "DTLS timeout expired";
884 DTLSv1_handle_timeout(ssl_);
885 ContinueSSL();
886 } else {
887 StreamInterface::OnMessage(msg);
888 }
889}
890
891SSL_CTX* OpenSSLStreamAdapter::SetupSSLContext() {
892 SSL_CTX *ctx = NULL;
893
Joachim Bauch831c5582015-05-20 12:48:41 +0200894#ifdef OPENSSL_IS_BORINGSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000895 ctx = SSL_CTX_new(ssl_mode_ == SSL_MODE_DTLS ?
Joachim Bauch831c5582015-05-20 12:48:41 +0200896 DTLS_method() : TLS_method());
897 // Version limiting for BoringSSL will be done below.
898#else
899 const SSL_METHOD* method;
900 switch (ssl_max_version_) {
901 case SSL_PROTOCOL_TLS_10:
902 case SSL_PROTOCOL_TLS_11:
903 // OpenSSL doesn't support setting min/max versions, so we always use
904 // (D)TLS 1.0 if a max. version below the max. available is requested.
905 if (ssl_mode_ == SSL_MODE_DTLS) {
906 if (role_ == SSL_CLIENT) {
907 method = DTLSv1_client_method();
908 } else {
909 method = DTLSv1_server_method();
910 }
911 } else {
912 if (role_ == SSL_CLIENT) {
913 method = TLSv1_client_method();
914 } else {
915 method = TLSv1_server_method();
916 }
917 }
918 break;
919 case SSL_PROTOCOL_TLS_12:
920 default:
921 if (ssl_mode_ == SSL_MODE_DTLS) {
922#if (OPENSSL_VERSION_NUMBER >= 0x10002000L)
923 // DTLS 1.2 only available starting from OpenSSL 1.0.2
924 if (role_ == SSL_CLIENT) {
925 method = DTLS_client_method();
926 } else {
927 method = DTLS_server_method();
928 }
929#else
930 if (role_ == SSL_CLIENT) {
931 method = DTLSv1_client_method();
932 } else {
933 method = DTLSv1_server_method();
934 }
935#endif
936 } else {
937#if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
938 // New API only available starting from OpenSSL 1.1.0
939 if (role_ == SSL_CLIENT) {
940 method = TLS_client_method();
941 } else {
942 method = TLS_server_method();
943 }
944#else
945 if (role_ == SSL_CLIENT) {
946 method = SSLv23_client_method();
947 } else {
948 method = SSLv23_server_method();
949 }
950#endif
951 }
952 break;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000953 }
Joachim Bauch831c5582015-05-20 12:48:41 +0200954 ctx = SSL_CTX_new(method);
955#endif // OPENSSL_IS_BORINGSSL
956
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000957 if (ctx == NULL)
958 return NULL;
959
Joachim Bauch831c5582015-05-20 12:48:41 +0200960#ifdef OPENSSL_IS_BORINGSSL
961 SSL_CTX_set_min_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
962 DTLS1_VERSION : TLS1_VERSION);
963 switch (ssl_max_version_) {
964 case SSL_PROTOCOL_TLS_10:
965 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
966 DTLS1_VERSION : TLS1_VERSION);
967 break;
968 case SSL_PROTOCOL_TLS_11:
969 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
970 DTLS1_VERSION : TLS1_1_VERSION);
971 break;
972 case SSL_PROTOCOL_TLS_12:
973 default:
974 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
975 DTLS1_2_VERSION : TLS1_2_VERSION);
976 break;
977 }
978#endif
979
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000980 if (identity_ && !identity_->ConfigureIdentity(ctx)) {
981 SSL_CTX_free(ctx);
982 return NULL;
983 }
984
985#ifdef _DEBUG
986 SSL_CTX_set_info_callback(ctx, OpenSSLAdapter::SSLInfoCallback);
987#endif
988
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000989 int mode = SSL_VERIFY_PEER;
990 if (client_auth_enabled()) {
991 // Require a certificate from the client.
992 // Note: Normally this is always true in production, but it may be disabled
993 // for testing purposes (e.g. SSLAdapter unit tests).
994 mode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
995 }
996
997 SSL_CTX_set_verify(ctx, mode, SSLVerifyCallback);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000998 SSL_CTX_set_verify_depth(ctx, 4);
Joachim Bauch831c5582015-05-20 12:48:41 +0200999 // Select list of available ciphers. Note that !SHA256 and !SHA384 only
1000 // remove HMAC-SHA256 and HMAC-SHA384 cipher suites, not GCM cipher suites
1001 // with SHA256 or SHA384 as the handshake hash.
1002 // This matches the list of SSLClientSocketOpenSSL in Chromium.
1003 SSL_CTX_set_cipher_list(ctx,
1004 "DEFAULT:!NULL:!aNULL:!SHA256:!SHA384:!aECDH:!AESGCM+AES256:!aPSK");
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001005
1006#ifdef HAVE_DTLS_SRTP
1007 if (!srtp_ciphers_.empty()) {
1008 if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_ciphers_.c_str())) {
1009 SSL_CTX_free(ctx);
1010 return NULL;
1011 }
1012 }
1013#endif
1014
1015 return ctx;
1016}
1017
1018int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) {
1019 // Get our SSL structure from the store
1020 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
1021 store,
1022 SSL_get_ex_data_X509_STORE_CTX_idx()));
1023 OpenSSLStreamAdapter* stream =
1024 reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl));
1025
1026 if (stream->peer_certificate_digest_algorithm_.empty()) {
1027 return 0;
1028 }
1029 X509* cert = X509_STORE_CTX_get_current_cert(store);
henrike@webrtc.org4e5f65a2014-06-05 20:40:11 +00001030 int depth = X509_STORE_CTX_get_error_depth(store);
1031
1032 // For now We ignore the parent certificates and verify the leaf against
1033 // the digest.
1034 //
1035 // TODO(jiayl): Verify the chain is a proper chain and report the chain to
1036 // |stream->peer_certificate_|, like what NSS does.
1037 if (depth > 0) {
1038 LOG(LS_INFO) << "Ignored chained certificate at depth " << depth;
1039 return 1;
1040 }
1041
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001042 unsigned char digest[EVP_MAX_MD_SIZE];
1043 size_t digest_length;
1044 if (!OpenSSLCertificate::ComputeDigest(
1045 cert,
1046 stream->peer_certificate_digest_algorithm_,
1047 digest, sizeof(digest),
1048 &digest_length)) {
1049 LOG(LS_WARNING) << "Failed to compute peer cert digest.";
1050 return 0;
1051 }
henrike@webrtc.org4e5f65a2014-06-05 20:40:11 +00001052
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001053 Buffer computed_digest(digest, digest_length);
1054 if (computed_digest != stream->peer_certificate_digest_value_) {
1055 LOG(LS_WARNING) << "Rejected peer certificate due to mismatched digest.";
1056 return 0;
1057 }
1058 // Ignore any verification error if the digest matches, since there is no
1059 // value in checking the validity of a self-signed cert issued by untrusted
1060 // sources.
1061 LOG(LS_INFO) << "Accepted peer certificate.";
henrike@webrtc.org4e5f65a2014-06-05 20:40:11 +00001062
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001063 // Record the peer's certificate.
1064 stream->peer_certificate_.reset(new OpenSSLCertificate(cert));
1065 return 1;
1066}
1067
1068// This code is taken from the "Network Security with OpenSSL"
1069// sample in chapter 5
1070bool OpenSSLStreamAdapter::SSLPostConnectionCheck(SSL* ssl,
1071 const char* server_name,
1072 const X509* peer_cert,
1073 const std::string
1074 &peer_digest) {
1075 ASSERT(server_name != NULL);
1076 bool ok;
1077 if (server_name[0] != '\0') { // traditional mode
1078 ok = OpenSSLAdapter::VerifyServerName(ssl, server_name, ignore_bad_cert());
1079
1080 if (ok) {
1081 ok = (SSL_get_verify_result(ssl) == X509_V_OK ||
1082 custom_verification_succeeded_);
1083 }
1084 } else { // peer-to-peer mode
1085 ASSERT((peer_cert != NULL) || (!peer_digest.empty()));
1086 // no server name validation
1087 ok = true;
1088 }
1089
1090 if (!ok && ignore_bad_cert()) {
1091 LOG(LS_ERROR) << "SSL_get_verify_result(ssl) = "
1092 << SSL_get_verify_result(ssl);
1093 LOG(LS_INFO) << "Other TLS post connection checks failed.";
1094 ok = true;
1095 }
1096
1097 return ok;
1098}
1099
1100bool OpenSSLStreamAdapter::HaveDtls() {
1101 return true;
1102}
1103
1104bool OpenSSLStreamAdapter::HaveDtlsSrtp() {
1105#ifdef HAVE_DTLS_SRTP
1106 return true;
1107#else
1108 return false;
1109#endif
1110}
1111
1112bool OpenSSLStreamAdapter::HaveExporter() {
1113#ifdef HAVE_DTLS_SRTP
1114 return true;
1115#else
1116 return false;
1117#endif
1118}
1119
Joachim Bauch831c5582015-05-20 12:48:41 +02001120std::string OpenSSLStreamAdapter::GetDefaultSslCipher(
1121 SSLProtocolVersion version) {
1122 switch (version) {
1123 case SSL_PROTOCOL_TLS_10:
1124 case SSL_PROTOCOL_TLS_11:
1125 return kDefaultSslCipher10;
1126 case SSL_PROTOCOL_TLS_12:
1127 default:
1128#ifdef OPENSSL_IS_BORINGSSL
1129 if (EVP_has_aes_hardware()) {
1130 return kDefaultSslCipher12;
1131 } else {
1132 return kDefaultSslCipher12NoAesGcm;
1133 }
1134#else // !OPENSSL_IS_BORINGSSL
1135 return kDefaultSslCipher12;
1136#endif
1137 }
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +00001138}
1139
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001140} // namespace rtc
1141
1142#endif // HAVE_OPENSSL_SSL_H