2024-05-02 00:46:19 +00:00
|
|
|
{ lib, stdenv, fetchurl, buildPackages, perl, coreutils, writeShellScript
|
2024-05-13 21:24:10 +00:00
|
|
|
, makeWrapper, withCryptodev ? false, cryptodev ? null, withZlib ? false, zlib
|
|
|
|
, enableSSL2 ? false, enableSSL3 ? false, enableKTLS ? stdenv.isLinux, static ?
|
|
|
|
stdenv.hostPlatform.isStatic
|
|
|
|
# path to openssl.cnf file. will be placed in $etc/etc/ssl/openssl.cnf to replace the default
|
|
|
|
, conf ? null, removeReferencesTo, testers }:
|
2024-05-02 00:46:19 +00:00
|
|
|
|
|
|
|
# Note: this package is used for bootstrapping fetchurl, and thus
|
|
|
|
# cannot use fetchpatch! All mutable patches (generated by GitHub or
|
|
|
|
# cgit) that are needed here should be included directly in Nixpkgs as
|
|
|
|
# files.
|
|
|
|
|
|
|
|
let
|
2024-05-13 21:24:10 +00:00
|
|
|
common = { version, hash, patches ? [ ], withDocs ? false, extraMeta ? { } }:
|
|
|
|
stdenv.mkDerivation (finalAttrs: {
|
|
|
|
pname = "openssl";
|
|
|
|
inherit version;
|
|
|
|
|
|
|
|
src = fetchurl {
|
|
|
|
url =
|
|
|
|
"https://www.openssl.org/source/${finalAttrs.pname}-${version}.tar.gz";
|
|
|
|
inherit hash;
|
|
|
|
};
|
|
|
|
|
|
|
|
inherit patches;
|
|
|
|
|
|
|
|
postPatch = ''
|
|
|
|
patchShebangs Configure
|
|
|
|
'' + lib.optionalString (lib.versionOlder version "1.1.1") ''
|
|
|
|
patchShebangs test/*
|
|
|
|
for a in test/t* ; do
|
|
|
|
substituteInPlace "$a" \
|
|
|
|
--replace /bin/rm rm
|
|
|
|
done
|
|
|
|
''
|
|
|
|
# config is a configure script which is not installed.
|
|
|
|
+ lib.optionalString (lib.versionAtLeast version "1.1.1") ''
|
|
|
|
substituteInPlace config --replace '/usr/bin/env' '${buildPackages.coreutils}/bin/env'
|
|
|
|
'' + lib.optionalString
|
|
|
|
(lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isMusl) ''
|
|
|
|
substituteInPlace crypto/async/arch/async_posix.h \
|
|
|
|
--replace '!defined(__ANDROID__) && !defined(__OpenBSD__)' \
|
|
|
|
'!defined(__ANDROID__) && !defined(__OpenBSD__) && 0'
|
|
|
|
''
|
|
|
|
# Move ENGINESDIR into OPENSSLDIR for static builds, in order to move
|
|
|
|
# it to the separate etc output.
|
|
|
|
+ lib.optionalString static ''
|
|
|
|
substituteInPlace Configurations/unix-Makefile.tmpl \
|
|
|
|
--replace 'ENGINESDIR=$(libdir)/engines-{- $sover_dirname -}' \
|
|
|
|
'ENGINESDIR=$(OPENSSLDIR)/engines-{- $sover_dirname -}'
|
|
|
|
'';
|
|
|
|
|
|
|
|
outputs = [ "bin" "dev" "out" "man" ] ++ lib.optional withDocs "doc"
|
|
|
|
# Separate output for the runtime dependencies of the static build.
|
|
|
|
# Specifically, move OPENSSLDIR into this output, as its path will be
|
|
|
|
# compiled into 'libcrypto.a'. This makes it a runtime dependency of
|
|
|
|
# any package that statically links openssl, so we want to keep that
|
|
|
|
# output minimal.
|
|
|
|
++ lib.optional static "etc";
|
|
|
|
setOutputFlags = false;
|
|
|
|
separateDebugInfo = !stdenv.hostPlatform.isDarwin
|
|
|
|
&& !(stdenv.hostPlatform.useLLVM or false) && stdenv.cc.isGNU;
|
|
|
|
|
|
|
|
nativeBuildInputs =
|
|
|
|
lib.optional (!stdenv.hostPlatform.isWindows) makeWrapper ++ [ perl ]
|
|
|
|
++ lib.optionals static [ removeReferencesTo ];
|
|
|
|
buildInputs = lib.optional withCryptodev cryptodev
|
|
|
|
++ lib.optional withZlib zlib;
|
|
|
|
|
|
|
|
# TODO(@Ericson2314): Improve with mass rebuild
|
|
|
|
configurePlatforms = [ ];
|
|
|
|
configureScript = {
|
2024-05-02 00:46:19 +00:00
|
|
|
armv5tel-linux = "./Configure linux-armv4 -march=armv5te";
|
|
|
|
armv6l-linux = "./Configure linux-armv4 -march=armv6";
|
|
|
|
armv7l-linux = "./Configure linux-armv4 -march=armv7-a";
|
2024-05-13 21:24:10 +00:00
|
|
|
x86_64-darwin = "./Configure darwin64-x86_64-cc";
|
2024-05-02 00:46:19 +00:00
|
|
|
aarch64-darwin = "./Configure darwin64-arm64-cc";
|
|
|
|
x86_64-linux = "./Configure linux-x86_64";
|
|
|
|
x86_64-solaris = "./Configure solaris64-x86_64-gcc";
|
|
|
|
powerpc64-linux = "./Configure linux-ppc64";
|
|
|
|
riscv64-linux = "./Configure linux64-riscv64";
|
2024-05-13 21:24:10 +00:00
|
|
|
}.${stdenv.hostPlatform.system} or (if stdenv.hostPlatform
|
|
|
|
== stdenv.buildPlatform then
|
|
|
|
"./config"
|
|
|
|
else if stdenv.hostPlatform.isBSD then
|
|
|
|
if stdenv.hostPlatform.isx86_64 then
|
|
|
|
"./Configure BSD-x86_64"
|
|
|
|
else if stdenv.hostPlatform.isx86_32 then
|
|
|
|
"./Configure BSD-x86"
|
|
|
|
+ lib.optionalString stdenv.hostPlatform.isElf "-elf"
|
2024-05-02 00:46:19 +00:00
|
|
|
else
|
2024-05-13 21:24:10 +00:00
|
|
|
"./Configure BSD-generic${
|
|
|
|
toString stdenv.hostPlatform.parsed.cpu.bits
|
|
|
|
}"
|
|
|
|
else if stdenv.hostPlatform.isMinGW then
|
|
|
|
"./Configure mingw${
|
|
|
|
lib.optionalString (stdenv.hostPlatform.parsed.cpu.bits != 32)
|
|
|
|
(toString stdenv.hostPlatform.parsed.cpu.bits)
|
|
|
|
}"
|
|
|
|
else if stdenv.hostPlatform.isLinux then
|
|
|
|
if stdenv.hostPlatform.isx86_64 then
|
|
|
|
"./Configure linux-x86_64"
|
|
|
|
else if stdenv.hostPlatform.isMips32 then
|
|
|
|
"./Configure linux-mips32"
|
|
|
|
else if stdenv.hostPlatform.isMips64n32 then
|
|
|
|
"./Configure linux-mips64"
|
|
|
|
else if stdenv.hostPlatform.isMips64n64 then
|
|
|
|
"./Configure linux64-mips64"
|
|
|
|
else
|
|
|
|
"./Configure linux-generic${
|
|
|
|
toString stdenv.hostPlatform.parsed.cpu.bits
|
|
|
|
}"
|
|
|
|
else if stdenv.hostPlatform.isiOS then
|
|
|
|
"./Configure ios${toString stdenv.hostPlatform.parsed.cpu.bits}-cross"
|
|
|
|
else
|
|
|
|
throw
|
|
|
|
"Not sure what configuration to use for ${stdenv.hostPlatform.config}");
|
|
|
|
|
|
|
|
# OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags.
|
|
|
|
dontAddStaticConfigureFlags = true;
|
|
|
|
configureFlags = [
|
|
|
|
"shared" # "shared" builds both shared and static libraries
|
|
|
|
"--libdir=lib"
|
|
|
|
(if !static then
|
|
|
|
"--openssldir=etc/ssl"
|
|
|
|
else
|
|
|
|
# Move OPENSSLDIR to the 'etc' output for static builds. Prepend '/.'
|
|
|
|
# to the path to make it appear absolute before variable expansion,
|
|
|
|
# else the 'prefix' would be prepended to it.
|
|
|
|
"--openssldir=/.$(etc)/etc/ssl")
|
|
|
|
] ++ lib.optionals withCryptodev [
|
|
|
|
"-DHAVE_CRYPTODEV"
|
|
|
|
"-DUSE_CRYPTODEV_DIGESTS"
|
|
|
|
] ++ lib.optional enableSSL2 "enable-ssl2" ++ lib.optional enableSSL3
|
|
|
|
"enable-ssl3"
|
|
|
|
# We select KTLS here instead of the configure-time detection (which we patch out).
|
|
|
|
# KTLS should work on FreeBSD 13+ as well, so we could enable it if someone tests it.
|
|
|
|
++ lib.optional (lib.versionAtLeast version "3.0.0" && enableKTLS)
|
|
|
|
"enable-ktls" ++ lib.optional
|
|
|
|
(lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isAarch64)
|
|
|
|
"no-afalgeng"
|
|
|
|
# OpenSSL needs a specific `no-shared` configure flag.
|
|
|
|
# See https://wiki.openssl.org/index.php/Compilation_and_Installation#Configure_Options
|
|
|
|
# for a comprehensive list of configuration options.
|
|
|
|
++ lib.optional (lib.versionAtLeast version "1.1.1" && static)
|
|
|
|
"no-shared"
|
|
|
|
++ lib.optional (lib.versionAtLeast version "3.0.0" && static)
|
|
|
|
"no-module"
|
|
|
|
# This introduces a reference to the CTLOG_FILE which is undesired when
|
|
|
|
# trying to build binaries statically.
|
|
|
|
++ lib.optional static "no-ct" ++ lib.optional withZlib "zlib"
|
|
|
|
++ lib.optionals
|
|
|
|
(stdenv.hostPlatform.isMips && stdenv.hostPlatform ? gcc.arch) [
|
|
|
|
# This is necessary in order to avoid openssl adding -march
|
|
|
|
# flags which ultimately conflict with those added by
|
|
|
|
# cc-wrapper. Openssl assumes that it can scan CFLAGS to
|
|
|
|
# detect any -march flags, using this perl code:
|
|
|
|
#
|
|
|
|
# && !grep { $_ =~ /-m(ips|arch=)/ } (@{$config{CFLAGS}})
|
|
|
|
#
|
|
|
|
# The following bogus CFLAGS environment variable triggers the
|
|
|
|
# the code above, inhibiting `./Configure` from adding the
|
|
|
|
# conflicting flags.
|
|
|
|
"CFLAGS=-march=${stdenv.hostPlatform.gcc.arch}"
|
|
|
|
];
|
|
|
|
|
|
|
|
makeFlags = [
|
|
|
|
"MANDIR=$(man)/share/man"
|
|
|
|
# This avoids conflicts between man pages of openssl subcommands (for
|
|
|
|
# example 'ts' and 'err') man pages and their equivalent top-level
|
|
|
|
# command in other packages (respectively man-pages and moreutils).
|
|
|
|
# This is done in ubuntu and archlinux, and possiibly many other distros.
|
|
|
|
"MANSUFFIX=ssl"
|
|
|
|
];
|
2024-05-02 00:46:19 +00:00
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
enableParallelBuilding = true;
|
|
|
|
|
|
|
|
postInstall = (if static then ''
|
|
|
|
# OPENSSLDIR has a reference to self
|
|
|
|
remove-references-to -t $out $out/lib/*.a
|
|
|
|
'' else ''
|
|
|
|
# If we're building dynamic libraries, then don't install static
|
|
|
|
# libraries.
|
|
|
|
if [ -n "$(echo $out/lib/*.so $out/lib/*.dylib $out/lib/*.dll)" ]; then
|
|
|
|
rm "$out/lib/"*.a
|
|
|
|
fi
|
|
|
|
|
|
|
|
# 'etc' is a separate output on static builds only.
|
|
|
|
etc=$out
|
|
|
|
'') + ''
|
|
|
|
mkdir -p $bin
|
|
|
|
mv $out/bin $bin/bin
|
|
|
|
|
|
|
|
'' + lib.optionalString (!stdenv.hostPlatform.isWindows)
|
2024-05-02 00:46:19 +00:00
|
|
|
# makeWrapper is broken for windows cross (https://github.com/NixOS/nixpkgs/issues/120726)
|
2024-05-13 21:24:10 +00:00
|
|
|
''
|
|
|
|
# c_rehash is a legacy perl script with the same functionality
|
|
|
|
# as `openssl rehash`
|
|
|
|
# this wrapper script is created to maintain backwards compatibility without
|
|
|
|
# depending on perl
|
|
|
|
makeWrapper $bin/bin/openssl $bin/bin/c_rehash \
|
|
|
|
--add-flags "rehash"
|
|
|
|
'' + ''
|
|
|
|
|
|
|
|
mkdir $dev
|
|
|
|
mv $out/include $dev/
|
|
|
|
|
|
|
|
# remove dependency on Perl at runtime
|
|
|
|
rm -r $etc/etc/ssl/misc
|
|
|
|
|
|
|
|
rmdir $etc/etc/ssl/{certs,private}
|
|
|
|
|
|
|
|
${lib.optionalString (conf != null)
|
|
|
|
"cat ${conf} > $etc/etc/ssl/openssl.cnf"}
|
|
|
|
'';
|
|
|
|
|
|
|
|
postFixup = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
|
|
|
|
# Check to make sure the main output and the static runtime dependencies
|
|
|
|
# don't depend on perl
|
|
|
|
if grep -r '${buildPackages.perl}' $out $etc; then
|
|
|
|
echo "Found an erroneous dependency on perl ^^^" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
|
|
|
|
passthru.tests.pkg-config =
|
|
|
|
testers.testMetaPkgConfig finalAttrs.finalPackage;
|
|
|
|
|
|
|
|
meta = with lib;
|
|
|
|
{
|
|
|
|
homepage = "https://www.openssl.org/";
|
|
|
|
changelog =
|
|
|
|
"https://github.com/openssl/openssl/blob/openssl-${version}/CHANGES.md";
|
|
|
|
description =
|
|
|
|
"A cryptographic library that implements the SSL and TLS protocols";
|
|
|
|
license = licenses.openssl;
|
|
|
|
mainProgram = "openssl";
|
|
|
|
maintainers = with maintainers; [ thillux ];
|
|
|
|
pkgConfigModules = [ "libcrypto" "libssl" "openssl" ];
|
|
|
|
platforms = platforms.all;
|
|
|
|
} // extraMeta;
|
|
|
|
});
|
2024-05-02 00:46:19 +00:00
|
|
|
|
|
|
|
in {
|
|
|
|
# intended version "policy":
|
|
|
|
# - 1.1 as long as some package exists, which does not build without it
|
|
|
|
# - latest 3.x LTS
|
|
|
|
# - latest 3.x non-LTS as preview/for development
|
|
|
|
#
|
|
|
|
# - other versions in between only when reasonable need is stated for some package
|
|
|
|
# - backport every security critical fix release e.g. 3.0.y -> 3.0.y+1 but no new version, e.g. 3.1 -> 3.2
|
|
|
|
|
|
|
|
# If you do upgrade here, please update in pkgs/top-level/release.nix
|
|
|
|
# the permitted insecure version to ensure it gets cached for our users
|
|
|
|
# and backport this to stable release (23.05).
|
|
|
|
openssl_1_1 = common {
|
|
|
|
version = "1.1.1w";
|
|
|
|
hash = "sha256-zzCYlQy02FOtlcCEHx+cbT3BAtzPys1SHZOSUgi3asg=";
|
|
|
|
patches = [
|
|
|
|
./1.1/nix-ssl-cert-file.patch
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
(if stdenv.hostPlatform.isDarwin then
|
|
|
|
./use-etc-ssl-certs-darwin.patch
|
|
|
|
else
|
|
|
|
./use-etc-ssl-certs.patch)
|
2024-05-02 00:46:19 +00:00
|
|
|
];
|
|
|
|
withDocs = true;
|
|
|
|
extraMeta = {
|
|
|
|
knownVulnerabilities = [
|
|
|
|
"OpenSSL 1.1 is reaching its end of life on 2023/09/11 and cannot be supported through the NixOS 23.05 release cycle. https://www.openssl.org/blog/blog/2023/03/28/1.1.1-EOL/"
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
openssl_3 = common {
|
|
|
|
version = "3.0.13";
|
|
|
|
hash = "sha256-iFJXU/edO+wn0vp8ZqoLkrOqlJja/ZPXz6SzeAza4xM=";
|
|
|
|
|
|
|
|
patches = [
|
|
|
|
./3.0/nix-ssl-cert-file.patch
|
|
|
|
|
|
|
|
# openssl will only compile in KTLS if the current kernel supports it.
|
|
|
|
# This patch disables build-time detection.
|
|
|
|
./3.0/openssl-disable-kernel-detection.patch
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
(if stdenv.hostPlatform.isDarwin then
|
|
|
|
./use-etc-ssl-certs-darwin.patch
|
|
|
|
else
|
|
|
|
./use-etc-ssl-certs.patch)
|
2024-05-02 00:46:19 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
withDocs = true;
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
extraMeta = with lib; { license = licenses.asl20; };
|
2024-05-02 00:46:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
openssl_3_2 = common {
|
|
|
|
version = "3.2.1";
|
|
|
|
hash = "sha256-g8cyn+UshQZ3115dCwyiRTCbl+jsvP3B39xKufrDWzk=";
|
|
|
|
|
|
|
|
patches = [
|
|
|
|
./3.0/nix-ssl-cert-file.patch
|
|
|
|
|
|
|
|
# openssl will only compile in KTLS if the current kernel supports it.
|
|
|
|
# This patch disables build-time detection.
|
|
|
|
./3.0/openssl-disable-kernel-detection.patch
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
(if stdenv.hostPlatform.isDarwin then
|
|
|
|
./3.2/use-etc-ssl-certs-darwin.patch
|
|
|
|
else
|
|
|
|
./3.2/use-etc-ssl-certs.patch)
|
2024-05-02 00:46:19 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
withDocs = true;
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
extraMeta = with lib; { license = licenses.asl20; };
|
2024-05-02 00:46:19 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
openssl_3_3 = common {
|
|
|
|
version = "3.3.0";
|
|
|
|
hash = "sha256-U+ZrBDMipgar8Ah+dpmg4DOjf6E/65dC3zXDozsY+wI=";
|
|
|
|
|
|
|
|
patches = [
|
|
|
|
./3.0/nix-ssl-cert-file.patch
|
|
|
|
|
|
|
|
# openssl will only compile in KTLS if the current kernel supports it.
|
|
|
|
# This patch disables build-time detection.
|
|
|
|
./3.0/openssl-disable-kernel-detection.patch
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
(if stdenv.hostPlatform.isDarwin then
|
|
|
|
./3.2/use-etc-ssl-certs-darwin.patch
|
|
|
|
else
|
|
|
|
./3.2/use-etc-ssl-certs.patch)
|
2024-05-02 00:46:19 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
withDocs = true;
|
|
|
|
|
2024-05-13 21:24:10 +00:00
|
|
|
extraMeta = with lib; { license = licenses.asl20; };
|
2024-05-02 00:46:19 +00:00
|
|
|
};
|
|
|
|
}
|