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); }
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()); }
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); }