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

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

Issue 1158573008: Locking is no longer required with BoringSSL. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 6 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 | « no previous file | no next file » | 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 21 matching lines...) Expand all
32 #endif // HAVE_CONFIG_H 32 #endif // HAVE_CONFIG_H
33 33
34 #include "webrtc/base/common.h" 34 #include "webrtc/base/common.h"
35 #include "webrtc/base/logging.h" 35 #include "webrtc/base/logging.h"
36 #include "webrtc/base/openssl.h" 36 #include "webrtc/base/openssl.h"
37 #include "webrtc/base/safe_conversions.h" 37 #include "webrtc/base/safe_conversions.h"
38 #include "webrtc/base/sslroots.h" 38 #include "webrtc/base/sslroots.h"
39 #include "webrtc/base/stringutils.h" 39 #include "webrtc/base/stringutils.h"
40 #include "webrtc/base/thread.h" 40 #include "webrtc/base/thread.h"
41 41
42 #ifndef OPENSSL_IS_BORINGSSL
43
42 // TODO: Use a nicer abstraction for mutex. 44 // TODO: Use a nicer abstraction for mutex.
43 45
44 #if defined(WEBRTC_WIN) 46 #if defined(WEBRTC_WIN)
45 #define MUTEX_TYPE HANDLE 47 #define MUTEX_TYPE HANDLE
46 #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL) 48 #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
47 #define MUTEX_CLEANUP(x) CloseHandle(x) 49 #define MUTEX_CLEANUP(x) CloseHandle(x)
48 #define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE) 50 #define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE)
49 #define MUTEX_UNLOCK(x) ReleaseMutex(x) 51 #define MUTEX_UNLOCK(x) ReleaseMutex(x)
50 #define THREAD_ID GetCurrentThreadId() 52 #define THREAD_ID GetCurrentThreadId()
51 #elif defined(WEBRTC_POSIX) 53 #elif defined(WEBRTC_POSIX)
52 #define MUTEX_TYPE pthread_mutex_t 54 #define MUTEX_TYPE pthread_mutex_t
53 #define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) 55 #define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
54 #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) 56 #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
55 #define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) 57 #define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
56 #define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) 58 #define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
57 #define THREAD_ID pthread_self() 59 #define THREAD_ID pthread_self()
58 #else 60 #else
59 #error You must define mutex operations appropriate for your platform! 61 #error You must define mutex operations appropriate for your platform!
60 #endif 62 #endif
61 63
62 struct CRYPTO_dynlock_value { 64 struct CRYPTO_dynlock_value {
63 MUTEX_TYPE mutex; 65 MUTEX_TYPE mutex;
64 }; 66 };
65 67
68 #endif // #ifndef OPENSSL_IS_BORINGSSL
69
66 ////////////////////////////////////////////////////////////////////// 70 //////////////////////////////////////////////////////////////////////
67 // SocketBIO 71 // SocketBIO
68 ////////////////////////////////////////////////////////////////////// 72 //////////////////////////////////////////////////////////////////////
69 73
70 static int socket_write(BIO* h, const char* buf, int num); 74 static int socket_write(BIO* h, const char* buf, int num);
71 static int socket_read(BIO* h, char* buf, int size); 75 static int socket_read(BIO* h, char* buf, int size);
72 static int socket_puts(BIO* h, const char* str); 76 static int socket_puts(BIO* h, const char* str);
73 static long socket_ctrl(BIO* h, int cmd, long arg1, void* arg2); 77 static long socket_ctrl(BIO* h, int cmd, long arg1, void* arg2);
74 static int socket_new(BIO* h); 78 static int socket_new(BIO* h);
75 static int socket_free(BIO* data); 79 static int socket_free(BIO* data);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 return 0; 169 return 0;
166 } 170 }
167 } 171 }
168 172
169 ///////////////////////////////////////////////////////////////////////////// 173 /////////////////////////////////////////////////////////////////////////////
170 // OpenSSLAdapter 174 // OpenSSLAdapter
171 ///////////////////////////////////////////////////////////////////////////// 175 /////////////////////////////////////////////////////////////////////////////
172 176
173 namespace rtc { 177 namespace rtc {
174 178
179 #ifndef OPENSSL_IS_BORINGSSL
180
175 // This array will store all of the mutexes available to OpenSSL. 181 // This array will store all of the mutexes available to OpenSSL.
176 static MUTEX_TYPE* mutex_buf = NULL; 182 static MUTEX_TYPE* mutex_buf = NULL;
177 183
178 static void locking_function(int mode, int n, const char * file, int line) { 184 static void locking_function(int mode, int n, const char * file, int line) {
179 if (mode & CRYPTO_LOCK) { 185 if (mode & CRYPTO_LOCK) {
180 MUTEX_LOCK(mutex_buf[n]); 186 MUTEX_LOCK(mutex_buf[n]);
181 } else { 187 } else {
182 MUTEX_UNLOCK(mutex_buf[n]); 188 MUTEX_UNLOCK(mutex_buf[n]);
183 } 189 }
184 } 190 }
(...skipping 21 matching lines...) Expand all
206 MUTEX_UNLOCK(l->mutex); 212 MUTEX_UNLOCK(l->mutex);
207 } 213 }
208 } 214 }
209 215
210 static void dyn_destroy_function(CRYPTO_dynlock_value* l, 216 static void dyn_destroy_function(CRYPTO_dynlock_value* l,
211 const char* file, int line) { 217 const char* file, int line) {
212 MUTEX_CLEANUP(l->mutex); 218 MUTEX_CLEANUP(l->mutex);
213 delete l; 219 delete l;
214 } 220 }
215 221
222 #endif // #ifndef OPENSSL_IS_BORINGSSL
223
216 VerificationCallback OpenSSLAdapter::custom_verify_callback_ = NULL; 224 VerificationCallback OpenSSLAdapter::custom_verify_callback_ = NULL;
217 225
218 bool OpenSSLAdapter::InitializeSSL(VerificationCallback callback) { 226 bool OpenSSLAdapter::InitializeSSL(VerificationCallback callback) {
219 if (!InitializeSSLThread() || !SSL_library_init()) 227 if (!InitializeSSLThread() || !SSL_library_init())
220 return false; 228 return false;
221 #if !defined(ADDRESS_SANITIZER) || !defined(WEBRTC_MAC) || defined(WEBRTC_IOS) 229 #if !defined(ADDRESS_SANITIZER) || !defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
222 // Loading the error strings crashes mac_asan. Omit this debugging aid there. 230 // Loading the error strings crashes mac_asan. Omit this debugging aid there.
223 SSL_load_error_strings(); 231 SSL_load_error_strings();
224 #endif 232 #endif
225 ERR_load_BIO_strings(); 233 ERR_load_BIO_strings();
226 OpenSSL_add_all_algorithms(); 234 OpenSSL_add_all_algorithms();
227 RAND_poll(); 235 RAND_poll();
228 custom_verify_callback_ = callback; 236 custom_verify_callback_ = callback;
229 return true; 237 return true;
230 } 238 }
231 239
232 bool OpenSSLAdapter::InitializeSSLThread() { 240 bool OpenSSLAdapter::InitializeSSLThread() {
241 // BoringSSL is doing the locking internally, so the callbacks are not used
242 // in this case (and are no-ops anyways).
243 #ifndef OPENSSL_IS_BORINGSSL
233 mutex_buf = new MUTEX_TYPE[CRYPTO_num_locks()]; 244 mutex_buf = new MUTEX_TYPE[CRYPTO_num_locks()];
234 if (!mutex_buf) 245 if (!mutex_buf)
235 return false; 246 return false;
236 for (int i = 0; i < CRYPTO_num_locks(); ++i) 247 for (int i = 0; i < CRYPTO_num_locks(); ++i)
237 MUTEX_SETUP(mutex_buf[i]); 248 MUTEX_SETUP(mutex_buf[i]);
238 249
239 // we need to cast our id_function to return an unsigned long -- pthread_t is 250 // we need to cast our id_function to return an unsigned long -- pthread_t is
240 // a pointer 251 // a pointer
241 CRYPTO_set_id_callback(id_function); 252 CRYPTO_set_id_callback(id_function);
242 CRYPTO_set_locking_callback(locking_function); 253 CRYPTO_set_locking_callback(locking_function);
243 CRYPTO_set_dynlock_create_callback(dyn_create_function); 254 CRYPTO_set_dynlock_create_callback(dyn_create_function);
244 CRYPTO_set_dynlock_lock_callback(dyn_lock_function); 255 CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
245 CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); 256 CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
257 #endif // #ifndef OPENSSL_IS_BORINGSSL
246 return true; 258 return true;
247 } 259 }
248 260
249 bool OpenSSLAdapter::CleanupSSL() { 261 bool OpenSSLAdapter::CleanupSSL() {
262 #ifndef OPENSSL_IS_BORINGSSL
250 if (!mutex_buf) 263 if (!mutex_buf)
251 return false; 264 return false;
252 CRYPTO_set_id_callback(NULL); 265 CRYPTO_set_id_callback(NULL);
253 CRYPTO_set_locking_callback(NULL); 266 CRYPTO_set_locking_callback(NULL);
254 CRYPTO_set_dynlock_create_callback(NULL); 267 CRYPTO_set_dynlock_create_callback(NULL);
255 CRYPTO_set_dynlock_lock_callback(NULL); 268 CRYPTO_set_dynlock_lock_callback(NULL);
256 CRYPTO_set_dynlock_destroy_callback(NULL); 269 CRYPTO_set_dynlock_destroy_callback(NULL);
257 for (int i = 0; i < CRYPTO_num_locks(); ++i) 270 for (int i = 0; i < CRYPTO_num_locks(); ++i)
258 MUTEX_CLEANUP(mutex_buf[i]); 271 MUTEX_CLEANUP(mutex_buf[i]);
259 delete [] mutex_buf; 272 delete [] mutex_buf;
260 mutex_buf = NULL; 273 mutex_buf = NULL;
274 #endif // #ifndef OPENSSL_IS_BORINGSSL
261 return true; 275 return true;
262 } 276 }
263 277
264 OpenSSLAdapter::OpenSSLAdapter(AsyncSocket* socket) 278 OpenSSLAdapter::OpenSSLAdapter(AsyncSocket* socket)
265 : SSLAdapter(socket), 279 : SSLAdapter(socket),
266 state_(SSL_NONE), 280 state_(SSL_NONE),
267 ssl_read_needs_write_(false), 281 ssl_read_needs_write_(false),
268 ssl_write_needs_read_(false), 282 ssl_write_needs_read_(false),
269 restartable_(false), 283 restartable_(false),
270 ssl_(NULL), ssl_ctx_(NULL), 284 ssl_(NULL), ssl_ctx_(NULL),
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 if (ssl_mode_ == SSL_MODE_DTLS) { 960 if (ssl_mode_ == SSL_MODE_DTLS) {
947 SSL_CTX_set_read_ahead(ctx, 1); 961 SSL_CTX_set_read_ahead(ctx, 1);
948 } 962 }
949 963
950 return ctx; 964 return ctx;
951 } 965 }
952 966
953 } // namespace rtc 967 } // namespace rtc
954 968
955 #endif // HAVE_OPENSSL_SSL_H 969 #endif // HAVE_OPENSSL_SSL_H
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698