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