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 cbeb0b26 2006-04-01 devnull /* find a generator alpha of the multiplicative */
33 cbeb0b26 2006-04-01 devnull /* group Z*p, i.e., of order n = p-1. We use the */
34 cbeb0b26 2006-04-01 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 cbeb0b26 2006-04-01 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 }