Fix a SCA leak in BN_generate_dsa_nonce
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Fri, 6 Sep 2019 06:46:46 +0000 (08:46 +0200)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Fri, 6 Sep 2019 16:41:33 +0000 (18:41 +0200)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Nicola Tuveri <nic.tuv@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/9782)

(cherry picked from commit 31ca19403d56ad71d823cf62990518dfc6905bb4)

crypto/bn/bn_rand.c

index 9ce4c5f6064515dae98dfb67ab6ff081556781bb..bff1d249afb3f3472bad68f21d7728176216704d 100644 (file)
@@ -215,8 +215,7 @@ int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range,
         goto err;
 
     /* We copy |priv| into a local buffer to avoid exposing its length. */
-    todo = sizeof(priv->d[0]) * priv->top;
-    if (todo > sizeof(private_bytes)) {
+    if (BN_bn2binpad(priv, private_bytes, sizeof(private_bytes)) < 0) {
         /*
          * No reasonable DSA or ECDSA key should have a private key this
          * large and we don't handle this case in order to avoid leaking the
@@ -225,8 +224,6 @@ int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range,
         BNerr(BN_F_BN_GENERATE_DSA_NONCE, BN_R_PRIVATE_KEY_TOO_LARGE);
         goto err;
     }
-    memcpy(private_bytes, priv->d, todo);
-    memset(private_bytes + todo, 0, sizeof(private_bytes) - todo);
 
     for (done = 0; done < num_k_bytes;) {
         if (RAND_bytes(random_bytes, sizeof(random_bytes)) != 1)