cosmjs
cosmjs copied to clipboard
Add custom argon2 Wasm implementation
An attempt to replace Argon2 from libsodium.js with the argon2 crate.
Local benchmarks show this makes things significantly slower:
This PR (argon2 crate):
5.1 Argon2id
✓ works for 1 MiB memory and opsLimit = 5 (0.177 sec)
✓ works for 8 MiB memory and opsLimit = 2 (0.531 sec)
✓ works for 10 MiB memory and opsLimit = 1 (0.368 sec)
✓ works for different output lengths (0.338 sec)
✓ throw for invalid salt lengths (0.001 sec)
main (libsodium.js):
5.1 Argon2id
✓ works for 1 MiB memory and opsLimit = 5 (0.06 sec)
✓ works for 8 MiB memory and opsLimit = 2 (0.186 sec)
✓ works for 10 MiB memory and opsLimit = 1 (0.115 sec)
✓ works for different output lengths (0.116 sec)
✓ throw for invalid salt lengths (0 sec)
In CI
This PR (argon2 crate):
➤ YN0000: [@cosmjs/crypto]: 5.1 Argon2id
➤ YN0000: [@cosmjs/crypto]: ✓ works for 1 MiB memory and opsLimit = 5 (0.302 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ works for 8 MiB memory and opsLimit = 2 (1 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ works for 10 MiB memory and opsLimit = 1 (0.668 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ works for different output lengths (0.622 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ throw for invalid salt lengths (0.001 sec)
main (libsodium.js):
➤ YN0000: [@cosmjs/crypto]: 5.1 Argon2id
➤ YN0000: [@cosmjs/crypto]: ✓ works for 1 MiB memory and opsLimit = 5 (0.084 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ works for 8 MiB memory and opsLimit = 2 (0.279 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ works for 10 MiB memory and opsLimit = 1 (0.167 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ works for different output lengths (0.288 sec)
➤ YN0000: [@cosmjs/crypto]: ✓ throw for invalid salt lengths (0.002 sec)
With the latest Rust compiler the results are even now:
main (libsodium.js):
5.1 Argon2id
✓ works for 1 MiB memory and opsLimit = 5 (0.031 sec)
✓ works for 8 MiB memory and opsLimit = 2 (0.092 sec)
✓ works for 10 MiB memory and opsLimit = 1 (0.057 sec)
✓ works for different output lengths (0.058 sec)
✓ throw for invalid salt lengths (0 sec)
This PR (argon2 crate):
5.1 Argon2id
✓ works for 1 MiB memory and opsLimit = 5 (0.03 sec)
✓ works for 8 MiB memory and opsLimit = 2 (0.094 sec)
✓ works for 10 MiB memory and opsLimit = 1 (0.059 sec)
✓ works for different output lengths (0.057 sec)
✓ throw for invalid salt lengths (0.001 sec)
https://github.com/paulmillr/noble-hashes#argon2