<div dir="ltr"><div>It says that InvMod(18446744073709551615, 340282366762482138434845932244680310781) is 170141183381241069226646338154899963903 but that's not true, because 170141183381241069226646338154899963903 * 18446744073709551615 % 340282366762482138434845932244680310781 is 4294967297, not 1.<br></div><div><br></div><div>It looks like this bug has been present at least since libgcrypt-1.2.0 from 2004.<br></div><div><br></div>#include <gcrypt.h><br><br>#define CF_CHECK_EQ(expr, res) if ( (expr) != (res) ) { goto end; }<br><br>int main(void)<br>{<br>    gcry_mpi_t A;<br>    gcry_mpi_t B;<br>    gcry_mpi_t C;<br>    gcry_error_t err;<br><br>    CF_CHECK_EQ(err = gcry_mpi_scan(&A, GCRYMPI_FMT_HEX, "ffffffffffffffff", 0, NULL), 0);<br>    CF_CHECK_EQ(err = gcry_mpi_scan(&B, GCRYMPI_FMT_HEX, "fffffffdfffffffffffffffffffffffd", 0, NULL), 0);<br>    CF_CHECK_EQ(err = gcry_mpi_scan(&C, GCRYMPI_FMT_HEX, "1", 0, NULL), 0);<br>    CF_CHECK_EQ(gcry_mpi_invm(C, A, B), 1);<br>    printf("Inverse exists\n");<br>end:<br><br>    return 0;<br>}<br></div>