protected override IEnumerable <WalletKeyPairBase> LoadKeyPairs() { using (WalletDataContext ctx = new WalletDataContext(DbPath)) { foreach (Account item in ctx.Accounts.Select(p => p)) { if ((KeyType)item.nVersion == KeyType.Anonymous || (KeyType)item.nVersion == KeyType.Transparent) { byte[] decryptedPrivateKey = DecryptPrivateKey(item.PrivateKeyEncrypted); WalletKeyPair account = new WalletKeyPair(decryptedPrivateKey, (KeyType)item.nVersion); Array.Clear(decryptedPrivateKey, 0, decryptedPrivateKey.Length); yield return(account); } else if ((KeyType)item.nVersion == KeyType.Stealth) { byte[] decryptedPrivateKey = DecryptPrivateKey(item.PrivateKeyEncrypted); byte[] decryptedViewKey = DecryptPrivateKey(item.PrivateViewKeyEncrypted); StealthKeyPair account = new StealthKeyPair(decryptedPrivateKey, decryptedViewKey); Array.Clear(decryptedPrivateKey, 0, decryptedPrivateKey.Length); Array.Clear(decryptedViewKey, 0, decryptedViewKey.Length); yield return(account); } } } }
private void OnCreateAccount(WalletKeyPair account) { byte[] decryptedPrivateKey = new byte[96]; Buffer.BlockCopy(account.PublicKey.EncodePoint(false), 1, decryptedPrivateKey, 0, 64); using (account.Decrypt()) { Buffer.BlockCopy(account.PrivateKey, 0, decryptedPrivateKey, 64, 32); } byte[] encryptedPrivateKey = EncryptPrivateKey(decryptedPrivateKey); Array.Clear(decryptedPrivateKey, 0, decryptedPrivateKey.Length); using (WalletDataContext ctx = new WalletDataContext(DbPath)) { Account db_account = ctx.Accounts.FirstOrDefault(p => p.PublicKeyHash.SequenceEqual(account.PublicKeyHash.ToArray())); if (db_account == null) { db_account = ctx.Accounts.Add(new Account { nVersion = (int)account.nVersion, PrivateKeyEncrypted = encryptedPrivateKey, PublicKeyHash = account.PublicKeyHash.ToArray() }).Entity; } else { db_account.nVersion = (int)account.nVersion; db_account.PrivateKeyEncrypted = encryptedPrivateKey; } try { ctx.SaveChanges(); } catch (Exception ex) { string str = ex.Message; } } }
public override WalletKeyPair CreateKey(byte[] privateKey, KeyType nVersion = KeyType.Transparent) { if (nVersion == KeyType.Transparent) { WalletKeyPair account = base.CreateKey(privateKey, nVersion); OnCreateAccount(account); AddContract(VerificationContract.CreateSignatureContract(account.PublicKey)); return(account); } else if (nVersion == KeyType.Anonymous) { WalletKeyPair account = base.CreateKey(privateKey, nVersion); SpendingKey sKey; sKey = new SpendingKey(new UInt256(privateKey)); OnCreateAccount(account); AddContract(VerificationContract.CreateSignatureAnonymousContract(account.PublicKey, sKey.address())); return(account); } else { return(null); } }