GNUTLS handshake errors and memory leaks (ECDHE related?)
Yaroslav
yarosla at gmail.com
Tue Jan 10 14:13:57 CET 2012
Yet another log attached. This time gnutls-serv with --priority
'NORMAL:-ECDHE-RSA'.
SSL/TLS Protocol: TLSv1/SSLv3,DHE-RSA-AES256-SHA,2048,256
Still some handshake errors but no related memory leaks. Some minor leaks
still present.
On Tue, Jan 10, 2012 at 4:56 PM, Yaroslav <yarosla at gmail.com> wrote:
> I've run valgrind against gnutls-serv and collected very similar results.
> See logs (ab & gnutls-serv) attached.
>
> ==29724== 18,720 bytes in 390 blocks are definitely lost in loss record 67
> of 70
> ==29724== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
> ==29724== by 0x5B03908: __gmp_default_allocate (in
> /usr/lib/libgmp.so.10.0.1)
> ==29724== by 0x5B17F39: __gmpz_mul (in /usr/lib/libgmp.so.10.0.1)
> ==29724== by 0x4EE5444: ecc_projective_check_point
> (ecc_projective_check_point.c:60)
> ==29724== by 0x4EDE92A: _wrap_nettle_pk_derive (pk.c:144)
> ==29724== by 0x4EC54A2: calc_ecdh_key (ecdh_common.c:64)
> ==29724== by 0x4EC5569: _gnutls_proc_ecdh_common_client_kx
> (ecdh_common.c:124)
> ==29724== by 0x4E595E6: _gnutls_recv_client_kx_message (gnutls_kx.c:549)
> ==29724== by 0x4E56D25: _gnutls_handshake_server
> (gnutls_handshake.c:2801)
> ==29724== by 0x4E57622: gnutls_handshake (gnutls_handshake.c:2368)
> ==29724== by 0x405A99: main (serv.c:1270)
>
>
> On Tue, Jan 10, 2012 at 2:44 PM, Yaroslav <yarosla at gmail.com> wrote:
>
>> Hi!
>>
>> I have added SSL support to my web server (nxweb) using GNUTLS. The
>> server has asynchronous architecture (based on epoll), where 4 threads run
>> almost independently accepting and servicing client http connections.
>> Therefore I am using GNUTLS in non-blocking mode.
>>
>> Platform: Ubuntu 11.10, x64, 4-core CPU.
>> Linked with latest GNUTLS 3.0.11.
>>
>> Most of the time everything works fine. Benchmarks show significant speed
>> advantage over nginx (which is build on OpenSSL). But sometimes there are
>> handshake errors and also memory leaks, which might be bound to those
>> errors.
>>
>> I am attaching full valgrind log. Here are some excerpts:
>>
>> % valgrind --leak-check=full --show-reachable=yes
>> dist/Debug/GNU-Linux-x86/nxweb
>> ...
>> 2012-01-10 13:46:51 [28704:0x71b9700]: gnutls handshake error -24 fatal=1
>> 2012-01-10 13:47:25 [28704:0x71b9700]: gnutls handshake error -110 fatal=1
>> 2012-01-10 13:47:25 [28704:0x71b9700]: gnutls handshake error -10 fatal=1
>> ...
>> ==28704== 47,952 bytes in 999 blocks are definitely lost in loss record
>> 11 of 11
>> ==28704== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
>> ==28704== by 0x5F28908: __gmp_default_allocate (in
>> /usr/lib/libgmp.so.10.0.1)
>> ==28704== by 0x5F3CF39: __gmpz_mul (in /usr/lib/libgmp.so.10.0.1)
>> ==28704== by 0x50ED444: ecc_projective_check_point
>> (ecc_projective_check_point.c:60)
>> ==28704== by 0x50E692A: _wrap_nettle_pk_derive (pk.c:144)
>> ==28704== by 0x50CD4A2: calc_ecdh_key (ecdh_common.c:64)
>> ==28704== by 0x50CD569: _gnutls_proc_ecdh_common_client_kx
>> (ecdh_common.c:124)
>> ==28704== by 0x50615E6: _gnutls_recv_client_kx_message
>> (gnutls_kx.c:549)
>> ==28704== by 0x505ED25: _gnutls_handshake_server
>> (gnutls_handshake.c:2801)
>> ==28704== by 0x505F622: gnutls_handshake (gnutls_handshake.c:2368)
>> ==28704== by 0x4088FD: do_handshake (nxd_ssl_socket.c:158)
>> ==28704== by 0x408A62: handshake_stub_is_do_write
>> (nxd_ssl_socket.c:188)
>>
>> There are also other leaks related to gnutls_dh_params_generate2 and some
>> error messages related to gnutls_certificate_set_x509_key_file but those
>> are of less importance to me as they happen only once on server startup.
>>
>> The log has been collected while running apache-bench (ab) on the
>> client-side. Here is the log:
>>
>> % ab -c 100 -n 1000 'https://test.domain.ru:8056/benchmark'
>> This is ApacheBench, Version 2.3 <$Revision: 655654 $>
>> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
>> Licensed to The Apache Software Foundation, http://www.apache.org/
>>
>> Benchmarking test.domain.ru (be patient)
>> Completed 100 requests
>> Completed 200 requests
>> Completed 300 requests
>> Completed 400 requests
>> Completed 500 requests
>> Completed 600 requests
>> Completed 700 requests
>> SSL handshake failed (5).
>> SSL handshake failed (5).
>> SSL handshake failed (5).
>> Completed 800 requests
>> Completed 900 requests
>> Completed 1000 requests
>> Finished 1000 requests
>>
>>
>> Server Software: nxweb/3.0.0-dev
>> Server Hostname: test.domain.ru
>> Server Port: 8056
>> SSL/TLS Protocol: TLSv1/SSLv3,ECDHE-RSA-AES256-SHA,2048,256
>>
>> Document Path: /benchmark
>> Document Length: 20 bytes
>>
>> Concurrency Level: 100
>> Time taken for tests: 159.929 seconds
>> Complete requests: 1000
>> Failed requests: 3
>> (Connect: 0, Receive: 0, Length: 3, Exceptions: 0)
>> Write errors: 0
>> Total transferred: 164505 bytes
>> HTML transferred: 19940 bytes
>> Requests per second: 6.25 [#/sec] (mean)
>> Time per request: 15992.885 [ms] (mean)
>> Time per request: 159.929 [ms] (mean, across all concurrent
>> requests)
>> Transfer rate: 1.00 [Kbytes/sec] received
>>
>> Connection Times (ms)
>> min mean[+/-sd] median max
>> Connect: 0 13464 1915.7 13581 16479
>> Processing: 115 2526 1904.2 2416 15897
>> Waiting: 115 2487 1758.1 2411 15785
>> Total: 15870 15989 212.0 15912 16645
>>
>>
>> The problems might be related to ECDHE algorithm. There were no handshake
>> errors when 'PERFORMANCE:%SERVER_PRECEDENCE' priority string was used.
>> There were no handshake errors when using GNUTLS 2.10.5 (from Ubuntu repo)
>> -- I switched to 3.0 version as it supports significantly faster ECDHE
>> algorithm, to be on par with nginx/openssl.
>>
>> And there seemed to be no such leaks when there were no handshake erros.
>>
>> And, yes, I do call gnutls_deinit(session) when closing every connection
>> regardless of errors on it. I am ready to provide full source code (I plan
>> to publish it soon as it is open source).
>>
>> Regards,
>>
>> Yaroslav Stavnichiy
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/attachments/20120110/6f934abc/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: valgrind_log_120110-gnutls-serv-2.log
Type: text/x-log
Size: 57609 bytes
Desc: not available
URL: </pipermail/attachments/20120110/6f934abc/attachment.bin>
More information about the Gnutls-devel
mailing list