Exemplo n.º 1
0
        public byte[] GetAddress()
        {
            if (m_address != null)
            {
                return(m_address);
            }

            var pubKey = GetPublicKey();

            if (pubKey.Length != 64)
            {
                pubKey = CryptoUtil.GetPublicKey(pubKey, false);
            }

            pubKey = ByteUtil.Contact(new byte[] { 0x04 }, pubKey);

            var content = Sha3Util.Get256Hash(pubKey);

            content = Ripemd160Manager.GetHash(content);

            content = ByteUtil.Contact(new[] { ADDRESS_PREFIX, (byte)AddressType.Normal }, content);

            var checksum = new byte[4];

            Buffer.BlockCopy(Sha3Util.Get256Hash(content), 0, checksum, 0, 4);

            m_address = ByteUtil.Contact(content, checksum.ToArray());

            return(m_address);
        }
Exemplo n.º 2
0
        public void Verify()
        {
            string publicKey = "N1X+Fv7soLknpZNtkdW5cRphgzFjqHmOJl9GvVahWxk=";
            string message   = Sha3Util.Sha3_256("test");
            string signature = "bl7EyGwrdDIcHpizHUcDd4Ui34pQRv5VoM69WEPGNveZVOIXJbX3nWhvBvyGXaCxZIuu0THCo5g8PSr2NZJKBg==";

            bool result = Iroha.Verify(publicKey, signature, message);

            Assert.AreEqual(true, result);
        }
Exemplo n.º 3
0
        public void Sha3_512()
        {
            string hash1 = "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26";
            string hash2 = Sha3Util.Sha3_512("");

            Assert.AreEqual(hash1, hash2);

            string hash3 = "9ece086e9bac491fac5c1d1046ca11d737b92a2b2ebd93f005d7b710110c0a678288166e7fbe796883a4f2e9b3ca9f484f521d0ce464345cc1aec96779149c14";
            string hash4 = Sha3Util.Sha3_512("test");

            Assert.AreEqual(hash3, hash4);
        }
Exemplo n.º 4
0
        public void Sha3_384()
        {
            string hash1 = "0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004";
            string hash2 = Sha3Util.Sha3_384("");

            Assert.AreEqual(hash1, hash2);

            string hash3 = "e516dabb23b6e30026863543282780a3ae0dccf05551cf0295178d7ff0f1b41eecb9db3ff219007c4e097260d58621bd";
            string hash4 = Sha3Util.Sha3_384("test");

            Assert.AreEqual(hash3, hash4);
        }
Exemplo n.º 5
0
        public void Sha3_256()
        {
            string hash1 = "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a";
            string hash2 = Sha3Util.Sha3_256("");

            Assert.AreEqual(hash1, hash2);

            string hash3 = "36f028580bb02cc8272a9a020f4200e346e276ae664e45ee80745574e2f5ab80";
            string hash4 = Sha3Util.Sha3_256("test");

            Assert.AreEqual(hash3, hash4);
        }
Exemplo n.º 6
0
        public void Sign()
        {
            string  publicKey  = "N1X+Fv7soLknpZNtkdW5cRphgzFjqHmOJl9GvVahWxk=";
            string  privateKey = "aFJfbcedA7p6X0b6EdQNovfFtmq4YSGK/+Bw+XBrsnAEBpXRu+Qfw0559lgLwF2QusChGiDEkLAxPqodQH1kbA==";
            KeyPair keyPair    = new KeyPair(privateKey, publicKey);
            string  message    = Sha3Util.Sha3_256("test");
            string  signature  = "bl7EyGwrdDIcHpizHUcDd4Ui34pQRv5VoM69WEPGNveZVOIXJbX3nWhvBvyGXaCxZIuu0THCo5g8PSr2NZJKBg==";

            string result = Iroha.Sign(keyPair, message);

            Assert.AreEqual(signature, result);
        }
Exemplo n.º 7
0
 public byte[] GetTransactionHash()
 {
     return(Sha3Util.Get256Hash(ByteUtil.Contact(
                                    m_fromAccount.GetAddress(),
                                    m_toAccount.GetAddress(),
                                    CryptoUtil.PadToBigEndian(m_value, 128),
                                    CryptoUtil.PadToBigEndian(m_nonce, 64),
                                    CryptoUtil.PadToBigEndian(m_timestamp, 64),
                                    m_data.ToByteArray(),
                                    CryptoUtil.PadToBigEndian(m_chainId, 32),
                                    CryptoUtil.PadToBigEndian(m_gasPrice, 128),
                                    CryptoUtil.PadToBigEndian(m_gasLimit, 128)
                                    )));
 }
Exemplo n.º 8
0
        public static bool IsValidAddress(string address, AddressType type)
        {
            byte[] addressBytes;

            try
            {
                addressBytes = Base58.Decode(address);
            }
            catch
            {
                return(false);
            }

            if (addressBytes.Length != ADDRESS_LENGTH)
            {
                return(false);
            }

            if (addressBytes[0] != ADDRESS_PREFIX)
            {
                return(false);
            }

            if (addressBytes[1] != (byte)type)
            {
                return(false);
            }

            var content = new byte[22];

            Buffer.BlockCopy(addressBytes, 0, content, 0, 22);

            var expectChecksum = new byte[4];

            Buffer.BlockCopy(addressBytes, 22, expectChecksum, 0, 4);

            var actualChecksum = new byte[4];

            Buffer.BlockCopy(Sha3Util.Get256Hash(content), 0, actualChecksum, 0, 4);

            return(expectChecksum.SequenceEqual(actualChecksum));
        }
Exemplo n.º 9
0
        /**
         * Address validation method.
         *
         * @static
         * @param {String/Hash} addr - Account address.
         * @param {Number} type - NormalType / ContractType
         *
         * @return {Boolean} Is address has correct format.
         *
         * @example
         * if ( Account.isValidAddress("n1QZMXSZtW7BUerroSms4axNfyBGyFGkrh5") ) {
         *     // some code
         * };
         */
        public static bool IsValidAddress(string address, AddressType?type = null)
        {
            byte[] addBytes;
            try {
                addBytes = Base58.Decode(address);

                if (addBytes.Length != ADDRESS_LENGTH)
                {
                    return(false);
                }
                if (Convert.ToUInt32(addBytes[0]) != ADDRESS_PREFIX)
                {
                    return(false);
                }
                uint typeUint;
                if (type.HasValue)
                {
                    typeUint = Convert.ToUInt32(type.Value);
                    if (typeUint != Convert.ToUInt32(addBytes[1]))
                    {
                        return(false);
                    }
                }
                else
                {
                    typeUint = Convert.ToUInt32(addBytes[1]);
                }

                if (typeUint != (uint)AddressType.ContractType && typeUint != (uint)AddressType.NormalType)
                {
                    return(false);
                }
                var content  = addBytes.Slice(0, 22);
                var checksum = addBytes.Slice(addBytes.Length - 4);
                return(ByteUtil.Compare(Sha3Util.Get256Hash(content).Slice(0, 4), checksum));
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
Exemplo n.º 10
0
        /**
         * Convert transaction to hash by SHA3-256 algorithm.
         *
         * @return {Hash} hash of Transaction.
         *
         * @example
         * var acc = Account.NewAccount();
         *
         * var tx = new Transaction({
         *    chainID: 1,
         *    from: acc,
         *    to: "n1SAeQRVn33bamxN4ehWUT7JGdxipwn8b17",
         *    value: 10,
         *    nonce: 12,
         *    gasPrice: 1000000,
         *    gasLimit: 2000000
         * });
         * var txHash = tx.hashTransaction();
         * //Uint8Array(32) [211, 213, 102, 103, 23, 231, 246, 141, 20, 202, 210, 25, 92, 142, 162, 242, 232, 95, 44, 239, 45, 57, 241, 61, 34, 2, 213, 160, 17, 207, 75, 40]
         */
        public byte[] HashTransaction()
        {
            var data = new Corepb.Data
            {
                Payload = ByteString.CopyFrom(_payLoadData),
                Type    = Enum.GetName(typeof(TxPayload), _payLoadType).ToLower()
            };

            var dataBuffer = data.ToByteArray();

            var hash = Sha3Util.Get256Hash(ByteUtil.Merge(
                                               _fromAccount.GetAddress(),
                                               _toAccount.GetAddress(),
                                               CryptoUtils.PadToBigEndian(_value.ToString("x"), 128),
                                               CryptoUtils.PadToBigEndian(_nonce.ToString("x"), 64),
                                               CryptoUtils.PadToBigEndian(_timestamp.ToString("x"), 64),
                                               dataBuffer,
                                               CryptoUtils.PadToBigEndian(_chainId.ToString("x"), 32),
                                               CryptoUtils.PadToBigEndian(_gasPrice.ToString("x"), 128),
                                               CryptoUtils.PadToBigEndian(_gasLimit.ToString("x"), 128))
                                           );

            return(hash);
        }
Exemplo n.º 11
0
        /**
         * Restore account from key and passphrase.
         *
         * @param {Key} input - Key Object.
         * @param {Password} password - Provided password.
         * @param {Boolean} nonStrict - Strict сase sensitivity flag.
         *
         * @return {@link Account} - Instance of Account restored from key and passphrase.
         */
        public Account FromKey(Key input, string password)
        {
            var json = input;

            if (json.version != KEYVERSION3 && json.version != KEYCURRENTVERSION)
            {
                throw new Exception("Not supported wallet version");
            }
            byte[]    derivedKey = null;
            KDFParams kdfparams  = new KDFParams();

            if (json.crypto.kdf == "scrypt")
            {
                kdfparams = json.crypto.kdfparams;

                //derivedKey = Replicon.Cryptography.SCrypt.SCrypt.DeriveKey(Encoding.UTF8.GetBytes(password), kdfparams.salt.HexToByteArray(), (ulong)kdfparams.n, (uint)kdfparams.r, (uint)kdfparams.p, (uint)kdfparams.dklen);
                derivedKey = ScryptUtil.Scrypt(Encoding.UTF8.GetBytes(password), kdfparams.salt.HexToByteArray(), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen);
            }
            else if (json.crypto.kdf == "pbkdf2")
            {
                kdfparams = json.crypto.kdfparams;
                if (kdfparams.prf != "hmac-sha256")
                {
                    throw new Exception("Unsupported parameters to PBKDF2");
                }

                RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
                crypto.GetBytes(kdfparams.salt.HexToByteArray());
                Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(Encoding.UTF8.GetBytes(password), kdfparams.salt.HexToByteArray(), kdfparams.c);
                derivedKey = pbkdf2.GetBytes(kdfparams.dklen);
            }
            else
            {
                throw new Exception("Unsupported key derivation scheme");
            }
            var ciphertext = json.crypto.ciphertext.HexToByteArray();

            byte[] mac;

            if (json.version == KEYCURRENTVERSION)
            {
                var _derviedKey = new byte[32];
                Array.Copy(derivedKey, 16, _derviedKey, 0, 32);
                var iv     = json.crypto.cipherparams.iv.HexToByteArray();
                var cipher = json.crypto.cipher.HexToByteArray();
                var _mac   = new byte[_derviedKey.Length + ciphertext.Length + iv.Length + cipher.Length];
                Array.Copy(_derviedKey, 0, _mac, 0, _derviedKey.Length);
                Array.Copy(ciphertext, 0, _mac, _derviedKey.Length, ciphertext.Length);
                Array.Copy(iv, 0, _mac, _derviedKey.Length + ciphertext.Length, iv.Length);
                Array.Copy(cipher, 0, _mac, _derviedKey.Length + ciphertext.Length + iv.Length, cipher.Length);
                mac = Sha3Util.Get256Hash(_mac);
            }
            else
            {
                // KeyVersion3
                var _mac = new byte[derivedKey.Slice(16, 32).Length + ciphertext.Length];
                mac = Sha3Util.Get256Hash(_mac);
            }

            if (mac.ToHex() != json.crypto.mac)
            {
                throw new Exception("Key derivation failed - possibly wrong passphrase");
            }

            Aes128CTR aes = new Aes128CTR(json.crypto.cipherparams.iv.HexToByteArray());

            byte[] src  = ciphertext;
            byte[] dest = new byte[0];

            using (ICryptoTransform decrypt = aes.CreateDecryptor(derivedKey.Slice(0, 16), null))
            {
                dest = decrypt.TransformFinalBlock(src, 0, src.Length);
            }

            var _seed = new byte[src.Length + dest.Length];
            var seed  = new byte[32];

            CryptoUtils.Zeros(seed);
            Array.Copy(_seed, 0, seed, 32 - _seed.Length, _seed.Length);
            SetPrivateKey(seed);
            return(this);
        }
Exemplo n.º 12
0
        /**
         * Generate key by passphrase and options.
         *
         * @param {Password} password - Provided password.
         * @param {KeyOptions} opts - Key options.
         *
         * @return {Key} Key Object.
         *
         * @example var key = account.toKey("passphrase");
         */
        public Key ToKey(string password, KeyOptions opts = null)
        {
            byte[] derivedKey;
            if (opts.kdf == KDFEnum.Pbkdf2)
            {
                RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
                crypto.GetBytes(opts.salt);
                Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, opts.salt, opts.c);
                derivedKey = pbkdf2.GetBytes(opts.dklen);
            }
            else if (opts.kdf == KDFEnum.Scrypt)
            {
                //derivedKey = Replicon.Cryptography.SCrypt.SCrypt.DeriveKey(Encoding.UTF8.GetBytes(password), opts.salt, (ulong)opts.n, (uint)opts.r, (uint)opts.p, (uint)opts.dklen);

                derivedKey = ScryptUtil.Scrypt(Encoding.UTF8.GetBytes(password), opts.salt, opts.n, opts.r, opts.p, opts.dklen);
            }
            else
            {
                throw new Exception("Unsupported kdf");
            }


            var       iv  = opts.iv.Slice(0, opts.iv.Length);
            Aes128CTR aes = new Aes128CTR(iv);

            byte[] key = derivedKey.Slice(0, 16);
            byte[] src = GetPrivateKey();
            byte[] dest;

            using (ICryptoTransform encrypt = aes.CreateEncryptor(key, null))
            {
                dest = encrypt.TransformFinalBlock(src, 0, src.Length);
                //encrypt.TransformBlock(src, 0, src.Length, dest, 0);
            }


            byte[] ciphertext = ByteUtil.Merge(dest, new byte[] { });


            var algoStr = opts.cipher;
            var algoBuf = Encoding.UTF8.GetBytes(algoStr);

            var data = ByteUtil.Merge(derivedKey.Slice(16, 32), ciphertext, opts.iv, algoBuf);

            bool bl = data.Compare(new byte[] { 29, 52, 224, 140, 175, 174, 254, 246, 150, 111, 54, 131, 20, 66, 32, 30, 74, 150, 12, 191, 5, 61, 192, 196, 41, 236, 65, 21, 61, 184, 251, 34, 181, 156, 116, 62, 192, 63, 123, 193, 144, 210, 110, 229, 144, 235, 148, 57, 174, 176, 29, 188, 185, 223, 149, 83, 130, 30, 94, 120, 100, 252, 2, 217, 97, 101, 115, 45, 49, 50, 56, 45, 99, 116, 114 });

            byte[] mac = Sha3Util.Get256Hash(data);

            return(new Key
            {
                version = KEYCURRENTVERSION,
                id = Guid.NewGuid().ToString(),
                address = GetAddressString(),
                crypto = new KeyCrypto
                {
                    ciphertext = ciphertext.ToHex(),
                    cipherparams = new CipherParams()
                    {
                        iv = opts.iv.ToHex()
                    },
                    cipher = opts.cipher,
                    kdf = Enum.GetName(typeof(KDFEnum), opts.kdf).ToLower(),
                    kdfparams = new KDFParams {
                        c = opts.c,
                        salt = opts.salt.ToHex(),
                        dklen = opts.dklen,
                        n = opts.n,
                        p = opts.p,
                        prf = (opts.kdf == KDFEnum.Pbkdf2) ? "hmac-sha256" : "",
                        r = opts.r
                    },
                    mac = mac.ToHex(),
                    machash = "sha3256"
                }
            });
        }