public bool Verify()
{
if (verified)
return verifyResult;
if (isTsp) {
TimeStampTokenInfo info = timeStampToken.TimeStampInfo;
MessageImprint imprint = info.TstInfo.MessageImprint;
byte[] md = new byte[messageDigest.GetDigestSize()];
messageDigest.DoFinal(md, 0);
byte[] imphashed = imprint.GetHashedMessage();
verifyResult = Arrays.AreEqual(md, imphashed);
}
else {
if (sigAttr != null) {
byte[] msgDigestBytes = new byte[messageDigest.GetDigestSize()];
messageDigest.DoFinal(msgDigestBytes, 0);
bool verifyRSAdata = true;
sig.BlockUpdate(sigAttr, 0, sigAttr.Length);
// Stefan Santesson fixed a bug, keeping the code backward compatible
bool encContDigestCompare = false;
if (RSAdata != null) {
verifyRSAdata = Arrays.AreEqual(msgDigestBytes, RSAdata);
encContDigest.BlockUpdate(RSAdata, 0, RSAdata.Length);
byte[] encContDigestBytes = new byte[encContDigest.GetDigestSize()];
encContDigest.DoFinal(encContDigestBytes, 0);
encContDigestCompare = Arrays.AreEqual(encContDigestBytes, digestAttr);
}
bool absentEncContDigestCompare = Arrays.AreEqual(msgDigestBytes, digestAttr);
bool concludingDigestCompare = absentEncContDigestCompare || encContDigestCompare;
bool sigVerify = sig.VerifySignature(digest);
verifyResult = concludingDigestCompare && sigVerify && verifyRSAdata;
//verifyResult = Arrays.AreEqual(msgDigestBytes, digestAttr) && sig.VerifySignature(digest) && verifyRSAdata;
}
else {
if (RSAdata != null){
byte[] msd = new byte[messageDigest.GetDigestSize()];
messageDigest.DoFinal(msd, 0);
sig.BlockUpdate(msd, 0, msd.Length);
}
verifyResult = sig.VerifySignature(digest);
}
}
verified = true;
return verifyResult;
}