Commit graph

141 commits

Author SHA1 Message Date
Michael Rosenberg
5758b8cce1
Updated to edition 2021 (#413) 2022-10-18 13:45:59 -04:00
Isis Lovecruft
9f80197f05
Merge branch 'develop' into release/4.0 2021-08-04 01:09:38 +00:00
Isis Lovecruft
52986bc3ec
Revert "Update copyright years."
This reverts commit 1491f0db36.

This is due to code which was erroneously deleted during the commit,
due to being based off the wrong version, see
https://github.com/dalek-cryptography/curve25519-dalek/pull/361.
2021-08-03 23:10:35 +00:00
Isis Lovecruft
9b36bcfc5f
Revert "Maintain legacy 3.x support for lookup tables."
This reverts commit 0da8f08d65.
2021-04-14 02:30:22 +00:00
Isis Lovecruft
0da8f08d65
Maintain legacy 3.x support for lookup tables. 2021-04-13 22:23:34 +00:00
Isis Lovecruft
cc0c444fae
Merge branch 'feature/dynamic-table-sizes' into develop 2021-03-25 04:34:08 +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
Isis Lovecruft
ab468cd24c
Fix copyright years in some of the files I touched. 2021-03-25 02:29:37 +00:00
Isis Lovecruft
4a1fc3c66e
Implement Zeroize for points as the identity element. 2021-03-25 01:45:54 +00:00
Chris Beck
0154ebbfaf implement Zeroize trait on Ristretto curve point types
This is helpful for hardening some of our cryptographic implementations
that use Ristretto curve points
2021-02-10 12:14:32 -07:00
François Garillot
e2651cceb6
Rename elligator_map -> elligator_encode
leaves an obvious name open for the reverse mapping
2021-01-12 13:46:04 -08: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
isis agora lovecruft
5038fcf50a
Merge pull request #308 from isislovecruft/fix/pippenger-typo
Fix typo of Pippenger's name.
2020-07-01 01:14:10 +00:00
Rui Morais
6a8e466063 add derive Hash to Scalar, MontgomeryPoint and CompressedEdwardsY 2020-02-25 22:39:19 +00:00
Isis Lovecruft
e82910d215
Add test for basepoint table multiplication by unreduced scalar. 2020-01-07 08:06:27 +00:00
Isis Lovecruft
c01bd780dc
Implement radix-32 precomputed scalar multiplication tables. 2019-12-31 02:26:03 +00:00
Isis Lovecruft
cfbcb6ca61
Implement conversions between basepoint table sizes.
This is useful for programs/protocol which can do some heuristics or
learning-based approach towards optimising the table size based on the number of
uses of e.g. a public key, the second basepoint in a Pedersen commitment, etc.,
i.e. the first time a public key is used to verify a signature, the usual
variable-time basepoint multiscalar multiplication is used, however after 1000
verifications, the table size is upgraded, and again after 10000 verifications,
etc.
2019-12-31 02:26:03 +00:00
Isis Lovecruft
8a9e09ba34
Implement larger sizes of basepoint tables.
This implements a macro for implementing the BasepointTable trait, and
uses the macro to create basepoint table types. The default table
still uses radix-16 representation and is ~30KB in size.  The new
table types, and their memory usage and additions required per
basepoint multiplication are:

 * `EdwardsBasepointTableRadix64`: ~120KB, 43 additions
 * `EdwardsBasepointTableRadix128`: ~240KB, 37 additions
 * `EdwardsBasepointTableRadix256`: ~480KB, 32 additions
2019-12-31 02:26:03 +00:00
Henry de Valence
6a44f31702 Revert "Merge pull request #296 from isislovecruft/feature/compressed-try-from"
This reverts commit 46f56f91ee, reversing
changes made to a9b1d50c5a.

These changes are not semver-compatible with the 2.0.0 release.
2019-12-10 14:16:24 -08:00
Isis Lovecruft
7e2aed3943
Fix typo of Pippenger's name. 2019-12-10 20:33:53 +00:00
Isis Lovecruft
9ae2e3b482
Change all from_slice() constructors to return Option<T>s.
We due this in lieu of implementing `TryFrom` to allow for API
consumers to use the `?` operator to convert potential `None`s into
their own `Result<T, CustomError>` types for better error handling
with less boilerplate.

Note that this is a breaking API change.
2019-10-28 17:29:15 +00:00
Isis Lovecruft
1d8b3995c9
Add custom error types, currently only used in TryFrom impls. 2019-10-28 17:28:40 +00:00
Isis Lovecruft
db3d26f4b9
Fix typo in TryFrom docstring. 2019-10-28 17:26:23 +00:00
Isis Lovecruft
a7f317a2b8
Impl TryFrom<&[u8]> for all compressed point types.
This reduces copy-pasta in downstream users to check the length of the
slice beforehand.
2019-10-28 17:26:23 +00:00
Henry de Valence
0fc534d989 Use "tuples" instead of "bytes" in the Serde datamodel.
This is a breaking change to the serialization format.  It fixes it so that the
Serde encoding can match the conventional encoding of each type of object, and
so that Serde can be used with no overhead -- when using serde-bincode, the
Serde encoding now matches the manual encoding.
2019-10-23 15:40:50 -07:00
Henry de Valence
29ce0d4fe9 Add length checks to serde-bincode tests.
This ensures that the serde Serialize and Deserialize implementations use
fixed-length Serde tuples, rather than variable-length byte arrays.  This flaw
in data modeling was pointed out by Trevor Perrin.
2019-10-23 15:28:48 -07:00
Henry de Valence
620d17ef40
Merge pull request #293 from dalek-cryptography/remove-build-rs
Remove build.rs constants generation.
2019-10-23 14:44:46 -07:00
Henry de Valence
574217694e Remove build.rs.
This was more useful at the time when we were determining, e.g., optimal lookup
table sizes and could regenerate them more easily, but it came at a massive
complexity cost.  It also meant that we were unable to implement backend
autoselection.  This commit removes the `build.rs` entirely.  In the future, a
different `build.rs` could be added that auto-selects a backend, but it seems
like the current default-u64 setup has been working fine.
2019-10-23 14:20:38 -07:00
Isis Lovecruft
7c5ba69491
Update copyright year. 2019-10-23 19:43:56 +00:00
François Garillot
9785f56c0f
Rust fixes for some clippy warnings
Clippy lints with instances in the project but NOT applied here, since they seem consistently at odds with the projects' style:
- [unreadable literal](https://rust-lang.github.io/rust-clippy/master/#unreadable_literal)
- [cast lossless](https://rust-lang.github.io/rust-clippy/master/#cast_lossless)
- [assign op pattern](https://rust-lang.github.io/rust-clippy/master/#assign_op_pattern)
2019-10-05 12:02:08 -07:00
Henry de Valence
b01888a929
Merge pull request #260 from fabric-and-ink/ed-decompress-simplify
Remove unneeded check for negativity in edwards point decompression
2019-08-07 12:57:24 -07:00
Fabian Drinck
26ae185bc9
Apply suggestion by @hdevalence
Co-Authored-By: Henry de Valence <hdevalence@hdevalence.ca>
2019-08-07 19:43:10 +02:00
root
ccaf86ea86 curve_models link in comment mismatch 2019-08-06 16:40:47 +08:00
Fabian Drinck
53da2aaaf4 Remove unneeded check for negativity in edwards point decompression
The function `FieldElement::sqrt_ratio_i` always returns a positive root
by definition. Therefore the test for negativity in the edwards point
decompression function always returns false and we only need to flip its
sign if `compressed_sign_bit` is set.
2019-06-07 21:04:12 +02:00
Henry de Valence
389d2bc9e2 Ensure Pippenger works on manually-constructed extremal values.
When using Scalar::from_bits to manually create unreduced Scalars (e.g.,
X/Ed25519 keys with specified bit patterns), it's possible to construct Scalar
values that range up to 2^255-1.  These shouldn't ever end up in a vartime
multiscalar mul call anyways, because it doesn't handle secret data, but it is
technically allowed by the type system and should be handled.  When w=8, these
can generate terminal carries that can't be folded into the last digit, but
this can be handled by folding them into an extra digit instead.
2019-06-05 23:03:07 -07:00
Henry de Valence
6fe93564cd Add a more comprehensive random multiscalar test.
This exercises the constant- and variable- time code at large sizes, to hit
every path of Straus/Pippenger.
2019-06-05 20:54:00 -07:00
Oleg Andreev
df745e98a2 oops - forgot to switch on pippenger 2019-05-21 14:10:56 -07:00
Henry de Valence
23ca520ac2
Merge pull request #226 from ebfull/faster-equality
Check the equality of `EdwardsPoint`s in the projective coordinates
2019-05-21 08:50:32 -07:00
Henry de Valence
a1123e7cd3
Merge pull request #230 from hdevalence/updated-precomputation
Multiscalar multiplication with precomputation.
2019-02-14 12:18:29 -08:00
Henry de Valence
092ff52cb0 Remove constant-time multiscalar precomputation.
This doesn't (yet) give any speedup over the non-precomputed multiscalar
multiplication, and it's not clear that it's a good idea to commit to
supporting it in the future.  Removing it means that it's not committed-to as
part of the public API, but the source is still there in the tree if we want to
revisit it later.
2019-02-13 12:26:31 -08:00
Henry de Valence
96df60895f Fix comment on Montgomery conversion.
Closes #213.
2019-02-12 19:30:18 -08:00
Henry de Valence
27daa5215e Add Ristretto precomputation facade. 2019-02-12 12:52:02 -08:00
Henry de Valence
727ba86292 Rework the vartime precomputation trait to be Option-al 2019-02-12 12:52:02 -08:00
Henry de Valence
c6acdfd5e2 Add serial implementation of precomputation. 2019-02-12 12:52:02 -08:00
Sean Bowe
d71b6650d6
Check the equality of EdwardsPoints in the projective coordinates to avoid expensive compressions. 2019-02-06 17:45:25 -07:00
Henry de Valence
ff0dc4a3db Merge branch 'master' into develop 2019-01-27 23:19:44 -08:00
Henry de Valence
5ddc30061c Implement ConstantTimeEq on compressed points. 2019-01-27 23:13:58 -08:00
Henry de Valence
47a164da4d Replace avx2_backend with simd_backend (autoselects AVX2/IFMA) 2019-01-18 01:52:17 -08:00
Henry de Valence
f1d2b5182b Restructure source tree into serial and vector backends.
This begins to attempt to restructure the source tree so that the common parts
are common and the different parts are different.

The backend is now split into two parts:
- serial (containing the implementation using serial formulas and mixed-model arithmetic).
- vector (containing the implementation using parallel formulas and single-model arithmetic).

The serial scalar_mul tree is now under backend::serial::scalar_mul.
The avx2 scalar_mul tree is now under backend::avx2::scalar_mul.
2019-01-18 01:49:40 -08:00