예제 #1
0
        /// <summary>
        /// Call this method to format correctly for KMAC
        /// </summary>
        /// <param name="message">BitString representation of message</param>
        /// <param name="capacity">Capacity</param>
        /// <param name="customizationString">Character string for customization</param>
        /// <returns>Formatted message before calling Keccak</returns>
        public static BitString FormatMessage(BitString message, BitString key, int capacity, int macLength, bool xof)
        {
            var macLengthBitString = new BitString(new System.Numerics.BigInteger(macLength));

            BitString newMessage;

            if (capacity == 256)
            {
                newMessage = Sha3DerivedHelpers.Bytepad(Sha3DerivedHelpers.EncodeString(key), new BitString("A8")); // "A8" is 164 (the rate)
            }
            else                                                                                                    // capacity == 512
            {
                newMessage = Sha3DerivedHelpers.Bytepad(Sha3DerivedHelpers.EncodeString(key), new BitString("88")); // "88" is 136 (the rate)
            }

            if (xof)
            {
                var concatenatedMessageEncode = Sha3DerivedHelpers.SafeConcatenation(message, Sha3DerivedHelpers.RightEncode(BitString.Zeroes(8)));
                newMessage = BitString.ConcatenateBits(newMessage, concatenatedMessageEncode);
            }
            else
            {
                var concatenatedMessageEncode = Sha3DerivedHelpers.SafeConcatenation(message, Sha3DerivedHelpers.RightEncode(macLengthBitString));
                newMessage = BitString.ConcatenateBits(newMessage, concatenatedMessageEncode);
            }

            return(newMessage);
        }
예제 #2
0
        public static BitString FormatMessage(BitString message, int capacity, string functionNameString, BitString customization)
        {
            var functionName = Sha3DerivedHelpers.StringToHex(functionNameString);

            BitString bytepad;

            if (capacity == 256)
            {
                bytepad = Sha3DerivedHelpers.Bytepad(BitString.ConcatenateBits(Sha3DerivedHelpers.EncodeString(functionName), Sha3DerivedHelpers.EncodeString(customization)), new BitString("A8")); // "A8" is 168 (the rate)
            }
            else                                                                                                                                                                                     // capacity == 512
            {
                bytepad = Sha3DerivedHelpers.Bytepad(BitString.ConcatenateBits(Sha3DerivedHelpers.EncodeString(functionName), Sha3DerivedHelpers.EncodeString(customization)), new BitString("88")); // "88" is 136 (the rate)
            }

            message = BitString.ConcatenateBits(bytepad, message);

            message = Sha3DerivedHelpers.SafeConcatenation(message, BitString.Zeroes(2));

            return(message);
        }
예제 #3
0
        /// <summary>
        /// Call this method to format correctly for ParallelHash
        /// </summary>
        /// <param name="message">BitString representation of message</param>
        /// <param name="cSHAKE">A cSHAKE module</param>
        /// <param name="capacity">Capacity</param>
        /// <param name="blockSize">The desired block size in bytes</param>
        /// <param name="xof">Is it xof mode?</param>
        /// <returns>Formatted message before calling Keccak</returns>
        public static BitString FormatMessage(BitString message, CSHAKE.CSHAKE cSHAKE, int digestLength, int capacity, int blockSize, bool xof)
        {
            // 1. n = ⌈ (len(X)/8) / B ⌉.
            var numberOfBlocks = ((message.BitLength / 8) + blockSize - 1) / blockSize;

            // 2. z = left_encode(B).
            var newMessage = Sha3DerivedHelpers.LeftEncode(Sha3DerivedHelpers.IntToBitString(blockSize));

            // 3. for i = 0 to n−1:
            //    z = z || cSHAKE128(substring(X, i*B*8, (i+1)*B*8), 256, "", "").
            var strings      = new List <BitString>();
            var hashFunction = new HashFunction {
                DigestLength = capacity, Capacity = capacity
            };

            for (var i = 0; i < numberOfBlocks; i++)
            {
                var substring = Sha3DerivedHelpers.SubString(message, i * blockSize * 8, (i + 1) * blockSize * 8);
                strings.Add(cSHAKE.HashMessage(hashFunction, substring, "").Digest);
            }

            for (int i = 0; i < numberOfBlocks; i++)
            {
                newMessage = BitString.ConcatenateBits(newMessage, strings[i]);
            }

            // 4. z = z || right_encode(n) || right_encode(L).
            newMessage = BitString.ConcatenateBits(newMessage, Sha3DerivedHelpers.RightEncode(Sha3DerivedHelpers.IntToBitString(numberOfBlocks)));

            if (xof)
            {
                newMessage = BitString.ConcatenateBits(newMessage, Sha3DerivedHelpers.RightEncode(BitString.Zeroes(8)));
            }
            else
            {
                newMessage = BitString.ConcatenateBits(newMessage, Sha3DerivedHelpers.RightEncode(Sha3DerivedHelpers.IntToBitString(digestLength)));
            }

            return(newMessage);
        }
예제 #4
0
        /// <summary>
        /// Call this method to format correctly for TupleHash
        /// </summary>
        /// <param name="tuple">List of BitString representation of message</param>
        /// <param name="digestLength">Desired output size</param>
        /// <param name="xof">Is it xof mode?</param>
        /// <returns>Formatted message before calling Keccak</returns>
        public static BitString FormatMessage(IEnumerable <BitString> tuple, int digestLength, bool xof)
        {
            BitString message = new BitString(0);

            foreach (BitString element in tuple)
            {
                var encodedPiece = Sha3DerivedHelpers.EncodeString(element);
                message = Sha3DerivedHelpers.SafeConcatenation(message, encodedPiece);
            }

            if (xof)
            {
                var rightEncode = Sha3DerivedHelpers.RightEncode(BitString.Zeroes(8));
                message = Sha3DerivedHelpers.SafeConcatenation(message, rightEncode);
            }
            else
            {
                var rightEncode = Sha3DerivedHelpers.RightEncode(Sha3DerivedHelpers.IntToBitString(digestLength));
                message = Sha3DerivedHelpers.SafeConcatenation(message, rightEncode);
            }

            return(message);
        }
예제 #5
0
        /// <summary>
        /// Call this method to format correctly for cSHAKE
        /// </summary>
        /// <param name="message">BitString representation of message</param>
        /// <param name="capacity">Capacity</param>
        /// <param name="functionNameString">Character string representation of functionName</param>
        /// <param name="customizationString">Character string for customization</param>
        /// <returns>Formatted message before calling Keccak</returns>
        public static BitString FormatMessage(BitString message, int capacity, string functionNameString, string customizationString)
        {
            var customization = Sha3DerivedHelpers.StringToHex(customizationString);

            return(FormatMessage(message, capacity, functionNameString, customization));
        }