*/
public class DotNetTlsProvider : MonoTlsProvider
{
+ static readonly Guid id = new Guid ("3a7b3a26-0dbd-4572-a5b8-fdce766bf0dd");
+
+ public override Guid ID {
+ get { return id; }
+ }
+
+ public override string Name {
+ get { return "dotnet"; }
+ }
+
public override bool SupportsSslStream {
get { return true; }
}
{
public class OldTlsProvider : MonoTlsProvider
{
+ static readonly Guid id = new Guid ("cf8baa0d-c6ed-40ae-b512-dec8d097e9af");
+
+ public override Guid ID {
+ get { return id; }
+ }
+
+ public override string Name {
+ get { return "old"; }
+ }
+
public override bool SupportsSslStream {
get { return true; }
}
public abstract class MonoTlsProvider
{
+ public abstract Guid ID {
+ get;
+ }
+
+ public abstract string Name {
+ get;
+ }
+
#region SslStream
/*
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
+using System.Threading;
using System.Security.Cryptography.X509Certificates;
namespace Mono.Security.Interface
{
}
+ volatile static MonoTlsSettings defaultSettings;
+
+ public static MonoTlsSettings DefaultSettings {
+ get {
+ if (defaultSettings == null)
+ Interlocked.CompareExchange (ref defaultSettings, new MonoTlsSettings (), null);
+ return defaultSettings;
+ }
+ set {
+ defaultSettings = value ?? new MonoTlsSettings ();
+ }
+ }
+
+ public static MonoTlsSettings CopyDefaultSettings ()
+ {
+ return DefaultSettings.Clone ();
+ }
+
#region Private APIs
/*
return copy;
}
+ public MonoTlsSettings Clone ()
+ {
+ return new MonoTlsSettings (this);
+ }
+
MonoTlsSettings (MonoTlsSettings other)
{
RemoteCertificateValidationCallback = other.RemoteCertificateValidationCallback;
tlsStream = other.tlsStream;
request = other.request;
+ if (settings == null)
+ settings = MonoTlsSettings.DefaultSettings;
+
this.provider = provider;
- this.settings = settings = settings.CloneWithValidator (this);
+ this.settings = settings.CloneWithValidator (this);
this.callbackWrapper = callbackWrapper;
}
*/
class MonoDefaultTlsProvider : MonoTlsProviderImpl
{
+ static readonly Guid id = new Guid ("809e77d5-56cc-4da8-b9f0-45e65ba9cceb");
+
+ public override Guid ID {
+ get { return id; }
+ }
+
+ public override string Name {
+ get { return "legacy"; }
+ }
+
public MonoTlsProvider Provider {
get { return this; }
}
provider = request.TlsProvider ?? MonoTlsProviderFactory.GetProviderInternal ();
status = WebExceptionStatus.SecureChannelFailure;
- if (settings == null)
- settings = new MonoTlsSettings ();
-
validationHelper = ChainValidationHelper.Create (provider.Provider, ref settings, this);
}
#if SECURITY_DEP
var tlsProvider = MonoTlsProviderFactory.GetProviderInternal ();
- var settings = new MSI.MonoTlsSettings ();
+ var settings = MSI.MonoTlsSettings.CopyDefaultSettings ();
settings.UseServicePointManagerCallback = true;
var sslStream = tlsProvider.CreateSslStream (stream, false, settings);
CheckCancellation ();
public class SslStream : AuthenticatedStream, MNS.IMonoSslStream
{
+ MonoTlsProvider provider;
MonoSslStream impl;
internal MonoSslStream Impl {
}
}
+ internal MonoTlsProvider Provider {
+ get {
+ CheckDisposed ();
+ return provider;
+ }
+ }
+
static MonoTlsProvider GetProvider ()
{
return MonoTlsProviderFactory.GetDefaultProvider ();
public SslStream (Stream innerStream, bool leaveInnerStreamOpen)
: base (innerStream, leaveInnerStreamOpen)
{
- var provider = GetProvider ();
+ provider = GetProvider ();
impl = provider.CreateSslStream (innerStream, leaveInnerStreamOpen);
}
public SslStream (Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback, LocalCertificateSelectionCallback userCertificateSelectionCallback)
: base (innerStream, leaveInnerStreamOpen)
{
- var provider = GetProvider ();
- var settings = new MonoTlsSettings ();
+ provider = GetProvider ();
+ var settings = MonoTlsSettings.CopyDefaultSettings ();
settings.RemoteCertificateValidationCallback = MNS.Private.CallbackHelpers.PublicToMono (userCertificateValidationCallback);
settings.ClientCertificateSelectionCallback = MNS.Private.CallbackHelpers.PublicToMono (userCertificateSelectionCallback);
impl = provider.CreateSslStream (innerStream, leaveInnerStreamOpen, settings);
internal bool ChangeToSSLSocket (ref Stream stream) {
#if SECURITY_DEP
var provider = MonoTlsProviderFactory.GetProviderInternal ();
- var settings = new MSI.MonoTlsSettings ();
+ var settings = MSI.MonoTlsSettings.CopyDefaultSettings ();
settings.UseServicePointManagerCallback = true;
var sslStream = provider.CreateSslStream (stream, true, settings);
sslStream.AuthenticateAsClient (requestUri.Host, null, SslProtocols.Default, false);
if (tlsProvider == null)
tlsProvider = MonoTlsProviderFactory.GetProviderInternal ();
if (tlsSettings == null)
- tlsSettings = new MSI.MonoTlsSettings ();
+ tlsSettings = MSI.MonoTlsSettings.CopyDefaultSettings ();
if (tlsSettings.RemoteCertificateValidationCallback == null)
tlsSettings.RemoteCertificateValidationCallback = callback;
return tlsProvider.CreateSslStream (innerStream, ownsStream, tlsSettings);