Commit 6be18a22 authored by Rich Salz's avatar Rich Salz Committed by Rich Salz
Browse files

This undoes GH367 for non-master



Was only approved for master, to avoid compatibility issues on
previous releases.

Reviewed-by: default avatarEmilia Käsper <emilia@openssl.org>
parent 197db214
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -163,15 +163,18 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,

    bits = (bits + 63) / 64 * 64;

    if (seed_in != NULL) {
        if (seed_len < (size_t)qsize)
            return 0;
        if (seed_len > (size_t)qsize) {
            /* Only consume as much seed as is expected. */
            seed_len = qsize;
        }
    /*
     * 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))
        seed_in = NULL;         /* seed buffer too small -- ignore */
    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)
        memcpy(seed, seed_in, seed_len);
    }

    if ((ctx = BN_CTX_new()) == NULL)
        goto err;
@@ -194,18 +197,20 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,

    for (;;) {
        for (;;) {              /* find q */
            int use_random_seed = (seed_in == NULL);
            int seed_is_random;

            /* step 1 */
            if (!BN_GENCB_call(cb, 0, m++))
                goto err;

            if (use_random_seed) {
                if (RAND_bytes(seed, qsize) <= 0)
            if (!seed_len) {
                if (RAND_pseudo_bytes(seed, qsize) < 0)
                    goto err;
                seed_is_random = 1;
            } else {
                /* If we come back through, use random seed next time. */
                seed_in = NULL;
                seed_is_random = 0;
                seed_len = 0;   /* use random seed if 'seed_in' turns out to
                                 * be bad */
            }
            memcpy(buf, seed, qsize);
            memcpy(buf2, seed, qsize);
@@ -232,7 +237,7 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,

            /* step 4 */
            r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx,
                                        use_random_seed, cb);
                                        seed_is_random, cb);
            if (r > 0)
                break;
            if (r != 0)
+6 −5
Original line number Diff line number Diff line
@@ -23,12 +23,13 @@ Deprecated:
DSA_generate_parameters_ex() generates primes p and q and a generator g
for use in the DSA and stores the result in B<dsa>.

B<bits> is the length of the prime p to be generated.
For lengths under 2048 bits, the length of q is 160 bits; for lengths
greater than or equal to 2048 bits, the length of q is set to 256 bits.
B<bits> is the length of the prime to be generated; the DSS allows a
maximum of 1024 bits.

If B<seed> is NULL, the primes will be generated at random.
If B<seed_len> is less than the length of q, an error is returned.
If B<seed> is B<NULL> or B<seed_len> E<lt> 20, the primes will be
generated at random. Otherwise, the seed is used to generate
them. If the given seed does not yield a prime q, a new random
seed is chosen and placed at B<seed>.

DSA_generate_parameters_ex() places the iteration count in
*B<counter_ret> and a counter used for finding a generator in