29 lines
564 B
C
29 lines
564 B
C
|
#include "os.h"
|
||
|
#include <mp.h>
|
||
|
#include <libsec.h>
|
||
|
|
||
|
mpint*
|
||
|
egdecrypt(EGpriv *priv, mpint *in, mpint *out)
|
||
|
{
|
||
|
EGpub *pub = &priv->pub;
|
||
|
mpint *gamma, *delta;
|
||
|
mpint *p = pub->p;
|
||
|
int plen = mpsignif(p)+1;
|
||
|
int shift = ((plen+Dbits-1)/Dbits)*Dbits;
|
||
|
|
||
|
if(out == nil)
|
||
|
out = mpnew(0);
|
||
|
gamma = mpnew(0);
|
||
|
delta = mpnew(0);
|
||
|
mpright(in, shift, gamma);
|
||
|
mpleft(gamma, shift, delta);
|
||
|
mpsub(in, delta, delta);
|
||
|
mpexp(gamma, priv->secret, p, out);
|
||
|
mpinvert(out, p, gamma);
|
||
|
mpmul(gamma, delta, out);
|
||
|
mpmod(out, p, out);
|
||
|
mpfree(gamma);
|
||
|
mpfree(delta);
|
||
|
return out;
|
||
|
}
|