Commit graph

227 commits

Author SHA1 Message Date
Jan Bujak
219995dbc9
rustfmt src/backend/vector/scalar_mul (no changes besides formatting) 2023-04-11 20:13:31 +09:00
Jan Bujak
0db8783be8
Runtime backend autodetection 2023-04-11 20:13:20 +09:00
Jan Bujak
91e839aae5
Add extra #[inline]; this speeds up the avx2 backend slightly 2023-04-11 20:09:21 +09:00
Koute
4583c472f5
Support SIMD on Rust stable (#520)
* Remove dependency on `packed_simd`

* Support SIMD on stable Rust

* Move `packed_simd.rs` to `vector` module

* Add comment header to `packed_simd.rs`

* Initialize SIMD registers using intrinsics instead of `transmute`

* Use a splat inside of `unpack_pair`

* Update README: the AVX2 backend now works on stable Rust

* Add a CI job to also build the AVX2 SIMD backend on Rust stable

* Added SIMD MSRV test
2023-03-30 02:16:18 -04:00
Michael Rosenberg
f460ae149b
Make scalars always reduced (#519)
* Removed Scalar::{from_bits, from_bytes_clamped}; all constructible scalars are now reduced mod l

* Made Scalar::reduce() not pub; fixed test warning

* Added benches for scalar add/sub/mul

* Docs

* Added EdwardsPoint::mul_base_clamped and gated Scalar::from_bits behind legacy_compatibility

* Added unit test for Mul impl on unreduced Scalars

* Added Montgomery::mul_base_clamped

* Added BasepointTable::mul_base_clamped

* Removed invalid scalar arithmetic test; this functionality is no longer supported

* Made clamp_integer() const

* Updated readme and changelog

* Added BasepointTable::mul_base_clamped to tests

* Added proper deprecation notice to Scalar::from_bits; added legacy_compatibility to Makefile and docsrs flags
2023-03-28 18:12:24 -04:00
Michael Rosenberg
3b71630d9f
Fix docsrs build (#505)
* Add docsrs build to CI

* Put cfg flags in both RUSTFLAGS and RUSTDOCFLAGS
2023-02-02 04:06:14 -05:00
Michael Rosenberg
3effd73307
Feature-gated more precomputed tables (#500)
Feature-gates `AFFINE_ODD_MULTIPLES_OF_BASEPOINT`

Feature-gated tables out of vector vartime aA + bB procedure
2023-01-20 10:55:32 -07:00
Tony Arcieri
8d1bc31805
Rename basepoint-tables to precomputed-tables (#499)
This is the name we adopted for a similar feature in @RustCrypto.

It's a bit less jargony and also leaves the door open in the future to
other types of precomputed tables.
2023-01-19 14:04:22 -05:00
Tony Arcieri
83f6b149d3
Add basepoint-tables crate feature (#489)
* Add `basepoint-tables` crate feature

Feature-gates the inclusion of basepoint tables under a
`basepoint-tables` feature, with the goal of reducing code size for e.g.
embedded applications.

* Add `mul_base` method to `EdwardsPoint` and `RistrettoPoint`

Provides fixed-base scalar multiplication which optionally uses
precomputed basepoint tables when the `basepoint-tables` feature is
enabled, providing 4X better performance.

Falls back on variable-base scalar multiplication in the event the
feature is disabled.

Co-authored-by: Michael Rosenberg <michael@mrosenberg.pub>
2023-01-08 03:51:51 -05:00
Tony Arcieri
6a51f4fa40
Make basepoint table constants &'static references (#488)
* Make basepoint table constants static references

This ensures they have a fixed address and aren't duplicated across
compilation units.

Since they were already always borrowed, this changes the static values
to be `&'static` addresses to ensure they're always borrowed rather than
potentially copied.

* rustfmt
2022-12-28 03:24:46 -05:00
Tony Arcieri
7d53206366
Weakly activate zeroize?/alloc; MSRV 1.60 (#485)
Previously `alloc` implicitly activated `zeroize` via `zeroize/alloc`.

This commit switches to weak feature activation as added in Rust 1.60,
only activating `zeroize/alloc` if the `zeroize` dependency is
explicitly activated (which it is by default).
2022-12-27 05:12:55 -05:00
Tony Arcieri
39dbaea6f9
Make zeroize an optional dependency (#481)
* Make `zeroize` an optional dependency

The `zeroize` crate provides a defense against memory read oracles which
typically arise from memory unsafety.

Pure Rust programs may not benefit from `zeroize`, and in certain cases
the unsafe code used by `zeroize` may be more concerning.

This commit makes `zeroize` into an optional feature so users may elect
to disable it if they so desire.

* Added zeroize feature flag to README

Co-authored-by: Michael Rosenberg <michael@mrosenberg.pub>
2022-12-26 16:19:55 -05:00
Michael Rosenberg
1cedb3727e
Fixed docs build (#475)
Also sets code font size in docs back to normal (no longer small)
2022-12-13 02:29:45 -05:00
Tony Arcieri
6f237a0810
Use inherent constants for ZERO, ONE, and MINUS_ONE (#470)
For the field element types `FieldElement` and `Scalar`, use inherent
constants instead of (non-const) functions to return these constant
values.

It's likely the original functions predate support for inherent
constants, but now that they're available, they're a better fit for
these sort of constant values.
2022-12-12 01:04:42 -05:00
Tony Arcieri
cc304c29ff
Use --cfg curve25519_dalek_backend to select backend (#455)
Crate features are intended to be additive, whereas only 1-of-N possible
backends can be selected.

Features can also be activated by transitive dependencies, which leads
to a problem of different dependences selecting conflicting backends.
Using `--cfg` instead moves all backend selection control to the
toplevel executable.

This commit switches to the following RUSTFLAGS to enable backends:

- `--cfg curve25519_dalek_backend="fiat"`: uses `fiat-crypto`
- `--cfg curve25519_dalek_backend="simd"`: uses nightly-only SIMD
2022-12-09 03:42:52 -05:00
Tony Arcieri
1013560fe4
Remove std feature (#459)
All of the existing usages of `std` can be replaced with `alloc`.

They are legacy usages from before when liballoc was stabilized.
2022-12-08 15:05:59 -05:00
pinkforest(she/her)
2190332b67
Add target u32/u64 backend override (#454)
As suggested in #453 it is sometimes feasible to
select the backend bits via an override.

This change provides `cfg(curve25519_dalek_bits)`
to override the bits used in serial or fiat target backend.
2022-12-08 11:52:42 -05:00
pinkforest(she/her)
e01bb1bdc6
Fix all clippy warnings replay (#441)
Also fixes CI not running on all branches

Co-authored-by: Anthony Ramine <nox@nox.paris>
2022-12-04 03:40:51 -05:00
Michael Rosenberg
01672bfc63
Applied @pinkforest's patch to make make doc build on non-x86_64 arches 2022-11-26 13:53:51 -05:00
Michael Rosenberg
791ba170b1 Cleanup: enabled doc_auto_cfg and doc_cfg_hide 2022-11-26 06:34:48 -05:00
pinkforest
289cc52fef Document backend mod as INTERNALS: 2022-11-26 22:20:18 +11:00
Michael Rosenberg
a35ca1e9cf Added cfg_attr everywhere possible, and simplified cfg over std/alloc 2022-11-26 05:53:28 -05:00
pinkforest
ad7c755f49 Documentation migrate to docs.rs hosted
This change migrates all the documentation from dalek.rs
to docs.rs hosted and fixed the backend documentation
generation that was broken.
2022-11-26 11:26:25 +11:00
Michael Rosenberg
969940e954
Wibble 2022-11-24 02:37:07 -05:00
Michael Rosenberg
a743ea5348
Fixed doc warnings 2022-11-24 02:37:05 -05:00
Tony Arcieri
f88cf6836b
Use include_str! for .md inclusion in rustdoc (#434)
Previously a now-removed nightly-only feature was used, but now that
it's stable, `include_str!` can be used for all of these cases.
2022-11-14 00:22:50 -05:00
Tony Arcieri
081f632d91
Implement simplified backend selection (#428)
As proposed in #414, this commit changes the backend selection approach,
introspecting `target_pointer_width` to select `u32_backend` vs
`u64_backend` (or `fiat_u32_backend`/`fiat_u64_backend` if the
`fiat_backend` feature is enabled).

This helps eliminate the use of non-additive features, and also the
rather confusing errors that happen if multiple backends are selected
(i.e. thousands of lines of rustc errors).

The selection logic checks if `target_pointer_width = "64"` and uses the
64-bit backend, or falls back to the 32-bit backend otherwise. This
means the crate will always have a valid backend regardless of the
pointer width, although there may be odd edge cases for exotic platforms
which would optimally use the 64-bit backend but have a non-"64" target
pointer width for whatever reason. We can handle those cases as they
come up.
2022-11-13 12:17:42 -05:00
Michael Rosenberg
d2bf310330
cargo fmt 2022-10-28 17:00:24 -04:00
Michael Rosenberg
a959787c2e
Added more #[rusfmt::skip] 2022-10-28 16:58:40 -04:00
Michael Rosenberg
95b368a431
Whitespace formatting fixes on the [rustfmt::skip] functions 2022-10-28 16:32:45 -04:00
Michael Rosenberg
6d906bb70c
Added #[rustfmt::skip] where necessary 2022-10-28 13:51:20 -04:00
Michael Rosenberg
a32f56ba36
Undid the bad reformatting job from 5758b8c 2022-10-28 13:22:49 -04:00
Michael Rosenberg
8fa201639a
Fix AVX2 and AVX-512 builds (#419)
Build was broken by 5758b8c.
This adds a regression test to CI so it doesn't happen again
2022-10-28 13:10:44 -04:00
Michael Rosenberg
5758b8cce1
Updated to edition 2021 (#413) 2022-10-18 13:45:59 -04:00
Isis Lovecruft
b9710d59f2
Minor documentation fixes. 2021-08-03 22:49:09 +00:00
isis agora lovecruft
5eca140010
Merge pull request #351 from isislovecruft/fix/cleanup-elligator
Trivial cleanups to Elligator2 encoding
2021-04-13 23:31:14 +00:00
isis agora lovecruft
cecc821f40
Merge pull request #342 from huitseeker/fiat4_with_u32
Serial backends w/formally-verified field arithmetic for 32 & 64 bits
2021-04-13 23:23:41 +00:00
Isis Lovecruft
ee90202a58
Trivial cleanups to Elligator2 encoding.
cf. https://github.com/dalek-cryptography/curve25519-dalek/pull/336
2021-04-13 00:24:50 +00:00
Isis Lovecruft
1491f0db36
Update copyright years. 2021-03-25 04:10:55 +00:00
isis agora lovecruft
b79a276806
Merge pull request #336 from huitseeker/elligator2
Elligator2 mapping for curve25519
2021-03-25 03:13:41 +00:00
zgfzgf
08bf6ebf08 fix build warning 2021-02-03 17:46:01 +08:00
François Garillot
abd1922456
Add a fiat_u32 backend based on fiat-crypto as well.
Renames fiat backend directory to fiat_u64 and does the additional plumbing required to make fiat_{u32, u64}_backend equal alternatives.
Adds a few comments.
2021-01-11 15:45:24 -08:00
François Garillot
a9e50eab36
implement conditional assign with fiat__25519_cmovznz_u64 2021-01-11 09:30:30 -08:00
François Garillot
4ce680d3aa
Update the fiat backend to use the fiat-crypto package
https://crates.io/crates/fiat-crypto
2021-01-11 09:30:30 -08:00
François Garillot
d684e13f09
Add a fiat_u64_backend option to curve25519-dalek
This uses https://github.com/calibra/rust-curve25519-fiat/ to implement a new 64bit serial backend for dalek.

Co-authored-by: Zoe Parakevopoulou <zoopar@fb.com>
2021-01-11 09:30:07 -08:00
Isis Lovecruft
77ec974212
Whitespace fixes for 3267a5d merge. 2021-01-08 00:33:37 +00:00
Isis Lovecruft
3267a5d75d
Merge remote-tracking branch '3for/comment-fix' into develop 2021-01-08 00:27:34 +00:00
François Garillot
8aa1458941
Implements an Elligator2 map for Curve25519
This implementation:
- is agnostic on the hash used to pick a field element, even though SHA512 is commonly used,
- follows https://tools.ietf.org/id/draft-irtf-cfrg-hash-to-curve-10.html closely
- tests the outputs of the function using libsignal's implementation.
2020-10-21 17:38:22 -04:00
Stephane Raux
608f8cd594 Make crate feature alloc work with stable Rust
`println!` was removed in the test as the corresponding test for `u32` does not have it.
2020-10-20 18:15:00 -07:00
Isis Lovecruft
4423394ed8
Fix warning that a temporary value isn't used. 2019-10-28 19:12:00 +00:00