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 */