Mercurial > dropbear
comparison genrsa.c @ 794:d386defb5376 ecc
more ecdsa signkey work, not correct
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sun, 28 Apr 2013 23:17:43 +0800 |
parents | c3de235d9506 |
children | 724c3e0c8734 |
comparison
equal
deleted
inserted
replaced
793:70625eed40c9 | 794:d386defb5376 |
---|---|
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 | |
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 } | |
46 | 51 |
47 key = m_malloc(sizeof(*key)); | 52 key = m_malloc(sizeof(*key)); |
48 | 53 |
49 key->e = (mp_int*)m_malloc(sizeof(mp_int)); | 54 key->e = (mp_int*)m_malloc(sizeof(mp_int)); |
50 key->n = (mp_int*)m_malloc(sizeof(mp_int)); | 55 key->n = (mp_int*)m_malloc(sizeof(mp_int)); |
53 key->q = (mp_int*)m_malloc(sizeof(mp_int)); | 58 key->q = (mp_int*)m_malloc(sizeof(mp_int)); |
54 | 59 |
55 m_mp_init_multi(key->e, key->n, key->d, key->p, key->q, | 60 m_mp_init_multi(key->e, key->n, key->d, key->p, key->q, |
56 &pminus, &lcm, &qminus, NULL); | 61 &pminus, &lcm, &qminus, NULL); |
57 | 62 |
58 seedrandom(); | |
59 | |
60 if (mp_set_int(key->e, RSA_E) != MP_OKAY) { | 63 if (mp_set_int(key->e, RSA_E) != MP_OKAY) { |
61 fprintf(stderr, "RSA generation failed\n"); | 64 fprintf(stderr, "RSA generation failed\n"); |
62 exit(1); | 65 exit(1); |
63 } | 66 } |
64 | 67 |
65 getrsaprime(key->p, &pminus, key->e, size/2); | 68 getrsaprime(key->p, &pminus, key->e, size/16); |
66 getrsaprime(key->q, &qminus, key->e, size/2); | 69 getrsaprime(key->q, &qminus, key->e, size/16); |
67 | 70 |
68 if (mp_mul(key->p, key->q, key->n) != MP_OKAY) { | 71 if (mp_mul(key->p, key->q, key->n) != MP_OKAY) { |
69 fprintf(stderr, "RSA generation failed\n"); | 72 fprintf(stderr, "RSA generation failed\n"); |
70 exit(1); | 73 exit(1); |
71 } | 74 } |
88 return key; | 91 return key; |
89 } | 92 } |
90 | 93 |
91 /* return a prime suitable for p or q */ | 94 /* return a prime suitable for p or q */ |
92 static void getrsaprime(mp_int* prime, mp_int *primeminus, | 95 static void getrsaprime(mp_int* prime, mp_int *primeminus, |
93 mp_int* rsa_e, unsigned int size) { | 96 mp_int* rsa_e, unsigned int size_bytes) { |
94 | 97 |
95 unsigned char *buf; | 98 unsigned char *buf; |
96 DEF_MP_INT(temp_gcd); | 99 DEF_MP_INT(temp_gcd); |
97 | 100 |
98 buf = (unsigned char*)m_malloc(size+1); | 101 buf = (unsigned char*)m_malloc(size_bytes+1); |
99 | 102 |
100 m_mp_init(&temp_gcd); | 103 m_mp_init(&temp_gcd); |
101 do { | 104 do { |
102 /* generate a random odd number with MSB set, then find the | 105 /* generate a random odd number with MSB set, then find the |
103 the next prime above it */ | 106 the next prime above it */ |
104 genrandom(buf, size+1); | 107 genrandom(buf, size_bytes+1); |
105 buf[0] |= 0x80; /* MSB set */ | 108 buf[0] |= 0x80; /* MSB set */ |
106 | 109 |
107 bytes_to_mp(prime, buf, size+1); | 110 bytes_to_mp(prime, buf, size_bytes+1); |
108 | 111 |
109 /* find the next integer which is prime, 8 round of miller-rabin */ | 112 /* find the next integer which is prime, 8 round of miller-rabin */ |
110 if (mp_prime_next_prime(prime, 8, 0) != MP_OKAY) { | 113 if (mp_prime_next_prime(prime, 8, 0) != MP_OKAY) { |
111 fprintf(stderr, "RSA generation failed\n"); | 114 fprintf(stderr, "RSA generation failed\n"); |
112 exit(1); | 115 exit(1); |
124 } | 127 } |
125 } while (mp_cmp_d(&temp_gcd, 1) != MP_EQ); /* while gcd(p-1, e) != 1 */ | 128 } while (mp_cmp_d(&temp_gcd, 1) != MP_EQ); /* while gcd(p-1, e) != 1 */ |
126 | 129 |
127 /* now we have a good value for result */ | 130 /* now we have a good value for result */ |
128 mp_clear(&temp_gcd); | 131 mp_clear(&temp_gcd); |
129 m_burn(buf, size+1); | 132 m_burn(buf, size_bytes+1); |
130 m_free(buf); | 133 m_free(buf); |
131 } | 134 } |
132 | 135 |
133 #endif /* DROPBEAR_RSA */ | 136 #endif /* DROPBEAR_RSA */ |