class OpensslAT3 < Formula bottle do root_url "https://homebrew.hyprnet/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