Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
 public KeyId(PubKey pubKey)
     : this(Hashes.Hash160(pubKey.ToByteArray()))
 {
 }
Пример #4
0
        public static Script FromPubKey(PubKey publicKey)
        {
            var pubKey = Encoders.Hex.GetString(publicKey.ToByteArray());

            return(FromAsm($"{pubKey} OP_CHECKSIG"));
        }
Пример #5
0
 public byte[] ToByteArray()
 {
     return(Packer.Pack("bA^I_AA", Depth, Fingerprint, Child, ChainCode, PubKey.ToByteArray()));
 }