private static bool SymmetricVerify(
TcpChannelToken token,
byte[] signature,
ArraySegment<byte> dataToVerify,
bool useClientKeys)
{
// get HMAC object.
HMAC hmac = (useClientKeys)?token.ClientHmac:token.ServerHmac;
// compute hash.
MemoryStream istrm = new MemoryStream(dataToVerify.Array, dataToVerify.Offset, dataToVerify.Count, false);
byte[] computedSignature = hmac.ComputeHash(istrm);
istrm.Dispose();
// compare signatures.
for (int ii = 0; ii < signature.Length; ii++)
{
if (computedSignature[ii] != signature[ii])
{
string messageType = new UTF8Encoding().GetString(dataToVerify.Array, dataToVerify.Offset, 4);
int messageLength = BitConverter.ToInt32(dataToVerify.Array, dataToVerify.Offset+4);
string expectedSignature = Utils.ToHexString(computedSignature);
string actualSignature = Utils.ToHexString(signature);
Utils.Trace(
"Could not validate signature.\r\nChannelId={0}, TokenId={1}, MessageType={2}, Length={3}\r\nExpectedSignature={4}\r\nActualSignature ={5}",
token.ChannelId,
token.TokenId,
messageType,
messageLength,
expectedSignature,
actualSignature);
return false;
}
}
return true;
}