问题描述
我正在通过使用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
对象(与Java和C#相同)。
我喜欢从另一个类的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;
}