private bool ValidateCertificateByTlsa(TlsaRecord tlsaRecord, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
		{
			switch (tlsaRecord.CertificateUsage)
			{
				case TlsaRecord.TlsaCertificateUsage.PkixTA:
					return chain.ChainElements.Cast<X509ChainElement>().Any(x => ValidateCertificateByTlsa(tlsaRecord, x.Certificate)) && (sslPolicyErrors == SslPolicyErrors.None);

				case TlsaRecord.TlsaCertificateUsage.PkixEE:
					return ValidateCertificateByTlsa(tlsaRecord, certificate) && (sslPolicyErrors == SslPolicyErrors.None);

				case TlsaRecord.TlsaCertificateUsage.DaneTA:
					return chain.ChainElements.Cast<X509ChainElement>().Any(x => ValidateCertificateByTlsa(tlsaRecord, x.Certificate)) && ((sslPolicyErrors | SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors);

				case TlsaRecord.TlsaCertificateUsage.DaneEE:
					return ValidateCertificateByTlsa(tlsaRecord, certificate) && ((sslPolicyErrors | SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors);

				default:
					throw new NotSupportedException();
			}
		}
		private bool ValidateCertificateByTlsa(TlsaRecord tlsaRecord, X509Certificate certificate)
		{
			return TlsaRecord.GetCertificateAssocicationData(tlsaRecord.Selector, tlsaRecord.MatchingType, certificate).SequenceEqual(tlsaRecord.CertificateAssociationData);
		}