Skip to content

Commit 4a8e85e

Browse files
authored
Merge pull request ruby#138 from rhenium/ky/maint-fix-test-with-tls13
Fix test failures with TLS 1.3-capable OpenSSL
2 parents 5f79da4 + e3a3050 commit 4a8e85e

37 files changed

+1064
-1030
lines changed

Rakefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ namespace :sync do
5858

5959
paths = [
6060
["ext/openssl/", "ext/openssl/"],
61+
["lib/", "ext/openssl/lib/"],
62+
["sample/", "sample/openssl/"],
63+
["test/fixtures/", "test/openssl/fixtures/"],
6164
["test/utils.rb", "test/openssl/"],
6265
["test/ut_eof.rb", "test/openssl/"],
6366
["test/test_*", "test/openssl/"],
64-
["lib/", "ext/openssl/lib/"],
65-
["sample/", "sample/openssl/"],
6667
["History.md", "ext/openssl/"],
6768
]
6869
paths.each do |src, dst|

appveyor.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ install:
1717
- openssl version
1818
- rake install_dependencies
1919
build_script:
20-
- rake -rdevkit compile -- --with-openssl-dir=%openssl_dir%
20+
- rake -rdevkit compile -- --with-openssl-dir=%openssl_dir% --enable-debug
2121
test_script:
22-
- rake test
22+
- rake test OSSL_MDEBUG=1
2323
deploy: off
2424
environment:
2525
matrix:

docker-compose.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ compile: &defaults
33
environment:
44
RUBY_VERSION:
55
OPENSSL_VERSION:
6-
MDEBUG:
76
command: rake compile
87
test:
98
<<: *defaults
10-
command: rake compile test
9+
command: rake compile test OSSL_MDEBUG=1 -- --enable-debug
1110
debug:
1211
<<: *defaults
1312
command: /bin/bash

ext/openssl/ossl.c

Lines changed: 100 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,72 @@ ossl_fips_mode_set(VALUE self, VALUE enabled)
414414
#endif
415415
}
416416

417+
#if defined(OSSL_DEBUG)
418+
#if !defined(LIBRESSL_VERSION_NUMBER) && \
419+
(OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_NO_CRYPTO_MDEBUG) || \
420+
defined(CRYPTO_malloc_debug_init))
421+
/*
422+
* call-seq:
423+
* OpenSSL.mem_check_start -> nil
424+
*
425+
* Calls CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON). Starts tracking memory
426+
* allocations. See also OpenSSL.print_mem_leaks.
427+
*
428+
* This is available only when built with a capable OpenSSL and --enable-debug
429+
* configure option.
430+
*/
431+
static VALUE
432+
mem_check_start(VALUE self)
433+
{
434+
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
435+
return Qnil;
436+
}
437+
438+
/*
439+
* call-seq:
440+
* OpenSSL.print_mem_leaks -> true | false
441+
*
442+
* For debugging the Ruby/OpenSSL library. Calls CRYPTO_mem_leaks_fp(stderr).
443+
* Prints detected memory leaks to standard error. This cleans the global state
444+
* up thus you cannot use any methods of the library after calling this.
445+
*
446+
* Returns true if leaks detected, false otherwise.
447+
*
448+
* This is available only when built with a capable OpenSSL and --enable-debug
449+
* configure option.
450+
*
451+
* === Example
452+
* OpenSSL.mem_check_start
453+
* NOT_GCED = OpenSSL::PKey::RSA.new(256)
454+
*
455+
* END {
456+
* GC.start
457+
* OpenSSL.print_mem_leaks # will print the leakage
458+
* }
459+
*/
460+
static VALUE
461+
print_mem_leaks(VALUE self)
462+
{
463+
#if OPENSSL_VERSION_NUMBER >= 0x10100000
464+
int ret;
465+
#endif
466+
467+
BN_CTX_free(ossl_bn_ctx);
468+
ossl_bn_ctx = NULL;
469+
470+
#if OPENSSL_VERSION_NUMBER >= 0x10100000
471+
ret = CRYPTO_mem_leaks_fp(stderr);
472+
if (ret < 0)
473+
ossl_raise(eOSSLError, "CRYPTO_mem_leaks_fp");
474+
return ret ? Qfalse : Qtrue;
475+
#else
476+
CRYPTO_mem_leaks_fp(stderr);
477+
return Qnil;
478+
#endif
479+
}
480+
#endif
481+
#endif
482+
417483
#if !defined(HAVE_OPENSSL_110_THREADING_API)
418484
/**
419485
* Stores locks needed for OpenSSL thread safety
@@ -1114,15 +1180,40 @@ Init_openssl(void)
11141180
Init_ossl_ocsp();
11151181
Init_ossl_engine();
11161182
Init_ossl_asn1();
1117-
}
11181183

11191184
#if defined(OSSL_DEBUG)
1120-
/*
1121-
* Check if all symbols are OK with 'make LDSHARED=gcc all'
1122-
*/
1123-
int
1124-
main(int argc, char *argv[])
1125-
{
1126-
return 0;
1185+
/*
1186+
* For debugging Ruby/OpenSSL. Enable only when built with --enable-debug
1187+
*/
1188+
#if !defined(LIBRESSL_VERSION_NUMBER) && \
1189+
(OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_NO_CRYPTO_MDEBUG) || \
1190+
defined(CRYPTO_malloc_debug_init))
1191+
rb_define_module_function(mOSSL, "mem_check_start", mem_check_start, 0);
1192+
rb_define_module_function(mOSSL, "print_mem_leaks", print_mem_leaks, 0);
1193+
1194+
#if defined(CRYPTO_malloc_debug_init) /* <= 1.0.2 */
1195+
CRYPTO_malloc_debug_init();
1196+
#endif
1197+
1198+
#if defined(V_CRYPTO_MDEBUG_ALL) /* <= 1.0.2 */
1199+
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
1200+
#endif
1201+
1202+
#if OPENSSL_VERSION_NUMBER < 0x10100000 /* <= 1.0.2 */
1203+
{
1204+
int i;
1205+
/*
1206+
* See crypto/ex_data.c; call def_get_class() immediately to avoid
1207+
* allocations. 15 is the maximum number that is used as the class index
1208+
* in OpenSSL 1.0.2.
1209+
*/
1210+
for (i = 0; i <= 15; i++) {
1211+
if (CRYPTO_get_ex_new_index(i, 0, (void *)"ossl-mdebug-dummy", 0, 0, 0) < 0)
1212+
rb_raise(rb_eRuntimeError, "CRYPTO_get_ex_new_index for "
1213+
"class index %d failed", i);
1214+
}
1215+
}
1216+
#endif
1217+
#endif
1218+
#endif
11271219
}
1128-
#endif /* OSSL_DEBUG */

test/fixtures/pkey/dh1024.pem

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN DH PARAMETERS-----
2+
MIGHAoGBAKnKQ8MNK6nYZzLrrcuTsLxuiJGXoOO5gT+tljOTbHBuiktdMTITzIY0
3+
pFxIvjG05D7HoBZQfrR0c92NGWPkAiCkhQKB8JCbPVzwNLDy6DZ0pmofDKrEsYHG
4+
AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC
5+
-----END DH PARAMETERS-----

test/fixtures/pkey/dsa1024.pem

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN DSA PRIVATE KEY-----
2+
MIIBugIBAAKBgQCH9aAoXvWWThIjkA6D+nI1F9ksF9iDq594rkiGNOT9sPDOdB+n
3+
D+qeeeeloRlj19ymCSADPI0ZLRgkchkAEnY2RnqnhHOjVf/roGgRbW+iQDMbQ9wa
4+
/pvc6/fAbsu1goE1hBYjm98/sZEeXavj8tR56IXnjF1b6Nx0+sgeUKFKEQIVAMiz
5+
4BJUFeTtddyM4uadBM7HKLPRAoGAZdLBSYNGiij7vAjesF5mGUKTIgPd+JKuBEDx
6+
OaBclsgfdoyoF/TMOkIty+PVlYD+//Vl2xnoUEIRaMXHwHfm0r2xUX++oeRaSScg
7+
YizJdUxe5jvBuBszGPRc/mGpb9YvP0sB+FL1KmuxYmdODfCe51zl8uM/CVhouJ3w
8+
DjmRGscCgYAuFlfC7p+e8huCKydfcv/beftqjewiOPpQ3u5uI6KPCtCJPpDhs3+4
9+
IihH2cPsAlqwGF4tlibW1+/z/OZ1AZinPK3y7b2jSJASEaPeEltVzB92hcd1khk2
10+
jTYcmSsV4VddplOPK9czytR/GbbibxsrhhgZUbd8LPbvIgaiadJ1PgIUBnJ/5vN2
11+
CVArsEzlPUCbohPvZnE=
12+
-----END DSA PRIVATE KEY-----

test/fixtures/pkey/dsa256.pem

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN DSA PRIVATE KEY-----
2+
MIH3AgEAAkEAhk2libbY2a8y2Pt21+YPYGZeW6wzaW2yfj5oiClXro9XMR7XWLkE
3+
9B7XxLNFCS2gmCCdMsMW1HulaHtLFQmB2wIVAM43JZrcgpu6ajZ01VkLc93gu/Ed
4+
AkAOhujZrrKV5CzBKutKLb0GVyVWmdC7InoNSMZEeGU72rT96IjM59YzoqmD0pGM
5+
3I1o4cGqg1D1DfM1rQlnN1eSAkBq6xXfEDwJ1mLNxF6q8Zm/ugFYWR5xcX/3wFiT
6+
b4+EjHP/DbNh9Vm5wcfnDBJ1zKvrMEf2xqngYdrV/3CiGJeKAhRvL57QvJZcQGvn
7+
ISNX5cMzFHRW3Q==
8+
-----END DSA PRIVATE KEY-----

test/fixtures/pkey/dsa512.pem

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN DSA PRIVATE KEY-----
2+
MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
3+
RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
4+
AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
5+
S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
6+
Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
7+
55jreJD3Se3slps=
8+
-----END DSA PRIVATE KEY-----

test/fixtures/pkey/p256.pem

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIID49FDqcf1O1eO8saTgG70UbXQw9Fqwseliit2aWhH1oAoGCCqGSM49
3+
AwEHoUQDQgAEFglk2c+oVUIKQ64eZG9bhLNPWB7lSZ/ArK41eGy5wAzU/0G51Xtt
4+
CeBUl+MahZtn9fO1JKdF4qJmS39dXnpENg==
5+
-----END EC PRIVATE KEY-----

test/fixtures/pkey/rsa1024.pem

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIICXgIBAAKBgQDLwsSw1ECnPtT+PkOgHhcGA71nwC2/nL85VBGnRqDxOqjVh7Cx
3+
aKPERYHsk4BPCkE3brtThPWc9kjHEQQ7uf9Y1rbCz0layNqHyywQEVLFmp1cpIt/
4+
Q3geLv8ZD9pihowKJDyMDiN6ArYUmZczvW4976MU3+l54E6lF/JfFEU5hwIDAQAB
5+
AoGBAKSl/MQarye1yOysqX6P8fDFQt68VvtXkNmlSiKOGuzyho0M+UVSFcs6k1L0
6+
maDE25AMZUiGzuWHyaU55d7RXDgeskDMakD1v6ZejYtxJkSXbETOTLDwUWTn618T
7+
gnb17tU1jktUtU67xK/08i/XodlgnQhs6VoHTuCh3Hu77O6RAkEA7+gxqBuZR572
8+
74/akiW/SuXm0SXPEviyO1MuSRwtI87B02D0qgV8D1UHRm4AhMnJ8MCs1809kMQE
9+
JiQUCrp9mQJBANlt2ngBO14us6NnhuAseFDTBzCHXwUUu1YKHpMMmxpnGqaldGgX
10+
sOZB3lgJsT9VlGf3YGYdkLTNVbogQKlKpB8CQQDiSwkb4vyQfDe8/NpU5Not0fII
11+
8jsDUCb+opWUTMmfbxWRR3FBNu8wnym/m19N4fFj8LqYzHX4KY0oVPu6qvJxAkEA
12+
wa5snNekFcqONLIE4G5cosrIrb74sqL8GbGb+KuTAprzj5z1K8Bm0UW9lTjVDjDi
13+
qRYgZfZSL+x1P/54+xTFSwJAY1FxA/N3QPCXCjPh5YqFxAMQs2VVYTfg+t0MEcJD
14+
dPMQD5JX6g5HKnHFg2mZtoXQrWmJSn7p8GJK8yNTopEErA==
15+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)