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} \begin{document}
\frontmatter \frontmatter
\pagestyle{empty} \pagestyle{empty}
\title{LibTomMath User Manual \\ v0.36} \title{LibTomMath User Manual \\ v0.37}
\author{Tom St Denis \\ tomstdenis@iahu.ca} \author{Tom St Denis \\ tomstdenis@iahu.ca}
\maketitle \maketitle
This text, the library and the accompanying textbook are all hereby placed in the public domain. This book has been 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 */ /* fix sign */
a->sign = c->sign = MP_NEG; a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res; 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) { if (mp_iszero(a) == MP_YES) {
*size = 2; *size = 2;
return MP_OKAY; 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; int y, res, neg;
char ch; char ch;
/* zero the digit bignum */
mp_zero(a);
/* make sure the radix is ok */ /* make sure the radix is ok */
if (radix < 2 || radix > 64) { if (radix < 2 || radix > 64) {
return MP_VAL; 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; a->sign = MP_ZPOS;
res = mp_add_d(a, b, c); res = mp_add_d(a, b, c);
a->sign = c->sign = MP_NEG; a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res; return res;
} }

View File

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

View File

@ -221,7 +221,7 @@ while (<IN>) {
$str = "chapter eight"; $str = "chapter eight";
} elsif ($a == 9) { } elsif ($a == 9) {
$str = "chapter nine"; $str = "chapter nine";
} elsif ($a == 2) { } elsif ($a == 10) {
$str = "chapter ten"; $str = "chapter ten";
} }
} else { } 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 August 1st, 2005
v0.36 -- LTM_PRIME_2MSB_ON was fixed and the "OFF" flag was removed. v0.36 -- LTM_PRIME_2MSB_ON was fixed and the "OFF" flag was removed.
-- [Peter LaDow] found a typo in the XREALLOC macro -- [Peter LaDow] found a typo in the XREALLOC macro

View File

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

View File

@ -1,7 +1,7 @@
#Makefile for GCC #Makefile for GCC
# #
#Tom St Denis #Tom St Denis
VERSION=0:36 VERSION=0:37
CC = libtool --mode=compile gcc 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_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 bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin_n.o
objs: $(OBJECTS)
$(LIBNAME): $(OBJECTS) $(LIBNAME): $(OBJECTS)
libtool --mode=link gcc *.lo -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) libtool --mode=link gcc *.lo -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION)
libtool --mode=link gcc *.o -o $(LIBNAME_S)
ranlib $(LIBNAME_S) install: $(LIBNAME)
libtool --mode=install install -c $(LIBNAME) $(LIBPATH)/$@ libtool --mode=install install -c $(LIBNAME) $(LIBPATH)/$(LIBNAME)
install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH)
install -g $(GROUP) -o $(USER) $(HEADERS) $(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 */ /* fix sign */
a->sign = c->sign = MP_NEG; a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res; return res;
} }
@ -6241,7 +6244,7 @@ int mp_radix_size (mp_int * a, int radix, int *size)
} }
if (mp_iszero(a) == MP_YES) { if (mp_iszero(a) == MP_YES) {
*size = 2; *size = 2;
return MP_OKAY; return MP_OKAY;
} }
@ -6395,6 +6398,9 @@ int mp_read_radix (mp_int * a, const char *str, int radix)
int y, res, neg; int y, res, neg;
char ch; char ch;
/* zero the digit bignum */
mp_zero(a);
/* make sure the radix is ok */ /* make sure the radix is ok */
if (radix < 2 || radix > 64) { if (radix < 2 || radix > 64) {
return MP_VAL; return MP_VAL;
@ -7562,6 +7568,10 @@ mp_sub_d (mp_int * a, mp_digit b, mp_int * c)
a->sign = MP_ZPOS; a->sign = MP_ZPOS;
res = mp_add_d(a, b, c); res = mp_add_d(a, b, c);
a->sign = c->sign = MP_NEG; a->sign = c->sign = MP_NEG;
/* clamp */
mp_clamp(c);
return res; return res;
} }
@ -8448,12 +8458,12 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
char *_s = str; char *_s = str;
/* check range of the maxlen, radix */ /* check range of the maxlen, radix */
if (maxlen < 3 || radix < 2 || radix > 64) { if (maxlen < 2 || radix < 2 || radix > 64) {
return MP_VAL; return MP_VAL;
} }
/* quick out if its zero */ /* quick out if its zero */
if (mp_iszero(a) == 1) { if (mp_iszero(a) == MP_YES) {
*str++ = '0'; *str++ = '0';
*str = '\0'; *str = '\0';
return MP_OKAY; return MP_OKAY;
@ -8478,21 +8488,20 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
digs = 0; digs = 0;
while (mp_iszero (&t) == 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) { if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
mp_clear (&t); mp_clear (&t);
return res; return res;
} }
*str++ = mp_s_rmap[d]; *str++ = mp_s_rmap[d];
++digs; ++digs;
if (--maxlen == 1) {
/* no more room */
break;
}
} }
/* reverse the digits of the string. In this case _s points /* 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); bn_reverse ((unsigned char *)_s, digs);

Binary file not shown.

View File

@ -66,7 +66,7 @@ QUALCOMM Australia \\
} }
} }
\maketitle \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. LibTomMath project.
\begin{alltt} \begin{alltt}

View File

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