From 37da2899f40661e3e9631e497da8dc59b971cbd0 Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 17:07:39 +0000 Subject: 20060303a --- libsec/port/dsasign.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 libsec/port/dsasign.c (limited to 'libsec/port/dsasign.c') diff --git a/libsec/port/dsasign.c b/libsec/port/dsasign.c new file mode 100644 index 00000000..137134be --- /dev/null +++ b/libsec/port/dsasign.c @@ -0,0 +1,52 @@ +#include "os.h" +#include +#include + +DSAsig* +dsasign(DSApriv *priv, mpint *m) +{ + DSApub *pub = &priv->pub; + DSAsig *sig; + mpint *qm1, *k, *kinv, *r, *s; + mpint *q = pub->q, *p = pub->p, *alpha = pub->alpha; + int qlen = mpsignif(q); + + qm1 = mpnew(0); + kinv = mpnew(0); + r = mpnew(0); + s = mpnew(0); + k = mpnew(0); + mpsub(pub->q, mpone, qm1); + + // find a k that has an inverse mod q + while(1){ + mprand(qlen, genrandom, k); + if((mpcmp(mpone, k) > 0) || (mpcmp(k, pub->q) >= 0)) + continue; + mpextendedgcd(k, q, r, kinv, s); + if(mpcmp(r, mpone) != 0) + sysfatal("dsasign: pub->q not prime"); + break; + } + + // make kinv positive + mpmod(kinv, pub->q, kinv); + + // r = ((alpha**k) mod p) mod q + mpexp(alpha, k, p, r); + mpmod(r, q, r); + + // s = (kinv*(m + ar)) mod q + mpmul(r, priv->secret, s); + mpadd(s, m, s); + mpmul(s, kinv, s); + mpmod(s, q, s); + + sig = dsasigalloc(); + sig->r = r; + sig->s = s; + mpfree(qm1); + mpfree(k); + mpfree(kinv); + return sig; +} -- cgit v1.2.3