- 
                Notifications
    You must be signed in to change notification settings 
- Fork 212
Closed
Labels
Description
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.