diff options
author | rsc <devnull@localhost> | 2004-03-21 14:04:56 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-03-21 14:04:56 +0000 |
commit | 0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4 (patch) | |
tree | dd9189a823998f494082adb769451f12be056566 /src/libsec/port/dsagen.c | |
parent | 768206abfcf505fb034a0151bf263bc0b1f2380c (diff) | |
download | plan9port-0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4.tar.gz plan9port-0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4.tar.bz2 plan9port-0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4.zip |
Add most of libsec.
Diffstat (limited to 'src/libsec/port/dsagen.c')
-rw-r--r-- | src/libsec/port/dsagen.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/libsec/port/dsagen.c b/src/libsec/port/dsagen.c new file mode 100644 index 00000000..46c369e1 --- /dev/null +++ b/src/libsec/port/dsagen.c @@ -0,0 +1,58 @@ +#include "os.h" +#include <mp.h> +#include <libsec.h> + +DSApriv* +dsagen(DSApub *opub) +{ + DSApub *pub; + DSApriv *priv; + mpint *exp; + mpint *g; + mpint *r; + int bits; + + priv = dsaprivalloc(); + pub = &priv->pub; + + if(opub != nil){ + pub->p = mpcopy(opub->p); + pub->q = mpcopy(opub->q); + } else { + pub->p = mpnew(0); + pub->q = mpnew(0); + DSAprimes(pub->q, pub->p, nil); + } + bits = Dbits*pub->p->top; + + pub->alpha = mpnew(0); + pub->key = mpnew(0); + priv->secret = mpnew(0); + + // find a generator alpha of the multiplicative + // group Z*p, i.e., of order n = p-1. We use the + // fact that q divides p-1 to reduce the exponent. + exp = mpnew(0); + g = mpnew(0); + r = mpnew(0); + mpsub(pub->p, mpone, exp); + mpdiv(exp, pub->q, exp, r); + if(mpcmp(r, mpzero) != 0) + sysfatal("dsagen foul up"); + while(1){ + mprand(bits, genrandom, g); + mpmod(g, pub->p, g); + mpexp(g, exp, pub->p, pub->alpha); + if(mpcmp(pub->alpha, mpone) != 0) + break; + } + mpfree(g); + mpfree(exp); + + // create the secret key + mprand(bits, genrandom, priv->secret); + mpmod(priv->secret, pub->p, priv->secret); + mpexp(pub->alpha, priv->secret, pub->p, pub->key); + + return priv; +} |