comparison genrsa.c @ 839:33207ed1174b

Merge in ECC
author Matt Johnston <matt@ucc.asn.au>
date Mon, 21 Oct 2013 22:57:21 +0800
parents 724c3e0c8734
children 220f55d540ae
comparison
equal deleted inserted replaced
834:e378da7eae5d 839:33207ed1174b
32 #define RSA_E 65537 32 #define RSA_E 65537
33 33
34 #ifdef DROPBEAR_RSA 34 #ifdef DROPBEAR_RSA
35 35
36 static void getrsaprime(mp_int* prime, mp_int *primeminus, 36 static void getrsaprime(mp_int* prime, mp_int *primeminus,
37 mp_int* rsa_e, unsigned int size); 37 mp_int* rsa_e, unsigned int size_bytes);
38 38
39 /* mostly taken from libtomcrypt's rsa key generation routine */ 39 /* mostly taken from libtomcrypt's rsa key generation routine */
40 dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) { 40 dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) {
41 41
42 dropbear_rsa_key * key; 42 dropbear_rsa_key * key;
43 DEF_MP_INT(pminus); 43 DEF_MP_INT(pminus);
44 DEF_MP_INT(qminus); 44 DEF_MP_INT(qminus);
45 DEF_MP_INT(lcm); 45 DEF_MP_INT(lcm);
46 46
47 if (size < 512 || size > 4096 || (size % 8 != 0)) {
48 dropbear_exit("Bits must satisfy 512 <= bits <= 4096, and be a"
49 " multiple of 8");
50 }
51
47 key = m_malloc(sizeof(*key)); 52 key = m_malloc(sizeof(*key));
48 53 m_mp_alloc_init_multi(&key->e, &key->n, &key->d, &key->p, &key->q, NULL);
49 key->e = (mp_int*)m_malloc(sizeof(mp_int)); 54 m_mp_init_multi(&pminus, &lcm, &qminus, NULL);
50 key->n = (mp_int*)m_malloc(sizeof(mp_int));
51 key->d = (mp_int*)m_malloc(sizeof(mp_int));
52 key->p = (mp_int*)m_malloc(sizeof(mp_int));
53 key->q = (mp_int*)m_malloc(sizeof(mp_int));
54
55 m_mp_init_multi(key->e, key->n, key->d, key->p, key->q,
56 &pminus, &lcm, &qminus, NULL);
57
58 seedrandom();
59 55
60 if (mp_set_int(key->e, RSA_E) != MP_OKAY) { 56 if (mp_set_int(key->e, RSA_E) != MP_OKAY) {
61 fprintf(stderr, "RSA generation failed\n"); 57 fprintf(stderr, "RSA generation failed\n");
62 exit(1); 58 exit(1);
63 } 59 }
64 60
65 getrsaprime(key->p, &pminus, key->e, size/2); 61 getrsaprime(key->p, &pminus, key->e, size/16);
66 getrsaprime(key->q, &qminus, key->e, size/2); 62 getrsaprime(key->q, &qminus, key->e, size/16);
67 63
68 if (mp_mul(key->p, key->q, key->n) != MP_OKAY) { 64 if (mp_mul(key->p, key->q, key->n) != MP_OKAY) {
69 fprintf(stderr, "RSA generation failed\n"); 65 fprintf(stderr, "RSA generation failed\n");
70 exit(1); 66 exit(1);
71 } 67 }
88 return key; 84 return key;
89 } 85 }
90 86
91 /* return a prime suitable for p or q */ 87 /* return a prime suitable for p or q */
92 static void getrsaprime(mp_int* prime, mp_int *primeminus, 88 static void getrsaprime(mp_int* prime, mp_int *primeminus,
93 mp_int* rsa_e, unsigned int size) { 89 mp_int* rsa_e, unsigned int size_bytes) {
94 90
95 unsigned char *buf; 91 unsigned char *buf;
96 DEF_MP_INT(temp_gcd); 92 DEF_MP_INT(temp_gcd);
97 93
98 buf = (unsigned char*)m_malloc(size+1); 94 buf = (unsigned char*)m_malloc(size_bytes+1);
99 95
100 m_mp_init(&temp_gcd); 96 m_mp_init(&temp_gcd);
101 do { 97 do {
102 /* generate a random odd number with MSB set, then find the 98 /* generate a random odd number with MSB set, then find the
103 the next prime above it */ 99 the next prime above it */
104 genrandom(buf, size+1); 100 genrandom(buf, size_bytes+1);
105 buf[0] |= 0x80; /* MSB set */ 101 buf[0] |= 0x80; /* MSB set */
106 102
107 bytes_to_mp(prime, buf, size+1); 103 bytes_to_mp(prime, buf, size_bytes+1);
108 104
109 /* find the next integer which is prime, 8 round of miller-rabin */ 105 /* find the next integer which is prime, 8 round of miller-rabin */
110 if (mp_prime_next_prime(prime, 8, 0) != MP_OKAY) { 106 if (mp_prime_next_prime(prime, 8, 0) != MP_OKAY) {
111 fprintf(stderr, "RSA generation failed\n"); 107 fprintf(stderr, "RSA generation failed\n");
112 exit(1); 108 exit(1);
124 } 120 }
125 } while (mp_cmp_d(&temp_gcd, 1) != MP_EQ); /* while gcd(p-1, e) != 1 */ 121 } while (mp_cmp_d(&temp_gcd, 1) != MP_EQ); /* while gcd(p-1, e) != 1 */
126 122
127 /* now we have a good value for result */ 123 /* now we have a good value for result */
128 mp_clear(&temp_gcd); 124 mp_clear(&temp_gcd);
129 m_burn(buf, size+1); 125 m_burn(buf, size_bytes+1);
130 m_free(buf); 126 m_free(buf);
131 } 127 }
132 128
133 #endif /* DROPBEAR_RSA */ 129 #endif /* DROPBEAR_RSA */