|  | #include "os.h" | 
|  | #include <mp.h> | 
|  | #include <libsec.h> | 
|  |  | 
|  | /*  generate a probable prime.  accuracy is the miller-rabin interations */ | 
|  | void | 
|  | genprime(mpint *p, int n, int accuracy) | 
|  | { | 
|  | mpdigit x; | 
|  |  | 
|  | /* generate n random bits with high and low bits set */ | 
|  | mpbits(p, n); | 
|  | genrandom((uchar*)p->p, (n+7)/8); | 
|  | p->top = (n+Dbits-1)/Dbits; | 
|  | x = 1; | 
|  | x <<= ((n-1)%Dbits); | 
|  | p->p[p->top-1] &= (x-1); | 
|  | p->p[p->top-1] |= x; | 
|  | p->p[0] |= 1; | 
|  |  | 
|  | /* keep icrementing till it looks prime */ | 
|  | for(;;){ | 
|  | if(probably_prime(p, accuracy)) | 
|  | break; | 
|  | mpadd(p, mptwo, p); | 
|  | } | 
|  | } |