/// <summary> /// Gets the extended private key for the given address. /// </summary> /// <param name="password">The password used to encrypt/decrypt sensitive info.</param> /// <param name="address">The address to get the private key for.</param> /// <returns>The extended private key.</returns> public ISecret GetExtendedPrivateKeyForAddress(string password, HdAddress address) { Guard.NotEmpty(password, nameof(password)); Guard.NotNull(address, nameof(address)); // Check if the wallet contains the address. if (!this.ContainsAddress(address)) { throw new WalletException("Address not found on wallet."); } // get extended private key Key privateKey = HdOperations.DecryptSeed(this.EncryptedSeed, password, this.Network); return(HdOperations.GetExtendedPrivateKey(privateKey, this.ChainCode, address.HdPath, this.Network)); }
public void pubKeysDerivedFromExtendedPrivateAndPublicKeysMatch() { string password = "******"; string passphrase = password; string mnemonic = "chalk call anger chase endless level slow sleep coast left sand enter save bind curious puzzle stadium volume mixture shuffle hurry gas borrow believe"; ExtKey extendedKey = HdOperations.GetExtendedKey(mnemonic, passphrase); string encryptedSeed = extendedKey.PrivateKey.GetEncryptedBitcoinSecret(password, this.Network).ToWif(); Key privateKey = HdOperations.DecryptSeed(encryptedSeed, password, this.Network); string accountHdPath = HdOperations.GetAccountHdPath(COINTYPE, 0); string path = HdOperations.CreateHdPath(COINTYPE, 0, false, 0); ExtPubKey accountExtPubKey = HdOperations.GetExtendedPublicKey(privateKey, extendedKey.ChainCode, accountHdPath); var subjectPubKey = HdOperations.GeneratePublicKey(accountExtPubKey.ToString(this.Network), 0, false, this.Network); var subjectPrivKey = HdOperations.GetExtendedPrivateKey(privateKey, extendedKey.ChainCode, path, this.Network); Assert.Equal(subjectPubKey.ScriptPubKey, subjectPrivKey.PrivateKey.PubKey.ScriptPubKey); }