public HdKey Derive(uint index) { var keyArray = Key.ToByteArray(); var pubKeyArray = PubKey.ToByteArray(); var data = (index & Hardened) != Hardened ? pubKeyArray : ByteArray.Zero.Concat(keyArray); var salt = Packer.Pack("A^I", data, index); var i = Hashes.HMACSHA512(ChainCode, salt); var il = i.Slice(0, KeyLength); var ir = i.Slice(KeyLength, ChainCodeLength); Key.CheckValidKey(il); var parse256il = il.ToBigIntegerUnsigned(true); var kpar = keyArray.ToBigIntegerUnsigned(true); var childCodeChain = ir; var childKey = (parse256il + kpar) % Secp256k1.N; var keyBytes = childKey.ToUByteArray().ToBigEndian(); keyBytes = keyBytes.PadLeft(KeyLength); var childFingerprint = PubKey.Hash.ToByteArray().Slice(0, FingerprintLength); return(new HdKey(new Key(keyBytes), childCodeChain, (byte)(Depth + 1), index, childFingerprint)); }
public HdPubKey Derive(uint index) { if ((index & Hardened) == Hardened) { throw new InvalidOperationException("Cannot create a hardened child key from public child derivation"); } var pubKey = PubKey.ToByteArray(); var salt = Packer.Pack("bA^I", pubKey[0], pubKey.Slice(1), index); var i = Hashes.HMACSHA512(ChainCode, salt); var il = i.Slice(0, KeyLength); var ir = i.Slice(KeyLength, ChainCodeLength); var childCodeChain = ir; Key.CheckValidKey(il); var parse256il = il.ToBigIntegerUnsigned(true); var q = (Secp256k1.G * parse256il) + PubKey.Point; if (q.IsInfinity) { throw new InvalidOperationException("Point is infinity, very rare. This event has a probability lower than 1 in 2^127"); } var childFingerprint = PubKey.Hash.ToByteArray().Slice(0, FingerprintLength); return(new HdPubKey(new PubKey(q.Encode(true)), childCodeChain, (byte)(Depth + 1), index, childFingerprint)); }
public KeyId(PubKey pubKey) : this(Hashes.Hash160(pubKey.ToByteArray())) { }
public static Script FromPubKey(PubKey publicKey) { var pubKey = Encoders.Hex.GetString(publicKey.ToByteArray()); return(FromAsm($"{pubKey} OP_CHECKSIG")); }
public byte[] ToByteArray() { return(Packer.Pack("bA^I_AA", Depth, Fingerprint, Child, ChainCode, PubKey.ToByteArray())); }