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"); } }
@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() ); } }
byte[] serialize(final byte[] key, final byte[] chainCode) { if (key == null) throw new IllegalArgumentException("Key is null"); if (chainCode == null) throw new IllegalArgumentException("Chain code is null"); if (chainCode.length != 32) throw new IllegalArgumentException("Chain code must be 32 bytes"); if (neutered) { if (key.length != 33) throw new IllegalArgumentException("Key must be 33 bytes for neutered serialization"); } else { if (key.length != 32) throw new IllegalArgumentException("Key must be 32 bytes for non neutered serialization"); } final byte[] privateKey = new byte[82]; final ByteArrayWriter writer = new ByteArrayWriter(privateKey); writer.concatSer32(getVersion()); writer.concat((byte) depth); writer.concatSer32(fingerprint); writer.concatSer32(childNumber); writer.concat(chainCode); if (!neutered) { writer.concat((byte) 0); writer.concat(key); } else { writer.concat(key); } writer.concat(checksum(privateKey), 4); return privateKey; }