projects
/
u
/
mdw
/
catacomb
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Elliptic curves on binary fields work.
[u/mdw/catacomb]
/
exp.h
diff --git
a/exp.h
b/exp.h
index
6cfdfd8
..
fc9e3a9
100644
(file)
--- a/
exp.h
+++ b/
exp.h
@@
-1,6
+1,6
@@
/* -*-c-*-
*
/* -*-c-*-
*
- * $Id: exp.h,v 1.1
2001/06/16 13:00:59
mdw Exp $
+ * $Id: exp.h,v 1.1
.4.1 2004/03/20 00:13:31
mdw Exp $
*
* Generalized exponentiation
*
*
* Generalized exponentiation
*
@@
-30,6
+30,9
@@
/*----- Revision history --------------------------------------------------*
*
* $Log: exp.h,v $
/*----- Revision history --------------------------------------------------*
*
* $Log: exp.h,v $
+ * Revision 1.1.4.1 2004/03/20 00:13:31 mdw
+ * Projective coordinates for prime curves
+ *
* Revision 1.1 2001/06/16 13:00:59 mdw
* New generic exponentation code. Includes sliding-window simultaneous
* exponentiation.
* Revision 1.1 2001/06/16 13:00:59 mdw
* New generic exponentation code. Includes sliding-window simultaneous
* exponentiation.
@@
-99,6
+102,10
@@
typedef struct exp_simul {
* @EXP_MUL(a, x)@ Multiplies @a@ by @x@ (writing the result
* back to @a@).
*
* @EXP_MUL(a, x)@ Multiplies @a@ by @x@ (writing the result
* back to @a@).
*
+ * @EXP_FIX(x)@ Makes @x@ be a canonical representation of
+ * its value. All multiplications have the
+ * right argument canonical.
+ *
* @EXP_SQR(a)@ Multiplies @a@ by itself.
*
* @EXP_SETMUL(d, x, y)@ Sets @d@ to be the product of @x@ and @y@.
* @EXP_SQR(a)@ Multiplies @a@ by itself.
*
* @EXP_SETMUL(d, x, y)@ Sets @d@ to be the product of @x@ and @y@.
@@
-140,6
+147,7
@@
typedef struct exp_simul {
\
/* --- Do the main body of the work --- */ \
\
\
/* --- Do the main body of the work --- */ \
\
+ EXP_FIX(g); \
for (;;) { \
EXP_MUL(a, g); \
sq = 0; \
for (;;) { \
EXP_MUL(a, g); \
sq = 0; \
@@
-184,11
+192,15
@@
exp_simple_exit:; \
\
/* --- Do the precomputation --- */ \
\
\
/* --- Do the precomputation --- */ \
\
+ EXP_FIX(g); \
EXP_SETSQR(g2, g); \
EXP_SETSQR(g2, g); \
+ EXP_FIX(g2); \
v = xmalloc(EXP_TABSZ * sizeof(EXP_TYPE)); \
EXP_COPY(v[0], g); \
v = xmalloc(EXP_TABSZ * sizeof(EXP_TYPE)); \
EXP_COPY(v[0], g); \
- for (i = 1; i < EXP_TABSZ; i++)
\
+ for (i = 1; i < EXP_TABSZ; i++)
{
\
EXP_SETMUL(v[i], v[i - 1], g2); \
EXP_SETMUL(v[i], v[i - 1], g2); \
+ EXP_FIX(v[i]); \
+ } \
EXP_DROP(g2); \
\
/* --- Skip top-end zero bits --- * \
EXP_DROP(g2); \
\
/* --- Skip top-end zero bits --- * \
@@
-286,17
+298,21
@@
exp_window_exit:; \
j = 1; \
for (i = 0; i < n; i++) { \
EXP_COPY(v[j], f[n - 1 - i].base); \
j = 1; \
for (i = 0; i < n; i++) { \
EXP_COPY(v[j], f[n - 1 - i].base); \
+ EXP_FIX(v[j]); \
j <<= 1; \
} \
k = n * EXP_WINSZ; \
jj = 1; \
for (; i < k; i++) { \
EXP_SETSQR(v[j], v[jj]); \
j <<= 1; \
} \
k = n * EXP_WINSZ; \
jj = 1; \
for (; i < k; i++) { \
EXP_SETSQR(v[j], v[jj]); \
+ EXP_FIX(v[j]); \
j <<= 1; jj <<= 1; \
} \
for (i = 1; i < vn; i <<= 1) { \
j <<= 1; jj <<= 1; \
} \
for (i = 1; i < vn; i <<= 1) { \
- for (j = 1; j < i; j++)
\
+ for (j = 1; j < i; j++)
{
\
EXP_SETMUL(v[j + i], v[j], v[i]); \
EXP_SETMUL(v[j + i], v[j], v[i]); \
+ EXP_FIX(v[j + i]); \
+ } \
} \
\
/* --- Set up the bitscanners --- * \
} \
\
/* --- Set up the bitscanners --- * \
@@
-381,7
+397,7
@@
exp_window_exit:; \
\
exp_simul_done: \
while (sq--) EXP_SQR(a); \
\
exp_simul_done: \
while (sq--) EXP_SQR(a); \
- for (i = 1; i < vn; i++) \
+ for (i = 1; i < vn; i++)
\
EXP_DROP(v[i]); \
xfree(v); \
} while (0)
EXP_DROP(v[i]); \
xfree(v); \
} while (0)