Blame


1 0fc65b37 2004-03-21 devnull #include "os.h"
2 0fc65b37 2004-03-21 devnull #include <mp.h>
3 0fc65b37 2004-03-21 devnull #include <libsec.h>
4 0fc65b37 2004-03-21 devnull
5 0fc65b37 2004-03-21 devnull DSApriv*
6 0fc65b37 2004-03-21 devnull dsagen(DSApub *opub)
7 0fc65b37 2004-03-21 devnull {
8 0fc65b37 2004-03-21 devnull DSApub *pub;
9 0fc65b37 2004-03-21 devnull DSApriv *priv;
10 0fc65b37 2004-03-21 devnull mpint *exp;
11 0fc65b37 2004-03-21 devnull mpint *g;
12 0fc65b37 2004-03-21 devnull mpint *r;
13 0fc65b37 2004-03-21 devnull int bits;
14 0fc65b37 2004-03-21 devnull
15 0fc65b37 2004-03-21 devnull priv = dsaprivalloc();
16 0fc65b37 2004-03-21 devnull pub = &priv->pub;
17 0fc65b37 2004-03-21 devnull
18 0fc65b37 2004-03-21 devnull if(opub != nil){
19 0fc65b37 2004-03-21 devnull pub->p = mpcopy(opub->p);
20 0fc65b37 2004-03-21 devnull pub->q = mpcopy(opub->q);
21 0fc65b37 2004-03-21 devnull } else {
22 0fc65b37 2004-03-21 devnull pub->p = mpnew(0);
23 0fc65b37 2004-03-21 devnull pub->q = mpnew(0);
24 0fc65b37 2004-03-21 devnull DSAprimes(pub->q, pub->p, nil);
25 0fc65b37 2004-03-21 devnull }
26 0fc65b37 2004-03-21 devnull bits = Dbits*pub->p->top;
27 0fc65b37 2004-03-21 devnull
28 0fc65b37 2004-03-21 devnull pub->alpha = mpnew(0);
29 0fc65b37 2004-03-21 devnull pub->key = mpnew(0);
30 0fc65b37 2004-03-21 devnull priv->secret = mpnew(0);
31 0fc65b37 2004-03-21 devnull
32 0fc65b37 2004-03-21 devnull // find a generator alpha of the multiplicative
33 0fc65b37 2004-03-21 devnull // group Z*p, i.e., of order n = p-1. We use the
34 0fc65b37 2004-03-21 devnull // fact that q divides p-1 to reduce the exponent.
35 0fc65b37 2004-03-21 devnull exp = mpnew(0);
36 0fc65b37 2004-03-21 devnull g = mpnew(0);
37 0fc65b37 2004-03-21 devnull r = mpnew(0);
38 0fc65b37 2004-03-21 devnull mpsub(pub->p, mpone, exp);
39 0fc65b37 2004-03-21 devnull mpdiv(exp, pub->q, exp, r);
40 0fc65b37 2004-03-21 devnull if(mpcmp(r, mpzero) != 0)
41 0fc65b37 2004-03-21 devnull sysfatal("dsagen foul up");
42 0fc65b37 2004-03-21 devnull while(1){
43 0fc65b37 2004-03-21 devnull mprand(bits, genrandom, g);
44 0fc65b37 2004-03-21 devnull mpmod(g, pub->p, g);
45 0fc65b37 2004-03-21 devnull mpexp(g, exp, pub->p, pub->alpha);
46 0fc65b37 2004-03-21 devnull if(mpcmp(pub->alpha, mpone) != 0)
47 0fc65b37 2004-03-21 devnull break;
48 0fc65b37 2004-03-21 devnull }
49 0fc65b37 2004-03-21 devnull mpfree(g);
50 0fc65b37 2004-03-21 devnull mpfree(exp);
51 0fc65b37 2004-03-21 devnull
52 0fc65b37 2004-03-21 devnull // create the secret key
53 0fc65b37 2004-03-21 devnull mprand(bits, genrandom, priv->secret);
54 0fc65b37 2004-03-21 devnull mpmod(priv->secret, pub->p, priv->secret);
55 0fc65b37 2004-03-21 devnull mpexp(pub->alpha, priv->secret, pub->p, pub->key);
56 0fc65b37 2004-03-21 devnull
57 0fc65b37 2004-03-21 devnull return priv;
58 0fc65b37 2004-03-21 devnull }