public FrameMacProcessor(PublicKey remoteNodeId, EncryptionSecrets secrets)
 {
     _remoteNodeId          = remoteNodeId;
     _macSecret             = secrets.MacSecret;
     _egressMac             = secrets.EgressMac;
     _egressMacCopy         = (KeccakDigest)_egressMac.Copy();
     _ingressMac            = secrets.IngressMac;
     _ingressMacCopy        = (KeccakDigest)_ingressMac.Copy();
     _aesEngine             = MakeMacCipher();
     _checkMacBuffer        = new byte[_ingressMac.GetDigestSize()];
     _addMacBuffer          = new byte[_ingressMac.GetDigestSize()];
     _ingressAesBlockBuffer = new byte[_ingressMac.GetDigestSize()];
     _egressAesBlockBuffer  = new byte[_ingressMac.GetDigestSize()];
 }
Exemple #2
0
        static public BigInteger Mine(string challenge, BigInteger difficulty)
        {
            Byte[] b = new Byte[8];

            var sha3 = new KeccakDigest(512);

            var rnd = new Random(0);

            rnd.NextBytes(b);
            b = b.Reverse().Concat(new byte[] { 0x0 }).ToArray();

            var nonce = new BigInteger(b);

            var challengeBI = BigInteger.Parse(challenge, NumberStyles.AllowHexSpecifier);

            while (true)
            {
                byte[] hashb = new byte[sha3.GetDigestSize()];
                byte[] value = challengeBI.ToByteArray().Reverse().Concat(nonce.ToByteArray().Reverse()).ToArray();
                sha3.BlockUpdate(value, 0, value.Length);
                sha3.DoFinal(hashb, 0);

                hashb = hashb.Reverse().Concat(new byte[] { 0x0 }).ToArray();
                var v = new BigInteger(hashb);
                if (v.CompareTo(difficulty) < 0)
                {
                    break;
                }

                nonce = (BigInteger.Add(nonce, BigInteger.One)) % ((new BigInteger(2)) << 64);
            }

            return(nonce);
        }
Exemple #3
0
 public byte[] CalculateKeccakHash(byte[] value)
 {
     var digest = new KeccakDigest(256);
     var output = new byte[digest.GetDigestSize()];
     digest.BlockUpdate(value, 0, value.Length);
     digest.DoFinal(output, 0);
     return output;
 }
        /// <summary>
        /// adapted from ethereumJ
        /// </summary>
        private byte[] UpdateMac(KeccakDigest mac, byte[] seed, int offset, byte[] output, int outOffset, bool egress)
        {
            byte[] aesBlock = new byte[mac.GetDigestSize()];
            DoFinalNoReset(mac, aesBlock, 0);

            // TODO: check if need to make a new one each time
            MakeMacCipher().ProcessBlock(aesBlock, 0, aesBlock, 0);

            // Note that although the mac digest size is 32 bytes, we only use 16 bytes in the computation
            int length = 16;

            for (int i = 0; i < length; i++)
            {
                aesBlock[i] ^= seed[i + offset];
            }

            mac.BlockUpdate(aesBlock, 0, length);

            byte[] result = new byte[mac.GetDigestSize()];
            DoFinalNoReset(mac, result, 0);

            if (egress)
            {
                Array.Copy(result, 0, output, outOffset, length);
            }
            else
            {
                bool isMacSame = true;
                for (int i = 0; i < length; i++)
                {
                    if (output[i + outOffset] != result[i])
                    {
                        isMacSame = false;
                        break;
                    }
                }

                if (!isMacSame)
                {
                    throw new IOException($"MAC mismatch from {_remoteNodeId}");
                }
            }

            return(result);
        }
Exemple #5
0
    public static byte[] HashKeccak256(byte[] src)
    {
        KeccakDigest sha = new KeccakDigest(256);

        sha.BlockUpdate(src, 0, src.Length);
        byte[] output = new byte[sha.GetDigestSize()];
        sha.DoFinal(output, 0);
        return(output);
    }
        /// <summary>
        /// Do hash
        /// </summary>
        /// <param name="data">Data</param>
        byte[] CalculateHash(byte[] data)
        {
            KeccakDigest digest = new KeccakDigest(256);

            byte[] raw = new byte[digest.GetDigestSize()];
            digest.BlockUpdate(data, 0, data.Length);
            digest.DoFinal(raw, 0);
            return(raw);
        }
        public void TestKeccak()
        {
            byte[] source = Encoding.ASCII.GetBytes(
                "asdçflkjasçfjaçrlgjaçorigjkljbçladkfjgsaºperouiwa89tuhyjkvsldkfjçaoigfjsadfjkhsdkgjhdlkgjhdkfjbnsdflçkgsriaugfukasyfgskaruyfgsaekufygvsanfbvsdj,fhgwukaygsja,fvkusayfguwayfgsnvfuksaygfkuybhsngfukayeghsmafbsjkfgwlauifgjkshfbilçehrkluayh");

            var keccak128Test = new KeccakDigest(128);
            var keccak224Test = new KeccakDigest(224);
            var keccak256Test = new KeccakDigest(256);
            var keccak288Test = new KeccakDigest(288);
            var keccak384Test = new KeccakDigest(384);
            var keccak512Test = new KeccakDigest(512);

            for (int i = 0; i < 10000; i++)
            {
                //can't find any ground truth for this one, https://8gwifi.org/MessageDigest.jsp is the only one but when comparing to other site's results for other keccaks it doesnt match up with them

                /*var output1 = new byte[keccak128Test.GetDigestSize()];
                 * keccak128Test.BlockUpdate(source, 0, source.Length);
                 * keccak128Test.DoFinal(output1, 0);
                 * var target1 = Base16.Decode("a896124a35603f3766d9d41dade89f9b");*/


                var output2 = new byte[keccak224Test.GetDigestSize()];
                keccak224Test.BlockUpdate(source, 0, source.Length);
                keccak224Test.DoFinal(output2, 0);
                var target2 = Base16.Decode("3c8aa5706aabc26dee19b466e77f8947f801762ca64316fdf3a2434a"); //https://emn178.github.io/online-tools/keccak_224.html

                var output3 = new byte[keccak256Test.GetDigestSize()];
                keccak256Test.BlockUpdate(source, 0, source.Length);
                keccak256Test.DoFinal(output3, 0);
                var target3 = Base16.Decode("09D3FA337D33E1BEB3C3D560D93F5FB57C66BC3E044127816F42494FA4947A92"); //https://asecuritysite.com/encryption/sha3

                //can't find any ground truth for this one, https://8gwifi.org/MessageDigest.jsp is the only one but when comparing to other site's results for other keccaks it doesnt match up with them

                /*var output4 = new byte[keccak288Test.GetDigestSize()];
                 * keccak288Test.BlockUpdate(source, 0, source.Length);
                 * keccak288Test.DoFinal(output4, 0);
                 * var target4 = System.Convert.FromBase64String("");*/

                var output5 = new byte[keccak384Test.GetDigestSize()];
                keccak384Test.BlockUpdate(source, 0, source.Length);
                keccak384Test.DoFinal(output5, 0);
                var target5 = Base16.Decode("B1EA01288A8ECA553687E92943FC8E8D22B3B918462B7708FCB011B8EF28F60E7072FE2623E624DEBD00F8CF46B1F967"); //https://asecuritysite.com/encryption/sha3

                var output6 = new byte[keccak512Test.GetDigestSize()];
                keccak512Test.BlockUpdate(source, 0, source.Length);
                keccak512Test.DoFinal(output6, 0);
                var target6 = Base16.Decode("1057C35F3364A9C7D7EFB5B2AB48D9A71373DCA1E3680CBF6734DA5E896DD7DE2901A678240A1C936598A6C58E6253A9747E2715BBD559AA9A5DA9302B815BAC"); //https://asecuritysite.com/encryption/sha3

                //Assert.IsTrue(output1.SequenceEqual(target1));
                //Assert.IsTrue(output2.SequenceEqual(target2));
                Assert.IsTrue(output3.SequenceEqual(target3));
                //Assert.IsTrue(output4.SequenceEqual(target4));
                Assert.IsTrue(output5.SequenceEqual(target5));
                Assert.IsTrue(output6.SequenceEqual(target6));
            }
        }
Exemple #8
0
        public static byte[] ToKeccakHash(this byte[] value)
        {
            var digest = new KeccakDigest(256);
            var output = new byte[digest.GetDigestSize()];

            digest.BlockUpdate(value, 0, value.Length);
            digest.DoFinal(output, 0);
            return(output);
        }
Exemple #9
0
        public static byte[] ComputeSha3KeccakDigest(byte[] data, int bitLength)
        {
            var digest = new KeccakDigest(bitLength);

            byte[] buffer = new byte[digest.GetDigestSize()];
            digest.BlockUpdate(data, 0, data.Length);
            digest.DoFinal(buffer, 0);
            return(buffer);
        }
Exemple #10
0
        public static byte[] Hash(byte[] bytes, int bitLength)
        {
            var digest = new KeccakDigest(bitLength);
            var output = new byte[digest.GetDigestSize()];

            digest.BlockUpdate(bytes, 0, bytes.Length);
            digest.DoFinal(output, 0);

            return(output);
        }
Exemple #11
0
        /// <summary>
        /// Keccak256 hashing algorithm
        /// </summary>
        /// <param name="StringIn"></param>
        /// <returns></returns>
        public static string Keccak256HexHashString(string StringIn)
        {
            var sha3 = new KeccakDigest(256);

            byte[] hash  = new byte[sha3.GetDigestSize()];
            byte[] value = Encoding.Default.GetBytes(StringIn);
            sha3.BlockUpdate(value, 0, value.Length);
            sha3.DoFinal(hash, 0);
            return(ToHex(hash, false));
        }
Exemple #12
0
        public string CalculateHash(string value)
        {
            var digest = new KeccakDigest(256);
            var output = new byte[digest.GetDigestSize()];
            var input  = Encoding.UTF8.GetBytes(value);

            digest.BlockUpdate(input, 0, input.Length);
            digest.DoFinal(output, 0);
            return(output.ToHex());
        }
Exemple #13
0
        public static byte[] SHA3(this byte[] data)
        {
            KeccakDigest digest = new KeccakDigest(256);

            byte[] output = new byte[digest.GetDigestSize()];
            digest.BlockUpdate(data, 0, data.Length);
            digest.DoFinal(output, 0);

            return(output);
        }
Exemple #14
0
        protected static byte[] ComputeHash(byte[] bytes, int bits)
        {
            var digest = new KeccakDigest(bits);
            var output = new byte[digest.GetDigestSize()];

            byte[] message = bytes ?? new byte[0];
            digest.BlockUpdate(message, 0, message.Length);
            digest.DoFinal(output, 0);

            return(output);
        }
Exemple #15
0
        private static byte[] DeriveAddress(PublicKey key)
        {
            byte[] hashPayload = key.Format(false).Skip(1).ToArray();
            var    digest      = new KeccakDigest(256);
            var    output      = new byte[digest.GetDigestSize()];

            digest.BlockUpdate(hashPayload, 0, hashPayload.Length);
            digest.DoFinal(output, 0);

            return(output.Skip(output.Length - 20).ToArray());
        }
Exemple #16
0
        /// <summary>
        /// Gets the SHA3 digest from the specified data.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns>The digest string.</returns>
        public static string GetSha3(MemoryStream data)
        {
            var digest = new KeccakDigest();

            digest.BlockUpdate(data.ToArray(), 0, (int)data.Length);

            var result = new byte[digest.GetDigestSize()];

            digest.DoFinal(result, 0);

            return(BitConverter.ToString(result).Replace("-", ""));
        }
Exemple #17
0
        private byte[] CalculateHash(byte[] data)
        {
            var cloner = new byte[data.Length];

            Array.Copy(data, cloner, data.Length);
            var hasher = new KeccakDigest(256);

            hasher.BlockUpdate(cloner, 0, cloner.Length);
            var output = new byte[hasher.GetDigestSize()];

            hasher.DoFinal(output, 0);
            return(output);
        }
Exemple #18
0
        public static byte[] Sha3(this byte[] value)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            var digest = new KeccakDigest(256);
            var output = new byte[digest.GetDigestSize()];

            digest.BlockUpdate(value, 0, value.Length);
            digest.DoFinal(output, 0);
            return(output);
        }
        public void CheckMac(byte[] input, int offset, int length, bool isHeader)
        {
            if (isHeader)
            {
                UpdateMac(_ingressMac, input, offset, input, offset + length, false); // TODO: confirm header is seed
            }
            else
            {
                _ingressMac.BlockUpdate(input, offset, length);

                // frame-mac: right128 of egress-mac.update(aes(mac-secret,egress-mac) ^ right128(egress-mac.update(frame-ciphertext).digest))
                byte[] buffer = new byte[_ingressMac.GetDigestSize()];
                DoFinalNoReset(_ingressMac, buffer, 0); // frame MAC seed
                UpdateMac(_ingressMac, buffer, 0, input, offset + length, false);
            }
        }
Exemple #20
0
        public static byte[] GenerateMac(byte[] derivekey, byte[] ciphertext)
        {
            int size = (int)(derivekey.Length * 0.5) + ciphertext.Length;

            byte[] input = new byte[size];
            Array.Copy(derivekey, 16, input, 0, 16);
            Array.Copy(ciphertext, 0, input, 16, ciphertext.Length);

            var digest = new KeccakDigest(256);
            var mac    = new byte[digest.GetDigestSize()];

            digest.BlockUpdate(input, 0, input.Length);
            digest.DoFinal(mac, 0);

            return(mac);
        }