Commit graph

161 commits

Author SHA1 Message Date
Henry de Valence
c73a0fd0d6 Remove AVX2 fixed-base code.
This was faster than the non-AVX2 code, but the serial code is already so fast that there's no reason not to use it.
2018-03-26 17:41:05 -07:00
Henry de Valence
0c4e7188a0 Pull out vartime double-base scalar mul code 2018-03-26 17:41:05 -07:00
Henry de Valence
2d99892eab Pull out variable-time straus implementation 2018-03-26 17:41:05 -07:00
Henry de Valence
2864a422bc Pull out constant-time straus implementation 2018-03-26 16:04:17 -07:00
Henry de Valence
ac739a3edd Split out constant-time variable-base scalar mul.
The serial (`u32`/`u64`) implementations use a multiple curve models, passing
between extended and projective coordinates when performing addition and
doubling (respectively). But the AVX2 backend doesn't, so in order to write a
single scalar mult implementation, we have to either abstract over the curve
models or have two implementations.

A generic solution is possible but extremely unreadable: the scalar mul
implementation would be parameterized over the point types used by the serial
implementations, with many where clauses describing how the types relate. The
AVX2 types could then be substituted in the appropriate places.

Instead we just duplicate the code into the `avx2` backend.
2018-03-26 16:01:51 -07:00
Henry de Valence
76a8d43a04 Create a new scalar_mul module hierarchy.
This should contain generic implementations of scalar multiplication algorithms
that can be used with multiple backends.  The goal is to move the existing
scalar multiplication code into this submodule, then call it from the
user-facing API.  This can also contain code for things we can't do now, like
multiscalar multiplication with precomputation.
2018-03-26 14:34:28 -07:00
Henry de Valence
d6b8389428 Use criterion.rs instead of libtest for benchmarks.
Since Criterion can only benchmark public API, these changes just drop
all internal benchmarks (e.g., benchmarks for field operations). But
those are usually microbenchmarks whose meaning is kind of questionable
anyways, so I don't think this is a big loss.

The `bench` feature disappears, since Criterion works on stable Rust.
2018-03-25 17:14:37 -07:00
Henry de Valence
c9239f54e9 Merge branch 'fix/warnings' into develop 2018-03-22 12:34:31 -07:00
Henry de Valence
f2e44898ee Suppress warnings about square() on UnpackedScalars 2018-03-22 12:17:23 -07:00
Henry de Valence
e73b635fe0 Remove unused constants 2018-03-22 12:17:23 -07:00
Henry de Valence
844da9712b Fix AVX2 docs formatting, remove obsolete AVX512 note 2018-03-22 12:13:39 -07:00
Henry de Valence
d67e895619 Merge branch 'feature/rename-to-multiscalar-mul' into develop 2018-03-22 12:08:49 -07:00
Henry de Valence
2e73b2bc20 Use scalar_mul instead of scalar_mult 2018-03-22 11:40:13 -07:00
Henry de Valence
70eee5208a Rename double_scalar_mult_basepoint to double_scalar_mul_basepoint for consistency 2018-03-22 11:39:47 -07:00
Henry de Valence
8de3d7576a Rename mult_by_pow_2 to mul_by_pow_2 for consistency 2018-03-22 11:35:42 -07:00
Henry de Valence
792ac0775e Change to the updated subtle API. 2018-03-22 11:13:26 -07:00
Henry de Valence
c20e09f6cc Rename multiscalar_mult->multiscalar_mul to match Mul traits 2018-03-19 14:28:21 -07:00
Henry de Valence
c5fcc6602d Fix build for AVX2 backend.
A missing import of the Borrow trait caused the build to break with the
"yolocrypto" feature enabled; this was't caught by CI because the CI machine
that Travis used didn't have AVX2, so the code was never built.

This commit adds the missing import and changes `std` to `core` so that the
AVX2 backend builds with no_std, but this isn't tested and is, actually,
"yolocrypto".
2018-03-19 11:15:52 -07:00
Henry de Valence
0f185d3e28 Generalize trait bounds on multiscalar multiplication.
This allows iterators returning either &Scalars or Scalars, so that it's
possible to use map() and friends to adjust scalars as they're being fed into
the multiscalar multiplication.
2018-02-20 18:31:23 -08:00
Isis Lovecruft
cd112afff5
Whitespace EOL fixes. 2018-01-31 02:19:53 +00:00
Henry de Valence
06994e8139 Tidy docs for public constants in backends 2018-01-29 12:38:58 -08:00
Henry de Valence
576e27982f Tweak module header names 2018-01-26 10:44:48 -08:00
Henry de Valence
3f7923b628 Keep the AVX2 point type named as ExtendedPoint. 2018-01-25 12:00:40 -08:00
Isis Lovecruft
4f37785f0e
Rename ExtendedPoint to EdwardsPoint. 2018-01-25 02:56:38 +00:00
Henry de Valence
86fd06db00 s/eps/epsilon/ for clarity 2018-01-24 12:42:57 -08:00
Henry de Valence
0e9b8e0a6e Refactor multiply implementation to eliminate reduce() call 2018-01-19 18:23:41 -08:00
Henry de Valence
ec50ec96f7 Use parallel carry-ins and carry-outs in FieldElement64::reduce() 2018-01-19 17:50:48 -08:00
Henry de Valence
d8d235fb48 Move pow2k into the backends and use it to implement square() 2018-01-19 17:50:48 -08:00
Henry de Valence
f816083575 Use >> instead of srl intrinsic 2018-01-03 14:04:27 -08:00
Henry de Valence
4cbff3983d Remove fixme notes 2018-01-03 14:01:48 -08:00
Henry de Valence
628af18a1d Suppress some warnings 2018-01-03 13:57:50 -08:00
Henry de Valence
3686562b2f Clear memory from avx2 multiscalar mult 2018-01-03 13:37:12 -08:00
Henry de Valence
d41dbb1fe4 Replace some binary constants with named constants 2018-01-03 12:34:25 -08:00
Henry de Valence
dd80421094 Move field constants to constants module 2018-01-03 12:13:52 -08:00
Henry de Valence
ce68b8d72b Document bounds yoga in doubling 2017-12-18 14:48:44 -08:00
Henry de Valence
af3c2b2821 Document readdition 2017-12-18 13:58:37 -08:00
Henry de Valence
c0f64009a7 Implement readdition using a CachedPoint type 2017-12-18 11:42:53 -08:00
Henry de Valence
80813e81b1 make diff_sum maskable 2017-12-15 15:24:13 -08:00
Henry de Valence
caf296a546 Try to make target_feature work on stable 2017-12-15 13:57:01 -08:00
Henry de Valence
70f710eafe Use the LookupTable struct in AVX2 code 2017-12-15 13:57:01 -08:00
Henry de Valence
640888198e Eliminate a carry pass through tighter bounds checks 2017-12-14 14:17:34 -08:00
Henry de Valence
d62fc7caf1 Rearrange signs to avoid a subtraction 2017-12-07 10:55:33 -08:00
Henry de Valence
2c29d9a2ad tweak docs 2017-12-04 10:37:37 -08:00
Henry de Valence
3814beeafe Fix typo and add note on AVX512VL 2017-12-04 10:37:37 -08:00
Henry de Valence
bf5e3581d2 Update AVX2 docs 2017-12-04 10:37:37 -08:00
Henry de Valence
1103c5c43a Implement Sub by pre-negating the point 2017-12-04 10:37:37 -08:00
Henry de Valence
e3579995c0 Add double-base scalar vartime for AVX2 2017-12-04 10:37:37 -08:00
Henry de Valence
9213dc0bbb Implement point subtraction 2017-12-04 10:37:37 -08:00
Henry de Valence
3094866442 Fix up after Scalar API changes 2017-12-04 10:37:37 -08:00
Henry de Valence
ba071f12aa Write up notes on the AVX2 backend 2017-12-04 10:37:37 -08:00
Henry de Valence
3d435a1f4f Fix up tests to use new Scalar API 2017-12-04 10:37:37 -08:00
Henry de Valence
b5305b4e30 Connect multiscalar_mult to the AVX2 backend 2017-12-04 10:37:37 -08:00
Henry de Valence
912fc5d412 Never build avx2 without avx2 2017-12-04 10:37:37 -08:00
Henry de Valence
77766b3422 Add benchmark for conversion to avx2 format 2017-12-04 10:37:37 -08:00
Henry de Valence
208180dc72 Simplify mul, square implementations 2017-12-04 10:37:37 -08:00
Henry de Valence
f28635ab4e Add a new 'avx2_backend' yolocrypto feature 2017-12-04 10:37:37 -08:00
Henry de Valence
81ecef89ee Connect AVX2 and u64 backends 2017-12-04 10:37:37 -08:00
Henry de Valence
ed24d1c5fa Move AVX2 code into a backend 2017-12-04 10:37:37 -08:00
Isis Lovecruft
c71d41ddcc
Whitespace fixes. 2017-12-04 01:17:17 +00:00
Henry de Valence
c0633ae2d7 KaTeXify some backend documentation 2017-12-01 11:46:36 -08:00
Henry de Valence
e196f8347c Move 32/64-bit code into submodules in a backend module.
See the doc comment in `backend/mod.rs` for motivation on naming.
2017-11-16 16:07:55 -08:00