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/egsign.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/egsign.c')
-rw-r--r-- | src/libsec/port/egsign.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/libsec/port/egsign.c b/src/libsec/port/egsign.c new file mode 100644 index 00000000..10540041 --- /dev/null +++ b/src/libsec/port/egsign.c @@ -0,0 +1,43 @@ +#include "os.h" +#include <mp.h> +#include <libsec.h> + +EGsig* +egsign(EGpriv *priv, mpint *m) +{ + EGpub *pub = &priv->pub; + EGsig *sig; + mpint *pm1, *k, *kinv, *r, *s; + mpint *p = pub->p, *alpha = pub->alpha; + int plen = mpsignif(p); + + pm1 = mpnew(0); + kinv = mpnew(0); + r = mpnew(0); + s = mpnew(0); + k = mpnew(0); + mpsub(p, mpone, pm1); + while(1){ + mprand(plen, genrandom, k); + if((mpcmp(mpone, k) > 0) || (mpcmp(k, pm1) >= 0)) + continue; + mpextendedgcd(k, pm1, r, kinv, s); + if(mpcmp(r, mpone) != 0) + continue; + break; + } + mpmod(kinv, pm1, kinv); // make kinv positive + mpexp(alpha, k, p, r); + mpmul(priv->secret, r, s); + mpmod(s, pm1, s); + mpsub(m, s, s); + mpmul(kinv, s, s); + mpmod(s, pm1, s); + sig = egsigalloc(); + sig->r = r; + sig->s = s; + mpfree(pm1); + mpfree(k); + mpfree(kinv); + return sig; +} |