1{
2 lib,
3 stdenv,
4 llvmPackages,
5 rustPlatform,
6 fetchFromGitHub,
7 pkg-config,
8 openssl,
9 nixosTests,
10}:
11
12let
13 version = "0.2.1";
14 target = stdenv.hostPlatform.rust.rustcTargetSpec;
15 libExt = stdenv.hostPlatform.extensions.sharedLibrary;
16in
17rustPlatform.buildRustPackage {
18 pname = "rustls-libssl";
19 inherit version;
20
21 src = fetchFromGitHub {
22 owner = "rustls";
23 repo = "rustls-openssl-compat";
24 rev = "v/${version}";
25 hash = "sha256-/QSFrkFVSRBmpXHc80dJFnYwvVYceAFnoCtmAGtnmqo=";
26 };
27
28 # NOTE: No longer necessary in the next release.
29 sourceRoot = "source/rustls-libssl";
30
31 cargoHash = "sha256-eVdcYJnJVduRk3zK9VQ1rE6AwjaXAG1h1g/fVHr4mqQ=";
32
33 nativeBuildInputs = [
34 pkg-config # for openssl-sys
35 llvmPackages.lld # build.rs specifies LLD as linker
36 ];
37 buildInputs = [
38 openssl
39 ];
40
41 preCheck = ''
42 # tests dlopen libcrypto.so.3
43 export LD_LIBRARY_PATH=${lib.makeLibraryPath [ openssl ]}
44 '';
45
46 # rustls-libssl normally wants to be swapped in for libssl, and reuses
47 # libcrypto. Here, we accomplish something similar by symlinking most of
48 # OpenSSL, replacing only libssl.
49 outputs = [
50 "out"
51 "dev"
52 ];
53 installPhase = ''
54 mkdir -p $out/lib $dev/lib/pkgconfig
55
56 mv target/${target}/release/libssl${libExt} $out/lib/libssl${libExt}.3
57 ln -s libssl${libExt}.3 $out/lib/libssl${libExt}
58
59 ln -s ${openssl.out}/lib/libcrypto${libExt}.3 $out/lib/
60 ln -s libcrypto${libExt}.3 $out/lib/libcrypto${libExt}
61
62 if [[ -e ${openssl.out}/lib/engines-3 ]]; then
63 ln -s ${openssl.out}/lib/engines-3 $out/lib/
64 fi
65 if [[ -e ${openssl.out}/lib/ossl-modules ]]; then
66 ln -s ${openssl.out}/lib/ossl-modules $out/lib/
67 fi
68
69 ln -s ${openssl.dev}/include $dev/
70
71 cp ${openssl.dev}/lib/pkgconfig/*.pc $dev/lib/pkgconfig/
72 sed -i \
73 -e "s|${openssl.out}|$out|g" \
74 -e "s|${openssl.dev}|$dev|g" \
75 $dev/lib/pkgconfig/*.pc
76 '';
77
78 passthru.tests = nixosTests.rustls-libssl;
79
80 meta = {
81 description = "Partial reimplementation of the OpenSSL 3 libssl ABI using rustls";
82 homepage = "https://github.com/rustls/rustls-openssl-compat";
83 changelog = "https://github.com/rustls/rustls-openssl-compat/releases";
84 license = lib.licenses.asl20;
85 platforms = lib.platforms.linux;
86 maintainers = with lib.maintainers; [
87 stephank
88 cpu
89 ];
90 };
91}