diff --git a/core/src/main/java/org/bitcoinj/core/AddressFormatException.java b/core/src/main/java/org/bitcoinj/core/AddressFormatException.java index 9954ecdd..2ded260d 100644 --- a/core/src/main/java/org/bitcoinj/core/AddressFormatException.java +++ b/core/src/main/java/org/bitcoinj/core/AddressFormatException.java @@ -27,6 +27,21 @@ public class AddressFormatException extends IllegalArgumentException { super(message); } + /** + * This exception is thrown by {@link Base58}, {@link Bech32} and the {@link PrefixedChecksummedBytes} hierarchy of + * classes when you try to decode data and the checksum isn't valid. You shouldn't allow the user to proceed in this + * case. + */ + public static class InvalidChecksum extends AddressFormatException { + public InvalidChecksum() { + super("Checksum does not validate"); + } + + public InvalidChecksum(String message) { + super(message); + } + } + /** * This exception is thrown by the {@link PrefixedChecksummedBytes} hierarchy of classes when you try and decode an * address with a version header that isn't used by that network. You shouldn't allow the user to proceed in this diff --git a/core/src/main/java/org/bitcoinj/core/Base58.java b/core/src/main/java/org/bitcoinj/core/Base58.java index d571b055..a4c159de 100644 --- a/core/src/main/java/org/bitcoinj/core/Base58.java +++ b/core/src/main/java/org/bitcoinj/core/Base58.java @@ -175,7 +175,7 @@ public class Base58 { byte[] checksum = Arrays.copyOfRange(decoded, decoded.length - 4, decoded.length); byte[] actualChecksum = Arrays.copyOfRange(Sha256Hash.hashTwice(data), 0, 4); if (!Arrays.equals(checksum, actualChecksum)) - throw new AddressFormatException("Checksum does not validate"); + throw new AddressFormatException.InvalidChecksum(); return data; } diff --git a/core/src/main/java/org/bitcoinj/core/Bech32.java b/core/src/main/java/org/bitcoinj/core/Bech32.java index e025a872..395d1c2a 100644 --- a/core/src/main/java/org/bitcoinj/core/Bech32.java +++ b/core/src/main/java/org/bitcoinj/core/Bech32.java @@ -141,7 +141,7 @@ public class Bech32 { values[i] = CHARSET_REV[c]; } String hrp = str.substring(0, pos).toLowerCase(Locale.ROOT); - if (!verifyChecksum(hrp, values)) throw new AddressFormatException("Invalid checksum"); + if (!verifyChecksum(hrp, values)) throw new AddressFormatException.InvalidChecksum(); return new Bech32Data(hrp, Arrays.copyOfRange(values, 0, values.length - 6)); } } diff --git a/core/src/test/java/org/bitcoinj/core/Base58Test.java b/core/src/test/java/org/bitcoinj/core/Base58Test.java index e2177ff5..a081fe07 100644 --- a/core/src/test/java/org/bitcoinj/core/Base58Test.java +++ b/core/src/test/java/org/bitcoinj/core/Base58Test.java @@ -83,8 +83,8 @@ public class Base58Test { Base58.decodeChecked("93VYUMzRG9DdbRP72uQXjaWibbQwygnvaCu9DumcqDjGybD864T"); } - @Test(expected = AddressFormatException.class) - public void testDecodeChecked_badChecksum() { + @Test(expected = AddressFormatException.InvalidChecksum.class) + public void testDecodeChecked_invalidChecksum() { Base58.decodeChecked("4stwEBjT6FYyVW"); } diff --git a/core/src/test/java/org/bitcoinj/core/Bech32Test.java b/core/src/test/java/org/bitcoinj/core/Bech32Test.java index bf4088f9..ea7ec597 100644 --- a/core/src/test/java/org/bitcoinj/core/Bech32Test.java +++ b/core/src/test/java/org/bitcoinj/core/Bech32Test.java @@ -70,4 +70,9 @@ public class Bech32Test { "li1dgmt3", "de1lg7wt" + new String(new char[] { 0xff }), }; + + @Test(expected = AddressFormatException.InvalidChecksum.class) + public void decode_invalidNetwork() { + Bech32.decode("A12UEL5X"); + } }