Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial implementation of multibase encoding #1019

Merged
merged 7 commits into from
Jan 29, 2025
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: extend sha3 access to zencode and use reentrant init method
jaromil committed Jan 29, 2025
commit b0354a01a264d6f05116f4fd828ac2a98a2b8257
5 changes: 4 additions & 1 deletion src/lua/zencode_hash.lua
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@
local valid_hashes <const> = {
sha256 = true,
sha512 = true,
sha3_256 = true,
sha3_512 = true,
shake256 = true,
keccak256 = true
}
@@ -35,7 +37,8 @@ local function _hash(s, n)
src = zencode_serialize(src)
if not valid_hashes[n] then error("Hash algorithm not known: ".. n) end
-- from init: HASH = require('zenroom_hash')
ACK.hash = HASH[n](src)
local _hf <const> = HASH:init(n)
ACK.hash = _hf:process(src)
new_codec('hash', { zentype = 'e' })
end

34 changes: 17 additions & 17 deletions src/lua/zenroom_hash.lua
Original file line number Diff line number Diff line change
@@ -25,52 +25,52 @@ local hash = require'hash'
-- cache storing initialized tables for reuse
hash.cache = { }

local function init(name)
function hash:init(name)
local res
if hash.cache[name] then
res = hash.cache[name]
if self.cache[name] then
res = self.cache[name]
else
res = hash.new(name)
hash.cache[name] = res
res = self.new(name)
self.cache[name] = res
end
return res
end

-- easy to use calls
function sha256(data) return init("sha256"):process(data) end
function sha512(data) return init("sha512"):process(data) end
function sha3_256(data) return init("sha256"):process(data) end
function sha3_512(data) return init("sha512"):process(data) end
function sha256(data) return hash:init("sha256"):process(data) end
function sha512(data) return hash:init("sha512"):process(data) end
function sha3_256(data) return hash:init("sha256"):process(data) end
function sha3_512(data) return hash:init("sha512"):process(data) end
hash.sha256 = sha256
hash.sha512 = sha512
hash.sha3_256 = sha3_256
hash.sha3_512 = sha3_512

hash.shake256 = function(data, len) return init("shake256"):process(data, len or 32) end
hash.keccak256 = function(data) return init("keccak256"):process(data) end
hash.shake256 = function(data, len) return hash:init("shake256"):process(data, len or 32) end
hash.keccak256 = function(data) return hash:init("keccak256"):process(data) end

function KDF(data, bits) return init("sha"..tostring(bits or 256)):kdf2(data) end
function KDF(data, bits) return hash:init("sha"..tostring(bits or 256)):kdf2(data) end

function hash.dsha256(msg)
local _SHA256 <const> = init'sha256'
local _SHA256 <const> = hash:init'sha256'
return _SHA256:process(_SHA256:process(msg))
end

function hash.hash160(msg)
local _SHA256 <const> = init'sha256'
local _RMD160 <const> = init'ripemd160'
local _SHA256 <const> = hash:init'sha256'
local _RMD160 <const> = hash:init'ripemd160'
return _RMD160:process(_SHA256:process(msg))

end

--used in BBS+ signature
hash.hkdf_extract = function(salt, ikm)
return HASH.hmac(init'sha256', salt, ikm)
return HASH.hmac(hash:init'sha256', salt, ikm)
end

--used in BBS+ signature
hash.hkdf_expand = function(prk, info, l)
local h = init'sha256'
local h = hash:init'sha256'
local hash_len = 32
assert(#prk >= hash_len)
assert(l <= 255 * hash_len)