Blame


1 0fc65b37 2004-03-21 devnull #include "os.h"
2 0fc65b37 2004-03-21 devnull #include <mp.h>
3 0fc65b37 2004-03-21 devnull #include <libsec.h>
4 0fc65b37 2004-03-21 devnull
5 cbeb0b26 2006-04-01 devnull /* decrypt rsa using garner's algorithm for the chinese remainder theorem */
6 cbeb0b26 2006-04-01 devnull /* seminumerical algorithms, knuth, pp 253-254 */
7 cbeb0b26 2006-04-01 devnull /* applied cryptography, menezes et al, pg 612 */
8 0fc65b37 2004-03-21 devnull mpint*
9 0fc65b37 2004-03-21 devnull rsadecrypt(RSApriv *rsa, mpint *in, mpint *out)
10 0fc65b37 2004-03-21 devnull {
11 0fc65b37 2004-03-21 devnull mpint *v1, *v2;
12 0fc65b37 2004-03-21 devnull
13 0fc65b37 2004-03-21 devnull if(out == nil)
14 0fc65b37 2004-03-21 devnull out = mpnew(0);
15 0fc65b37 2004-03-21 devnull
16 cbeb0b26 2006-04-01 devnull /* convert in to modular representation */
17 0fc65b37 2004-03-21 devnull v1 = mpnew(0);
18 0fc65b37 2004-03-21 devnull mpmod(in, rsa->p, v1);
19 0fc65b37 2004-03-21 devnull v2 = mpnew(0);
20 0fc65b37 2004-03-21 devnull mpmod(in, rsa->q, v2);
21 0fc65b37 2004-03-21 devnull
22 cbeb0b26 2006-04-01 devnull /* exponentiate the modular rep */
23 0fc65b37 2004-03-21 devnull mpexp(v1, rsa->kp, rsa->p, v1);
24 0fc65b37 2004-03-21 devnull mpexp(v2, rsa->kq, rsa->q, v2);
25 fa325e9b 2020-01-10 cross
26 cbeb0b26 2006-04-01 devnull /* out = v1 + p*((v2-v1)*c2 mod q) */
27 0fc65b37 2004-03-21 devnull mpsub(v2, v1, v2);
28 0fc65b37 2004-03-21 devnull mpmul(v2, rsa->c2, v2);
29 0fc65b37 2004-03-21 devnull mpmod(v2, rsa->q, v2);
30 0fc65b37 2004-03-21 devnull mpmul(v2, rsa->p, out);
31 0fc65b37 2004-03-21 devnull mpadd(v1, out, out);
32 0fc65b37 2004-03-21 devnull
33 0fc65b37 2004-03-21 devnull mpfree(v1);
34 0fc65b37 2004-03-21 devnull mpfree(v2);
35 0fc65b37 2004-03-21 devnull
36 0fc65b37 2004-03-21 devnull return out;
37 0fc65b37 2004-03-21 devnull }