[appletls] Trust SecTrustResult.Proceed as well. Fixes #58411.
[mono.git] / mcs / class / System / Mono.AppleTls / AppleCertificateHelper.cs
index 6225abb90ca3fb6c039dac78d06a5bdab886e06f..073f16080044f4d5315b339ea99418573e80d51c 100644 (file)
@@ -36,7 +36,11 @@ namespace Mono.AppleTls
                         */
                        var certificate2 = certificate as X509Certificate2;
                        if (certificate2 != null)
+#if MONOTOUCH
                                return SecIdentity.Import (certificate2);
+#else
+                               return SecImportExport.ItemImport (certificate2);
+#endif
 
                        /*
                         * Reading Certificates from the Mac Keychain
@@ -129,22 +133,28 @@ namespace Mono.AppleTls
                                        targetHost = targetHost.Substring (0, pos);
                        }
 
-                       var policy = SecPolicy.CreateSslPolicy (!serverMode, targetHost);
-                       var trust = new SecTrust (certificates, policy);
-
-                       if (validator.Settings.TrustAnchors != null) {
-                               var status = trust.SetAnchorCertificates (validator.Settings.TrustAnchors);
-                               if (status != SecStatusCode.Success)
-                                       throw new InvalidOperationException (status.ToString ());
-                               trust.SetAnchorCertificatesOnly (false);
+                       using (var policy = SecPolicy.CreateSslPolicy (!serverMode, targetHost))
+                       using (var trust = new SecTrust (certificates, policy)) {
+                               if (validator.Settings.TrustAnchors != null) {
+                                       var status = trust.SetAnchorCertificates (validator.Settings.TrustAnchors);
+                                       if (status != SecStatusCode.Success)
+                                               throw new InvalidOperationException (status.ToString ());
+                                       trust.SetAnchorCertificatesOnly (false);
+                               }
+
+                               if (validator.Settings.CertificateValidationTime != null) {
+                                       var status = trust.SetVerifyDate (validator.Settings.CertificateValidationTime.Value);
+                                       if (status != SecStatusCode.Success)
+                                               throw new InvalidOperationException (status.ToString ());
+                               }
+
+                               var result = trust.Evaluate ();
+                               if (result == SecTrustResult.Unspecified || result == SecTrustResult.Proceed)
+                                       return true;
+
+                               errors |= MonoSslPolicyErrors.RemoteCertificateChainErrors;
+                               return false;
                        }
-
-                       var result = trust.Evaluate ();
-                       if (result == SecTrustResult.Unspecified)
-                               return true;
-
-                       errors |= MonoSslPolicyErrors.RemoteCertificateChainErrors;
-                       return false;
                }
        }
 }