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