Fix various error codes to match functions.
[openssl.git] / crypto / dsa / dsa_gen.c
index 4b9aff3689c55d4b4a2dc46ee2c3914ff23a445e..6a6be3b57537d864aae8d49692f9abb63ee9e427 100644 (file)
@@ -69,6 +69,8 @@
 #define HASH    EVP_sha1()
 #endif 
 
+#include <openssl/opensslconf.h> /* To see if OPENSSL_NO_SHA is defined */
+
 #ifndef OPENSSL_NO_SHA
 
 #include <stdio.h>
@@ -109,7 +111,7 @@ static int dsa_builtin_paramgen(DSA *ret, int bits,
        int k,n=0,i,b,m=0;
        int counter=0;
        int r=0;
-       BN_CTX *ctx=NULL,*ctx2=NULL,*ctx3=NULL;
+       BN_CTX *ctx=NULL;
        unsigned int h=2;
 
        if (bits < 512) bits=512;
@@ -124,22 +126,21 @@ static int dsa_builtin_paramgen(DSA *ret, int bits,
                memcpy(seed,seed_in,seed_len);
 
        if ((ctx=BN_CTX_new()) == NULL) goto err;
-       if ((ctx2=BN_CTX_new()) == NULL) goto err;
-       if ((ctx3=BN_CTX_new()) == NULL) goto err;
 
        if ((mont=BN_MONT_CTX_new()) == NULL) goto err;
 
-       BN_CTX_start(ctx2);
-       r0 = BN_CTX_get(ctx2);
-       g = BN_CTX_get(ctx2);
-       W = BN_CTX_get(ctx2);
-       q = BN_CTX_get(ctx2);
-       X = BN_CTX_get(ctx2);
-       c = BN_CTX_get(ctx2);
-       p = BN_CTX_get(ctx2);
-       test = BN_CTX_get(ctx2);
-
-       BN_lshift(test,BN_value_one(),bits-1);
+       BN_CTX_start(ctx);
+       r0 = BN_CTX_get(ctx);
+       g = BN_CTX_get(ctx);
+       W = BN_CTX_get(ctx);
+       q = BN_CTX_get(ctx);
+       X = BN_CTX_get(ctx);
+       c = BN_CTX_get(ctx);
+       p = BN_CTX_get(ctx);
+       test = BN_CTX_get(ctx);
+
+       if (!BN_lshift(test,BN_value_one(),bits-1))
+               goto err;
 
        for (;;)
                {
@@ -182,7 +183,7 @@ static int dsa_builtin_paramgen(DSA *ret, int bits,
                        if (!BN_bin2bn(md,SHA_DIGEST_LENGTH,q)) goto err;
 
                        /* step 4 */
-                       r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx3,
+                       r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx,
                                        seed_is_random, cb);
                        if (r > 0)
                                break;
@@ -225,27 +226,27 @@ static int dsa_builtin_paramgen(DSA *ret, int bits,
                                /* step 8 */
                                if (!BN_bin2bn(md,SHA_DIGEST_LENGTH,r0))
                                        goto err;
-                               BN_lshift(r0,r0,160*k);
-                               BN_add(W,W,r0);
+                               if (!BN_lshift(r0,r0,160*k)) goto err;
+                               if (!BN_add(W,W,r0)) goto err;
                                }
 
                        /* more of step 8 */
-                       BN_mask_bits(W,bits-1);
-                       BN_copy(X,W); /* this should be ok */
-                       BN_add(X,X,test); /* this should be ok */
+                       if (!BN_mask_bits(W,bits-1)) goto err;
+                       if (!BN_copy(X,W)) goto err;
+                       if (!BN_add(X,X,test)) goto err;
 
                        /* step 9 */
-                       BN_lshift1(r0,q);
-                       BN_mod(c,X,r0,ctx);
-                       BN_sub(r0,c,BN_value_one());
-                       BN_sub(p,X,r0);
+                       if (!BN_lshift1(r0,q)) 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,
-                                               ctx3, 1, cb);
+                                               ctx, 1, cb);
                                if (r > 0)
                                                goto end; /* found it */
                                if (r != 0)
@@ -266,18 +267,18 @@ end:
 
        /* We now need to generate g */
        /* Set r0=(p-1)/q */
-       BN_sub(test,p,BN_value_one());
-       BN_div(r0,NULL,test,q,ctx);
+       if (!BN_sub(test,p,BN_value_one())) goto err;
+       if (!BN_div(r0,NULL,test,q,ctx)) goto err;
 
-       BN_set_word(test,h);
-       BN_MONT_CTX_set(mont,p,ctx);
+       if (!BN_set_word(test,h)) goto err;
+       if (!BN_MONT_CTX_set(mont,p,ctx)) goto err;
 
        for (;;)
                {
                /* g=test^r0%p */
-               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)) break;
-               BN_add(test,test,BN_value_one());
+               if (!BN_add(test,test,BN_value_one())) goto err;
                h++;
                }
 
@@ -294,17 +295,20 @@ err:
                ret->p=BN_dup(p);
                ret->q=BN_dup(q);
                ret->g=BN_dup(g);
+               if (ret->p == NULL || ret->q == NULL || ret->g == NULL)
+                       {
+                       ok=0;
+                       goto err;
+                       }
                if ((m > 1) && (seed_in != NULL)) memcpy(seed_in,seed,20);
                if (counter_ret != NULL) *counter_ret=counter;
                if (h_ret != NULL) *h_ret=h;
                }
-       if (ctx != NULL) BN_CTX_free(ctx);
-       if (ctx2 != NULL)
+       if(ctx)
                {
-               BN_CTX_end(ctx2);
-               BN_CTX_free(ctx2);
+               BN_CTX_end(ctx);
+               BN_CTX_free(ctx);
                }
-       if (ctx3 != NULL) BN_CTX_free(ctx3);
        if (mont != NULL) BN_MONT_CTX_free(mont);
        return ok;
        }