123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #include "includes.h"
- #include "dbutil.h"
- #include "signkey.h"
- #include "bignum.h"
- #include "dbrandom.h"
- #include "buffer.h"
- #include "gendss.h"
- #include "dss.h"
- #define QSIZE 20
- #if DROPBEAR_DSS
- static void getq(const dropbear_dss_key *key);
- static void getp(const dropbear_dss_key *key, unsigned int size);
- static void getg(const dropbear_dss_key *key);
- static void getx(const dropbear_dss_key *key);
- static void gety(const dropbear_dss_key *key);
- dropbear_dss_key * gen_dss_priv_key(unsigned int size) {
- dropbear_dss_key *key;
- if (size != 1024) {
- dropbear_exit("DSS keys have a fixed size of 1024 bits");
- }
- key = m_malloc(sizeof(*key));
- m_mp_alloc_init_multi(&key->p, &key->q, &key->g, &key->y, &key->x, NULL);
-
- getq(key);
- getp(key, size/8);
- getg(key);
- getx(key);
- gety(key);
- return key;
-
- }
- static void getq(const dropbear_dss_key *key) {
- unsigned char buf[QSIZE];
- int trials;
-
- genrandom(buf, QSIZE);
- buf[0] |= 0x80;
- buf[QSIZE-1] |= 0x01;
- bytes_to_mp(key->q, buf, QSIZE);
-
- trials = mp_prime_rabin_miller_trials(mp_count_bits(key->q));
- if (mp_prime_next_prime(key->q, trials, 0) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
- }
- static void getp(const dropbear_dss_key *key, unsigned int size) {
- DEF_MP_INT(tempX);
- DEF_MP_INT(tempC);
- DEF_MP_INT(tempP);
- DEF_MP_INT(temp2q);
- int result, trials;
- unsigned char *buf;
- m_mp_init_multi(&tempX, &tempC, &tempP, &temp2q, NULL);
-
- if (mp_mul_d(key->q, 2, &temp2q) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
-
- buf = (unsigned char*)m_malloc(size);
- result = 0;
- do {
-
- genrandom(buf, size);
- buf[0] |= 0x80;
-
- bytes_to_mp(&tempX, buf, size);
-
- if (mp_mod(&tempX, &temp2q, &tempC) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
-
- if (mp_sub(&tempX, &tempC, &tempP) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
-
- if (mp_add_d(&tempP, 1, key->p) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
-
- trials = mp_prime_rabin_miller_trials(mp_count_bits(key->p));
-
- if (mp_prime_is_prime(key->p, trials, &result) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
- } while (!result);
- mp_clear_multi(&tempX, &tempC, &tempP, &temp2q, NULL);
- m_burn(buf, size);
- m_free(buf);
- }
- static void getg(const dropbear_dss_key * key) {
- DEF_MP_INT(div);
- DEF_MP_INT(h);
- DEF_MP_INT(val);
- m_mp_init_multi(&div, &h, &val, NULL);
-
- if (mp_sub_d(key->p, 1, &val) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
- if (mp_div(&val, key->q, &div, NULL) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
-
- mp_set(&h, 1);
- do {
-
- if (mp_exptmod(&h, &div, key->p, key->g) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
- if (mp_add_d(&h, 1, &h) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
-
- } while (mp_cmp_d(key->g, 1) != MP_GT);
- mp_clear_multi(&div, &h, &val, NULL);
- }
- static void getx(const dropbear_dss_key *key) {
- gen_random_mpint(key->q, key->x);
- }
- static void gety(const dropbear_dss_key *key) {
- if (mp_exptmod(key->g, key->x, key->p, key->y) != MP_OKAY) {
- fprintf(stderr, "DSS key generation failed\n");
- exit(1);
- }
- }
- #endif
|