genprime.c 535 B

123456789101112131415161718192021222324252627
  1. #include "os.h"
  2. #include <mp.h>
  3. #include <libsec.h>
  4. // generate a probable prime. accuracy is the miller-rabin interations
  5. void
  6. genprime(mpint *p, int n, int accuracy)
  7. {
  8. mpdigit x;
  9. // generate n random bits with high and low bits set
  10. mpbits(p, n);
  11. genrandom((uchar*)p->p, (n+7)/8);
  12. p->top = (n+Dbits-1)/Dbits;
  13. x = 1;
  14. x <<= ((n-1)%Dbits);
  15. p->p[p->top-1] &= (x-1);
  16. p->p[p->top-1] |= x;
  17. p->p[0] |= 1;
  18. // keep icrementing till it looks prime
  19. for(;;){
  20. if(probably_prime(p, accuracy))
  21. break;
  22. mpadd(p, mptwo, p);
  23. }
  24. }