added libtommath-0.37

This commit is contained in:
Tom St Denis 2005-11-18 05:16:19 +00:00 committed by Steffen Jaeckel
parent 9294e79150
commit fde740eae0
17 changed files with 183 additions and 146 deletions

BIN
bn.pdf

Binary file not shown.

2
bn.tex
View File

@ -49,7 +49,7 @@
\begin{document}
\frontmatter
\pagestyle{empty}
\title{LibTomMath User Manual \\ v0.36}
\title{LibTomMath User Manual \\ v0.37}
\author{Tom St Denis \\ tomstdenis@iahu.ca}
\maketitle
This text, the library and the accompanying textbook are all hereby placed in the public domain. This book has been

View File

@ -40,6 +40,9 @@ mp_add_d (mp_int * a, mp_digit b, mp_int * c)
/* fix sign */
a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res;
}

View File

@ -36,7 +36,7 @@ int mp_radix_size (mp_int * a, int radix, int *size)
}
if (mp_iszero(a) == MP_YES) {
*size = 2;
*size = 2;
return MP_OKAY;
}

View File

@ -21,6 +21,9 @@ int mp_read_radix (mp_int * a, const char *str, int radix)
int y, res, neg;
char ch;
/* zero the digit bignum */
mp_zero(a);
/* make sure the radix is ok */
if (radix < 2 || radix > 64) {
return MP_VAL;

View File

@ -36,6 +36,10 @@ mp_sub_d (mp_int * a, mp_digit b, mp_int * c)
a->sign = MP_ZPOS;
res = mp_add_d(a, b, c);
a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res;
}

View File

@ -27,12 +27,12 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
char *_s = str;
/* check range of the maxlen, radix */
if (maxlen < 3 || radix < 2 || radix > 64) {
if (maxlen < 2 || radix < 2 || radix > 64) {
return MP_VAL;
}
/* quick out if its zero */
if (mp_iszero(a) == 1) {
if (mp_iszero(a) == MP_YES) {
*str++ = '0';
*str = '\0';
return MP_OKAY;
@ -57,21 +57,20 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
digs = 0;
while (mp_iszero (&t) == 0) {
if (--maxlen < 1) {
/* no more room */
break;
}
if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
mp_clear (&t);
return res;
}
*str++ = mp_s_rmap[d];
++digs;
if (--maxlen == 1) {
/* no more room */
break;
}
}
/* reverse the digits of the string. In this case _s points
* to the first digit [exluding the sign] of the number]
* to the first digit [exluding the sign] of the number
*/
bn_reverse ((unsigned char *)_s, digs);

View File

@ -221,7 +221,7 @@ while (<IN>) {
$str = "chapter eight";
} elsif ($a == 9) {
$str = "chapter nine";
} elsif ($a == 2) {
} elsif ($a == 10) {
$str = "chapter ten";
}
} else {

View File

@ -1,3 +1,9 @@
November 18th, 2005
v0.37 -- [Don Porter] reported on a TCL list [HEY SEND ME BUGREPORTS ALREADY!!!] that mp_add_d() would compute -0 with some inputs. Fixed.
-- [rinick@gmail.com] reported the makefile.bcc was messed up. Fixed.
-- [Kevin Kenny] reported some issues with mp_toradix_n(). Now it doesn't require a min of 3 chars of output.
-- Made the make command renamable. Wee
August 1st, 2005
v0.36 -- LTM_PRIME_2MSB_ON was fixed and the "OFF" flag was removed.
-- [Peter LaDow] found a typo in the XREALLOC macro

View File

@ -3,10 +3,14 @@
#Tom St Denis
#version of library
VERSION=0.36
VERSION=0.37
CFLAGS += -I./ -Wall -W -Wshadow -Wsign-compare
ifndef MAKE
MAKE=make
endif
ifndef IGNORE_SPEED
#for speed
@ -124,7 +128,7 @@ timing: $(LIBNAME)
# makes the LTM book DVI file, requires tetex, perl and makeindex [part of tetex I think]
docdvi: tommath.src
cd pics ; make
cd pics ; MAKE=${MAKE} ${MAKE}
echo "hello" > tommath.ind
perl booker.pl
latex tommath > /dev/null
@ -141,7 +145,7 @@ poster: poster.tex
docs: docdvi
dvipdf tommath
rm -f tommath.log tommath.aux tommath.dvi tommath.idx tommath.toc tommath.lof tommath.ind tommath.ilg
cd pics ; make clean
cd pics ; MAKE=${MAKE} ${MAKE} clean
#LTM user manual
mandvi: bn.tex
@ -161,10 +165,10 @@ pretty:
clean:
rm -f *.bat *.pdf *.o *.a *.obj *.lib *.exe *.dll etclib/*.o demo/demo.o test ltmtest mpitest mtest/mtest mtest/mtest.exe \
*.idx *.toc *.log *.aux *.dvi *.lof *.ind *.ilg *.ps *.log *.s mpi.c *.da *.dyn *.dpi tommath.tex `find -type f | grep [~] | xargs` *.lo *.la
*.idx *.toc *.log *.aux *.dvi *.lof *.ind *.ilg *.ps *.log *.s mpi.c *.da *.dyn *.dpi tommath.tex `find . -type f | grep [~] | xargs` *.lo *.la
rm -rf .libs
cd etc ; make clean
cd pics ; make clean
cd etc ; MAKE=${MAKE} ${MAKE} clean
cd pics ; MAKE=${MAKE} ${MAKE} clean
#zipup the project (take that!)
no_oops: clean
@ -177,4 +181,5 @@ zipup: clean manual poster docs
cd .. ; rm -rf ltm* libtommath-$(VERSION) ; mkdir libtommath-$(VERSION) ; \
cp -R ./libtommath/* ./libtommath-$(VERSION)/ ; \
tar -c libtommath-$(VERSION)/* | bzip2 -9vvc > ltm-$(VERSION).tar.bz2 ; \
zip -9 -r ltm-$(VERSION).zip libtommath-$(VERSION)/*
zip -9 -r ltm-$(VERSION).zip libtommath-$(VERSION)/* ; \
mv -f ltm* ~ ; rm -rf libtommath-$(VERSION)

View File

@ -39,6 +39,6 @@ TARGET = libtommath.lib
$(TARGET): $(OBJECTS)
.c.objbjbjbj:
.c.obj:
$(CC) $(CFLAGS) $<
$(LIB) $(TARGET) -+$@

View File

@ -1,7 +1,7 @@
#Makefile for GCC
#
#Tom St Denis
VERSION=0:36
VERSION=0:37
CC = libtool --mode=compile gcc
@ -80,11 +80,13 @@ bn_mp_prime_random_ex.o bn_mp_get_int.o bn_mp_sqrt.o bn_mp_is_square.o bn_mp_ini
bn_mp_init_set_int.o bn_mp_invmod_slow.o bn_mp_prime_rabin_miller_trials.o \
bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin_n.o
objs: $(OBJECTS)
$(LIBNAME): $(OBJECTS)
libtool --mode=link gcc *.lo -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION)
libtool --mode=link gcc *.o -o $(LIBNAME_S)
ranlib $(LIBNAME_S)
libtool --mode=install install -c $(LIBNAME) $(LIBPATH)/$@
install: $(LIBNAME)
libtool --mode=install install -c $(LIBNAME) $(LIBPATH)/$(LIBNAME)
install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH)
install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH)

Binary file not shown.

View File

@ -913,6 +913,9 @@ mp_add_d (mp_int * a, mp_digit b, mp_int * c)
/* fix sign */
a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res;
}
@ -6241,7 +6244,7 @@ int mp_radix_size (mp_int * a, int radix, int *size)
}
if (mp_iszero(a) == MP_YES) {
*size = 2;
*size = 2;
return MP_OKAY;
}
@ -6395,6 +6398,9 @@ int mp_read_radix (mp_int * a, const char *str, int radix)
int y, res, neg;
char ch;
/* zero the digit bignum */
mp_zero(a);
/* make sure the radix is ok */
if (radix < 2 || radix > 64) {
return MP_VAL;
@ -7562,6 +7568,10 @@ mp_sub_d (mp_int * a, mp_digit b, mp_int * c)
a->sign = MP_ZPOS;
res = mp_add_d(a, b, c);
a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res;
}
@ -8448,12 +8458,12 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
char *_s = str;
/* check range of the maxlen, radix */
if (maxlen < 3 || radix < 2 || radix > 64) {
if (maxlen < 2 || radix < 2 || radix > 64) {
return MP_VAL;
}
/* quick out if its zero */
if (mp_iszero(a) == 1) {
if (mp_iszero(a) == MP_YES) {
*str++ = '0';
*str = '\0';
return MP_OKAY;
@ -8478,21 +8488,20 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
digs = 0;
while (mp_iszero (&t) == 0) {
if (--maxlen < 1) {
/* no more room */
break;
}
if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
mp_clear (&t);
return res;
}
*str++ = mp_s_rmap[d];
++digs;
if (--maxlen == 1) {
/* no more room */
break;
}
}
/* reverse the digits of the string. In this case _s points
* to the first digit [exluding the sign] of the number]
* to the first digit [exluding the sign] of the number
*/
bn_reverse ((unsigned char *)_s, digs);

Binary file not shown.

View File

@ -66,7 +66,7 @@ QUALCOMM Australia \\
}
}
\maketitle
This text has been placed in the public domain. This text corresponds to the v0.36 release of the
This text has been placed in the public domain. This text corresponds to the v0.37 release of the
LibTomMath project.
\begin{alltt}

View File

@ -66,7 +66,7 @@ QUALCOMM Australia \\
}
}
\maketitle
This text has been placed in the public domain. This text corresponds to the v0.36 release of the
This text has been placed in the public domain. This text corresponds to the v0.37 release of the
LibTomMath project.
\begin{alltt}
@ -8808,70 +8808,73 @@ This algorithm initiates a temporary mp\_int with the value of the single digit
039 /* fix sign */
040 a->sign = c->sign = MP_NEG;
041
042 return res;
043 \}
042 /* clamp */
043 mp_clamp(c);
044
045 /* old number of used digits in c */
046 oldused = c->used;
045 return res;
046 \}
047
048 /* sign always positive */
049 c->sign = MP_ZPOS;
048 /* old number of used digits in c */
049 oldused = c->used;
050
051 /* source alias */
052 tmpa = a->dp;
051 /* sign always positive */
052 c->sign = MP_ZPOS;
053
054 /* destination alias */
055 tmpc = c->dp;
054 /* source alias */
055 tmpa = a->dp;
056
057 /* if a is positive */
058 if (a->sign == MP_ZPOS) \{
059 /* add digit, after this we're propagating
060 * the carry.
061 */
062 *tmpc = *tmpa++ + b;
063 mu = *tmpc >> DIGIT_BIT;
064 *tmpc++ &= MP_MASK;
065
066 /* now handle rest of the digits */
067 for (ix = 1; ix < a->used; ix++) \{
068 *tmpc = *tmpa++ + mu;
069 mu = *tmpc >> DIGIT_BIT;
070 *tmpc++ &= MP_MASK;
071 \}
072 /* set final carry */
073 ix++;
074 *tmpc++ = mu;
075
076 /* setup size */
077 c->used = a->used + 1;
078 \} else \{
079 /* a was negative and |a| < b */
080 c->used = 1;
081
082 /* the result is a single digit */
083 if (a->used == 1) \{
084 *tmpc++ = b - a->dp[0];
085 \} else \{
086 *tmpc++ = b;
087 \}
088
089 /* setup count so the clearing of oldused
090 * can fall through correctly
091 */
092 ix = 1;
093 \}
094
095 /* now zero to oldused */
096 while (ix++ < oldused) \{
097 *tmpc++ = 0;
098 \}
099 mp_clamp(c);
100
101 return MP_OKAY;
102 \}
057 /* destination alias */
058 tmpc = c->dp;
059
060 /* if a is positive */
061 if (a->sign == MP_ZPOS) \{
062 /* add digit, after this we're propagating
063 * the carry.
064 */
065 *tmpc = *tmpa++ + b;
066 mu = *tmpc >> DIGIT_BIT;
067 *tmpc++ &= MP_MASK;
068
069 /* now handle rest of the digits */
070 for (ix = 1; ix < a->used; ix++) \{
071 *tmpc = *tmpa++ + mu;
072 mu = *tmpc >> DIGIT_BIT;
073 *tmpc++ &= MP_MASK;
074 \}
075 /* set final carry */
076 ix++;
077 *tmpc++ = mu;
078
079 /* setup size */
080 c->used = a->used + 1;
081 \} else \{
082 /* a was negative and |a| < b */
083 c->used = 1;
084
085 /* the result is a single digit */
086 if (a->used == 1) \{
087 *tmpc++ = b - a->dp[0];
088 \} else \{
089 *tmpc++ = b;
090 \}
091
092 /* setup count so the clearing of oldused
093 * can fall through correctly
094 */
095 ix = 1;
096 \}
097
098 /* now zero to oldused */
099 while (ix++ < oldused) \{
100 *tmpc++ = 0;
101 \}
102 mp_clamp(c);
103
104 #endif
105
104 return MP_OKAY;
105 \}
106
107 #endif
108
\end{alltt}
\end{small}
@ -9481,62 +9484,65 @@ as part of larger input without any significant problem.
020 int y, res, neg;
021 char ch;
022
023 /* make sure the radix is ok */
024 if (radix < 2 || radix > 64) \{
025 return MP_VAL;
026 \}
027
028 /* if the leading digit is a
029 * minus set the sign to negative.
030 */
031 if (*str == '-') \{
032 ++str;
033 neg = MP_NEG;
034 \} else \{
035 neg = MP_ZPOS;
036 \}
037
038 /* set the integer to the default of zero */
039 mp_zero (a);
040
041 /* process each digit of the string */
042 while (*str) \{
043 /* if the radix < 36 the conversion is case insensitive
044 * this allows numbers like 1AB and 1ab to represent the same value
045 * [e.g. in hex]
046 */
047 ch = (char) ((radix < 36) ? toupper (*str) : *str);
048 for (y = 0; y < 64; y++) \{
049 if (ch == mp_s_rmap[y]) \{
050 break;
051 \}
052 \}
053
054 /* if the char was found in the map
055 * and is less than the given radix add it
056 * to the number, otherwise exit the loop.
057 */
058 if (y < radix) \{
059 if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) \{
060 return res;
061 \}
062 if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) \{
023 /* zero the digit bignum */
024 mp_zero(a);
025
026 /* make sure the radix is ok */
027 if (radix < 2 || radix > 64) \{
028 return MP_VAL;
029 \}
030
031 /* if the leading digit is a
032 * minus set the sign to negative.
033 */
034 if (*str == '-') \{
035 ++str;
036 neg = MP_NEG;
037 \} else \{
038 neg = MP_ZPOS;
039 \}
040
041 /* set the integer to the default of zero */
042 mp_zero (a);
043
044 /* process each digit of the string */
045 while (*str) \{
046 /* if the radix < 36 the conversion is case insensitive
047 * this allows numbers like 1AB and 1ab to represent the same value
048 * [e.g. in hex]
049 */
050 ch = (char) ((radix < 36) ? toupper (*str) : *str);
051 for (y = 0; y < 64; y++) \{
052 if (ch == mp_s_rmap[y]) \{
053 break;
054 \}
055 \}
056
057 /* if the char was found in the map
058 * and is less than the given radix add it
059 * to the number, otherwise exit the loop.
060 */
061 if (y < radix) \{
062 if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) \{
063 return res;
064 \}
065 \} else \{
066 break;
067 \}
068 ++str;
069 \}
070
071 /* set the sign only if a != 0 */
072 if (mp_iszero(a) != 1) \{
073 a->sign = neg;
074 \}
075 return MP_OKAY;
076 \}
077 #endif
078
065 if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) \{
066 return res;
067 \}
068 \} else \{
069 break;
070 \}
071 ++str;
072 \}
073
074 /* set the sign only if a != 0 */
075 if (mp_iszero(a) != 1) \{
076 a->sign = neg;
077 \}
078 return MP_OKAY;
079 \}
080 #endif
081
\end{alltt}
\end{small}