The do-while loop that uses BN_rand_range to set the private key is 
outside of and following the block that tests if the private key is set. 
This results in the private key always being set to a random value even 
when a private key has been provided. The proposed patch is to move the 
do-while loop inside the private key test for NULL block. See attached.

int EC_KEY_generate_key(EC_KEY *eckey)
        {       
        int     ok = 0;
        BN_CTX  *ctx = NULL;
        BIGNUM  *priv_key = NULL, *order = NULL;
        EC_POINT *pub_key = NULL;

#ifdef OPENSSL_FIPS
        if (FIPS_mode())
                return FIPS_ec_key_generate_key(eckey);
#endif

        if (!eckey || !eckey->group)
                {
                ECerr(EC_F_EC_KEY_GENERATE_KEY, ERR_R_PASSED_NULL_PARAMETER);
                return 0;
                }

        if ((order = BN_new()) == NULL) goto err;
        if ((ctx = BN_CTX_new()) == NULL) goto err;

        if (eckey->priv_key == NULL)
                {
                priv_key = BN_new();
                if (priv_key == NULL)
                        goto err;

                do
                        if (!BN_rand_range(priv_key, order))
                                goto err;
                while (BN_is_zero(priv_key));
                }
        else
                priv_key = eckey->priv_key;

        if (!EC_GROUP_get_order(eckey->group, order, ctx))
                goto err;

        if (eckey->pub_key == NULL)
                {
                pub_key = EC_POINT_new(eckey->group);
                if (pub_key == NULL)
                        goto err;
                }
        else
                pub_key = eckey->pub_key;

        if (!EC_POINT_mul(eckey->group, pub_key, priv_key, NULL, NULL, ctx))
                goto err;

        eckey->priv_key = priv_key;
        eckey->pub_key  = pub_key;

        ok=1;

err:    
        if (order)
                BN_free(order);
        if (pub_key  != NULL && eckey->pub_key  == NULL)
                EC_POINT_free(pub_key);
        if (priv_key != NULL && eckey->priv_key == NULL)
                BN_free(priv_key);
        if (ctx != NULL)
                BN_CTX_free(ctx);
        return(ok);
        }
_______________________________________________
openssl-dev mailing list
openssl-dev@openssl.org
https://mta.opensslfoundation.net/mailman/listinfo/openssl-dev

Reply via email to