Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Side by Side Diff: webrtc/base/openssladapter.cc

Issue 1808763002: Remove code interfacing legacy openssl. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Further simplifications with boringssl Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/openssladapter.h ('k') | webrtc/base/opensslidentity.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2008 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2008 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 22 matching lines...) Expand all
33 33
34 #include "webrtc/base/arraysize.h" 34 #include "webrtc/base/arraysize.h"
35 #include "webrtc/base/common.h" 35 #include "webrtc/base/common.h"
36 #include "webrtc/base/logging.h" 36 #include "webrtc/base/logging.h"
37 #include "webrtc/base/openssl.h" 37 #include "webrtc/base/openssl.h"
38 #include "webrtc/base/safe_conversions.h" 38 #include "webrtc/base/safe_conversions.h"
39 #include "webrtc/base/sslroots.h" 39 #include "webrtc/base/sslroots.h"
40 #include "webrtc/base/stringutils.h" 40 #include "webrtc/base/stringutils.h"
41 #include "webrtc/base/thread.h" 41 #include "webrtc/base/thread.h"
42 42
43 #ifndef OPENSSL_IS_BORINGSSL
44
45 // TODO: Use a nicer abstraction for mutex.
46
47 #if defined(WEBRTC_WIN)
48 #define MUTEX_TYPE HANDLE
49 #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
50 #define MUTEX_CLEANUP(x) CloseHandle(x)
51 #define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE)
52 #define MUTEX_UNLOCK(x) ReleaseMutex(x)
53 #define THREAD_ID GetCurrentThreadId()
54 #elif defined(WEBRTC_POSIX)
55 #define MUTEX_TYPE pthread_mutex_t
56 #define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
57 #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
58 #define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
59 #define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
60 #define THREAD_ID pthread_self()
61 #else
62 #error You must define mutex operations appropriate for your platform!
63 #endif
64
65 struct CRYPTO_dynlock_value {
66 MUTEX_TYPE mutex;
67 };
68
69 #endif // #ifndef OPENSSL_IS_BORINGSSL
70
71 ////////////////////////////////////////////////////////////////////// 43 //////////////////////////////////////////////////////////////////////
72 // SocketBIO 44 // SocketBIO
73 ////////////////////////////////////////////////////////////////////// 45 //////////////////////////////////////////////////////////////////////
74 46
75 static int socket_write(BIO* h, const char* buf, int num); 47 static int socket_write(BIO* h, const char* buf, int num);
76 static int socket_read(BIO* h, char* buf, int size); 48 static int socket_read(BIO* h, char* buf, int size);
77 static int socket_puts(BIO* h, const char* str); 49 static int socket_puts(BIO* h, const char* str);
78 static long socket_ctrl(BIO* h, int cmd, long arg1, void* arg2); 50 static long socket_ctrl(BIO* h, int cmd, long arg1, void* arg2);
79 static int socket_new(BIO* h); 51 static int socket_new(BIO* h);
80 static int socket_free(BIO* data); 52 static int socket_free(BIO* data);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 return 0; 142 return 0;
171 } 143 }
172 } 144 }
173 145
174 ///////////////////////////////////////////////////////////////////////////// 146 /////////////////////////////////////////////////////////////////////////////
175 // OpenSSLAdapter 147 // OpenSSLAdapter
176 ///////////////////////////////////////////////////////////////////////////// 148 /////////////////////////////////////////////////////////////////////////////
177 149
178 namespace rtc { 150 namespace rtc {
179 151
180 #ifndef OPENSSL_IS_BORINGSSL
181
182 // This array will store all of the mutexes available to OpenSSL.
183 static MUTEX_TYPE* mutex_buf = NULL;
184
185 static void locking_function(int mode, int n, const char * file, int line) {
186 if (mode & CRYPTO_LOCK) {
187 MUTEX_LOCK(mutex_buf[n]);
188 } else {
189 MUTEX_UNLOCK(mutex_buf[n]);
190 }
191 }
192
193 static unsigned long id_function() { // NOLINT
194 // Use old-style C cast because THREAD_ID's type varies with the platform,
195 // in some cases requiring static_cast, and in others requiring
196 // reinterpret_cast.
197 return (unsigned long)THREAD_ID; // NOLINT
198 }
199
200 static CRYPTO_dynlock_value* dyn_create_function(const char* file, int line) {
201 CRYPTO_dynlock_value* value = new CRYPTO_dynlock_value;
202 if (!value)
203 return NULL;
204 MUTEX_SETUP(value->mutex);
205 return value;
206 }
207
208 static void dyn_lock_function(int mode, CRYPTO_dynlock_value* l,
209 const char* file, int line) {
210 if (mode & CRYPTO_LOCK) {
211 MUTEX_LOCK(l->mutex);
212 } else {
213 MUTEX_UNLOCK(l->mutex);
214 }
215 }
216
217 static void dyn_destroy_function(CRYPTO_dynlock_value* l,
218 const char* file, int line) {
219 MUTEX_CLEANUP(l->mutex);
220 delete l;
221 }
222
223 #endif // #ifndef OPENSSL_IS_BORINGSSL
224
225 VerificationCallback OpenSSLAdapter::custom_verify_callback_ = NULL; 152 VerificationCallback OpenSSLAdapter::custom_verify_callback_ = NULL;
226 153
227 bool OpenSSLAdapter::InitializeSSL(VerificationCallback callback) { 154 bool OpenSSLAdapter::InitializeSSL(VerificationCallback callback) {
228 if (!InitializeSSLThread() || !SSL_library_init()) 155 CRYPTO_library_init();
229 return false;
230 #if !defined(ADDRESS_SANITIZER) || !defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
231 // Loading the error strings crashes mac_asan. Omit this debugging aid there.
232 SSL_load_error_strings();
233 #endif
234 ERR_load_BIO_strings();
235 OpenSSL_add_all_algorithms();
236 RAND_poll();
237 custom_verify_callback_ = callback; 156 custom_verify_callback_ = callback;
238 return true; 157 return true;
239 } 158 }
240 159
241 bool OpenSSLAdapter::InitializeSSLThread() {
242 // BoringSSL is doing the locking internally, so the callbacks are not used
243 // in this case (and are no-ops anyways).
244 #ifndef OPENSSL_IS_BORINGSSL
245 mutex_buf = new MUTEX_TYPE[CRYPTO_num_locks()];
246 if (!mutex_buf)
247 return false;
248 for (int i = 0; i < CRYPTO_num_locks(); ++i)
249 MUTEX_SETUP(mutex_buf[i]);
250
251 // we need to cast our id_function to return an unsigned long -- pthread_t is
252 // a pointer
253 CRYPTO_set_id_callback(id_function);
254 CRYPTO_set_locking_callback(locking_function);
255 CRYPTO_set_dynlock_create_callback(dyn_create_function);
256 CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
257 CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
258 #endif // #ifndef OPENSSL_IS_BORINGSSL
259 return true;
260 }
261
262 bool OpenSSLAdapter::CleanupSSL() {
263 #ifndef OPENSSL_IS_BORINGSSL
264 if (!mutex_buf)
265 return false;
266 CRYPTO_set_id_callback(NULL);
267 CRYPTO_set_locking_callback(NULL);
268 CRYPTO_set_dynlock_create_callback(NULL);
269 CRYPTO_set_dynlock_lock_callback(NULL);
270 CRYPTO_set_dynlock_destroy_callback(NULL);
271 for (int i = 0; i < CRYPTO_num_locks(); ++i)
272 MUTEX_CLEANUP(mutex_buf[i]);
273 delete [] mutex_buf;
274 mutex_buf = NULL;
275 #endif // #ifndef OPENSSL_IS_BORINGSSL
276 return true;
277 }
278
279 OpenSSLAdapter::OpenSSLAdapter(AsyncSocket* socket) 160 OpenSSLAdapter::OpenSSLAdapter(AsyncSocket* socket)
280 : SSLAdapter(socket), 161 : SSLAdapter(socket),
281 state_(SSL_NONE), 162 state_(SSL_NONE),
282 ssl_read_needs_write_(false), 163 ssl_read_needs_write_(false),
283 ssl_write_needs_read_(false), 164 ssl_write_needs_read_(false),
284 restartable_(false), 165 restartable_(false),
285 ssl_(NULL), ssl_ctx_(NULL), 166 ssl_(NULL), ssl_ctx_(NULL),
286 ssl_mode_(SSL_MODE_TLS), 167 ssl_mode_(SSL_MODE_TLS),
287 custom_verification_succeeded_(false) { 168 custom_verification_succeeded_(false) {
288 } 169 }
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 if (ssl_mode_ == SSL_MODE_DTLS) { 842 if (ssl_mode_ == SSL_MODE_DTLS) {
962 SSL_CTX_set_read_ahead(ctx, 1); 843 SSL_CTX_set_read_ahead(ctx, 1);
963 } 844 }
964 845
965 return ctx; 846 return ctx;
966 } 847 }
967 848
968 } // namespace rtc 849 } // namespace rtc
969 850
970 #endif // HAVE_OPENSSL_SSL_H 851 #endif // HAVE_OPENSSL_SSL_H
OLDNEW
« no previous file with comments | « webrtc/base/openssladapter.h ('k') | webrtc/base/opensslidentity.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698