~ubuntu-branches/ubuntu/precise/dropbear/precise

« back to all changes in this revision

Viewing changes to libtomcrypt/src/pk/dsa/dsa_make_key.c

  • Committer: Bazaar Package Importer
  • Author(s): Gerrit Pape
  • Date: 2007-03-02 20:48:18 UTC
  • mfrom: (1.3.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20070302204818-ozmbou2sbyj7dus5
Tags: 0.49-1
* new upstream release, fixes
  * CVE-2007-1099: dropbear dbclient insufficient warning on hostkey
    mismatch (closes: #412899).
  * dbclient uses static "Password:" prompt instead of using the server's
    prompt (closes: #394996).
* debian/control: Suggests: openssh-client, not ssh (closes: #405686);
  Standards-Version: 3.7.2.2.
* debian/README.Debian: ssh -> openssh-server, openssh-client; remove
  'Replacing OpenSSH "sshd" with Dropbear' part, this is simply done by not
  installing the openssh-server package.
* debian/README.runit: runsvstat -> sv status.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
 * The library is free for all purposes without any express
7
7
 * guarantee it works.
8
8
 *
9
 
 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org
 
9
 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10
10
 */
11
11
#include "tomcrypt.h"
12
12
 
28
28
*/
29
29
int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key)
30
30
{
31
 
   mp_int         tmp, tmp2;
 
31
   void           *tmp, *tmp2;
32
32
   int            err, res;
33
33
   unsigned char *buf;
34
34
 
35
35
   LTC_ARGCHK(key  != NULL);
 
36
   LTC_ARGCHK(ltc_mp.name != NULL);
36
37
 
37
38
   /* check prng */
38
39
   if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
52
53
   }
53
54
 
54
55
   /* init mp_ints  */
55
 
   if ((err = mp_init_multi(&tmp, &tmp2, &key->g, &key->q, &key->p, &key->x, &key->y, NULL)) != MP_OKAY) {
56
 
      err = mpi_to_ltc_error(err);
57
 
      goto LBL_ERR;
 
56
   if ((err = mp_init_multi(&tmp, &tmp2, &key->g, &key->q, &key->p, &key->x, &key->y, NULL)) != CRYPT_OK) {
 
57
      XFREE(buf);
 
58
      return err;
58
59
   }
59
60
 
60
61
   /* make our prime q */
61
 
   if ((err = rand_prime(&key->q, group_size*8, prng, wprng)) != CRYPT_OK)             { goto LBL_ERR; }
 
62
   if ((err = rand_prime(key->q, group_size, prng, wprng)) != CRYPT_OK)                { goto error; }
62
63
 
63
64
   /* double q  */
64
 
   if ((err = mp_mul_2(&key->q, &tmp)) != MP_OKAY)                                     { goto error; }
 
65
   if ((err = mp_add(key->q, key->q, tmp)) != CRYPT_OK)                                { goto error; }
65
66
 
66
67
   /* now make a random string and multply it against q */
67
68
   if (prng_descriptor[wprng].read(buf+1, modulus_size - group_size, prng) != (unsigned long)(modulus_size - group_size)) {
68
69
      err = CRYPT_ERROR_READPRNG;
69
 
      goto LBL_ERR;
 
70
      goto error;
70
71
   }
71
72
 
72
73
   /* force magnitude */
75
76
   /* force even */
76
77
   buf[modulus_size - group_size - 1] &= ~1;
77
78
 
78
 
   if ((err = mp_read_unsigned_bin(&tmp2, buf, modulus_size - group_size)) != MP_OKAY) { goto error; }
79
 
   if ((err = mp_mul(&key->q, &tmp2, &key->p)) != MP_OKAY)                             { goto error; }
80
 
   if ((err = mp_add_d(&key->p, 1, &key->p)) != MP_OKAY)                               { goto error; }
 
79
   if ((err = mp_read_unsigned_bin(tmp2, buf, modulus_size - group_size)) != CRYPT_OK) { goto error; }
 
80
   if ((err = mp_mul(key->q, tmp2, key->p)) != CRYPT_OK)                               { goto error; }
 
81
   if ((err = mp_add_d(key->p, 1, key->p)) != CRYPT_OK)                                { goto error; }
81
82
 
82
83
   /* now loop until p is prime */
83
84
   for (;;) {
84
 
       if ((err = is_prime(&key->p, &res)) != CRYPT_OK)                                { goto LBL_ERR; }
85
 
       if (res == MP_YES) break;
 
85
       if ((err = mp_prime_is_prime(key->p, 8, &res)) != CRYPT_OK)                     { goto error; }
 
86
       if (res == LTC_MP_YES) break;
86
87
 
87
88
       /* add 2q to p and 2 to tmp2 */
88
 
       if ((err = mp_add(&tmp, &key->p, &key->p)) != MP_OKAY)                          { goto error; }
89
 
       if ((err = mp_add_d(&tmp2, 2, &tmp2)) != MP_OKAY)                               { goto error; }
 
89
       if ((err = mp_add(tmp, key->p, key->p)) != CRYPT_OK)                            { goto error; }
 
90
       if ((err = mp_add_d(tmp2, 2, tmp2)) != CRYPT_OK)                                { goto error; }
90
91
   }
91
92
 
92
93
   /* now p = (q * tmp2) + 1 is prime, find a value g for which g^tmp2 != 1 */
93
 
   mp_set(&key->g, 1);
 
94
   mp_set(key->g, 1);
94
95
 
95
96
   do {
96
 
      if ((err = mp_add_d(&key->g, 1, &key->g)) != MP_OKAY)                            { goto error; }
97
 
      if ((err = mp_exptmod(&key->g, &tmp2, &key->p, &tmp)) != MP_OKAY)                { goto error; }
98
 
   } while (mp_cmp_d(&tmp, 1) == MP_EQ);
 
97
      if ((err = mp_add_d(key->g, 1, key->g)) != CRYPT_OK)                             { goto error; }
 
98
      if ((err = mp_exptmod(key->g, tmp2, key->p, tmp)) != CRYPT_OK)                   { goto error; }
 
99
   } while (mp_cmp_d(tmp, 1) == LTC_MP_EQ);
99
100
 
100
101
   /* at this point tmp generates a group of order q mod p */
101
 
   mp_exch(&tmp, &key->g);
 
102
   mp_exch(tmp, key->g);
102
103
 
103
104
   /* so now we have our DH structure, generator g, order q, modulus p 
104
105
      Now we need a random exponent [mod q] and it's power g^x mod p 
106
107
   do {
107
108
      if (prng_descriptor[wprng].read(buf, group_size, prng) != (unsigned long)group_size) {
108
109
         err = CRYPT_ERROR_READPRNG;
109
 
         goto LBL_ERR;
 
110
         goto error;
110
111
      }
111
 
      if ((err = mp_read_unsigned_bin(&key->x, buf, group_size)) != MP_OKAY)           { goto error; }
112
 
   } while (mp_cmp_d(&key->x, 1) != MP_GT);
113
 
   if ((err = mp_exptmod(&key->g, &key->x, &key->p, &key->y)) != MP_OKAY)              { goto error; }
114
 
   
 
112
      if ((err = mp_read_unsigned_bin(key->x, buf, group_size)) != CRYPT_OK)           { goto error; }
 
113
   } while (mp_cmp_d(key->x, 1) != LTC_MP_GT);
 
114
   if ((err = mp_exptmod(key->g, key->x, key->p, key->y)) != CRYPT_OK)                 { goto error; }
 
115
  
115
116
   key->type = PK_PRIVATE;
116
117
   key->qord = group_size;
117
118
 
118
 
   /* shrink the ram required */
119
 
   if ((err = mp_shrink(&key->g)) != MP_OKAY)                                          { goto error; }
120
 
   if ((err = mp_shrink(&key->p)) != MP_OKAY)                                          { goto error; }
121
 
   if ((err = mp_shrink(&key->q)) != MP_OKAY)                                          { goto error; }
122
 
   if ((err = mp_shrink(&key->x)) != MP_OKAY)                                          { goto error; }
123
 
   if ((err = mp_shrink(&key->y)) != MP_OKAY)                                          { goto error; }
124
 
 
125
119
#ifdef LTC_CLEAN_STACK
126
120
   zeromem(buf, MDSA_DELTA);
127
121
#endif
129
123
   err = CRYPT_OK;
130
124
   goto done;
131
125
error: 
132
 
    err = mpi_to_ltc_error(err);
133
 
LBL_ERR: 
134
 
    mp_clear_multi(&key->g, &key->q, &key->p, &key->x, &key->y, NULL);
 
126
    mp_clear_multi(key->g, key->q, key->p, key->x, key->y, NULL);
135
127
done: 
136
 
    mp_clear_multi(&tmp, &tmp2, NULL);
137
 
 
 
128
    mp_clear_multi(tmp, tmp2, NULL);
138
129
    XFREE(buf);
139
130
    return err;
140
131
}
142
133
#endif
143
134
 
144
135
/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_make_key.c,v $ */
145
 
/* $Revision: 1.4 $ */
146
 
/* $Date: 2005/06/11 05:45:35 $ */
 
136
/* $Revision: 1.10 $ */
 
137
/* $Date: 2006/12/04 03:18:43 $ */