From c33fa05d192bc78399ea08964c852f45aaba4417 Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Fri, 19 Jul 2019 20:54:39 +0100 Subject: [PATCH] Creates incorrect MD5 hash for some files (#103) * [core] Add test file that we create incorrect hash for By 'incorrect' we mean "not what AWS S3 think is correct" for this file. * [domain] HexEncoder rewritten to correctly decode hex * [domain] HexEncoder encode to uppercase --- .../net/kemitix/thorp/core/File-6964 | Bin 0 -> 48390 bytes .../net/kemitix/thorp/domain/HexEncoder.scala | 22 ++++++++--------- .../kemitix/thorp/domain/HexEncoderTest.scala | 23 ++++++++++++++++++ 3 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 core/src/test/resources/net/kemitix/thorp/core/File-6964 create mode 100644 domain/src/test/scala/net/kemitix/thorp/domain/HexEncoderTest.scala diff --git a/core/src/test/resources/net/kemitix/thorp/core/File-6964 b/core/src/test/resources/net/kemitix/thorp/core/File-6964 new file mode 100644 index 0000000000000000000000000000000000000000..bd24b2bdf2f4bb494a9ee6a701f0f4f20cef883e GIT binary patch literal 48390 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 literal 0 HcmV?d00001 diff --git a/domain/src/main/scala/net/kemitix/thorp/domain/HexEncoder.scala b/domain/src/main/scala/net/kemitix/thorp/domain/HexEncoder.scala index 17a8495..b6fbda8 100644 --- a/domain/src/main/scala/net/kemitix/thorp/domain/HexEncoder.scala +++ b/domain/src/main/scala/net/kemitix/thorp/domain/HexEncoder.scala @@ -4,19 +4,17 @@ import java.math.BigInteger trait HexEncoder { - def encode(bytes: Array[Byte]): String = { - val bigInteger = new BigInteger(1, bytes) - String.format("%0" + (bytes.length << 1) + "x", bigInteger) - } + def encode(bytes: Array[Byte]): String = + String + .format("%0" + (bytes.length << 1) + "x", new BigInteger(1, bytes)) + .toUpperCase - def decode(hexString: String): Array[Byte] = { - val byteArray = new BigInteger(hexString, 16).toByteArray - if (byteArray(0) == 0) { - val output = new Array[Byte](byteArray.length - 1) - System.arraycopy(byteArray, 1, output, 0, output.length) - output - } else byteArray - } + def decode(hexString: String): Array[Byte] = + hexString + .replaceAll("[^0-9A-Fa-f]", "") + .sliding(2, 2) + .toArray + .map(Integer.parseInt(_, 16).toByte) } diff --git a/domain/src/test/scala/net/kemitix/thorp/domain/HexEncoderTest.scala b/domain/src/test/scala/net/kemitix/thorp/domain/HexEncoderTest.scala new file mode 100644 index 0000000..93f8f59 --- /dev/null +++ b/domain/src/test/scala/net/kemitix/thorp/domain/HexEncoderTest.scala @@ -0,0 +1,23 @@ +package net.kemitix.thorp.domain + +import java.nio.charset.StandardCharsets + +import org.scalatest.FreeSpec + +class HexEncoderTest extends FreeSpec { + + val text = "test text to encode to hex" + val hex = "74657374207465787420746F20656E636F646520746F20686578" + + "can round trip a hash decode then encode" in { + val input = hex + val result = HexEncoder.encode(HexEncoder.decode(input)) + assertResult(input)(result) + } + "can round trip a hash encode then decode" in { + val input = hex.getBytes(StandardCharsets.UTF_8) + val result = HexEncoder.decode(HexEncoder.encode(input)) + assertResult(input)(result) + } + +}