From a6c4c5a261e42e187b98b0a5ac5adb5fbda3ca40 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Mon, 1 Aug 2005 16:37:35 +0000 Subject: [PATCH] added tomsfastmath-0.05 --- changes.txt | 7 ++ comba_mont_gen.c | 139 +++++++++++++++++--------- demo/test.c | 2 +- doc/tfm.pdf | Bin 122170 -> 124818 bytes fp_exptmod.c | 71 ++++++++++++++ fp_invmod.c | 107 +++++++++++++++++++- fp_montgomery_reduce.c | 6 +- fp_mul_comba.c | 4 +- fp_sqr_comba.c | 30 +++--- makefile | 67 +++++++++---- makefile.gba | 55 ----------- makefile.shared | 109 +++++++++++++++++++++ pre_gen/mpi.c | 218 ++++++++++++++++++++++++++++++++++++----- tfm.aux | 56 ++++++----- tfm.dvi | Bin 49708 -> 51612 bytes tfm.h | 17 +++- tfm.idx | 58 +++++------ tfm.ind | 58 +++++------ tfm.log | 52 +++++----- tfm.tex | 30 ++++-- tfm.toc | 54 +++++----- 21 files changed, 830 insertions(+), 310 deletions(-) delete mode 100644 makefile.gba create mode 100644 makefile.shared diff --git a/changes.txt b/changes.txt index 5ad2fb7..525e2d4 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,10 @@ +August 1st, 2005 +0.05 -- Quick fix to the fp_invmod.c code to let it handle even moduli [required for LTC] + -- Added makefile.shared to make shared objects [required for LTC] + -- Improved makefiles to make them way more configurable + -- Added timing resistant fp_exptmod() enabled with TFM_TIMING_RESISTANT + +July 23rd, 2005 0.04 -- Fixed bugs in the SSE2 squaring code -- Rewrote the multipliers to be optimized for small inputs -- Nelson Bolyard of the NSS crew submitted [among other things] new faster Montgomery reduction diff --git a/comba_mont_gen.c b/comba_mont_gen.c index 7b5e6fb..34c9e05 100644 --- a/comba_mont_gen.c +++ b/comba_mont_gen.c @@ -1,59 +1,112 @@ -/* generate montgomery reductions for m->used = 1...16 */ - #include int main(void) { - int N; - - for (N = 1; N <= 16; N++) { - -printf("void fp_montgomery_reduce_%d(fp_int *a, fp_int *m, fp_digit mp)\n", N); + int x, y, z; + printf( +#if 0 +"#ifdef TFM_SMALL_SET\n" +"/* computes x/R == x (mod N) via Montgomery Reduction */\n" +"void fp_montgomery_reduce_small(fp_int *a, fp_int *m, fp_digit mp)\n" "{\n" -" fp_digit c[3*FP_SIZE], *_c, *tmpm, mu;\n" -" int oldused, x, y;\n" +" fp_digit c[FP_SIZE], *_c, *tmpm, mu, cy;\n" +" int oldused, x, y, pa;\n" "\n" +"#if defined(USE_MEMSET)\n" " /* now zero the buff */\n" -" memset(c, 0, sizeof(c));\n" +" memset(c, 0, sizeof c);\n" +"#endif\n" +" pa = m->used;\n" "\n" " /* copy the input */\n" " oldused = a->used;\n" " for (x = 0; x < oldused; x++) {\n" " c[x] = a->dp[x];\n" " }\n" -"\n" +"#if !defined(USE_MEMSET)\n" +" for (; x < 2*pa+3; x++) {\n" +" c[x] = 0;\n" +" }\n" +"#endif\n" " MONT_START;\n" +#endif "\n" -" /* now let's get bizz-sy! */\n" -" for (x = 0; x < %d; x++) {\n" -" /* get Mu for this round */\n" -" LOOP_START;\n" -"\n" -" /* our friendly neighbourhood alias */\n" -" _c = c + x;\n" -" tmpm = m->dp;\n" -"\n" -" for (y = 0; y < %d; y++) {\n" -" INNERMUL;\n" -" ++_c;\n" -" }\n" -" /* send carry up man... */\n" -" _c = c + x;\n" -" PROPCARRY;\n" -" } \n" -"\n" -" /* fix the rest of the carries */\n" -" _c = c + %d;\n" -" for (x = %d; x < %d * 2 + 2; x++) {\n" -" PROPCARRY;\n" -" ++_c;\n" +" switch (pa) {\n"); + +for (x = 1; x <= 64; x++) { +if (x > 16 && (x != 32 && x != 48 && x != 64)) continue; +if (x > 16) printf("#ifdef TFM_HUGE\n"); + + + +printf(" case %d:\n", x); + +for (y = 0; y < x; y++) { + +printf(" x = %d; cy = 0;\n" + " LOOP_START;\n" + " _c = c + %d;\n" + " tmpm = m->dp;\n", y, y); + +printf("#ifdef INNERMUL8\n"); +for (z = 0; z+8 <= x; z += 8) { +printf(" INNERMUL8; _c += 8; tmpm += 8;\n"); +} +for (; z < x; z++) { +printf(" INNERMUL; ++_c;\n"); +} +printf("#else\n"); +for (z = 0; z < x; z++) { +printf(" INNERMUL; ++_c;\n"); +} +printf("#endif\n"); +printf(" LOOP_END;\n" + " while (cy) {\n" + " PROPCARRY;\n" + " ++_c;\n" + " }\n"); +} +//printf(" }\n"); +printf(" break;\n"); + + + +#define LOOP_MACRO(stride) \ + for (x = 0; x < stride; x++) { \ + fp_digit cy = 0; \ + /* get Mu for this round */ \ + LOOP_START; \ + _c = c + x; \ + tmpm = m->dp; \ + for (y = 0; y < stride; y++) { \ + INNERMUL; \ + ++_c; \ + } \ + LOOP_END; \ + while (cy) { \ + PROPCARRY; \ + ++_c; \ + } \ + } + + + + + +if (x > 16) printf("#endif /* TFM_HUGE */\n"); + + +} + +#if 0 + +printf( " }\n" -"\n" " /* now copy out */\n" -" _c = c + %d;\n" +" _c = c + pa;\n" " tmpm = a->dp;\n" -" for (x = 0; x < %d+1; x++) {\n" +" for (x = 0; x < pa+1; x++) {\n" " *tmpm++ = *_c++;\n" " }\n" "\n" @@ -63,19 +116,17 @@ printf( "\n" " MONT_FINI;\n" "\n" -" a->used = %d+1;\n" +" a->used = pa+1;\n" " fp_clamp(a);\n" "\n" " /* if A >= m then A = A - m */\n" " if (fp_cmp_mag (a, m) != FP_LT) {\n" " s_fp_sub (a, m, a);\n" " }\n" -"}\n", N,N,N,N,N,N,N,N); -} +"}\n\n#endif\n"); + +#endif + return 0; } - - - - diff --git a/demo/test.c b/demo/test.c index fa87605..bf1c288 100644 --- a/demo/test.c +++ b/demo/test.c @@ -213,7 +213,7 @@ t1 = TIMFUNC(); sleep(1); printf("Ticks per second: %llu\n", TIMFUNC() - t1); -goto expttime; +goto multtime; /* do some timings... */ printf("Addition:\n"); for (t = 2; t <= FP_SIZE/2; t += 2) { diff --git a/doc/tfm.pdf b/doc/tfm.pdf index 0830505cb52516a02f86de3480605eb710f9bd6f..a85837d8677169a4a772e51610bc93ac1d040591 100644 GIT binary patch delta 78717 zcmZs?V|3ubvn?9iPA0bPi8Zlp+n(qb+qN~aZQHi(Op=M;|J--aeQVwGzSXM!(p|l( zde^Sq9Uah#v(WLsfVgS-L1vWTTfazttO$Dj&C9$W#Ct2?hJ?h@GSt?Qf#|tJn^Lqy z>R;x3xdg(b0rVC*+r$!1FXs6Q#t;f)y4ui_sIwVp!V5jtfyO*dOm5h%Eg

Z9|{qh&j$ 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 +#ifdef TFM_TIMING_RESISTANT + +/* timing resistant montgomery ladder based exptmod + + Based on work by Marc Joye, Sung-Ming Yen, "The Montgomery Powering Ladder", Cryptographic Hardware and Embedded Systems, CHES 2002 +*/ +static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) +{ + fp_int R[2]; + fp_digit buf, mp; + int err, bitcnt, digidx, y; + + /* now setup montgomery */ + if ((err = fp_montgomery_setup (P, &mp)) != FP_OKAY) { + return err; + } + + fp_init(&R[0]); + fp_init(&R[1]); + + /* now we need R mod m */ + fp_montgomery_calc_normalization (&R[0], P); + + /* now set R[0][1] to G * R mod m */ + if (fp_cmp_mag(P, G) != FP_GT) { + /* G > P so we reduce it first */ + fp_mod(G, P, &R[1]); + } else { + fp_copy(G, &R[1]); + } + fp_mulmod (&R[1], &R[0], P, &R[1]); + + /* for j = t-1 downto 0 do + r_!k = R0*R1; r_k = r_k^2 + */ + + /* set initial mode and bit cnt */ + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits so break */ + if (digidx == -1) { + break; + } + /* read next digit and reset bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int)DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (fp_digit)(buf >> (DIGIT_BIT - 1)) & 1; + buf <<= (fp_digit)1; + + /* do ops */ + fp_mul(&R[0], &R[1], &R[y^1]); fp_montgomery_reduce(&R[y^1], P, mp); + fp_sqr(&R[y], &R[y]); fp_montgomery_reduce(&R[y], P, mp); + } + + fp_montgomery_reduce(&R[0], P, mp); + fp_copy(&R[0], Y); + return FP_OKAY; +} + +#else + /* y = g**x (mod b) * Some restrictions... x must be positive and < b */ @@ -168,6 +237,8 @@ static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) return FP_OKAY; } +#endif + int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { diff --git a/fp_invmod.c b/fp_invmod.c index 17ddb69..6086029 100644 --- a/fp_invmod.c +++ b/fp_invmod.c @@ -9,6 +9,111 @@ */ #include +static int fp_invmod_slow (fp_int * a, fp_int * b, fp_int * c) +{ + fp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == FP_NEG || fp_iszero(b) == 1) { + return FP_VAL; + } + + /* init temps */ + fp_init(&x); fp_init(&y); + fp_init(&u); fp_init(&v); + fp_init(&A); fp_init(&B); + fp_init(&C); fp_init(&D); + + /* x = a, y = b */ + if ((res = fp_mod(a, b, &x)) != FP_OKAY) { + return res; + } + fp_copy(b, &y); + + /* 2. [modified] if x,y are both even then return an error! */ + if (fp_iseven (&x) == 1 && fp_iseven (&y) == 1) { + return FP_VAL; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + fp_copy (&x, &u); + fp_copy (&y, &v); + fp_set (&A, 1); + fp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (fp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + fp_div_2 (&u, &u); + + /* 4.2 if A or B is odd then */ + if (fp_isodd (&A) == 1 || fp_isodd (&B) == 1) { + /* A = (A+y)/2, B = (B-x)/2 */ + fp_add (&A, &y, &A); + fp_sub (&B, &x, &B); + } + /* A = A/2, B = B/2 */ + fp_div_2 (&A, &A); + fp_div_2 (&B, &B); + } + + /* 5. while v is even do */ + while (fp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + fp_div_2 (&v, &v); + + /* 5.2 if C or D is odd then */ + if (fp_isodd (&C) == 1 || fp_isodd (&D) == 1) { + /* C = (C+y)/2, D = (D-x)/2 */ + fp_add (&C, &y, &C); + fp_sub (&D, &x, &D); + } + /* C = C/2, D = D/2 */ + fp_div_2 (&C, &C); + fp_div_2 (&D, &D); + } + + /* 6. if u >= v then */ + if (fp_cmp (&u, &v) != FP_LT) { + /* u = u - v, A = A - C, B = B - D */ + fp_sub (&u, &v, &u); + fp_sub (&A, &C, &A); + fp_sub (&B, &D, &B); + } else { + /* v - v - u, C = C - A, D = D - B */ + fp_sub (&v, &u, &v); + fp_sub (&C, &A, &C); + fp_sub (&D, &B, &D); + } + + /* if not zero goto step 4 */ + if (fp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (fp_cmp_d (&v, 1) != FP_EQ) { + return FP_VAL; + } + + /* if its too low */ + while (fp_cmp_d(&C, 0) == FP_LT) { + fp_add(&C, b, &C); + } + + /* too big */ + while (fp_cmp_mag(&C, b) != FP_LT) { + fp_sub(&C, b, &C); + } + + /* C is now the inverse */ + fp_copy(&C, c); + return FP_OKAY; +} + /* c = 1/a (mod b) for odd b only */ int fp_invmod(fp_int *a, fp_int *b, fp_int *c) { @@ -17,7 +122,7 @@ int fp_invmod(fp_int *a, fp_int *b, fp_int *c) /* 2. [modified] b must be odd */ if (fp_iseven (b) == FP_YES) { - return FP_VAL; + return fp_invmod_slow(a,b,c); } /* init all our temps */ diff --git a/fp_montgomery_reduce.c b/fp_montgomery_reduce.c index 185c9f6..53d6773 100644 --- a/fp_montgomery_reduce.c +++ b/fp_montgomery_reduce.c @@ -299,8 +299,6 @@ asm( \ #define LO 0 -#define HI 1 -#define CY 2 /* computes x/R == x (mod N) via Montgomery Reduction */ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) @@ -347,7 +345,7 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) } LOOP_END; while (cy) { - PROPCARRY; // cy = cy > (*_c += cy); + PROPCARRY; ++_c; } } @@ -374,7 +372,7 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) } } + /* $Source$ */ /* $Revision$ */ /* $Date$ */ - diff --git a/fp_mul_comba.c b/fp_mul_comba.c index 472b2d3..cf51eba 100644 --- a/fp_mul_comba.c +++ b/fp_mul_comba.c @@ -47,7 +47,7 @@ /* this should multiply i and j */ #define MULADD(i, j) \ -asm ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -118,7 +118,7 @@ asm ( \ /* this should multiply i and j */ #define MULADD(i, j) \ - asm volatile ( \ + asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ diff --git a/fp_sqr_comba.c b/fp_sqr_comba.c index 9b72493..d5a39e5 100644 --- a/fp_sqr_comba.c +++ b/fp_sqr_comba.c @@ -36,7 +36,7 @@ #define COMBA_FINI #define SQRADD(i, j) \ -asm volatile ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %%eax \n\t" \ "addl %%eax,%0 \n\t" \ @@ -45,7 +45,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%edx","%cc"); #define SQRADD2(i, j) \ -asm volatile ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -57,7 +57,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); #define SQRADDSC(i, j) \ -asm ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "movl %%eax,%0 \n\t" \ @@ -66,7 +66,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); #define SQRADDAC(i, j) \ -asm ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -75,7 +75,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); #define SQRADDDB \ -asm ( \ +asm( \ "addl %6,%0 \n\t" \ "adcl %7,%1 \n\t" \ "adcl %8,%2 \n\t" \ @@ -104,7 +104,7 @@ asm ( \ #define COMBA_FINI #define SQRADD(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %%rax \n\t" \ "addq %%rax,%0 \n\t" \ @@ -113,7 +113,7 @@ asm ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","%cc"); #define SQRADD2(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %7 \n\t" \ "addq %%rax,%0 \n\t" \ @@ -125,7 +125,7 @@ asm ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); #define SQRADDSC(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %7 \n\t" \ "movq %%rax,%0 \n\t" \ @@ -134,7 +134,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); #define SQRADDAC(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %7 \n\t" \ "addq %%rax,%0 \n\t" \ @@ -143,7 +143,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); #define SQRADDDB \ -asm ( \ +asm( \ "addq %6,%0 \n\t" \ "adcq %7,%1 \n\t" \ "adcq %8,%2 \n\t" \ @@ -173,7 +173,7 @@ asm ( \ asm("emms"); #define SQRADD(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "pmuludq %%mm0,%%mm0\n\t" \ "movd %%mm0,%%eax \n\t" \ @@ -185,7 +185,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%cc"); #define SQRADD2(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -201,7 +201,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); #define SQRADDSC(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -212,7 +212,7 @@ asm volatile ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j)); #define SQRADDAC(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -225,7 +225,7 @@ asm volatile ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j) :"%eax","%edx","%cc"); #define SQRADDDB \ -asm ( \ +asm( \ "addl %6,%0 \n\t" \ "adcl %7,%1 \n\t" \ "adcl %8,%2 \n\t" \ diff --git a/makefile b/makefile index 74a712c..a9ad6b2 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,13 @@ #makefile for TomsFastMath # # -CFLAGS += -Wall -W -Wshadow -I./ -O3 -funroll-all-loops +VERSION=0.05 + +CFLAGS += -Wall -W -Wshadow -I./ + +ifndef IGNORE_SPEED + +CFLAGS += -O3 -funroll-all-loops #profiling #PROF=-pg -g @@ -10,9 +16,7 @@ CFLAGS += -Wall -W -Wshadow -I./ -O3 -funroll-all-loops #speed CFLAGS += -fomit-frame-pointer -VERSION=0.04 - -default: libtfm.a +endif OBJECTS = \ fp_set.o \ @@ -52,23 +56,29 @@ ifndef INCPATH INCPATH=/usr/include endif -ifndef TFM_GROUP +ifndef INSTALL_GROUP GROUP=wheel +else + GROUP=$(INSTALL_GROUP) endif -ifndef TFM_USER +ifndef INSTALL_USER USER=root +else + USER=$(INSTALL_USER) endif ifndef LIBNAME LIBNAME=libtfm.a endif -$(LIBNAME): $(OBJECTS) - $(AR) $(ARFLAGS) $(LIBNAME) $(OBJECTS) - ranlib $(LIBNAME) +default: $(LIBNAME) -install: libtfm.a +$(LIBNAME): $(OBJECTS) + $(AR) $(ARFLAGS) $@ $(OBJECTS) + ranlib $@ + +install: $(LIBNAME) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(LIBPATH) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) install -g $(GROUP) -o $(USER) $(LIBNAME) $(DESTDIR)$(LIBPATH) @@ -77,17 +87,17 @@ install: libtfm.a mtest/mtest: mtest/mtest.c cd mtest ; make mtest -test: libtfm.a demo/test.o mtest/mtest - $(CC) $(CFLAGS) demo/test.o libtfm.a $(PROF) -o test +test: $(LIBNAME) demo/test.o mtest/mtest + $(CC) $(CFLAGS) demo/test.o $(LIBNAME) $(PROF) -o test -timing: libtfm.a demo/test.o - $(CC) $(CFLAGS) demo/test.o libtfm.a $(PROF) -o test +timing: $(LIBNAME) demo/test.o + $(CC) $(CFLAGS) demo/test.o $(LIBNAME) $(PROF) -o test -stest: libtfm.a demo/stest.o - $(CC) $(CFLAGS) demo/stest.o libtfm.a -o stest +stest: $(LIBNAME) demo/stest.o + $(CC) $(CFLAGS) demo/stest.o $(LIBNAME) -o stest -rsatest: libtfm.a demo/rsa.o - $(CC) $(CFLAGS) demo/rsa.o libtfm.a -o rsatest +rsatest: $(LIBNAME) demo/rsa.o + $(CC) $(CFLAGS) demo/rsa.o $(LIBNAME) -o rsatest docdvi: tfm.tex touch tfm.ind @@ -101,8 +111,23 @@ docs: docdvi dvipdf tfm mv -f tfm.pdf doc +#This rule cleans the source tree of all compiled code, not including the pdf +#documentation. clean: - rm -f $(OBJECTS) *.a demo/*.o test tfm.aux tfm.dvi tfm.idx tfm.ilg tfm.ind tfm.lof tfm.log tfm.toc stest *~ rsatest *.gcda *.gcno demo/*.gcda demo/*.gcno mtest/*.gcno mtest/*.gcda + rm -f `find . -type f | grep "[.]o" | xargs` + rm -f `find . -type f | grep "[.]lo" | xargs` + rm -f `find . -type f | grep "[.]a" | xargs` + rm -f `find . -type f | grep "[.]la" | xargs` + rm -f `find . -type f | grep "[.]obj" | xargs` + rm -f `find . -type f | grep "[.]lib" | xargs` + rm -f `find . -type f | grep "[.]exe" | xargs` + rm -f `find . -type f | grep "[.]gcda" | xargs` + rm -f `find . -type f | grep "[.]gcno" | xargs` + rm -f `find . -type f | grep "[.]il" | xargs` + rm -f `find . -type f | grep "[.]dyn" | xargs` + rm -f `find . -type f | grep "[.]dpi" | xargs` + rm -rf `find . -type d | grep "[.]libs" | xargs` + rm -f tfm.aux tfm.dvi tfm.idx tfm.ilg tfm.ind tfm.lof tfm.log tfm.toc cd mtest ; make clean no_oops: clean @@ -116,3 +141,7 @@ zipup: no_oops docs clean cp -R ./tomsfastmath/* ./tomsfastmath-$(VERSION)/ ; \ tar -c tomsfastmath-$(VERSION)/* | bzip2 -9vvc > tfm-$(VERSION).tar.bz2 ; \ zip -9r tfm-$(VERSION).zip tomsfastmath-$(VERSION)/* + +# $Source: /cvs/libtom/tomsfastmath/makefile,v $ +# $Revision: 1.17 $ +# $Date: 2005/07/30 04:23:55 $ diff --git a/makefile.gba b/makefile.gba deleted file mode 100644 index 89e3451..0000000 --- a/makefile.gba +++ /dev/null @@ -1,55 +0,0 @@ -#makefile for TomsFastMath -# -#For the GameboyAdance... er.... ARMv4 -SFLAGS = $(CFLAGS) -Wall -W -Wshadow -I./ -O3 -funroll-all-loops -mthumb -mthumb-interwork -I../devkitadv/mylib/lib -CFLAGS += -Wall -W -Wshadow -I./ -O3 -funroll-all-loops -marm -mthumb-interwork -I../devkitadv/mylib/lib - -#profiling -#PROF=-pg -g -#CFLAGS += $(PROF) - -#speed -CFLAGS += -fomit-frame-pointer - -VERSION=0.01 - -default: libtfm.a - -OBJECTS = \ -fp_set.o \ -\ -fp_rshd.o fp_lshd.o fp_div_2d.o fp_mod_2d.o fp_mul_2d.o fp_2expt.o \ -fp_mul_2.o fp_div_2.o \ -\ -fp_cnt_lsb.o \ -\ -fp_add.o fp_sub.o fp_mul.o fp_sqr.o fp_div.o fp_mod.o \ -s_fp_add.o s_fp_sub.o \ -\ -fp_cmp_d.o fp_add_d.o fp_sub_d.o fp_mul_d.o fp_div_d.o fp_mod_d.o \ -fp_addmod.o fp_submod.o fp_mulmod.o fp_sqrmod.o fp_invmod.o \ -fp_gcd.o fp_lcm.o fp_prime_miller_rabin.o fp_isprime.o \ -fp_prime_random_ex.o fp_mul_comba.o fp_sqr_comba.o \ -\ -fp_montgomery_setup.o fp_montgomery_calc_normalization.o fp_montgomery_reduce.o \ -\ -fp_exptmod.o \ -\ -fp_cmp.o fp_cmp_mag.o \ -\ -fp_unsigned_bin_size.o fp_read_unsigned_bin.o fp_to_unsigned_bin.o \ -fp_signed_bin_size.o fp_read_signed_bin.o fp_to_signed_bin.o \ -fp_read_radix.o fp_toradix.o fp_count_bits.o fp_reverse.o fp_s_rmap.o \ -\ - -libtfm.a: $(OBJECTS) - $(AR) $(ARFLAGS) libtfm.a $(OBJECTS) - ranlib libtfm.a - -demo/stest.o: demo/stest.c - $(CC) $(SFLAGS) -DGBA_MODE demo/stest.c -c -o demo/stest.o - -stest: libtfm.a demo/stest.o - $(CC) -mthumb -mthumb-interwork demo/stest.o libtfm.a ../devkitadv/mylib/lib/gba.a -o stest.elf - objcopy -O binary stest.elf stest.bin - diff --git a/makefile.shared b/makefile.shared new file mode 100644 index 0000000..74fa873 --- /dev/null +++ b/makefile.shared @@ -0,0 +1,109 @@ +#makefile for TomsFastMath +# +# + +CC=libtool --mode=compile gcc + +CFLAGS += -Wall -W -Wshadow -I./ + +ifndef IGNORE_SPEED + +CFLAGS += -O3 -funroll-all-loops + +#profiling +#PROF=-pg -g +#CFLAGS += $(PROF) + +#speed +CFLAGS += -fomit-frame-pointer + +endif + +VERSION=0:5 + +OBJECTS = \ +fp_set.o \ +\ +fp_rshd.o fp_lshd.o fp_div_2d.o fp_mod_2d.o fp_mul_2d.o fp_2expt.o \ +fp_mul_2.o fp_div_2.o \ +\ +fp_cnt_lsb.o \ +\ +fp_add.o fp_sub.o fp_mul.o fp_sqr.o fp_div.o fp_mod.o \ +s_fp_add.o s_fp_sub.o \ +\ +fp_cmp_d.o fp_add_d.o fp_sub_d.o fp_mul_d.o fp_div_d.o fp_mod_d.o \ +fp_addmod.o fp_submod.o fp_mulmod.o fp_sqrmod.o fp_invmod.o \ +fp_gcd.o fp_lcm.o fp_prime_miller_rabin.o fp_isprime.o \ +fp_prime_random_ex.o fp_mul_comba.o fp_sqr_comba.o \ +\ +fp_montgomery_setup.o fp_montgomery_calc_normalization.o fp_montgomery_reduce.o \ +\ +fp_exptmod.o \ +\ +fp_cmp.o fp_cmp_mag.o \ +\ +fp_unsigned_bin_size.o fp_read_unsigned_bin.o fp_to_unsigned_bin.o \ +fp_signed_bin_size.o fp_read_signed_bin.o fp_to_signed_bin.o \ +fp_read_radix.o fp_toradix.o fp_radix_size.o fp_count_bits.o fp_reverse.o fp_s_rmap.o \ +\ +fp_ident.o + +HEADERS=tfm.h + +ifndef LIBPATH + LIBPATH=/usr/lib +endif + +ifndef INCPATH + INCPATH=/usr/include +endif + +ifndef INSTALL_GROUP + GROUP=wheel +else + GROUP=$(INSTALL_GROUP) +endif + +ifndef INSTALL_USER + USER=root +else + USER=$(INSTALL_USER) +endif + +ifndef LIBNAME + LIBNAME=libtfm.la +endif + +ifndef LIBNAME_S + LIBNAME_S=libtfm.a +endif + +default: $(LIBNAME) + +$(LIBNAME): $(OBJECTS) + +install: $(LIBNAME) + libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]lo" | xargs` -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) + libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]o" | xargs` -o $(LIBNAME_S) + ranlib $(LIBNAME_S) + libtool --silent --mode=install install -c $(LIBNAME) $(LIBPATH)/$(LIBNAME) + install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) + install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) + +mtest/mtest: mtest/mtest.c + cd mtest ; make mtest + +test: $(LIBNAME) demo/test.o mtest/mtest + $(CC) $(CFLAGS) demo/test.o $(LIBNAME_S) $(PROF) -o test + +timing: $(LIBNAME) demo/test.o + $(CC) $(CFLAGS) demo/test.o $(LIBNAME_S) $(PROF) -o test + +stest: $(LIBNAME) demo/stest.o + $(CC) $(CFLAGS) demo/stest.o $(LIBNAME_S) -o stest + +# $Source: /cvs/libtom/tomsfastmath/makefile.shared,v $ +# $Revision: 1.4 $ +# $Date: 2005/07/28 03:08:35 $ + diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c index 08eaaa0..132c1e2 100644 --- a/pre_gen/mpi.c +++ b/pre_gen/mpi.c @@ -757,6 +757,75 @@ int fp_div_d(fp_int *a, fp_digit b, fp_int *c, fp_digit *d) */ #include +#ifdef TFM_TIMING_RESISTANT + +/* timing resistant montgomery ladder based exptmod + + Based on work by Marc Joye, Sung-Ming Yen, "The Montgomery Powering Ladder", Cryptographic Hardware and Embedded Systems, CHES 2002 +*/ +static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) +{ + fp_int R[2]; + fp_digit buf, mp; + int err, bitcnt, digidx, y; + + /* now setup montgomery */ + if ((err = fp_montgomery_setup (P, &mp)) != FP_OKAY) { + return err; + } + + fp_init(&R[0]); + fp_init(&R[1]); + + /* now we need R mod m */ + fp_montgomery_calc_normalization (&R[0], P); + + /* now set R[0][1] to G * R mod m */ + if (fp_cmp_mag(P, G) != FP_GT) { + /* G > P so we reduce it first */ + fp_mod(G, P, &R[1]); + } else { + fp_copy(G, &R[1]); + } + fp_mulmod (&R[1], &R[0], P, &R[1]); + + /* for j = t-1 downto 0 do + r_!k = R0*R1; r_k = r_k^2 + */ + + /* set initial mode and bit cnt */ + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits so break */ + if (digidx == -1) { + break; + } + /* read next digit and reset bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int)DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (fp_digit)(buf >> (DIGIT_BIT - 1)) & 1; + buf <<= (fp_digit)1; + + /* do ops */ + fp_mul(&R[0], &R[1], &R[y^1]); fp_montgomery_reduce(&R[y^1], P, mp); + fp_sqr(&R[y], &R[y]); fp_montgomery_reduce(&R[y], P, mp); + } + + fp_montgomery_reduce(&R[0], P, mp); + fp_copy(&R[0], Y); + return FP_OKAY; +} + +#else + /* y = g**x (mod b) * Some restrictions... x must be positive and < b */ @@ -916,6 +985,8 @@ static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) return FP_OKAY; } +#endif + int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { @@ -1105,6 +1176,111 @@ int main(void) */ #include +static int fp_invmod_slow (fp_int * a, fp_int * b, fp_int * c) +{ + fp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == FP_NEG || fp_iszero(b) == 1) { + return FP_VAL; + } + + /* init temps */ + fp_init(&x); fp_init(&y); + fp_init(&u); fp_init(&v); + fp_init(&A); fp_init(&B); + fp_init(&C); fp_init(&D); + + /* x = a, y = b */ + if ((res = fp_mod(a, b, &x)) != FP_OKAY) { + return res; + } + fp_copy(b, &y); + + /* 2. [modified] if x,y are both even then return an error! */ + if (fp_iseven (&x) == 1 && fp_iseven (&y) == 1) { + return FP_VAL; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + fp_copy (&x, &u); + fp_copy (&y, &v); + fp_set (&A, 1); + fp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (fp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + fp_div_2 (&u, &u); + + /* 4.2 if A or B is odd then */ + if (fp_isodd (&A) == 1 || fp_isodd (&B) == 1) { + /* A = (A+y)/2, B = (B-x)/2 */ + fp_add (&A, &y, &A); + fp_sub (&B, &x, &B); + } + /* A = A/2, B = B/2 */ + fp_div_2 (&A, &A); + fp_div_2 (&B, &B); + } + + /* 5. while v is even do */ + while (fp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + fp_div_2 (&v, &v); + + /* 5.2 if C or D is odd then */ + if (fp_isodd (&C) == 1 || fp_isodd (&D) == 1) { + /* C = (C+y)/2, D = (D-x)/2 */ + fp_add (&C, &y, &C); + fp_sub (&D, &x, &D); + } + /* C = C/2, D = D/2 */ + fp_div_2 (&C, &C); + fp_div_2 (&D, &D); + } + + /* 6. if u >= v then */ + if (fp_cmp (&u, &v) != FP_LT) { + /* u = u - v, A = A - C, B = B - D */ + fp_sub (&u, &v, &u); + fp_sub (&A, &C, &A); + fp_sub (&B, &D, &B); + } else { + /* v - v - u, C = C - A, D = D - B */ + fp_sub (&v, &u, &v); + fp_sub (&C, &A, &C); + fp_sub (&D, &B, &D); + } + + /* if not zero goto step 4 */ + if (fp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (fp_cmp_d (&v, 1) != FP_EQ) { + return FP_VAL; + } + + /* if its too low */ + while (fp_cmp_d(&C, 0) == FP_LT) { + fp_add(&C, b, &C); + } + + /* too big */ + while (fp_cmp_mag(&C, b) != FP_LT) { + fp_sub(&C, b, &C); + } + + /* C is now the inverse */ + fp_copy(&C, c); + return FP_OKAY; +} + /* c = 1/a (mod b) for odd b only */ int fp_invmod(fp_int *a, fp_int *b, fp_int *c) { @@ -1113,7 +1289,7 @@ int fp_invmod(fp_int *a, fp_int *b, fp_int *c) /* 2. [modified] b must be odd */ if (fp_iseven (b) == FP_YES) { - return FP_VAL; + return fp_invmod_slow(a,b,c); } /* init all our temps */ @@ -1814,8 +1990,6 @@ asm( \ #define LO 0 -#define HI 1 -#define CY 2 /* computes x/R == x (mod N) via Montgomery Reduction */ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) @@ -1862,7 +2036,7 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) } LOOP_END; while (cy) { - PROPCARRY; // cy = cy > (*_c += cy); + PROPCARRY; ++_c; } } @@ -1889,10 +2063,10 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) } } + /* $Source$ */ /* $Revision$ */ /* $Date$ */ - /* End: fp_montgomery_reduce.c */ @@ -2270,7 +2444,7 @@ void fp_mul_2d(fp_int *a, int b, fp_int *c) /* this should multiply i and j */ #define MULADD(i, j) \ -asm ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -2341,7 +2515,7 @@ asm ( \ /* this should multiply i and j */ #define MULADD(i, j) \ - asm volatile ( \ + asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -5678,7 +5852,7 @@ Obvious points of optimization #define COMBA_FINI #define SQRADD(i, j) \ -asm volatile ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %%eax \n\t" \ "addl %%eax,%0 \n\t" \ @@ -5687,7 +5861,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%edx","%cc"); #define SQRADD2(i, j) \ -asm volatile ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -5699,7 +5873,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); #define SQRADDSC(i, j) \ -asm ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "movl %%eax,%0 \n\t" \ @@ -5708,7 +5882,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); #define SQRADDAC(i, j) \ -asm ( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -5717,7 +5891,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); #define SQRADDDB \ -asm ( \ +asm( \ "addl %6,%0 \n\t" \ "adcl %7,%1 \n\t" \ "adcl %8,%2 \n\t" \ @@ -5746,7 +5920,7 @@ asm ( \ #define COMBA_FINI #define SQRADD(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %%rax \n\t" \ "addq %%rax,%0 \n\t" \ @@ -5755,7 +5929,7 @@ asm ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","%cc"); #define SQRADD2(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %7 \n\t" \ "addq %%rax,%0 \n\t" \ @@ -5767,7 +5941,7 @@ asm ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); #define SQRADDSC(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %7 \n\t" \ "movq %%rax,%0 \n\t" \ @@ -5776,7 +5950,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); #define SQRADDAC(i, j) \ -asm ( \ +asm( \ "movq %6,%%rax \n\t" \ "mulq %7 \n\t" \ "addq %%rax,%0 \n\t" \ @@ -5785,7 +5959,7 @@ asm ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); #define SQRADDDB \ -asm ( \ +asm( \ "addq %6,%0 \n\t" \ "adcq %7,%1 \n\t" \ "adcq %8,%2 \n\t" \ @@ -5815,7 +5989,7 @@ asm ( \ asm("emms"); #define SQRADD(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "pmuludq %%mm0,%%mm0\n\t" \ "movd %%mm0,%%eax \n\t" \ @@ -5827,7 +6001,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%cc"); #define SQRADD2(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -5843,7 +6017,7 @@ asm volatile ( \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); #define SQRADDSC(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -5854,7 +6028,7 @@ asm volatile ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j)); #define SQRADDAC(i, j) \ -asm volatile ( \ +asm( \ "movd %6,%%mm0 \n\t" \ "movd %7,%%mm1 \n\t" \ "pmuludq %%mm1,%%mm0\n\t" \ @@ -5867,7 +6041,7 @@ asm volatile ( \ :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j) :"%eax","%edx","%cc"); #define SQRADDDB \ -asm ( \ +asm( \ "addl %6,%0 \n\t" \ "adcl %7,%1 \n\t" \ "adcl %8,%2 \n\t" \ diff --git a/tfm.aux b/tfm.aux index 865325f..2db70b6 100644 --- a/tfm.aux +++ b/tfm.aux @@ -17,40 +17,42 @@ \@writefile{toc}{\contentsline {section}{\numberline {1.1}What is TomsFastMath?}{1}{section.1.1}} \@writefile{toc}{\contentsline {section}{\numberline {1.2}License}{2}{section.1.2}} \@writefile{toc}{\contentsline {section}{\numberline {1.3}Building}{2}{section.1.3}} -\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.1}Build Limitations}{2}{subsection.1.3.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.2}Optimization Configuration}{2}{subsection.1.3.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.1}Intel CC}{2}{subsection.1.3.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.2}MSVC}{2}{subsection.1.3.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.3}Build Limitations}{3}{subsection.1.3.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.4}Optimization Configuration}{3}{subsection.1.3.4}} \@writefile{toc}{\contentsline {subsubsection}{x86--32}{3}{section*.3}} \@writefile{toc}{\contentsline {subsubsection}{SSE2}{3}{section*.4}} -\@writefile{toc}{\contentsline {subsubsection}{x86--64}{3}{section*.5}} -\@writefile{toc}{\contentsline {subsubsection}{ARM}{3}{section*.6}} -\@writefile{toc}{\contentsline {subsubsection}{PPC32}{3}{section*.7}} +\@writefile{toc}{\contentsline {subsubsection}{x86--64}{4}{section*.5}} +\@writefile{toc}{\contentsline {subsubsection}{ARM}{4}{section*.6}} +\@writefile{toc}{\contentsline {subsubsection}{PPC32}{4}{section*.7}} \@writefile{toc}{\contentsline {subsubsection}{Future Releases}{4}{section*.8}} \@writefile{lof}{\contentsline {figure}{\numberline {1.1}{\ignorespaces Recommended Build Modes}}{4}{figure.1.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.3}Precision Configuration}{4}{subsection.1.3.3}} -\@writefile{toc}{\contentsline {chapter}{\numberline {2}Getting Started}{5}{chapter.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3.5}Precision Configuration}{5}{subsection.1.3.5}} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Getting Started}{7}{chapter.2}} \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\@writefile{toc}{\contentsline {section}{\numberline {2.1}Data Types}{5}{section.2.1}} -\@writefile{toc}{\contentsline {section}{\numberline {2.2}Initialization}{6}{section.2.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Simple Initialization}{6}{subsection.2.2.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Initialize Small Constants}{6}{subsection.2.2.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.3}Initialize Copy}{6}{subsection.2.2.3}} -\@writefile{toc}{\contentsline {chapter}{\numberline {3}Arithmetic Operations}{7}{chapter.3}} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}Data Types}{7}{section.2.1}} +\@writefile{toc}{\contentsline {section}{\numberline {2.2}Initialization}{8}{section.2.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Simple Initialization}{8}{subsection.2.2.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Initialize Small Constants}{8}{subsection.2.2.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.3}Initialize Copy}{8}{subsection.2.2.3}} +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Arithmetic Operations}{9}{chapter.3}} \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\@writefile{toc}{\contentsline {section}{\numberline {3.1}Odds and Evens}{7}{section.3.1}} -\@writefile{toc}{\contentsline {section}{\numberline {3.2}Sign Manipulation}{7}{section.3.2}} -\@writefile{toc}{\contentsline {section}{\numberline {3.3}Comparisons}{8}{section.3.3}} -\@writefile{toc}{\contentsline {section}{\numberline {3.4}Shifting}{8}{section.3.4}} -\@writefile{toc}{\contentsline {section}{\numberline {3.5}Basic Algebra}{9}{section.3.5}} -\@writefile{toc}{\contentsline {section}{\numberline {3.6}Modular Exponentiation}{9}{section.3.6}} -\@writefile{toc}{\contentsline {section}{\numberline {3.7}Number Theoretic}{9}{section.3.7}} -\@writefile{toc}{\contentsline {section}{\numberline {3.8}Prime Numbers}{10}{section.3.8}} -\@writefile{toc}{\contentsline {chapter}{\numberline {4}Porting TomsFastMath}{11}{chapter.4}} +\@writefile{toc}{\contentsline {section}{\numberline {3.1}Odds and Evens}{9}{section.3.1}} +\@writefile{toc}{\contentsline {section}{\numberline {3.2}Sign Manipulation}{9}{section.3.2}} +\@writefile{toc}{\contentsline {section}{\numberline {3.3}Comparisons}{10}{section.3.3}} +\@writefile{toc}{\contentsline {section}{\numberline {3.4}Shifting}{10}{section.3.4}} +\@writefile{toc}{\contentsline {section}{\numberline {3.5}Basic Algebra}{11}{section.3.5}} +\@writefile{toc}{\contentsline {section}{\numberline {3.6}Modular Exponentiation}{11}{section.3.6}} +\@writefile{toc}{\contentsline {section}{\numberline {3.7}Number Theoretic}{11}{section.3.7}} +\@writefile{toc}{\contentsline {section}{\numberline {3.8}Prime Numbers}{12}{section.3.8}} +\@writefile{toc}{\contentsline {chapter}{\numberline {4}Porting TomsFastMath}{13}{chapter.4}} \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\newlabel{chap:asmops}{{4}{11}{Porting TomsFastMath\relax }{chapter.4}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4.1}Getting Started}{11}{section.4.1}} -\@writefile{toc}{\contentsline {section}{\numberline {4.2}Multiply with Comba}{11}{section.4.2}} -\@writefile{toc}{\contentsline {section}{\numberline {4.3}Squaring with Comba}{13}{section.4.3}} -\@writefile{toc}{\contentsline {section}{\numberline {4.4}Montgomery with Comba}{15}{section.4.4}} +\newlabel{chap:asmops}{{4}{13}{Porting TomsFastMath\relax }{chapter.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.1}Getting Started}{13}{section.4.1}} +\@writefile{toc}{\contentsline {section}{\numberline {4.2}Multiply with Comba}{13}{section.4.2}} +\@writefile{toc}{\contentsline {section}{\numberline {4.3}Squaring with Comba}{15}{section.4.3}} +\@writefile{toc}{\contentsline {section}{\numberline {4.4}Montgomery with Comba}{17}{section.4.4}} diff --git a/tfm.dvi b/tfm.dvi index d1c36300cafa5ff2539522996a2c9207ead65c45..7766aaa15cbe13cee61470cfb93f66ea38ee4940 100644 GIT binary patch delta 3306 zcmaJ@dr%bl5#E`d<^6uk@{nDR1!Py2RY2tFipre|ig-RxhTRcH_W?7r3a1`EORsdn zrAu7pbiumv4q_#qgC6)cl{@uPNlfLBSjp*K%F3C`Z>vajYAT)fby{OhO2d?+j^m;>$F45%DR79+_WO69>G zH5^v0RVHT?!*Eh6D1#O&BYtuT#*;EcThIjx4o76e+u>2^wT>gB4+X~NQ8qT3&5uJ{ z1-q@ZY!+SNA<_u3J~fqqp5PStS!BtKLQRF+XfPQHyFJqt#L|XUh@6Uex&aYo1Vo3& zW41AHN4y1(BBR9B;TnQ4!MVud(AoYVv*B{YKm2EN{AY8-Cy^=wzK@B6;OJVSSX>_M zCE)oqqnH}oLcn2lB0P@QieqtE@{9O5-thW#bs{D{td^i^_(f7NF&CCcXNl>_YYDiM zWfF%|mP!wCluu$do-|#|OI<=hU0yOYY2(CG>VvOemZftOFQ7|=2U!_nXy#i}54KIm zY!Vhd#0Ob>2%=D=wIx`kcw)u@0#vysab~?=`l-e`nJIfN*!Z>)Q+n2%|gm32NO3r&F=PqoarXrxx2wWfo zO)_x4i?vx?4#HV&61&?Vn>8l25f9IM{}KCp0&5xIzc!w`mnR@ z$f9%x*4ybVUPfc^1poBUbsPvzU>&?b+iV_$vJU7Hyq#^Vg_hs*Tn@GagCU}O&~0To z#v(X5mf`!TThmT=2Z}k8*(eYfwi+Xn#062@U1k*SYHtW3+;ernTW(!fNiYM zilHS|$dTz&mNqu(H-Stt!p0ct>?sTBoLW|SRaGikdaam+53rE4}vRVD@r<-l4m=ol&m86>-5qTthX`%^spUi;=)xljFeVwUKRrylS zwrRj@E@v$kX+jvNU9_xjMa{;B`kI;r<;HHGdVP*O8|N20kB&av2FzAqxO@*efPAov zHr_+>2U&-Wbuj%T|DoJUKq8!%l}*@PRNuz%d>=Z})~%lL_FJ^wVPULZp%q7Wk=e|n zO4<9Wd7!-En_) zOeiaV4*tu)0JV0y1&c?$X#u7W6~RkNN6vjAEi-6RMZwwmM%ZWwgC}JfaMPX;B&Rh& zMR_VU6rb=NtS@iI1+7rP_3~NDkdyP_X}OmAIBIMJnkv;`s#r$(f=-&jSeOVWDx%=u zg+*`_4cCvUfT%2$jPoTUQ3O90=EC;M{mNK6TdFt}FP?ykeG!)D{-S3?S(S!3BQ{s5 z2x=&z@hY@dzoSe(JK`UY+*qIbi*)zBj*_D7rowJt(DfXsS~d-0%rRu+HPDz{#Gu%3 z{tXfNMVk9wLqm=1lPmkUYoai+uf{{7t5~?Wmw<+*bm^Lgb6Ooa|E7PlYv2!c@5IO{ zie`6v5)_J|pdF+f;)mK8GWh54vi5!IV-!a0csqv-N!2yE?^Ul@3U_PO@Z}Q8L%g?S zJrOD!>g&xWXs=0wHOr!~B1CUl_7yqkhV1&)(w_tM4wWxex6uv%sZT-8b|~dc#mgnK z3zugSA$*j3V0?SpR@j{sFYa2wso;KouzY9L?UH*LJyYssGXBf5e4SS6W-4Cdf%=9i z6n=f@K>q5T6WoVahmx?iDM=Qfr%6X{I6Zl_?a)W{(iA+XD}&Q|6NI$rNV*(z?GX>H z`+AOejEIBJwAtjjehCv>GDZ6H#u9is@ImjHaIjqXB@r)sULJmxUzRBcE??XS6<1@R z?sFZH0yi%u1R0H*3ZoG`W4bVly$u(8W8-7l0_y)uZxACpk z027v?hxc{{y*ag1y$Uu8$$@4WQnmg6Le{#H{s$tpK?QgYyRHTYi1zDi8LwD}b8p~A zU(Z0fq}r)4z8x>D$=(K36~?=o-(X3+@vi(SC8WPlD6aCv-rgH&^Az|~{)Nn3f19x5 VW0+!^c`1Fr~>9%xW8k8DMv= z8eUGx7Vamm{qJc-atxMa@bhWuA3Th*x*cvN%j5R=Cqfq13vZ^B|G#)JW$|ao{BFD~ zq*$HSjzN-Ig`E?oHBNC@B{uDUa*Lkw}1y%f^*AV zY*c94dJvPJjdyWia;L!k@_5ZeymGV8cc(~K?C00rw>HvN%EeOtVB$9#NZ6K(jY`P2 zZSlS5B$!@;ReEVhC+)IHINwZ_mtiQ^sf+hG@raoJ;C4BBzyju~DxNSeIxYJHl)^!Q z-NHi0pgEnQT;O5cfmi8Hs#C|yo#qz)N#2KU=n!dvvs2)pI~WVo11#=KGw?69*!L*T3e|DG|NE`s*B=u@w~k2ix(uHUa(qR z0DfaqFLcwK9YiYu3OI`8v^vDW$H`=&l7@*)%5w@iW?peK&QLiNAT5rzN_f;n*x+TU zSG*47Ou1k_A%dkT<_$T^IE z*WFD!93XW*R0n5gC<>gXp1XL@>)>dQgSMiI+%7hsC$KKI%WGj!VXP8cI z;eF8|Y^+o&LcYE((&=@@@L{c1E}9U2R~v?fht30x99P3bb1|VhQxAVPZGz@HEigYV zfq%l?Mf8>Csrc?;l#pA|B zn6C56(e;oCWc`;|bVILiskynP*ndvKtZ6`HD2$83#s(h8jkko$JBBc2P$R-bPD6h<`S1z+*KHeZHmbdv^Gd*nWwqx*3Vx655*gVhSm{si_JX3aQ*~kyLKM zUs`?x{8$Ox%^~s1GU?m%&8`=)8ThpI`6$t(k5|iN5ZC6)ok;!BAkCI)`6tmIc{wjb z@x&in_D~MW!cweXLs*C$F8I>__fW1+vHMNWp)*DOqnf=a-T)R4i||#{B84LZTm)8xT&BR{+a!Lxe>rgjl#lNgmQJ=u!fii^56lk@)Wg}498ABW zD11M1I~?Lql6U}Jq-8bkWT)U8S4Bec2#JpzKuTL-cq9ST)48Y@PrarJ2d7J-;o2C9 zPwZLE&K)0sia-oZUivKrr%3!0i%5W>oyIqS{PIzGnbuea?_Acy*u06bIz6zsPziNc zvf%bYIh?zajov1RnTz`{S{rqd8`FpQvBwynD(X|LEws|3Ag@lwdAqF#ixsV=m_-H|-HW94116kh) zLtiwYt`ruk(;v%ZpXFgkhGy4nm7$0D7SG&!9dn{#v@BVOyM7FdntcPmD?R@K!N> DIGIT_BIT); sc2 = 0; \[] [] -Overfull \hbox (25.129pt too wide) in paragraph at lines 548--549 +Overfull \hbox (25.129pt too wide) in paragraph at lines 560--561 \OT1/cmr/m/n/10 This com-putes a prod-uct and stores it in the ``sec-ondary'' c arry reg-is-ters $[]$. [] -Overfull \hbox (74.99634pt too wide) in paragraph at lines 556--556 +Overfull \hbox (74.99634pt too wide) in paragraph at lines 568--568 []\OT1/cmtt/m/n/10 #define SQRADDAC(i, j) \[] [] -Overfull \hbox (74.99634pt too wide) in paragraph at lines 556--556 +Overfull \hbox (74.99634pt too wide) in paragraph at lines 568--568 [] \OT1/cmtt/m/n/10 do { fp_word t; \[] [] -Overfull \hbox (74.99634pt too wide) in paragraph at lines 556--556 +Overfull \hbox (74.99634pt too wide) in paragraph at lines 568--568 [] \OT1/cmtt/m/n/10 t = sc0 + ((fp_word)i) * ((fp_word)j); sc0 = t; \[] [] -Overfull \hbox (74.99634pt too wide) in paragraph at lines 556--556 +Overfull \hbox (74.99634pt too wide) in paragraph at lines 568--568 [] \OT1/cmtt/m/n/10 t = sc1 + (t >> DIGIT_BIT); sc1 = t; sc2 += t >> DIGIT_BIT; \[] [] -Overfull \hbox (74.99634pt too wide) in paragraph at lines 566--566 +Overfull \hbox (74.99634pt too wide) in paragraph at lines 578--578 []\OT1/cmtt/m/n/10 #define SQRADDDB \[] [] -Overfull \hbox (74.99634pt too wide) in paragraph at lines 566--566 +Overfull \hbox (74.99634pt too wide) in paragraph at lines 578--578 [] \OT1/cmtt/m/n/10 do { fp_word t; \[] [] -Overfull \hbox (190.49533pt too wide) in paragraph at lines 566--566 +Overfull \hbox (190.49533pt too wide) in paragraph at lines 578--578 [] \OT1/cmtt/m/n/10 t = ((fp_word)sc0) + ((fp_word)sc0) + c0; c0 = t; \[] [] -Overfull \hbox (190.49533pt too wide) in paragraph at lines 566--566 +Overfull \hbox (190.49533pt too wide) in paragraph at lines 578--578 [] \OT1/cmtt/m/n/10 t = ((fp_word)sc1) + ((fp_word)sc1) + c1 + (t >> DIGIT_BI T); c1 = t; \[] [] -Overfull \hbox (190.49533pt too wide) in paragraph at lines 566--566 +Overfull \hbox (190.49533pt too wide) in paragraph at lines 578--578 [] \OT1/cmtt/m/n/10 c2 = c2 + ((fp_word)sc2) + ((fp_word)sc2) + (t >> DIGIT_B IT); \[] [] -[14] [15] (./tfm.ind [16] [17 +[16] [17] (./tfm.ind [18] [19 ]) (./tfm.aux) ) @@ -329,4 +329,4 @@ Here is how much of TeX's memory you used: 580 hyphenation exceptions out of 1000 25i,9n,25p,195b,321s stack positions out of 1500i,500n,1500p,200000b,5000s -Output written on tfm.dvi (23 pages, 49708 bytes). +Output written on tfm.dvi (25 pages, 51612 bytes). diff --git a/tfm.tex b/tfm.tex index 08d7bfb..761d95f 100644 --- a/tfm.tex +++ b/tfm.tex @@ -49,8 +49,8 @@ \begin{document} \frontmatter \pagestyle{empty} -\title{TomsFastMath User Manual \\ v0.04} -\author{Tom St Denis \\ tomstdenis@iahu.ca} +\title{TomsFastMath User Manual \\ v0.05} +\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 [176x250] paper using the \LaTeX{} {\em book} macro package. @@ -101,14 +101,26 @@ fast multiplication and squaring and has the side effect of speeding up ECC oper TomsFastMath is public domain. \section{Building} -Currently only a GCC makefile has been provided. To build the library simply type -``make''. The library is a bit too new to put into production so no install -scripts exist yet. You can build the test program with ``make test''. +To build the library simply type ``make''. Or to install in typical *unix like directories use +``make install''. Similarly a shared library can be built with ``make -f makefile.shared install''. -To perform simple static testing (useful to test out new assembly ports) use the stest -program. Type ``make stest'' and run it on your target. The program will perform three -multiplications, squarings and montgomery reductions. Likely if your assembly -code is invalid this code will exhibit the bug. +You can build the test program with ``make test''. To perform simple static testing (useful to +test out new assembly ports) use the stest program. Type ``make stest'' and run it on your +target. The program will perform three multiplications, squarings and montgomery reductions. +Likely if your assembly code is invalid this code will exhibit the bug. + +\subsection{Intel CC} +In theory you should be able to build the library with + +\begin{verbatim} +CFLAGS="-O3 -ip" CC=icc make IGNORE_SPEED=1 +\end{verbatim} + +However, Intels inline assembler is way less advanced than GCCs. As a result it doesn't compile. +Fortunately it doesn't really matter. + +\subsection{MSVC} +The library doesn't build with MSVC. Imagine that. \subsection{Build Limitations} TomsFastMath has the following build requirements which are non--portable but under most diff --git a/tfm.toc b/tfm.toc index 83d12c4..acf180c 100644 --- a/tfm.toc +++ b/tfm.toc @@ -2,32 +2,34 @@ \contentsline {section}{\numberline {1.1}What is TomsFastMath?}{1}{section.1.1} \contentsline {section}{\numberline {1.2}License}{2}{section.1.2} \contentsline {section}{\numberline {1.3}Building}{2}{section.1.3} -\contentsline {subsection}{\numberline {1.3.1}Build Limitations}{2}{subsection.1.3.1} -\contentsline {subsection}{\numberline {1.3.2}Optimization Configuration}{2}{subsection.1.3.2} +\contentsline {subsection}{\numberline {1.3.1}Intel CC}{2}{subsection.1.3.1} +\contentsline {subsection}{\numberline {1.3.2}MSVC}{2}{subsection.1.3.2} +\contentsline {subsection}{\numberline {1.3.3}Build Limitations}{3}{subsection.1.3.3} +\contentsline {subsection}{\numberline {1.3.4}Optimization Configuration}{3}{subsection.1.3.4} \contentsline {subsubsection}{x86--32}{3}{section*.3} \contentsline {subsubsection}{SSE2}{3}{section*.4} -\contentsline {subsubsection}{x86--64}{3}{section*.5} -\contentsline {subsubsection}{ARM}{3}{section*.6} -\contentsline {subsubsection}{PPC32}{3}{section*.7} +\contentsline {subsubsection}{x86--64}{4}{section*.5} +\contentsline {subsubsection}{ARM}{4}{section*.6} +\contentsline {subsubsection}{PPC32}{4}{section*.7} \contentsline {subsubsection}{Future Releases}{4}{section*.8} -\contentsline {subsection}{\numberline {1.3.3}Precision Configuration}{4}{subsection.1.3.3} -\contentsline {chapter}{\numberline {2}Getting Started}{5}{chapter.2} -\contentsline {section}{\numberline {2.1}Data Types}{5}{section.2.1} -\contentsline {section}{\numberline {2.2}Initialization}{6}{section.2.2} -\contentsline {subsection}{\numberline {2.2.1}Simple Initialization}{6}{subsection.2.2.1} -\contentsline {subsection}{\numberline {2.2.2}Initialize Small Constants}{6}{subsection.2.2.2} -\contentsline {subsection}{\numberline {2.2.3}Initialize Copy}{6}{subsection.2.2.3} -\contentsline {chapter}{\numberline {3}Arithmetic Operations}{7}{chapter.3} -\contentsline {section}{\numberline {3.1}Odds and Evens}{7}{section.3.1} -\contentsline {section}{\numberline {3.2}Sign Manipulation}{7}{section.3.2} -\contentsline {section}{\numberline {3.3}Comparisons}{8}{section.3.3} -\contentsline {section}{\numberline {3.4}Shifting}{8}{section.3.4} -\contentsline {section}{\numberline {3.5}Basic Algebra}{9}{section.3.5} -\contentsline {section}{\numberline {3.6}Modular Exponentiation}{9}{section.3.6} -\contentsline {section}{\numberline {3.7}Number Theoretic}{9}{section.3.7} -\contentsline {section}{\numberline {3.8}Prime Numbers}{10}{section.3.8} -\contentsline {chapter}{\numberline {4}Porting TomsFastMath}{11}{chapter.4} -\contentsline {section}{\numberline {4.1}Getting Started}{11}{section.4.1} -\contentsline {section}{\numberline {4.2}Multiply with Comba}{11}{section.4.2} -\contentsline {section}{\numberline {4.3}Squaring with Comba}{13}{section.4.3} -\contentsline {section}{\numberline {4.4}Montgomery with Comba}{15}{section.4.4} +\contentsline {subsection}{\numberline {1.3.5}Precision Configuration}{5}{subsection.1.3.5} +\contentsline {chapter}{\numberline {2}Getting Started}{7}{chapter.2} +\contentsline {section}{\numberline {2.1}Data Types}{7}{section.2.1} +\contentsline {section}{\numberline {2.2}Initialization}{8}{section.2.2} +\contentsline {subsection}{\numberline {2.2.1}Simple Initialization}{8}{subsection.2.2.1} +\contentsline {subsection}{\numberline {2.2.2}Initialize Small Constants}{8}{subsection.2.2.2} +\contentsline {subsection}{\numberline {2.2.3}Initialize Copy}{8}{subsection.2.2.3} +\contentsline {chapter}{\numberline {3}Arithmetic Operations}{9}{chapter.3} +\contentsline {section}{\numberline {3.1}Odds and Evens}{9}{section.3.1} +\contentsline {section}{\numberline {3.2}Sign Manipulation}{9}{section.3.2} +\contentsline {section}{\numberline {3.3}Comparisons}{10}{section.3.3} +\contentsline {section}{\numberline {3.4}Shifting}{10}{section.3.4} +\contentsline {section}{\numberline {3.5}Basic Algebra}{11}{section.3.5} +\contentsline {section}{\numberline {3.6}Modular Exponentiation}{11}{section.3.6} +\contentsline {section}{\numberline {3.7}Number Theoretic}{11}{section.3.7} +\contentsline {section}{\numberline {3.8}Prime Numbers}{12}{section.3.8} +\contentsline {chapter}{\numberline {4}Porting TomsFastMath}{13}{chapter.4} +\contentsline {section}{\numberline {4.1}Getting Started}{13}{section.4.1} +\contentsline {section}{\numberline {4.2}Multiply with Comba}{13}{section.4.2} +\contentsline {section}{\numberline {4.3}Squaring with Comba}{15}{section.4.3} +\contentsline {section}{\numberline {4.4}Montgomery with Comba}{17}{section.4.4}