1 #include <tommath.h> 2 #ifdef BN_MP_RADIX_SIZE_C 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis 4 * 5 * LibTomMath is a library that provides multiple-precision 6 * integer arithmetic as well as number theoretic functionality. 7 * 8 * The library was designed directly after the MPI library by 9 * Michael Fromberger but has been written from scratch with 10 * additional optimizations in place. 11 * 12 * The library is free for all purposes without any express 13 * guarantee it works. 14 * 15 * Tom St Denis, tomstdenis (at) gmail.com, http://math.libtomcrypt.com 16 */ 17 18 /* returns size of ASCII reprensentation */ 19 int mp_radix_size (mp_int * a, int radix, int *size) 20 { 21 int res, digs; 22 mp_int t; 23 mp_digit d; 24 25 *size = 0; 26 27 /* special case for binary */ 28 if (radix == 2) { 29 *size = mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; 30 return MP_OKAY; 31 } 32 33 /* make sure the radix is in range */ 34 if (radix < 2 || radix > 64) { 35 return MP_VAL; 36 } 37 38 if (mp_iszero(a) == MP_YES) { 39 *size = 2; 40 return MP_OKAY; 41 } 42 43 /* digs is the digit count */ 44 digs = 0; 45 46 /* if it's negative add one for the sign */ 47 if (a->sign == MP_NEG) { 48 ++digs; 49 } 50 51 /* init a copy of the input */ 52 if ((res = mp_init_copy (&t, a)) != MP_OKAY) { 53 return res; 54 } 55 56 /* force temp to positive */ 57 t.sign = MP_ZPOS; 58 59 /* fetch out all of the digits */ 60 while (mp_iszero (&t) == MP_NO) { 61 if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { 62 mp_clear (&t); 63 return res; 64 } 65 ++digs; 66 } 67 mp_clear (&t); 68 69 /* return digs + 1, the 1 is for the NULL byte that would be required. */ 70 *size = digs + 1; 71 return MP_OKAY; 72 } 73 74 #endif 75 76 /* $Source: /cvs/libtom/libtommath/bn_mp_radix_size.c,v $ */ 77 /* $Revision: 1.4 $ */ 78 /* $Date: 2006/03/31 14:18:44 $ */ 79