#include "os.h" | |
#include <mp.h> | |
#include <libsec.h> | |
/* decrypt rsa using garner's algorithm for the chinese remainder theorem */ | |
/* seminumerical algorithms, knuth, pp 253-254 */ | |
/* applied cryptography, menezes et al, pg 612 */ | |
mpint* | |
rsadecrypt(RSApriv *rsa, mpint *in, mpint *out) | |
{ | |
mpint *v1, *v2; | |
if(out == nil) | |
out = mpnew(0); | |
/* convert in to modular representation */ | |
v1 = mpnew(0); | |
mpmod(in, rsa->p, v1); | |
v2 = mpnew(0); | |
mpmod(in, rsa->q, v2); | |
/* exponentiate the modular rep */ | |
mpexp(v1, rsa->kp, rsa->p, v1); | |
mpexp(v2, rsa->kq, rsa->q, v2); | |
/* out = v1 + p*((v2-v1)*c2 mod q) */ | |
mpsub(v2, v1, v2); | |
mpmul(v2, rsa->c2, v2); | |
mpmod(v2, rsa->q, v2); | |
mpmul(v2, rsa->p, out); | |
mpadd(v1, out, out); | |
mpfree(v1); | |
mpfree(v2); | |
return out; | |
} |