package com.yoghurt.crypto.transactions.client.util.address; import com.googlecode.gwt.crypto.bouncycastle.util.Arrays; import com.yoghurt.crypto.transactions.client.util.transaction.ComputeUtil; import com.yoghurt.crypto.transactions.shared.domain.Base58CheckContents; import com.yoghurt.crypto.transactions.shared.util.ArrayUtil; public class Base58CheckUtil { private static final int CHECKSUM_LENGTH = 4; public static Base58CheckContents parseBase58Check(final String base58Check) { final byte[] decode = Base58.decode(base58Check); final Base58CheckContents contents = new Base58CheckContents(); contents.setVersion(decode[0]); contents.setChecksum(extractChecksum(decode)); contents.setPayload(ArrayUtil.arrayCopy(decode, 1, decode.length - CHECKSUM_LENGTH)); return contents; } public static byte[] computeChecksum(final byte version, final byte[] payload) { final byte[] checksum = ComputeUtil.computeDoubleSHA256(new byte[] { version }, payload); return ArrayUtil.arrayCopy(checksum, 0, CHECKSUM_LENGTH); } public static boolean isValid(final Base58CheckContents base58contents) { return Arrays.areEqual(base58contents.getChecksum(), computeChecksum(base58contents.getVersion(), base58contents.getPayload())); } /** * Extract the checksum from some thing that is a base58check format * @param thing thing checksum is extracted form * @return last 4 bytes of thing */ private static byte[] extractChecksum(final byte[] thing) { return ArrayUtil.arrayCopy(thing, thing.length - CHECKSUM_LENGTH, thing.length); } }