The following prints 0 but should print 25204017012210281742336 (on Linux x64):
#include <tommath.h>
#include <stdlib.h>
#define CHECK(x) if ( (x) != MP_OKAY ) abort();
int main(void)
{
mp_int base, exp, mod, res;
char str[1024];
CHECK(mp_init(&base));
CHECK(mp_init(&exp));
CHECK(mp_init(&mod));
CHECK(mp_init(&res));
CHECK(mp_read_radix(&base, "24", 10));
CHECK(mp_read_radix(&exp, "9223372036854775808", 10));
CHECK(mp_read_radix(&mod, "75556710804409716572160", 10));
CHECK(mp_exptmod(&base, &exp, &mod, &res));
CHECK(mp_to_radix(&res, str, 1024, NULL, 10));
printf("%s\n", str);
return 0;
}
If libtommath was compiled with -DMP_32BIT, the following prints 1 but should print 1073741825:
#include <tommath.h>
#include <stdlib.h>
#define CHECK(x) if ( (x) != MP_OKAY ) abort();
int main(void)
{
mp_int base, exp, mod, res;
char str[1024];
CHECK(mp_init(&base));
CHECK(mp_init(&exp));
CHECK(mp_init(&mod));
CHECK(mp_init(&res));
CHECK(mp_read_radix(&base, "67927325822352824469517479013", 10));
CHECK(mp_read_radix(&exp, "2147483648", 10));
CHECK(mp_read_radix(&mod, "1879048192", 10));
CHECK(mp_exptmod(&base, &exp, &mod, &res));
CHECK(mp_to_radix(&res, str, 1024, NULL, 10));
printf("%s\n", str);
return 0;
}
Bug introduced in e549ccf according to git bisect (Github lists the date as 2010 but it's actually 2004).
Found during audit of Nimbus funded by Ethereum.
The following prints
0but should print25204017012210281742336(on Linux x64):If libtommath was compiled with
-DMP_32BIT, the following prints1but should print1073741825:Bug introduced in e549ccf according to git bisect (Github lists the date as 2010 but it's actually 2004).
Found during audit of Nimbus funded by Ethereum.