Fix a buffer overflow in drbg_ctr_generate
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Tue, 2 Jun 2020 09:52:24 +0000 (11:52 +0200)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 3 Jun 2020 11:16:57 +0000 (13:16 +0200)
This can happen if the 32-bit counter overflows
and the last block is not a multiple of 16 bytes.

Fixes #12012

[extended tests]

Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
Reviewed-by: Patrick Steuer <patrick.steuer@de.ibm.com>
Reviewed-by: Kurt Roeckx <kurt@roeckx.be>
(Merged from https://github.com/openssl/openssl/pull/12016)

(cherry picked from commit 42fa3e66697baa121220b4eacf03607280e4ff89)

crypto/rand/drbg_ctr.c

index 89c9ccc876a85591a8a039f2761268885e9da22a..a757d0a258ab9dca4c8a2d4ca582818b64bf8696 100644 (file)
@@ -367,9 +367,11 @@ __owur static int drbg_ctr_generate(RAND_DRBG *drbg,
         ctr32 = GETU32(ctr->V + 12) + blocks;
         if (ctr32 < blocks) {
             /* 32-bit counter overflow into V. */
-            blocks -= ctr32;
-            buflen = blocks * 16;
-            ctr32 = 0;
+            if (ctr32 != 0) {
+                blocks -= ctr32;
+                buflen = blocks * 16;
+                ctr32 = 0;
+            }
             ctr96_inc(ctr->V);
         }
         PUTU32(ctr->V + 12, ctr32);