| #include "os.h" |
| #include <mp.h> |
| #include <libsec.h> |
| |
| mpint* |
| egencrypt(EGpub *pub, mpint *in, mpint *out) |
| { |
| mpint *m, *k, *gamma, *delta, *pm1; |
| mpint *p = pub->p, *alpha = pub->alpha; |
| int plen = mpsignif(p); |
| int shift = ((plen+Dbits)/Dbits)*Dbits; |
| /* in libcrypt version, (int)(LENGTH(pub->p)*sizeof(NumType)*CHARBITS); */ |
| |
| if(out == nil) |
| out = mpnew(0); |
| pm1 = mpnew(0); |
| m = mpnew(0); |
| gamma = mpnew(0); |
| delta = mpnew(0); |
| mpmod(in, p, m); |
| while(1){ |
| k = mprand(plen, genrandom, nil); |
| if((mpcmp(mpone, k) <= 0) && (mpcmp(k, pm1) < 0)) |
| break; |
| } |
| mpexp(alpha, k, p, gamma); |
| mpexp(pub->key, k, p, delta); |
| mpmul(m, delta, delta); |
| mpmod(delta, p, delta); |
| mpleft(gamma, shift, out); |
| mpadd(delta, out, out); |
| mpfree(pm1); |
| mpfree(m); |
| mpfree(k); |
| mpfree(gamma); |
| mpfree(delta); |
| return out; |
| } |