From b63ecff0e0c4735a59c9ee0c8a2dbd70d7880daf Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 1 Jul 2026 16:07:36 +0200 Subject: [PATCH 1/2] tls-uses-pqc: support running against OpenSSL 4. --- tls-uses-pqc/Program.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tls-uses-pqc/Program.cs b/tls-uses-pqc/Program.cs index 5585079..2c5ac08 100644 --- a/tls-uses-pqc/Program.cs +++ b/tls-uses-pqc/Program.cs @@ -9,6 +9,8 @@ using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; +SetOpenSSLImportResolver(); + // Create a self-signed certificate. using var key = ECDsa.Create(); var certReq = new CertificateRequest("CN=localhost", key, HashAlgorithmName.SHA256); @@ -55,6 +57,23 @@ return 1; // Use OpenSSL interop to get the negotiated key exchange group (SslStream doesn't expose this information). +static void SetOpenSSLImportResolver() +{ + // Use the latest OpenSSL version on the system. + NativeLibrary.SetDllImportResolver(Assembly.GetExecutingAssembly(), (name, assembly, searchPath) => + { + if (name == "libssl") + { + if (NativeLibrary.TryLoad("libssl.so.4", assembly, searchPath, out var h) || + NativeLibrary.TryLoad("libssl.so.3", assembly, searchPath, out h)) + { + return h; + } + } + return IntPtr.Zero; + }); +} + static string? GetNegotiatedGroupName(SslStream sslStream) { var secCtxField = typeof(SslStream).GetField("_securityContext", BindingFlags.NonPublic | BindingFlags.Instance)!; @@ -72,5 +91,5 @@ } } -[DllImport("libssl.so.3")] +[DllImport("libssl")] static extern IntPtr SSL_get0_group_name(IntPtr ssl); From 22f657a3fd98548a3ede0379bf505e9ab1173075 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Jul 2026 14:15:34 +0200 Subject: [PATCH 2/2] Throw if we don't know how to map libssl. --- tls-uses-pqc/Program.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tls-uses-pqc/Program.cs b/tls-uses-pqc/Program.cs index 2c5ac08..376a56e 100644 --- a/tls-uses-pqc/Program.cs +++ b/tls-uses-pqc/Program.cs @@ -69,8 +69,9 @@ static void SetOpenSSLImportResolver() { return h; } + throw new NotSupportedException($"Cannot resolve {name}."); } - return IntPtr.Zero; + return IntPtr.Zero; // Use the default resolution logic. }); }