/* * Create a DH private key */ DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { m_group = grp; if(x_arg == 0) { const BigInt& p = group_p(); m_x.randomize(rng, dl_exponent_size(p.bits())); } else { m_x = x_arg; } if(m_y == 0) { m_y = power_mod(group_g(), m_x, group_p()); } }
/* * DL_Group Constructor */ DL_Group::DL_Group(RandomNumberGenerator& rng, PrimeType type, size_t pbits, size_t qbits) { if(pbits < 1024) throw Invalid_Argument("DL_Group: prime size " + std::to_string(pbits) + " is too small"); if(type == Strong) { m_p = random_safe_prime(rng, pbits); m_q = (m_p - 1) / 2; m_g = 2; } else if(type == Prime_Subgroup) { if(!qbits) qbits = dl_exponent_size(pbits); m_q = random_prime(rng, qbits); BigInt X; while(m_p.bits() != pbits || !is_prime(m_p, rng)) { X.randomize(rng, pbits); m_p = X - (X % (2*m_q) - 1); } m_g = make_dsa_generator(m_p, m_q); } else if(type == DSA_Kosherizer) { qbits = qbits ? qbits : ((pbits <= 1024) ? 160 : 256); generate_dsa_primes(rng, m_p, m_q, pbits, qbits); m_g = make_dsa_generator(m_p, m_q); } m_initialized = true; }