bool DigestVerifierTemplate<P,F>::VerifyDigest(const byte *digest, unsigned int digestLen, const byte *signature) const { SecByteBlock paddedBlock(PaddedBlockByteLength()); f.ApplyFunction(Integer(signature, DigestSignatureLength())).Encode(paddedBlock, paddedBlock.size); SecByteBlock recoveredDigest(MaxDigestLength()); unsigned int recoveredDigestLen = pad.Unpad(paddedBlock, PaddedBlockBitLength(), recoveredDigest); return digestLen == recoveredDigestLen && memcmp(digest, recoveredDigest, digestLen) == 0; }
void DigestSignerTemplate<P,F>::SignDigest(RandomNumberGenerator &rng, const byte *digest, unsigned int digestLength, byte *signature) const { assert(digestLength <= MaxDigestLength()); SecByteBlock paddedBlock(PaddedBlockByteLength()); pad.Pad(rng, digest, digestLength, paddedBlock, PaddedBlockBitLength()); f.CalculateInverse(Integer(paddedBlock, paddedBlock.size)).Encode(signature, DigestSignatureLength()); }
bool NRDigestVerifier::VerifyDigest(const byte *digest, unsigned int digestLen, const byte *signature) const { assert(digestLen <= MaxDigestLength()); Integer h = EncodeDigest(digest, digestLen); unsigned int qLen = m_q.ByteCount(); Integer r(signature, qLen); Integer s(signature+qLen, qLen); return RawVerify(h, r, s); }
void NRDigestSigner::SignDigest(RandomNumberGenerator &rng, const byte *digest, unsigned int digestLen, byte *signature) const { assert(digestLen <= MaxDigestLength()); Integer h = EncodeDigest(digest, digestLen); Integer r; Integer s; RawSign(rng, h, r, s); unsigned int qLen = m_q.ByteCount(); r.Encode(signature, qLen); s.Encode(signature+qLen, qLen); }