public ExtKey(Key key, byte[] chainCode, byte depth, byte[] fingerprint, uint child) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (chainCode == null) { throw new ArgumentNullException(nameof(chainCode)); } if (fingerprint == null) { throw new ArgumentNullException(nameof(fingerprint)); } if (fingerprint.Length != 4) { throw new ArgumentException(string.Format("The fingerprint must be {0} bytes.", 4), "fingerprint"); } if (chainCode.Length != ChainCodeLength) { throw new ArgumentException(string.Format("The chain code must be {0} bytes.", ChainCodeLength), "chainCode"); } this.key = key; this.nDepth = depth; this.nChild = child; parentFingerprint = new HDFingerprint(fingerprint); Buffer.BlockCopy(chainCode, 0, vchChainCode, 0, ChainCodeLength); }
public RootedKeyPath(HDFingerprint masterFingerprint, KeyPath keyPath) { if (keyPath == null) { throw new ArgumentNullException(nameof(keyPath)); } _KeyPath = keyPath; _MasterFingerprint = masterFingerprint; }
public static bool TryParse(string str, out HDFingerprint result) { if (str == null) { throw new ArgumentNullException(nameof(str)); } result = default; if (!HexEncoder.IsWellFormed(str) || str.Length != 4 * 2) { return(false); } result = new HDFingerprint(Encoders.Hex.DecodeData(str)); return(true); }
public void ReadWrite(ref HDFingerprint fingerPrint) { #if HAS_SPAN Span <byte> bytes = stackalloc byte[4]; fingerPrint.ToBytes(bytes); #else var bytes = fingerPrint.ToBytes(); #endif ReadWrite(ref bytes); if (!this.Serializing) { fingerPrint = new HDFingerprint(bytes); } }
/// <summary> /// Constructor. Creates an extended key from the public key and corresponding private key. /// </summary> /// <remarks> /// <para> /// The ExtPubKey has the relevant values for child number, depth, chain code, and fingerprint. /// </para> /// </remarks> public ExtKey(ExtPubKey extPubKey, Key privateKey) { if (extPubKey == null) { throw new ArgumentNullException(nameof(extPubKey)); } if (privateKey == null) { throw new ArgumentNullException(nameof(privateKey)); } this.nChild = extPubKey.nChild; this.nDepth = extPubKey.nDepth; this.vchChainCode = extPubKey.vchChainCode; this.parentFingerprint = extPubKey.parentFingerprint; this.key = privateKey; }
public ExtPubKey(PubKey pubkey, byte[] chainCode, byte depth, HDFingerprint fingerprint, uint child) { if (pubkey == null) { throw new ArgumentNullException(nameof(pubkey)); } if (chainCode == null) { throw new ArgumentNullException(nameof(chainCode)); } if (chainCode.Length != ChainCodeLength) { throw new ArgumentException(string.Format("The chain code must be {0} bytes.", ChainCodeLength), "chainCode"); } this.pubkey = pubkey; this.nDepth = depth; this.nChild = child; parentFingerprint = fingerprint; Buffer.BlockCopy(chainCode, 0, vchChainCode, 0, ChainCodeLength); }
public static bool TryParse(string str, out RootedKeyPath result) { if (str == null) { throw new ArgumentNullException(nameof(str)); } result = null; var separator = str.IndexOf('/'); if (separator == -1) { return(false); } if (!HDFingerprint.TryParse(str.Substring(0, separator), out var fp)) { return(false); } if (!Bitcoin3.KeyPath.TryParse(str.Substring(separator + 1), out var keyPath)) { return(false); } result = new RootedKeyPath(fp, keyPath); return(true); }
public RootedKeyPath ToRootedKeyPath(HDFingerprint masterFingerprint) { return(new RootedKeyPath(masterFingerprint, this)); }
internal PSBTInput(BitcoinStream stream, PSBT parent, uint index, TxIn input) : base(parent) { TxIn = input; Index = index; originalScriptSig = TxIn.ScriptSig ?? Script.Empty; originalWitScript = TxIn.WitScript ?? WitScript.Empty; byte[] k = new byte[0]; byte[] v = new byte[0]; try { stream.ReadWriteAsVarString(ref k); } catch (EndOfStreamException e) { throw new FormatException("Invalid PSBTInput. Failed to Parse key.", e); } while (k.Length != 0) { try { stream.ReadWriteAsVarString(ref v); } catch (EndOfStreamException e) { throw new FormatException("Invalid PSBTInput. Failed to parse key.", e); } switch (k.First()) { case PSBTConstants.PSBT_IN_NON_WITNESS_UTXO: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for NonWitnessUTXO"); } if (non_witness_utxo != null) { throw new FormatException("Invalid PSBTInput. Duplicate non_witness_utxo"); } non_witness_utxo = this.GetConsensusFactory().CreateTransaction(); non_witness_utxo.FromBytes(v); break; case PSBTConstants.PSBT_IN_WITNESS_UTXO: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for WitnessUTXO"); } if (witness_utxo != null) { throw new FormatException("Invalid PSBTInput. Duplicate witness_utxo"); } if (this.GetConsensusFactory().TryCreateNew <TxOut>(out var txout)) { witness_utxo = txout; } else { witness_utxo = new TxOut(); } witness_utxo.FromBytes(v); break; case PSBTConstants.PSBT_IN_PARTIAL_SIG: var pubkey = new PubKey(k.Skip(1).ToArray()); if (partial_sigs.ContainsKey(pubkey)) { throw new FormatException("Invalid PSBTInput. Duplicate key for partial_sigs"); } partial_sigs.Add(pubkey, new TransactionSignature(v)); break; case PSBTConstants.PSBT_IN_SIGHASH: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for SigHash type"); } if (!(sighash_type is null)) { throw new FormatException("Invalid PSBTInput. Duplicate key for sighash_type"); } if (v.Length != 4) { throw new FormatException("Invalid PSBTInput. SigHash Type is not 4 byte"); } var value = Utils.ToUInt32(v, 0, true); if (!Enum.IsDefined(typeof(SigHash), value)) { throw new FormatException($"Invalid PSBTInput Unknown SigHash Type {value}"); } sighash_type = (SigHash)value; break; case PSBTConstants.PSBT_IN_REDEEMSCRIPT: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for redeem script"); } if (redeem_script != null) { throw new FormatException("Invalid PSBTInput. Duplicate key for redeem_script"); } redeem_script = Script.FromBytesUnsafe(v); break; case PSBTConstants.PSBT_IN_WITNESSSCRIPT: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for witness script"); } if (witness_script != null) { throw new FormatException("Invalid PSBTInput. Duplicate key for redeem_script"); } witness_script = Script.FromBytesUnsafe(v); break; case PSBTConstants.PSBT_IN_BIP32_DERIVATION: var pubkey2 = new PubKey(k.Skip(1).ToArray()); if (hd_keypaths.ContainsKey(pubkey2)) { throw new FormatException("Invalid PSBTInput. Duplicate key for hd_keypaths"); } var masterFingerPrint = new HDFingerprint(v.Take(4).ToArray()); KeyPath path = KeyPath.FromBytes(v.Skip(4).ToArray()); hd_keypaths.Add(pubkey2, new RootedKeyPath(masterFingerPrint, path)); break; case PSBTConstants.PSBT_IN_SCRIPTSIG: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for final scriptsig"); } if (final_script_sig != null) { throw new FormatException("Invalid PSBTInput. Duplicate key for final_script_sig"); } final_script_sig = Script.FromBytesUnsafe(v); break; case PSBTConstants.PSBT_IN_SCRIPTWITNESS: if (k.Length != 1) { throw new FormatException("Invalid PSBTInput. Contains illegal value in key for final script witness"); } if (final_script_witness != null) { throw new FormatException("Invalid PSBTInput. Duplicate key for final_script_witness"); } final_script_witness = new WitScript(v); break; default: if (unknown.ContainsKey(k)) { throw new FormatException("Invalid PSBTInput. Duplicate key for unknown value"); } unknown.Add(k, v); break; } stream.ReadWriteAsVarString(ref k); } }