2023-03-03 09:00:16 +00:00
|
|
|
{ lib, stdenv, fetchurl, buildPackages, perl, coreutils, writeShellScript
|
|
|
|
, makeWrapper
|
2018-11-18 08:01:02 +00:00
|
|
|
, withCryptodev ? false, cryptodev
|
2022-09-08 12:06:02 +00:00
|
|
|
, withZlib ? false, zlib
|
2017-06-28 15:57:01 +00:00
|
|
|
, enableSSL2 ? false
|
2020-04-13 19:23:22 +00:00
|
|
|
, enableSSL3 ? false
|
2023-02-18 13:22:36 +00:00
|
|
|
, enableKTLS ? stdenv.isLinux
|
2020-12-20 06:11:26 +00:00
|
|
|
, static ? stdenv.hostPlatform.isStatic
|
2022-11-20 23:41:11 +00:00
|
|
|
# path to openssl.cnf file. will be placed in $etc/etc/ssl/openssl.cnf to replace the default
|
|
|
|
, conf ? null
|
2022-05-17 09:42:46 +00:00
|
|
|
, removeReferencesTo
|
2023-02-12 20:14:14 +00:00
|
|
|
, testers
|
2017-06-28 15:57:01 +00:00
|
|
|
}:
|
2008-04-23 07:34:20 +00:00
|
|
|
|
2020-06-26 20:44:45 +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.
|
|
|
|
|
2010-03-05 23:22:36 +00:00
|
|
|
let
|
2022-10-13 16:10:42 +00:00
|
|
|
common = { version, sha256, patches ? [], withDocs ? false, extraMeta ? {} }:
|
2023-02-12 20:14:14 +00:00
|
|
|
stdenv.mkDerivation (finalAttrs: {
|
2019-08-13 21:52:01 +00:00
|
|
|
pname = "openssl";
|
|
|
|
inherit version;
|
2016-02-03 12:54:22 +00:00
|
|
|
|
|
|
|
src = fetchurl {
|
2023-02-12 20:14:14 +00:00
|
|
|
url = "https://www.openssl.org/source/${finalAttrs.pname}-${version}.tar.gz";
|
2022-10-13 16:10:42 +00:00
|
|
|
inherit sha256;
|
2016-02-03 12:54:22 +00:00
|
|
|
};
|
|
|
|
|
2018-11-20 15:56:23 +00:00
|
|
|
inherit patches;
|
2010-07-18 21:54:14 +00:00
|
|
|
|
2018-08-08 19:00:07 +00:00
|
|
|
postPatch = ''
|
|
|
|
patchShebangs Configure
|
2022-08-01 15:48:17 +00:00
|
|
|
'' + lib.optionalString (lib.versionOlder version "1.1.1") ''
|
2018-08-08 19:00:07 +00:00
|
|
|
patchShebangs test/*
|
|
|
|
for a in test/t* ; do
|
|
|
|
substituteInPlace "$a" \
|
|
|
|
--replace /bin/rm rm
|
|
|
|
done
|
2021-01-01 20:42:07 +00:00
|
|
|
''
|
|
|
|
# config is a configure script which is not installed.
|
2022-01-15 07:06:53 +00:00
|
|
|
+ lib.optionalString (lib.versionAtLeast version "1.1.1") ''
|
2021-01-01 20:42:07 +00:00
|
|
|
substituteInPlace config --replace '/usr/bin/env' '${buildPackages.coreutils}/bin/env'
|
2022-08-01 15:48:17 +00:00
|
|
|
'' + lib.optionalString (lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isMusl) ''
|
2018-08-08 19:00:07 +00:00
|
|
|
substituteInPlace crypto/async/arch/async_posix.h \
|
|
|
|
--replace '!defined(__ANDROID__) && !defined(__OpenBSD__)' \
|
|
|
|
'!defined(__ANDROID__) && !defined(__OpenBSD__) && 0'
|
2022-07-23 21:06:06 +00:00
|
|
|
''
|
|
|
|
# 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 -}'
|
2018-08-08 19:00:07 +00:00
|
|
|
'';
|
2017-08-13 20:32:50 +00:00
|
|
|
|
2022-07-23 21:06:06 +00:00
|
|
|
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";
|
2017-01-27 20:28:42 +00:00
|
|
|
setOutputFlags = false;
|
2021-06-14 15:36:03 +00:00
|
|
|
separateDebugInfo =
|
|
|
|
!stdenv.hostPlatform.isDarwin &&
|
|
|
|
!(stdenv.hostPlatform.useLLVM or false) &&
|
|
|
|
stdenv.cc.isGNU;
|
2013-06-11 12:28:49 +00:00
|
|
|
|
2023-05-03 01:02:49 +00:00
|
|
|
nativeBuildInputs =
|
|
|
|
lib.optional (!stdenv.hostPlatform.isWindows) makeWrapper
|
|
|
|
++ [ perl ]
|
2022-09-20 14:25:47 +00:00
|
|
|
++ lib.optionals static [ removeReferencesTo ];
|
2021-03-11 08:12:41 +00:00
|
|
|
buildInputs = lib.optional withCryptodev cryptodev
|
2022-09-08 12:06:02 +00:00
|
|
|
++ lib.optional withZlib zlib;
|
2016-02-03 12:54:22 +00:00
|
|
|
|
2018-01-27 01:40:05 +00:00
|
|
|
# TODO(@Ericson2314): Improve with mass rebuild
|
2018-08-08 19:00:07 +00:00
|
|
|
configurePlatforms = [];
|
2018-01-27 01:40:05 +00:00
|
|
|
configureScript = {
|
2020-01-02 09:11:33 +00:00
|
|
|
armv5tel-linux = "./Configure linux-armv4 -march=armv5te";
|
2019-08-13 21:52:01 +00:00
|
|
|
armv6l-linux = "./Configure linux-armv4 -march=armv6";
|
|
|
|
armv7l-linux = "./Configure linux-armv4 -march=armv7-a";
|
2019-10-20 17:05:07 +00:00
|
|
|
x86_64-darwin = "./Configure darwin64-x86_64-cc";
|
2020-11-19 07:24:56 +00:00
|
|
|
aarch64-darwin = "./Configure darwin64-arm64-cc";
|
2019-10-20 17:05:07 +00:00
|
|
|
x86_64-linux = "./Configure linux-x86_64";
|
|
|
|
x86_64-solaris = "./Configure solaris64-x86_64-gcc";
|
2021-10-15 22:36:12 +00:00
|
|
|
riscv64-linux = "./Configure linux64-riscv64";
|
2018-08-20 18:43:41 +00:00
|
|
|
}.${stdenv.hostPlatform.system} or (
|
|
|
|
if stdenv.hostPlatform == stdenv.buildPlatform
|
2018-01-27 01:40:05 +00:00
|
|
|
then "./config"
|
2021-04-18 22:57:05 +00:00
|
|
|
else if stdenv.hostPlatform.isBSD
|
2022-12-02 19:26:55 +00:00
|
|
|
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.parsed.kernel.execFormat.name == "elf") "-elf"
|
|
|
|
else "./Configure BSD-generic${toString stdenv.hostPlatform.parsed.cpu.bits}"
|
2018-08-20 18:43:41 +00:00
|
|
|
else if stdenv.hostPlatform.isMinGW
|
2022-01-15 07:06:53 +00:00
|
|
|
then "./Configure mingw${lib.optionalString
|
2018-08-20 18:43:41 +00:00
|
|
|
(stdenv.hostPlatform.parsed.cpu.bits != 32)
|
|
|
|
(toString stdenv.hostPlatform.parsed.cpu.bits)}"
|
|
|
|
else if stdenv.hostPlatform.isLinux
|
2022-12-02 19:26:55 +00:00
|
|
|
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}"
|
2018-08-20 18:43:41 +00:00
|
|
|
else if stdenv.hostPlatform.isiOS
|
|
|
|
then "./Configure ios${toString stdenv.hostPlatform.parsed.cpu.bits}-cross"
|
2018-01-27 01:40:05 +00:00
|
|
|
else
|
2018-08-20 18:43:41 +00:00
|
|
|
throw "Not sure what configuration to use for ${stdenv.hostPlatform.config}"
|
2018-01-27 01:40:05 +00:00
|
|
|
);
|
|
|
|
|
2021-06-11 18:42:26 +00:00
|
|
|
# OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags.
|
|
|
|
dontAddStaticConfigureFlags = true;
|
2016-02-03 12:54:22 +00:00
|
|
|
configureFlags = [
|
2018-07-21 02:41:01 +00:00
|
|
|
"shared" # "shared" builds both shared and static libraries
|
2016-02-03 12:54:22 +00:00
|
|
|
"--libdir=lib"
|
2022-07-23 21:06:06 +00:00
|
|
|
(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"
|
|
|
|
)
|
2021-01-21 17:00:13 +00:00
|
|
|
] ++ lib.optionals withCryptodev [
|
2016-02-03 12:54:22 +00:00
|
|
|
"-DHAVE_CRYPTODEV"
|
|
|
|
"-DUSE_CRYPTODEV_DIGESTS"
|
2021-01-21 17:00:13 +00:00
|
|
|
] ++ lib.optional enableSSL2 "enable-ssl2"
|
|
|
|
++ lib.optional enableSSL3 "enable-ssl3"
|
2022-11-02 08:33:15 +00:00
|
|
|
# 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.
|
2023-02-18 13:22:36 +00:00
|
|
|
++ lib.optional (lib.versionAtLeast version "3.0.0" && enableKTLS) "enable-ktls"
|
2022-08-01 15:48:17 +00:00
|
|
|
++ lib.optional (lib.versionAtLeast version "1.1.1" && stdenv.hostPlatform.isAarch64) "no-afalgeng"
|
2020-01-16 19:02:38 +00:00
|
|
|
# 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.
|
2022-08-01 15:48:17 +00:00
|
|
|
++ lib.optional (lib.versionAtLeast version "1.1.1" && static) "no-shared"
|
2022-08-01 15:47:15 +00:00
|
|
|
++ lib.optional (lib.versionAtLeast version "3.0.0" && static) "no-module"
|
2022-05-17 09:42:46 +00:00
|
|
|
# This introduces a reference to the CTLOG_FILE which is undesired when
|
|
|
|
# trying to build binaries statically.
|
|
|
|
++ lib.optional static "no-ct"
|
2022-09-08 12:06:02 +00:00
|
|
|
++ lib.optional withZlib "zlib"
|
2023-06-10 20:00:00 +00:00
|
|
|
++ 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}"
|
|
|
|
];
|
2008-10-09 14:29:06 +00:00
|
|
|
|
2019-08-31 12:23:39 +00:00
|
|
|
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"
|
|
|
|
];
|
2011-11-04 18:48:25 +00:00
|
|
|
|
2018-04-20 12:55:01 +00:00
|
|
|
enableParallelBuilding = true;
|
2012-11-23 16:24:35 +00:00
|
|
|
|
2018-07-21 02:41:01 +00:00
|
|
|
postInstall =
|
2022-05-17 09:42:46 +00:00
|
|
|
(if static then ''
|
|
|
|
# OPENSSLDIR has a reference to self
|
2022-09-20 14:25:47 +00:00
|
|
|
remove-references-to -t $out $out/lib/*.a
|
2022-05-17 09:42:46 +00:00
|
|
|
'' else ''
|
2016-02-03 12:54:22 +00:00
|
|
|
# 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
|
2022-07-23 21:06:06 +00:00
|
|
|
|
|
|
|
# 'etc' is a separate output on static builds only.
|
|
|
|
etc=$out
|
2023-03-03 09:00:16 +00:00
|
|
|
'') + ''
|
2021-04-20 21:49:39 +00:00
|
|
|
mkdir -p $bin
|
|
|
|
mv $out/bin $bin/bin
|
2012-08-25 03:42:33 +00:00
|
|
|
|
2023-05-03 01:02:49 +00:00
|
|
|
'' + lib.optionalString (!stdenv.hostPlatform.isWindows)
|
|
|
|
# makeWrapper is broken for windows cross (https://github.com/NixOS/nixpkgs/issues/120726)
|
|
|
|
''
|
2023-03-03 09:00:16 +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"
|
2023-05-03 01:02:49 +00:00
|
|
|
'' + ''
|
2023-03-03 09:00:16 +00:00
|
|
|
|
2016-04-16 16:26:31 +00:00
|
|
|
mkdir $dev
|
|
|
|
mv $out/include $dev/
|
2011-02-09 15:27:34 +00:00
|
|
|
|
2016-02-03 12:54:22 +00:00
|
|
|
# remove dependency on Perl at runtime
|
2022-07-23 21:06:06 +00:00
|
|
|
rm -r $etc/etc/ssl/misc
|
2012-01-06 21:31:29 +00:00
|
|
|
|
2022-07-23 21:06:06 +00:00
|
|
|
rmdir $etc/etc/ssl/{certs,private}
|
2022-11-20 23:41:11 +00:00
|
|
|
|
|
|
|
${lib.optionalString (conf != null) "cat ${conf} > $etc/etc/ssl/openssl.cnf"}
|
2015-10-30 14:38:07 +00:00
|
|
|
'';
|
2016-02-03 12:54:22 +00:00
|
|
|
|
2021-01-21 17:00:13 +00:00
|
|
|
postFixup = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
|
2022-07-23 21:06:06 +00:00
|
|
|
# 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
|
2016-02-03 12:54:22 +00:00
|
|
|
echo "Found an erroneous dependency on perl ^^^" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
2010-03-05 23:22:36 +00:00
|
|
|
'';
|
2016-02-03 12:54:22 +00:00
|
|
|
|
2023-02-12 20:14:14 +00:00
|
|
|
passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;
|
|
|
|
|
2021-01-21 17:00:13 +00:00
|
|
|
meta = with lib; {
|
2020-04-01 01:11:51 +00:00
|
|
|
homepage = "https://www.openssl.org/";
|
2016-02-03 12:54:22 +00:00
|
|
|
description = "A cryptographic library that implements the SSL and TLS protocols";
|
2018-08-17 22:05:21 +00:00
|
|
|
license = licenses.openssl;
|
2023-09-18 17:57:04 +00:00
|
|
|
mainProgram = "openssl";
|
2023-02-12 20:14:14 +00:00
|
|
|
pkgConfigModules = [
|
|
|
|
"libcrypto"
|
|
|
|
"libssl"
|
|
|
|
"openssl"
|
|
|
|
];
|
2018-08-17 22:05:21 +00:00
|
|
|
platforms = platforms.all;
|
2020-02-21 17:17:48 +00:00
|
|
|
} // extraMeta;
|
2023-02-12 20:14:14 +00:00
|
|
|
});
|
2010-03-05 23:22:36 +00:00
|
|
|
|
2016-02-03 12:54:22 +00:00
|
|
|
in {
|
|
|
|
|
2023-06-18 15:51:06 +00:00
|
|
|
# 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).
|
2022-11-01 16:32:27 +00:00
|
|
|
openssl_1_1 = common {
|
2023-09-11 15:27:39 +00:00
|
|
|
version = "1.1.1w";
|
|
|
|
sha256 = "sha256-zzCYlQy02FOtlcCEHx+cbT3BAtzPys1SHZOSUgi3asg=";
|
2019-01-21 20:15:42 +00:00
|
|
|
patches = [
|
|
|
|
./1.1/nix-ssl-cert-file.patch
|
|
|
|
|
|
|
|
(if stdenv.hostPlatform.isDarwin
|
2021-09-07 17:00:29 +00:00
|
|
|
then ./use-etc-ssl-certs-darwin.patch
|
|
|
|
else ./use-etc-ssl-certs.patch)
|
2019-01-21 20:15:42 +00:00
|
|
|
];
|
2018-12-09 09:42:05 +00:00
|
|
|
withDocs = true;
|
2023-05-17 23:15:13 +00:00
|
|
|
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/"
|
|
|
|
];
|
|
|
|
};
|
2016-08-26 07:38:19 +00:00
|
|
|
};
|
2021-09-07 17:00:29 +00:00
|
|
|
|
2022-06-27 13:35:16 +00:00
|
|
|
openssl_3 = common {
|
2023-08-01 14:24:15 +00:00
|
|
|
version = "3.0.10";
|
|
|
|
sha256 = "sha256-F2HU9bE6ECi5tvPUuOF/6wztyTcPav5h1xk9LNzoMyM=";
|
2021-09-07 17:00:29 +00:00
|
|
|
patches = [
|
|
|
|
./3.0/nix-ssl-cert-file.patch
|
2021-09-07 23:16:56 +00:00
|
|
|
|
|
|
|
# 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
|
|
|
|
|
2021-09-07 17:00:29 +00:00
|
|
|
(if stdenv.hostPlatform.isDarwin
|
|
|
|
then ./use-etc-ssl-certs-darwin.patch
|
|
|
|
else ./use-etc-ssl-certs.patch)
|
|
|
|
];
|
2021-09-07 23:16:56 +00:00
|
|
|
|
2021-09-07 17:00:29 +00:00
|
|
|
withDocs = true;
|
2021-09-13 16:24:27 +00:00
|
|
|
|
|
|
|
extraMeta = with lib; {
|
|
|
|
license = licenses.asl20;
|
|
|
|
};
|
2021-09-07 17:00:29 +00:00
|
|
|
};
|
2010-07-18 21:54:14 +00:00
|
|
|
}
|