示例#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)
            {
                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);
        }
 protected override byte[] GenerateDerivedKey(string password, byte[] salt, ScryptParams kdfParams)
 {
     return(KeyStoreCrypto.GenerateDerivedScryptKey(KeyStoreCrypto.GetPasswordAsBytes(password), salt,
                                                    kdfParams.N, kdfParams.R,
                                                    kdfParams.P, kdfParams.Dklen));
 }