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 0fc65b37 2004-03-21 devnull RSApriv*
6 0fc65b37 2004-03-21 devnull rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q)
7 0fc65b37 2004-03-21 devnull {
8 0fc65b37 2004-03-21 devnull mpint *c2, *kq, *kp, *x;
9 0fc65b37 2004-03-21 devnull RSApriv *rsa;
10 0fc65b37 2004-03-21 devnull
11 cbeb0b26 2006-04-01 devnull /* make sure we're not being hoodwinked */
12 0fc65b37 2004-03-21 devnull if(!probably_prime(p, 10) || !probably_prime(q, 10)){
13 0fc65b37 2004-03-21 devnull werrstr("rsafill: p or q not prime");
14 0fc65b37 2004-03-21 devnull return nil;
15 0fc65b37 2004-03-21 devnull }
16 0fc65b37 2004-03-21 devnull x = mpnew(0);
17 0fc65b37 2004-03-21 devnull mpmul(p, q, x);
18 0fc65b37 2004-03-21 devnull if(mpcmp(n, x) != 0){
19 0fc65b37 2004-03-21 devnull werrstr("rsafill: n != p*q");
20 0fc65b37 2004-03-21 devnull mpfree(x);
21 0fc65b37 2004-03-21 devnull return nil;
22 0fc65b37 2004-03-21 devnull }
23 0fc65b37 2004-03-21 devnull c2 = mpnew(0);
24 0fc65b37 2004-03-21 devnull mpsub(p, mpone, c2);
25 0fc65b37 2004-03-21 devnull mpsub(q, mpone, x);
26 0fc65b37 2004-03-21 devnull mpmul(c2, x, x);
27 0fc65b37 2004-03-21 devnull mpmul(e, d, c2);
28 0fc65b37 2004-03-21 devnull mpmod(c2, x, x);
29 0fc65b37 2004-03-21 devnull if(mpcmp(x, mpone) != 0){
30 0fc65b37 2004-03-21 devnull werrstr("rsafill: e*d != 1 mod (p-1)*(q-1)");
31 0fc65b37 2004-03-21 devnull mpfree(x);
32 0fc65b37 2004-03-21 devnull mpfree(c2);
33 0fc65b37 2004-03-21 devnull return nil;
34 0fc65b37 2004-03-21 devnull }
35 0fc65b37 2004-03-21 devnull
36 cbeb0b26 2006-04-01 devnull /* compute chinese remainder coefficient */
37 0fc65b37 2004-03-21 devnull mpinvert(p, q, c2);
38 0fc65b37 2004-03-21 devnull
39 cbeb0b26 2006-04-01 devnull /* for crt a**k mod p == (a**(k mod p-1)) mod p */
40 0fc65b37 2004-03-21 devnull kq = mpnew(0);
41 0fc65b37 2004-03-21 devnull kp = mpnew(0);
42 0fc65b37 2004-03-21 devnull mpsub(p, mpone, x);
43 0fc65b37 2004-03-21 devnull mpmod(d, x, kp);
44 0fc65b37 2004-03-21 devnull mpsub(q, mpone, x);
45 0fc65b37 2004-03-21 devnull mpmod(d, x, kq);
46 0fc65b37 2004-03-21 devnull
47 0fc65b37 2004-03-21 devnull rsa = rsaprivalloc();
48 0fc65b37 2004-03-21 devnull rsa->pub.ek = mpcopy(e);
49 0fc65b37 2004-03-21 devnull rsa->pub.n = mpcopy(n);
50 0fc65b37 2004-03-21 devnull rsa->dk = mpcopy(d);
51 0fc65b37 2004-03-21 devnull rsa->kp = kp;
52 0fc65b37 2004-03-21 devnull rsa->kq = kq;
53 0fc65b37 2004-03-21 devnull rsa->p = mpcopy(p);
54 0fc65b37 2004-03-21 devnull rsa->q = mpcopy(q);
55 0fc65b37 2004-03-21 devnull rsa->c2 = c2;
56 0fc65b37 2004-03-21 devnull
57 0fc65b37 2004-03-21 devnull mpfree(x);
58 0fc65b37 2004-03-21 devnull
59 0fc65b37 2004-03-21 devnull return rsa;
60 0fc65b37 2004-03-21 devnull }