| #include "os.h" | 
 | #include <mp.h> | 
 | #include <libsec.h> | 
 |  | 
 | RSApriv* | 
 | rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q) | 
 | { | 
 | 	mpint *c2, *kq, *kp, *x; | 
 | 	RSApriv *rsa; | 
 |  | 
 | 	/* make sure we're not being hoodwinked */ | 
 | 	if(!probably_prime(p, 10) || !probably_prime(q, 10)){ | 
 | 		werrstr("rsafill: p or q not prime"); | 
 | 		return nil; | 
 | 	} | 
 | 	x = mpnew(0); | 
 | 	mpmul(p, q, x); | 
 | 	if(mpcmp(n, x) != 0){ | 
 | 		werrstr("rsafill: n != p*q"); | 
 | 		mpfree(x); | 
 | 		return nil; | 
 | 	} | 
 | 	c2 = mpnew(0); | 
 | 	mpsub(p, mpone, c2); | 
 | 	mpsub(q, mpone, x); | 
 | 	mpmul(c2, x, x); | 
 | 	mpmul(e, d, c2); | 
 | 	mpmod(c2, x, x); | 
 | 	if(mpcmp(x, mpone) != 0){ | 
 | 		werrstr("rsafill: e*d != 1 mod (p-1)*(q-1)"); | 
 | 		mpfree(x); | 
 | 		mpfree(c2); | 
 | 		return nil; | 
 | 	} | 
 |  | 
 | 	/* compute chinese remainder coefficient */ | 
 | 	mpinvert(p, q, c2); | 
 |  | 
 | 	/* for crt a**k mod p == (a**(k mod p-1)) mod p */ | 
 | 	kq = mpnew(0); | 
 | 	kp = mpnew(0); | 
 | 	mpsub(p, mpone, x); | 
 | 	mpmod(d, x, kp); | 
 | 	mpsub(q, mpone, x); | 
 | 	mpmod(d, x, kq); | 
 |  | 
 | 	rsa = rsaprivalloc(); | 
 | 	rsa->pub.ek = mpcopy(e); | 
 | 	rsa->pub.n = mpcopy(n); | 
 | 	rsa->dk = mpcopy(d); | 
 | 	rsa->kp = kp; | 
 | 	rsa->kq = kq; | 
 | 	rsa->p = mpcopy(p); | 
 | 	rsa->q = mpcopy(q); | 
 | 	rsa->c2 = c2; | 
 |  | 
 | 	mpfree(x); | 
 |  | 
 | 	return rsa; | 
 | } | 
 |  |