Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
c062e18
Native Interop Layer
liveans Jun 16, 2025
ecba3f7
Native Layer Compilation fix for Mono + NativeAOT + templates
liveans Jun 16, 2025
bf130f3
First shape of new native + interop
liveans Jun 25, 2025
0dcc599
Newlines at the end of files
liveans Jun 25, 2025
44b3597
Default constructor ownsHandle to true
liveans Jun 25, 2025
3cbcea7
Delete couple of unsafe keyword in Interop
liveans Jun 25, 2025
3defe85
Update src/native/libs/System.Net.Security.Native.Apple/pal_networkfr…
liveans Jun 25, 2025
57a7069
Merge branch 'main' into network_framework_integration_native_interop
liveans Jun 25, 2025
c1a2b6b
Fix PlatformManifestFileEntry
liveans Jun 25, 2025
0977679
Review feedback
liveans Jun 25, 2025
fe343b0
Apply suggestions from code review
liveans Jun 26, 2025
0fff060
Update src/libraries/Common/src/Interop/OSX/Interop.Network.Tls.cs
liveans Jun 26, 2025
3441093
Review feedbacks
liveans Jun 28, 2025
3e547c5
Merge branch 'main' into network_framework_integration_native_interop
liveans Jun 28, 2025
25b8950
Further review feedback
liveans Jun 28, 2025
91238c5
Add new library name to nativeaot build target file
liveans Jun 28, 2025
a250b67
Merge branch 'main' into network_framework_integration_native_interop
liveans Jun 28, 2025
beb5f93
Merge System.Net.Security.Native.Apple with System.Security.Cryptogra…
rzikm Jul 1, 2025
0ab06b2
fixup! Merge System.Net.Security.Native.Apple with System.Security.Cr…
rzikm Jul 1, 2025
39bef6d
Shared OSStatus
rzikm Jul 1, 2025
8267454
Correctly release some handles
rzikm Jul 1, 2025
4bf6eb9
Remove printf
rzikm Jul 1, 2025
f771ea9
Add comments
rzikm Jul 1, 2025
6ab3942
Fix build
rzikm Jul 2, 2025
b05467e
Copy of initial changes
rzikm Jul 2, 2025
9aa167a
Fix build
rzikm Jul 2, 2025
da8d285
WIP
rzikm Jul 2, 2025
e7fa071
WIP
rzikm Jul 3, 2025
d018034
more WIP
rzikm Jul 3, 2025
4767c77
Minimal example is working
rzikm Jul 7, 2025
e629414
Fix concurrent read/write calls
rzikm Jul 7, 2025
becc664
ALPN fix
rzikm Jul 7, 2025
f4d4bc8
Certificate validation
rzikm Jul 7, 2025
b967fc9
Report remote alerts
rzikm Jul 7, 2025
0f71d07
CipherSuitesPolicy support
rzikm Jul 7, 2025
0718512
Fix IDNA
rzikm Jul 8, 2025
0df2d19
Zero-bytes read support
rzikm Jul 8, 2025
10f812a
fixup! ALPN fix
rzikm Jul 8, 2025
a77d7d2
Attach correct cancellation token to exceptions
rzikm Jul 8, 2025
6ca7130
Fix framer lifetime
rzikm Jul 8, 2025
0bc4003
fixup! CipherSuitesPolicy support
rzikm Jul 8, 2025
c26d47e
Cleanup some unwanted changes
rzikm Jul 8, 2025
1bd7626
Some more cleanup
rzikm Jul 8, 2025
1434381
Fix ALPN reading
rzikm Jul 8, 2025
dfd1753
ClientCertificates + CertificateContext + CertSelectionDelegate imple…
liveans Jul 8, 2025
bbe2e5d
Correctly pass remote certificate + acceptableIssuers to selection ca…
liveans Jul 9, 2025
aba17db
Disable Ciphersuite tests for NW
liveans Jul 9, 2025
5c45a15
Fix formatting
liveans Jul 9, 2025
f6babf0
Fix some test scenarios
liveans Jul 9, 2025
cdf141c
Delete unused ResettableTaskSource
liveans Jul 9, 2025
e61e02a
Fix build
liveans Jul 9, 2025
fe3170b
Unify certificate validation code
rzikm Jul 9, 2025
216b3a6
TARGET_OSX to TARGET_APPLE
rzikm Jul 9, 2025
2ec8e98
Small changes
rzikm Jul 9, 2025
f6a17b0
Fix build of other platforms
rzikm Jul 9, 2025
02d76f5
Disable known edge-case for now
liveans Jul 9, 2025
df9c144
Some test fixes
rzikm Jul 9, 2025
fbc3fb2
Disable EventSource order test for NW
liveans Jul 10, 2025
2b1dbb3
Add TCS for completion on transportStream Write and propagate exceptions
liveans Jul 10, 2025
cf412ce
Propagate exception for handshake + write tcs from transport read task
liveans Jul 10, 2025
b2e7dc7
Missing write part of propagation exception for transport read task
liveans Jul 10, 2025
16b48e1
App read optimization
rzikm Jul 10, 2025
4212aff
fixup! App read optimization
rzikm Jul 10, 2025
6c47976
Fix hanging pending read after read cancellation
rzikm Jul 10, 2025
ad232e8
Unify local cert selection
rzikm Jul 11, 2025
9dff34a
Improve thisHandle lifetime management
rzikm Jul 11, 2025
3488df4
Introduce specific exception for NetworkFramework + properly propagat…
liveans Jul 11, 2025
e444f02
Refactor NetworkFramework error handling to use enum for error domains
liveans Jul 11, 2025
a4a4c69
Refactor error extraction in NetworkFramework to return CFStringRef f…
liveans Jul 11, 2025
a824578
Enhance cancellation support in SafeDeleteNwContext by throwing on ca…
liveans Jul 12, 2025
f4edc9b
Typo fix
liveans Jul 12, 2025
5a95f10
Switch to Network.framework tests on CI
liveans Jul 12, 2025
0b92607
Fix memory leaks, introduce CancellationAction for ResettableValueTas…
liveans Jul 12, 2025
e062869
Reverting back running nw tests on ci, as some apis requires at least…
liveans Jul 13, 2025
92d8770
A bit cleanup
liveans Jul 13, 2025
a15e0d9
Use more appropriate names in nw shim functions
rzikm Jul 14, 2025
3a78fbe
Centralized gchandle management in native code
rzikm Jul 14, 2025
03ce32f
Fix correct cancellation token when throwing
rzikm Jul 14, 2025
53281db
Fix hang, remove try-catches in completion callbacks
rzikm Jul 14, 2025
b15b220
Revert unwanted changes
rzikm Jul 14, 2025
a292e7a
Fix comment
rzikm Jul 14, 2025
39582fc
Logging improvements
rzikm Jul 15, 2025
0d02b54
Merge remote-tracking branch 'upstream/main' into osx-tls13
rzikm Jul 16, 2025
a6ff82f
Apply suggestion from @liveans
rzikm Jul 16, 2025
8102719
Update src/libraries/System.Net.Security/src/System/Net/Security/Pal.…
rzikm Jul 16, 2025
a6c124d
Code review feecback
rzikm Jul 16, 2025
83bcaf1
Remove duplicate void* state argument in native functions
rzikm Jul 16, 2025
ba6e3fb
Update src/native/libs/System.Security.Cryptography.Native.Apple/pal_…
rzikm Jul 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ The .NET Foundation licenses this file to you under the MIT license.
<NativeFramework Include="CoreFoundation" />
<NativeFramework Include="CryptoKit" />
<NativeFramework Include="Foundation" />
<NativeFramework Include="Network" />
<NativeFramework Include="Security" />
<!-- The library builds don't reference the GSS API on tvOS builds. -->
<NativeFramework Condition="!$(_targetOS.StartsWith('tvos'))" Include="GSS" />
Expand Down
1 change: 1 addition & 0 deletions src/libraries/Common/src/Interop/OSX/Interop.Libraries.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ internal static partial class Libraries
internal const string OpenLdap = "libldap.dylib";
internal const string SystemConfigurationLibrary = "/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration";
internal const string AppleCryptoNative = "libSystem.Security.Cryptography.Native.Apple";
internal const string NetworkFramework = "/System/Library/Frameworks/Network.framework/Network";
internal const string MsQuic = "libmsquic.dylib";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Net.Security;
using System.Runtime.InteropServices;
using System.Security.Authentication;
using Microsoft.Win32.SafeHandles;

internal static partial class Interop
{
// TLS 1.3 specific Network Framework implementation for macOS
internal static partial class NetworkFramework
{
internal static partial class Tls
{
// Initialize internal shim for NetworkFramework integration
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_Init")]
[return: MarshalAs(UnmanagedType.I4)]
internal static unsafe partial bool Init(
delegate* unmanaged<IntPtr, StatusUpdates, IntPtr, IntPtr, NetworkFrameworkError*, void> statusCallback,
delegate* unmanaged<IntPtr, byte*, ulong, void> writeCallback,
delegate* unmanaged<IntPtr, IntPtr, IntPtr> challengeCallback);

// Create a new connection context
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_NwConnectionCreate", StringMarshalling = StringMarshalling.Utf8)]
internal static unsafe partial SafeNwHandle NwConnectionCreate([MarshalAs(UnmanagedType.I4)] bool isServer, IntPtr context, string targetName, byte* alpnBuffer, int alpnLength, SslProtocols minTlsProtocol, SslProtocols maxTlsProtocol, uint* cipherSuites, int cipherSuitesLength);

// Start the TLS handshake, notifications are received via the status callback (potentially from a different thread).
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_NwConnectionStart")]
internal static partial int NwConnectionStart(SafeNwHandle connection, IntPtr context);

// takes encrypted input from underlying stream and feed it to the connection.
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_NwFramerDeliverInput")]
internal static unsafe partial int NwFramerDeliverInput(SafeNwHandle framer, IntPtr context, byte* buffer, int bufferLength, delegate* unmanaged<IntPtr, NetworkFrameworkError*, void> completionCallback);

// sends plaintext data to the connection.
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_NwConnectionSend")]
internal static unsafe partial void NwConnectionSend(SafeNwHandle connection, IntPtr context, void* buffer, int bufferLength, delegate* unmanaged<IntPtr, NetworkFrameworkError*, void> completionCallback);

// read plaintext data from the connection.
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_NwConnectionReceive")]
internal static unsafe partial void NwConnectionReceive(SafeNwHandle connection, IntPtr context, int length, delegate* unmanaged<IntPtr, NetworkFrameworkError*, byte*, int, void> readCompletionCallback);

// starts connection cleanup
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_NwConnectionCancel")]
internal static partial void NwConnectionCancel(SafeNwHandle connection);

// gets TLS connection information
[LibraryImport(Interop.Libraries.AppleCryptoNative, EntryPoint = "AppleCryptoNative_GetConnectionInfo")]
internal static unsafe partial int GetConnectionInfo(SafeNwHandle connection, IntPtr context, out SslProtocols pProtocol, out TlsCipherSuite pCipherSuiteOut, byte* negotiatedAlpn, ref int negotiatedAlpnLength);
}

// Status enumeration for Network Framework TLS operations
internal enum StatusUpdates
{
UnknownError = 0,
FramerStart = 1,
HandshakeFinished = 3,
ConnectionFailed = 4,
ConnectionCancelled = 103,
CertificateAvailable = 104,
DebugLog = 200,
}
}

// Safe handle classes for Network Framework TLS resources
internal sealed class SafeNwHandle : SafeHandleZeroOrMinusOneIsInvalid
{
public SafeNwHandle() : base(ownsHandle: true) { }

public SafeNwHandle(IntPtr handle, bool ownsHandle) : base(ownsHandle)
{
SetHandle(handle);
}

protected override bool ReleaseHandle()
{
NetworkFramework.Release(handle);
SetHandle(IntPtr.Zero);
return true;
}
}
}
85 changes: 85 additions & 0 deletions src/libraries/Common/src/Interop/OSX/Interop.NetworkFramework.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

internal static partial class Interop
{
internal static partial class NetworkFramework
{
// Network Framework reference counting functions
[LibraryImport(Libraries.NetworkFramework, EntryPoint = "nw_retain")]
internal static partial IntPtr Retain(IntPtr obj);

[LibraryImport(Libraries.NetworkFramework, EntryPoint = "nw_release")]
internal static partial void Release(IntPtr obj);

// Network Framework error domains
internal enum NetworkFrameworkErrorDomain
{
Invalid = 0,
POSIX = 1,
DNS = 2,
TLS = 3
}

internal enum NWErrorDomainPOSIX
{
OperationCanceled = 89, // ECANCELED
}

internal sealed class NetworkFrameworkException : Exception
{
public int ErrorCode { get; }
public NetworkFrameworkErrorDomain ErrorDomain { get; }

internal NetworkFrameworkException()
{
}

internal NetworkFrameworkException(int errorCode, NetworkFrameworkErrorDomain errorDomain, string? message)
: base(message ?? $"Network Framework error {errorCode} in domain {errorDomain}")
{
HResult = errorCode;
ErrorCode = errorCode;
ErrorDomain = errorDomain;
}

internal NetworkFrameworkException(int errorCode, NetworkFrameworkErrorDomain errorDomain, string? message, Exception innerException)
: base(message ?? $"Network Framework error {errorCode} in domain {errorDomain}", innerException)
{
HResult = errorCode;
ErrorCode = errorCode;
ErrorDomain = errorDomain;
}

public override string ToString()
{
return $"{base.ToString()}, ErrorCode: {ErrorCode}, ErrorDomain: {ErrorDomain}";
}
}

[StructLayout(LayoutKind.Sequential)]
internal struct NetworkFrameworkError
{
public int ErrorCode;
public int ErrorDomain;
public IntPtr ErrorMessage; // C string of NULL
}

internal static Exception CreateExceptionForNetworkFrameworkError(in NetworkFrameworkError error)
{
string? message = null;
NetworkFrameworkErrorDomain domain = (NetworkFrameworkErrorDomain)error.ErrorDomain;

if (error.ErrorMessage != IntPtr.Zero)
{
message = Marshal.PtrToStringUTF8(error.ErrorMessage);
}

return new NetworkFrameworkException(error.ErrorCode, domain, message);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

internal static partial class Interop
{
internal static partial class AppleCrypto
{
internal static class OSStatus
{
public const int NoErr = 0;
public const int ReadErr = -19;
public const int WritErr = -20;
public const int EOFErr = -39;
public const int SecUserCanceled = -128;
public const int ErrSSLWouldBlock = -9803;
}
}
}
15 changes: 15 additions & 0 deletions src/libraries/Common/src/System/Net/ReadWriteAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ internal interface IReadWriteAdapter
static abstract ValueTask WriteAsync(Stream stream, ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken);
static abstract Task FlushAsync(Stream stream, CancellationToken cancellationToken);
static abstract Task WaitAsync(TaskCompletionSource<bool> waiter);
static abstract Task WaitAsync(Task task);
static abstract ValueTask<T> WaitAsync<T>(ValueTask<T> task);
}

internal readonly struct AsyncReadWriteAdapter : IReadWriteAdapter
Expand All @@ -30,6 +32,8 @@ public static ValueTask WriteAsync(Stream stream, ReadOnlyMemory<byte> buffer, C
public static Task FlushAsync(Stream stream, CancellationToken cancellationToken) => stream.FlushAsync(cancellationToken);

public static Task WaitAsync(TaskCompletionSource<bool> waiter) => waiter.Task;
public static Task WaitAsync(Task task) => task;
public static ValueTask<T> WaitAsync<T>(ValueTask<T> task) => task;
}

internal readonly struct SyncReadWriteAdapter : IReadWriteAdapter
Expand Down Expand Up @@ -57,5 +61,16 @@ public static Task WaitAsync(TaskCompletionSource<bool> waiter)
waiter.Task.GetAwaiter().GetResult();
return Task.CompletedTask;
}

public static Task WaitAsync(Task task)
{
task.GetAwaiter().GetResult();
return Task.CompletedTask;
}

public static ValueTask<T> WaitAsync<T>(ValueTask<T> task)
{
return ValueTask.FromResult(task.AsTask().GetAwaiter().GetResult());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,7 @@ private static bool GetSsl3Support()

}

return (IsOSX || (IsLinux && OpenSslVersion < new Version(1, 0, 2) && !IsDebian));
return ((IsOSX && !IsNetworkFrameworkEnabled()) || (IsLinux && OpenSslVersion < new Version(1, 0, 2) && !IsDebian));
}

private static bool OpenSslGetTlsSupport(SslProtocols protocol)
Expand All @@ -569,7 +569,7 @@ private static bool AndroidGetSslProtocolSupport(SslProtocols protocol)
private static bool GetTls10Support()
{
// on macOS and Android TLS 1.0 is supported.
if (IsApplePlatform || IsAndroid)
if ((IsApplePlatform && !IsNetworkFrameworkEnabled()) || IsAndroid)
{
return true;
}
Expand All @@ -580,7 +580,7 @@ private static bool GetTls10Support()
return GetProtocolSupportFromWindowsRegistry(SslProtocols.Tls, defaultProtocolSupport: true) && !IsWindows10Version20348OrGreater;
}

return OpenSslGetTlsSupport(SslProtocols.Tls);
return IsOpenSslSupported && OpenSslGetTlsSupport(SslProtocols.Tls);
}

private static bool GetTls11Support()
Expand All @@ -597,12 +597,12 @@ private static bool GetTls11Support()
return GetProtocolSupportFromWindowsRegistry(SslProtocols.Tls11, defaultProtocolSupport: true) && !IsWindows10Version20348OrGreater;
}
// on macOS and Android TLS 1.1 is supported.
else if (IsApplePlatform || IsAndroid)
else if ((IsApplePlatform && !IsNetworkFrameworkEnabled()) || IsAndroid)
{
return true;
}

return OpenSslGetTlsSupport(SslProtocols.Tls11);
return IsOpenSslSupported && OpenSslGetTlsSupport(SslProtocols.Tls11);
}
#pragma warning restore SYSLIB0039

Expand Down Expand Up @@ -665,6 +665,31 @@ private static bool GetTls13Support()
return false;
}

/// <summary>
/// Determines if Network.framework is enabled for SSL/TLS operations on Apple platforms.
/// This can be controlled via AppContext switch or environment variable.
/// </summary>
/// <returns>True if Network.framework is enabled, false otherwise.</returns>
public static bool IsNetworkFrameworkEnabled()
{
// Check AppContext switch first (highest priority)
if (AppContext.TryGetSwitch("System.Net.Security.UseNetworkFramework", out bool isEnabled))
{
return isEnabled;
}

// Fall back to environment variable
string? envVar = Environment.GetEnvironmentVariable("DOTNET_SYSTEM_NET_SECURITY_USENETWORKFRAMEWORK");
if (!string.IsNullOrEmpty(envVar))
{
return envVar == "1" || envVar.Equals("true", StringComparison.OrdinalIgnoreCase);
}

// Default is disabled
return false;
}


private static bool GetSendsCAListByDefault()
{
if (IsWindows)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ protected override void OnEventWritten(EventWrittenEventArgs eventData)
}
}
#endif
sb.Append($"[{eventData.EventName}] ");
sb.Append($"[{eventData.EventName}] ");

for (int i = 0; i < eventData.Payload?.Count; i++)
{
Expand Down
10 changes: 10 additions & 0 deletions src/libraries/System.Net.Security/src/System.Net.Security.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<ApiExclusionListPath Condition="'$(TargetPlatformIdentifier)' == ''">ExcludeApiList.PNSE.txt</ApiExclusionListPath>
<DefineConstants Condition="'$(TargetPlatformIdentifier)' == 'windows'">$(DefineConstants);TARGET_WINDOWS</DefineConstants>
<DefineConstants Condition="'$(TargetPlatformIdentifier)' == 'android'">$(DefineConstants);TARGET_ANDROID</DefineConstants>
<DefineConstants Condition="'$(TargetPlatformIdentifier)' == 'osx' or '$(TargetPlatformIdentifier)' == 'ios' or '$(TargetPlatformIdentifier)' == 'tvos'">$(DefineConstants);TARGET_APPLE</DefineConstants>
<UseAndroidCrypto Condition="'$(TargetPlatformIdentifier)' == 'android'">true</UseAndroidCrypto>
<UseAppleCrypto Condition="'$(TargetPlatformIdentifier)' == 'osx' or '$(TargetPlatformIdentifier)' == 'ios' or '$(TargetPlatformIdentifier)' == 'tvos'">true</UseAppleCrypto>
<UseManagedNtlm Condition="'$(TargetPlatformIdentifier)' == 'android' or '$(TargetPlatformIdentifier)' == 'tvos'">true</UseManagedNtlm>
Expand Down Expand Up @@ -440,13 +441,22 @@
Link="Common\Interop\OSX\System.Security.Cryptography.Native.Apple\Interop.Ssl.cs" />
<Compile Include="$(CommonPath)Interop\OSX\System.Security.Cryptography.Native.Apple\Interop.X509Chain.cs"
Link="Common\Interop\OSX\System.Security.Cryptography.Native.Apple\Interop.X509Chain.cs" />
<Compile Include="$(CommonPath)Interop\OSX\System.Security.Cryptography.Native.Apple\Interop.OSStatus.cs"
Link="Common\Interop\OSX\System.Security.Cryptography.Native.Apple\Interop.OSStatus.cs" />
<Compile Include="$(CommonPath)Interop\OSX\Interop.NetworkFramework.cs"
Link="Common\Interop\OSX\Interop.NetworkFramework.cs" />
<Compile Include="$(CommonPath)Interop\OSX\Interop.NetworkFramework.Tls.cs"
Link="Common\Interop\OSX\Interop.NetworkFramework.Tls.cs" />
<Compile Include="$(CommonPath)Microsoft\Win32\SafeHandles\SafeCreateHandle.OSX.cs"
Link="Common\Microsoft\Win32\SafeHandles\SafeCreateHandle.OSX.cs" />
<Compile Include="$(CommonPath)System\Net\Security\CertificateValidation.OSX.cs"
Link="Common\System\Net\Security\CertificateValidation.OSX.cs" />
<Compile Include="System\Net\CertificateValidationPal.OSX.cs" />
<Compile Include="System\Net\Security\Pal.Managed\SslProtocolsValidation.cs" />
<Compile Include="System\Net\Security\Pal.OSX\SafeDeleteSslContext.cs" />
<Compile Include="System\Net\Security\Pal.OSX\SafeDeleteNwContext.cs" />
<!-- TODO: move to shared code -->
<Compile Include="../../System.Net.Quic/src/System/Net/Quic/Internal/ResettableValueTaskSource.cs" />
<Compile Include="System\Net\Security\SslConnectionInfo.OSX.cs" />
<Compile Include="System\Net\Security\SslStreamCertificateContext.OSX.cs" />
<Compile Include="System\Net\Security\SslStreamPal.OSX.cs" />
Expand Down
Loading
Loading