summaryrefslogtreecommitdiff
path: root/genrsa.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2013-04-28 23:17:43 +0800
committerMatt Johnston <matt@ucc.asn.au>2013-04-28 23:17:43 +0800
commit140e57260018dfb014f828e18dff429b2530ef37 (patch)
tree224f4343ca55a8a2fc9d7017861b9ca787ae4dbf /genrsa.c
parent45149ad7965fbcb3e3774b62c9f2574fd0129af6 (diff)
downloaddropbear-140e57260018dfb014f828e18dff429b2530ef37.tar.gz
more ecdsa signkey work, not correct
Diffstat (limited to 'genrsa.c')
-rw-r--r--genrsa.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/genrsa.c b/genrsa.c
index b0867e2..465502b 100644
--- a/genrsa.c
+++ b/genrsa.c
@@ -34,7 +34,7 @@
#ifdef DROPBEAR_RSA
static void getrsaprime(mp_int* prime, mp_int *primeminus,
- mp_int* rsa_e, unsigned int size);
+ mp_int* rsa_e, unsigned int size_bytes);
/* mostly taken from libtomcrypt's rsa key generation routine */
dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) {
@@ -44,6 +44,11 @@ dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) {
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));
key->e = (mp_int*)m_malloc(sizeof(mp_int));
@@ -55,15 +60,13 @@ dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) {
m_mp_init_multi(key->e, key->n, key->d, key->p, key->q,
&pminus, &lcm, &qminus, NULL);
- seedrandom();
-
if (mp_set_int(key->e, RSA_E) != MP_OKAY) {
fprintf(stderr, "RSA generation failed\n");
exit(1);
}
- getrsaprime(key->p, &pminus, key->e, size/2);
- getrsaprime(key->q, &qminus, key->e, size/2);
+ 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");
@@ -90,21 +93,21 @@ dropbear_rsa_key * gen_rsa_priv_key(unsigned int size) {
/* return a prime suitable for p or q */
static void getrsaprime(mp_int* prime, mp_int *primeminus,
- mp_int* rsa_e, unsigned int size) {
+ mp_int* rsa_e, unsigned int size_bytes) {
unsigned char *buf;
DEF_MP_INT(temp_gcd);
- buf = (unsigned char*)m_malloc(size+1);
+ buf = (unsigned char*)m_malloc(size_bytes+1);
m_mp_init(&temp_gcd);
do {
/* generate a random odd number with MSB set, then find the
the next prime above it */
- genrandom(buf, size+1);
+ genrandom(buf, size_bytes+1);
buf[0] |= 0x80; /* MSB set */
- bytes_to_mp(prime, buf, size+1);
+ bytes_to_mp(prime, buf, size_bytes+1);
/* find the next integer which is prime, 8 round of miller-rabin */
if (mp_prime_next_prime(prime, 8, 0) != MP_OKAY) {
@@ -126,7 +129,7 @@ static void getrsaprime(mp_int* prime, mp_int *primeminus,
/* now we have a good value for result */
mp_clear(&temp_gcd);
- m_burn(buf, size+1);
+ m_burn(buf, size_bytes+1);
m_free(buf);
}