Skip to content

Commit 407ceac

Browse files
committed
Try to load library by explicitly stated (known to work) version first
We know that we support OpenSSL 1.1 and 1.0, so rather than hoping that /usr/lib64/libssl.so points to a supported version, we should try those first and fall back to the symlink later. This matches the dependency stated in META6.json more closely. Fixes GH #16 and #54 and #59
1 parent 6baffdc commit 407ceac

File tree

14 files changed

+142
-102
lines changed

14 files changed

+142
-102
lines changed

lib/OpenSSL/Bio.pm6

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class BIO is repr('CStruct') {
3737
has int32 $.dummy;
3838
}
3939

40-
our sub BIO_new_bio_pair(CArray[OpaquePointer], long, CArray[OpaquePointer], long --> int32) is native(&gen-lib) { ... }
41-
our sub BIO_free(OpaquePointer) is native(&gen-lib) { ... }
42-
our sub BIO_read(OpaquePointer, Blob, long --> int32) is native(&gen-lib) { ... }
43-
our sub BIO_write(OpaquePointer, Blob, long --> int32) is native(&gen-lib) { ... }
44-
our sub BIO_new_mem_buf(Blob, long --> OpaquePointer) is native(&gen-lib) { ... }
40+
our sub BIO_new_bio_pair(CArray[OpaquePointer], long, CArray[OpaquePointer], long --> int32) is native(gen-lib) { ... }
41+
our sub BIO_free(OpaquePointer) is native(gen-lib) { ... }
42+
our sub BIO_read(OpaquePointer, Blob, long --> int32) is native(gen-lib) { ... }
43+
our sub BIO_write(OpaquePointer, Blob, long --> int32) is native(gen-lib) { ... }
44+
our sub BIO_new_mem_buf(Blob, long --> OpaquePointer) is native(gen-lib) { ... }

lib/OpenSSL/Ctx.pm6

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ class SSL_CTX is repr('CStruct') {
88
has OpenSSL::Method::SSL_METHOD $.method;
99
}
1010

11-
our sub SSL_CTX_new(OpenSSL::Method::SSL_METHOD) returns SSL_CTX is native(&ssl-lib) { ... }
12-
our sub SSL_CTX_free(SSL_CTX) is native(&ssl-lib) { ... }
13-
our sub SSL_CTX_ctrl(SSL_CTX, int32, long, Pointer) returns long is native(&ssl-lib) { ... }
11+
our sub SSL_CTX_new(OpenSSL::Method::SSL_METHOD) returns SSL_CTX is native(ssl-lib) { ... }
12+
our sub SSL_CTX_free(SSL_CTX) is native(ssl-lib) { ... }
13+
our sub SSL_CTX_ctrl(SSL_CTX, int32, long, Pointer) returns long is native(ssl-lib) { ... }
1414

15-
our sub SSL_CTX_use_certificate(SSL_CTX, Pointer) returns int32 is native(&ssl-lib) { ... }
16-
our sub SSL_CTX_use_certificate_file(SSL_CTX, Str, int32) returns int32 is native(&ssl-lib) { ... }
17-
our sub SSL_CTX_use_certificate_chain_file(SSL_CTX, Str) returns int32 is native(&ssl-lib) { ... }
18-
our sub SSL_CTX_use_PrivateKey(SSL_CTX, Pointer) returns int32 is native(&ssl-lib) { ... }
19-
our sub SSL_CTX_use_PrivateKey_file(SSL_CTX, Str, int32) returns int32 is native(&ssl-lib) { ... }
20-
our sub SSL_CTX_check_private_key(SSL_CTX) returns int32 is native(&ssl-lib) { ... }
15+
our sub SSL_CTX_use_certificate(SSL_CTX, Pointer) returns int32 is native(ssl-lib) { ... }
16+
our sub SSL_CTX_use_certificate_file(SSL_CTX, Str, int32) returns int32 is native(ssl-lib) { ... }
17+
our sub SSL_CTX_use_certificate_chain_file(SSL_CTX, Str) returns int32 is native(ssl-lib) { ... }
18+
our sub SSL_CTX_use_PrivateKey(SSL_CTX, Pointer) returns int32 is native(ssl-lib) { ... }
19+
our sub SSL_CTX_use_PrivateKey_file(SSL_CTX, Str, int32) returns int32 is native(ssl-lib) { ... }
20+
our sub SSL_CTX_check_private_key(SSL_CTX) returns int32 is native(ssl-lib) { ... }

lib/OpenSSL/Digest.pm6

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ our constant SHA256_DIGEST_LENGTH = 32;
99
our constant SHA384_DIGEST_LENGTH = 48;
1010
our constant SHA512_DIGEST_LENGTH = 64;
1111

12-
sub MD5( Blob, size_t, Blob ) is native(&gen-lib) { ... }
13-
sub SHA1( Blob, size_t, Blob ) is native(&gen-lib) { ... }
14-
sub SHA256( Blob, size_t, Blob ) is native(&gen-lib) { ... }
15-
sub SHA384( Blob, size_t, Blob ) is native(&gen-lib) { ... }
16-
sub SHA512( Blob, size_t, Blob ) is native(&gen-lib) { ... }
12+
sub MD5( Blob, size_t, Blob ) is native(gen-lib) { ... }
13+
sub SHA1( Blob, size_t, Blob ) is native(gen-lib) { ... }
14+
sub SHA256( Blob, size_t, Blob ) is native(gen-lib) { ... }
15+
sub SHA384( Blob, size_t, Blob ) is native(gen-lib) { ... }
16+
sub SHA512( Blob, size_t, Blob ) is native(gen-lib) { ... }
1717

1818
sub md5(Blob $msg) is export {
1919
my $digest = buf8.allocate(MD5_DIGEST_LENGTH);

lib/OpenSSL/Digest/MD5.pm6

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ class OpenSSL::Digest::MD5
88
{
99
has $!context;
1010

11-
sub MD5_Init(Blob) returns int32 is native(&gen-lib) { * }
12-
sub MD5_Update(Blob, Blob, size_t) returns int32 is native(&gen-lib) { * }
13-
sub MD5_Final(Blob, Blob) returns int32 is native(&gen-lib) { * }
11+
sub MD5_Init(Blob) returns int32 is native(gen-lib) { * }
12+
sub MD5_Update(Blob, Blob, size_t) returns int32 is native(gen-lib) { * }
13+
sub MD5_Final(Blob, Blob) returns int32 is native(gen-lib) { * }
1414

1515
submethod BUILD() {
1616
$!context = buf8.allocate(MD5-CTX-SIZE);

lib/OpenSSL/EVP.pm6

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ unit module OpenSSL::EVP;
33
use OpenSSL::NativeLib;
44
use NativeCall;
55

6-
our sub EVP_PKEY_get1_RSA(OpaquePointer --> OpaquePointer) is native(&gen-lib) { ... }
7-
our sub EVP_PKEY_free(OpaquePointer) is native(&gen-lib) { ... }
6+
our sub EVP_PKEY_get1_RSA(OpaquePointer --> OpaquePointer) is native(gen-lib) { ... }
7+
our sub EVP_PKEY_free(OpaquePointer) is native(gen-lib) { ... }
88

9-
our sub EVP_CIPHER_CTX_new(--> OpaquePointer) is native(&gen-lib) { ... }
10-
our sub EVP_CIPHER_CTX_free(OpaquePointer) is native(&gen-lib) { ... }
9+
our sub EVP_CIPHER_CTX_new(--> OpaquePointer) is native(gen-lib) { ... }
10+
our sub EVP_CIPHER_CTX_free(OpaquePointer) is native(gen-lib) { ... }
1111

12-
our sub EVP_EncryptInit(OpaquePointer, OpaquePointer, Blob, Blob --> int32) is native(&gen-lib) { ... }
13-
our sub EVP_EncryptUpdate(OpaquePointer, Blob, CArray[int32], Blob, int32 --> int32) is native(&gen-lib) { ... }
14-
our sub EVP_EncryptFinal(OpaquePointer, Blob, CArray[int32] --> int32) is native(&gen-lib) { ... }
12+
our sub EVP_EncryptInit(OpaquePointer, OpaquePointer, Blob, Blob --> int32) is native(gen-lib) { ... }
13+
our sub EVP_EncryptUpdate(OpaquePointer, Blob, CArray[int32], Blob, int32 --> int32) is native(gen-lib) { ... }
14+
our sub EVP_EncryptFinal(OpaquePointer, Blob, CArray[int32] --> int32) is native(gen-lib) { ... }
1515

16-
our sub EVP_DecryptInit(OpaquePointer, OpaquePointer, Blob, Blob --> int32) is native(&gen-lib) { ... }
17-
our sub EVP_DecryptUpdate(OpaquePointer, Blob, CArray[int32], Blob, int32 --> int32) is native(&gen-lib) { ... }
18-
our sub EVP_DecryptFinal(OpaquePointer, Blob, CArray[int32] --> int32) is native(&gen-lib) { ... }
16+
our sub EVP_DecryptInit(OpaquePointer, OpaquePointer, Blob, Blob --> int32) is native(gen-lib) { ... }
17+
our sub EVP_DecryptUpdate(OpaquePointer, Blob, CArray[int32], Blob, int32 --> int32) is native(gen-lib) { ... }
18+
our sub EVP_DecryptFinal(OpaquePointer, Blob, CArray[int32] --> int32) is native(gen-lib) { ... }
1919

2020
class evp_cipher_st is repr('CStruct') {
2121
has int32 $.nid;
@@ -34,6 +34,6 @@ class evp_cipher_st is repr('CStruct') {
3434
}
3535

3636
# ciphers
37-
our sub EVP_aes_128_cbc( --> OpaquePointer) is native(&gen-lib) { ... }
38-
our sub EVP_aes_192_cbc( --> OpaquePointer) is native(&gen-lib) { ... }
39-
our sub EVP_aes_256_cbc( --> OpaquePointer) is native(&gen-lib) { ... }
37+
our sub EVP_aes_128_cbc( --> OpaquePointer) is native(gen-lib) { ... }
38+
our sub EVP_aes_192_cbc( --> OpaquePointer) is native(gen-lib) { ... }
39+
our sub EVP_aes_256_cbc( --> OpaquePointer) is native(gen-lib) { ... }

lib/OpenSSL/Err.pm6

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ unit module OpenSSL::Err;
33
use OpenSSL::NativeLib;
44
use NativeCall;
55

6-
our sub ERR_error_string(int32 $e, Str $ret) returns Str is native(&gen-lib) { ... };
6+
our sub ERR_error_string(int32 $e, Str $ret) returns Str is native(gen-lib) { ... };
77

8-
our sub ERR_get_error() returns ulonglong is native(&gen-lib) { ... };
8+
our sub ERR_get_error() returns ulonglong is native(gen-lib) { ... };

lib/OpenSSL/Method.pm6

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,24 @@ class SSL_METHOD is repr('CStruct') {
77
has int32 $.version;
88
}
99

10-
our sub SSLv2_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
11-
our sub SSLv2_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
12-
our sub SSLv2_method() returns SSL_METHOD is native(&ssl-lib) { ... }
13-
our sub SSLv3_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
14-
our sub SSLv3_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
15-
our sub SSLv3_method() returns SSL_METHOD is native(&ssl-lib) { ... }
16-
our sub SSLv23_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
17-
our sub SSLv23_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
18-
our sub SSLv23_method() returns SSL_METHOD is native(&ssl-lib) { ... }
19-
our sub TLS_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
20-
our sub TLS_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
21-
our sub TLS_method() returns SSL_METHOD is native(&ssl-lib) { ... }
22-
our sub TLSv1_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
23-
our sub TLSv1_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
24-
our sub TLSv1_method() returns SSL_METHOD is native(&ssl-lib) { ... }
25-
our sub TLSv1_1_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
26-
our sub TLSv1_1_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
27-
our sub TLSv1_1_method() returns SSL_METHOD is native(&ssl-lib) { ... }
28-
our sub TLSv1_2_client_method() returns SSL_METHOD is native(&ssl-lib) { ... }
29-
our sub TLSv1_2_server_method() returns SSL_METHOD is native(&ssl-lib) { ... }
30-
our sub TLSv1_2_method() returns SSL_METHOD is native(&ssl-lib) { ... }
10+
our sub SSLv2_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
11+
our sub SSLv2_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
12+
our sub SSLv2_method() returns SSL_METHOD is native(ssl-lib) { ... }
13+
our sub SSLv3_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
14+
our sub SSLv3_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
15+
our sub SSLv3_method() returns SSL_METHOD is native(ssl-lib) { ... }
16+
our sub SSLv23_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
17+
our sub SSLv23_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
18+
our sub SSLv23_method() returns SSL_METHOD is native(ssl-lib) { ... }
19+
our sub TLS_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
20+
our sub TLS_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
21+
our sub TLS_method() returns SSL_METHOD is native(ssl-lib) { ... }
22+
our sub TLSv1_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
23+
our sub TLSv1_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
24+
our sub TLSv1_method() returns SSL_METHOD is native(ssl-lib) { ... }
25+
our sub TLSv1_1_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
26+
our sub TLSv1_1_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
27+
our sub TLSv1_1_method() returns SSL_METHOD is native(ssl-lib) { ... }
28+
our sub TLSv1_2_client_method() returns SSL_METHOD is native(ssl-lib) { ... }
29+
our sub TLSv1_2_server_method() returns SSL_METHOD is native(ssl-lib) { ... }
30+
our sub TLSv1_2_method() returns SSL_METHOD is native(ssl-lib) { ... }

lib/OpenSSL/NativeLib.pm6

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,61 @@
11
unit module OpenSSL::NativeLib;
22

3+
use NativeCall;
4+
5+
my $version;
6+
37
sub ssl-lib is export {
4-
state $lib = $*DISTRO.is-win
8+
state @lib = $*DISTRO.is-win
59
?? dll-resource('ssleay32.dll')
6-
!! $*VM.platform-library-name('ssl'.IO).Str;
10+
!! ('ssl', version)
11+
}
12+
13+
sub gen-lib-unversioned() {
14+
$*DISTRO.is-win
15+
?? dll-resource('libeay32.dll')
16+
!! 'ssl'
17+
}
18+
19+
sub gen-lib-version($v) {
20+
@ = $*DISTRO.is-win
21+
?? dll-resource('libeay32.dll')
22+
!! ('ssl', $v)
723
}
824

9-
sub gen-lib is export {
10-
state $lib = $*DISTRO.is-win
25+
sub gen-lib() is export {
26+
state @lib = $*DISTRO.is-win
1127
?? dll-resource('libeay32.dll')
12-
!! $*VM.platform-library-name('ssl'.IO).Str;
28+
!! ('ssl', version)
1329
}
1430

1531
sub crypto-lib is export {
16-
state $lib = $*DISTRO.is-win
32+
state @lib = $*DISTRO.is-win
1733
?? dll-resource('libeay32.dll')
18-
!! $*VM.platform-library-name('crypto'.IO).Str;
34+
!! ('crypto', version)
35+
}
36+
37+
sub version() {
38+
unless defined $version {
39+
for (v1.1, v1.0, v1.0.0) -> $v {
40+
try {
41+
my sub EVP_aes_128_cbc( --> Pointer) { };
42+
trait_mod:<is>(&EVP_aes_128_cbc, :native(gen-lib-version($v)));
43+
EVP_aes_128_cbc();
44+
$version = $v;
45+
}
46+
last if $version;
47+
}
48+
49+
try {
50+
my sub EVP_aes_128_cbc( --> Pointer) { };
51+
trait_mod:<is>(&EVP_aes_128_cbc, :native(gen-lib-unversioned()));
52+
EVP_aes_128_cbc();
53+
$version = '';
54+
}
55+
56+
die "Did not find {$*VM.platform-library-name('ssl'.IO)}" unless defined $version;
57+
}
58+
$version
1959
}
2060

2161
# Windows only

lib/OpenSSL/PEM.pm6

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ unit module OpenSSL::PEM;
33
use OpenSSL::NativeLib;
44
use NativeCall;
55

6-
our sub PEM_read_bio_RSAPrivateKey(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(&gen-lib) { ... }
7-
our sub PEM_read_bio_RSAPublicKey(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(&gen-lib) { ... }
8-
our sub PEM_read_bio_RSA_PUBKEY(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(&gen-lib) { ... }
9-
our sub PEM_read_bio_X509(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(&gen-lib) { ... }
6+
our sub PEM_read_bio_RSAPrivateKey(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(gen-lib) { ... }
7+
our sub PEM_read_bio_RSAPublicKey(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(gen-lib) { ... }
8+
our sub PEM_read_bio_RSA_PUBKEY(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(gen-lib) { ... }
9+
our sub PEM_read_bio_X509(OpaquePointer, OpaquePointer, OpaquePointer, OpaquePointer --> OpaquePointer) is native(gen-lib) { ... }

lib/OpenSSL/RSA.pm6

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ unit module OpenSSL::RSA;
33
use OpenSSL::NativeLib;
44
use NativeCall;
55

6-
our sub RSA_sign(int32, Blob, int32, Blob, CArray, OpaquePointer --> int32) is native(&gen-lib) { ... }
7-
our sub RSA_verify(int32, Blob, int32, Blob, int32, OpaquePointer --> int32) is native(&gen-lib) { ... }
6+
our sub RSA_sign(int32, Blob, int32, Blob, CArray, OpaquePointer --> int32) is native(gen-lib) { ... }
7+
our sub RSA_verify(int32, Blob, int32, Blob, int32, OpaquePointer --> int32) is native(gen-lib) { ... }
88

9-
our sub RSA_size(OpaquePointer --> int32) is native(&gen-lib) { ... }
10-
our sub RSA_free(OpaquePointer) is native(&gen-lib) { ... }
9+
our sub RSA_size(OpaquePointer --> int32) is native(gen-lib) { ... }
10+
our sub RSA_free(OpaquePointer) is native(gen-lib) { ... }

0 commit comments

Comments
 (0)