TimeStampRequest
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Tsp;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.X509;
using System;
using System.Collections.Generic;
using System.IO;
namespace Org.BouncyCastle.Tsp
{
public class TimeStampRequest : X509ExtensionBase
{
private readonly TimeStampReq m_req;
public TimeStampReq TimeStampReq => m_req;
public int Version => m_req.Version.IntValueExact;
public MessageImprint MessageImprint => m_req.MessageImprint;
public AlgorithmIdentifier MessageImprintAlgID => m_req.MessageImprint.HashAlgorithm;
public string MessageImprintAlgOid => m_req.MessageImprint.HashAlgorithm.Algorithm.Id;
public Asn1OctetString MessageImprintDigest => m_req.MessageImprint.HashedMessage;
public string ReqPolicy => m_req.ReqPolicy?.Id;
public BigInteger Nonce => m_req.Nonce?.Value;
public bool CertReq => (m_req.CertReq ?? DerBoolean.False).IsTrue;
internal X509Extensions Extensions => m_req.Extensions;
public virtual bool HasExtensions => Extensions != null;
private static TimeStampReq ParseTimeStampReq(byte[] encoding)
{
try {
return TimeStampReq.GetInstance(encoding);
} catch (Exception ex) {
throw new IOException("malformed request: " + ex?.ToString());
}
}
private static TimeStampReq ParseTimeStampReq(Stream input)
{
try {
return TimeStampReq.GetInstance(Asn1Object.FromStream(input));
} catch (Exception ex) {
throw new IOException("malformed request: " + ex?.ToString());
}
}
public TimeStampRequest(TimeStampReq req)
{
m_req = req;
}
public TimeStampRequest(byte[] req)
: this(ParseTimeStampReq(req))
{
}
public TimeStampRequest(Stream input)
: this(ParseTimeStampReq(input))
{
}
public byte[] GetMessageImprintDigest()
{
return m_req.MessageImprint.GetHashedMessage();
}
public void Validate(IList<string> algorithms, IList<string> policies, IList<string> extensions)
{
if (algorithms == null)
throw new TspValidationException("no algorithms associated with request", 128);
MessageImprint messageImprint = MessageImprint;
DerObjectIdentifier algorithm = messageImprint.HashAlgorithm.Algorithm;
if (!algorithms.Contains(algorithm.GetID()))
throw new TspValidationException("request contains unknown algorithm", 128);
if (policies != null) {
DerObjectIdentifier reqPolicy = m_req.ReqPolicy;
if (reqPolicy != null && !policies.Contains(reqPolicy.GetID()))
throw new TspValidationException("request contains unknown policy", 256);
}
if (extensions != null && Extensions != null) {
foreach (DerObjectIdentifier extensionOid in Extensions.ExtensionOids) {
if (!extensions.Contains(extensionOid.GetID()))
throw new TspValidationException("request contains unknown extension", 8388608);
}
}
if (TspUtil.GetDigestLength(algorithm) != messageImprint.HashedMessage.GetOctetsLength())
throw new TspValidationException("imprint digest the wrong length", 4);
}
public byte[] GetEncoded()
{
return m_req.GetEncoded();
}
public virtual IList<DerObjectIdentifier> GetExtensionOids()
{
return TspUtil.GetExtensionOids(Extensions);
}
protected override X509Extensions GetX509Extensions()
{
return Extensions;
}
}
}