有弹性的城堡-从TimeStampResponse签名前获取哈希

问题描述

我正在通过使用Bouncy Castle来从TSA获取签名哈希,

TimeStampResponse GetSignedHashFromTsa(byte[] hash)
{
    TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();

    TimeStampRequest request = reqGen.Generate(
                TspAlgorithms.Sha1,hash,BigInteger.ValueOf(100)
            );
    byte[] reqData = request.GetEncoded();

    HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create("http://www.cryptopro.ru/tsp/tsp.srf");
    httpReq.Method = "POST";
    httpReq.ContentType = "application/timestamp-query";
    httpReq.ContentLength = reqData.Length;

    // Write the request content
    Stream reqStream = httpReq.GetRequestStream();
    reqStream.Write(reqData,reqData.Length);
    reqStream.Close();

    HttpWebResponse httpResp = (HttpWebResponse)httpReq.GetResponse();

    // Read the response
    Stream respStream = new BufferedStream(httpResp.GetResponseStream());
    TimeStampResponse response = new TimeStampResponse(respStream);
    respStream.Close();

    return response;
}

通过此功能,我可以从byte[]获取一个TimeStampResponse对象(与JavaC#相同)。

我喜欢从另一个类的TimeStampResponse对象中获取byte[]。有什么办法吗?

预先感谢您的帮助。

重新-

为了更好地理解Sai Ye Yan Naing Aye,我在调用这样的函数-

byte[] hashToSign = ....;
TimeStampResponse response = GetSignedHashFromTsa(hashToSign);
byte[] signedBytetoSaveInFile = response.GetEncoded();

然后我将signedBytetoSaveInFile保存在文件中。稍后,我尝试查找byte[]签名的内容。说,我正在这样做-

byte[] signedBytetoSaveInFile = ....; //Read byte array from file
TimeStampResponse prevIoUslyTsaSignedDataResponse = new TimeStampResponse(signedBytetoSaveInFile);

现在,我想获取prevIoUslyTsaSignedDataResponse对象进行签名之前发送到TSA服务器的字节数组。因此,我想获得byte[] hash发送到TSA服务器的内容以进行签名。换句话说,我喜欢在签名前获得主要内容

想想,现在的问题更清楚了。

解决方法

我自己已经解决了这个问题-

bool ValidateTimestamp(TimeStampResponse tr,byte[] hash)
{
    try
    {
        TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
        TimeStampRequest request = reqGen.Generate(
                TspAlgorithms.Sha1,hash,BigInteger.ValueOf(100)
            );
    
        tr.Validate(request);
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
    return tr.GetFailInfo() == null;
}