diff options
author | Martin Willi <martin@strongswan.org> | 2005-12-07 15:53:34 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2005-12-07 15:53:34 +0000 |
commit | c3903a186150e59610930f7acb07a544b8a86e72 (patch) | |
tree | e2d8c542f16a8d93f9c9d43e2ea31de869261e52 /Source/charon/transforms/rsa/rsa_private_key.c | |
parent | 0d43ad12dd3a882f83d4a80f591a4e51b4470845 (diff) | |
download | strongswan-c3903a186150e59610930f7acb07a544b8a86e72.tar.bz2 strongswan-c3903a186150e59610930f7acb07a544b8a86e72.tar.xz |
- removed prime pool
Diffstat (limited to 'Source/charon/transforms/rsa/rsa_private_key.c')
-rw-r--r-- | Source/charon/transforms/rsa/rsa_private_key.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/Source/charon/transforms/rsa/rsa_private_key.c b/Source/charon/transforms/rsa/rsa_private_key.c index c5614324b..f6522ab17 100644 --- a/Source/charon/transforms/rsa/rsa_private_key.c +++ b/Source/charon/transforms/rsa/rsa_private_key.c @@ -123,9 +123,50 @@ struct private_rsa_private_key_t { */ chunk_t (*rsasp1) (private_rsa_private_key_t *this, chunk_t data); + /** + * @brief Generate a prime value. + * + * @param this calling object + * @param prime_size size of the prime, in bytes + * @param[out] prime uninitialized mpz + */ + void (*compute_prime) (private_rsa_private_key_t *this, size_t prime_size, mpz_t *prime); + }; /** + * Implementation of private_rsa_private_key_t.compute_prime. + */ +static void compute_prime(private_rsa_private_key_t *this, size_t prime_size, mpz_t *prime) +{ + randomizer_t *randomizer; + chunk_t random_bytes; + + randomizer = randomizer_create(); + mpz_init(*prime); + + do + { + randomizer->allocate_random_bytes(randomizer, prime_size, &random_bytes); + + /* make sure most significant bit is set */ + random_bytes.ptr[0] = random_bytes.ptr[0] | 0x80; + + /* convert chunk to mpz value */ + mpz_import(*prime, random_bytes.len, 1, 1, 1, 0, random_bytes.ptr); + + /* get next prime */ + mpz_nextprime (*prime, *prime); + + allocator_free(random_bytes.ptr); + } + /* check if it isnt too large */ + while (((mpz_sizeinbase(*prime, 2) + 7) / 8) > prime_size); + + randomizer->destroy(randomizer); +} + +/** * Implementation of private_rsa_private_key_t.rsadp and private_rsa_private_key_t.rsasp1. */ static chunk_t rsadp(private_rsa_private_key_t *this, chunk_t data) @@ -406,8 +447,8 @@ static status_t generate_key(private_rsa_private_key_t *this, size_t key_size) mpz_init(coeff); /* Get values of primes p and q */ - charon->prime_pool->get_prime(charon->prime_pool, key_size/2, &p); - charon->prime_pool->get_prime(charon->prime_pool, key_size/2, &q); + this->compute_prime(this, key_size/2, &p); + this->compute_prime(this, key_size/2, &q); /* Swapping Primes so p is larger then q */ if (mpz_cmp(p, q) < 0) @@ -541,6 +582,7 @@ rsa_private_key_t *rsa_private_key_create(hash_algorithm_t hash_algoritm) /* private functions */ this->rsadp = rsadp; this->rsasp1 = rsadp; /* same algorithm */ + this->compute_prime = compute_prime; this->is_key_set = FALSE; |