diff --git a/scrypt/scrypt.go b/scrypt/scrypt.go index 76fa40f..b422b7d 100644 --- a/scrypt/scrypt.go +++ b/scrypt/scrypt.go @@ -196,6 +196,9 @@ func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { if N <= 1 || N&(N-1) != 0 { return nil, errors.New("scrypt: N must be > 1 and a power of 2") } + if r <= 0 || p <= 0 { + return nil, errors.New("scrypt: parameters must be > 0") + } if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { return nil, errors.New("scrypt: parameters are too large") } diff --git a/scrypt/scrypt_test.go b/scrypt/scrypt_test.go index 766ed8d..8a4637f 100644 --- a/scrypt/scrypt_test.go +++ b/scrypt/scrypt_test.go @@ -133,6 +133,10 @@ var bad = []testVector{ {"p", "s", 1, 1, 1, nil}, // N == 1 {"p", "s", 7, 8, 1, nil}, // N is not power of 2 {"p", "s", 16, maxInt / 2, maxInt / 2, nil}, // p * r too large + {"p", "s", 2, 0, 1, nil}, // r too small + {"p", "s", 2, 1, 0, nil}, // p too small + {"p", "s", 2, -1, 1, nil}, // r is negative + {"p", "s", 2, 1, -1, nil}, // p is negative } func TestKey(t *testing.T) {