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()); }
public static ExtendedPrivateKey fromSeed(final byte[] seed, final Network network) { final byte[] I = hmacSha512(BITCOIN_SEED, seed); final byte[] Il = head32(I); final byte[] Ir = tail32(I); return new ExtendedPrivateKey(network, Il, Ir); }
@Override public ExtendedPrivateKey toNetwork(final Network otherNetwork) { if (otherNetwork == network()) return this; return new ExtendedPrivateKey( hdKey.toBuilder() .network(otherNetwork) .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() ); } }
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()); }
Builder toBuilder() { return new Builder() .neutered(neutered) .chainCode(chainCode) .key(key) .depth(depth) .childNumber(childNumber) .parentFingerprint(parentFingerprint); }
public String p2pkhAddress() { return encodeAddress(hdKey.getNetwork().p2pkhVersion(), hdKey.getKey()); }
public String p2shAddress() { final byte[] script = new byte[22]; script[1] = (byte) 20; hash160into(script, 2, hdKey.getKey()); return encodeAddress(hdKey.getNetwork().p2shVersion(), script); }
@Override public ExtendedPublicKey toNetwork(final Network otherNetwork) { if (otherNetwork == network()) return this; return new ExtendedPublicKey( hdKey.toBuilder() .network(otherNetwork) .build()); }
private byte[] getKey(final ByteArrayReader reader) { if (reader.read() != 0) { throw new BadKeySerializationException("Expected 0 padding at position 45"); } return reader.readRange(32); } }
@Override public Network findByPublicVersion(final int publicVersion) { return networks.findByPublicVersion(publicVersion); } }
@Override public Network findByPrivateVersion(final int privateVersion) { return networks.findByPrivateVersion(privateVersion); }
static void confirmExtendedKeyChecksum(final byte[] extendedKeyData) { final byte[] expected = checksum(extendedKeyData); for (int i = 0; i < 4; i++) { if (extendedKeyData[78 + i] != expected[i]) throw new BadKeySerializationException("Checksum error"); } }
byte[] getPoint() { return pointSerP_gMultiply(parse256(key)); }
@Override public ExtendedPublicKey deriveChildKey(final ExtendedPublicKey parent, final int childIndex) { return parent.cKDpub(childIndex); } };
@Override public ExtendedPrivateKey deriveChildKey(final ExtendedPrivateKey parent, final int childIndex) { return parent.cKDpriv(childIndex); } };
@Override public int childNumber() { return hdKey.getChildNumber(); } }