You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.3 KiB
128 lines
3.3 KiB
8 months ago
|
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
|
||
|
#pragma warning disable
|
||
|
using System;
|
||
|
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Security.Certificates;
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
|
||
|
|
||
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.X509
|
||
|
{
|
||
|
/// <remarks>
|
||
|
/// This class contains a cross certificate pair. Cross certificates pairs may
|
||
|
/// contain two cross signed certificates from two CAs. A certificate from the
|
||
|
/// other CA to this CA is contained in the forward certificate, the certificate
|
||
|
/// from this CA to the other CA is contained in the reverse certificate.
|
||
|
/// </remarks>
|
||
|
public class X509CertificatePair
|
||
|
{
|
||
|
private readonly X509Certificate forward;
|
||
|
private readonly X509Certificate reverse;
|
||
|
|
||
|
/// <summary>Constructor</summary>
|
||
|
/// <param name="forward">Certificate from the other CA to this CA.</param>
|
||
|
/// <param name="reverse">Certificate from this CA to the other CA.</param>
|
||
|
public X509CertificatePair(
|
||
|
X509Certificate forward,
|
||
|
X509Certificate reverse)
|
||
|
{
|
||
|
this.forward = forward;
|
||
|
this.reverse = reverse;
|
||
|
}
|
||
|
|
||
|
/// <summary>Constructor from a ASN.1 CertificatePair structure.</summary>
|
||
|
/// <param name="pair">The <c>CertificatePair</c> ASN.1 object.</param>
|
||
|
public X509CertificatePair(
|
||
|
CertificatePair pair)
|
||
|
{
|
||
|
if (pair.Forward != null)
|
||
|
{
|
||
|
this.forward = new X509Certificate(pair.Forward);
|
||
|
}
|
||
|
if (pair.Reverse != null)
|
||
|
{
|
||
|
this.reverse = new X509Certificate(pair.Reverse);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public byte[] GetEncoded()
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
X509CertificateStructure f = null, r = null;
|
||
|
|
||
|
if (forward != null)
|
||
|
{
|
||
|
f = X509CertificateStructure.GetInstance(
|
||
|
Asn1Object.FromByteArray(forward.GetEncoded()));
|
||
|
|
||
|
if (f == null)
|
||
|
throw new CertificateEncodingException("unable to get encoding for forward");
|
||
|
}
|
||
|
|
||
|
if (reverse != null)
|
||
|
{
|
||
|
r = X509CertificateStructure.GetInstance(
|
||
|
Asn1Object.FromByteArray(reverse.GetEncoded()));
|
||
|
|
||
|
if (r == null)
|
||
|
throw new CertificateEncodingException("unable to get encoding for reverse");
|
||
|
}
|
||
|
|
||
|
return new CertificatePair(f, r).GetDerEncoded();
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
// TODO
|
||
|
// throw new ExtCertificateEncodingException(e.toString(), e);
|
||
|
throw new CertificateEncodingException(e.Message, e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>Returns the certificate from the other CA to this CA.</summary>
|
||
|
public X509Certificate Forward
|
||
|
{
|
||
|
get { return forward; }
|
||
|
}
|
||
|
|
||
|
/// <summary>Returns the certificate from this CA to the other CA.</summary>
|
||
|
public X509Certificate Reverse
|
||
|
{
|
||
|
get { return reverse; }
|
||
|
}
|
||
|
|
||
|
public override bool Equals(
|
||
|
object obj)
|
||
|
{
|
||
|
if (obj == this)
|
||
|
return true;
|
||
|
|
||
|
X509CertificatePair other = obj as X509CertificatePair;
|
||
|
|
||
|
if (other == null)
|
||
|
return false;
|
||
|
|
||
|
return BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.Equals(this.forward, other.forward)
|
||
|
&& BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.Equals(this.reverse, other.reverse);
|
||
|
}
|
||
|
|
||
|
public override int GetHashCode()
|
||
|
{
|
||
|
int hash = -1;
|
||
|
if (forward != null)
|
||
|
{
|
||
|
hash ^= forward.GetHashCode();
|
||
|
}
|
||
|
if (reverse != null)
|
||
|
{
|
||
|
hash *= 17;
|
||
|
hash ^= reverse.GetHashCode();
|
||
|
}
|
||
|
return hash;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#pragma warning restore
|
||
|
#endif
|