@@ -474,17 +474,43 @@ TEST(Crypto, fe_constants)
474474 ASSERT_TRUE (memcmp (fe_sqrtm1, sqrtm1, sizeof (fe)) == 0 );
475475}
476476
477- TEST (Crypto, torsion_check_pass )
477+ TEST (Crypto, torsion_check_pass_random )
478478{
479- const cryptonote::keypair kp = cryptonote::keypair::generate (hw::get_device (" default" ));
480- ge_p3 x;
481- ASSERT_EQ (ge_frombytes_vartime (&x, (const unsigned char *)kp.pub .data ), 0 );
482- const rct::key k = rct::pk2rct (kp.pub );
483- ASSERT_TRUE (rct::isInMainSubgroup (k));
484- ASSERT_FALSE (fcmp_pp::mul8_is_identity (x));
485- ASSERT_TRUE (fcmp_pp::torsion_check_vartime (x));
486- const rct::key cleared = fcmp_pp::clear_torsion (x);
487- ASSERT_EQ (k, cleared);
479+ for (int i = 0 ; i < 1000 ; ++i)
480+ {
481+ const cryptonote::keypair kp = cryptonote::keypair::generate (hw::get_device (" default" ));
482+ ge_p3 x;
483+ ASSERT_EQ (ge_frombytes_vartime (&x, (const unsigned char *)kp.pub .data ), 0 );
484+ const rct::key k = rct::pk2rct (kp.pub );
485+ ASSERT_TRUE (rct::isInMainSubgroup (k));
486+ ASSERT_FALSE (fcmp_pp::mul8_is_identity (x));
487+ ASSERT_TRUE (fcmp_pp::torsion_check_vartime (x));
488+ const rct::key cleared = fcmp_pp::clear_torsion (x);
489+ ASSERT_EQ (k, cleared);
490+ }
491+ }
492+
493+ TEST (Crypto, torsion_check_pass_hardcoded)
494+ {
495+ static constexpr const char *torsion_free_points[] = {
496+ // Fails in check_e_u_w without correctly implemented fe_compare
497+ " 785eda585dca4f3d27976106008ccfbca13146c8b21b8c7e4909032639a776e1" ,
498+ // Fails in inv_psi2 without correctly implemented fe_compare
499+ " 9a7b10563aa266032cd075f4e347f348a3841ae4f41572633351a97dd44066b4"
500+ };
501+
502+ for (const auto point : torsion_free_points)
503+ {
504+ rct::key k;
505+ epee::string_tools::hex_to_pod (point, k);
506+ ge_p3 x;
507+ ASSERT_EQ (ge_frombytes_vartime (&x, k.bytes ), 0 );
508+ ASSERT_TRUE (rct::isInMainSubgroup (k));
509+ ASSERT_FALSE (fcmp_pp::mul8_is_identity (x));
510+ ASSERT_TRUE (fcmp_pp::torsion_check_vartime (x));
511+ const rct::key cleared = fcmp_pp::clear_torsion (x);
512+ ASSERT_EQ (k, cleared);
513+ }
488514}
489515
490516TEST (Crypto, torsion_check_torsioned_point)
0 commit comments