local _M = {} local basexx = require("basexx") local hasher = require("hasher") -- parse any skylink and return base64 version function _M.parse(skylink) if string.len(skylink) == 55 then local decoded = basexx.from_basexx(string.upper(skylink), "0123456789ABCDEFGHIJKLMNOPQRSTUV", 5) return basexx.to_url64(decoded) end return skylink end -- hash skylink into 32 bytes hash used in blocklist function _M.hash(skylink) -- ensure that the skylink is base64 encoded local base64Skylink = _M.parse(skylink) -- decode skylink from base64 encoding local rawSkylink = basexx.from_url64(base64Skylink) -- drop first two bytes and leave just merkle root local rawMerkleRoot = string.sub(rawSkylink, 3) -- parse with blake2b with key length of 32 local blake2bHashed = hasher.blake2b(rawMerkleRoot, 32) -- hex encode the blake hash local hexHashed = basexx.to_hex(blake2bHashed) -- lowercase the hex encoded hash local lowerHexHashed = string.lower(hexHashed) return lowerHexHashed end return _M