diff --git a/crypto/dsa/dsa_impl.c b/crypto/dsa/dsa_impl.c
index d7463d5..fd027b0 100644
--- a/crypto/dsa/dsa_impl.c
+++ b/crypto/dsa/dsa_impl.c
@@ -482,30 +482,35 @@
   qsize = qbits / 8;
 
   if (qsize != SHA_DIGEST_LENGTH && qsize != SHA224_DIGEST_LENGTH &&
-      qsize != SHA256_DIGEST_LENGTH)
+      qsize != SHA256_DIGEST_LENGTH) {
     /* invalid q size */
     return 0;
+  }
 
-  if (bits < 512)
+  if (bits < 512) {
     bits = 512;
+  }
 
   bits = (bits + 63) / 64 * 64;
 
   /* NB: seed_len == 0 is special case: copy generated seed to
    * seed_in if it is not NULL. */
-  if (seed_len && (seed_len < (size_t)qsize))
+  if (seed_len && (seed_len < (size_t)qsize)) {
     seed_in = NULL; /* seed buffer too small -- ignore */
-  if (seed_len > (size_t)qsize)
+  }
+  if (seed_len > (size_t)qsize) {
     seed_len = qsize; /* App. 2.2 of FIPS PUB 186 allows larger SEED,
                        * but our internal buffers are restricted to 160 bits*/
-  if (seed_in != NULL)
+  }
+  if (seed_in != NULL) {
     memcpy(seed, seed_in, seed_len);
+  }
 
-  if ((ctx = BN_CTX_new()) == NULL)
+  ctx = BN_CTX_new();
+  mont = BN_MONT_CTX_new();
+  if (ctx == NULL || mont == NULL) {
     goto err;
-
-  if ((mont = BN_MONT_CTX_new()) == NULL)
-    goto err;
+  }
 
   BN_CTX_start(ctx);
   r0 = BN_CTX_get(ctx);
@@ -517,17 +522,19 @@
   p = BN_CTX_get(ctx);
   test = BN_CTX_get(ctx);
 
-  if (!BN_lshift(test, BN_value_one(), bits - 1))
+  if (!BN_lshift(test, BN_value_one(), bits - 1)) {
     goto err;
+  }
 
   for (;;) {
-    for (;;) /* find q */
-    {
+    /* Find q. */
+    for (;;) {
       int seed_is_random;
 
       /* step 1 */
-      if (!BN_GENCB_call(cb, 0, m++))
+      if (!BN_GENCB_call(cb, 0, m++)) {
         goto err;
+      }
 
       if (!seed_len) {
         if (!RAND_bytes(seed, qsize)) {
@@ -543,39 +550,43 @@
       /* precompute "SEED + 1" for step 7: */
       for (i = qsize - 1; i < qsize; i--) {
         buf[i]++;
-        if (buf[i] != 0)
+        if (buf[i] != 0) {
           break;
+        }
       }
 
       /* step 2 */
-      if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL))
+      if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL) ||
+          !EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL)) {
         goto err;
-      if (!EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL))
-        goto err;
-      for (i = 0; i < qsize; i++)
+      }
+      for (i = 0; i < qsize; i++) {
         md[i] ^= buf2[i];
+      }
 
       /* step 3 */
       md[0] |= 0x80;
       md[qsize - 1] |= 0x01;
-      if (!BN_bin2bn(md, qsize, q))
+      if (!BN_bin2bn(md, qsize, q)) {
         goto err;
+      }
 
       /* step 4 */
       r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx, seed_is_random, cb);
-      if (r > 0)
+      if (r > 0) {
         break;
-      if (r != 0)
+      }
+      if (r != 0) {
         goto err;
+      }
 
       /* do a callback call */
       /* step 5 */
     }
 
-    if (!BN_GENCB_call(cb, 2, 0))
+    if (!BN_GENCB_call(cb, 2, 0) || !BN_GENCB_call(cb, 3, 0)) {
       goto err;
-    if (!BN_GENCB_call(cb, 3, 0))
-      goto err;
+    }
 
     /* step 6 */
     counter = 0;
@@ -584,8 +595,9 @@
     n = (bits - 1) / 160;
 
     for (;;) {
-      if ((counter != 0) && !BN_GENCB_call(cb, 0, counter))
+      if ((counter != 0) && !BN_GENCB_call(cb, 0, counter)) {
         goto err;
+      }
 
       /* step 7 */
       BN_zero(W);
@@ -594,48 +606,48 @@
         /* obtain "SEED + offset + k" by incrementing: */
         for (i = qsize - 1; i < qsize; i--) {
           buf[i]++;
-          if (buf[i] != 0)
+          if (buf[i] != 0) {
             break;
+          }
         }
 
-        if (!EVP_Digest(buf, qsize, md, NULL, evpmd, NULL))
+        if (!EVP_Digest(buf, qsize, md, NULL, evpmd, NULL)) {
           goto err;
+        }
 
         /* step 8 */
-        if (!BN_bin2bn(md, qsize, r0))
+        if (!BN_bin2bn(md, qsize, r0) ||
+            !BN_lshift(r0, r0, (qsize << 3) * k) ||
+            !BN_add(W, W, r0)) {
           goto err;
-        if (!BN_lshift(r0, r0, (qsize << 3) * k))
-          goto err;
-        if (!BN_add(W, W, r0))
-          goto err;
+        }
       }
 
       /* more of step 8 */
-      if (!BN_mask_bits(W, bits - 1))
+      if (!BN_mask_bits(W, bits - 1) ||
+          !BN_copy(X, W) ||
+          !BN_add(X, X, test)) {
         goto err;
-      if (!BN_copy(X, W))
-        goto err;
-      if (!BN_add(X, X, test))
-        goto err;
+      }
 
       /* step 9 */
-      if (!BN_lshift1(r0, q))
+      if (!BN_lshift1(r0, q) ||
+          !BN_mod(c, X, r0, ctx) ||
+          !BN_sub(r0, c, BN_value_one()) ||
+          !BN_sub(p, X, r0)) {
         goto err;
-      if (!BN_mod(c, X, r0, ctx))
-        goto err;
-      if (!BN_sub(r0, c, BN_value_one()))
-        goto err;
-      if (!BN_sub(p, X, r0))
-        goto err;
+      }
 
       /* step 10 */
       if (BN_cmp(p, test) >= 0) {
         /* step 11 */
         r = BN_is_prime_fasttest_ex(p, DSS_prime_checks, ctx, 1, cb);
-        if (r > 0)
+        if (r > 0) {
           goto end; /* found it */
-        if (r != 0)
+        }
+        if (r != 0) {
           goto err;
+        }
       }
 
       /* step 13 */
@@ -643,50 +655,59 @@
       /* "offset = offset + n + 1" */
 
       /* step 14 */
-      if (counter >= 4096)
+      if (counter >= 4096) {
         break;
+      }
     }
   }
 end:
-  if (!BN_GENCB_call(cb, 2, 1))
+  if (!BN_GENCB_call(cb, 2, 1)) {
     goto err;
+  }
 
   /* We now need to generate g */
   /* Set r0=(p-1)/q */
-  if (!BN_sub(test, p, BN_value_one()))
+  if (!BN_sub(test, p, BN_value_one()) ||
+      !BN_div(r0, NULL, test, q, ctx)) {
     goto err;
-  if (!BN_div(r0, NULL, test, q, ctx))
-    goto err;
+  }
 
-  if (!BN_set_word(test, h))
+  if (!BN_set_word(test, h) ||
+      !BN_MONT_CTX_set(mont, p, ctx)) {
     goto err;
-  if (!BN_MONT_CTX_set(mont, p, ctx))
-    goto err;
+  }
 
   for (;;) {
     /* g=test^r0%p */
-    if (!BN_mod_exp_mont(g, test, r0, p, ctx, mont))
+    if (!BN_mod_exp_mont(g, test, r0, p, ctx, mont)) {
       goto err;
-    if (!BN_is_one(g))
+    }
+    if (!BN_is_one(g)) {
       break;
-    if (!BN_add(test, test, BN_value_one()))
+    }
+    if (!BN_add(test, test, BN_value_one())) {
       goto err;
+    }
     h++;
   }
 
-  if (!BN_GENCB_call(cb, 3, 1))
+  if (!BN_GENCB_call(cb, 3, 1)) {
     goto err;
+  }
 
   ok = 1;
 
 err:
   if (ok) {
-    if (ret->p)
+    if (ret->p) {
       BN_free(ret->p);
-    if (ret->q)
+    }
+    if (ret->q) {
       BN_free(ret->q);
-    if (ret->g)
+    }
+    if (ret->g) {
       BN_free(ret->g);
+    }
     ret->p = BN_dup(p);
     ret->q = BN_dup(q);
     ret->g = BN_dup(g);
@@ -694,10 +715,12 @@
       ok = 0;
       goto err;
     }
-    if (counter_ret != NULL)
+    if (counter_ret != NULL) {
       *counter_ret = counter;
-    if (h_ret != NULL)
+    }
+    if (h_ret != NULL) {
       *h_ret = h;
+    }
   }
 
   if (ctx) {
@@ -705,8 +728,9 @@
     BN_CTX_free(ctx);
   }
 
-  if (mont != NULL)
+  if (mont != NULL) {
     BN_MONT_CTX_free(mont);
+  }
 
   return ok;
 }
