123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #include "includes.h"
- #include "dbutil.h"
- #include "bignum.h"
- #include "dbrandom.h"
- #include "rsa.h"
- #include "genrsa.h"
- #define RSA_E 65537
- #if DROPBEAR_RSA
- static void getrsaprime(mp_int* prime, mp_int *primeminus,
- mp_int* rsa_e, unsigned int size_bytes);
- dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) {
- dropbear_rsa_key * key;
- DEF_MP_INT(pminus);
- DEF_MP_INT(qminus);
- DEF_MP_INT(lcm);
- if (size < 512 || size > 4096 || (size % 8 != 0)) {
- dropbear_exit("Bits must satisfy 512 <= bits <= 4096, and be a"
- " multiple of 8");
- }
- key = m_malloc(sizeof(*key));
- m_mp_alloc_init_multi(&key->e, &key->n, &key->d, &key->p, &key->q, NULL);
- m_mp_init_multi(&pminus, &lcm, &qminus, NULL);
- mp_set_ul(key->e, RSA_E);
- while (1) {
- getrsaprime(key->p, &pminus, key->e, size/16);
- getrsaprime(key->q, &qminus, key->e, size/16);
- if (mp_mul(key->p, key->q, key->n) != MP_OKAY) {
- fprintf(stderr, "RSA generation failed\n");
- exit(1);
- }
- if ((unsigned int)mp_count_bits(key->n) == size) {
- break;
- }
- }
-
- if (mp_lcm(&pminus, &qminus, &lcm) != MP_OKAY) {
- fprintf(stderr, "RSA generation failed\n");
- exit(1);
- }
-
-
- if (mp_invmod(key->e, &lcm, key->d) != MP_OKAY) {
- fprintf(stderr, "RSA generation failed\n");
- exit(1);
- }
- mp_clear_multi(&pminus, &qminus, &lcm, NULL);
- return key;
- }
- static void getrsaprime(mp_int* prime, mp_int *primeminus,
- mp_int* rsa_e, unsigned int size_bytes) {
- unsigned char *buf;
- int trials;
- DEF_MP_INT(temp_gcd);
- buf = (unsigned char*)m_malloc(size_bytes);
- m_mp_init(&temp_gcd);
- do {
-
- genrandom(buf, size_bytes);
- buf[0] |= 0x80;
- bytes_to_mp(prime, buf, size_bytes);
-
- trials = mp_prime_rabin_miller_trials(mp_count_bits(prime));
- if (mp_prime_next_prime(prime, trials, 0) != MP_OKAY) {
- fprintf(stderr, "RSA generation failed\n");
- exit(1);
- }
-
- if (mp_sub_d(prime, 1, primeminus) != MP_OKAY) {
- fprintf(stderr, "RSA generation failed\n");
- exit(1);
- }
-
- if (mp_gcd(primeminus, rsa_e, &temp_gcd) != MP_OKAY) {
- fprintf(stderr, "RSA generation failed\n");
- exit(1);
- }
- } while (mp_cmp_d(&temp_gcd, 1) != MP_EQ);
-
- mp_clear(&temp_gcd);
- m_burn(buf, size_bytes);
- m_free(buf);
- }
- #endif
|