18template <
typename Params>
19class Secp192r1Rep final {
21 static constexpr auto P = Params::P;
22 static constexpr size_t N = Params::N;
23 typedef typename Params::W W;
25 constexpr static std::array<W, N> redc(
const std::array<W, 2 * N>& z) {
29 const dword S01 = dword(z[0]) + z[3] + z[5];
30 const dword S23 = dword(z[1]) + z[3] + z[4] + z[5];
31 const dword S45 = dword(z[2]) + z[4] + z[5];
33 std::array<W, N> r = {};
36 r[0] =
static_cast<uint64_t
>(S);
40 r[1] =
static_cast<uint64_t
>(S);
44 r[2] =
static_cast<uint64_t
>(S);
67 const int64_t S0 = X00 + X06 + X10;
68 const int64_t S1 = X01 + X07 + X11;
69 const int64_t S2 = X02 + X06 + X08 + X10;
70 const int64_t S3 = X03 + X07 + X09 + X11;
71 const int64_t S4 = X04 + X08 + X10;
72 const int64_t S5 = X05 + X09 + X11;
74 std::array<W, N> r = {};
93 constexpr static std::array<W, N> one() {
return std::array<W, N>{1}; }
95 constexpr static std::array<W, N> to_rep(
const std::array<W, N>& x) {
return x; }
97 constexpr static std::array<W, N> wide_to_rep(
const std::array<W, 2 * N>& x) {
return redc(x); }
99 constexpr static std::array<W, N> from_rep(
const std::array<W, N>& z) {
return z; }
105 constexpr static std::array<W, N> p192_mul_mod_192(W i) {
127 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
128 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
129 "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
130 "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
131 "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
132 "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811"> {
137class Curve final :
public EllipticCurve<Params, Secp192r1Rep> {
140 static constexpr FieldElement fe_invert2(
const FieldElement& x) {
144 auto t0 = z.square();
146 auto t2 = t0.square();
147 auto t1 = t2.square();