diff --git a/Blockchain/Package.resolved b/Blockchain/Package.resolved index f5b4d6bb..c1ecb744 100644 --- a/Blockchain/Package.resolved +++ b/Blockchain/Package.resolved @@ -10,6 +10,15 @@ "revision" : "679ee7d35e493e181be844dadbe78636cefaace4" } }, + { + "identity" : "blake2.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tesseract-one/Blake2.swift.git", + "state" : { + "revision" : "29c55c8fe42d6661e5a32cc5bbbad1fff64fd01e", + "version" : "0.2.0" + } + }, { "identity" : "scalecodec.swift", "kind" : "remoteSourceControl", diff --git a/Boka/Package.resolved b/Boka/Package.resolved index addc9220..09bc5c03 100644 --- a/Boka/Package.resolved +++ b/Boka/Package.resolved @@ -10,6 +10,15 @@ "revision" : "679ee7d35e493e181be844dadbe78636cefaace4" } }, + { + "identity" : "blake2.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tesseract-one/Blake2.swift.git", + "state" : { + "revision" : "29c55c8fe42d6661e5a32cc5bbbad1fff64fd01e", + "version" : "0.2.0" + } + }, { "identity" : "scalecodec.swift", "kind" : "remoteSourceControl", diff --git a/Node/Package.resolved b/Node/Package.resolved index 39c28070..d291b259 100644 --- a/Node/Package.resolved +++ b/Node/Package.resolved @@ -10,6 +10,15 @@ "revision" : "679ee7d35e493e181be844dadbe78636cefaace4" } }, + { + "identity" : "blake2.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tesseract-one/Blake2.swift.git", + "state" : { + "revision" : "29c55c8fe42d6661e5a32cc5bbbad1fff64fd01e", + "version" : "0.2.0" + } + }, { "identity" : "scalecodec.swift", "kind" : "remoteSourceControl", diff --git a/Utils/Package.resolved b/Utils/Package.resolved index 99da95e3..37ec4736 100644 --- a/Utils/Package.resolved +++ b/Utils/Package.resolved @@ -1,6 +1,15 @@ { - "originHash" : "20e3a243ff55bca06efe38725567e64612fcf69c4836f7018fbfb322bcf6d466", + "originHash" : "7f9d01d4c8c5ccb64f9b9f466f7f8e61b0fd8cd435aa5c4e587e5a6e459f5d77", "pins" : [ + { + "identity" : "blake2.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tesseract-one/Blake2.swift.git", + "state" : { + "revision" : "29c55c8fe42d6661e5a32cc5bbbad1fff64fd01e", + "version" : "0.2.0" + } + }, { "identity" : "scalecodec.swift", "kind" : "remoteSourceControl", diff --git a/Utils/Package.swift b/Utils/Package.swift index a3c5d357..40e1380d 100644 --- a/Utils/Package.swift +++ b/Utils/Package.swift @@ -17,6 +17,7 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/tesseract-one/ScaleCodec.swift.git", from: "0.3.0"), + .package(url: "https://github.com/tesseract-one/Blake2.swift.git", from: "0.2.0"), .package(url: "https://github.com/apple/swift-crypto.git", "1.0.0" ..< "4.0.0"), ], targets: [ @@ -26,6 +27,7 @@ let package = Package( name: "Utils", dependencies: [ .product(name: "ScaleCodec", package: "ScaleCodec.swift"), + .product(name: "Blake2", package: "Blake2.swift"), .product(name: "Crypto", package: "swift-crypto"), ] ), diff --git a/Utils/Sources/Utils/Extensions.swift b/Utils/Sources/Utils/Extensions.swift new file mode 100644 index 00000000..f26f1a91 --- /dev/null +++ b/Utils/Sources/Utils/Extensions.swift @@ -0,0 +1,25 @@ +import Foundation + +extension Data { + init?(fromHexString hexString: String) { + guard !hexString.isEmpty else { + return nil + } + + var data = Data() + var index = hexString.startIndex + + while index < hexString.endIndex { + guard let nextIndex = hexString.index(index, offsetBy: 2, limitedBy: hexString.endIndex), + let byte = UInt8(hexString[index ..< nextIndex], radix: 16) + else { + return nil + } + + data.append(byte) + index = nextIndex + } + + self.init(data) + } +} diff --git a/Utils/Sources/Utils/hashing.swift b/Utils/Sources/Utils/hashing.swift new file mode 100644 index 00000000..3b9f988c --- /dev/null +++ b/Utils/Sources/Utils/hashing.swift @@ -0,0 +1,13 @@ +import Blake2 +import Foundation + +/// Computes a Blake2b 256-bit hash of the input data and returns the result as a `Data32`. +/// +/// - Parameter: The input data to hash. +/// - Throws: An error if the hashing process fails. +/// - Returns: A `Data32` containing the hash result. +public func blake2b256(_ data: Data) throws -> Data32 { + let hash = try Blake2b.hash(size: 32, data: data) + let data32 = Data32(hash)! + return data32 +} diff --git a/Utils/Tests/UtilsTests/Blake2Tests.swift b/Utils/Tests/UtilsTests/Blake2Tests.swift new file mode 100644 index 00000000..ab925efc --- /dev/null +++ b/Utils/Tests/UtilsTests/Blake2Tests.swift @@ -0,0 +1,12 @@ +import XCTest + +@testable import Utils + +final class Blake2Tests: XCTestCase { + func testBlake2b256Test() throws { + let testData = Data("test".utf8) + let expected = Data(fromHexString: "928b20366943e2afd11ebc0eae2e53a93bf177a4fcf35bcc64d503704e65e202") + let actual = try blake2b256(testData) + XCTAssertEqual(expected, actual.data) + } +}