예제 #1
0
        private static void Blake2bLong(byte[] pbOut, int cbOut,
                                        byte[] pbIn, int cbIn, Blake2b h)
        {
            Debug.Assert((h != null) && (h.HashSize == (64 * 8)));

            byte[] pbOutLen = new byte[4];
            MemUtil.UInt32ToBytesEx((uint)cbOut, pbOutLen, 0);

            if (cbOut <= 64)
            {
                Blake2b hOut = ((cbOut == 64) ? h : new Blake2b(cbOut));
                if (cbOut == 64)
                {
                    hOut.Initialize();
                }

                hOut.TransformBlock(pbOutLen, 0, pbOutLen.Length, pbOutLen, 0);
                hOut.TransformBlock(pbIn, 0, cbIn, pbIn, 0);
                hOut.TransformFinalBlock(MemUtil.EmptyByteArray, 0, 0);

                Array.Copy(hOut.Hash, pbOut, cbOut);

                if (cbOut < 64)
                {
                    hOut.Clear();
                }
                return;
            }

            h.Initialize();
            h.TransformBlock(pbOutLen, 0, pbOutLen.Length, pbOutLen, 0);
            h.TransformBlock(pbIn, 0, cbIn, pbIn, 0);
            h.TransformFinalBlock(MemUtil.EmptyByteArray, 0, 0);

            byte[] pbOutBuffer = new byte[64];
            Array.Copy(h.Hash, pbOutBuffer, pbOutBuffer.Length);

            int ibOut = 64 / 2;

            Array.Copy(pbOutBuffer, pbOut, ibOut);
            int cbToProduce = cbOut - ibOut;

            h.Initialize();
            while (cbToProduce > 64)
            {
                byte[] pbHash = h.ComputeHash(pbOutBuffer);
                Array.Copy(pbHash, pbOutBuffer, 64);

                Array.Copy(pbHash, 0, pbOut, ibOut, 64 / 2);
                ibOut       += 64 / 2;
                cbToProduce -= 64 / 2;

                MemUtil.ZeroByteArray(pbHash);
            }

            using (Blake2b hOut = new Blake2b(cbToProduce))
            {
                byte[] pbHash = hOut.ComputeHash(pbOutBuffer);
                Array.Copy(pbHash, 0, pbOut, ibOut, cbToProduce);

                MemUtil.ZeroByteArray(pbHash);
            }

            MemUtil.ZeroByteArray(pbOutBuffer);
        }
예제 #2
0
		private static void Blake2bLong(byte[] pbOut, int cbOut,
			byte[] pbIn, int cbIn, Blake2b h)
		{
			Debug.Assert((h != null) && (h.HashSize == (64 * 8)));

			byte[] pbOutLen = new byte[4];
			MemUtil.UInt32ToBytesEx((uint)cbOut, pbOutLen, 0);

			if(cbOut <= 64)
			{
				Blake2b hOut = ((cbOut == 64) ? h : new Blake2b(cbOut));
				if(cbOut == 64) hOut.Initialize();

				hOut.TransformBlock(pbOutLen, 0, pbOutLen.Length, pbOutLen, 0);
				hOut.TransformBlock(pbIn, 0, cbIn, pbIn, 0);
				hOut.TransformFinalBlock(MemUtil.EmptyByteArray, 0, 0);

				Array.Copy(hOut.Hash, pbOut, cbOut);

				if(cbOut < 64) hOut.Clear();
				return;
			}

			h.Initialize();
			h.TransformBlock(pbOutLen, 0, pbOutLen.Length, pbOutLen, 0);
			h.TransformBlock(pbIn, 0, cbIn, pbIn, 0);
			h.TransformFinalBlock(MemUtil.EmptyByteArray, 0, 0);

			byte[] pbOutBuffer = new byte[64];
			Array.Copy(h.Hash, pbOutBuffer, pbOutBuffer.Length);

			int ibOut = 64 / 2;
			Array.Copy(pbOutBuffer, pbOut, ibOut);
			int cbToProduce = cbOut - ibOut;

			h.Initialize();
			while(cbToProduce > 64)
			{
				byte[] pbHash = h.ComputeHash(pbOutBuffer);
				Array.Copy(pbHash, pbOutBuffer, 64);

				Array.Copy(pbHash, 0, pbOut, ibOut, 64 / 2);
				ibOut += 64 / 2;
				cbToProduce -= 64 / 2;

				MemUtil.ZeroByteArray(pbHash);
			}

			using(Blake2b hOut = new Blake2b(cbToProduce))
			{
				byte[] pbHash = hOut.ComputeHash(pbOutBuffer);
				Array.Copy(pbHash, 0, pbOut, ibOut, cbToProduce);

				MemUtil.ZeroByteArray(pbHash);
			}

			MemUtil.ZeroByteArray(pbOutBuffer);
		}