/// <summary> /// Calculates the MacKey (i.e. the key to use when calculating the MagTag for key confirmation). /// /// MacKey = H(K || "JPAKE_KC") /// </summary> private static byte[] CalculateMacKey(BigInteger keyingMaterial, IDigest digest) { digest.Reset(); UpdateDigest(digest, keyingMaterial); /* * This constant is used to ensure that the macKey is NOT the same as the derived key. */ UpdateDigest(digest, "JPAKE_KC"); return DigestUtilities.DoFinal(digest); }
/// <summary> /// Computes hash of the data /// </summary> /// <param name="digest">Hash algorithm implementation</param> /// <param name="data">Data that should be processed</param> /// <returns>Hash of data</returns> private static byte[] ComputeDigest(IDigest digest, byte[] data) { if (digest == null) throw new ArgumentNullException("digest"); if (data == null) throw new ArgumentNullException("data"); byte[] hash = new byte[digest.GetDigestSize()]; digest.Reset(); digest.BlockUpdate(data, 0, data.Length); digest.DoFinal(hash, 0); return hash; }
private static BigInteger CalculateHashForZeroKnowledgeProof(BigInteger g, BigInteger gr, BigInteger gx, string participantId, IDigest digest) { digest.Reset(); UpdateDigestIncludingSize(digest, g); UpdateDigestIncludingSize(digest, gr); UpdateDigestIncludingSize(digest, gx); UpdateDigestIncludingSize(digest, participantId); byte[] output = DigestUtilities.DoFinal(digest); return new BigInteger(output); }
/** * reset the internal state */ public virtual void Reset() { digest.Reset(); }
/** * Reset the mac generator. */ public virtual void Reset() { digest.Reset(); digest.BlockUpdate(secret, 0, secret.Length); digest.BlockUpdate(IPAD, 0, padLength); }
/** * fill len bytes of the output buffer with bytes generated from * the derivation function. * * @throws ArgumentException if the size of the request will cause an overflow. * @throws DataLengthException if the out buffer is too small. */ public virtual int GenerateBytes(byte[] output, int outOff, int length) { if ((output.Length - length) < outOff) { throw new DataLengthException("output buffer too small"); } long oBytes = length; int outLen = digest.GetDigestSize(); // // this is at odds with the standard implementation, the // maximum value should be hBits * (2^32 - 1) where hBits // is the digest output size in bits. We can't have an // array with a long index at the moment... // if (oBytes > ((2L << 32) - 1)) { throw new ArgumentException("Output length too large"); } int cThreshold = (int)((oBytes + outLen - 1) / outLen); byte[] dig = new byte[digest.GetDigestSize()]; byte[] C = new byte[4]; Pack.UInt32_To_BE((uint)counterStart, C, 0); uint counterBase = (uint)(counterStart & ~0xFF); for (int i = 0; i < cThreshold; i++) { digest.BlockUpdate(shared, 0, shared.Length); digest.BlockUpdate(C, 0, 4); if (iv != null) { digest.BlockUpdate(iv, 0, iv.Length); } digest.DoFinal(dig, 0); if (length > outLen) { Array.Copy(dig, 0, output, outOff, outLen); outOff += outLen; length -= outLen; } else { Array.Copy(dig, 0, output, outOff, length); } if (++C[3] == 0) { counterBase += 0x100; Pack.UInt32_To_BE(counterBase, C, 0); } } digest.Reset(); return((int)oBytes); }
/// <summary>Reset the internal state</summary> public void Reset() { //jbonilla currentSignature = null; digest.Reset(); }
/// <summary> reset the internal state</summary> public virtual void Reset() { contentDigest1.Reset(); }