using System; using Nethereum.Hex.HexConvertors.Extensions; using Nethereum.KeyStore.Crypto; using Nethereum.KeyStore.JsonDeserialisation; using Nethereum.KeyStore.Model; namespace Nethereum.KeyStore { public class KeyStoreScryptService : KeyStoreServiceBase { public const string KdfType = "scrypt"; public KeyStoreScryptService() { } public KeyStoreScryptService(IRandomBytesGenerator randomBytesGenerator, KeyStoreCrypto keyStoreCrypto) : base( randomBytesGenerator, keyStoreCrypto) { } public KeyStoreScryptService(IRandomBytesGenerator randomBytesGenerator) : base(randomBytesGenerator) { } 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); } protected override ScryptParams GetDefaultParams() { return new ScryptParams {Dklen = 32, N = 262144, R = 1, P = 8}; } public override KeyStore DeserializeKeyStoreFromJson(string json) { return JsonKeyStoreScryptSerialiser.DeserialiseScrypt(json); } public override string SerializeKeyStoreToJson(KeyStore keyStore) { return JsonKeyStoreScryptSerialiser.SerialiseScrypt(keyStore); } public override byte[] DecryptKeyStore(string password, KeyStore keyStore) { if (password == null) throw new ArgumentNullException(nameof(password)); if (keyStore == null) throw new ArgumentNullException(nameof(keyStore)); return KeyStoreCrypto.DecryptScrypt(password, keyStore.Crypto.Mac.HexToByteArray(), keyStore.Crypto.CipherParams.Iv.HexToByteArray(), keyStore.Crypto.CipherText.HexToByteArray(), keyStore.Crypto.Kdfparams.N, keyStore.Crypto.Kdfparams.P, keyStore.Crypto.Kdfparams.R, keyStore.Crypto.Kdfparams.Salt.HexToByteArray(), keyStore.Crypto.Kdfparams.Dklen); } public override string GetKdfType() { return KdfType; } } }