Files

193 lines
7.8 KiB
Ruby

class OpensslAT3 < Formula
bottle do
root_url "https://homebrew.mirror.ygg/bottles"
rebuild 1
sha256 cellar: "/opt/homebrew/Cellar", arm64_sequoia: "f8b0b5b2eda9321265b7483ce7ea167012c32afed73a127e8e18ebe9f1d9dffe"
sha256 cellar: "/opt/homebrew/Cellar", arm64_tahoe: "2d995a1bbbd8e6ee6a9042990dde87e7321d1ddd5716ffee53b140d23cb9f92f"
sha256 cellar: "/usr/local/Cellar", sequoia: "5477285c4ebec45713873ae4002affece39e427c5f1b655c6a3df49c6b90f924"
sha256 cellar: "/home/linuxbrew/.linuxbrew/Cellar", x86_64_linux: "d9996e71b5caa202929fe512179516befeea35e205425beb8a35ed099eb8e47a"
end
desc "Cryptography and SSL/TLS Toolkit"
homepage "https://openssl-library.org"
url "https://github.com/openssl/openssl/releases/download/openssl-3.6.3/openssl-3.6.3.tar.gz"
mirror "http://fresh-center.net/linux/misc/openssl-3.6.3.tar.gz"
mirror "http://deb.debian.org/debian/pool/main/o/openssl/openssl_3.6.3.orig.tar.gz"
sha256 "243a86649cf6f23eeb6a2ff2456e09e5d77dd9018a54d3d96b0c6bdd6ba6c7f1"
license "Apache-2.0"
compatibility_version 1
livecheck do
url "https://openssl-library.org/source/"
regex(/href=.*?openssl[._-]v?(3(?:\.\d+)+)\.t/i)
end
depends_on "ca-certificates" => :no_linkage
on_linux do
resource "Test::Harness" do
url "https://cpan.metacpan.org/authors/id/L/LE/LEONT/Test-Harness-3.52.tar.gz"
mirror "http://cpan.metacpan.org/authors/id/L/LE/LEONT/Test-Harness-3.52.tar.gz"
sha256 "8fe65cfc0261ed3c8a4395f0524286f5719669fe305f9b03b16cf3684d62cd70"
end
resource "Test::More" do
url "https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test-Simple-1.302222.tar.gz"
mirror "http://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test-Simple-1.302222.tar.gz"
sha256 "7cf84a18d6c9450e53ae8b4de5d5fa32c9fe99f3cebbe408fe59433f19921ec2"
end
resource "ExtUtils::MakeMaker" do
url "https://cpan.metacpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.78.tar.gz"
mirror "http://cpan.metacpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.78.tar.gz"
sha256 "43b33c20f8d82dba7cc48f8cd702f8fc9811e9d07880886dfd31b7077bd4a3a6"
end
end
link_overwrite "bin/c_rehash", "bin/openssl", "include/openssl/*"
link_overwrite "lib/libcrypto*", "lib/libssl*"
link_overwrite "lib/pkgconfig/libcrypto.pc", "lib/pkgconfig/libssl.pc", "lib/pkgconfig/openssl.pc"
link_overwrite "share/doc/openssl/*", "share/man/man*/*ssl"
# Backport commits to avoid test timing failures
patch do
file "Patches/openssl/9061e9381306a053908177aca8509c262015cdf3.patch"
type :backport
end
patch do
file "Patches/openssl/2e2438b494e7f661be5212e4732f7fab86bf6303.patch"
type :backport
end
patch do
file "Patches/openssl/ea598f5dd23f1d64d8952e20fcf95d9f3a21d654.patch"
type :backport
end
patch do
file "Patches/openssl/cffb97915813aeeef58ee9a0d33c05d3d45e1fe6.patch"
type :backport
end
# SSLv2 died with 1.1.0, so no-ssl2 no longer required.
# SSLv3 & zlib are off by default with 1.1.0 but this may not
# be obvious to everyone, so explicitly state it for now to
# help debug inevitable breakage.
def configure_args
args = %W[
--prefix=#{prefix}
--openssldir=#{openssldir}
--libdir=lib
no-ssl3
no-ssl3-method
no-zlib
]
on_linux do
args += (ENV.cflags || "").split
args += (ENV.cppflags || "").split
args += (ENV.ldflags || "").split
end
args
end
def install
if OS.linux?
ENV.prepend_create_path "PERL5LIB", buildpath/"lib/perl5"
ENV.prepend_path "PATH", buildpath/"bin"
%w[ExtUtils::MakeMaker Test::Harness Test::More].each do |r|
resource(r).stage do
system "perl", "Makefile.PL", "INSTALL_BASE=#{buildpath}"
system "make", "PERL5LIB=#{ENV["PERL5LIB"]}", "CC=#{ENV.cc}"
system "make", "install"
end
end
end
# This ensures where Homebrew's Perl is needed the Cellar path isn't
# hardcoded into OpenSSL's scripts, causing them to break every Perl update.
# Whilst our env points to opt_bin, by default OpenSSL resolves the symlink.
ENV["PERL"] = formula_opt_bin("perl")/"perl" if which("perl") == formula_opt_bin("perl")/"perl"
arch_args = []
if OS.mac?
arch_args += %W[darwin64-#{Hardware::CPU.arch}-cc enable-ec_nistp_64_gcc_128]
elsif Hardware::CPU.intel?
arch_args << (Hardware::CPU.is_64_bit? ? "linux-x86_64" : "linux-elf")
elsif Hardware::CPU.arm?
arch_args << (Hardware::CPU.is_64_bit? ? "linux-aarch64" : "linux-armv4")
end
openssldir.mkpath
system "perl", "./Configure", *(configure_args + arch_args)
system "make"
system "make", "install", "MANDIR=#{man}", "MANSUFFIX=ssl"
# AF_ALG support isn't always enabled (e.g. some containers), which breaks the tests.
# AF_ALG is a kernel feature and failures are unlikely to be issues with the formula.
# `test_quick_tserver` intermittently fails on CI.
# It has been reported upstream with no resolution in over a year, so we skip it.
system "make", "HARNESS_JOBS=#{ENV.make_jobs}", "test", "TESTS=-test_afalg -test_quic_tserver"
# Prevent `brew` from pruning the `certs` and `private` directories.
touch %w[certs private].map { |subdir| openssldir/subdir/".keepme" }
end
def openssldir = pkgetc
post_install_steps do
symlink "{{etc}}/ca-certificates/cert.pem", "{{pkgetc}}/cert.pem", overwrite: true
end
def caveats
<<~EOS
To add additional certificates, place .pem files in
#{openssldir}/certs
and run
#{opt_bin}/c_rehash
OpenSSL 3.6 is only supported until 2026-11-01 so the `openssl@3`
formula will be downgraded to OpenSSL 3.5 (LTS) in a future update.
EOS
end
test do
# Make sure the necessary .cnf file exists, otherwise OpenSSL gets moody.
assert_path_exists pkgetc/"openssl.cnf", "OpenSSL requires the .cnf file for some functionality"
assert_path_exists openssldir/"certs", "OpenSSL throws confusing errors when this directory is missing"
# Check OpenSSL itself functions as expected.
(testpath/"testfile.txt").write("This is a test file")
expected_checksum = "e2d0fe1585a63ec6009c8016ff8dda8b17719a637405a4e23c0ff81339148249"
system bin/"openssl", "dgst", "-sha256", "-out", "checksum.txt", "testfile.txt"
open("checksum.txt") do |f|
checksum = f.read(100).split("=").last.strip
assert_equal checksum, expected_checksum
end
# Invalid cert from superfish.badssl.com
bad_cert = <<~PEM
-----BEGIN CERTIFICATE-----
MIIC9TCCAl6gAwIBAgIJAK5EmlK7Klu5MA0GCSqGSIb3DQEBCwUAMFsxGDAWBgNV
BAoTD1N1cGVyZmlzaCwgSW5jLjELMAkGA1UEBxMCU0YxCzAJBgNVBAgTAkNBMQsw
CQYDVQQGEwJVUzEYMBYGA1UEAxMPU3VwZXJmaXNoLCBJbmMuMB4XDTE4MDUxNjE3
MTUyM1oXDTIwMDUxNTE3MTUyM1owajELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
bGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDzANBgNVBAoMBkJhZFNT
TDEdMBsGA1UEAwwUc3VwZXJmaXNoLmJhZHNzbC5jb20wggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDCBOz4jO4EwrPYUNVwWMyTGOtcqGhJsCK1+ZWesSss
dj5swEtgTEzqsrTAD4C2sPlyyYYC+VxBXRMrf3HES7zplC5QN6ZnHGGM9kFCxUbT
Focnn3TrCp0RUiYhc2yETHlV5NFr6AY9SBVSrbMo26r/bv9glUp3aznxJNExtt1N
wMT8U7ltQq21fP6u9RXSM0jnInHHwhR6bCjqN0rf6my1crR+WqIW3GmxV0TbChKr
3sMPR3RcQSLhmvkbk+atIgYpLrG6SRwMJ56j+4v3QHIArJII2YxXhFOBBcvm/mtU
mEAnhccQu3Nw72kYQQdFVXz5ZD89LMOpfOuTGkyG0cqFAgMBAAGjLjAsMAkGA1Ud
EwQCMAAwHwYDVR0RBBgwFoIUc3VwZXJmaXNoLmJhZHNzbC5jb20wDQYJKoZIhvcN
AQELBQADgYEAKgHH4VD3jfwzxvtWTmIA1nwK+Fjqe9VFXyDwXiBnhqDwJp9J+/2y
r7jbXfEKf7WBS6OmnU+HTjxUCFx2ZnA4r7dU5nIsNadKEDVHDOvYEJ6mXHPkrvlt
k79iHC0DJiJX36BTXcU649wKEVjgX/kT2yy3YScPdBoN0vtzPN3yFsQ=
-----END CERTIFICATE-----
PEM
output = pipe_output("#{bin}/openssl verify 2>&1", bad_cert, 2)
assert_match "verification failed", output
refute_match "error:80000002", output
end
end