Imported Upstream version 6.4.0.137

Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2019-07-26 19:53:28 +00:00
parent e9207cf623
commit ef583813eb
2712 changed files with 74169 additions and 40587 deletions

View File

@@ -66,7 +66,7 @@ namespace Mono.Btls
public MonoBtlsContext (MNS.MobileAuthenticatedStream parent, MNS.MonoSslAuthenticationOptions options)
: base (parent, options)
{
if (IsServer)
if (IsServer && LocalServerCertificate != null)
nativeServerCertificate = GetPrivateCertificate (LocalServerCertificate);
}
@@ -123,6 +123,22 @@ namespace Mono.Btls
return 1;
}
int ServerNameCallback ()
{
Debug ("SERVER NAME CALLBACK");
var name = ssl.GetServerName ();
Debug ($"SERVER NAME CALLBACK #1: {name}");
var certificate = SelectServerCertificate (name);
if (certificate == null)
return 1;
nativeServerCertificate = GetPrivateCertificate (certificate);
SetPrivateCertificate (nativeServerCertificate);
return 1;
}
public override void StartHandshake ()
{
InitializeConnection ();
@@ -133,7 +149,8 @@ namespace Mono.Btls
ssl.SetBio (bio);
if (IsServer) {
SetPrivateCertificate (nativeServerCertificate);
if (nativeServerCertificate != null)
SetPrivateCertificate (nativeServerCertificate);
} else {
ssl.SetServerName (ServerName);
}
@@ -242,6 +259,10 @@ namespace Mono.Btls
if (!IsServer)
ctx.SetSelectCallback (SelectCallback);
if (IsServer && (Options.ServerCertSelectionDelegate != null || Settings.ClientCertificateSelectionCallback != null)) {
ctx.SetServerNameCallback (ServerNameCallback);
}
ctx.SetVerifyParam (MonoBtlsProvider.GetVerifyParam (Settings, ServerName, IsServer));
TlsProtocolCode? minProtocol, maxProtocol;

View File

@@ -26,6 +26,7 @@
#if SECURITY_DEP && MONO_FEATURE_BTLS
using System;
using System.Threading;
using System.Security.Authentication;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
@@ -108,6 +109,9 @@ namespace Mono.Btls
if (error == null)
return;
if (error is AuthenticationException || error is NotSupportedException)
throw error;
string message;
if (callerName != null)
message = $"Caught unhandled exception in `{GetType ().Name}.{callerName}`.";

View File

@@ -34,6 +34,7 @@ namespace Mono.Btls
{
delegate int MonoBtlsVerifyCallback (MonoBtlsX509StoreCtx ctx);
delegate int MonoBtlsSelectCallback (string[] acceptableIssuers);
delegate int MonoBtlsServerNameCallback ();
class MonoBtlsSsl : MonoBtlsObject
{

View File

@@ -90,15 +90,22 @@ namespace Mono.Btls
[DllImport (BTLS_DYLIB)]
extern static int mono_btls_ssl_ctx_set_client_ca_list (IntPtr handle, int count, IntPtr sizes, IntPtr data);
[DllImport (BTLS_DYLIB)]
extern static void mono_btls_ssl_ctx_set_server_name_callback (IntPtr handle, IntPtr func);
delegate int NativeVerifyFunc (IntPtr instance, int preverify_ok, IntPtr ctx);
delegate int NativeSelectFunc (IntPtr instance, int count, IntPtr sizes, IntPtr data);
delegate int NativeServerNameFunc (IntPtr instance);
NativeVerifyFunc verifyFunc;
NativeSelectFunc selectFunc;
NativeServerNameFunc serverNameFunc;
IntPtr verifyFuncPtr;
IntPtr selectFuncPtr;
IntPtr serverNameFuncPtr;
MonoBtlsVerifyCallback verifyCallback;
MonoBtlsSelectCallback selectCallback;
MonoBtlsServerNameCallback serverNameCallback;
MonoBtlsX509Store store;
GCHandle instance;
IntPtr instancePtr;
@@ -118,8 +125,10 @@ namespace Mono.Btls
verifyFunc = NativeVerifyCallback;
selectFunc = NativeSelectCallback;
serverNameFunc = NativeServerNameCallback;
verifyFuncPtr = Marshal.GetFunctionPointerForDelegate (verifyFunc);
selectFuncPtr = Marshal.GetFunctionPointerForDelegate (selectFunc);
serverNameFuncPtr = Marshal.GetFunctionPointerForDelegate (serverNameFunc);
store = new MonoBtlsX509Store (Handle);
}
@@ -300,6 +309,27 @@ namespace Mono.Btls
}
}
public void SetServerNameCallback (MonoBtlsServerNameCallback callback)
{
CheckThrow ();
serverNameCallback = callback;
mono_btls_ssl_ctx_set_server_name_callback (
Handle.DangerousGetHandle (), serverNameFuncPtr);
}
[Mono.Util.MonoPInvokeCallback (typeof (NativeServerNameFunc))]
static int NativeServerNameCallback (IntPtr instance)
{
var c = (MonoBtlsSslCtx)GCHandle.FromIntPtr (instance).Target;
try {
return c.serverNameCallback ();
} catch (Exception ex) {
c.SetException (ex);
return 0;
}
}
protected override void Close ()
{
if (store != null) {