diff --git a/.travis.yml b/.travis.yml index 8dbc64e..176659a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,5 +28,5 @@ after_failure: after_script: - cat test_gcc_2.txt notifications: - irc: "chat.freenode.net#libtom" + irc: "chat.freenode.net#libtom-notifications" diff --git a/README.md b/README.md index f1f9171..14e316f 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ Project Status master: [![Build Status](https://travis-ci.org/libtom/tomsfastmath.svg?branch=master)](https://travis-ci.org/libtom/tomsfastmath) +develop: [![Build Status](https://travis-ci.org/libtom/tomsfastmath.svg?branch=develop)](https://travis-ci.org/libtom/tomsfastmath) diff --git a/changes.txt b/changes.txt index 5b26160..4f86bb9 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,9 @@ +April 4th, 2017 +v0.13.1 + -- Fix missing fp_rand symbol in shared library + -- Fix some parameters in API signatures that should've been const + -- Bugfixes and improvements contributed by Sebastian Siewior, Reiner Herrmann and Mathias Tausig + October 24th, 2015 v0.13.0 -- Add fp_rand() diff --git a/doc/tfm.pdf b/doc/tfm.pdf index ef23968..5b560b1 100644 Binary files a/doc/tfm.pdf and b/doc/tfm.pdf differ diff --git a/libtfm.symbols b/libtfm.symbols index 01e984b..4147c5d 100644 --- a/libtfm.symbols +++ b/libtfm.symbols @@ -31,6 +31,7 @@ fp_mul_d fp_mulmod fp_prime_random_ex fp_radix_size +fp_rand fp_read_radix fp_read_signed_bin fp_read_unsigned_bin diff --git a/makefile b/makefile index 0585eab..b9b3df6 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ #makefile for TomsFastMath # # -VERSION=0.13 +VERSION=0.13.1 CFLAGS += -Wall -W -Wshadow -Isrc/headers @@ -21,6 +21,22 @@ ifndef MAKE MAKE=make endif +ifeq ($V,1) +silent= +else +silent=@ +endif + +%.o: %.c +ifneq ($V,1) + @echo " * ${CC} $@" +endif + ${silent} ${CC} ${CFLAGS} -c $< -o $@ + +ifdef COMPILE_DEBUG +#debug +CFLAGS += -g3 +else ifndef IGNORE_SPEED CFLAGS += -O3 -funroll-loops @@ -32,6 +48,7 @@ CFLAGS += -O3 -funroll-loops #speed CFLAGS += -fomit-frame-pointer +endif endif #START_INS @@ -103,6 +120,11 @@ install: $(LIBNAME) install -g $(GROUP) -o $(USER) $(LIBNAME) $(DESTDIR)$(LIBPATH) install -g $(GROUP) -o $(USER) $(HEADERS_PUB) $(DESTDIR)$(INCPATH) +HEADER_FILES=$(notdir $(HEADERS_PUB)) +uninstall: + rm $(DESTDIR)$(LIBPATH)/$(LIBNAME) + rm $(HEADER_FILES:%=$(DESTDIR)$(INCPATH)/%) + .PHONY: mtest mtest: $(LIBNAME) cd mtest; CC="$(CC)" CFLAGS="$(CFLAGS) -I../" MAKE=${MAKE} ${MAKE} mtest @@ -189,9 +211,10 @@ zipup: rm -rf ../tomsfastmath-$(VERSION) && rm -f ../tfm-$(VERSION).zip ../tfm-$(VERSION).tar.bz2 && \ expsrc.sh -i . -o ../tomsfastmath-$(VERSION) --svntags --no-fetch -p '*.c' -p '*.h' && \ MAKE=${MAKE} ${MAKE} -C ../tomsfastmath-$(VERSION) docs && \ - tar -c ../tomsfastmath-$(VERSION)/* | bzip2 -9vvc > ../tfm-$(VERSION).tar.bz2 && \ + tar -c ../tomsfastmath-$(VERSION)/* | xz -cz > ../tfm-$(VERSION).tar.xz && \ + find ../tomsfastmath-$(VERSION)/ -type f -exec unix2dos -q {} \; && \ zip -9 -r ../tfm-$(VERSION).zip ../tomsfastmath-$(VERSION)/* && \ - gpg -b -a ../tfm-$(VERSION).tar.bz2 && gpg -b -a ../tfm-$(VERSION).zip + gpg -b -a ../tfm-$(VERSION).tar.xz && gpg -b -a ../tfm-$(VERSION).zip new_file: bash updatemakes.sh diff --git a/makefile.shared b/makefile.shared index c8dc124..47c35d9 100644 --- a/makefile.shared +++ b/makefile.shared @@ -47,7 +47,8 @@ src/sqr/fp_sqr_comba_48.o src/sqr/fp_sqr_comba_4.o src/sqr/fp_sqr_comba_64.o src src/sqr/fp_sqr_comba_7.o src/sqr/fp_sqr_comba_8.o src/sqr/fp_sqr_comba_9.o src/sqr/fp_sqr_comba.o \ src/sqr/fp_sqr_comba_generic.o src/sqr/fp_sqr_comba_small_set.o src/sqr/fp_sqrmod.o -HEADERS=src/headers/tfm.h +HEADERS_PUB:=src/headers/tfm.h +HEADERS=src/headers/tfm_private.h $(HEADERS_PUB) #END_INS @@ -88,13 +89,18 @@ $(OBJECTS): $(HEADERS) $(LTCOMPILE) $(CFLAGS) $(LDFLAGS) -o $@ -c $< $(LIBNAME): $(OBJECTS) - libtool --silent --mode=link --tag=CC $(CC) $(CFLAGS) $(LDFLAGS) `find . -type f | grep "[.]lo" | xargs` -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) -export-symbols libtfm.symbols + libtool --mode=link --tag=CC $(CC) $(CFLAGS) $(LDFLAGS) `find . -type f | LC_ALL=C sort | grep "[.]lo" | xargs` -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) -export-symbols libtfm.symbols install: $(LIBNAME) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(LIBPATH) - libtool --silent --mode=install install -c $(LIBNAME) $(DESTDIR)$(LIBPATH)/$(LIBNAME) + libtool --mode=install install -c $(LIBNAME) $(DESTDIR)$(LIBPATH)/$(LIBNAME) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) - install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) + install -g $(GROUP) -o $(USER) $(HEADERS_PUB) $(DESTDIR)$(INCPATH) + +HEADER_FILES=$(notdir $(HEADERS_PUB)) +uninstall: + libtool --mode=uninstall rm $(DESTDIR)$(LIBPATH)/$(LIBNAME) + rm $(HEADER_FILES:%=$(DESTDIR)$(INCPATH)/%) mtest/mtest: mtest/mtest.c cd mtest ; make mtest diff --git a/src/generators/comba_sqr_gen.c b/src/generators/comba_sqr_gen.c index ffd1414..8ebe650 100644 --- a/src/generators/comba_sqr_gen.c +++ b/src/generators/comba_sqr_gen.c @@ -9,6 +9,7 @@ */ #include +#include int main(int argc, char **argv) { diff --git a/src/headers/tfm.h b/src/headers/tfm.h index f406388..a1ed374 100644 --- a/src/headers/tfm.h +++ b/src/headers/tfm.h @@ -22,8 +22,8 @@ * Patch * XX - undefined */ -#define TFM_VERSION 0x000D0000 -#define TFM_VERSION_S "v0.13.0" +#define TFM_VERSION 0x000D0100 +#define TFM_VERSION_S "v0.13.1" #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) @@ -252,6 +252,17 @@ #endif #endif +/* use arc4random on platforms that support it */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) + #define FP_GEN_RANDOM() arc4random() + #define FP_GEN_RANDOM_MAX 0xffffffff +#endif + +/* use rand() as fall-back if there's no better rand function */ +#ifndef FP_GEN_RANDOM + #define FP_GEN_RANDOM() rand() + #define FP_GEN_RANDOM_MAX RAND_MAX +#endif /* some default configurations. */ diff --git a/src/misc/fp_rand.c b/src/misc/fp_rand.c index c1dd766..01198c5 100644 --- a/src/misc/fp_rand.c +++ b/src/misc/fp_rand.c @@ -9,7 +9,31 @@ */ #include +#if FP_GEN_RANDOM_MAX == 0xffffffff + #define FP_GEN_RANDOM_SHIFT 32 +#elif FP_GEN_RANDOM_MAX == 32767 + /* SHRT_MAX */ + #define FP_GEN_RANDOM_SHIFT 15 +#elif FP_GEN_RANDOM_MAX == 2147483647 + /* INT_MAX */ + #define FP_GEN_RANDOM_SHIFT 31 +#elif !defined(FP_GEN_RANDOM_SHIFT) +#error Thou shalt define their own valid FP_GEN_RANDOM_SHIFT +#endif + /* makes a pseudo-random int of a given size */ +static fp_digit fp_gen_random(void) +{ + fp_digit d = 0, msk = 0; + do { + d <<= FP_GEN_RANDOM_SHIFT; + d |= ((fp_digit) FP_GEN_RANDOM()); + msk <<= FP_GEN_RANDOM_SHIFT; + msk |= FP_GEN_RANDOM_MAX; + } while ((FP_MASK & msk) != FP_MASK); + d &= FP_MASK; + return d; +} void fp_rand(fp_int *a, int digits) { @@ -22,14 +46,14 @@ void fp_rand(fp_int *a, int digits) /* first place a random non-zero digit */ do { - d = ((fp_digit) abs (rand ())) & FP_MASK; + d = fp_gen_random(); } while (d == 0); fp_add_d (a, d, a); while (--digits > 0) { fp_lshd (a, 1); - fp_add_d (a, ((fp_digit) abs (rand ())), a); + fp_add_d (a, fp_gen_random(), a); } return; diff --git a/tfm.tex b/tfm.tex index 7bd3159..723f55b 100644 --- a/tfm.tex +++ b/tfm.tex @@ -49,7 +49,7 @@ \begin{document} \frontmatter \pagestyle{empty} -\title{TomsFastMath User Manual \\ v0.13.0} +\title{TomsFastMath User Manual \\ v0.13.1} \author{Tom St Denis \\ tomstdenis@gmail.com} \maketitle This text and library are all hereby placed in the public domain. This book has been formatted for B5 @@ -279,6 +279,21 @@ void fp_init_copy(fp_int *a, fp_int *b) This will initialize $a$ as a copy of $b$. Note that for compatibility with LibTomMath the function fp\_copy() is also provided. +\subsection{Initialization with a random value} +To initialize an integer with a random value of a specific length use the fp\_rand() function. + +\index{fp\_rand} +\begin{verbatim} +void fp_rand(fp_int *a, int digits) +\end{verbatim} + +This will initialize $a$ with $digits$ random digits. + +\index{FP\_GEN\_RANDOM} \index{FP\_GEN\_RANDOM\_MAX} +The source of the random data is \textbf{arc4random()} on *BSD systems that provide this function +and the standard C function \textbf{rand()} on all other systems. It can be configured at compile time +by pre-defining \textbf{FP\_GEN\_RANDOM} and \textbf{FP\_GEN\_RANDOM\_MAX}. + \chapter{Arithmetic Operations} \section{Odds and Evens} To quickly and easily tell if an integer is zero, odd or even use the following functions.