#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) #pragma warning disable using System; using System.IO; using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1; using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509; using Best.HTTP.SecureProtocol.Org.BouncyCastle.Math; using Best.HTTP.SecureProtocol.Org.BouncyCastle.Utilities; namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Tls.Crypto.Impl.BC { /// Implementation class for a single X.509 certificate based on the BC light-weight API. public class BcTlsCertificate : BcTlsRawKeyCertificate { /// public static BcTlsCertificate Convert(BcTlsCrypto crypto, TlsCertificate certificate) { if (certificate is BcTlsCertificate) return (BcTlsCertificate)certificate; return new BcTlsCertificate(crypto, certificate.GetEncoded()); } /// public static X509CertificateStructure ParseCertificate(byte[] encoding) { try { Asn1Object asn1 = TlsUtilities.ReadAsn1Object(encoding); return X509CertificateStructure.GetInstance(asn1); } catch (Exception e) { throw new TlsFatalAlert(AlertDescription.bad_certificate, e); } } protected readonly X509CertificateStructure m_certificate; /// public BcTlsCertificate(BcTlsCrypto crypto, byte[] encoding) : this(crypto, ParseCertificate(encoding)) { } public BcTlsCertificate(BcTlsCrypto crypto, X509CertificateStructure certificate) : base(crypto, certificate.SubjectPublicKeyInfo) { m_certificate = certificate; } public virtual X509CertificateStructure X509CertificateStructure => m_certificate; /// public override byte[] GetEncoded() { return m_certificate.GetEncoded(Asn1Encodable.Der); } /// public override byte[] GetExtension(DerObjectIdentifier extensionOid) { X509Extensions extensions = m_certificate.TbsCertificate.Extensions; if (extensions != null) { X509Extension extension = extensions.GetExtension(extensionOid); if (extension != null) { return Arrays.Clone(extension.Value.GetOctets()); } } return null; } public override BigInteger SerialNumber => m_certificate.SerialNumber.Value; public override string SigAlgOid => m_certificate.SignatureAlgorithm.Algorithm.Id; public override Asn1Encodable GetSigAlgParams() => m_certificate.SignatureAlgorithm.Parameters; protected override bool SupportsKeyUsage(int keyUsageBits) { X509Extensions exts = m_certificate.TbsCertificate.Extensions; if (exts != null) { KeyUsage ku = KeyUsage.FromExtensions(exts); if (ku != null) { int bits = ku.GetBytes()[0] & 0xff; if ((bits & keyUsageBits) != keyUsageBits) return false; } } return true; } } } #pragma warning restore #endif