diff --git a/crypto/src/main/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigest.java b/crypto/src/main/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigest.java index 7ee8992a91..fcbc7d27c9 100644 --- a/crypto/src/main/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigest.java +++ b/crypto/src/main/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigest.java @@ -179,7 +179,7 @@ public int doFinal(final byte[] out, final int offset) { compress(); for (int i = 0; i < h.length; i++) { - System.arraycopy(Pack.longToBigEndian(h[i]), 0, out, i * 8, 8); + System.arraycopy(Pack.longToLittleEndian(h[i]), 0, out, i * 8, 8); } reset(); @@ -224,7 +224,7 @@ private int bytesToInt(final byte[] bytes) { } private long bytesToLong(final byte[] bytes) { - return Pack.bigEndianToLong(bytes, 0); + return Pack.littleEndianToLong(bytes, 0); } /** diff --git a/crypto/src/test/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigestTest.java b/crypto/src/test/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigestTest.java index 7c1a218cf5..d3179f320d 100644 --- a/crypto/src/test/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigestTest.java +++ b/crypto/src/test/java/tech/pegasys/pantheon/crypto/Blake2bfMessageDigestTest.java @@ -27,21 +27,21 @@ public class Blake2bfMessageDigestTest { private Blake2bfMessageDigest messageDigest; // output when input is all 0 - private byte[] blake2bfAllZero = + private static final byte[] BLAKE2F_ALL_ZERO = new byte[] { - 106, 9, -26, 103, -13, -68, -55, 8, -69, 103, -82, -123, -124, -54, -89, 59, 60, 110, -13, - 114, -2, -108, -8, 43, -91, 79, -11, 58, 95, 29, 54, -15, 81, 14, 82, 127, -83, -26, -126, - -47, -101, 5, 104, -116, 43, 62, 108, 31, 31, -125, -39, -85, -5, 65, -67, 107, 91, -32, - -51, 25, 19, 126, 33, 121 + 8, -55, -68, -13, 103, -26, 9, 106, 59, -89, -54, -124, -123, -82, 103, -69, 43, -8, -108, + -2, 114, -13, 110, 60, -15, 54, 29, 95, 58, -11, 79, -91, -47, -126, -26, -83, 127, 82, 14, + 81, 31, 108, 62, 43, -116, 104, 5, -101, 107, -67, 65, -5, -85, -39, -125, 31, 121, 33, 126, + 19, 25, -51, -32, 91 }; - // output when input is all 0 for 2147483648 rounds - private byte[] blake2bfAllZeroNegativeRounds = + // output when input is all 0 for 4294967295 rounds + private static final byte[] BLAKE2F_ALL_ZERO_NEGATIVE_ROUNDS = new byte[] { - 118, 127, 109, 29, 115, -124, -99, -111, 81, 112, 35, 60, -89, 75, 21, 18, -97, -73, 19, - -102, 40, -8, 78, 110, -43, 124, 66, 83, -89, 69, 69, 57, -25, -105, 123, 117, 115, 115, 78, - -92, 123, 87, 14, -127, -94, -1, -74, 25, -125, 48, 54, -78, -82, -75, 84, -26, -38, -42, - -93, 120, -61, 7, -58, 38 + -111, -99, -124, 115, 29, 109, 127, 118, 18, 21, 75, -89, 60, 35, 112, 81, 110, 78, -8, 40, + -102, 19, -73, -97, 57, 69, 69, -89, 83, 66, 124, -43, -92, 78, 115, 115, 117, 123, -105, + -25, 25, -74, -1, -94, -127, 14, 87, 123, -26, 84, -75, -82, -78, 54, 48, -125, 38, -58, 7, + -61, 120, -93, -42, -38 }; @Before @@ -54,32 +54,32 @@ public void digestIfUpdatedCorrectlyWithBytes() { for (int i = 0; i < 213; i++) { messageDigest.update((byte) 0); } - assertThat(messageDigest.digest()).isEqualTo(blake2bfAllZero); + assertThat(messageDigest.digest()).isEqualTo(BLAKE2F_ALL_ZERO); } @Test public void digestIfUpdatedCorrectlyWithByteArray() { - byte[] update = new byte[213]; + final byte[] update = new byte[213]; messageDigest.update(update, 0, 213); - assertThat(messageDigest.digest()).isEqualTo(blake2bfAllZero); + assertThat(messageDigest.digest()).isEqualTo(BLAKE2F_ALL_ZERO); } @Test public void digestIfUpdatedCorrectlyMixed() { - byte[] update = new byte[213]; + final byte[] update = new byte[213]; messageDigest.update((byte) 0); messageDigest.update(update, 2, 211); messageDigest.update((byte) 0); - assertThat(messageDigest.digest()).isEqualTo(blake2bfAllZero); + assertThat(messageDigest.digest()).isEqualTo(BLAKE2F_ALL_ZERO); } @Test - public void digestWithNegativeRounds() { - // equal to Integer.MAX_VALUE + 1 (2147483648) as uint - byte[] rounds = Pack.intToBigEndian(Integer.MIN_VALUE); + public void digestWithMaxRounds() { + // equal to unsigned int max value (4294967295, or signed -1) + final byte[] rounds = Pack.intToBigEndian(Integer.MIN_VALUE); messageDigest.update(rounds, 0, 4); messageDigest.update(new byte[213], 0, 209); - assertThat(messageDigest.digest()).isEqualTo(blake2bfAllZeroNegativeRounds); + assertThat(messageDigest.digest()).isEqualTo(BLAKE2F_ALL_ZERO_NEGATIVE_ROUNDS); } @Test(expected = IllegalStateException.class) @@ -99,14 +99,14 @@ public void throwsIfBufferUpdatedWithMoreThat213Bytes() { @Test(expected = IllegalArgumentException.class) public void throwsIfBufferUpdatedLargeByteArray() { - byte[] update = new byte[213]; + final byte[] update = new byte[213]; messageDigest.update((byte) 0); messageDigest.update(update, 0, 213); } @Test(expected = IllegalArgumentException.class) public void throwsIfEmptyBufferUpdatedLargeByteArray() { - byte[] update = new byte[214]; + final byte[] update = new byte[214]; messageDigest.update(update, 0, 214); } } diff --git a/crypto/src/test/java/tech/pegasys/pantheon/crypto/HashTest.java b/crypto/src/test/java/tech/pegasys/pantheon/crypto/HashTest.java index d6e31f6ee3..f6b63f75a9 100644 --- a/crypto/src/test/java/tech/pegasys/pantheon/crypto/HashTest.java +++ b/crypto/src/test/java/tech/pegasys/pantheon/crypto/HashTest.java @@ -31,7 +31,7 @@ public class HashTest { "000000016a09e667f2bd8948bb67ae8584caa73b3c6ef372fe94f82ba54ff53a5f1d36f1510e527fade682d19b05688c2b3e6c1f1f83d9abfb41bd6b5be0cd19137e217907060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a3938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000001"; private static final String outputBlake2bf = - "62305ad4d48dade8269ef60a1bcb8b7bef6e479e643b5ac1f8017e6422ce89fb62d09ecaa81d095e855540dcbc07bd0feb3d4f5e5e50541260ed930f027cfd8d"; + "bd45dd07a6eac13eec520b6aac885a1a89ea882978ae1a07472cc3e8cd358fd1a4d431c1a7d03f4a2bf746506779a970bfc5477026701076eda181e16acc24bc"; /** Validate keccak256 hash. */ @Test diff --git a/ethereum/core/src/main/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContract.java b/ethereum/core/src/main/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContract.java index 51bd0037e8..9f987ff3f9 100644 --- a/ethereum/core/src/main/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContract.java +++ b/ethereum/core/src/main/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContract.java @@ -37,9 +37,13 @@ public Gas gasRequirement(final BytesValue input) { // Precompile can't be executed so we set its price to 0. return Gas.ZERO; } + if ((input.get(212) & 0xFE) != 0) { + // Input is malformed, F value can be only 0 or 1 + return Gas.ZERO; + } - byte[] roundsBytes = copyOfRange(input.extractArray(), 0, 4); - BigInteger rounds = new BigInteger(1, roundsBytes); + final byte[] roundsBytes = copyOfRange(input.extractArray(), 0, 4); + final BigInteger rounds = new BigInteger(1, roundsBytes); return Gas.of(rounds); } @@ -48,6 +52,9 @@ public BytesValue compute(final BytesValue input, final MessageFrame messageFram if (input.size() != MESSAGE_LENGTH_BYTES) { return BytesValue.EMPTY; } + if ((input.get(212) & 0xFE) != 0) { + return BytesValue.EMPTY; + } return Hash.blake2bf(input); } } diff --git a/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContractTest.java b/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContractTest.java index 759dfa493b..8cee0a2561 100644 --- a/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContractTest.java +++ b/ethereum/core/src/test/java/tech/pegasys/pantheon/ethereum/mainnet/precompiles/BLAKE2BFPrecompileContractTest.java @@ -33,110 +33,48 @@ public BLAKE2BFPrecompileContractTest() {} private MessageFrame messageFrame = mock(MessageFrame.class); - // Test vectors from - // https://github.com/keep-network/go-ethereum/blob/f-precompile/core/vm/contracts_test.go#L350 @Parameterized.Parameters public static Object[][] parameters() { return new Object[][] { { - "000000016a09e667f2bd8948bb67ae8584caa73b3c6ef372fe94f82ba54ff53a5f1d36f1510e527fade682d19b05688c2b3e6c1f1f83d9abfb41bd6b5be0cd19137e217907060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a3938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000001", - "62305ad4d48dade8269ef60a1bcb8b7bef6e479e643b5ac1f8017e6422ce89fb62d09ecaa81d095e855540dcbc07bd0feb3d4f5e5e50541260ed930f027cfd8d", - 1 - }, - { - "000000016a09e667f2bd8948bb67ae8584caa73b3c6ef372fe94f82ba54ff53a5f1d36f1510e527fade682d19b05688c2b3e6c1f1f83d9abfb41bd6b5be0cd19137e217907060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a3938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000", - "74aaa2510b5c66ea8a708bdea257192d9c9bc48d53c7f7e87a51bffd24d5d9e6ea0b4b2070fb3a3d211208e3f7bcb1a24dec971cecbb62faf1cd142745f8f4ee", - 1 - }, - { - "000000018736a85f01b0a31dd67dcbe79b220b9b9d93e5897bb8975766b47652443b1927b715da2203c2ca1d0d22b820a965ad9cf23bb0bd57a16fd56ed7a9c5dc67af0587868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e8f7f6f5f4f3f2f1f000fefdfcfbfaf9f8000000000000017f000000000000000001", - "f0eea67995b5e71bd02c40edf19aadd131475949119813de4ea3072f8865bb1978037a72d2bb446d3deead8310b5fba548088c5a99689c51c6632f660a2a2a45", - 1 - }, - { - "000000056a09e667f2bd8948bb67ae8584caa73b3c6ef372fe94f82ba54ff53a5f1d36f1510e527fade682d19b05688c2b3e6c1f1f83d9abfb41bd6b5be0cd19137e217907060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a3938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000001", - "f863686fe221e37fee57b5eb7a41266fe765d26d337fa9fe329af1ae378bae9bd61f06dd8ccceec229349cd341b19df399488a9ab05aec7ba3442268fd039ba4", - 5 - }, - { - "000000056a09e667f2bd8948bb67ae8584caa73b3c6ef372fe94f82ba54ff53a5f1d36f1510e527fade682d19b05688c2b3e6c1f1f83d9abfb41bd6b5be0cd19137e217907060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a3938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000", - "3a6c5ac8d6606290708c08540cb5c425f72014c8b50c280b817a6ffb1b8b405f2001caca125182b562b8a407a249ca6e9755b62e4324caaf4578a660d8dd4876", - 5 - }, - { - "000000052a3c65f1dbd604cbc713d5ce8c0e5e6c3b22c76bdf73716e55525ba247a930f9e240763f1c01d22c514aa14d3f18722715405fbe7ecde36c77e565078839b7c987868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e8f7f6f5f4f3f2f1f000fefdfcfbfaf9f8000000000000017f000000000000000001", - "7e7acc657731d1dfb4229114f545597b7fa4b3140217b470e86a8c27ab0b1ce8c103e219a3a2f77fa495b8c706b8016facf32b1cb5d83f2ae8d3248892d5d74c", - 5 - }, - { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde00000000030201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000000000000001", - "7180f3083d5aaabe0569cd951d62cf431dc9f9ff9eb4d014a5ef0eec4192b524ba8b0407d49601f648b0bc8e8246218d6d4fbb56fd42888dacb8aa4d4b9ce1f8", - 12 - }, - { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde07060504030201000f0e0d0c0b0a0908000000141312111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095000000000000000001", - "099cb773e2cc379a8876af0e51773691d22f53d314339be845292a02de394c76ddf87a51130d71b51cec3be7246631c03620302852f17de6dd18d2b40cab30f3", - 12 - }, - { - "0000000c6a09e667f2bd8948bb67ae8584caa73b3c6ef372fe94f82ba54ff53a5f1d36f1510e527fade682d19b05688c2b3e6c1f1f83d9abfb41bd6b5be0cd19137e217907060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a3938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000", - "ff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde", - 12 - }, - { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde07060504030201000f0e0d0c0b0a0908171615141312111000000000001a1918000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b000000000000000001", - "54777d6e31afa286ac6453272e941b20d7d85bab6289ea12f9c8fffbc56d27fb67df67484eae8ca22709162425b7d980b5e078605bda55c81dcab91ce391aa54", - 12 - }, - { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde07060504030201000f0e0d0c0b0a09081716151413121110000000001b1a1918000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c000000000000000001", - "052780a0caf0bd10793f8aaf9b3606e7a77506a8030a2cd764515ea4e30bb0bb6d6fb5ef88eed1246577e2e65a5477578930fc93e4f5a8c355eedfa133896315", + // https://tools.ietf.org/html/rfc7693#appendix-A + "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923", 12 }, { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a2928000000000000313000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2000000000000000001", - "fe47a4b9e2a1e7d01080ffe977223ee8aa7afa12ae75f3c26aa2687831a6a58c32cfc1fb690b7a3601630637eb345da575ba0e2310213d6f7cf5ac546fa52840", + // https://tools.ietf.org/html/rfc7693#appendix-A, not final + "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000", + "75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735", 12 }, { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a393847464544434241404f4e4d4c4b4a494857565554535251505f5e5d5c5b5a595867666564636261606f6e6d6c6b6a696877767574737271707f7e7d7c7b7a79780000000000000100000000000000000000", - "b02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d92", - 12 + // as above, but 8 million rounds. + "007a120048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "6d2ce9e534d50e18ff866ae92d70cceba79bbcd14c63819fe48752c8aca87a4bb7dcc230d22a4047f0486cfcfb50a17b24b2899eb8fca370f22240adb5170189", + 8_000_000 }, { - "0000000cb02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d9287868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e000000000000000e8000000000000000000000000000000000000000000000169000000000000000001", - "ca769859d42c76d4db449924feb8b27536b9da1f74ce7ad2eb0f4625e4c6cb160e1838ccade7d451567f4a02897cc47feae4fd8d87db1a19fe0e61a2f52322d6", - 12 + // empty + "", "", 0 }, { - "0000000cb02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d9287868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e800000000f3f2f1f000000000000000000000000000000174000000000000000001", - "8187dd8f261496b3d5b489bffe2c5e5134e626c210ab2b406c0dfb00e09a6b4eea800ec83e2fcb79168969f8d28019eb51653672749f2ebd37a823cad39c6416", - 12 + // too long + "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b6162630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000001", + "", + 0 }, { - "0000000cb02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d9287868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e8f7f6f5f4f3f2f1f000000000000000f80000000000000179000000000000000001", - "f5b5dbc5e76321b3ef75c8ead211dc1f7e0a0999767ecbbb5daf9507d5a8f87fcdf83e5498ffd974872785043dc19af8567417c800efe05637758ee39fd5e161", - 12 + // too short + "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b616263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000001", + "", + 0 }, { - "0000000cff3e48ac606d27242b6d0f03be548f10ff2d7f8bccfba4b872deac9005e263ebe6d620e38bba2bf133164736804d08f5dbf004f0c01f6df4bc02b6384c348cde07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a191827262524232221202f2e2d2c2b2a292837363534333231303f3e3d3c3b3a393847464544434241404f4e4d4c4b4a494857565554535251505f5e5d5c5b5a595867666564636261606f6e6d6c6b6a696877767574737271707f7e7d7c7b7a79780000000000000100000000000000000000", - "b02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d92", - 12 - }, - { - "0000000cb02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d9287868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e8f7f6f5f4f3f2f1f000fefdfcfbfaf9f8000000000000017f000000000000000001", - "ccfc282ed60927145b46f8d0fa97afd07010c51d20821e9748923ea42a37a0fa0609a13be7c1e14b6e10a4b63d85d1d56d3d370d80f97b0a61a4f22ed6462dee", - 12 - }, - { - "0000000cb02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d9287868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e8f7f6f5f4f3f2f1f000fefdfcfbfaf9f8000000000000017f000000000000000010", - "ccfc282ed60927145b46f8d0fa97afd07010c51d20821e9748923ea42a37a0fa0609a13be7c1e14b6e10a4b63d85d1d56d3d370d80f97b0a61a4f22ed6462dee", - 12 - }, - { - "0000000cb02406865b80cde9fec1e321559891be456158a6d71cf0eac1eb845c70d4a3d8948e82cc975dcbd6984780bab7e236382fb585df5bc4b043cb3e866544413d9287868584838281808f8e8d8c8b8a898897969594939291909f9e9d9c9b9a9998a7a6a5a4a3a2a1a0afaeadacabaaa9a8b7b6b5b4b3b2b1b0bfbebdbcbbbab9b8c7c6c5c4c3c2c1c0cfcecdcccbcac9c8d7d6d5d4d3d2d1d0dfdedddcdbdad9d8e7e6e5e4e3e2e1e0efeeedecebeae9e8f7f6f5f4f3f2f1f000fefdfcfbfaf9f8000000000000017f000000000000000011", - "ccfc282ed60927145b46f8d0fa97afd07010c51d20821e9748923ea42a37a0fa0609a13be7c1e14b6e10a4b63d85d1d56d3d370d80f97b0a61a4f22ed6462dee", - 12 + // bad final + "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000011", + "", + 0 }, }; }