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