cosmjs icon indicating copy to clipboard operation
cosmjs copied to clipboard

Add custom argon2 Wasm implementation

Open webmaster128 opened this issue 4 years ago • 2 comments

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)

webmaster128 avatar Oct 19 '21 22:10 webmaster128

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)

webmaster128 avatar Feb 06 '22 22:02 webmaster128

https://github.com/paulmillr/noble-hashes#argon2

o-az avatar May 03 '24 03:05 o-az