Some of ElGamal samples were generated by using the following custom key generation snippet: { std::unique_ptr rng; rng.reset(new Botan::System_RNG); Botan::BigInt p = Botan::random_prime(*rng, keybits, 0, 2, 3, 64); Botan::BigInt p1(p - 1); Botan::BigInt sg = 1; Botan::BigInt g; size_t mod = 2; while (mod < 65536) { if (p1 % mod == 0) { if (sg * mod > (1 << 16)) { break; } RNP_LOG("Reduced by %zu", mod); p1 = p1 / mod; sg *= mod; continue; } mod++; } if (Botan::power_mod(3, p - 1, p).cmp_word(1) != 0) { RNP_LOG("3 ^ (p - 1) != 1 (mod p)"); goto end; } Botan::BigInt ng = Botan::power_mod(3, p1, p); if (Botan::power_mod(ng, sg, p).cmp_word(1) != 0) { RNP_LOG("ng ^ sg != 1 (mod p)"); goto end; } g = ng; Botan::BigInt x(*rng, keybits, true); Botan::BigInt y = Botan::power_mod(g, x, p); key->p.len = p.bytes(); p.binary_encode(key->p.mpi); key->g.len = g.bytes(); g.binary_encode(key->g.mpi); key->x.len = x.bytes(); x.binary_encode(key->x.mpi); key->y.len = y.bytes(); y.binary_encode(key->y.mpi); ret = RNP_SUCCESS; }