From 6df187aea440d1859393675de264a86a4936f9ca Mon Sep 17 00:00:00 2001 From: Moritz Lenz Date: Sun, 13 Nov 2011 19:17:46 +0100 Subject: [PATCH] Add set_long and get_long functions They work on platform-dependent long ints --- bn_mp_get_long.c | 39 +++++++++++++++++++++++++++++++++++++++ bn_mp_set_long.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ tommath.h | 6 ++++++ 3 files changed, 93 insertions(+) create mode 100644 bn_mp_get_long.c create mode 100644 bn_mp_set_long.c diff --git a/bn_mp_get_long.c b/bn_mp_get_long.c new file mode 100644 index 0000000..1ea6a85 --- /dev/null +++ b/bn_mp_get_long.c @@ -0,0 +1,39 @@ +#include +#ifdef BN_MP_GET_INT_C +/* 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@gmail.com, http://libtom.org + */ + +/* get the lower unsigned long of an mp_int, platform dependent */ +unsigned long mp_get_long(mp_int * a) +{ + int i; + unsigned long res; + + if (a->used == 0) { + return 0; + } + + /* get number of digits of the lsb we have to read */ + i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; + + /* get most significant digit of result */ + res = DIGIT(a,i); + + while (--i >= 0) { + res = (res << DIGIT_BIT) | DIGIT(a,i); + } + return res; +} +#endif diff --git a/bn_mp_set_long.c b/bn_mp_set_long.c new file mode 100644 index 0000000..7751016 --- /dev/null +++ b/bn_mp_set_long.c @@ -0,0 +1,48 @@ +#include +#ifdef BN_MP_SET_INT_C +/* 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@gmail.com, http://libtom.org + */ + +/* set a platform dependent unsigned long int */ +int mp_set_long (mp_int * a, unsigned long b) +{ + int x, res; + + mp_zero (a); + + /* set four bits at a time */ + for (x = 0; x < sizeof(unsigned long) * 2; x++) { + /* shift the number up four bits */ + if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { + return res; + } + + /* OR in the top four bits of the source */ + a->dp[0] |= (b >> ((sizeof(unsigned long)) * 8 - 4)) & 15; + + /* shift the source up to the next four bits */ + b <<= 4; + + /* ensure that digits are not clamped off */ + a->used += 1; + } + mp_clamp (a); + return MP_OKAY; +} +#endif + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/tommath.h b/tommath.h index 800d4b6..a3faf35 100644 --- a/tommath.h +++ b/tommath.h @@ -242,9 +242,15 @@ void mp_set(mp_int *a, mp_digit b); /* set a 32-bit const */ int mp_set_int(mp_int *a, unsigned long b); +/* set a platform dependent unsigned long value */ +int mp_set_long(mp_int *a, unsigned long b); + /* get a 32-bit value */ unsigned long mp_get_int(mp_int * a); +/* get a platform dependent unsigned long value */ +unsigned long mp_get_long(mp_int * a); + /* initialize and set a digit */ int mp_init_set (mp_int * a, mp_digit b);