using System;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Security.Certificates;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.X509
{
///
/// 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.
///
public class X509CertificatePair
{
private readonly X509Certificate forward;
private readonly X509Certificate reverse;
/// Constructor
/// Certificate from the other CA to this CA.
/// Certificate from this CA to the other CA.
public X509CertificatePair(
X509Certificate forward,
X509Certificate reverse)
{
this.forward = forward;
this.reverse = reverse;
}
/// Constructor from a ASN.1 CertificatePair structure.
/// The CertificatePair ASN.1 object.
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);
}
}
/// Returns the certificate from the other CA to this CA.
public X509Certificate Forward
{
get { return forward; }
}
/// Returns the certificate from this CA to the other CA.
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 Platform.Equals(this.forward, other.forward)
&& 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;
}
}
}