| 5 | |
| 6 | |
| 7 | void Zp_Data::init(const bigint& p,bool mont) |
| 8 | { |
| 9 | lock.lock(); |
| 10 | |
| 11 | if (pr != 0) |
| 12 | { |
| 13 | #ifdef VERBOSE |
| 14 | if (pr != p) |
| 15 | cerr << "Changing prime from " << pr << " to " << p << endl; |
| 16 | if (mont != montgomery) |
| 17 | cerr << "Changing Montgomery" << endl; |
| 18 | #endif |
| 19 | if (pr != p or mont != montgomery) |
| 20 | throw runtime_error("Zp_Data instance already initialized"); |
| 21 | } |
| 22 | |
| 23 | if (not probPrime(p)) |
| 24 | throw runtime_error(p.get_str() + " is not a prime"); |
| 25 | |
| 26 | pr=p; |
| 27 | pr_half = p / 2; |
| 28 | mask=static_cast<mp_limb_t>(1ULL<<((mpz_sizeinbase(pr.get_mpz_t(),2)-1)%(8*sizeof(mp_limb_t))))-1; |
| 29 | pr_byte_length = numBytes(pr); |
| 30 | pr_bit_length = numBits(pr); |
| 31 | int k = pr_bit_length; |
| 32 | overhang = (uint64_t(-1LL) >> (63 - (k - 1) % 64)); |
| 33 | |
| 34 | montgomery=mont; |
| 35 | t=mpz_size(pr.get_mpz_t()); |
| 36 | if (t>MAX_MOD_SZ) |
| 37 | throw max_mod_sz_too_small(t); |
| 38 | if (montgomery) |
| 39 | { inline_mpn_zero(R,MAX_MOD_SZ); |
| 40 | inline_mpn_zero(R2,MAX_MOD_SZ); |
| 41 | inline_mpn_zero(R3,MAX_MOD_SZ); |
| 42 | bigint r=2,pp=pr; |
| 43 | mpz_pow_ui(r.get_mpz_t(),r.get_mpz_t(),t*8*sizeof(mp_limb_t)); |
| 44 | mpz_invert(pp.get_mpz_t(),pr.get_mpz_t(),r.get_mpz_t()); |
| 45 | pp=r-pp; // pi=-1/p mod R |
| 46 | pi=(pp.get_mpz_t()->_mp_d)[0]; |
| 47 | |
| 48 | r=r%pr; |
| 49 | mpn_copyi(R,r.get_mpz_t()->_mp_d,mpz_size(r.get_mpz_t())); |
| 50 | |
| 51 | bigint r2=(r*r)%pr; |
| 52 | mpn_copyi(R2,r2.get_mpz_t()->_mp_d,mpz_size(r2.get_mpz_t())); |
| 53 | |
| 54 | bigint r3=(r2*r)%pr; |
| 55 | mpn_copyi(R3,r3.get_mpz_t()->_mp_d,mpz_size(r3.get_mpz_t())); |
| 56 | |
| 57 | if (sizeof(unsigned long)!=sizeof(mp_limb_t)) |
| 58 | { cout << "The underlying types of GMP mean we cannot use our Montgomery code" << endl; |
| 59 | throw not_implemented(); |
| 60 | } |
| 61 | } |
| 62 | inline_mpn_zero(prA,MAX_MOD_SZ+1); |
| 63 | mpn_copyi(prA,pr.get_mpz_t()->_mp_d,t); |
| 64 |
no test coverage detected