diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/unix/drawterm/libsec/dsasign.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/unix/drawterm/libsec/dsasign.c')
-rwxr-xr-x | sys/src/cmd/unix/drawterm/libsec/dsasign.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/sys/src/cmd/unix/drawterm/libsec/dsasign.c b/sys/src/cmd/unix/drawterm/libsec/dsasign.c new file mode 100755 index 000000000..abca3eb69 --- /dev/null +++ b/sys/src/cmd/unix/drawterm/libsec/dsasign.c @@ -0,0 +1,52 @@ +#include "os.h" +#include <mp.h> +#include <libsec.h> + +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, qm1) >= 0)) + continue; + mpextendedgcd(k, q, r, kinv, s); + if(mpcmp(r, mpone) != 0) + continue; + break; + } + + // make kinv positive + mpmod(kinv, qm1, 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; +} |