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 // decrypt rsa using garner's algorithm for the chinese remainder theorem
6*80ee5cbfSDavid du Colombier // seminumerical algorithms, knuth, pp 253-254
7*80ee5cbfSDavid du Colombier // applied cryptography, menezes et al, pg 612
8*80ee5cbfSDavid du Colombier mpint*
rsadecrypt(RSApriv * rsa,mpint * in,mpint * out)9*80ee5cbfSDavid du Colombier rsadecrypt(RSApriv *rsa, mpint *in, mpint *out)
10*80ee5cbfSDavid du Colombier {
11*80ee5cbfSDavid du Colombier mpint *v1, *v2;
12*80ee5cbfSDavid du Colombier
13*80ee5cbfSDavid du Colombier if(out == nil)
14*80ee5cbfSDavid du Colombier out = mpnew(0);
15*80ee5cbfSDavid du Colombier
16*80ee5cbfSDavid du Colombier // convert in to modular representation
17*80ee5cbfSDavid du Colombier v1 = mpnew(0);
18*80ee5cbfSDavid du Colombier mpmod(in, rsa->p, v1);
19*80ee5cbfSDavid du Colombier v2 = mpnew(0);
20*80ee5cbfSDavid du Colombier mpmod(in, rsa->q, v2);
21*80ee5cbfSDavid du Colombier
22*80ee5cbfSDavid du Colombier // exponentiate the modular rep
23*80ee5cbfSDavid du Colombier mpexp(v1, rsa->kp, rsa->p, v1);
24*80ee5cbfSDavid du Colombier mpexp(v2, rsa->kq, rsa->q, v2);
25*80ee5cbfSDavid du Colombier
26*80ee5cbfSDavid du Colombier // out = v1 + p*((v2-v1)*c2 mod q)
27*80ee5cbfSDavid du Colombier mpsub(v2, v1, v2);
28*80ee5cbfSDavid du Colombier mpmul(v2, rsa->c2, v2);
29*80ee5cbfSDavid du Colombier mpmod(v2, rsa->q, v2);
30*80ee5cbfSDavid du Colombier mpmul(v2, rsa->p, out);
31*80ee5cbfSDavid du Colombier mpadd(v1, out, out);
32*80ee5cbfSDavid du Colombier
33*80ee5cbfSDavid du Colombier mpfree(v1);
34*80ee5cbfSDavid du Colombier mpfree(v2);
35*80ee5cbfSDavid du Colombier
36*80ee5cbfSDavid du Colombier return out;
37*80ee5cbfSDavid du Colombier }
38