private bool RestoreWallet(string path, string password, out EcdsaKeyPair keyPair, out byte[] hubKey) { var encryptedContent = File.ReadAllBytes(path); var key = Encoding.UTF8.GetBytes(password).KeccakBytes(); var decryptedContent = Encoding.UTF8.GetString(Crypto.AesGcmDecrypt(key, encryptedContent)); var wallet = JsonConvert.DeserializeObject <JsonWallet>(decryptedContent); if (wallet.EcdsaPrivateKey is null) { throw new Exception("Decrypted wallet does not contain ECDSA key"); } var needsSave = false; if (wallet.HubPrivateKey is null) { wallet.HubPrivateKey = GenerateHubKey().PrivateKey; needsSave = true; } wallet.ThresholdSignatureKeys ??= new Dictionary <ulong, string>(); wallet.TpkePrivateKeys ??= new Dictionary <ulong, string>(); keyPair = new EcdsaKeyPair(wallet.EcdsaPrivateKey.HexToBytes().ToPrivateKey()); hubKey = wallet.HubPrivateKey.HexToBytes(); _tpkeKeys.AddAll(wallet.TpkePrivateKeys .Select(p => new C5.KeyValuePair <ulong, PrivateKey>(p.Key, PrivateKey.FromBytes(p.Value.HexToBytes())))); _tsKeys.AddAll(wallet.ThresholdSignatureKeys .Select(p => new C5.KeyValuePair <ulong, PrivateKeyShare>(p.Key, PrivateKeyShare.FromBytes(p.Value.HexToBytes())))); return(needsSave); }
public void Test_AesGcmEncryptDecryptRoundTrip() { var key = Crypto.GenerateRandomBytes(32); var baseText = "0xf86d808504a817c800832dc6c0948e7b7262e0fa4616566591d51f998f16a79fb547880de0b6b3a76400008025a0115105d96a43f41a5ea562bb3e591cbfa431a8cdae9c3030457adca2cb854f78a012fb41922c53c73473563003667ed8e783359c91d95b42301e1955d530b1ca33" .HexToBytes(); const int n = 1000; var startTs = TimeUtils.CurrentTimeMillis(); for (var it = 0; it < n; ++it) { var plaintext = baseText.Concat(it.ToBytes()).ToArray(); var cipher = Crypto.AesGcmEncrypt(key, plaintext); var decrypted = Crypto.AesGcmDecrypt(key, cipher); Assert.IsTrue(plaintext.SequenceEqual(decrypted)); } var endTs = TimeUtils.CurrentTimeMillis(); Console.WriteLine($"{n} encrypt/decrypt: {endTs - startTs}ms, avg = {(double) (endTs - startTs) / n}"); }