Пример #1
0
        public KeyStore <T> EncryptAndGenerateKeyStore(string password, byte[] privateKey, string address, T kdfParams)
        {
            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }
            if (privateKey == null)
            {
                throw new ArgumentNullException(nameof(privateKey));
            }
            if (address == null)
            {
                throw new ArgumentNullException(nameof(address));
            }
            if (kdfParams == null)
            {
                throw new ArgumentNullException(nameof(kdfParams));
            }

            if (privateKey.Length != 32)
            {
                //Validate length unsigned but store the parameter
                //if is less than 32 already will fail
                var keyValidation = BigIntegers.AsUnsignedByteArray(new BigInteger(privateKey));

                if (keyValidation.Length != 32)
                {
                    throw new ArgumentException("Private key should be 32 bytes", nameof(privateKey));
                }
            }

            var salt = RandomBytesGenerator.GenerateRandomSalt();

            var derivedKey = GenerateDerivedKey(password, salt, kdfParams);

            var cipherKey = KeyStoreCrypto.GenerateCipherKey(derivedKey);

            var iv = RandomBytesGenerator.GenerateRandomInitialisationVector();

            var cipherText = GenerateCipher(privateKey, iv, cipherKey);

            var mac = KeyStoreCrypto.GenerateMac(derivedKey, cipherText);

            var cryptoInfo = new CryptoInfo <T>(GetCipherType(), cipherText, iv, mac, salt, kdfParams, GetKdfType());

            var keyStore = new KeyStore <T>
            {
                Version = CurrentVersion,
                Address = address,
                Id      = Guid.NewGuid().ToString(),
                Crypto  = cryptoInfo
            };

            return(keyStore);
        }
Пример #2
0
        public void ShouldGenerateCipherText()
        {
            var derivedKey = "f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551".HexToByteArray();
            var privateKey = "7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d".HexToByteArray();

            byte[] cypherKey = keyStoreCrypto.GenerateCipherKey(derivedKey);
            Assert.Equal("f06d69cdc7da0faffb1008270bca38f5", cypherKey.ToHex());


            byte[] iv     = "6087dab2f9fdbbfaddc31a909735c1e6".HexToByteArray();
            var    result = keyStoreCrypto.GenerateAesCtrCipher(iv, cypherKey, privateKey);

            Assert.Equal("5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", result.ToHex());
        }
Пример #3
0
        public KeyStore <T> EncryptAndGenerateKeyStore(string password, byte[] privateKey, string address, T kdfParams)
        {
            if (password == null)
            {
                throw new ArgumentNullException(nameof(password));
            }
            if (privateKey == null)
            {
                throw new ArgumentNullException(nameof(privateKey));
            }
            if (address == null)
            {
                throw new ArgumentNullException(nameof(address));
            }
            if (kdfParams == null)
            {
                throw new ArgumentNullException(nameof(kdfParams));
            }

            if (privateKey.Length != 32)
            {
                throw new ArgumentException("Private key should be 32 bytes", nameof(privateKey));
            }

            var salt = RandomBytesGenerator.GenerateRandomSalt();

            var derivedKey = GenerateDerivedKey(KeyStoreCrypto.GetPasswordAsBytes(password), salt, kdfParams);

            var cipherKey = KeyStoreCrypto.GenerateCipherKey(derivedKey);

            var iv = RandomBytesGenerator.GenerateRandomInitialisationVector();

            var cipherText = GenerateCipher(privateKey, iv, cipherKey);

            var mac = KeyStoreCrypto.GenerateMac(derivedKey, cipherText);

            var cryptoInfo = new CryptoInfo <T>(GetCipherType(), cipherText, iv, mac, salt, kdfParams, GetKdfType());

            var keyStore = new KeyStore <T>
            {
                Version = CurrentVersion,
                Address = address,
                Id      = Guid.NewGuid().ToString(),
                Crypto  = cryptoInfo
            };

            return(keyStore);
        }