diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/rust/keccak | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/keccak')
-rw-r--r-- | third_party/rust/keccak/.cargo-checksum.json | 1 | ||||
-rw-r--r-- | third_party/rust/keccak/CHANGELOG.md | 39 | ||||
-rw-r--r-- | third_party/rust/keccak/Cargo.toml | 43 | ||||
-rw-r--r-- | third_party/rust/keccak/LICENSE-APACHE | 201 | ||||
-rw-r--r-- | third_party/rust/keccak/LICENSE-MIT | 25 | ||||
-rw-r--r-- | third_party/rust/keccak/README.md | 66 | ||||
-rw-r--r-- | third_party/rust/keccak/benches/mod.rs | 31 | ||||
-rw-r--r-- | third_party/rust/keccak/src/armv8.rs | 193 | ||||
-rw-r--r-- | third_party/rust/keccak/src/lib.rs | 495 | ||||
-rw-r--r-- | third_party/rust/keccak/src/unroll.rs | 62 |
10 files changed, 1156 insertions, 0 deletions
diff --git a/third_party/rust/keccak/.cargo-checksum.json b/third_party/rust/keccak/.cargo-checksum.json new file mode 100644 index 0000000000..e915452bf0 --- /dev/null +++ b/third_party/rust/keccak/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"9395b47a95f725c7f563461b247721f1e8d189a223976e398241c35f0fb92c94","Cargo.toml":"c2d32c3d9d9f7b622345e3169fb652c812f3e44d0b73328bff79dd2cbb0a5e5b","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"bdebaf9156a298f8fdab56dd26cb5144673de522d80f4c0d88e0039145f147f9","README.md":"d59e3d031a1ac63d098f44d47b7375f860cd919c453e26654f407f4a06ffca67","benches/mod.rs":"365ea169882f866e5834eba3afed44e8f9a884938acaf08abc794e67d3dcd726","src/armv8.rs":"3c4ec4f0fdde746295fdc26e1e4d9044a050c54f6d8f4e3199befa2ff8353718","src/lib.rs":"b78ba8507c7f15f007a125ef3567de3442b452cc1814ac7a45ba507088c1793c","src/unroll.rs":"60b165b4637201408fbead985ad6992c6b02fb592efb54ad95ceb8f45492ffbf"},"package":"8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940"}
\ No newline at end of file diff --git a/third_party/rust/keccak/CHANGELOG.md b/third_party/rust/keccak/CHANGELOG.md new file mode 100644 index 0000000000..909712f6ee --- /dev/null +++ b/third_party/rust/keccak/CHANGELOG.md @@ -0,0 +1,39 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## 0.1.4 (2023-05-04) +### Added +- `keccak_p` fns for `[200, 400, 800, 1600]` ([#55]) + +### Changed +- 2018 edition upgrade ([#32]) + +[#32]: https://github.com/RustCrypto/sponges/pull/32 +[#55]: https://github.com/RustCrypto/sponges/pull/55 + +## 0.1.3 (2022-11-14) +### Added +- ARMv8 SHA3 ASM intrinsics implementation for `keccak_f1600` ([#23]) + +[#23]: https://github.com/RustCrypto/sponges/pull/23 + +## 0.1.2 (2022-05-24) +### Changed +- Implement `simd` feature with `portable_simd` instead of deprecated `packed_simd` ([#16]) + +[#16]: https://github.com/RustCrypto/sponges/pull/16 + +## 0.1.1 (2022-05-24) +### Added +- Generic keccak-p and keccak-f {200, 400, 800} ([#7]) +- f1600x{2, 4, 8} ([#8]) + +[#7]: https://github.com/RustCrypto/sponges/pull/7 +[#8]: https://github.com/RustCrypto/sponges/pull/8 + +## 0.1.0 (2018-03-27) +- Initial release diff --git a/third_party/rust/keccak/Cargo.toml b/third_party/rust/keccak/Cargo.toml new file mode 100644 index 0000000000..a5c08ba810 --- /dev/null +++ b/third_party/rust/keccak/Cargo.toml @@ -0,0 +1,43 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +edition = "2018" +name = "keccak" +version = "0.1.4" +authors = ["RustCrypto Developers"] +description = """ +Pure Rust implementation of the Keccak sponge function including the keccak-f +and keccak-p variants +""" +documentation = "https://docs.rs/keccak" +readme = "README.md" +keywords = [ + "crypto", + "sponge", + "keccak", + "keccak-f", + "keccak-p", +] +categories = [ + "cryptography", + "no-std", +] +license = "Apache-2.0 OR MIT" +repository = "https://github.com/RustCrypto/sponges/tree/master/keccak" + +[features] +asm = [] +no_unroll = [] +simd = [] + +[target."cfg(target_arch = \"aarch64\")".dependencies.cpufeatures] +version = "0.2" diff --git a/third_party/rust/keccak/LICENSE-APACHE b/third_party/rust/keccak/LICENSE-APACHE new file mode 100644 index 0000000000..78173fa2e7 --- /dev/null +++ b/third_party/rust/keccak/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/third_party/rust/keccak/LICENSE-MIT b/third_party/rust/keccak/LICENSE-MIT new file mode 100644 index 0000000000..81a3d57ac3 --- /dev/null +++ b/third_party/rust/keccak/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2018-2022 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/third_party/rust/keccak/README.md b/third_party/rust/keccak/README.md new file mode 100644 index 0000000000..989c311366 --- /dev/null +++ b/third_party/rust/keccak/README.md @@ -0,0 +1,66 @@ +# RustCrypto: Keccak Sponge Function + +[![crate][crate-image]][crate-link] +[![Docs][docs-image]][docs-link] +[![Build Status][build-image]][build-link] +![Apache2/MIT licensed][license-image] +![Rust Version][rustc-image] +[![Project Chat][chat-image]][chat-link] + +Pure Rust implementation of the [Keccak Sponge Function][1] including the keccak-f +and keccak-p variants. + +[Documentation][docs-link] + +## About + +This crate implements the core Keccak sponge function, upon which many other +cryptographic functions are built. + +For the SHA-3 family including the SHAKE XOFs, see the [`sha3`] crate, which +is built on this crate. + +## Minimum Supported Rust Version + +Rust **1.41** or higher by default, or **1.59** with the `asm` feature enabled. + +Minimum supported Rust version can be changed in the future, but it will be +done with a minor version bump. + +## SemVer Policy + +- All on-by-default features of this library are covered by SemVer +- MSRV is considered exempt from SemVer as noted above + +## License + +Licensed under either of: + + * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) + * [MIT license](http://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. + +[//]: # (badges) + +[crate-image]: https://img.shields.io/crates/v/keccak.svg +[crate-link]: https://crates.io/crates/keccak +[docs-image]: https://docs.rs/keccak/badge.svg +[docs-link]: https://docs.rs/keccak/ +[build-image]: https://github.com/RustCrypto/sponges/actions/workflows/keccak.yml/badge.svg +[build-link]: https://github.com/RustCrypto/sponges/actions/workflows/keccak.yml +[license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.41+-blue.svg +[chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg +[chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/369879-sponges + +[//]: # (general links) + +[1]: https://keccak.team/keccak.html +[`sha3`]: https://github.com/RustCrypto/hashes/tree/master/sha3 diff --git a/third_party/rust/keccak/benches/mod.rs b/third_party/rust/keccak/benches/mod.rs new file mode 100644 index 0000000000..c080857e39 --- /dev/null +++ b/third_party/rust/keccak/benches/mod.rs @@ -0,0 +1,31 @@ +#![feature(test)] +#![cfg_attr(feature = "simd", feature(portable_simd))] + +extern crate keccak; +extern crate test; + +use keccak::{f1600, f200, f400, f800}; + +macro_rules! impl_bench { + ($name:ident, $fn:ident, $type:expr) => { + #[bench] + fn $name(b: &mut test::Bencher) { + let mut data = [$type; 25]; + b.iter(|| $fn(&mut data)); + } + }; +} + +impl_bench!(b_f200, f200, 0u8); +impl_bench!(b_f400, f400, 0u16); +impl_bench!(b_f800, f800, 0u32); +impl_bench!(b_f1600, f1600, 0u64); + +#[cfg(feature = "simd")] +mod simd { + use keccak::simd::{f1600x2, f1600x4, f1600x8, u64x2, u64x4, u64x8}; + + impl_bench!(b_f1600x2, f1600x2, u64x2::splat(0)); + impl_bench!(b_f1600x4, f1600x4, u64x4::splat(0)); + impl_bench!(b_f1600x8, f1600x8, u64x8::splat(0)); +} diff --git a/third_party/rust/keccak/src/armv8.rs b/third_party/rust/keccak/src/armv8.rs new file mode 100644 index 0000000000..96619549cd --- /dev/null +++ b/third_party/rust/keccak/src/armv8.rs @@ -0,0 +1,193 @@ +/// Keccak-f1600 on ARMv8.4-A with FEAT_SHA3. +/// +/// See p. K12.2.2 p. 11,749 of the ARM Reference manual. +/// Adapted from the Keccak-f1600 implementation in the XKCP/K12. +/// see <https://github.com/XKCP/K12/blob/df6a21e6d1f34c1aa36e8d702540899c97dba5a0/lib/ARMv8Asha3/KeccakP-1600-ARMv8Asha3.S#L69> +#[target_feature(enable = "sha3")] +pub unsafe fn f1600_armv8_sha3_asm(state: &mut [u64; 25]) { + core::arch::asm!(" + // Read state + ld1.1d {{ v0- v3}}, [x0], #32 + ld1.1d {{ v4- v7}}, [x0], #32 + ld1.1d {{ v8-v11}}, [x0], #32 + ld1.1d {{v12-v15}}, [x0], #32 + ld1.1d {{v16-v19}}, [x0], #32 + ld1.1d {{v20-v23}}, [x0], #32 + ld1.1d {{v24}}, [x0] + sub x0, x0, #192 + + // Loop 24 rounds + // NOTE: This loop actually computes two f1600 functions in + // parallel, in both the lower and the upper 64-bit of the + // 128-bit registers v0-v24. + mov x8, #24 + 0: sub x8, x8, #1 + + // Theta Calculations + eor3.16b v25, v20, v15, v10 + eor3.16b v26, v21, v16, v11 + eor3.16b v27, v22, v17, v12 + eor3.16b v28, v23, v18, v13 + eor3.16b v29, v24, v19, v14 + eor3.16b v25, v25, v5, v0 + eor3.16b v26, v26, v6, v1 + eor3.16b v27, v27, v7, v2 + eor3.16b v28, v28, v8, v3 + eor3.16b v29, v29, v9, v4 + rax1.2d v30, v25, v27 + rax1.2d v31, v26, v28 + rax1.2d v27, v27, v29 + rax1.2d v28, v28, v25 + rax1.2d v29, v29, v26 + + // Rho and Phi + eor.16b v0, v0, v29 + xar.2d v25, v1, v30, #64 - 1 + xar.2d v1, v6, v30, #64 - 44 + xar.2d v6, v9, v28, #64 - 20 + xar.2d v9, v22, v31, #64 - 61 + xar.2d v22, v14, v28, #64 - 39 + xar.2d v14, v20, v29, #64 - 18 + xar.2d v26, v2, v31, #64 - 62 + xar.2d v2, v12, v31, #64 - 43 + xar.2d v12, v13, v27, #64 - 25 + xar.2d v13, v19, v28, #64 - 8 + xar.2d v19, v23, v27, #64 - 56 + xar.2d v23, v15, v29, #64 - 41 + xar.2d v15, v4, v28, #64 - 27 + xar.2d v28, v24, v28, #64 - 14 + xar.2d v24, v21, v30, #64 - 2 + xar.2d v8, v8, v27, #64 - 55 + xar.2d v4, v16, v30, #64 - 45 + xar.2d v16, v5, v29, #64 - 36 + xar.2d v5, v3, v27, #64 - 28 + xar.2d v27, v18, v27, #64 - 21 + xar.2d v3, v17, v31, #64 - 15 + xar.2d v30, v11, v30, #64 - 10 + xar.2d v31, v7, v31, #64 - 6 + xar.2d v29, v10, v29, #64 - 3 + + // Chi and Iota + bcax.16b v20, v26, v22, v8 + bcax.16b v21, v8, v23, v22 + bcax.16b v22, v22, v24, v23 + bcax.16b v23, v23, v26, v24 + bcax.16b v24, v24, v8, v26 + + ld1r.2d {{v26}}, [x1], #8 + + bcax.16b v17, v30, v19, v3 + bcax.16b v18, v3, v15, v19 + bcax.16b v19, v19, v16, v15 + bcax.16b v15, v15, v30, v16 + bcax.16b v16, v16, v3, v30 + + bcax.16b v10, v25, v12, v31 + bcax.16b v11, v31, v13, v12 + bcax.16b v12, v12, v14, v13 + bcax.16b v13, v13, v25, v14 + bcax.16b v14, v14, v31, v25 + + bcax.16b v7, v29, v9, v4 + bcax.16b v8, v4, v5, v9 + bcax.16b v9, v9, v6, v5 + bcax.16b v5, v5, v29, v6 + bcax.16b v6, v6, v4, v29 + + bcax.16b v3, v27, v0, v28 + bcax.16b v4, v28, v1, v0 + bcax.16b v0, v0, v2, v1 + bcax.16b v1, v1, v27, v2 + bcax.16b v2, v2, v28, v27 + + eor.16b v0,v0,v26 + + // Rounds loop + cbnz w8, 0b + + // Write state + st1.1d {{ v0- v3}}, [x0], #32 + st1.1d {{ v4- v7}}, [x0], #32 + st1.1d {{ v8-v11}}, [x0], #32 + st1.1d {{v12-v15}}, [x0], #32 + st1.1d {{v16-v19}}, [x0], #32 + st1.1d {{v20-v23}}, [x0], #32 + st1.1d {{v24}}, [x0] + ", + in("x0") state.as_mut_ptr(), + in("x1") crate::RC.as_ptr(), + clobber_abi("C"), + options(nostack) + ); +} + +#[cfg(all(test, target_feature = "sha3"))] +mod tests { + use super::*; + + #[test] + fn test_keccak_f1600() { + // Test vectors are copied from XKCP (eXtended Keccak Code Package) + // https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KeccakF-1600-IntermediateValues.txt + let state_first = [ + 0xF1258F7940E1DDE7, + 0x84D5CCF933C0478A, + 0xD598261EA65AA9EE, + 0xBD1547306F80494D, + 0x8B284E056253D057, + 0xFF97A42D7F8E6FD4, + 0x90FEE5A0A44647C4, + 0x8C5BDA0CD6192E76, + 0xAD30A6F71B19059C, + 0x30935AB7D08FFC64, + 0xEB5AA93F2317D635, + 0xA9A6E6260D712103, + 0x81A57C16DBCF555F, + 0x43B831CD0347C826, + 0x01F22F1A11A5569F, + 0x05E5635A21D9AE61, + 0x64BEFEF28CC970F2, + 0x613670957BC46611, + 0xB87C5A554FD00ECB, + 0x8C3EE88A1CCF32C8, + 0x940C7922AE3A2614, + 0x1841F924A2C509E4, + 0x16F53526E70465C2, + 0x75F644E97F30A13B, + 0xEAF1FF7B5CECA249, + ]; + let state_second = [ + 0x2D5C954DF96ECB3C, + 0x6A332CD07057B56D, + 0x093D8D1270D76B6C, + 0x8A20D9B25569D094, + 0x4F9C4F99E5E7F156, + 0xF957B9A2DA65FB38, + 0x85773DAE1275AF0D, + 0xFAF4F247C3D810F7, + 0x1F1B9EE6F79A8759, + 0xE4FECC0FEE98B425, + 0x68CE61B6B9CE68A1, + 0xDEEA66C4BA8F974F, + 0x33C43D836EAFB1F5, + 0xE00654042719DBD9, + 0x7CF8A9F009831265, + 0xFD5449A6BF174743, + 0x97DDAD33D8994B40, + 0x48EAD5FC5D0BE774, + 0xE3B8C8EE55B7B03C, + 0x91A0226E649E42E9, + 0x900E3129E7BADD7B, + 0x202A9EC5FAA3CCE8, + 0x5B3402464E1C3DB6, + 0x609F4E62A44C1059, + 0x20D06CD26A8FBF5C, + ]; + + let mut state = [0u64; 25]; + unsafe { f1600_armv8_sha3_asm(&mut state) }; + assert_eq!(state, state_first); + unsafe { f1600_armv8_sha3_asm(&mut state) }; + assert_eq!(state, state_second); + } +} diff --git a/third_party/rust/keccak/src/lib.rs b/third_party/rust/keccak/src/lib.rs new file mode 100644 index 0000000000..0e35a3bf9e --- /dev/null +++ b/third_party/rust/keccak/src/lib.rs @@ -0,0 +1,495 @@ +//! Keccak [sponge function](https://en.wikipedia.org/wiki/Sponge_function). +//! +//! If you are looking for SHA-3 hash functions take a look at [`sha3`][1] and +//! [`tiny-keccak`][2] crates. +//! +//! To disable loop unrolling (e.g. for constraint targets) use `no_unroll` +//! feature. +//! +//! ``` +//! // Test vectors are from KeccakCodePackage +//! let mut data = [0u64; 25]; +//! +//! keccak::f1600(&mut data); +//! assert_eq!(data, [ +//! 0xF1258F7940E1DDE7, 0x84D5CCF933C0478A, 0xD598261EA65AA9EE, 0xBD1547306F80494D, +//! 0x8B284E056253D057, 0xFF97A42D7F8E6FD4, 0x90FEE5A0A44647C4, 0x8C5BDA0CD6192E76, +//! 0xAD30A6F71B19059C, 0x30935AB7D08FFC64, 0xEB5AA93F2317D635, 0xA9A6E6260D712103, +//! 0x81A57C16DBCF555F, 0x43B831CD0347C826, 0x01F22F1A11A5569F, 0x05E5635A21D9AE61, +//! 0x64BEFEF28CC970F2, 0x613670957BC46611, 0xB87C5A554FD00ECB, 0x8C3EE88A1CCF32C8, +//! 0x940C7922AE3A2614, 0x1841F924A2C509E4, 0x16F53526E70465C2, 0x75F644E97F30A13B, +//! 0xEAF1FF7B5CECA249, +//! ]); +//! +//! keccak::f1600(&mut data); +//! assert_eq!(data, [ +//! 0x2D5C954DF96ECB3C, 0x6A332CD07057B56D, 0x093D8D1270D76B6C, 0x8A20D9B25569D094, +//! 0x4F9C4F99E5E7F156, 0xF957B9A2DA65FB38, 0x85773DAE1275AF0D, 0xFAF4F247C3D810F7, +//! 0x1F1B9EE6F79A8759, 0xE4FECC0FEE98B425, 0x68CE61B6B9CE68A1, 0xDEEA66C4BA8F974F, +//! 0x33C43D836EAFB1F5, 0xE00654042719DBD9, 0x7CF8A9F009831265, 0xFD5449A6BF174743, +//! 0x97DDAD33D8994B40, 0x48EAD5FC5D0BE774, 0xE3B8C8EE55B7B03C, 0x91A0226E649E42E9, +//! 0x900E3129E7BADD7B, 0x202A9EC5FAA3CCE8, 0x5B3402464E1C3DB6, 0x609F4E62A44C1059, +//! 0x20D06CD26A8FBF5C, +//! ]); +//! ``` +//! +//! [1]: https://docs.rs/sha3 +//! [2]: https://docs.rs/tiny-keccak + +#![no_std] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(feature = "simd", feature(portable_simd))] +#![doc( + html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg", + html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg" +)] +#![allow(non_upper_case_globals)] +#![warn( + clippy::mod_module_files, + clippy::unwrap_used, + missing_docs, + rust_2018_idioms, + unused_lifetimes, + unused_qualifications +)] + +use core::{ + convert::TryInto, + fmt::Debug, + mem::size_of, + ops::{BitAnd, BitAndAssign, BitXor, BitXorAssign, Not}, +}; + +#[rustfmt::skip] +mod unroll; + +#[cfg(all(target_arch = "aarch64", feature = "asm"))] +mod armv8; + +#[cfg(all(target_arch = "aarch64", feature = "asm"))] +cpufeatures::new!(armv8_sha3_intrinsics, "sha3"); + +const PLEN: usize = 25; + +const RHO: [u32; 24] = [ + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44, +]; + +const PI: [usize; 24] = [ + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1, +]; + +const RC: [u64; 24] = [ + 0x0000000000000001, + 0x0000000000008082, + 0x800000000000808a, + 0x8000000080008000, + 0x000000000000808b, + 0x0000000080000001, + 0x8000000080008081, + 0x8000000000008009, + 0x000000000000008a, + 0x0000000000000088, + 0x0000000080008009, + 0x000000008000000a, + 0x000000008000808b, + 0x800000000000008b, + 0x8000000000008089, + 0x8000000000008003, + 0x8000000000008002, + 0x8000000000000080, + 0x000000000000800a, + 0x800000008000000a, + 0x8000000080008081, + 0x8000000000008080, + 0x0000000080000001, + 0x8000000080008008, +]; + +/// Keccak is a permutation over an array of lanes which comprise the sponge +/// construction. +pub trait LaneSize: + Copy + + Clone + + Debug + + Default + + PartialEq + + BitAndAssign + + BitAnd<Output = Self> + + BitXorAssign + + BitXor<Output = Self> + + Not<Output = Self> +{ + /// Number of rounds of the Keccak-f permutation. + const KECCAK_F_ROUND_COUNT: usize; + + /// Truncate function. + fn truncate_rc(rc: u64) -> Self; + + /// Rotate left function. + fn rotate_left(self, n: u32) -> Self; +} + +macro_rules! impl_lanesize { + ($type:ty, $round:expr, $truncate:expr) => { + impl LaneSize for $type { + const KECCAK_F_ROUND_COUNT: usize = $round; + + fn truncate_rc(rc: u64) -> Self { + $truncate(rc) + } + + fn rotate_left(self, n: u32) -> Self { + self.rotate_left(n) + } + } + }; +} + +impl_lanesize!(u8, 18, |rc: u64| { rc.to_le_bytes()[0] }); +impl_lanesize!(u16, 20, |rc: u64| { + let tmp = rc.to_le_bytes(); + #[allow(clippy::unwrap_used)] + Self::from_le_bytes(tmp[..size_of::<Self>()].try_into().unwrap()) +}); +impl_lanesize!(u32, 22, |rc: u64| { + let tmp = rc.to_le_bytes(); + #[allow(clippy::unwrap_used)] + Self::from_le_bytes(tmp[..size_of::<Self>()].try_into().unwrap()) +}); +impl_lanesize!(u64, 24, |rc: u64| { rc }); + +macro_rules! impl_keccak { + ($pname:ident, $fname:ident, $type:ty) => { + + /// Keccak-p sponge function + pub fn $pname(state: &mut [$type; PLEN], round_count: usize) { + keccak_p(state, round_count); + } + + /// Keccak-f sponge function + pub fn $fname(state: &mut [$type; PLEN]) { + keccak_p(state, <$type>::KECCAK_F_ROUND_COUNT); + } + }; +} + +impl_keccak!(p200, f200, u8); +impl_keccak!(p400, f400, u16); +impl_keccak!(p800, f800, u32); + +#[cfg(not(all(target_arch = "aarch64", feature = "asm")))] +impl_keccak!(p1600, f1600, u64); + +/// Keccak-p[1600, rc] permutation. +#[cfg(all(target_arch = "aarch64", feature = "asm"))] +pub fn p1600(state: &mut [u64; PLEN], round_count: usize) { + keccak_p(state, round_count); +} + +/// Keccak-f[1600] permutation. +#[cfg(all(target_arch = "aarch64", feature = "asm"))] +pub fn f1600(state: &mut [u64; PLEN]) { + if armv8_sha3_intrinsics::get() { + unsafe { armv8::f1600_armv8_sha3_asm(state) } + } else { + keccak_p(state, u64::KECCAK_F_ROUND_COUNT); + } +} + +#[cfg(feature = "simd")] +/// SIMD implementations for Keccak-f1600 sponge function +pub mod simd { + use crate::{keccak_p, LaneSize, PLEN}; + pub use core::simd::{u64x2, u64x4, u64x8}; + + macro_rules! impl_lanesize_simd_u64xn { + ($type:ty) => { + impl LaneSize for $type { + const KECCAK_F_ROUND_COUNT: usize = 24; + + fn truncate_rc(rc: u64) -> Self { + Self::splat(rc) + } + + fn rotate_left(self, n: u32) -> Self { + self << Self::splat(n.into()) | self >> Self::splat((64 - n).into()) + } + } + }; + } + + impl_lanesize_simd_u64xn!(u64x2); + impl_lanesize_simd_u64xn!(u64x4); + impl_lanesize_simd_u64xn!(u64x8); + + impl_keccak!(p1600x2, f1600x2, u64x2); + impl_keccak!(p1600x4, f1600x4, u64x4); + impl_keccak!(p1600x8, f1600x8, u64x8); +} + +#[allow(unused_assignments)] +/// Generic Keccak-p sponge function +pub fn keccak_p<L: LaneSize>(state: &mut [L; PLEN], round_count: usize) { + if round_count > L::KECCAK_F_ROUND_COUNT { + panic!("A round_count greater than KECCAK_F_ROUND_COUNT is not supported!"); + } + + // https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=25 + // "the rounds of KECCAK-p[b, nr] match the last rounds of KECCAK-f[b]" + let round_consts = &RC[(L::KECCAK_F_ROUND_COUNT - round_count)..L::KECCAK_F_ROUND_COUNT]; + + // not unrolling this loop results in a much smaller function, plus + // it positively influences performance due to the smaller load on I-cache + for &rc in round_consts { + let mut array = [L::default(); 5]; + + // Theta + unroll5!(x, { + unroll5!(y, { + array[x] ^= state[5 * y + x]; + }); + }); + + unroll5!(x, { + unroll5!(y, { + let t1 = array[(x + 4) % 5]; + let t2 = array[(x + 1) % 5].rotate_left(1); + state[5 * y + x] ^= t1 ^ t2; + }); + }); + + // Rho and pi + let mut last = state[1]; + unroll24!(x, { + array[0] = state[PI[x]]; + state[PI[x]] = last.rotate_left(RHO[x]); + last = array[0]; + }); + + // Chi + unroll5!(y_step, { + let y = 5 * y_step; + + unroll5!(x, { + array[x] = state[y + x]; + }); + + unroll5!(x, { + let t1 = !array[(x + 1) % 5]; + let t2 = array[(x + 2) % 5]; + state[y + x] = array[x] ^ (t1 & t2); + }); + }); + + // Iota + state[0] ^= L::truncate_rc(rc); + } +} + +#[cfg(test)] +mod tests { + use crate::{keccak_p, LaneSize, PLEN}; + + fn keccak_f<L: LaneSize>(state_first: [L; PLEN], state_second: [L; PLEN]) { + let mut state = [L::default(); PLEN]; + + keccak_p(&mut state, L::KECCAK_F_ROUND_COUNT); + assert_eq!(state, state_first); + + keccak_p(&mut state, L::KECCAK_F_ROUND_COUNT); + assert_eq!(state, state_second); + } + + #[test] + fn keccak_f200() { + // Test vectors are copied from XKCP (eXtended Keccak Code Package) + // https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KeccakF-200-IntermediateValues.txt + let state_first = [ + 0x3C, 0x28, 0x26, 0x84, 0x1C, 0xB3, 0x5C, 0x17, 0x1E, 0xAA, 0xE9, 0xB8, 0x11, 0x13, + 0x4C, 0xEA, 0xA3, 0x85, 0x2C, 0x69, 0xD2, 0xC5, 0xAB, 0xAF, 0xEA, + ]; + let state_second = [ + 0x1B, 0xEF, 0x68, 0x94, 0x92, 0xA8, 0xA5, 0x43, 0xA5, 0x99, 0x9F, 0xDB, 0x83, 0x4E, + 0x31, 0x66, 0xA1, 0x4B, 0xE8, 0x27, 0xD9, 0x50, 0x40, 0x47, 0x9E, + ]; + + keccak_f::<u8>(state_first, state_second); + } + + #[test] + fn keccak_f400() { + // Test vectors are copied from XKCP (eXtended Keccak Code Package) + // https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KeccakF-400-IntermediateValues.txt + let state_first = [ + 0x09F5, 0x40AC, 0x0FA9, 0x14F5, 0xE89F, 0xECA0, 0x5BD1, 0x7870, 0xEFF0, 0xBF8F, 0x0337, + 0x6052, 0xDC75, 0x0EC9, 0xE776, 0x5246, 0x59A1, 0x5D81, 0x6D95, 0x6E14, 0x633E, 0x58EE, + 0x71FF, 0x714C, 0xB38E, + ]; + let state_second = [ + 0xE537, 0xD5D6, 0xDBE7, 0xAAF3, 0x9BC7, 0xCA7D, 0x86B2, 0xFDEC, 0x692C, 0x4E5B, 0x67B1, + 0x15AD, 0xA7F7, 0xA66F, 0x67FF, 0x3F8A, 0x2F99, 0xE2C2, 0x656B, 0x5F31, 0x5BA6, 0xCA29, + 0xC224, 0xB85C, 0x097C, + ]; + + keccak_f::<u16>(state_first, state_second); + } + + #[test] + fn keccak_f800() { + // Test vectors are copied from XKCP (eXtended Keccak Code Package) + // https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KeccakF-800-IntermediateValues.txt + let state_first = [ + 0xE531D45D, 0xF404C6FB, 0x23A0BF99, 0xF1F8452F, 0x51FFD042, 0xE539F578, 0xF00B80A7, + 0xAF973664, 0xBF5AF34C, 0x227A2424, 0x88172715, 0x9F685884, 0xB15CD054, 0x1BF4FC0E, + 0x6166FA91, 0x1A9E599A, 0xA3970A1F, 0xAB659687, 0xAFAB8D68, 0xE74B1015, 0x34001A98, + 0x4119EFF3, 0x930A0E76, 0x87B28070, 0x11EFE996, + ]; + let state_second = [ + 0x75BF2D0D, 0x9B610E89, 0xC826AF40, 0x64CD84AB, 0xF905BDD6, 0xBC832835, 0x5F8001B9, + 0x15662CCE, 0x8E38C95E, 0x701FE543, 0x1B544380, 0x89ACDEFF, 0x51EDB5DE, 0x0E9702D9, + 0x6C19AA16, 0xA2913EEE, 0x60754E9A, 0x9819063C, 0xF4709254, 0xD09F9084, 0x772DA259, + 0x1DB35DF7, 0x5AA60162, 0x358825D5, 0xB3783BAB, + ]; + + keccak_f::<u32>(state_first, state_second); + } + + #[test] + fn keccak_f1600() { + // Test vectors are copied from XKCP (eXtended Keccak Code Package) + // https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KeccakF-1600-IntermediateValues.txt + let state_first = [ + 0xF1258F7940E1DDE7, + 0x84D5CCF933C0478A, + 0xD598261EA65AA9EE, + 0xBD1547306F80494D, + 0x8B284E056253D057, + 0xFF97A42D7F8E6FD4, + 0x90FEE5A0A44647C4, + 0x8C5BDA0CD6192E76, + 0xAD30A6F71B19059C, + 0x30935AB7D08FFC64, + 0xEB5AA93F2317D635, + 0xA9A6E6260D712103, + 0x81A57C16DBCF555F, + 0x43B831CD0347C826, + 0x01F22F1A11A5569F, + 0x05E5635A21D9AE61, + 0x64BEFEF28CC970F2, + 0x613670957BC46611, + 0xB87C5A554FD00ECB, + 0x8C3EE88A1CCF32C8, + 0x940C7922AE3A2614, + 0x1841F924A2C509E4, + 0x16F53526E70465C2, + 0x75F644E97F30A13B, + 0xEAF1FF7B5CECA249, + ]; + let state_second = [ + 0x2D5C954DF96ECB3C, + 0x6A332CD07057B56D, + 0x093D8D1270D76B6C, + 0x8A20D9B25569D094, + 0x4F9C4F99E5E7F156, + 0xF957B9A2DA65FB38, + 0x85773DAE1275AF0D, + 0xFAF4F247C3D810F7, + 0x1F1B9EE6F79A8759, + 0xE4FECC0FEE98B425, + 0x68CE61B6B9CE68A1, + 0xDEEA66C4BA8F974F, + 0x33C43D836EAFB1F5, + 0xE00654042719DBD9, + 0x7CF8A9F009831265, + 0xFD5449A6BF174743, + 0x97DDAD33D8994B40, + 0x48EAD5FC5D0BE774, + 0xE3B8C8EE55B7B03C, + 0x91A0226E649E42E9, + 0x900E3129E7BADD7B, + 0x202A9EC5FAA3CCE8, + 0x5B3402464E1C3DB6, + 0x609F4E62A44C1059, + 0x20D06CD26A8FBF5C, + ]; + + keccak_f::<u64>(state_first, state_second); + } + + #[cfg(feature = "simd")] + mod simd { + use super::keccak_f; + use core::simd::{u64x2, u64x4, u64x8}; + + macro_rules! impl_keccak_f1600xn { + ($name:ident, $type:ty) => { + #[test] + fn $name() { + // Test vectors are copied from XKCP (eXtended Keccak Code Package) + // https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KeccakF-1600-IntermediateValues.txt + let state_first = [ + <$type>::splat(0xF1258F7940E1DDE7), + <$type>::splat(0x84D5CCF933C0478A), + <$type>::splat(0xD598261EA65AA9EE), + <$type>::splat(0xBD1547306F80494D), + <$type>::splat(0x8B284E056253D057), + <$type>::splat(0xFF97A42D7F8E6FD4), + <$type>::splat(0x90FEE5A0A44647C4), + <$type>::splat(0x8C5BDA0CD6192E76), + <$type>::splat(0xAD30A6F71B19059C), + <$type>::splat(0x30935AB7D08FFC64), + <$type>::splat(0xEB5AA93F2317D635), + <$type>::splat(0xA9A6E6260D712103), + <$type>::splat(0x81A57C16DBCF555F), + <$type>::splat(0x43B831CD0347C826), + <$type>::splat(0x01F22F1A11A5569F), + <$type>::splat(0x05E5635A21D9AE61), + <$type>::splat(0x64BEFEF28CC970F2), + <$type>::splat(0x613670957BC46611), + <$type>::splat(0xB87C5A554FD00ECB), + <$type>::splat(0x8C3EE88A1CCF32C8), + <$type>::splat(0x940C7922AE3A2614), + <$type>::splat(0x1841F924A2C509E4), + <$type>::splat(0x16F53526E70465C2), + <$type>::splat(0x75F644E97F30A13B), + <$type>::splat(0xEAF1FF7B5CECA249), + ]; + let state_second = [ + <$type>::splat(0x2D5C954DF96ECB3C), + <$type>::splat(0x6A332CD07057B56D), + <$type>::splat(0x093D8D1270D76B6C), + <$type>::splat(0x8A20D9B25569D094), + <$type>::splat(0x4F9C4F99E5E7F156), + <$type>::splat(0xF957B9A2DA65FB38), + <$type>::splat(0x85773DAE1275AF0D), + <$type>::splat(0xFAF4F247C3D810F7), + <$type>::splat(0x1F1B9EE6F79A8759), + <$type>::splat(0xE4FECC0FEE98B425), + <$type>::splat(0x68CE61B6B9CE68A1), + <$type>::splat(0xDEEA66C4BA8F974F), + <$type>::splat(0x33C43D836EAFB1F5), + <$type>::splat(0xE00654042719DBD9), + <$type>::splat(0x7CF8A9F009831265), + <$type>::splat(0xFD5449A6BF174743), + <$type>::splat(0x97DDAD33D8994B40), + <$type>::splat(0x48EAD5FC5D0BE774), + <$type>::splat(0xE3B8C8EE55B7B03C), + <$type>::splat(0x91A0226E649E42E9), + <$type>::splat(0x900E3129E7BADD7B), + <$type>::splat(0x202A9EC5FAA3CCE8), + <$type>::splat(0x5B3402464E1C3DB6), + <$type>::splat(0x609F4E62A44C1059), + <$type>::splat(0x20D06CD26A8FBF5C), + ]; + + keccak_f::<$type>(state_first, state_second); + } + }; + } + + impl_keccak_f1600xn!(keccak_f1600x2, u64x2); + impl_keccak_f1600xn!(keccak_f1600x4, u64x4); + impl_keccak_f1600xn!(keccak_f1600x8, u64x8); + } +} diff --git a/third_party/rust/keccak/src/unroll.rs b/third_party/rust/keccak/src/unroll.rs new file mode 100644 index 0000000000..eab745b9df --- /dev/null +++ b/third_party/rust/keccak/src/unroll.rs @@ -0,0 +1,62 @@ +/// unroll5 +#[cfg(not(feature = "no_unroll"))] +#[macro_export] +macro_rules! unroll5 { + ($var:ident, $body:block) => { + { const $var: usize = 0; $body; } + { const $var: usize = 1; $body; } + { const $var: usize = 2; $body; } + { const $var: usize = 3; $body; } + { const $var: usize = 4; $body; } + }; +} + +/// unroll5 +#[cfg(feature = "no_unroll")] +#[macro_export] +macro_rules! unroll5 { + ($var:ident, $body:block) => { + for $var in 0..5 $body + } +} + +/// unroll24 +#[cfg(not(feature = "no_unroll"))] +#[macro_export] +macro_rules! unroll24 { + ($var: ident, $body: block) => { + { const $var: usize = 0; $body; } + { const $var: usize = 1; $body; } + { const $var: usize = 2; $body; } + { const $var: usize = 3; $body; } + { const $var: usize = 4; $body; } + { const $var: usize = 5; $body; } + { const $var: usize = 6; $body; } + { const $var: usize = 7; $body; } + { const $var: usize = 8; $body; } + { const $var: usize = 9; $body; } + { const $var: usize = 10; $body; } + { const $var: usize = 11; $body; } + { const $var: usize = 12; $body; } + { const $var: usize = 13; $body; } + { const $var: usize = 14; $body; } + { const $var: usize = 15; $body; } + { const $var: usize = 16; $body; } + { const $var: usize = 17; $body; } + { const $var: usize = 18; $body; } + { const $var: usize = 19; $body; } + { const $var: usize = 20; $body; } + { const $var: usize = 21; $body; } + { const $var: usize = 22; $body; } + { const $var: usize = 23; $body; } + }; +} + +/// unroll24 +#[cfg(feature = "no_unroll")] +#[macro_export] +macro_rules! unroll24 { + ($var:ident, $body:block) => { + for $var in 0..24 $body + } +} |