You've already forked linux-packaging-mono
Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
This commit is contained in:
parent
e9207cf623
commit
ef583813eb
@@ -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;
|
||||
|
||||
@@ -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}`.";
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace Mono.Btls
|
||||
{
|
||||
delegate int MonoBtlsVerifyCallback (MonoBtlsX509StoreCtx ctx);
|
||||
delegate int MonoBtlsSelectCallback (string[] acceptableIssuers);
|
||||
delegate int MonoBtlsServerNameCallback ();
|
||||
|
||||
class MonoBtlsSsl : MonoBtlsObject
|
||||
{
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user