Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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}");
        }