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