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.
145 lines
3.8 KiB
145 lines
3.8 KiB
#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.Ocsp; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Math; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Security; |
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.X509; |
|
|
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Ocsp |
|
{ |
|
public class CertificateID |
|
{ |
|
public const string HashSha1 = "1.3.14.3.2.26"; |
|
|
|
private readonly CertID id; |
|
|
|
public CertificateID( |
|
CertID id) |
|
{ |
|
if (id == null) |
|
throw new ArgumentNullException("id"); |
|
|
|
this.id = id; |
|
} |
|
|
|
/** |
|
* create from an issuer certificate and the serial number of the |
|
* certificate it signed. |
|
* @exception OcspException if any problems occur creating the id fields. |
|
*/ |
|
public CertificateID( |
|
string hashAlgorithm, |
|
X509Certificate issuerCert, |
|
BigInteger serialNumber) |
|
{ |
|
AlgorithmIdentifier hashAlg = new AlgorithmIdentifier( |
|
new DerObjectIdentifier(hashAlgorithm), DerNull.Instance); |
|
|
|
this.id = CreateCertID(hashAlg, issuerCert, new DerInteger(serialNumber)); |
|
} |
|
|
|
public string HashAlgOid |
|
{ |
|
get { return id.HashAlgorithm.Algorithm.Id; } |
|
} |
|
|
|
public byte[] GetIssuerNameHash() |
|
{ |
|
return id.IssuerNameHash.GetOctets(); |
|
} |
|
|
|
public byte[] GetIssuerKeyHash() |
|
{ |
|
return id.IssuerKeyHash.GetOctets(); |
|
} |
|
|
|
/** |
|
* return the serial number for the certificate associated |
|
* with this request. |
|
*/ |
|
public BigInteger SerialNumber |
|
{ |
|
get { return id.SerialNumber.Value; } |
|
} |
|
|
|
public bool MatchesIssuer( |
|
X509Certificate issuerCert) |
|
{ |
|
return CreateCertID(id.HashAlgorithm, issuerCert, id.SerialNumber).Equals(id); |
|
} |
|
|
|
public CertID ToAsn1Object() |
|
{ |
|
return id; |
|
} |
|
|
|
public override bool Equals( |
|
object obj) |
|
{ |
|
if (obj == this) |
|
return true; |
|
|
|
CertificateID other = obj as CertificateID; |
|
|
|
if (other == null) |
|
return false; |
|
|
|
return id.ToAsn1Object().Equals(other.id.ToAsn1Object()); |
|
} |
|
|
|
public override int GetHashCode() |
|
{ |
|
return id.ToAsn1Object().GetHashCode(); |
|
} |
|
|
|
|
|
/** |
|
* Create a new CertificateID for a new serial number derived from a previous one |
|
* calculated for the same CA certificate. |
|
* |
|
* @param original the previously calculated CertificateID for the CA. |
|
* @param newSerialNumber the serial number for the new certificate of interest. |
|
* |
|
* @return a new CertificateID for newSerialNumber |
|
*/ |
|
public static CertificateID DeriveCertificateID(CertificateID original, BigInteger newSerialNumber) |
|
{ |
|
return new CertificateID(new CertID(original.id.HashAlgorithm, original.id.IssuerNameHash, |
|
original.id.IssuerKeyHash, new DerInteger(newSerialNumber))); |
|
} |
|
|
|
private static CertID CreateCertID( |
|
AlgorithmIdentifier hashAlg, |
|
X509Certificate issuerCert, |
|
DerInteger serialNumber) |
|
{ |
|
try |
|
{ |
|
String hashAlgorithm = hashAlg.Algorithm.Id; |
|
|
|
X509Name issuerName = PrincipalUtilities.GetSubjectX509Principal(issuerCert); |
|
byte[] issuerNameHash = DigestUtilities.CalculateDigest( |
|
hashAlgorithm, issuerName.GetEncoded()); |
|
|
|
AsymmetricKeyParameter issuerKey = issuerCert.GetPublicKey(); |
|
SubjectPublicKeyInfo info = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(issuerKey); |
|
byte[] issuerKeyHash = DigestUtilities.CalculateDigest( |
|
hashAlgorithm, info.PublicKeyData.GetBytes()); |
|
|
|
return new CertID(hashAlg, new DerOctetString(issuerNameHash), |
|
new DerOctetString(issuerKeyHash), serialNumber); |
|
} |
|
catch (Exception e) |
|
{ |
|
throw new OcspException("problem creating ID: " + e, e); |
|
} |
|
} |
|
} |
|
} |
|
#pragma warning restore |
|
#endif
|
|
|