.key(Il) .chainCode(Ir) .depth(hdKey.depth() + 1) .childNumber(index) .parentFingerprint(hdKey.calculateFingerPrint())
@Override public ExtendedPublicKey cKDpub(final int index) { if (isHardened(index)) throw new IllegalCKDCall("Cannot derive a hardened key from a public key"); final HdKey parent = this.hdKey; final byte[] kPar = parent.getKey(); final byte[] data = new byte[37]; final ByteArrayWriter writer = new ByteArrayWriter(data); writer.concat(kPar, 33); writer.concatSer32(index); final byte[] I = hmacSha512(parent.getChainCode(), data); final byte[] Il = head32(I); final byte[] Ir = tail32(I); final BigInteger parse256_Il = parse256(Il); final ECPoint ki = gMultiplyAndAddPoint(parse256_Il, kPar); if (parse256_Il.compareTo(n()) >= 0 || ki.isInfinity()) { return cKDpub(index + 1); } final byte[] key = pointSerP(ki); return new ExtendedPublicKey(new HdKey.Builder() .network(parent.getNetwork()) .neutered(true) .depth(parent.depth() + 1) .parentFingerprint(parent.calculateFingerPrint()) .key(key) .chainCode(Ir) .childNumber(index) .build()); }
@Override public ExtendedPrivateKey deserialize(final byte[] extendedKeyData) { confirmExtendedKeyChecksum(extendedKeyData); final ByteArrayReader reader = new ByteArrayReader(extendedKeyData); return new ExtendedPrivateKey(new HdKey .Builder() .network(networks.findByPrivateVersion(reader.readSer32())) .depth(reader.read()) .parentFingerprint(reader.readSer32()) .childNumber(reader.readSer32()) .chainCode(reader.readRange(32)) .key(getKey(reader)) .neutered(false) .build() ); }
@Override public ExtendedPublicKey deserialize(final byte[] extendedKeyData) { confirmExtendedKeyChecksum(extendedKeyData); final ByteArrayReader reader = new ByteArrayReader(extendedKeyData); return new ExtendedPublicKey(new HdKey .Builder() .network(networks.findByPublicVersion(reader.readSer32())) .depth(reader.read()) .parentFingerprint(reader.readSer32()) .childNumber(reader.readSer32()) .chainCode(reader.readRange(32)) .key(reader.readRange(33)) .neutered(true) .build() ); } }
Builder toBuilder() { return new Builder() .neutered(neutered) .chainCode(chainCode) .key(key) .depth(depth) .childNumber(childNumber) .parentFingerprint(parentFingerprint); }
private ExtendedPrivateKey(final Network network, final byte[] key, final byte[] chainCode) { this(new HdKey.Builder() .network(network) .neutered(false) .key(key) .chainCode(chainCode) .depth(0) .childNumber(0) .parentFingerprint(0) .build()); }
static ExtendedPublicKey from(final HdKey hdKey) { return new ExtendedPublicKey(new HdKey.Builder() .network(hdKey.getNetwork()) .neutered(true) .key(hdKey.getPoint()) .parentFingerprint(hdKey.getParentFingerprint()) .depth(hdKey.depth()) .childNumber(hdKey.getChildNumber()) .chainCode(hdKey.getChainCode()) .build()); }