crypto: drbg - fix drbg_generate return val check
authorStephan Mueller <smueller@chronox.de>
Sat, 18 Apr 2015 17:35:45 +0000 (19:35 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 21 Apr 2015 01:14:45 +0000 (09:14 +0800)
The drbg_generate returns 0 in success case. That means that
drbg_generate_long will always only generate drbg_max_request_bytes at
most. Longer requests will be truncated to drbg_max_request_bytes.

Reported-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/drbg.c

index 8d2944fab8e84f4e484a1478aac1c16206914938..5a218a5c9b9cb613b6eaaab3897f5ff4e9000b62 100644 (file)
@@ -1442,19 +1442,19 @@ static int drbg_generate_long(struct drbg_state *drbg,
                              unsigned char *buf, unsigned int buflen,
                              struct drbg_string *addtl)
 {
-       int len = 0;
+       unsigned int len = 0;
        unsigned int slice = 0;
        do {
-               int tmplen = 0;
+               int err = 0;
                unsigned int chunk = 0;
                slice = ((buflen - len) / drbg_max_request_bytes(drbg));
                chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len);
-               tmplen = drbg_generate(drbg, buf + len, chunk, addtl);
-               if (0 >= tmplen)
-                       return tmplen;
-               len += tmplen;
+               err = drbg_generate(drbg, buf + len, chunk, addtl);
+               if (0 > err)
+                       return err;
+               len += chunk;
        } while (slice > 0 && (len < buflen));
-       return len;
+       return 0;
 }
 
 /*