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