1*80ee5cbfSDavid du Colombier #include "os.h"
2*80ee5cbfSDavid du Colombier #include <mp.h>
3*80ee5cbfSDavid du Colombier #include <libsec.h>
4*80ee5cbfSDavid du Colombier
5*80ee5cbfSDavid du Colombier mpint*
egdecrypt(EGpriv * priv,mpint * in,mpint * out)6*80ee5cbfSDavid du Colombier egdecrypt(EGpriv *priv, mpint *in, mpint *out)
7*80ee5cbfSDavid du Colombier {
8*80ee5cbfSDavid du Colombier EGpub *pub = &priv->pub;
9*80ee5cbfSDavid du Colombier mpint *gamma, *delta;
10*80ee5cbfSDavid du Colombier mpint *p = pub->p;
11*80ee5cbfSDavid du Colombier int plen = mpsignif(p)+1;
12*80ee5cbfSDavid du Colombier int shift = ((plen+Dbits-1)/Dbits)*Dbits;
13*80ee5cbfSDavid du Colombier
14*80ee5cbfSDavid du Colombier if(out == nil)
15*80ee5cbfSDavid du Colombier out = mpnew(0);
16*80ee5cbfSDavid du Colombier gamma = mpnew(0);
17*80ee5cbfSDavid du Colombier delta = mpnew(0);
18*80ee5cbfSDavid du Colombier mpright(in, shift, gamma);
19*80ee5cbfSDavid du Colombier mpleft(gamma, shift, delta);
20*80ee5cbfSDavid du Colombier mpsub(in, delta, delta);
21*80ee5cbfSDavid du Colombier mpexp(gamma, priv->secret, p, out);
22*80ee5cbfSDavid du Colombier mpinvert(out, p, gamma);
23*80ee5cbfSDavid du Colombier mpmul(gamma, delta, out);
24*80ee5cbfSDavid du Colombier mpmod(out, p, out);
25*80ee5cbfSDavid du Colombier mpfree(gamma);
26*80ee5cbfSDavid du Colombier mpfree(delta);
27*80ee5cbfSDavid du Colombier return out;
28*80ee5cbfSDavid du Colombier }
29