Skip to content

scrypt: remove incorrect N upper-bound check from Params::new#867

Merged
tarcieri merged 1 commit intoRustCrypto:masterfrom
smessmer:scrypt-params
Mar 28, 2026
Merged

scrypt: remove incorrect N upper-bound check from Params::new#867
tarcieri merged 1 commit intoRustCrypto:masterfrom
smessmer:scrypt-params

Conversation

@smessmer
Copy link
Copy Markdown
Contributor

RFC 7914 specifies N < 2^(128 * r / 8), i.e. log_n < r * 16, but this constraint contains a unit error: a bit count was treated as a byte count. The correct bound from the original scrypt paper is N < 2^(128*r), which far exceeds any practical parameter value.

The incorrect check rejected valid parameters such as log_n=18 with r=1 (used in Ethereum test vectors) and log_n=20 with r=1.

This aligns with the Tarsnap reference implementation and Go's x/crypto/scrypt, both of which omit this check.

Fixes: #866
Fixes: #546
See also: https://www.rfc-editor.org/errata/eid5971

RFC 7914 specifies `N < 2^(128 * r / 8)`, i.e. `log_n < r * 16`, but
this constraint contains a unit error: a bit count was treated as a byte
count. The correct bound from the original scrypt paper is `N < 2^(128*r)`,
which far exceeds any practical parameter value.

The incorrect check rejected valid parameters such as log_n=18 with r=1
(used in Ethereum test vectors) and log_n=20 with r=1.

This aligns with the Tarsnap reference implementation and Go's
x/crypto/scrypt, both of which omit this check.
@tarcieri tarcieri merged commit 8eddee8 into RustCrypto:master Mar 28, 2026
16 checks passed
@smessmer smessmer deleted the scrypt-params branch March 28, 2026 16:21
@tarcieri tarcieri mentioned this pull request Apr 21, 2026
tarcieri added a commit that referenced this pull request Apr 22, 2026
## Added
- Implement `PartialEq` for `scrypt::Params` (#490)
- `Params::n` method (#544)
- `parallel` feature using `rayon` (#733, #785)
- `mcf` feature for Modular Crypt Format support (#781, #806)
- SSE2/simd128 `RoMix` data layout optimization (#622)
- Customizable `Params` for `Scrypt` type (#797)
- Implement `kdf::{Kdf, Pbkdf}` for `Scrypt` (#823)

## Changed
- Make methods of `scrypt::Params` into `const fn` (#508)
- Bump edition to 2024; MSRV 1.85 (#563)
- Split `Params::new` and `Params::new_with_output_len` (#602)
- Use the `phc` crate for `PasswordHash` and related types (#761)
- Switch from `std::error::Error` to `core::error::Error` (#767)
- Rename `simple` feature to `phc` (#776)
- Migrate from `subtle` to `ctutils` (#845)
- Bump `password-hash` dependency to v0.6 (#848)
- Bump `sha2` to v0.11 (#872)
- Bump `salsa20` dependency to v0.11 (#875)
- Bump `pbkdf2` dependency to v0.13 (#885)

## Removed
- `Display` and `FromStr` impls for `Params` (#824)
- Incorrect `N` upper-bound check from `Params::new` (#867)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

scrypt: Params::new rejects valid scrypt parameters due to an incorrect constraint copied from RFC 7914 scrypt: relax check on log_n

2 participants