1749 Commits

Author SHA1 Message Date
Brian Smith
2ad2fcb912 rsa: Use dynamic checks for widening conversions.
Remove `SmallerModulus` and instead do the check dynamically. This
eliminates the last `unsafe impl` regarding the modulus
relationships. The uses of `elem_widen` won't ever fail but since
they are in an already-fallible function they wo't hurt.
2023-11-24 17:39:13 -08:00
Brian Smith
1855573098 rsa: Replace use of SmallerModulus with dynamic checks.
The dynamic checks should never fail but since they are added in
already-fallible functions they won't cause any trouble. This
facilitates future changes where the dynmic checks are required.
2023-11-24 17:39:13 -08:00
Brian Smith
3145a7928a RSA: Precompute R**3 and store it instead of R**2.
This saves two private-modulus-length multiplications per RSA
private key operation at the cost of two private-modulus-length
squarings per `RsaKeyPair` construction.
2023-11-22 19:16:40 -08:00
Brian Smith
9b8d4d7b14 rsa: Split PrivatePrime construction.
Split the checking of the private modulus from the checking of the
private exponent so that we can do things in the order recommended
in the NIST spec.

This also facilitates storing R**3 instead of R**2 in the
`RsaKeyPair`. (We need R**2 during `RsaKeyPair` construction, but
R**3 afterwards.)
2023-11-22 19:16:40 -08:00
Brian Smith
ca043567e6 bigint: Stop implementing Debug for OwnedModulus.
This was necessary at some point in the past, but no longer is. It is
better to avoid depending on any of the `core::fmt` machinery in these
lower layers if we can avoid it.
2023-11-22 19:15:58 -08:00
Brian Smith
6de27244ff bigint: NFC: Take oneRR out of OwnedModulus.
`PublicModulus` and `PrivatePrime` are basically duplicates of
`OwnedModulusWithOne`. In the future we would like to create an
`OwnedModulus` that doesn't need 1RR to be calculated. Also in the
future we'd like to be able to "take" 1RR from a public modulus.
This change is a step towards those ends.
2023-11-22 18:07:16 -08:00
Brian Smith
986fe1f5ff rsa: NFC: Eliminate unnecessary Nonnegative -> Modulus conversion.
After 5ed0a45c65074a0640e6f9e21512a8c4d9540f1e we no longer needs `p`
or `q` in `Nonnegative` form.
2023-11-22 15:32:41 -08:00
Brian Smith
bc00f7e58c ec: NFC: Refactor scalar_sum to eliminate LIMBS_add_mod use.
Use the pattern we typically use where one argument is passed by value.

This lets us use `limbs_add_assign_mod`, eliminating the `unsafe`
direct use of `LIMBS_add_mod`. This will make future refactoring easier.

This also eliminates the need to construct and zeroize a new scalar `r`
for the result.
2023-11-22 14:38:39 -08:00
Brian Smith
3afbcc5dc5 Refactor away parse_big_endian_in_range_partially_reduced_and_pad_consttime.
It only had one caller and it contained unreached code.
2023-11-22 12:58:26 -08:00
Brian Smith
57fc4860d0 Remove ArrayEncoding usage from Digest and delete ArrayEncoding.
Note: I originally tried an alternative implementation using `flat_map` that
ended up being materially slower. To fix that performance regression I had to
make the following change:

```
     let mut output = Output([0; MAX_OUTPUT_LEN]);
     output
         .0
-        .iter_mut()
-        .zip(input.iter().copied().flat_map(|Wrapping(w)| f(w)))
+        .chunks_mut(N)
+        .zip(input.iter().copied().map(|Wrapping(w)| f(w)))
         .for_each(|(o, i)| {
-            *o = i;
+            o.copy_from_slice(&i);
         });
     output
 }
```

I verified that this generates the same assembly code as the original code
on x86-64 using Rust 1.74.0, except that there are two additional 128-bit
moves in `sha256_formta_output` to zero out the latter half of `Output`,
which was intended.
2023-11-22 09:35:47 -08:00
Brian Smith
ff0ed4ca9d Digest: Remove repr(c) from Output union. 2023-11-22 09:35:47 -08:00
Brian Smith
4f825b77eb bigint: Use a better Montgomery RR doubling-vs-squaring trade-off.
Clarify how the math works, and use a slightly better trade-off of
doubling vs squaring. On 64-bit targets RSA verification is now
less than 10% faster. On 32-bit targets its over 20% faster. I
expect that we can improve the performance further by optimizing
the doubling implementation.

Also the new implementation avoids allocating/cloning any temporary
`Elem`s, unlike the previous implementation.
2023-11-20 19:05:51 -08:00
Brian Smith
25112e9546 bigint: Calculate 1*R mod m without multiplication by 1*RR.
Save two private-modulus Montgomery multiplications per RSA exponentiation
at the cost of approximately two modulus-wide XORs.

The new new `oneR()` is extracted from the Montgomery RR setup.

Remove the use of `One<RR>` in `elem_exp_consttime`.
2023-11-15 19:55:14 -08:00
Brian Smith
81e17e4b10 bigint: Save one modular doubling in Montgomery RR setup.
Eliminate one modular doubling in Montgomery RR setup. This saves one
public modulus modular doubling per RSA signature verification, at the
cost of approximately one public-modulus-wide XOR. RsaKeyPair also sees
similar savings per Modulus.
2023-11-15 19:55:14 -08:00
Brian Smith
0349d2a332 bigint: NFC: Write "doubling" instead of "shift" or "mul_by_2".
Rename `elem_mul_by_2` to `elem_double`.

Use the term "doubling" instead of "shift."
2023-11-15 19:55:14 -08:00
Brian Smith
af28001bf3 NFC: Use the correct variable name m instead of n in comments. 2023-11-15 19:55:14 -08:00
Jonah Petri
445de2fb9c getauxval isn't defined on uclibc, so disable dynamic feature detection 2023-11-14 14:08:24 -08:00
Jorge Aparicio
7fa58cc7f7 rename feature
and have it apply only when `target_os = "none"`
2023-11-14 13:22:44 -08:00
Jorge Aparicio
9195b4a33f add an opt-in less-safe-getrandom-custom feature
This Cargo feature treats a user-provided `getrandom` implementation as
a secure random number generator (`SecureRandom`). The feature only has
effect on targets not supported by `getrandom`.

I agree to license my contributions to each file under the terms given
at the top of each file I changed.
2023-11-14 13:22:44 -08:00
Brian Smith
75cbe475ff NFC: Address a Clippy lint in limbs_mul.
This isn't caught by `mk/clippy.sh` usually since this code isn't used
for x86-64 targets yet.
2023-11-11 10:08:23 -08:00
Brian Smith
61d1da61ea NFC bigint: Implement Copy for N0. 2023-11-11 10:08:23 -08:00
Brian Smith
cfa3737947 RSA: Support RSA key pairs where q < p without converting to p > q.
Previously we swapped p and q and calcualted a new qInv if p < q so
that we could avoid doing a redunction during the CRT computation.
Instead, just do the reduction during CRT as it's cheap. This
notably reduces the number of operations we need in `bigint`, and
it eliminates the need for the `Prime` modulus marker type.

Now there are more things that can go wrong during CRT. First, we
may wrongly forget to reduce m_2 mod p; before this wasn't necessary
since every element of q was an element of p. Next, we may wrongly
use the the value of m_2 mod p instead of m_2 later; before we could
do this since previously m_2 mod p == m_2 since m_2 < q < p. Add
tests for these cases.

Rewrite the tests for `elem_reduced_once` given its new constraints.
2023-11-10 17:10:07 -08:00
Brian Smith
23975ff236 RSA: Remove q_mod_n from RsaKeyPair.
Reduce the size of RsaKeyPair by about 15%.

Importantly, this was the only non-temporary (`'static`) `Elem`
other than `One`.
2023-11-10 09:17:50 -08:00
Brian Smith
946ce877d2 RSA: Remove QQ from RsaKeyPair.
QQ comprised almost 25% of the bulk of RsaKeyPair and is actually
completely unnecessary since `elem_reduced` can do the whole
reduction itself.

This has the nice and important side effect of eliminating some
conversion operations between `bigint` types.

This is also a step towards eliminating some of the `unsafe trait`
stuff that kinda-but-not-really modeled modulus relationships.
2023-11-09 14:31:31 -08:00
Brian Smith
cbcac26d00 bigint: Add modulus bit length to Modulus. 2023-11-07 16:59:10 -08:00
Brian Smith
5ed0a45c65 RSA: Rearrange private prime validity checks.
Move all the checks that are done for each private prime into
the `PrivatePrime` constructor, to eliminate duplication.

This causes the 512-bit-ness check to be done earlier than before,
which affects some of the tests..
2023-11-07 16:59:10 -08:00
Brian Smith
2f01ebfe32 bigint: Store bit length of modulus in OwnedModulusWithOne. 2023-11-07 16:59:10 -08:00
Brian Smith
d8e9a9172c RSA: Eliminate a redundant clone.
Commit be27e8e25946b2e975258cfb1ea21f6cc4731d8c made this clone
unnecessary.
2023-11-06 22:23:10 -08:00
Brian Smith
e51c88a986 Rename PartialModulus to Modulus, Modulus to OwnedModulusWithOne.
Originally we only had `Modulus`. Then we had a need for a
temporary `Modulus` without `oneRR` so we created `PartialModulus`.
However, there is really nothing "partial" about them. So, improve
the naming by renaming `PartialModulus` to `Modulus` and `Modulus`
to `OwnedModulusWithOne`. In the future we may refactor things
further to separate the ownership aspect from the "has oneRR"
aspect.

Instead of just doing a straightforward rename, take this
opportunity to refactor the code so that it uses the new `Modulus`
whenever `oneRR()` isn't used. This eliminates the duplication of
the APIs of the two modulus types, and the duplication of
`elem_mul` and `elem_mul_`.
2023-11-06 12:52:27 -08:00
Brian Smith
69d1dd34e6 NFC RsaKeyPair: Add notes about wastefulness of qq and q_mod_n. 2023-11-06 12:52:27 -08:00
Brian Smith
1659f14295 bigint elem_exp_consttime: Make implementations more consistent.
Use the same argument order, naming, etc. as the x86-64 version.
2023-11-04 10:21:59 -07:00
Brian Smith
3044ee705d bigint elem_exp_consttime: Avoid one slice copy.
Take a step towards aligning the two implementations.
2023-11-04 10:21:59 -07:00
Brian Smith
4658c27d52 NFC bigint: Remove Width.
The original idea of `Width` was that we'd support operatings that
worked on multiple same-width but different-modulus values, and/or
we'd support splitting a 2N-limb `BoxedLimb` into two N-limb
`&[Limb]`, etc. However, as things are now, `Width` doesn't really
serve a useful purpose.
2023-11-04 10:21:10 -07:00
Brian Smith
8ed48604d0 RSA signature verification: Avoid wasteful key re-serialization.
When we added `rsa::PublicKey` we changed the `ring::signature` RSA
implementation to construct an `rsa::PublicKey` and then verify the
signature using it. Unfortunately for backward compatibility with old
uses of `RsaKeyPair`, `rsa::PublicKey` constructor constructs (and
allocates) a copy of the ASN.1-serialized public key. This is not
acceptable for users who are using `ring::signature` to verify a
single signature. Refactor `PublicKey` so that it can be bypassed
by the `ring::signature` implementation.

This is a step towards implementing allocation-free RSA signature
verification.
2023-11-02 17:26:13 -07:00
Brian Smith
6920c4fc40 Digest/Polyfill: Remove SHA-1 use of ChunksFixed and delete it.
This is the last step in the removal of `ChunksFixed`, which contains
one line of `unsafe` code.
2023-10-31 11:15:25 -07:00
Brian Smith
6c1d378d8d Chacha20-Poly1305-OpenSSH: Remove use of ChunksFixed.
Take a step towards removing the `unsafe` in `ChunksFixed`'s implementation.
2023-10-31 11:15:25 -07:00
Brian Smith
1432533ce9 Enforce clippy::cast_possible_truncation.
For now, just put `#[allow(...)]` directives in the places where the
conversions are done. We'll follow up in the future with the correct
replacement for `as` for each case, as several PRs.
2023-10-30 19:17:48 -07:00
Brian Smith
2b1194c845 NFC: Use pointer::cast instead of as for pointer casts.
Enforce this pattern with Clippy.
2023-10-30 19:17:48 -07:00
Brian Smith
1fa6d09eef Have Clippy block most use of as conversions. 2023-10-30 19:17:48 -07:00
Qiu Chaofan
b6c35d54e3 Enable getrandom for AIX 2023-10-30 12:52:46 -07:00
Brian Smith
e7cf02f403 Agreement docs: Eliminate redundant nested peer_public_key in example. 2023-10-26 16:10:15 -07:00
Brian Smith
e83cf0c0bb Add simplified elliptic curve code generator.
Add a tool to generate and/or verify NIST curve boilerplate.

Sync the existing P-256 and P-384 code with the generator.
2023-10-25 13:46:08 -07:00
Brian Smith
3565fe830f EC Suite B: Remove reudndant "point_mul" tests.
When I generated these test vectors, I gave all of them the same point: the
generator of the curve. Consequently these input files are 100% redundant
with the `point_mul_base.txt` input files. So just remove them and use the
`point_mul_base.txt` files instead.
2023-10-25 10:03:48 -07:00
Brian Smith
be27e8e259 RSA signature verification: Save one multiplication.
Use David Benjamin's idea.
2023-10-20 18:05:47 -07:00
Brian Smith
9dd6141f91 NFC EC: Reduce scope of constant ONE. 2023-10-19 13:12:12 -07:00
Brian Smith
27aa5386a0 EC P-384: Use array types for crossing Rust<->C boundary.
Avoid using the P384_POINT type on the C side. It seems to work for all
the targets we support, for P-384, but this pattern probably doesn't
work in general. Especially due to alignment issues for 32-bit targets,
it is doubtful it would work for P-521.
2023-10-18 11:39:04 -07:00
Brian Smith
159f52c769 Eliminate gathering during table construction.
When `elem_exp_consttime` replaced `BN_mod_exp_mont_consttime` I did
not fully understand the way the table was constructed in the original
function. Recent BoringSSL changes clarify the table construction. Do
it the same way, to restore performance to what it was previously.

This addresses the `// TODO: Optimize this to avoid gathering`.
2023-10-18 11:14:38 -07:00
Brian Smith
19fe19124b bigint elem_exp_consttime: Get rid of entry/entry_mut indexing.
When this code was written, it wasn't clear which assembly language
functions took a pointer to the entire state vs. just a pointer to
the accumulator (etc.). Now upstream clarified things and we can
clarify this code.
2023-10-18 11:14:38 -07:00
Brian Smith
d4bf41eb00 bigint elem_exp_consttime: Add some clarifying comments. 2023-10-18 11:14:38 -07:00
Brian Smith
9a49f379e3 P-256 ECDSA verification: Clarify multiplication.
Move more of the logic for the nistz256 multiplication into Rust.
2023-10-18 09:49:30 -07:00