Guard division by zero in SCrypt verification.
authorFelix Dörre <felix@dogcraft.de>
Sat, 28 Feb 2015 22:10:48 +0000 (23:10 +0100)
committerFelix Dörre <felix@dogcraft.de>
Sat, 28 Feb 2015 22:51:13 +0000 (23:51 +0100)
lib/scrypt/com/lambdaworks/crypto/SCrypt.java
lib/scrypt/com/lambdaworks/crypto/SCryptUtil.java

index 9b21297..f2e9789 100644 (file)
@@ -103,6 +103,12 @@ public class SCrypt {
         if (N < 2 || (N & (N - 1)) != 0) {
             throw new IllegalArgumentException("N must be a power of 2 greater than 1");
         }
+        if (r <= 0) {
+            throw new IllegalArgumentException("Parameter r zero or negative");
+        }
+        if (p <= 0) {
+            throw new IllegalArgumentException("Parameter p zero or negative");
+        }
 
         if (N > MAX_VALUE / 128 / r) {
             throw new IllegalArgumentException("Parameter N is too large");
index 6d79400..808d69f 100644 (file)
@@ -89,6 +89,9 @@ public class SCryptUtil {
             int N = (int) Math.pow(2, params >> 16 & 0xffff);
             int r = (int) params >> 8 & 0xff;
             int p = (int) params & 0xff;
+            if (r == 0 || p == 0) {
+                return false;
+            }
 
             byte[] derived1 = SCrypt.scrypt(passwd.getBytes("UTF-8"), salt, N, r, p, 32);