Can I safely assume that if I call FIPS_mode_set(0) and get a successful return value then I don’t need to lock when there are callbacks for type 39 and 40 locks (for OpenSSL 1.0.1 and 1.0.2)?
-Bryan > On Apr 28, 2015, at 10:22 AM, John Foley <fol...@cisco.com> wrote: > > In the context of OpenSSL 1.0.1 or 1.0.2, this means FIPS_mode_set(1) has > returned with a successful return value. > > In the future, this may change if/when OpenSSL does another FIPS validation. > CMVP has changed the implementation guidance that requires the POST to run > automatically without user intervention. Any future FIPS validations would > be subject to the new rules. Hence, the behavior of FIPS_mode_set() may > change in the future if OpenSSL decides to pursue another validation. > > > > On 04/28/2015 12:43 PM, Bryan Call wrote: >> What do you mean by “FIPS POST has completed”? >> >> -Bryan >> >> >> >> >>> On Apr 24, 2015, at 4:17 PM, John Foley <fol...@cisco.com >>> <mailto:fol...@cisco.com>> wrote: >>> >>> Some of the algorithms still invoke the FIPS flavor of the algorithm even >>> when FIPS is disabled. For example, this code is from EVP_DigestUpdate(). >>> >>> int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count) >>> { >>> #ifdef OPENSSL_FIPS >>> return FIPS_digestupdate(ctx, data, count); >>> #else >>> return ctx->update(ctx, data, count); >>> #endif >>> } >>> >>> In 1.0.1, locks 39 and 40 are: >>> >>> # define CRYPTO_LOCK_FIPS 39 >>> # define CRYPTO_LOCK_FIPS2 40 >>> >>> You should try adding some logic to skip the lock in your lock handler when >>> the lock ID is 39 or 40. Again, it should be safe to not lock on these two >>> as long as the FIPS POST has completed. >>> >>> >>> >>> On 04/24/2015 05:56 PM, Bryan Call wrote: >>>> In my last email I ran the benchmark on Fedora 21 (big mistake). Here >>>> are the results when running it back on the 28/56 core RHEL 6.5 server >>>> showing contention in a different place (fips). Is there a reason it >>>> would be calling into the FIPS code to get a lock of FIPS is not enabled? >>>> >>>> Contention log: >>>> [Apr 24 21:35:09.731] Server {0x7f5529ccd700} ERROR: contention for lock - >>>> total contention: 70662 waiting: 16 file: fips.c line: 471 type: 40 >>>> [Apr 24 21:35:09.732] Server {0x7f55299ca700} ERROR: contention for lock - >>>> total contention: 71605 waiting: 2 file: fips.c line: 107 type: 39 >>>> >>>> >>>> Line in in fips that see the contention the most: >>>> [bcall@bm77 trafficserver]$ grep fips.c diags.log | cut -f 19 -d ' ' | >>>> sort | uniq -c | sort -rn >>>> 875379 471 >>>> 288338 107 >>>> 275472 127 >>>> >>>> >>>> Different lock types and their contention frequency (multiple benchmarks): >>>> 875379 40 < - in fips.c >>>> 563810 39 <- also in fips.c >>>> 440518 1 >>>> 44145 18 >>>> 17447 2 >>>> 11356 10 >>>> 1377 19 >>>> 687 12 >>>> 532 25 >>>> 302 33 >>>> 239 9 >>>> 58 16 >>>> 40 21 >>>> 32 11 >>>> 19 3 >>>> 1 14 >>>> >>>> >>>> Code to diable FIPS and log: >>>> #ifdef OPENSSL_FIPS >>>> int mode = FIPS_mode(); >>>> Debug("ssl", "FIPS_mode: %d", mode); >>>> mode = FIPS_mode(); >>>> if (mode) { >>>> FIPS_mode_set(0); >>>> Debug("ssl", "FIPS_mode: %d", mode); >>>> } >>>> #endif >>>> >>>> [Apr 24 21:43:45.860] Server {0x7f7628146800} DEBUG: (ssl) FIPS_mode: 0 >>>> >>>> -Bryan >>>> >>>> >>>> >>>> >>>>> On Apr 24, 2015, at 10:56 AM, John Foley <fol...@cisco.com >>>>> <mailto:fol...@cisco.com>> wrote: >>>>> >>>>> When you create the private key given to SSL_CTX, be sure to instantiate >>>>> a private key for each thread as well. If you share the same key across >>>>> all threads, this can introduce contention. >>>>> >>>>> Here are the type 1 & 2 locks: >>>>> >>>>> # define CRYPTO_LOCK_ERR 1 >>>>> # define CRYPTO_LOCK_EX_DATA 2 >>>>> >>>>> Have you checked the OpenSSL error log to see what errors are being >>>>> generated? >>>>> >>>>> Also, if you disable FIPS, does the thread contention still occur? >>>>> >>>>> >>>>> >>>>> On 04/24/2015 01:36 PM, Bryan Call wrote: >>>>>> We are using a single SSL_CTX across all the threads, so I will create >>>>>> multiple SSL_CTX per thread. I implemented dynlock callbacks yesterday, >>>>>> but I didn’t see them being used in the tests I did. I also added >>>>>> atomic counters to see what type of locks are having contention (see >>>>>> logs below): >>>>>> >>>>>> Most of the lock contention seems to be around type 2 and type 1 locks >>>>>> when calling our lock callback. In the FIPS/POST and SSL_CTX >>>>>> recommendations, in your previous email, what types of locks would those >>>>>> help with? >>>>>> >>>>>> Log output: >>>>>> [Apr 24 10:21:24.339] Server {0xb310000} ERROR: <SSLUtils.cc >>>>>> <http://sslutils.cc/>:178 (SSL_locking_callback)> contention for lock - >>>>>> total contention: 3938 waiting: 1 file: >>>>>> /SourceCache/OpenSSL098/OpenSSL098-52.20.2/src/crypto/ex_data.c line: >>>>>> 496 type: 2 >>>>>> [Apr 24 10:21:24.754] Server {0xb10a000} ERROR: <SSLUtils.cc >>>>>> <http://sslutils.cc/>:178 (SSL_locking_callback)> contention for lock - >>>>>> total contention: 1350 waiting: 1 file: >>>>>> /SourceCache/OpenSSL098/OpenSSL098-52.20.2/src/crypto/err/err_def.c >>>>>> line: 343 type: 1 >>>>>> >>>>>> >>>>>> -Bryan >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> On Apr 23, 2015, at 4:46 PM, John Foley <fol...@cisco.com >>>>>>> <mailto:fol...@cisco.com>> wrote: >>>>>>> >>>>>>> Looking at your call stack, it appears you're testing with FIPS mode >>>>>>> enabled. There's a lock in FIPS_selftest_failed() that's used to >>>>>>> ensure the crypto algorithms inside the FIPS boundary are not utilized >>>>>>> until after the POST has completed and passed. Unfortunately this lock >>>>>>> remains installed for the lifetime of the process. We've seen thread >>>>>>> contention in this area when using OpenSSL. One work-around is to >>>>>>> modify your handler that you pass to SSL_locking_callback() to not lock >>>>>>> when the lock ID is CRYPTO_LOCK_FIPS. But you would only want to >>>>>>> disable this particular lock ID after the POST has completed. >>>>>>> >>>>>>> If the above doesn't help, another item to check is whether you're >>>>>>> instantiating an SSL_CTX for each thread. I've seen some developers >>>>>>> use a single SSL_CTX for multiple threads. This results in a single >>>>>>> instance of the server cert and private key being shared across all the >>>>>>> threads. This results in thread contention on the asymmetric key >>>>>>> operations associated with the cert and private key (e.g. RSA). Be >>>>>>> sure that each thread instantiates it's own SSL_CTX and >>>>>>> certificate/private key. >>>>>>> >>>>>>> Lastly, add some debugs to count the locks by lock ID in your lock >>>>>>> handler. There are about 40 different lock IDs defined in >>>>>>> crypto/crypto.h. You'll need to identify which lock is causing the >>>>>>> thread contention. Once you know that, then you can look in the code >>>>>>> to see where that lock is used and troubleshoot from there. >>>>>>> >>>>>>> >>>>>>> >>>>>>> On 04/23/2015 07:23 PM, Bryan Call wrote: >>>>>>>> I was running a benchmark on a 28 core (56 hyper-threaded) server that >>>>>>>> is running 84 threads in the process and I am seeing a lot of lock >>>>>>>> contention. I saw a lot of lock contention in the calls to >>>>>>>> SSL_get_error() ssl3_accept(). I am running RHEL 6.5 and >>>>>>>> openssl-1.0.1e-30.el6_6.7.x86_64. We have used SSL_locking_callback() >>>>>>>> to setup pthread mutex locks, but haven’t setup dynlocks yet. Would >>>>>>>> dynlocks help in this scenario? >>>>>>>> >>>>>>>> >>>>>>>> Output from perf: >>>>>>>> Samples: 1M of event 'cycles', Event count (approx.): 602783506611 >>>>>>>> - 48.04% [ET_NET 0] [kernel.kallsyms] [k] _spin_lock ◆ >>>>>>>> - _spin_lock ▒ >>>>>>>> + 48.05% futex_wait_setup ▒ >>>>>>>> + 47.79% futex_wake ▒ >>>>>>>> + 1.20% tcp_v4_rcv ▒ >>>>>>>> + 0.98% task_rq_lock ▒ >>>>>>>> + 0.64% double_lock_balance ▒ >>>>>>>> + 3.94% [ET_NET 0] libcrypto.so.1.0.1e [.] bn_mul_mont ▒ >>>>>>>> + 1.93% [ET_NET 0] libcrypto.so.1.0.1e [.] BN_usub ▒ >>>>>>>> + 1.80% [ET_NET 0] libcrypto.so.1.0.1e [.] 0x00000000000e5200 ▒ >>>>>>>> + 1.49% [ET_NET 0] libcrypto.so.1.0.1e [.] sha256_block_data_order ▒ >>>>>>>> + 0.97% [ET_NET 0] libcrypto.so.1.0.1e [.] gcm_ghash_clmul ▒ >>>>>>>> + 0.85% [ET_NET 0] libpthread-2.12.so [.] pthread_mutex_lock ▒ >>>>>>>> + 0.84% [ET_NET 0] libcrypto.so.1.0.1e [.] aesni_ctr32_encrypt_blocks ▒ >>>>>>>> + 0.74% [ET_NET 0] libc-2.12.so [.] malloc ▒ >>>>>>>> + 0.72% [ET_NET 0] libc-2.12.so [.] memcpy ▒ >>>>>>>> + 0.57% [ET_NET 0] libcrypto.so.1.0.1e [.] BN_mod_mul_montgomery ▒ >>>>>>>> + 0.51% [ET_NET 0] libpthread-2.12.so [.] pthread_mutex_unlock >>>>>>>> >>>>>>>> pstack of the process (only a couple of the interesting threads): >>>>>>>> Thread 1 (Thread 0x7f1fba151800 (LWP 1106)): >>>>>>>> #0 0x00007f1fbaaeb264 in __lll_lock_wait () from /lib64/libpthread.so.0 >>>>>>>> #1 0x00007f1fbaae6508 in _L_lock_854 () from /lib64/libpthread.so.0 >>>>>>>> #2 0x00007f1fbaae63d7 in pthread_mutex_lock () from >>>>>>>> /lib64/libpthread.so.0 >>>>>>>> #3 0x000000000072822f in SSL_locking_callback(int, int, char const*, >>>>>>>> int) () >>>>>>>> #4 0x00000031d2ae7f03 in ?? () from /usr/lib64/libcrypto.so.10 >>>>>>>> #5 0x00000031d2ae7d8c in ?? () from /usr/lib64/libcrypto.so.10 >>>>>>>> #6 0x00000031d2ae80ab in ERR_get_state () from >>>>>>>> /usr/lib64/libcrypto.so.10 >>>>>>>> #7 0x00000031d2ae8557 in ?? () from /usr/lib64/libcrypto.so.10 >>>>>>>> #8 0x00000031d2e424a9 in SSL_get_error () from /usr/lib64/libssl.so.10 >>>>>>>> #9 0x00000000007249ef in >>>>>>>> SSLNetVConnection::load_buffer_and_write(long, long&, long&, >>>>>>>> MIOBufferAccessor&, int&) () >>>>>>>> #10 0x00000000007389df in write_to_net_io(NetHandler*, >>>>>>>> UnixNetVConnection*, EThread*) () >>>>>>>> #11 0x0000000000738523 in write_to_net(NetHandler*, >>>>>>>> UnixNetVConnection*, EThread*) () >>>>>>>> #12 0x0000000000731922 in NetHandler::mainNetEvent(int, Event*) () >>>>>>>> #13 0x00000000004f6d48 in Continuation::handleEvent(int, void*) () >>>>>>>> #14 0x000000000075877a in EThread::process_event(Event*, int) () >>>>>>>> #15 0x0000000000758c84 in EThread::ex >>>>>>>> >>>>>>>> Thread 56 (Thread 0x7f1fb0ecd700 (LWP 1172)): >>>>>>>> #0 0x00007f1fbaae77d9 in pthread_mutex_unlock () from >>>>>>>> /lib64/libpthread.so.0 >>>>>>>> #1 0x0000000000728265 in SSL_locking_callback(int, int, char const*, >>>>>>>> int) () >>>>>>>> #2 0x00000031d2b57402 in ?? () from /usr/lib64/libcrypto.so.10 >>>>>>>> #3 0x00000031d2b574bd in FIPS_selftest_failed () from >>>>>>>> /usr/lib64/libcrypto.so.10 >>>>>>>> #4 0x00000031d2ae9f1c in EVP_DigestInit_ex () from >>>>>>>> /usr/lib64/libcrypto.so.10 >>>>>>>> #5 0x00000031d2a7977e in HMAC_Init_ex () from >>>>>>>> /usr/lib64/libcrypto.so.10 >>>>>>>> #6 0x00000031d2a79c29 in ?? () from /usr/lib64/libcrypto.so.10 >>>>>>>> #7 0x00000031d2af7a42 in EVP_PKEY_CTX_ctrl () from >>>>>>>> /usr/lib64/libcrypto.so.10 >>>>>>>> #8 0x00000031d2ae9ffb in EVP_DigestInit_ex () from >>>>>>>> /usr/lib64/libcrypto.so.10 >>>>>>>> #9 0x00000031d2af952a in ?? () from /usr/lib64/libcrypto.so.10 >>>>>>>> #10 0x00000031d2e34cf2 in tls1_PRF () from /usr/lib64/libssl.so.10 >>>>>>>> #11 0x00000031d2e35796 in tls1_final_finish_mac () from >>>>>>>> /usr/lib64/libssl.so.10 >>>>>>>> #12 0x00000031d2e2db2e in ssl3_get_message () from >>>>>>>> /usr/lib64/libssl.so.10 >>>>>>>> #13 0x00000031d2e1dc3c in ssl3_get_cert_verify () from >>>>>>>> /usr/lib64/libssl.so.10 >>>>>>>> #14 0x00000031d2e220d6 in ssl3_accept () from /usr/lib64/libssl.so.10 >>>>>>>> #15 0x0000000000725287 in >>>>>>>> SSLNetVConnection::sslServerHandShakeEvent(int&) () >>>>>>>> #16 0x00000000007251b3 in SSLNetVConnection::sslStartHandShake(int, >>>>>>>> int&) () >>>>>>>> #17 0x0000000000723df3 in SSLNetVConnection::net_read_io(NetHandler*, >>>>>>>> EThread*) () >>>>>>>> #18 0x0000000000731852 in NetHandler::mainNetEvent(int, Event*) () >>>>>>>> #19 0x00000000004f6d48 in Continuation::handleEvent(int, void*) () >>>>>>>> #20 0x000000000075877a in EThread::process_event(Event*, int) () >>>>>>>> #21 0x0000000000758c84 in EThread::execute() () >>>>>>>> #22 0x0000000000757cf8 in spawn_thread_internal(void*) () >>>>>>>> #23 0x00007f1fbaae49d1 in start_thread () from /lib64/libpthread.so.0 >>>>>>>> #24 0x00000030ff0e88fd in clone () from /lib64/libc.so.6 >>>>>>>> >>>>>>>> -Bryan >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> openssl-users mailing list >>>>>>>> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >>>>>>>> <https://mta.openssl.org/mailman/listinfo/openssl-users> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> openssl-users mailing list >>>>>>> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >>>>>>> <https://mta.openssl.org/mailman/listinfo/openssl-users> >>>>>> >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> openssl-users mailing list >>>>>> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >>>>>> <https://mta.openssl.org/mailman/listinfo/openssl-users> >>>>> >>>>> _______________________________________________ >>>>> openssl-users mailing list >>>>> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >>>>> <https://mta.openssl.org/mailman/listinfo/openssl-users> >>>> >>>> >>>> >>>> _______________________________________________ >>>> openssl-users mailing list >>>> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >>>> <https://mta.openssl.org/mailman/listinfo/openssl-users> >>> >>> _______________________________________________ >>> openssl-users mailing list >>> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >>> <https://mta.openssl.org/mailman/listinfo/openssl-users> >> >> >> >> _______________________________________________ >> openssl-users mailing list >> To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users >> <https://mta.openssl.org/mailman/listinfo/openssl-users> > > _______________________________________________ > openssl-users mailing list > To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users
_______________________________________________ openssl-users mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users