mirror of
https://github.com/servo/servo
synced 2026-05-09 16:42:16 +02:00
`NormalizedAlgorithm::encrypt`, `NormalizedAlgorithm::decrypt` and other similar functions have some catch-all `match` arms that are unreachable. They are unreachable because we rely on the name attribute in `String` of the subtle dictionaries and the `NormalizedAlgorithm` enum to determine which cryptographic algorithm to use, while the algorithm normalization mechanism guarantees that some combinations of name and enum variants won't exist. This patch tries to get rid of those unreachable `match` arms to make our WebCrypto code more idiomatic so that the Rust compiler can help us ensure the correctness in the future. To achieve this, we break the enum `NormalizedAlgorithm` into multiple enums: `EncryptAlgorithm`, `DecryptAlgorithm`, `SignAlgorithm`, etc. Each one is associated to a cryptographic operation, and its variants are the cryptographic algorithms that support the associated operation. The inner type of each variant is the desired parameter dictionary. Therefore, when the call `EncryptAlgorithm::encrypt`, `DecryptAlgorithm::decrypt` and other similar functions, we can have `match` statements that cover all patterns since those enums only contains necessary variants. To make this change, we also need to change the algorithm registration mechanism. Instead of using the `SupportedAlgorithm` enum and its method `SupportedAlgorithm::support` to register the operations of the algorithms, the algorithm registration is now done in the function `from_object_value` of a new trait named `NormalizedAlgorithm`, which the new enums `EncryptAlgorithm`, `DecryptAlgorithm` and so implement. (Note that the existing enum named `NormalizedAlgorithm` is removed.) Some refactoring in also done in the `normalize_algorithm` function to adapt the above changes. This new design of algorithm registration is also closer to the WebCrypto specification, as explained in the comment block below the `normalize_algorithm` function. The crate `strum` is also used to reduce some boilerplate code. Testing: Refactoring. Existing tests suffice. Fixes: Part of #42579 --------- Signed-off-by: Kingsley Yung <kingsley@kkoyung.dev>