#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; | |
} |