Permalink
Cannot retrieve contributors at this time
Fetching contributors…

/* LibTomMath, multiple-precision integer library -- Tom St Denis | |
* | |
* LibTomMath is a library that provides multiple-precision | |
* integer arithmetic as well as number theoretic functionality. | |
* | |
* The library was designed directly after the MPI library by | |
* Michael Fromberger but has been written from scratch with | |
* additional optimizations in place. | |
* | |
* The library is free for all purposes without any express | |
* guarantee it works. | |
* | |
* Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org | |
*/ | |
#include <tommath.h> | |
/* stores a bignum as a ASCII string in a given radix (2..64) */ | |
int mp_toradix (mp_int * a, char *str, int radix) | |
{ | |
int res, digs; | |
mp_int t; | |
mp_digit d; | |
char *_s = str; | |
/* check range of the radix */ | |
if (radix < 2 || radix > 64) { | |
return MP_VAL; | |
} | |
/* quick out if its zero */ | |
if (mp_iszero(a) == 1) { | |
*str++ = '0'; | |
*str = '\0'; | |
return MP_OKAY; | |
} | |
if ((res = mp_init_copy (&t, a)) != MP_OKAY) { | |
return res; | |
} | |
/* if it is negative output a - */ | |
if (t.sign == MP_NEG) { | |
++_s; | |
*str++ = '-'; | |
t.sign = MP_ZPOS; | |
} | |
digs = 0; | |
while (mp_iszero (&t) == 0) { | |
if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { | |
mp_clear (&t); | |
return res; | |
} | |
*str++ = mp_s_rmap[d]; | |
++digs; | |
} | |
/* reverse the digits of the string. In this case _s points | |
* to the first digit [exluding the sign] of the number] | |
*/ | |
bn_reverse ((unsigned char *)_s, digs); | |
/* append a NULL so the string is properly terminated */ | |
*str = '\0'; | |
mp_clear (&t); | |
return MP_OKAY; | |
} | |