On Wed, Feb 2, 2022 at 4:41 AM 'Viktor Grigorov' via Programming <[email protected]> wrote: > I wanted to see if J could be faster than bespoke C programs (specifically > aircrack-ng, ~10k/s on my machine). > From the wiki pages for SHA1 (turns outs there exists a foreign so I dropped > it), HMAC, and PBKDF2I assembled: > sha1=:1&(128!:6) > bs=:512%8 NB. block size in bytes for md5, sha1, sha224, sha256 > opad=:bs(([,(#@]))$])0 1 0 1 1 1 0 0 NB. 0x5c, outer padding byte up to block > size > ipad=:bs(([,(#@]))$])0 0 1 1 0 1 1 0 NB. 0x36, inner padding byte up to block > size > > hmac=:{{)a NB. assuming y of form 'key';'msg' > if.bs&<@#key=.{.>y do.key=.u key end. NB. use hash of key as key, if greater > than block size > key=.((],(((bs&-@#),8:)$0:))@((8:#2:)#:(a.&i.)))key NB. pad 0s to right up to > block size; do 8 bits of ascii > u(({&a.@#.(key~:opad)),u(({&a.@#.(key~:ipad)),{:>y)) > }} > > sha1 hmac 'key';';msg' > I am getting the wrong hashes back with examples from the wiki examples, ones > generated from https://cryptotools.net/hmac What exactly am I missing?
One issue (not the only issue) I think has to do with how you pad the key. If I understand https://en.wikipedia.org/wiki/HMAC correctly, this will pad the key: padkey=: {{ if.x < # y do. u y else. x{.y,x#{.a. end. }} And, I should expect that sha1 hmac (bs sha1 padkey 'key');';msg' would have the same result as sha1 hmac 'key';';msg' I haven't looked any deeper than this, here. Good luck, -- Raul ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
