1 using System.Net.Security;
2 using System.Security.Cryptography.X509Certificates;
3 using System.Threading;
7 internal class ServerCertValidationCallback
9 readonly RemoteCertificateValidationCallback m_ValidationCallback;
10 readonly ExecutionContext m_Context;
12 internal ServerCertValidationCallback(RemoteCertificateValidationCallback validationCallback)
14 m_ValidationCallback = validationCallback;
15 m_Context = ExecutionContext.Capture();
18 internal RemoteCertificateValidationCallback ValidationCallback {
19 get { return m_ValidationCallback;}
22 internal void Callback(object state)
24 CallbackContext context = (CallbackContext) state;
25 context.result = m_ValidationCallback(context.request,
28 context.sslPolicyErrors);
31 internal bool Invoke(object request,
32 X509Certificate certificate,
34 SslPolicyErrors sslPolicyErrors)
36 if (m_Context == null)
38 return m_ValidationCallback(request, certificate, chain, sslPolicyErrors);
42 ExecutionContext execContext = m_Context.CreateCopy();
43 CallbackContext callbackContext = new CallbackContext(request,
47 ExecutionContext.Run(execContext, Callback, callbackContext);
48 return callbackContext.result;
52 private class CallbackContext
54 internal readonly Object request;
55 internal readonly X509Certificate certificate;
56 internal readonly X509Chain chain;
57 internal readonly SslPolicyErrors sslPolicyErrors;
61 internal CallbackContext(Object request,
62 X509Certificate certificate,
64 SslPolicyErrors sslPolicyErrors)
66 this.request = request;
67 this.certificate = certificate;
69 this.sslPolicyErrors = sslPolicyErrors;