PointGFp::PointGFp(const CurveGFp& curve) : curve(curve), ws(2 * (curve.get_p_words() + 2)) { coord_x = 0; coord_y = monty_mult(1, curve.get_r2()); coord_z = 0; }
PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : curve(curve), ws(2 * (curve.get_p_words() + 2)) { coord_x = monty_mult(x, curve.get_r2()); coord_y = monty_mult(y, curve.get_r2()); coord_z = monty_mult(1, curve.get_r2()); }
PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : m_curve(curve), m_coord_x(x), m_coord_y(y), m_coord_z(1) { if(x <= 0 || x >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp affine x"); if(y <= 0 || y >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp affine y"); m_curve.to_rep(m_coord_x, m_monty_ws); m_curve.to_rep(m_coord_y, m_monty_ws); m_curve.to_rep(m_coord_z, m_monty_ws); }
PointGFp OS2ECP(const uint8_t data[], size_t data_len, const CurveGFp& curve) { // Should we really be doing this? if(data_len <= 1) return PointGFp(curve); // return zero std::pair<BigInt, BigInt> xy = OS2ECP(data, data_len, curve.get_p(), curve.get_a(), curve.get_b()); PointGFp point(curve, xy.first, xy.second); if(!point.on_the_curve()) throw Illegal_Point("OS2ECP: Decoded point was not on the curve"); return point; }