public virtual int DoFinal(byte[] output, int outOff)
{
byte[] tmp = new byte[digest.GetDigestSize()];
digest.DoFinal(tmp, 0);
digest.BlockUpdate(secret, 0, secret.Length);
digest.BlockUpdate(opad, 0, opad.Length);
digest.BlockUpdate(tmp, 0, tmp.Length);
int len = digest.DoFinal(output, outOff);
Reset();
return len;
}