diff --git a/CHANGELOG.md b/CHANGELOG.md index 662759e95..fc4d2ca46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Use more idiomatic Plonky3 APIs ([#743](https://github.com/0xMiden/crypto/pull/743)). - Make concurrent feature interact with plonky3's parallel features, replace homegrown iterator macros with p3-maybe-rayon ([#749](https://github.com/0xMiden/crypto/pull/749)). - Reduce dependency on std in tests, add test helpers to access Rngs in no-std contexts ([#752](https://github.com/0xMiden/crypto/pull/752)). +- [BREAKING] Changed sponge state layout from `[CAPACITY, RATE1, RATE0]` (BE) to `[RATE0, RATE1, CAPACITY]` (LE) ([#755](https://github.com/0xMiden/crypto/pull/755)). # 0.20.1 (2025-12-29) diff --git a/miden-crypto/src/aead/aead_rpo/mod.rs b/miden-crypto/src/aead/aead_rpo/mod.rs index 9ca5a17f4..2d29ae386 100644 --- a/miden-crypto/src/aead/aead_rpo/mod.rs +++ b/miden-crypto/src/aead/aead_rpo/mod.rs @@ -528,7 +528,7 @@ impl SpongeState { squeezed_data } - /// Squeezes an authentication tag + /// Squeezes an authentication tag (from RATE0, the first rate word) fn squeeze_tag(&mut self) -> AuthTag { self.permute(); AuthTag( diff --git a/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs b/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs index a3447ce8a..6e5c14d50 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/tests/data.rs @@ -1755,60 +1755,59 @@ pub(crate) static SK_POLYS: [[[i16; 512]; 4]; NUM_TEST_VECTORS] = [ /// Serialized deterministic RPO-Falcon-512 signature intended for use as a test vector /// for the determinism in the signing procedure across platforms. /// -/// This was generated on an `Intel Core i5-8279U` running on Linux kernel `5.4.0-144-generic` and -/// built with Rust `1.88.0`. +/// This was generated on an `M4` running on `Sequoia 15.7` and built with Rust `1.90.0`. pub(crate) const DETERMINISTIC_SIGNATURE: [u8; SIG_SERIALIZED_LEN] = [ - 185, 1, 22, 144, 158, 211, 85, 196, 199, 194, 123, 220, 135, 121, 154, 120, 141, 154, 66, 32, - 56, 47, 239, 41, 38, 121, 124, 172, 190, 21, 238, 237, 69, 36, 36, 245, 63, 146, 222, 205, 107, - 153, 60, 69, 60, 10, 91, 243, 160, 222, 120, 21, 132, 54, 134, 200, 184, 209, 102, 174, 244, - 236, 77, 155, 224, 162, 181, 104, 251, 8, 40, 30, 9, 14, 184, 153, 181, 189, 100, 74, 238, 146, - 99, 20, 84, 157, 181, 82, 118, 220, 172, 2, 233, 176, 72, 241, 169, 13, 245, 117, 157, 112, 30, - 76, 218, 217, 199, 73, 94, 220, 50, 113, 143, 125, 218, 52, 196, 133, 90, 209, 27, 230, 125, - 153, 181, 235, 98, 178, 151, 63, 190, 194, 43, 186, 139, 54, 38, 8, 203, 17, 91, 137, 246, 187, - 114, 179, 210, 11, 61, 177, 55, 129, 172, 18, 200, 29, 53, 203, 254, 78, 168, 251, 249, 209, 1, - 103, 177, 6, 28, 222, 220, 220, 55, 158, 166, 228, 43, 183, 31, 38, 32, 174, 174, 113, 247, - 108, 148, 225, 245, 15, 228, 225, 234, 160, 25, 161, 201, 189, 147, 158, 12, 249, 57, 71, 113, - 17, 104, 43, 187, 53, 240, 35, 244, 54, 198, 79, 88, 154, 133, 242, 85, 168, 180, 233, 161, - 103, 77, 75, 161, 81, 33, 75, 155, 10, 247, 73, 46, 24, 55, 237, 87, 219, 83, 17, 138, 226, 41, - 250, 159, 229, 73, 94, 89, 161, 70, 82, 45, 13, 193, 6, 33, 70, 127, 181, 120, 203, 81, 171, - 39, 166, 31, 201, 41, 65, 240, 178, 93, 136, 58, 71, 147, 38, 27, 204, 158, 63, 123, 120, 81, - 136, 101, 47, 63, 22, 238, 79, 226, 137, 126, 71, 217, 53, 217, 204, 96, 108, 222, 34, 161, 31, - 162, 42, 186, 101, 139, 61, 37, 97, 145, 133, 179, 65, 163, 79, 87, 19, 49, 80, 126, 112, 246, - 92, 214, 184, 153, 247, 246, 187, 199, 133, 116, 184, 45, 223, 6, 33, 101, 117, 101, 227, 207, - 127, 238, 91, 114, 134, 53, 127, 98, 204, 219, 219, 168, 136, 63, 210, 153, 218, 186, 138, 170, - 76, 215, 67, 34, 132, 146, 12, 38, 42, 149, 76, 172, 209, 231, 24, 77, 212, 205, 171, 235, 236, - 159, 220, 92, 62, 9, 164, 54, 49, 51, 192, 47, 238, 3, 229, 98, 26, 100, 47, 101, 132, 194, 8, - 142, 141, 173, 107, 191, 102, 19, 181, 209, 71, 168, 61, 175, 33, 37, 125, 37, 203, 19, 116, - 144, 176, 55, 4, 165, 47, 238, 101, 20, 131, 197, 146, 167, 222, 185, 140, 132, 80, 128, 226, - 150, 93, 203, 160, 196, 162, 141, 105, 190, 50, 92, 98, 31, 136, 102, 46, 24, 153, 6, 55, 78, - 135, 146, 24, 147, 221, 31, 74, 189, 115, 157, 83, 74, 147, 64, 255, 204, 79, 255, 31, 74, 65, - 143, 115, 35, 72, 59, 244, 26, 130, 173, 69, 96, 26, 215, 61, 97, 41, 69, 236, 230, 105, 119, - 30, 220, 90, 128, 250, 48, 134, 130, 205, 142, 196, 49, 184, 190, 101, 220, 199, 168, 217, 105, - 242, 157, 100, 135, 163, 156, 205, 172, 241, 35, 148, 124, 244, 45, 97, 213, 114, 55, 10, 126, - 117, 173, 135, 77, 239, 135, 58, 68, 243, 200, 222, 100, 52, 219, 26, 19, 217, 109, 32, 39, - 118, 130, 139, 38, 101, 231, 38, 126, 228, 20, 197, 91, 211, 248, 253, 74, 27, 201, 4, 52, 158, - 38, 116, 79, 62, 17, 107, 99, 75, 166, 247, 119, 31, 140, 97, 229, 48, 73, 179, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 155, 125, 185, 64, 84, 225, 93, 95, 10, 178, 100, 198, 160, 180, 110, 66, - 53, 41, 212, 204, 170, 160, 237, 167, 160, 122, 168, 168, 68, 93, 180, 2, 255, 84, 191, 48, - 157, 91, 57, 228, 201, 192, 75, 145, 62, 104, 175, 135, 156, 9, 128, 122, 1, 210, 73, 150, 34, - 200, 59, 228, 99, 89, 40, 54, 25, 217, 86, 245, 170, 187, 28, 224, 144, 102, 208, 225, 180, - 106, 60, 184, 144, 29, 213, 222, 166, 45, 212, 135, 24, 164, 201, 83, 26, 181, 36, 130, 38, - 173, 109, 97, 235, 192, 26, 43, 248, 157, 36, 62, 182, 118, 28, 234, 32, 6, 171, 179, 224, 30, - 170, 75, 80, 101, 228, 221, 195, 238, 144, 170, 6, 57, 109, 171, 41, 157, 234, 0, 103, 243, - 207, 105, 76, 164, 83, 35, 27, 73, 134, 177, 241, 38, 98, 86, 16, 200, 61, 190, 53, 115, 49, - 157, 169, 143, 109, 119, 196, 109, 151, 31, 54, 94, 22, 246, 174, 164, 162, 173, 60, 74, 18, - 220, 166, 122, 176, 32, 166, 107, 100, 229, 32, 161, 185, 210, 8, 49, 230, 61, 184, 212, 197, - 41, 114, 239, 214, 114, 177, 9, 39, 254, 197, 24, 151, 86, 141, 25, 206, 200, 146, 167, 36, 29, - 224, 66, 141, 123, 73, 246, 49, 80, 207, 109, 160, 72, 249, 70, 164, 10, 211, 190, 15, 104, - 147, 186, 216, 202, 251, 27, 246, 250, 104, 57, 91, 119, 19, 98, 173, 247, 70, 85, 8, 13, 70, - 69, 120, 52, 21, 87, 112, 50, 11, 75, 213, 167, 79, 42, 106, 58, 250, 77, 12, 133, 174, 108, - 113, 82, 17, 17, 98, 126, 97, 172, 87, 218, 221, 79, 84, 113, 33, 148, 62, 105, 150, 66, 152, - 153, 39, 237, 96, 75, 81, 1, 56, 6, 98, 92, 138, 114, 242, 189, 40, 38, 197, 118, 96, 130, 145, - 229, 138, 153, 44, 49, 89, 120, 209, 167, 205, 202, 28, 65, 174, 219, 125, 99, 31, 88, 48, 254, - 227, 34, 88, 138, 138, 60, 144, 106, 148, 158, 248, 154, 181, 53, 3, 45, 233, 164, 68, 80, 207, - 42, 209, 157, 159, 128, 94, 241, 55, 166, 231, 115, 130, 41, 132, 19, 135, 225, 120, 36, 101, - 204, 210, 161, 84, 197, 63, 5, 36, 178, 4, 229, 237, 43, 49, 212, 80, 219, 20, 172, 182, 189, - 9, 193, 112, 73, 63, 37, 148, 148, 184, 201, 96, 83, 62, 32, 186, 249, 54, 103, 208, 112, 216, + 185, 1, 49, 100, 34, 177, 39, 53, 190, 227, 187, 229, 174, 59, 206, 209, 55, 168, 94, 121, 223, + 102, 175, 213, 188, 26, 185, 233, 198, 252, 249, 138, 82, 22, 171, 253, 118, 25, 164, 99, 187, + 36, 109, 69, 198, 5, 16, 70, 234, 156, 145, 45, 71, 247, 255, 137, 71, 108, 215, 161, 85, 46, + 110, 45, 26, 71, 171, 47, 181, 153, 48, 142, 250, 169, 149, 108, 193, 17, 239, 43, 255, 253, + 190, 217, 63, 139, 49, 228, 103, 101, 201, 241, 236, 162, 110, 246, 146, 195, 202, 159, 63, + 237, 121, 235, 235, 216, 41, 27, 127, 141, 61, 13, 41, 133, 97, 80, 207, 33, 90, 59, 250, 95, + 240, 34, 95, 25, 43, 115, 31, 51, 124, 214, 88, 143, 111, 143, 65, 29, 175, 167, 200, 233, 68, + 194, 224, 232, 184, 183, 95, 49, 65, 81, 81, 9, 82, 27, 60, 196, 39, 103, 33, 209, 97, 88, 92, + 214, 121, 201, 66, 191, 172, 175, 76, 165, 196, 191, 205, 5, 147, 179, 11, 173, 36, 186, 173, + 211, 229, 41, 235, 251, 245, 44, 234, 164, 157, 66, 166, 146, 187, 156, 43, 23, 184, 108, 107, + 30, 45, 252, 98, 185, 136, 152, 185, 94, 120, 149, 133, 200, 96, 255, 188, 183, 9, 122, 52, + 220, 92, 171, 53, 43, 119, 97, 73, 36, 69, 194, 117, 179, 10, 158, 180, 173, 216, 34, 147, 150, + 73, 137, 38, 104, 147, 147, 128, 76, 28, 9, 134, 72, 86, 33, 109, 238, 37, 19, 189, 248, 222, + 221, 252, 185, 150, 102, 200, 66, 208, 254, 154, 102, 110, 46, 180, 253, 181, 90, 136, 15, 15, + 99, 250, 71, 8, 41, 206, 249, 247, 177, 87, 27, 246, 193, 91, 240, 148, 39, 138, 141, 166, 109, + 36, 20, 109, 14, 103, 47, 30, 48, 13, 38, 188, 151, 233, 74, 148, 7, 147, 132, 238, 106, 86, + 146, 36, 206, 56, 89, 102, 213, 66, 84, 151, 47, 116, 223, 164, 206, 177, 164, 17, 55, 231, 93, + 236, 115, 92, 161, 28, 171, 33, 153, 86, 140, 123, 224, 201, 107, 121, 129, 63, 212, 221, 148, + 62, 172, 44, 184, 103, 217, 88, 67, 173, 172, 42, 115, 151, 179, 29, 118, 114, 186, 202, 80, + 153, 89, 92, 81, 0, 74, 55, 201, 247, 54, 90, 199, 243, 119, 172, 31, 15, 182, 170, 200, 127, + 183, 91, 189, 237, 241, 154, 248, 229, 16, 117, 149, 15, 79, 156, 246, 160, 147, 77, 38, 144, + 194, 119, 69, 131, 46, 23, 185, 43, 66, 194, 77, 185, 30, 206, 92, 4, 218, 161, 156, 24, 54, + 238, 89, 201, 37, 148, 39, 185, 89, 137, 206, 171, 148, 189, 181, 185, 205, 168, 104, 182, 93, + 82, 17, 77, 143, 31, 188, 108, 11, 168, 116, 147, 166, 55, 160, 209, 153, 5, 146, 59, 46, 231, + 219, 112, 200, 110, 9, 148, 200, 94, 93, 247, 234, 48, 90, 88, 104, 34, 18, 120, 235, 25, 231, + 42, 156, 145, 165, 233, 143, 17, 227, 155, 44, 216, 185, 202, 54, 242, 53, 233, 206, 161, 176, + 221, 204, 124, 208, 104, 87, 80, 128, 163, 122, 150, 178, 5, 184, 146, 50, 121, 95, 174, 151, + 57, 4, 174, 208, 27, 157, 135, 190, 121, 1, 68, 57, 81, 69, 235, 205, 137, 82, 161, 209, 12, + 212, 9, 9, 77, 22, 251, 36, 37, 13, 50, 61, 89, 164, 69, 105, 92, 233, 136, 195, 210, 103, 102, + 73, 20, 5, 28, 162, 56, 169, 245, 255, 8, 134, 70, 53, 38, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 155, 125, 185, 64, 84, 225, 93, 95, 10, 178, 100, 198, 160, 180, 110, 66, 53, + 41, 212, 204, 170, 160, 237, 167, 160, 122, 168, 168, 68, 93, 180, 2, 255, 84, 191, 48, 157, + 91, 57, 228, 201, 192, 75, 145, 62, 104, 175, 135, 156, 9, 128, 122, 1, 210, 73, 150, 34, 200, + 59, 228, 99, 89, 40, 54, 25, 217, 86, 245, 170, 187, 28, 224, 144, 102, 208, 225, 180, 106, 60, + 184, 144, 29, 213, 222, 166, 45, 212, 135, 24, 164, 201, 83, 26, 181, 36, 130, 38, 173, 109, + 97, 235, 192, 26, 43, 248, 157, 36, 62, 182, 118, 28, 234, 32, 6, 171, 179, 224, 30, 170, 75, + 80, 101, 228, 221, 195, 238, 144, 170, 6, 57, 109, 171, 41, 157, 234, 0, 103, 243, 207, 105, + 76, 164, 83, 35, 27, 73, 134, 177, 241, 38, 98, 86, 16, 200, 61, 190, 53, 115, 49, 157, 169, + 143, 109, 119, 196, 109, 151, 31, 54, 94, 22, 246, 174, 164, 162, 173, 60, 74, 18, 220, 166, + 122, 176, 32, 166, 107, 100, 229, 32, 161, 185, 210, 8, 49, 230, 61, 184, 212, 197, 41, 114, + 239, 214, 114, 177, 9, 39, 254, 197, 24, 151, 86, 141, 25, 206, 200, 146, 167, 36, 29, 224, 66, + 141, 123, 73, 246, 49, 80, 207, 109, 160, 72, 249, 70, 164, 10, 211, 190, 15, 104, 147, 186, + 216, 202, 251, 27, 246, 250, 104, 57, 91, 119, 19, 98, 173, 247, 70, 85, 8, 13, 70, 69, 120, + 52, 21, 87, 112, 50, 11, 75, 213, 167, 79, 42, 106, 58, 250, 77, 12, 133, 174, 108, 113, 82, + 17, 17, 98, 126, 97, 172, 87, 218, 221, 79, 84, 113, 33, 148, 62, 105, 150, 66, 152, 153, 39, + 237, 96, 75, 81, 1, 56, 6, 98, 92, 138, 114, 242, 189, 40, 38, 197, 118, 96, 130, 145, 229, + 138, 153, 44, 49, 89, 120, 209, 167, 205, 202, 28, 65, 174, 219, 125, 99, 31, 88, 48, 254, 227, + 34, 88, 138, 138, 60, 144, 106, 148, 158, 248, 154, 181, 53, 3, 45, 233, 164, 68, 80, 207, 42, + 209, 157, 159, 128, 94, 241, 55, 166, 231, 115, 130, 41, 132, 19, 135, 225, 120, 36, 101, 204, + 210, 161, 84, 197, 63, 5, 36, 178, 4, 229, 237, 43, 49, 212, 80, 219, 20, 172, 182, 189, 9, + 193, 112, 73, 63, 37, 148, 148, 184, 201, 96, 83, 62, 32, 186, 249, 54, 103, 208, 112, 216, 216, 217, 97, 70, 4, 18, 42, 182, 117, 21, 222, 204, 168, 164, 123, 1, 189, 145, 70, 80, 218, 192, 136, 81, 22, 159, 137, 194, 70, 246, 187, 150, 50, 54, 154, 203, 214, 73, 174, 205, 44, 192, 105, 138, 192, 109, 238, 21, 64, 232, 181, 218, 129, 125, 92, 145, 87, 64, 222, 169, 183, diff --git a/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs b/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs index 9ef4106a7..8d7adb01a 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/tests/mod.rs @@ -1,7 +1,8 @@ use alloc::vec::Vec; use data::{ - EXPECTED_SIG, EXPECTED_SIG_POLYS, NUM_TEST_VECTORS, SK_POLYS, SYNC_DATA_FOR_TEST_VECTOR, + DETERMINISTIC_SIGNATURE, EXPECTED_SIG, EXPECTED_SIG_POLYS, NUM_TEST_VECTORS, SK_POLYS, + SYNC_DATA_FOR_TEST_VECTOR, }; use prng::Shake256Testing; use rand::{RngCore, SeedableRng}; @@ -10,7 +11,6 @@ use rand_chacha::ChaCha20Rng; use super::{Serializable, math::Polynomial}; use crate::dsa::falcon512_rpo::{ PREVERSIONED_NONCE, PREVERSIONED_NONCE_LEN, SIG_NONCE_LEN, SIG_POLY_BYTE_LEN, SecretKey, - tests::data::DETERMINISTIC_SIGNATURE, }; mod data; diff --git a/miden-crypto/src/hash/algebraic_sponge/mod.rs b/miden-crypto/src/hash/algebraic_sponge/mod.rs index 131f23b24..30f83bc8d 100644 --- a/miden-crypto/src/hash/algebraic_sponge/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/mod.rs @@ -25,25 +25,24 @@ pub(crate) mod rescue; // CONSTANTS // ================================================================================================ -/// Sponge state is set to 12 field elements or 96 bytes; 8 elements are reserved for rate and -/// the remaining 4 elements are reserved for capacity. +/// Sponge state is set to 12 field elements or 96 bytes; 8 elements are reserved for the rate and +/// the remaining 4 elements are reserved for the capacity. pub(crate) const STATE_WIDTH: usize = 12; -/// The rate portion of the state is located in elements 4 through 11. -pub(crate) const RATE_RANGE: Range = 4..12; +/// The rate portion of the state is located in elements 0 through 7. +pub(crate) const RATE_RANGE: Range = 0..8; pub(crate) const RATE_WIDTH: usize = RATE_RANGE.end - RATE_RANGE.start; -pub(crate) const INPUT1_RANGE: Range = 4..8; -pub(crate) const INPUT2_RANGE: Range = 8..12; +/// The first and second 4-element words of the rate portion. +pub(crate) const RATE0_RANGE: Range = 0..4; +pub(crate) const RATE1_RANGE: Range = 4..8; -/// The capacity portion of the state is located in elements 0, 1, 2, and 3. -pub(crate) const CAPACITY_RANGE: Range = 0..4; +/// The capacity portion of the state is located in elements 8, 9, 10, and 11. +pub(crate) const CAPACITY_RANGE: Range = 8..12; -/// The output of the hash function is a digest which consists of 4 field elements or 32 bytes. -/// -/// The digest is returned from state elements 4, 5, 6, and 7 (the first four elements of the -/// rate portion). -pub(crate) const DIGEST_RANGE: Range = 4..8; +/// The output of the hash function is a digest which consists of 4 field elements or 32 bytes, +/// taken from the first word of the rate portion of the state. +pub(crate) const DIGEST_RANGE: Range = 0..4; /// The number of byte chunks defining a field element when hashing a sequence of bytes const BINARY_CHUNK_SIZE: usize = 7; @@ -96,7 +95,7 @@ pub(crate) trait AlgebraicSponge { Self::apply_permutation(&mut state); } - // return the first 4 elements of the state as hash result + // return the digest portion of the state as hash result Word::new(state[DIGEST_RANGE].try_into().unwrap()) } @@ -169,7 +168,7 @@ pub(crate) trait AlgebraicSponge { Self::apply_permutation(&mut state); } - // return the first 4 elements of the rate as hash result. + // return the digest portion of the rate as hash result. Word::new(state[DIGEST_RANGE].try_into().unwrap()) } @@ -204,12 +203,12 @@ pub(crate) trait AlgebraicSponge { // - if the value doesn't fit into a single field element, split it into two field elements, // copy them into rate elements 5 and 6 and set the first capacity element to 6. let mut state = [ZERO; STATE_WIDTH]; - state[INPUT1_RANGE].copy_from_slice(seed.as_elements()); - state[INPUT2_RANGE.start] = Felt::new(value); + state[RATE0_RANGE].copy_from_slice(seed.as_elements()); + state[RATE1_RANGE.start] = Felt::new(value); if value < Felt::ORDER_U64 { state[CAPACITY_RANGE.start] = Felt::from_u8(5_u8); } else { - state[INPUT2_RANGE.start + 1] = Felt::new(value / Felt::ORDER_U64); + state[RATE1_RANGE.start + 1] = Felt::new(value / Felt::ORDER_U64); state[CAPACITY_RANGE.start] = Felt::from_u8(6_u8); } diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index a13ae459d..b798568d3 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -1,7 +1,7 @@ use super::{ - AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, + AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, PrimeCharacteristicRing, RATE_RANGE, + RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, ZERO, }; -use crate::field::PrimeCharacteristicRing; mod constants; use constants::{ @@ -102,17 +102,24 @@ impl Poseidon2 { /// Number of internal rounds. pub const NUM_INTERNAL_ROUNDS: usize = NUM_INTERNAL_ROUNDS; - /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for rate and - /// the remaining 4 elements are reserved for capacity. + /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for the + /// rate and the remaining 4 elements are reserved for the capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The first 4-element word of the rate portion. + pub const RATE0_RANGE: Range = RATE0_RANGE; + + /// The second 4-element word of the rate portion. + pub const RATE1_RANGE: Range = RATE1_RANGE; + + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// Matrix used for computing the linear layers of internal rounds. @@ -328,9 +335,9 @@ use p3_symmetric::{ /// `CryptographicPermutation` traits, allowing Poseidon2 to be used within the Plonky3 ecosystem. /// /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: -/// - Rate: 8 elements (positions 4-11) -/// - Capacity: 4 elements (positions 0-3) -/// - Digest output: 4 elements (positions 4-7) +/// - Rate: 8 elements (positions 0-7) +/// - Capacity: 4 elements (positions 8-11) +/// - Digest output: 4 elements (positions 0-3) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Poseidon2Permutation256; @@ -348,13 +355,13 @@ impl Poseidon2Permutation256 { /// the remaining 4 elements are reserved for capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Poseidon2::RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Poseidon2::CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3. pub const DIGEST_RANGE: Range = Poseidon2::DIGEST_RANGE; // POSEIDON2 PERMUTATION @@ -410,140 +417,3 @@ pub type Poseidon2Compression = TruncatedPermutation = DuplexChallenger; - -#[cfg(test)] -mod p3_tests { - use p3_symmetric::{CryptographicHasher, PseudoCompressionFunction}; - - use super::*; - - #[test] - fn test_poseidon2_permutation_basic() { - let mut state = [Felt::new(0); STATE_WIDTH]; - - // Apply permutation - let perm = Poseidon2Permutation256; - perm.permute_mut(&mut state); - - // State should be different from all zeros after permutation - assert_ne!(state, [Felt::new(0); STATE_WIDTH]); - } - - #[test] - fn test_poseidon2_permutation_consistency() { - let mut state1 = [Felt::new(0); STATE_WIDTH]; - let mut state2 = [Felt::new(0); STATE_WIDTH]; - - // Apply permutation using the trait - let perm = Poseidon2Permutation256; - perm.permute_mut(&mut state1); - - // Apply permutation directly - Poseidon2Permutation256::apply_permutation(&mut state2); - - // Both should produce the same result - assert_eq!(state1, state2); - } - - #[test] - fn test_poseidon2_permutation_deterministic() { - let input = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - Felt::new(9), - Felt::new(10), - Felt::new(11), - Felt::new(12), - ]; - - let mut state1 = input; - let mut state2 = input; - - let perm = Poseidon2Permutation256; - perm.permute_mut(&mut state1); - perm.permute_mut(&mut state2); - - // Same input should produce same output - assert_eq!(state1, state2); - } - - #[test] - #[ignore] // TODO: Re-enable after migrating Poseidon2 state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] - fn test_poseidon2_hasher_vs_hash_elements() { - // Test with empty input - let expected: [Felt; 4] = Poseidon2::hash_elements::(&[]).into(); - let hasher = Poseidon2Hasher::new(Poseidon2Permutation256); - let result = hasher.hash_iter([]); - assert_eq!(result, expected, "Empty input should produce same digest"); - - // Test with 4 elements (one digest worth) - let input4 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let expected: [Felt; 4] = Poseidon2::hash_elements(&input4).into(); - let result = hasher.hash_iter(input4); - assert_eq!(result, expected, "4 elements should produce same digest"); - - // Test with 8 elements (exactly one rate) - let input8 = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - ]; - let expected: [Felt; 4] = Poseidon2::hash_elements(&input8).into(); - let result = hasher.hash_iter(input8); - assert_eq!(result, expected, "8 elements (one rate) should produce same digest"); - - // Test with 16 elements (two rates) - let input16 = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - Felt::new(9), - Felt::new(10), - Felt::new(11), - Felt::new(12), - Felt::new(13), - Felt::new(14), - Felt::new(15), - Felt::new(16), - ]; - let expected: [Felt; 4] = Poseidon2::hash_elements(&input16).into(); - let result = hasher.hash_iter(input16); - assert_eq!(result, expected, "16 elements (two rates) should produce same digest"); - } - - #[test] - #[ignore] // TODO: Re-enable after migrating Poseidon2 state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] - fn test_poseidon2_compression_vs_merge() { - let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; - - // Poseidon2::merge expects &[Word; 2] - let expected: [Felt; 4] = Poseidon2::merge(&[digest1.into(), digest2.into()]).into(); - - // Poseidon2Compression expects [[Felt; 4]; 2] - let compress = Poseidon2Compression::new(Poseidon2Permutation256); - let result = compress.compress([digest1, digest2]); - - assert_eq!(result, expected, "Poseidon2Compression should match Poseidon2::merge"); - } -} diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs index 0d2cdf193..52d42bba2 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/test.rs @@ -1,4 +1,6 @@ -use super::{Felt, ZERO}; +use p3_symmetric::{CryptographicHasher, PseudoCompressionFunction}; + +use super::*; use crate::hash::{algebraic_sponge::AlgebraicSponge, poseidon2::Poseidon2}; #[test] @@ -36,3 +38,117 @@ fn permutation_test_vector() { assert_eq!(perm[10], Felt::new(0xec467926508fbe67)); assert_eq!(perm[11], Felt::new(0x6a50450ddf85a6ed)); } + +#[test] +fn test_poseidon2_permutation_basic() { + let mut state = [Felt::new(0); STATE_WIDTH]; + + // Apply permutation + let perm = Poseidon2Permutation256; + perm.permute_mut(&mut state); + + // State should be different from all zeros after permutation + assert_ne!(state, [Felt::new(0); STATE_WIDTH]); +} + +#[test] +fn test_poseidon2_permutation_consistency() { + let mut state1 = [Felt::new(0); STATE_WIDTH]; + let mut state2 = [Felt::new(0); STATE_WIDTH]; + + // Apply permutation using the trait + let perm = Poseidon2Permutation256; + perm.permute_mut(&mut state1); + + // Apply permutation directly + Poseidon2Permutation256::apply_permutation(&mut state2); + + // Both should produce the same result + assert_eq!(state1, state2); +} + +#[test] +fn test_poseidon2_permutation_deterministic() { + let input = [ + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(4), + Felt::new(5), + Felt::new(6), + Felt::new(7), + Felt::new(8), + Felt::new(9), + Felt::new(10), + Felt::new(11), + Felt::new(12), + ]; + + let mut state1 = input; + let mut state2 = input; + + let perm = Poseidon2Permutation256; + perm.permute_mut(&mut state1); + perm.permute_mut(&mut state2); + + // Same input should produce same output + assert_eq!(state1, state2); +} + +#[test] +fn test_poseidon2_hasher_vs_hash_elements() { + let hasher = Poseidon2Hasher::new(Poseidon2Permutation256); + + // Test with 8 elements (exactly one rate) + let input8 = [ + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(4), + Felt::new(5), + Felt::new(6), + Felt::new(7), + Felt::new(8), + ]; + let expected: [Felt; 4] = Poseidon2::hash_elements(&input8).into(); + let result = hasher.hash_iter(input8); + assert_eq!(result, expected, "8 elements (one rate) should produce same digest"); + + // Test with 16 elements (two rates) + let input16 = [ + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(4), + Felt::new(5), + Felt::new(6), + Felt::new(7), + Felt::new(8), + Felt::new(9), + Felt::new(10), + Felt::new(11), + Felt::new(12), + Felt::new(13), + Felt::new(14), + Felt::new(15), + Felt::new(16), + ]; + let expected: [Felt; 4] = Poseidon2::hash_elements(&input16).into(); + let result = hasher.hash_iter(input16); + assert_eq!(result, expected, "16 elements (two rates) should produce same digest"); +} + +#[test] +fn test_poseidon2_compression_vs_merge() { + let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; + let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; + + // Poseidon2::merge expects &[Word; 2] + let expected: [Felt; 4] = Poseidon2::merge(&[digest1.into(), digest2.into()]).into(); + + // Poseidon2Compression expects [[Felt; 4]; 2] + let compress = Poseidon2Compression::new(Poseidon2Permutation256); + let result = compress.compress([digest1, digest2]); + + assert_eq!(result, expected, "Poseidon2Compression should match Poseidon2::merge"); +} diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs index ba309a4e3..cf73963ea 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs @@ -1,7 +1,8 @@ use p3_field::{Field, PrimeCharacteristicRing}; use super::{ - AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, + AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, RATE0_RANGE, RATE1_RANGE, + Range, STATE_WIDTH, Word, ZERO, }; mod arch; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index 94dd72f91..f122f05b3 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -1,9 +1,9 @@ use super::{ - ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, NUM_ROUNDS, RATE_RANGE, Range, - STATE_WIDTH, Word, add_constants, add_constants_and_apply_inv_sbox, - add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, apply_sbox, + ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, MDS, NUM_ROUNDS, RATE_RANGE, + RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, add_constants, + add_constants_and_apply_inv_sbox, add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, + apply_sbox, }; -use crate::hash::algebraic_sponge::rescue::mds::MDS; #[cfg(test)] mod tests; @@ -91,17 +91,24 @@ impl Rpo256 { /// The number of rounds is set to 7 to target 128-bit security level. pub const NUM_ROUNDS: usize = NUM_ROUNDS; - /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for rate and - /// the remaining 4 elements are reserved for capacity. + /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for the + /// rate and the remaining 4 elements are reserved for the capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The first 4-element word of the rate portion. + pub const RATE0_RANGE: Range = RATE0_RANGE; + + /// The second 4-element word of the rate portion. + pub const RATE1_RANGE: Range = RATE1_RANGE; + + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// MDS matrix used for computing the linear layer in a RPO round. @@ -209,9 +216,9 @@ use p3_symmetric::{ /// `CryptographicPermutation` traits, allowing RPO to be used within the Plonky3 ecosystem. /// /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: -/// - Rate: 8 elements (positions 4-11) -/// - Capacity: 4 elements (positions 0-3) -/// - Digest output: 4 elements (positions 4-7) +/// - Rate: 8 elements (positions 0-7) +/// - Capacity: 4 elements (positions 8-11) +/// - Digest output: 4 elements (positions 0-3) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct RpoPermutation256; @@ -226,13 +233,13 @@ impl RpoPermutation256 { /// the remaining 4 elements are reserved for capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Rpo256::RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpo256::CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3. pub const DIGEST_RANGE: Range = Rpo256::DIGEST_RANGE; // RESCUE PERMUTATION diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs index 44e1a44b8..eecb4f666 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs @@ -15,7 +15,9 @@ const INV_ALPHA: u64 = 10540996611094048183; use crate::{ ONE, Word, ZERO, field::{PrimeCharacteristicRing, PrimeField64}, - hash::algebraic_sponge::{AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_WIDTH}, + hash::algebraic_sponge::{ + AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_RANGE, RATE_WIDTH, + }, rand::test_utils::rand_value, }; @@ -151,7 +153,8 @@ fn hash_padding_no_extra_permutation_call() { let mut state = [ZERO; STATE_WIDTH]; // padding when hashing bytes state[CAPACITY_RANGE.start] = Felt::from_u8(RATE_WIDTH as u8); - *state.last_mut().unwrap() = Felt::new(u64::from_le_bytes(final_chunk)); + // place the final padded chunk into the last rate element + state[RATE_RANGE.end - 1] = Felt::new(u64::from_le_bytes(final_chunk)); Rpo256::apply_permutation(&mut state); assert_eq!(&r1[0..4], &state[DIGEST_RANGE]); @@ -233,7 +236,7 @@ fn hash_test_vectors() { ]; for i in 0..elements.len() { - let expected = Word::new(*EXPECTED[i]); + let expected = EXPECTED[i]; let result = Rpo256::hash_elements(&elements[..(i + 1)]); assert_eq!(result, expected); } @@ -278,118 +281,118 @@ proptest! { const EXPECTED: [Word; 19] = [ Word::new([ - Felt::new(18126731724905382595), - Felt::new(7388557040857728717), - Felt::new(14290750514634285295), - Felt::new(7852282086160480146), + Felt::new(8563248028282119176), + Felt::new(14757918088501470722), + Felt::new(14042820149444308297), + Felt::new(7607140247535155355), ]), Word::new([ - Felt::new(10139303045932500183), - Felt::new(2293916558361785533), - Felt::new(15496361415980502047), - Felt::new(17904948502382283940), + Felt::new(8762449007102993687), + Felt::new(4386081033660325954), + Felt::new(5000814629424193749), + Felt::new(8171580292230495897), ]), Word::new([ - Felt::new(17457546260239634015), - Felt::new(803990662839494686), - Felt::new(10386005777401424878), - Felt::new(18168807883298448638), + Felt::new(16710087681096729759), + Felt::new(10808706421914121430), + Felt::new(14661356949236585983), + Felt::new(5683478730832134441), ]), Word::new([ - Felt::new(13072499238647455740), - Felt::new(10174350003422057273), - Felt::new(9201651627651151113), - Felt::new(6872461887313298746), + Felt::new(5309818427047650994), + Felt::new(17172251659920546244), + Felt::new(8288476618870804357), + Felt::new(18080473279382182941), ]), Word::new([ - Felt::new(2903803350580990546), - Felt::new(1838870750730563299), - Felt::new(4258619137315479708), - Felt::new(17334260395129062936), + Felt::new(3647545403045515695), + Felt::new(3358383208908083302), + Felt::new(8797161010298072910), + Felt::new(2412100201132087248), ]), Word::new([ - Felt::new(8571221005243425262), - Felt::new(3016595589318175865), - Felt::new(13933674291329928438), - Felt::new(678640375034313072), + Felt::new(8409780526028662686), + Felt::new(214479528340808320), + Felt::new(13626616722984122219), + Felt::new(13991752159726061594), ]), Word::new([ - Felt::new(16314113978986502310), - Felt::new(14587622368743051587), - Felt::new(2808708361436818462), - Felt::new(10660517522478329440), + Felt::new(4800410126693035096), + Felt::new(8293686005479024958), + Felt::new(16849389505608627981), + Felt::new(12129312715917897796), ]), Word::new([ - Felt::new(2242391899857912644), - Felt::new(12689382052053305418), - Felt::new(235236990017815546), - Felt::new(5046143039268215739), + Felt::new(5421234586123900205), + Felt::new(9738602082989433872), + Felt::new(7017816005734536787), + Felt::new(8635896173743411073), ]), Word::new([ - Felt::new(5218076004221736204), - Felt::new(17169400568680971304), - Felt::new(8840075572473868990), - Felt::new(12382372614369863623), + Felt::new(11707446879505873182), + Felt::new(7588005580730590001), + Felt::new(4664404372972250366), + Felt::new(17613162115550587316), ]), Word::new([ - Felt::new(9783834557155203486), - Felt::new(12317263104955018849), - Felt::new(3933748931816109604), - Felt::new(1843043029836917214), + Felt::new(6991094187713033844), + Felt::new(10140064581418506488), + Felt::new(1235093741254112241), + Felt::new(16755357411831959519), ]), Word::new([ - Felt::new(14498234468286984551), - Felt::new(16837257669834682387), - Felt::new(6664141123711355107), - Felt::new(4590460158294697186), + Felt::new(18007834547781860956), + Felt::new(5262789089508245576), + Felt::new(4752286606024269423), + Felt::new(15626544383301396533), ]), Word::new([ - Felt::new(4661800562479916067), - Felt::new(11794407552792839953), - Felt::new(9037742258721863712), - Felt::new(6287820818064278819), + Felt::new(5419895278045886802), + Felt::new(10747737918518643252), + Felt::new(14861255521757514163), + Felt::new(3291029997369465426), ]), Word::new([ - Felt::new(7752693085194633729), - Felt::new(7379857372245835536), - Felt::new(9270229380648024178), - Felt::new(10638301488452560378), + Felt::new(16916426112258580265), + Felt::new(8714377345140065340), + Felt::new(14207246102129706649), + Felt::new(6226142825442954311), ]), Word::new([ - Felt::new(11542686762698783357), - Felt::new(15570714990728449027), - Felt::new(7518801014067819501), - Felt::new(12706437751337583515), + Felt::new(7320977330193495928), + Felt::new(15630435616748408136), + Felt::new(10194509925259146809), + Felt::new(15938750299626487367), ]), Word::new([ - Felt::new(9553923701032839042), - Felt::new(7281190920209838818), - Felt::new(2488477917448393955), - Felt::new(5088955350303368837), + Felt::new(9872217233988117092), + Felt::new(5336302253150565952), + Felt::new(9650742686075483437), + Felt::new(8725445618118634861), ]), Word::new([ - Felt::new(4935426252518736883), - Felt::new(12584230452580950419), - Felt::new(8762518969632303998), - Felt::new(18159875708229758073), + Felt::new(12539853708112793207), + Felt::new(10831674032088582545), + Felt::new(11090804155187202889), + Felt::new(105068293543772992), ]), Word::new([ - Felt::new(12795429638314178838), - Felt::new(14360248269767567855), - Felt::new(3819563852436765058), - Felt::new(10859123583999067291), + Felt::new(7287113073032114129), + Felt::new(6373434548664566745), + Felt::new(8097061424355177769), + Felt::new(14780666619112596652), ]), Word::new([ - Felt::new(2695742617679420093), - Felt::new(9151515850666059759), - Felt::new(15855828029180595485), - Felt::new(17190029785471463210), + Felt::new(17147873541222871127), + Felt::new(17350918081193545524), + Felt::new(5785390176806607444), + Felt::new(12480094913955467088), ]), Word::new([ - Felt::new(13205273108219124830), - Felt::new(2524898486192849221), - Felt::new(14618764355375283547), - Felt::new(10615614265042186874), + Felt::new(17273934282489765074), + Felt::new(8007352780590012415), + Felt::new(16690624932024962846), + Felt::new(8137543572359747206), ]), ]; @@ -461,38 +464,10 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPO state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] fn test_rpo_hasher_vs_hash_elements() { - // Test with empty input - let expected: [Felt; 4] = Rpo256::hash_elements::(&[]).into(); let hasher = RpoHasher::new(RpoPermutation256); - let result = hasher.hash_iter([]); - assert_eq!(result, expected, "Empty input should produce same digest"); - // Test with 4 elements (one digest worth) - let input4 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let expected: [Felt; 4] = Rpo256::hash_elements(&input4).into(); - let result = hasher.hash_iter(input4); - assert_eq!(result, expected, "4 elements should produce same digest"); - - // Test with 8 elements (exactly one rate) - let input8 = [ - Felt::new(1), - Felt::new(2), - Felt::new(3), - Felt::new(4), - Felt::new(5), - Felt::new(6), - Felt::new(7), - Felt::new(8), - ]; - let expected: [Felt; 4] = Rpo256::hash_elements(&input8).into(); - let result = hasher.hash_iter(input8); - assert_eq!(result, expected, "8 elements (one rate) should produce same digest"); - - // Test with 12 elements (more than one rate) + // Test with 8 elements (one rate) let input12 = [ Felt::new(1), Felt::new(2), @@ -502,10 +477,6 @@ mod p3_tests { Felt::new(6), Felt::new(7), Felt::new(8), - Felt::new(9), - Felt::new(10), - Felt::new(11), - Felt::new(12), ]; let expected: [Felt; 4] = Rpo256::hash_elements(&input12).into(); let result = hasher.hash_iter(input12); @@ -536,9 +507,6 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPO state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] fn test_rpo_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index 73d4d14c2..6e48f89e1 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -1,10 +1,9 @@ use super::{ - ARK1, ARK2, CAPACITY_RANGE, DIGEST_RANGE, Felt, MDS, NUM_ROUNDS, RATE_RANGE, Range, - STATE_WIDTH, Word, add_constants, add_constants_and_apply_ext_round, - add_constants_and_apply_inv_sbox, add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, - apply_sbox, + ARK1, ARK2, AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, MDS, NUM_ROUNDS, RATE_RANGE, + RATE0_RANGE, RATE1_RANGE, Range, STATE_WIDTH, Word, add_constants, + add_constants_and_apply_ext_round, add_constants_and_apply_inv_sbox, + add_constants_and_apply_sbox, apply_inv_sbox, apply_mds, apply_sbox, }; -use crate::hash::algebraic_sponge::AlgebraicSponge; #[cfg(test)] mod tests; @@ -93,17 +92,24 @@ impl Rpx256 { /// Target collision resistance level in bits. pub const COLLISION_RESISTANCE: u32 = 128; - /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for rate and - /// the remaining 4 elements are reserved for capacity. + /// Sponge state is set to 12 field elements or 768 bytes; 8 elements are reserved for the + /// rate and the remaining 4 elements are reserved for the capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The first 4-element word of the rate portion. + pub const RATE0_RANGE: Range = RATE0_RANGE; + + /// The second 4-element word of the rate portion. + pub const RATE1_RANGE: Range = RATE1_RANGE; + + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = DIGEST_RANGE; /// MDS matrix used for computing the linear layer in the (FB) and (E) rounds. @@ -337,9 +343,9 @@ use p3_symmetric::{ /// `CryptographicPermutation` traits, allowing RPX to be used within the Plonky3 ecosystem. /// /// The permutation operates on a state of 12 field elements (STATE_WIDTH = 12), with: -/// - Rate: 8 elements (positions 4-11) -/// - Capacity: 4 elements (positions 0-3) -/// - Digest output: 4 elements (positions 4-7) +/// - Rate: 8 elements (positions 0-7) +/// - Capacity: 4 elements (positions 8-11) +/// - Digest output: 4 elements (positions 0-3) #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct RpxPermutation256; @@ -351,13 +357,14 @@ impl RpxPermutation256 { /// the remaining 4 elements are reserved for capacity. pub const STATE_WIDTH: usize = STATE_WIDTH; - /// The rate portion of the state is located in elements 4 through 11 (inclusive). + /// The rate portion of the state is located in elements 0 through 7 (inclusive). pub const RATE_RANGE: Range = Rpx256::RATE_RANGE; - /// The capacity portion of the state is located in elements 0, 1, 2, and 3. + /// The capacity portion of the state is located in elements 8, 9, 10, and 11. pub const CAPACITY_RANGE: Range = Rpx256::CAPACITY_RANGE; - /// The output of the hash function can be read from state elements 4, 5, 6, and 7. + /// The output of the hash function can be read from state elements 0, 1, 2, and 3 (the first + /// word of the state). pub const DIGEST_RANGE: Range = Rpx256::DIGEST_RANGE; // RPX PERMUTATION diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs index 723179c23..fcf1ec31a 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs @@ -325,21 +325,8 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPX state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] fn test_rpx_hasher_vs_hash_elements() { - // Test with empty input - let expected: [Felt; 4] = Rpx256::hash_elements::(&[]).into(); let hasher = RpxHasher::new(RpxPermutation256); - let result = hasher.hash_iter([]); - assert_eq!(result, expected, "Empty input should produce same digest"); - - // Test with 4 elements (one digest worth) - let input4 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let expected: [Felt; 4] = Rpx256::hash_elements(&input4).into(); - let result = hasher.hash_iter(input4); - assert_eq!(result, expected, "4 elements should produce same digest"); // Test with 8 elements (exactly one rate) let input8 = [ @@ -381,9 +368,6 @@ mod p3_tests { } #[test] - #[ignore] // TODO: Re-enable after migrating RPX state layout to match Plonky3 - // Miden-crypto: capacity=[0-3], rate=[4-11] - // Plonky3: rate=[0-7], capacity=[8-11] fn test_rpx_compression_vs_merge() { let digest1 = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; let digest2 = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; diff --git a/miden-crypto/src/merkle/empty_roots.rs b/miden-crypto/src/merkle/empty_roots.rs index 5c3fe1ae4..b993b4119 100644 --- a/miden-crypto/src/merkle/empty_roots.rs +++ b/miden-crypto/src/merkle/empty_roots.rs @@ -1,6 +1,6 @@ use core::slice; -use super::{EMPTY_WORD, Felt, Word, smt::InnerNode}; +use super::{Felt, Word, smt::InnerNode}; // EMPTY NODES SUBTREES // ================================================================================================ @@ -40,1536 +40,1536 @@ impl EmptySubtreeRoots { const EMPTY_SUBTREES: [Word; 256] = [ Word::new([ - Felt::new(0xee3d94db86d48dc4), - Felt::new(0x3d13166c7aba0368), - Felt::new(0x282e861f2936aa7), - Felt::new(0xf0328a1745537b4), + Felt::new(0x7a1518d5c23cc058), + Felt::new(0x68c3009f92842fe8), + Felt::new(0xd5f1a30fb13293d2), + Felt::new(0x2cbc88b0ef345756), ]), Word::new([ - Felt::new(0x33174b312b730760), - Felt::new(0x9d1e00c5b50352b2), - Felt::new(0x16bf9ec4acef2e42), - Felt::new(0x4263877e63c4cbe7), + Felt::new(0x10192708daa40df6), + Felt::new(0xb3613b10fc0b47ee), + Felt::new(0xc95db182feebc1e5), + Felt::new(0x809d1e4bbb7c7c33), ]), Word::new([ - Felt::new(0xa8e039042672a8bc), - Felt::new(0x1010d951d941d9d4), - Felt::new(0xd3e8f0ecc866ac3b), - Felt::new(0xb2dbbbb80da232ba), + Felt::new(0xad7baa5771559881), + Felt::new(0x5de508956dd867ae), + Felt::new(0x2905c6540347266e), + Felt::new(0x40dc622dd8de98fa), ]), Word::new([ - Felt::new(0xa0d2c1a3e455f299), - Felt::new(0x648e8e13867dc8eb), - Felt::new(0xe79f94ea61189847), - Felt::new(0xb88a89e1f2765a31), + Felt::new(0xbace6cc736e6618d), + Felt::new(0x4c3dabe05eae1960), + Felt::new(0x99a1853ba5a1932e), + Felt::new(0x89ca023beb042e34), ]), Word::new([ - Felt::new(0xe168133fd9ab570d), - Felt::new(0x6fc7d0295ac5a3a2), - Felt::new(0xc973ea026e9411c), - Felt::new(0x63c29ea04552b532), + Felt::new(0x1c6e4ae9e5fc202a), + Felt::new(0x357a7ec4c1cf5318), + Felt::new(0xebf47c3fd4907657), + Felt::new(0xd8b4615d7a06584c), ]), Word::new([ - Felt::new(0x27e57ecc0f9f196), - Felt::new(0xc02f6e29fd19b059), - Felt::new(0x4a42fbc436efb0b6), - Felt::new(0xbff30574a98a1b29), + Felt::new(0x6521715bc4f45483), + Felt::new(0x2d716202b5dc0c89), + Felt::new(0x722e8ddc909837c9), + Felt::new(0x9eef9cbb233433d9), ]), Word::new([ - Felt::new(0x18c32592a4f4d0b), - Felt::new(0x6b9a08797252d5d5), - Felt::new(0xdbfe48f00a088a2), - Felt::new(0x16b4c3e485b173e3), + Felt::new(0x21a2144315f40cc9), + Felt::new(0xfad12b6052f35f53), + Felt::new(0x4f58a0263b6ac06b), + Felt::new(0x1c5a93c3e0ed3b81), ]), Word::new([ - Felt::new(0x26c8902938b831a5), - Felt::new(0x66ee91b36943f92e), - Felt::new(0x4e8deeafef9f5725), - Felt::new(0xbb35751d5dfb0a33), + Felt::new(0xe17df7b2e3f1f4fd), + Felt::new(0x78ddd43c79108b8b), + Felt::new(0xa944f62ebf53debf), + Felt::new(0xdc419e00ea1ac673), ]), Word::new([ - Felt::new(0x74af678f8e020ff4), - Felt::new(0xd4784cda0beed295), - Felt::new(0x4380949d841d793c), - Felt::new(0xdf587011d09d3bbb), + Felt::new(0x13550b71498b1593), + Felt::new(0x6ffdfe94d842999f), + Felt::new(0x17ed8a0d20f1a97a), + Felt::new(0x8470bed4ee7714fb), ]), Word::new([ - Felt::new(0xa211d1da76aaef98), - Felt::new(0xd904ccc6435e268), - Felt::new(0x1c6f16a5d03b8416), - Felt::new(0x87800f7f5da9c93), + Felt::new(0xca8c0f221d45e21c), + Felt::new(0xab7ec8a17338a271), + Felt::new(0x198d2c572ad44b73), + Felt::new(0x97fb2d5d68366dfe), ]), Word::new([ - Felt::new(0xa00bbad0a52adeff), - Felt::new(0xe22179c651da9d76), - Felt::new(0x474f10493a3723f4), - Felt::new(0x84397e6bd34a1f5b), + Felt::new(0xb227f02eca29f805), + Felt::new(0xf481fa56981769e8), + Felt::new(0xe5e143a48c597276), + Felt::new(0x882fd1e2a743442), ]), Word::new([ - Felt::new(0xe8f440afef4d082b), - Felt::new(0x14fff8e329613cc9), - Felt::new(0x78e984bc8b40f4f1), - Felt::new(0x6ed8f02e5be1bab2), + Felt::new(0xfadcfe0374b44556), + Felt::new(0x43a3da6902312ed1), + Felt::new(0x2900f9e01835eac8), + Felt::new(0x2830bc4d5a08631b), ]), Word::new([ - Felt::new(0xda824edf085b5f9f), - Felt::new(0xc8a8f1c1b86d349e), - Felt::new(0xe1bf6975afb7b2de), - Felt::new(0xd7df51ea51028489), + Felt::new(0x6e425eaeaf389630), + Felt::new(0x8060635d9c8d40bd), + Felt::new(0x782055fcc4027bab), + Felt::new(0x1cd8f421713d0039), ]), Word::new([ - Felt::new(0xf64873d31456de99), - Felt::new(0x1fc9cb920b6c72b), - Felt::new(0x96613d9d71af4373), - Felt::new(0x61d607eb097e76c9), + Felt::new(0x7bba2a234f88e315), + Felt::new(0xcd615c602b5fe2cd), + Felt::new(0x5a9e081b1af5d7fa), + Felt::new(0xecfa1e7751d9919), ]), Word::new([ - Felt::new(0xca304d2b3b778719), - Felt::new(0xa54d8602f37eed39), - Felt::new(0xb4574db6dc09bcf2), - Felt::new(0x5e42cd4f1de9587c), + Felt::new(0xac2565372049b11), + Felt::new(0x1399af9f36718fdb), + Felt::new(0x86e0730595695b77), + Felt::new(0xce24042e52ea8f72), ]), Word::new([ - Felt::new(0x17575dfa689d8a07), - Felt::new(0x1db9d374d7436444), - Felt::new(0x21d1e8dca296f38d), - Felt::new(0xbc4aad43a9d93f54), + Felt::new(0x31a44240c5ea1596), + Felt::new(0x6ac2462879567985), + Felt::new(0xc5dff2fa6e4bf9ed), + Felt::new(0x109baf62f5656431), ]), Word::new([ - Felt::new(0x9fa0697330c054cd), - Felt::new(0xd5d57fbf059452e8), - Felt::new(0xe848fafb1c43414c), - Felt::new(0xacb7754fd77c9d52), + Felt::new(0xc0a1d9643a789711), + Felt::new(0x287754605bb44336), + Felt::new(0x96e143926e6b05a7), + Felt::new(0x27896b88297f95fe), ]), Word::new([ - Felt::new(0x406af89b918e596c), - Felt::new(0xb735a2c588ee87df), - Felt::new(0xb40ff1dd1c3c6599), - Felt::new(0x675a582b4c8a68ac), + Felt::new(0x68bf7a3147fe7190), + Felt::new(0xad11cc1491d94621), + Felt::new(0x1c5684427eb041d3), + Felt::new(0xd2cd7f76c89ed840), ]), Word::new([ - Felt::new(0x530ff6be0c86a2f6), - Felt::new(0x5541fabfefd34c91), - Felt::new(0x4af1579d212149ae), - Felt::new(0x23962b7df862f27c), + Felt::new(0xd227c79d40d38aa0), + Felt::new(0xde50cadec8a7f9e8), + Felt::new(0x1966a4fabc12be53), + Felt::new(0x2cc1aec4bf8eb07a), ]), Word::new([ - Felt::new(0x1676b694f41cfc0d), - Felt::new(0x59b165ea5f354fd8), - Felt::new(0x5b45ee14e2501f08), - Felt::new(0xd0c8ca7bc2e01e18), + Felt::new(0x215ee19f91f3b3c), + Felt::new(0xa431547dc8268b58), + Felt::new(0x2a0d094750f517b7), + Felt::new(0x1bed221ea2d85b43), ]), Word::new([ - Felt::new(0x2cff5d1e629ddc7b), - Felt::new(0x5062be34e4351fe), - Felt::new(0xfd76495b9d8ea67), - Felt::new(0xb96453b1c8060ca8), + Felt::new(0x3cdc78415946c8a5), + Felt::new(0x5f907795364f886a), + Felt::new(0xcda1dc461e842b0a), + Felt::new(0x713eef642ca36a92), ]), Word::new([ - Felt::new(0x860b00517d3de1ef), - Felt::new(0xd609c82af07b9dad), - Felt::new(0xa54a528b8f1cbddc), - Felt::new(0xb4fff658ed97e635), + Felt::new(0x53f883132cfd1fc3), + Felt::new(0xed640e5ed33c0033), + Felt::new(0xcb2403903bfcc4a7), + Felt::new(0xfddb8e4711c089c7), ]), Word::new([ - Felt::new(0xd002cea8f347c347), - Felt::new(0xa135cebffdf3ec10), - Felt::new(0xb0200ea08da2cef4), - Felt::new(0x4e6f2f75d627b137), + Felt::new(0xbc76a3d22dc4a6a3), + Felt::new(0xc5132a2358773b7b), + Felt::new(0x160effcc8acea428), + Felt::new(0xc7e8567ab4eb5d75), ]), Word::new([ - Felt::new(0xc1983ce677cabbf4), - Felt::new(0x58f0143480f44788), - Felt::new(0xf8c23e4f84b6c6c1), - Felt::new(0xc9ce41371c4900b8), + Felt::new(0x6227233a672c4d53), + Felt::new(0x7021cea1e48eeef0), + Felt::new(0xeddedec3ef0be480), + Felt::new(0xa12e79c58f0f5195), ]), Word::new([ - Felt::new(0x837d99979bc9a5e6), - Felt::new(0x7621559aa4af175a), - Felt::new(0x6986737347c799c2), - Felt::new(0x8cee99eb47c3e702), + Felt::new(0x968638ed9f01e885), + Felt::new(0xffea5aba5916bc0), + Felt::new(0x839a8aed3e4a4d4a), + Felt::new(0xcc8ced80d6d55b30), ]), Word::new([ - Felt::new(0x42e17ba02508a41f), - Felt::new(0xb95e349bd55ba61f), - Felt::new(0xcc2bfeb29c4c68b2), - Felt::new(0xf268f57860a446b1), + Felt::new(0x420f83d6ff9afeb6), + Felt::new(0x8175237f0a60471d), + Felt::new(0xd2e50161a05523c0), + Felt::new(0x58758141d44bb085), ]), Word::new([ - Felt::new(0xd3ffd4ccc6dda508), - Felt::new(0x81db1910ef04ca07), - Felt::new(0x5c698ee6c3aeab97), - Felt::new(0x2ac1e2c2c5f237de), + Felt::new(0x8f6c9d38bcd56c06), + Felt::new(0x5d76e879f318dbb), + Felt::new(0x63824a7a2d1e847e), + Felt::new(0x157a7b7cd42546a0), ]), Word::new([ - Felt::new(0x1f42a1ef25bd0aad), - Felt::new(0x81b0f63e2760b8db), - Felt::new(0xe9607c7061b018f9), - Felt::new(0xf02a88202294a700), + Felt::new(0x7b09646224c1fe2e), + Felt::new(0xa382a27d974d9aa8), + Felt::new(0xff220f696f8bb528), + Felt::new(0x1abc61b6597dc6c5), ]), Word::new([ - Felt::new(0xea5da09b39b60468), - Felt::new(0xe48ea41d94fe91a7), - Felt::new(0x24dde954ce08b32b), - Felt::new(0xe1bb6e41bd0613e6), + Felt::new(0x2288f10b538108f5), + Felt::new(0x6ae6919992381a06), + Felt::new(0xfb2ff6c6d7a95519), + Felt::new(0x90da6d7a159eab68), ]), Word::new([ - Felt::new(0xc5e9f7188b43a24f), - Felt::new(0x8d7132abc9d901e4), - Felt::new(0xdc09a33ff4d0eb03), - Felt::new(0xa119bb1db594b4cf), + Felt::new(0x8396e3f3e4411a3e), + Felt::new(0x8a7a5d5c8d5b9453), + Felt::new(0xb74a5105cb6340d3), + Felt::new(0xef3a0ed14f6349fb), ]), Word::new([ - Felt::new(0x589002afcbd4a233), - Felt::new(0xe4eae44d3c2a308d), - Felt::new(0x8bc0bca14b6b4dde), - Felt::new(0x3716e0e86a7aaa6c), + Felt::new(0x19661575d6f57881), + Felt::new(0x3979a60e79d44f7c), + Felt::new(0x6bfb0808c2a0170e), + Felt::new(0x63e20a4286bb3f0f), ]), Word::new([ - Felt::new(0xaa4ba9602230007e), - Felt::new(0x2b2c3e14b888a3d4), - Felt::new(0x90a36fb42ec2ba19), - Felt::new(0x2e07ef26b078c4a7), + Felt::new(0xe9b45b0e8461467), + Felt::new(0x49df3dc7fe793402), + Felt::new(0x9b77b3d339e4e9d4), + Felt::new(0x51da4e29d3f43dba), ]), Word::new([ - Felt::new(0x32307da7aad33113), - Felt::new(0x343ed87928b9ab0c), - Felt::new(0x1c01d79482c021f0), - Felt::new(0x6f866afccc595439), + Felt::new(0xe70a0e47287d6ea1), + Felt::new(0x8ecbdce5ed4904e1), + Felt::new(0x48a8d45f3fb7bfe9), + Felt::new(0x303b724ed4de6599), ]), Word::new([ - Felt::new(0x9780804b58b0d066), - Felt::new(0x1329929c6dc19c09), - Felt::new(0xc04add06dbaef6bf), - Felt::new(0xf494a28db17c5c4), + Felt::new(0x11e1af5bdbb1dd3c), + Felt::new(0xd623d0a0e66efba3), + Felt::new(0x820e7f8c20355f29), + Felt::new(0xd14d6d3907f79f54), ]), Word::new([ - Felt::new(0xe9dbb1c64d55571f), - Felt::new(0x663f0f716f28734), - Felt::new(0x7285fd4b8e87a78c), - Felt::new(0x2e152a4595b7597e), + Felt::new(0x264792bb76d1c6c7), + Felt::new(0xe2982176db15e281), + Felt::new(0x8e563c0ffd9cf26f), + Felt::new(0xb84d656d2098fb2c), ]), Word::new([ - Felt::new(0x5531fabfa5960807), - Felt::new(0x8afe79be96d903a4), - Felt::new(0x24321cce4f1942f8), - Felt::new(0xb1829ec9d60aac8f), + Felt::new(0xb4b65da1a2f37ac1), + Felt::new(0x8ce542279c62b719), + Felt::new(0x2bb44a38cd28334), + Felt::new(0x3460af36ee05e6a4), ]), Word::new([ - Felt::new(0x9f7afc6634a82d1), - Felt::new(0x496e26bc17af352b), - Felt::new(0x8216f090e1d13381), - Felt::new(0x610cf5a3b3e190f9), + Felt::new(0xd0c6531207ed16da), + Felt::new(0x65b14c94e53348ca), + Felt::new(0xb146aa53607084ed), + Felt::new(0x1be4eed9b6ae4de7), ]), Word::new([ - Felt::new(0xb5f8c141a9acd007), - Felt::new(0x4430345ace970576), - Felt::new(0x64d97e5533db3170), - Felt::new(0x95c016d769b0fc2d), + Felt::new(0x63a3380d1a006c75), + Felt::new(0xa739bf6245222179), + Felt::new(0x13df3fe01a95dd79), + Felt::new(0xcb589a58b4375231), ]), Word::new([ - Felt::new(0x88820d6a7ba5a94a), - Felt::new(0x27b614d79eb7b30b), - Felt::new(0xff2751e904085d5f), - Felt::new(0x752509a0860b37d), + Felt::new(0x275515c40097d89b), + Felt::new(0x464331cfc86aaf76), + Felt::new(0x2d69a8c1271cc1c9), + Felt::new(0x9f135fa326f0a170), ]), Word::new([ - Felt::new(0x1070bc84bb53a855), - Felt::new(0x1edad3d5da84e59b), - Felt::new(0x8efd48a13e4dfe0d), - Felt::new(0x3ab20af6203aba62), + Felt::new(0x330774dff4622a45), + Felt::new(0xdab997e374e73361), + Felt::new(0x722fd5d7b681296b), + Felt::new(0x652d9ac7fb305ca1), ]), Word::new([ - Felt::new(0xb4d6d3cc85438d08), - Felt::new(0x5592639fb2792724), - Felt::new(0x5939996ea4c52176), - Felt::new(0xaa83a79236367ee7), + Felt::new(0x8ac8a548fa2901b2), + Felt::new(0xe5939b720a40e027), + Felt::new(0xe1c12b4143f08e7), + Felt::new(0x47181ac3bbfe7c55), ]), Word::new([ - Felt::new(0x4c08ac735aa1925a), - Felt::new(0x84951e177ac84e86), - Felt::new(0xd5b2657778d3271a), - Felt::new(0x375f75333654a77c), + Felt::new(0x75f1101119bd9132), + Felt::new(0x48061d0a7e02ff4f), + Felt::new(0x87321a2bb298fa5), + Felt::new(0xaa9e0199e75a8b88), ]), Word::new([ - Felt::new(0x2fcbd8fcd125e5), - Felt::new(0xd8f711ed1b369d43), - Felt::new(0x9688301695b6bcd4), - Felt::new(0x52a010319401179), + Felt::new(0x203e8caee818bbe7), + Felt::new(0x54ec39e86e3bfc74), + Felt::new(0x37a6a845c6b64b5a), + Felt::new(0xd18931d1b800606c), ]), Word::new([ - Felt::new(0x1c67f8fde4c9c070), - Felt::new(0x438ccdf9d82b3a3f), - Felt::new(0xb9324515d5547ff5), - Felt::new(0x85ff37504c8230f0), + Felt::new(0x57e03388213c8b13), + Felt::new(0x47f26439d9764d57), + Felt::new(0xee8b0e6683b76e4d), + Felt::new(0x9d732634cb929b4d), ]), Word::new([ - Felt::new(0xcf8b6fabda4621f3), - Felt::new(0x1df94bb4ea8aeb6d), - Felt::new(0x8efffb7e8996b9e5), - Felt::new(0xa9aef575e8a86c4d), + Felt::new(0x6e22ad3534c01591), + Felt::new(0x2c54132d486f7026), + Felt::new(0x8efa48a4071e3403), + Felt::new(0x9949b817da0f2395), ]), Word::new([ - Felt::new(0x6e20862a64baaaef), - Felt::new(0xc54fbbfa034d6f1b), - Felt::new(0x16d9fd099f5bba71), - Felt::new(0xe4ac4cf3186fae83), + Felt::new(0x48415b26c3ff6633), + Felt::new(0xa3e301f4a2512c0), + Felt::new(0x45223bfb0ea9933f), + Felt::new(0x704bf93dfdb84760), ]), Word::new([ - Felt::new(0x12914625293d7f84), - Felt::new(0xd3b46add4f77be8), - Felt::new(0xaac8846e6eeb9acd), - Felt::new(0xab6a69452b4b167b), + Felt::new(0x18c8d36aca06d30a), + Felt::new(0x599733c783e95db0), + Felt::new(0x47d6e190eae194d9), + Felt::new(0x9bceba0c6f764cef), ]), Word::new([ - Felt::new(0x69652e812cdfe03d), - Felt::new(0x22731622b139de96), - Felt::new(0xd7226e9a887f368d), - Felt::new(0xe9bbf6ad8f51ee13), + Felt::new(0x90617f8240949645), + Felt::new(0xe0a01888d04566a7), + Felt::new(0xc413a63dc2e5b2a7), + Felt::new(0x4b5df8cbc7de8b0a), ]), Word::new([ - Felt::new(0xc39a01964af141d7), - Felt::new(0xb5ab2062263dcaa2), - Felt::new(0x1d7fbcd9204cbd34), - Felt::new(0xd48c517d5543c163), + Felt::new(0xe35b06d63cef6c26), + Felt::new(0xb9f9bb36756e258), + Felt::new(0xb46751fdf68f1f85), + Felt::new(0x95b95fd16bc2e91e), ]), Word::new([ - Felt::new(0x44118fda0c2b4af2), - Felt::new(0x487d307ce7444bb2), - Felt::new(0x171b7c6a17d734b2), - Felt::new(0xd9a737ddf65949d9), + Felt::new(0x5d70054d30c0bc16), + Felt::new(0xec83cbed7d84059d), + Felt::new(0x589fa4f1fb83a737), + Felt::new(0x704ba66a12a7cb82), ]), Word::new([ - Felt::new(0xc2cdc1b940450fec), - Felt::new(0x29864b9632eff0cd), - Felt::new(0x9ae31f150850e78c), - Felt::new(0xf9f9d0ef1092be87), + Felt::new(0xccd71b6ac807031f), + Felt::new(0x27c6d6972ca2f038), + Felt::new(0x15f7b976b1a83b6a), + Felt::new(0x2fc2021f31eda8e8), ]), Word::new([ - Felt::new(0x1703dd34002f3862), - Felt::new(0xf04b44446be81ea1), - Felt::new(0x8da51598849beb99), - Felt::new(0x8112e155f7f856a0), + Felt::new(0x5b83a427101b26d1), + Felt::new(0xe228ce6616b91449), + Felt::new(0x6dd910afce37d26a), + Felt::new(0xd5a859060e53feba), ]), Word::new([ - Felt::new(0x3d4da8351f41dc1c), - Felt::new(0x682e55817f56f30b), - Felt::new(0xf20cc7fe5b98b951), - Felt::new(0x8297d3de042785d4), + Felt::new(0x2ec1ebe8d98ab168), + Felt::new(0x84940081d4b37e6a), + Felt::new(0xb5abbe477682d673), + Felt::new(0xb6e35a3f33737ce5), ]), Word::new([ - Felt::new(0x1f9d07a435a6d13e), - Felt::new(0x789a1330825c199a), - Felt::new(0x6e058e9dbc30f3a0), - Felt::new(0xb09be46b59290984), + Felt::new(0x1f81bb8e5d9b6775), + Felt::new(0x2041277fe91d6647), + Felt::new(0x9f33bcba3329e05), + Felt::new(0x2ab1e65fd5a966e), ]), Word::new([ - Felt::new(0xaf2d49c9a3975d21), - Felt::new(0xebd4d399fc30a751), - Felt::new(0x224a3884ca353e5d), - Felt::new(0xbebba344bbe055a7), + Felt::new(0x33bc5fb208fa395e), + Felt::new(0x5410fc2bf42413d4), + Felt::new(0xe1ad110a80d22fd), + Felt::new(0xa2054e3a0d379015), ]), Word::new([ - Felt::new(0xdf576dc16b0abc3f), - Felt::new(0x40439af403c36338), - Felt::new(0x317b1f2308849c53), - Felt::new(0x91e5c9d14107cb04), + Felt::new(0x9699cc4fdfd42834), + Felt::new(0xa76f357aad26bd8e), + Felt::new(0x7f53ea51859546da), + Felt::new(0xc6cf1c173bfe674d), ]), Word::new([ - Felt::new(0x93af916aa15f97e2), - Felt::new(0x50d4aec3e408fba7), - Felt::new(0xd16bd5f71b6d6915), - Felt::new(0x27b96db871be03ef), + Felt::new(0xa6ed91e61e570a03), + Felt::new(0xddd8836d1bcf7a1b), + Felt::new(0x151fa005c6cbec3e), + Felt::new(0x5a6b90196b04c5e), ]), Word::new([ - Felt::new(0x72fce6dd7d54e348), - Felt::new(0x632a2e8b6177c670), - Felt::new(0xefd897bebdc4ec2b), - Felt::new(0xfe66bfe440033790), + Felt::new(0xa1384b20e2f7f0e0), + Felt::new(0x5997839cc1485d52), + Felt::new(0x764262542d2ce276), + Felt::new(0xbb5ce0fc148f2f8), ]), Word::new([ - Felt::new(0xc581364aef408d6a), - Felt::new(0xfcc7efb35cccae32), - Felt::new(0xee0a97dded065fbf), - Felt::new(0x2b1eb2c45fd0e633), + Felt::new(0xcf58de7ecc74b7d0), + Felt::new(0x2d05d90f8f89a003), + Felt::new(0x140c36afde7a8503), + Felt::new(0x2c85492253719879), ]), Word::new([ - Felt::new(0x9e460e8159152a88), - Felt::new(0xcc5a2946f03bf507), - Felt::new(0x95535e9cf29e4ab9), - Felt::new(0x29b23d31ffe6df18), + Felt::new(0xc43f9d1075e50eb5), + Felt::new(0x21a4177440ee0514), + Felt::new(0x6556ffb110aee068), + Felt::new(0x5c4ac4233182eed8), ]), Word::new([ - Felt::new(0xbae2c405d8ba715d), - Felt::new(0xb886f0545ae16153), - Felt::new(0x728d5965a4cdfc0b), - Felt::new(0x86bd552048f3ebc4), + Felt::new(0xd161b6f2ba6083eb), + Felt::new(0xf9ca3dff0f55b7b0), + Felt::new(0xea722afc3a4ca67c), + Felt::new(0xfa69b06dd2793839), ]), Word::new([ - Felt::new(0x3a4c6dbaa6feda93), - Felt::new(0x8a32917885a3f22c), - Felt::new(0xd6016ba7fc1a0717), - Felt::new(0x3bfd41569497b156), + Felt::new(0x49937dceddf01780), + Felt::new(0xd0923d2e8faf74c4), + Felt::new(0x820f1991402fc8a8), + Felt::new(0x67a2d055ea1f777c), ]), Word::new([ - Felt::new(0xa907fad371653f15), - Felt::new(0x6be9ce6ac746f5bc), - Felt::new(0x1bee5ac8750d2444), - Felt::new(0x16050d83d4f7a90c), + Felt::new(0xc39ffe45524b9e65), + Felt::new(0x956a2ac4ff4c63bb), + Felt::new(0x93eeccaea6136bb2), + Felt::new(0x7b88b7f2852ed69b), ]), Word::new([ - Felt::new(0x4b194182aa7e9324), - Felt::new(0x813af49c845cea5e), - Felt::new(0x6886f4d8628bab16), - Felt::new(0xe3b6ef1419e2432c), + Felt::new(0x7ebf64a852d49f4c), + Felt::new(0x5d2f34df27b34c2b), + Felt::new(0xd82dd65960331467), + Felt::new(0x7ee8a1c82f2775ba), ]), Word::new([ - Felt::new(0x3edc103de28f1fac), - Felt::new(0xb6a05b8802d6ed5c), - Felt::new(0xf320c3f130a175c8), - Felt::new(0x326c8bb02f9a51f6), + Felt::new(0x341eef38eb1b44b0), + Felt::new(0x11e89c557152d8d7), + Felt::new(0xd298bf05bcfe7f29), + Felt::new(0xb6ab5d0889a6a990), ]), Word::new([ - Felt::new(0x5b1ac27a49b5d1da), - Felt::new(0x9e1fa75b04da7545), - Felt::new(0x9a522396a1cd68af), - Felt::new(0x91a4d435f3fcd43f), + Felt::new(0x9d0e247831447b45), + Felt::new(0xb9b37f61a359984e), + Felt::new(0x35acfcf2065910a1), + Felt::new(0x39ed68f475187cd6), ]), Word::new([ - Felt::new(0x318ac5d8f1e489ce), - Felt::new(0x339e7a0b2aec5843), - Felt::new(0x38f15bf9832a2c28), - Felt::new(0x5e3fef94216f72f1), + Felt::new(0x3fac499e38fc1c4f), + Felt::new(0xac5f1f88b4c0b263), + Felt::new(0x8ae162b1de7dd0e9), + Felt::new(0x695b42060377397c), ]), Word::new([ - Felt::new(0xc43e0723d2a7e79c), - Felt::new(0xa06167cc0ebdf1e5), - Felt::new(0xe62f10089af57ba6), - Felt::new(0x838c863d60b859a2), + Felt::new(0xbd58816e80b1327), + Felt::new(0x7c6f6ececda432bc), + Felt::new(0x8a5806e14c3af9fe), + Felt::new(0x6d49dacfbb83465b), ]), Word::new([ - Felt::new(0xd10456af5f30e5d5), - Felt::new(0x235df7fe21fb912c), - Felt::new(0xe5acc29d13d80779), - Felt::new(0x580b83247a1f6524), + Felt::new(0xf6015087f3a73253), + Felt::new(0x175d591b6e76f2cc), + Felt::new(0x7bec8218e9320dd1), + Felt::new(0x7d31b42b1ce3ab16), ]), Word::new([ - Felt::new(0x2a8b1bf7e9bc5675), - Felt::new(0x9e523f2d659a3e30), - Felt::new(0x3ecfdb1615666b74), - Felt::new(0xf53746b86fedee7f), + Felt::new(0xf0c9e338add8f04d), + Felt::new(0xf2dc1dae4ddae881), + Felt::new(0xa2fcda9b1106379e), + Felt::new(0x5a0de26644862d15), ]), Word::new([ - Felt::new(0xa12095b3b22680a9), - Felt::new(0x3010ad751585161d), - Felt::new(0xfb9c0ea33c7437b2), - Felt::new(0x9225d8151ec724a8), + Felt::new(0xb5c03bd3c6896148), + Felt::new(0xfe7a36bfa33c147a), + Felt::new(0x729e44eed48564a8), + Felt::new(0x22cf77310aa13eee), ]), Word::new([ - Felt::new(0x1b09eac8ad815107), - Felt::new(0x33cb241ad41b562d), - Felt::new(0xa04f457b4cd1ece9), - Felt::new(0x84f27a45985d700e), + Felt::new(0x9772b44487c3cd80), + Felt::new(0xc669f2622ac9ca43), + Felt::new(0x942fc94dad4a902e), + Felt::new(0x3f89e3b19deb8c97), ]), Word::new([ - Felt::new(0xe5598d92d1507185), - Felt::new(0x84aa2bf7d87a26e8), - Felt::new(0x158f0e13550dec2a), - Felt::new(0x54d699e5eb65ee63), + Felt::new(0x48485ad32a4c0f96), + Felt::new(0x5613169c77f1b833), + Felt::new(0x25472149c26b0004), + Felt::new(0x63d85088841a9ee8), ]), Word::new([ - Felt::new(0x902e89f122f8f8f7), - Felt::new(0xc2da7127af8c699a), - Felt::new(0x75762e75b77a1662), - Felt::new(0x7e683b3c116af130), + Felt::new(0x7f25634b7a87282d), + Felt::new(0x834e1d48d1253c1d), + Felt::new(0x727e328428579bbc), + Felt::new(0x7ca91d98d4a1bf3c), ]), Word::new([ - Felt::new(0xabc2aa2ecd2316dd), - Felt::new(0x44558fa721857f00), - Felt::new(0xf61dd475fdbc23d0), - Felt::new(0x22ba84332065a9e8), + Felt::new(0x8094a778288c8003), + Felt::new(0xf8696b015bd1d989), + Felt::new(0x987f8a6c08926e30), + Felt::new(0xf2e59da44b90b561), ]), Word::new([ - Felt::new(0x5aa94e045e4bb7ae), - Felt::new(0xf6ddadbdd8747728), - Felt::new(0xeeab65efab2a1d2), - Felt::new(0xd12cc579c49b9db5), + Felt::new(0xbe0f3a746cdbdc00), + Felt::new(0x5680d157e1c756fc), + Felt::new(0x59399408affa9b63), + Felt::new(0x8b226544c63fc2a1), ]), Word::new([ - Felt::new(0x71ea68262a73196a), - Felt::new(0x9612483af09f1bde), - Felt::new(0x7fe5fd69bbf241a4), - Felt::new(0x34de27c57b37975d), + Felt::new(0x1b03f4daa6c14153), + Felt::new(0xcaf37c5daad9a5a8), + Felt::new(0xedf3f3cf082b0a1), + Felt::new(0x7bb50256590e6865), ]), Word::new([ - Felt::new(0xf29bc8ba140714f6), - Felt::new(0xf0b44caca4f6561e), - Felt::new(0x742695d702446774), - Felt::new(0x7e1437b52ee16c0c), + Felt::new(0x684ed80902ec623c), + Felt::new(0x9bb72a38cfd2ef85), + Felt::new(0x4e430aacabcf36a9), + Felt::new(0xb92c1d0058aab97a), ]), Word::new([ - Felt::new(0x13f6180493eaa129), - Felt::new(0x8fa2e77f499c911c), - Felt::new(0x1223e5ccda975bf), - Felt::new(0xc2a362e5449eac8b), + Felt::new(0x583f0f6c7a070004), + Felt::new(0x79ff8256f4b8502a), + Felt::new(0xf526e258a8562a7e), + Felt::new(0x61968b703bd4e7cc), ]), Word::new([ - Felt::new(0xcf1254ec733c8fb0), - Felt::new(0x34359ae1e2272fc9), - Felt::new(0xce928a65262d59d5), - Felt::new(0xc84e1f72e2e78101), + Felt::new(0x518358593f4db560), + Felt::new(0xdb403bba6c33d816), + Felt::new(0x9f4ddc99df045703), + Felt::new(0x92aa4f28f2824faf), ]), Word::new([ - Felt::new(0x8841b659676a2df5), - Felt::new(0x4c808c965135ff8f), - Felt::new(0x374d574fd96ee7d1), - Felt::new(0xa0ae0e5765bc8716), + Felt::new(0x22bb678fbb6ea5f4), + Felt::new(0xf94dddeaf2e4ec8a), + Felt::new(0x54da9c720acfd54b), + Felt::new(0xada06e412b00a686), ]), Word::new([ - Felt::new(0xba3692cf34a6eb7a), - Felt::new(0x384dce8b1fd8fcd5), - Felt::new(0x248f1c83f6cf6055), - Felt::new(0xbf50ca14b3c5b022), + Felt::new(0xa1618e51012a9c5e), + Felt::new(0xa15f5b55de9259d9), + Felt::new(0x618e763dc2525b88), + Felt::new(0x8e835e132a5ac557), ]), Word::new([ - Felt::new(0x18611824fa468341), - Felt::new(0xaab4187ff224ec04), - Felt::new(0x4ad742d8a070d084), - Felt::new(0xfa3bb42df7d86480), + Felt::new(0xef5f289ff8fa900d), + Felt::new(0x9cc1221cebc531a9), + Felt::new(0x47609f2d3797ff59), + Felt::new(0x9ff11778bd6f382b), ]), Word::new([ - Felt::new(0x2ab25bf43fc462b5), - Felt::new(0x6ac0cc243f54b796), - Felt::new(0x2401eabf391a2199), - Felt::new(0x62a71dae211b983), + Felt::new(0x2b34581141c1e8c2), + Felt::new(0x2257c1ce6c15034b), + Felt::new(0xc43eb451d891272), + Felt::new(0x28c2d8cda0d777d7), ]), Word::new([ - Felt::new(0xbc5e568df9f18772), - Felt::new(0xee864850b75a99ba), - Felt::new(0x2a53e3e6776ae456), - Felt::new(0x8eb51bedbe483d7c), + Felt::new(0xe4afdafd0f672a82), + Felt::new(0x9341ac68032a3f58), + Felt::new(0xbe8d67ddf9cfc529), + Felt::new(0x27b3ccb1bac459f3), ]), Word::new([ - Felt::new(0xce8161f4c705bfbb), - Felt::new(0xf1071a4e343a37e9), - Felt::new(0xddc4878a9e5de00f), - Felt::new(0xee33d737cd3c5dc8), + Felt::new(0x9388197772683085), + Felt::new(0x3778f785db5104f2), + Felt::new(0x9ba77ce1b812d2b3), + Felt::new(0xd5d85d366fba18e), ]), Word::new([ - Felt::new(0x9eadd43aebfcd43d), - Felt::new(0xf35cec43429c0a95), - Felt::new(0xcad253fc16b63e5a), - Felt::new(0xea25dc9baaf21d38), + Felt::new(0xe614624c3de46b54), + Felt::new(0x98438853a5f8e423), + Felt::new(0x75fc1975efa50e2e), + Felt::new(0x7b3bc747fe7d9ef5), ]), Word::new([ - Felt::new(0xa85a87fbf220f449), - Felt::new(0x1db1c09109882161), - Felt::new(0xab5139cb30eb2c88), - Felt::new(0xe62f2ade31d95b14), + Felt::new(0x4389e290ab7be5de), + Felt::new(0xb0f8ae1bdfe7a503), + Felt::new(0x4a0bba5e50d04a4f), + Felt::new(0xf404eeb6b51c2105), ]), Word::new([ - Felt::new(0xad3fae6f7f635376), - Felt::new(0x21e5dba9b8e21ac8), - Felt::new(0x86506eeeba6c7151), - Felt::new(0x6bf71fdffc8d9ae7), + Felt::new(0xc35f756e305c9519), + Felt::new(0x4e686fe3acc002a3), + Felt::new(0xac394c30603412b8), + Felt::new(0x18be6e6b58ef489), ]), Word::new([ - Felt::new(0x37ec52a9396f4574), - Felt::new(0xf19404a514aa9285), - Felt::new(0x3ed5ae669769c4e7), - Felt::new(0x2286b493b85c9481), + Felt::new(0xf29ba52464444de2), + Felt::new(0x727389ba7a8880a), + Felt::new(0x177fb574915927fb), + Felt::new(0x8f73e16ebb2cc82a), ]), Word::new([ - Felt::new(0xc37fc37b83940bd2), - Felt::new(0xe3d67417540b620b), - Felt::new(0x1495f7a7848dde0a), - Felt::new(0xeaf4f9c053465ff), + Felt::new(0x997851ba4388feab), + Felt::new(0x8e2a5f7d9ac44c9d), + Felt::new(0x8a3cb20c8e7e8c74), + Felt::new(0x5ae3eee7da848df7), ]), Word::new([ - Felt::new(0x80131752569df8f0), - Felt::new(0x30720a862b82f732), - Felt::new(0xabed5fb95dbe678b), - Felt::new(0x6cf7da37075ad45e), + Felt::new(0x6d45c2cdad589122), + Felt::new(0xced0a31ff9c64e3e), + Felt::new(0x98b60b642b30fa4a), + Felt::new(0x90be60523065a966), ]), Word::new([ - Felt::new(0xa318ea66909473fe), - Felt::new(0x4a6c6ebc4bee8b3c), - Felt::new(0xf0d622f04ce1b02e), - Felt::new(0x92c2f8e192c000a1), + Felt::new(0xc5469bc4f00a8b98), + Felt::new(0xfea50c983bad6953), + Felt::new(0x77a1f18d385da1cf), + Felt::new(0x78258773d7497a4c), ]), Word::new([ - Felt::new(0xb39d728756dca017), - Felt::new(0x4f66acee5bcd7d98), - Felt::new(0xf623331bed29e125), - Felt::new(0xbcfc777f0eb03793), + Felt::new(0xbe1ba2a05855dba2), + Felt::new(0xd25b3fbd2aeff508), + Felt::new(0xa21fba1bed1ec4d), + Felt::new(0x28dd25121e82491b), ]), Word::new([ - Felt::new(0x6cdabd98e067b039), - Felt::new(0xd6356a27c3df3ddc), - Felt::new(0xd5afb88820db9d2f), - Felt::new(0x8203a7adfa667bfc), + Felt::new(0x26ebaf1a66aa491a), + Felt::new(0x11d70f7351ee6327), + Felt::new(0xf535e89e7a333f31), + Felt::new(0x81f0540d0aaf2fcd), ]), Word::new([ - Felt::new(0x1ddef8e482da50e0), - Felt::new(0x7fa3c9c0865609ec), - Felt::new(0x6ca762886d4d6227), - Felt::new(0x9a95160f2a4fe5d9), + Felt::new(0xeaa63a84b49f9af3), + Felt::new(0x2b560a1b9e2f030d), + Felt::new(0xa8058c8c80d5122f), + Felt::new(0xa7d5eb61056af830), ]), Word::new([ - Felt::new(0x607230c3b366dbd5), - Felt::new(0x5b996a7d876b7602), - Felt::new(0xf61df5d15469c8ea), - Felt::new(0x9bb4f5c06ac49403), + Felt::new(0x93f61b54d7c8b14f), + Felt::new(0xa05e12137fbee56f), + Felt::new(0xed0ca87839d2afbc), + Felt::new(0xee1d0c89603096c9), ]), Word::new([ - Felt::new(0x6a27c9e7082595e7), - Felt::new(0xbf93eb89e2090438), - Felt::new(0xd2db18139bedc636), - Felt::new(0x79710c33a1f1f612), + Felt::new(0xd32f7fd432f7c926), + Felt::new(0x9a10ef3aedd9c5cc), + Felt::new(0x987ff803b8ad5608), + Felt::new(0xfe0474bb58ed017d), ]), Word::new([ - Felt::new(0xf54e4461aa09608b), - Felt::new(0x898a7b52804d88c9), - Felt::new(0xbc548fab0257ea25), - Felt::new(0xe783017a62b49474), + Felt::new(0x730b984ab280d1eb), + Felt::new(0x59a4121bb947dd5d), + Felt::new(0xcf3a0ce3778acbad), + Felt::new(0x5db9a2dcb6f5168c), ]), Word::new([ - Felt::new(0xf7efdb376a7734c9), - Felt::new(0x2d4ded56d9ef2076), - Felt::new(0xa17d90a509b879d0), - Felt::new(0xcf012a20045b29e1), + Felt::new(0x1017554397bc5cf1), + Felt::new(0xe4b0c8118343e3fe), + Felt::new(0x874d4c65e29e473b), + Felt::new(0x3fe19c4c0f73bf91), ]), Word::new([ - Felt::new(0x37e40a30232a4f06), - Felt::new(0xfbd9877fb761052e), - Felt::new(0xc4c41f56a70377cd), - Felt::new(0x631e942f6680d4cc), + Felt::new(0x1cd2791b4ac8bb3b), + Felt::new(0x82772647faaa67d8), + Felt::new(0x7cd3cf3dbd601244), + Felt::new(0xa8931437bd6e90a6), ]), Word::new([ - Felt::new(0xcf868b6d54b515a5), - Felt::new(0xa522edf7c43f7aee), - Felt::new(0x66057652f34d479), - Felt::new(0x59f4a86223bc80bd), + Felt::new(0x74fbc0ab37c21d7b), + Felt::new(0x1f8e2d4c14e1ca17), + Felt::new(0x8dadb87ff6a1f8ed), + Felt::new(0xb706bbc88126c74e), ]), Word::new([ - Felt::new(0xb7214ce5a0ba8dfd), - Felt::new(0x5c7a6e583e4e255e), - Felt::new(0xabc8369f8bf38a1c), - Felt::new(0xb5db79ae07f0689c), + Felt::new(0x31b4709960a4d7b4), + Felt::new(0x508dc734dfe651f6), + Felt::new(0xafb61654eb7900f7), + Felt::new(0xc881d1a87e04d076), ]), Word::new([ - Felt::new(0x18c980169ef2d0bb), - Felt::new(0x6526b64df8eb4eac), - Felt::new(0xfe4d8327ca5bd91a), - Felt::new(0xe36d607069c7dd85), + Felt::new(0xf671c8c96ffdf309), + Felt::new(0x4005499dff3633b1), + Felt::new(0x1d46b157205ff55c), + Felt::new(0xcb2e52106d23325d), ]), Word::new([ - Felt::new(0x602a97209948e5cc), - Felt::new(0xb7d19db914da726), - Felt::new(0xe4e43672c24d376c), - Felt::new(0x8bb9f7465e019213), + Felt::new(0xa0f62c3db76f6d96), + Felt::new(0x5e7853c7126abf61), + Felt::new(0x829e4767b3f3d677), + Felt::new(0x6997a407759f40ac), ]), Word::new([ - Felt::new(0x187bff077d393e3d), - Felt::new(0x17fb9a97c5055580), - Felt::new(0x618469c060eb2719), - Felt::new(0xfc7be4b58477e5ac), + Felt::new(0x6c13bfd2f92eb71d), + Felt::new(0x1297af3418d02e44), + Felt::new(0x50c8024a610d8ef4), + Felt::new(0x287f45266da74eda), ]), Word::new([ - Felt::new(0x1d40fcbc7a25cc97), - Felt::new(0xaee142f7cebadbd5), - Felt::new(0x22dbaed94300ddf8), - Felt::new(0xe069c36278753a06), + Felt::new(0x5a1764d52f31ba3d), + Felt::new(0xa9cf37c5cf23f5a6), + Felt::new(0x4e9c41b0d6167ec8), + Felt::new(0x512047298db42fa4), ]), Word::new([ - Felt::new(0xcd1e21c5f02ce44d), - Felt::new(0x3b0ddbaa04daff25), - Felt::new(0xbb55cd14f54818c7), - Felt::new(0xc57f1b84ed302102), + Felt::new(0x72d22ed9f10b4809), + Felt::new(0xe6072223f5d44bff), + Felt::new(0xfc35f03e39f9f907), + Felt::new(0xa6217147569d81e1), ]), Word::new([ - Felt::new(0x5c8e1f56cbdb0f87), - Felt::new(0xeeeb31b4d317cf1d), - Felt::new(0x8bf45cd3659a6d1), - Felt::new(0x9e179aa20693175a), + Felt::new(0xb05f52950422138d), + Felt::new(0xd05697d1fe3a2dcc), + Felt::new(0x77e6ba921c3d88b), + Felt::new(0xe2a049098b844637), ]), Word::new([ - Felt::new(0x10f58975fbb0fca), - Felt::new(0x5f35c19eb0f615c1), - Felt::new(0x9870cdafe46a3d), - Felt::new(0xcec9d9f3925df88b), + Felt::new(0x47c051e54f0aac4f), + Felt::new(0xa2c9c34701a64715), + Felt::new(0x53aa9094fc804523), + Felt::new(0x4ad7c5a854c20094), ]), Word::new([ - Felt::new(0x89e90b2f029b50c0), - Felt::new(0xd78a4223d0036c8a), - Felt::new(0x996b326a1d5cd76d), - Felt::new(0x5b314d29bb1694e3), + Felt::new(0xae5aae06914bebe0), + Felt::new(0xba723bcdede0b2f), + Felt::new(0x57c796a840fde9ac), + Felt::new(0x3e630cb89060c007), ]), Word::new([ - Felt::new(0x1be6e6955ba0f3a8), - Felt::new(0xc7e07c49076315ef), - Felt::new(0x93e91de5c7849fb2), - Felt::new(0xe81bc86fc641596f), + Felt::new(0x20c5789c29a5098b), + Felt::new(0xcd1dbf19d9030f54), + Felt::new(0x94cf701e167bdfbf), + Felt::new(0x13a58075092e3c2a), ]), Word::new([ - Felt::new(0x5320464735f18522), - Felt::new(0x1a741214432ca63d), - Felt::new(0xaf3ed59d324bdbe8), - Felt::new(0x2493eb414c91ac94), + Felt::new(0x1f24ae51589d6ef5), + Felt::new(0x3f603db464d888ac), + Felt::new(0x7fb3e77a51402568), + Felt::new(0xe1681cb7d5007e14), ]), Word::new([ - Felt::new(0x35897b61f231fa86), - Felt::new(0xb1531e954332f229), - Felt::new(0x92e950b1c1f874a), - Felt::new(0x469de0412ca52491), + Felt::new(0xe99e3c5ab6ad7091), + Felt::new(0x45c5aea5b498809a), + Felt::new(0xca221abad77fba94), + Felt::new(0x7c05f1dedf417422), ]), Word::new([ - Felt::new(0x1ecea76deca59ec5), - Felt::new(0xe884b570f5d54e45), - Felt::new(0x58939f3a1b5bc7e1), - Felt::new(0xf14eab10f926958f), + Felt::new(0x82a4f1fc61c2eb21), + Felt::new(0x6545946d94f26f7), + Felt::new(0xcac20af3361044e4), + Felt::new(0x5d1ec31b917476ed), ]), Word::new([ - Felt::new(0x26251aa927a69723), - Felt::new(0xb1808fe0795ab008), - Felt::new(0xd195fe923d1944c9), - Felt::new(0x2334a61c28dc63c), + Felt::new(0xf68ed2385443efd7), + Felt::new(0x8a693e27c0322995), + Felt::new(0x8441621b830d66a2), + Felt::new(0x301f6af5039281c8), ]), Word::new([ - Felt::new(0xe4b659081d9cf4e4), - Felt::new(0xf1174a5f72916819), - Felt::new(0x1de902b42b3b4054), - Felt::new(0xbe2bc215120367d0), + Felt::new(0x8d870b01e938568a), + Felt::new(0xd6b64b50844165b9), + Felt::new(0x95bb2039306f03db), + Felt::new(0x8e03338457833af8), ]), Word::new([ - Felt::new(0xfc87b8043d32428f), - Felt::new(0x8f8cb244e3ddf6da), - Felt::new(0xc7539186ece143a7), - Felt::new(0xf28008f902075229), + Felt::new(0x8cc1aa0c601d1bb), + Felt::new(0xef0e3a67248752ec), + Felt::new(0x6f3fe9f5023ea283), + Felt::new(0xc8d9d24d2b8e2f95), ]), Word::new([ - Felt::new(0xf76c24c9f86c44d3), - Felt::new(0x97c7abcbb6d07d35), - Felt::new(0x9d8e37a1697a0d4), - Felt::new(0xa3f818e48770f5fa), + Felt::new(0x8e054ccf1f409dd), + Felt::new(0x2c464d96520ff0f9), + Felt::new(0x94ffad08bdf83708), + Felt::new(0x1edf4b6cdbdd60c9), ]), Word::new([ - Felt::new(0x885686c79c1cd95e), - Felt::new(0xcdebe76fd203c23e), - Felt::new(0xdf9b7cd5099673ed), - Felt::new(0xe60438536ad13270), + Felt::new(0xb0b696a89d49914), + Felt::new(0x6e776735f98bb4e), + Felt::new(0x5c21944f44b21087), + Felt::new(0x849734992138dc1f), ]), Word::new([ - Felt::new(0x7790809942b9389d), - Felt::new(0xa3d82432c31de99), - Felt::new(0xaea11fece88c7d27), - Felt::new(0x5cc764da96d0b2f0), + Felt::new(0x4bdde21742bfefa3), + Felt::new(0xdafc80a1f0b26a33), + Felt::new(0x72cd9166fb2e8798), + Felt::new(0x4fd0c44ab7647ae2), ]), Word::new([ - Felt::new(0x80e555c41170427f), - Felt::new(0x87e68144276d79c8), - Felt::new(0xebdc63f28aa58a53), - Felt::new(0x168dd22672627819), + Felt::new(0x8fe670a9b7a4cdb), + Felt::new(0x66744865e1c00d3), + Felt::new(0x76fff27436cae08d), + Felt::new(0x565df8deedd57ccd), ]), Word::new([ - Felt::new(0xea1dc59c29da5b6c), - Felt::new(0xa33188c0a077761), - Felt::new(0xabd3c84cddbe1477), - Felt::new(0xd28244bc92f36e0f), + Felt::new(0xc3c67b9b5552028b), + Felt::new(0xac755b3eac5b39cb), + Felt::new(0x2c81b9567fb06b87), + Felt::new(0x4cf63467c28df5aa), ]), Word::new([ - Felt::new(0xdadc2beb7ccfe3fa), - Felt::new(0x218532461f981fb4), - Felt::new(0xf0455f1d4e2f9732), - Felt::new(0xa7338b43d2b7e62d), + Felt::new(0xc6103f36100f0110), + Felt::new(0x7eb64907c28b9fa6), + Felt::new(0x27d7d1b5ebc4aeda), + Felt::new(0x1da94af08a75a5e), ]), Word::new([ - Felt::new(0x195d8bc1cfe2711a), - Felt::new(0x44e392ba7e259f47), - Felt::new(0x480120d41e18ab3c), - Felt::new(0x2056ffb29c2d89d1), + Felt::new(0x2f0c864709131f3b), + Felt::new(0x6bfbc8a702cf804f), + Felt::new(0x3f99016c9064e748), + Felt::new(0xf0c3bebc441e06c4), ]), Word::new([ - Felt::new(0x382e33ba5fe6ada3), - Felt::new(0x45402a8903efebc9), - Felt::new(0xb9b0d63a59c70da), - Felt::new(0x7afebd4726d8cfe5), + Felt::new(0x5a7cd4e8ae2216d1), + Felt::new(0x927f67dcae500db6), + Felt::new(0x988de42eab734530), + Felt::new(0xb351a01e3defb152), ]), Word::new([ - Felt::new(0xbf60bf6b45a4c9d), - Felt::new(0xfb5b9b553646f19c), - Felt::new(0x9949b60ce7639da3), - Felt::new(0x9c62552c0d1868ff), + Felt::new(0x7742e4639683760a), + Felt::new(0x2e5e877b874c7152), + Felt::new(0x5ab41de05a496568), + Felt::new(0xbb4a1da6a81258dc), ]), Word::new([ - Felt::new(0xdb2a0aba0fc5e4f8), - Felt::new(0x8ee4f01d4b0fa49e), - Felt::new(0xd70a17a77b5c4a03), - Felt::new(0x57aaaa5b48fea66e), + Felt::new(0xcba648f645196338), + Felt::new(0xbea16b163870415b), + Felt::new(0x18850f365ea62ce), + Felt::new(0xdb9a08a8f49dde6a), ]), Word::new([ - Felt::new(0x6d635940443564cb), - Felt::new(0xc7fbf0e26b5e3ff6), - Felt::new(0xa45bce664368b65e), - Felt::new(0xd6c5c1a92be0c60d), + Felt::new(0x2ad1b5164eb56b6e), + Felt::new(0xdc58fbf36c6b4fcf), + Felt::new(0xbbb986b3687e607a), + Felt::new(0x134d10fa63d56583), ]), Word::new([ - Felt::new(0x6ea62d6033fb2dd3), - Felt::new(0x1a37910cf90ec6d8), - Felt::new(0x83d826e9933760b5), - Felt::new(0xf8387c90d9c6b5a9), + Felt::new(0xad20e15f0a3ee8b3), + Felt::new(0xab19103387b6db49), + Felt::new(0x4c2ac536c55369c3), + Felt::new(0xe90d3067d5032686), ]), Word::new([ - Felt::new(0x134766f1da2fbc91), - Felt::new(0xcfaeea545df2c757), - Felt::new(0xd0accefaed1eaa0f), - Felt::new(0xec38d4053f84b163), + Felt::new(0xacf847f2722006e1), + Felt::new(0xcccd5bee8edaab77), + Felt::new(0xaf647369cc0bd07d), + Felt::new(0xac1bfe67d11eb1bf), ]), Word::new([ - Felt::new(0xb02ad1e757380aee), - Felt::new(0x4538b8ea13112d4), - Felt::new(0xb2d761fe842a2a85), - Felt::new(0x8e98d58adf5a1f29), + Felt::new(0xe61111070c4fa0cd), + Felt::new(0x678079994529da0b), + Felt::new(0x97f5072ac759665e), + Felt::new(0xd536a68f9a4f607e), ]), Word::new([ - Felt::new(0x44603d9549ddee64), - Felt::new(0x43de72d570967bbb), - Felt::new(0x4a3e71144e62d0fa), - Felt::new(0xffb2fdcb48965939), + Felt::new(0x46b7a14b30fbc9f), + Felt::new(0x90857d5c4265abe1), + Felt::new(0x52b1a794404385c7), + Felt::new(0xc5dcb92c2df08437), ]), Word::new([ - Felt::new(0x606f3ee12fe9ec0c), - Felt::new(0xe7d494ab8e483d87), - Felt::new(0x3b47f7c0d316cd4a), - Felt::new(0x86f941c7fa834581), + Felt::new(0xc79c6daf729eeb36), + Felt::new(0x3c8983a8d9974006), + Felt::new(0x92eff347ec15f71a), + Felt::new(0x17e86b546b852eb4), ]), Word::new([ - Felt::new(0x30c2385facf08b86), - Felt::new(0x4446168e25ac2c21), - Felt::new(0x61c6db1c3f283b21), - Felt::new(0x2fdf6bc360bf803), + Felt::new(0x9ffd0848241eefe3), + Felt::new(0x605c79e50ebb085c), + Felt::new(0xb2bd2ab9f3697b7c), + Felt::new(0xe041389cb7150d9b), ]), Word::new([ - Felt::new(0xeec8d9cc3e46d243), - Felt::new(0x65bcae511dcce39), - Felt::new(0xd3da5bbfdbd09cd3), - Felt::new(0xe7c35fc3d11216a5), + Felt::new(0xe6104dca1a2feec5), + Felt::new(0x5a79f163170b01e9), + Felt::new(0xe84905e5a557ae64), + Felt::new(0xa9e2e8e3aae6976c), ]), Word::new([ - Felt::new(0x841fb6fb35e7b49b), - Felt::new(0xfc4e2e1239caa7b8), - Felt::new(0x37cb93ec88f102e5), - Felt::new(0xa707a1556032152c), + Felt::new(0xc1bd5e298b8eadf1), + Felt::new(0xf42b7225d038f3c1), + Felt::new(0x75503169d1d0f385), + Felt::new(0x3e3c6a4b486af2c), ]), Word::new([ - Felt::new(0x37c67bd7b7cef984), - Felt::new(0x75bbe46da2ee5c90), - Felt::new(0x3a5c568d1f71cab1), - Felt::new(0x36939cdca2dc0b55), + Felt::new(0xe1f61460f57d2438), + Felt::new(0xc36dd5e7c345a99f), + Felt::new(0x873fb3656add0e10), + Felt::new(0x6504cbdd0e44b39c), ]), Word::new([ - Felt::new(0x4f76756a55f3a644), - Felt::new(0xd30f8fa45394aff4), - Felt::new(0x65c55096158b202f), - Felt::new(0x368a5fb0b0d475d0), + Felt::new(0x3fc8825536595d1c), + Felt::new(0xe3a989ac24c442ff), + Felt::new(0x3f00298a381f556a), + Felt::new(0xf0e79665f5120cfc), ]), Word::new([ - Felt::new(0xa9b9acd256cabb0f), - Felt::new(0xd8b1170f301208c7), - Felt::new(0xab152f908d46bf8), - Felt::new(0x1b7a10556730ec16), + Felt::new(0xc52ffaee0c323307), + Felt::new(0x24d4b284d557b6db), + Felt::new(0xc6cc213c02c167c8), + Felt::new(0x8db5af59bd93c51f), ]), Word::new([ - Felt::new(0xd967a72076e3059c), - Felt::new(0xbd1015a08ffe8881), - Felt::new(0xf72f186dde0c6e78), - Felt::new(0xa58910205352895a), + Felt::new(0x784b5f5e63326944), + Felt::new(0xb8b422abe90f40b7), + Felt::new(0x774646e33258bc8d), + Felt::new(0xc84da11887cb5742), ]), Word::new([ - Felt::new(0x130333f2fd400a4d), - Felt::new(0xf20104837a118d6e), - Felt::new(0xda1e5d608fb9062c), - Felt::new(0xb8ac5c76d60950b8), + Felt::new(0x652dc7cb8a1f6c09), + Felt::new(0xee834858c182190f), + Felt::new(0x8b69716414504dca), + Felt::new(0x651eea2ddd727479), ]), Word::new([ - Felt::new(0x65d0deae6fb0c6cb), - Felt::new(0x1b442ae344dcd9e7), - Felt::new(0x1eedabab8fc07fa4), - Felt::new(0xb0dc89b96f256189), + Felt::new(0xc7eacb774a32bb70), + Felt::new(0xfd4ed5472cacbf3), + Felt::new(0x478a07c571d2447d), + Felt::new(0x8eb18bc9d29dec70), ]), Word::new([ - Felt::new(0xef88de626968c17a), - Felt::new(0x569a01072cdbbc2b), - Felt::new(0xc99bbba6d083c68f), - Felt::new(0x9ed4a176fe341849), + Felt::new(0x663c4616d424ebf4), + Felt::new(0xeefdee99f237d5ab), + Felt::new(0xe0b6d308cd592024), + Felt::new(0x4208b7351fa4302a), ]), Word::new([ - Felt::new(0x5d49d1e9d17448a6), - Felt::new(0x6974d510bc47ee66), - Felt::new(0xbcbea4dec0b68586), - Felt::new(0xdaa5457e0cfd3e61), + Felt::new(0xd481d45f71b56b77), + Felt::new(0xb10316f16afe4550), + Felt::new(0xc55ef6e4bb501483), + Felt::new(0x9494dbc8ff511634), ]), Word::new([ - Felt::new(0x9fceba739503cda0), - Felt::new(0xb9daf271ac42c8ba), - Felt::new(0x10fe3e8de8680d83), - Felt::new(0xd7e1dc73ced7730b), + Felt::new(0xce6ab27c75267570), + Felt::new(0xa841b38a81153b84), + Felt::new(0x2a982e69815eb95), + Felt::new(0x3a781dbedba07fff), ]), Word::new([ - Felt::new(0x93ec6c422d4271ea), - Felt::new(0x73923813232b0e70), - Felt::new(0xbbe6a4441a900b65), - Felt::new(0x36b2164f37c9319b), + Felt::new(0xb9986f52024a4070), + Felt::new(0xd7b04dacfb578a4c), + Felt::new(0x84335c4107ff51b4), + Felt::new(0x57d34e97a7f5bc14), ]), Word::new([ - Felt::new(0xce3ecb2eed624694), - Felt::new(0xb7e1d75fff7a454c), - Felt::new(0x86c24aa3a8d92d2b), - Felt::new(0xb1ba74cafa9ce649), + Felt::new(0xcaf39a0799c252), + Felt::new(0xc59e04527c15e01d), + Felt::new(0xc3ee742f12d01965), + Felt::new(0x6c363303a5379a6), ]), Word::new([ - Felt::new(0xb5fae724eb357479), - Felt::new(0x359532ddc4840cb9), - Felt::new(0x4b111251e037e9fa), - Felt::new(0xfcdab1cdd314c1d9), + Felt::new(0x85a9cc8568e7530e), + Felt::new(0x2cec56ea82497437), + Felt::new(0x405667275bb5fe7e), + Felt::new(0x7ec253c378286890), ]), Word::new([ - Felt::new(0xb3a89464d21c9ff1), - Felt::new(0x8136e1b457a59ca8), - Felt::new(0x88b0fa606b53c4d5), - Felt::new(0x89645f8a9dfe97a2), + Felt::new(0xd718ae4b8686d41e), + Felt::new(0xadc41b281bdd380f), + Felt::new(0x568fa3dcb8be911a), + Felt::new(0xfcce156b4bbf07ca), ]), Word::new([ - Felt::new(0xfe115ef35b814cbf), - Felt::new(0x63de467fb93b6851), - Felt::new(0x17c73b03c9f44ad8), - Felt::new(0x53742721f568b5be), + Felt::new(0x284a977ee6ab740), + Felt::new(0x52da1ee52275d41b), + Felt::new(0x44c940a446c5038d), + Felt::new(0x74332541d3a3eb4a), ]), Word::new([ - Felt::new(0xd8110ea6e905cc2), - Felt::new(0xd67b3c7cea25100), - Felt::new(0x9e49b38ed51d1c60), - Felt::new(0xe9e24f9b597c9bfd), + Felt::new(0xe14f55528c248fcb), + Felt::new(0x3b14809519bb04f5), + Felt::new(0xa2ebb8accb489605), + Felt::new(0xa2f4a2890f3f7743), ]), Word::new([ - Felt::new(0xefe9086b5bb5a504), - Felt::new(0x991f92a90c9346a3), - Felt::new(0xe4fab215a20f453b), - Felt::new(0x4e4d4dde9146d61a), + Felt::new(0x9b2bc7e94b75374e), + Felt::new(0xc2879b31f4035c4f), + Felt::new(0xbd600bdc34732d3c), + Felt::new(0x6dfa6d51fef2721c), ]), Word::new([ - Felt::new(0xaa998c3b26497ffa), - Felt::new(0x985bd5cf4ccefb3c), - Felt::new(0xce44e80aa02424bb), - Felt::new(0x75158a37503aed75), + Felt::new(0x902331d94df3505a), + Felt::new(0xfda6cde5628308f9), + Felt::new(0x34b439c067c7b4d3), + Felt::new(0x2b7878660dc8efd9), ]), Word::new([ - Felt::new(0xdb61760c917116f1), - Felt::new(0xf378c9645174a832), - Felt::new(0x1216aa71b73e7fac), - Felt::new(0x8a4e7f0591a129fd), + Felt::new(0xdd66f8d7698e4eb8), + Felt::new(0x1d03969c9d146092), + Felt::new(0xf8eac97f83c08043), + Felt::new(0x9b59e29ef763e459), ]), Word::new([ - Felt::new(0xaf11a04daaf4ed67), - Felt::new(0xd3e59f0d7dad9064), - Felt::new(0x30c206089a2c294d), - Felt::new(0xe104db59761e8a99), + Felt::new(0x6c309112a472dcc8), + Felt::new(0xe089a50410c3b074), + Felt::new(0xff23afa304ff16f), + Felt::new(0xbe1bd4aa7a393695), ]), Word::new([ - Felt::new(0x70b545ba7a6d447), - Felt::new(0x6ac0e423ddf68913), - Felt::new(0xf9b50997257bb033), - Felt::new(0xdac37c7b1c18b48a), + Felt::new(0x303f9384cec5e0c9), + Felt::new(0xfbee0ab1ff8dadcb), + Felt::new(0xcaf6a4571a59e33c), + Felt::new(0x85516327705ec9a2), ]), Word::new([ - Felt::new(0xd182b9dff0fcd5c0), - Felt::new(0xf87619ae86b6eb02), - Felt::new(0x6838c1b612b17cb5), - Felt::new(0x9b705d5b6bcf92c), + Felt::new(0xb3f872265da8c2c), + Felt::new(0xb47964162479bebc), + Felt::new(0x86e8e5b1b092fa71), + Felt::new(0x32266efeb618442c), ]), Word::new([ - Felt::new(0xfba622b3026c6193), - Felt::new(0xdacde486f8129b96), - Felt::new(0xd5acd22a7c2cf6aa), - Felt::new(0xf5beb40535e6c0f2), + Felt::new(0xa0ee5b88ffa1bf17), + Felt::new(0x2c7981644c2c8f06), + Felt::new(0xd9b896e51031b30d), + Felt::new(0x3c369de24985490d), ]), Word::new([ - Felt::new(0x59bde17b2d501969), - Felt::new(0xb4abe1389123d3b9), - Felt::new(0x683d8dd8635d9a67), - Felt::new(0x347e01da4c07833), + Felt::new(0x151881390e803f09), + Felt::new(0x76629fefc37ec9a3), + Felt::new(0xdc30ef977a01cffc), + Felt::new(0x8a1b767747d677de), ]), Word::new([ - Felt::new(0x4e28956ab7162a06), - Felt::new(0xccfcc7358f48c727), - Felt::new(0x7b3485f20c979144), - Felt::new(0xeeb27fa694f1c8fd), + Felt::new(0x98f81ad1dc5d3f53), + Felt::new(0x6bf3729004afe0d3), + Felt::new(0xbf194c54a20e0299), + Felt::new(0x1431836bedeb6093), ]), Word::new([ - Felt::new(0x275b2c0ee883807b), - Felt::new(0x8f68f2016c1391cd), - Felt::new(0xb59fdccb20322765), - Felt::new(0xeb9b902c5351d5d4), + Felt::new(0xd9a4f944c886c196), + Felt::new(0x43bc25f7df3201b6), + Felt::new(0xdb2d5dad33db4893), + Felt::new(0xe476f132869558fe), ]), Word::new([ - Felt::new(0xb767d8cb8816cc8e), - Felt::new(0xbd29bb02cdcbc9af), - Felt::new(0xeb1dca9bfebee6f), - Felt::new(0x57597da8109c0354), + Felt::new(0xdd8d86a42c418610), + Felt::new(0xb9a2476435d3a058), + Felt::new(0x1cae777275604da6), + Felt::new(0x21e886725e0c18f9), ]), Word::new([ - Felt::new(0xeb32a8db8cf216), - Felt::new(0xeb5532ac68f304c1), - Felt::new(0x9bca72ffccb957ee), - Felt::new(0x33d4b152ebedb841), + Felt::new(0xa46f20d055f7216f), + Felt::new(0x4900ac3f4370a63), + Felt::new(0x99ca62f79ef5f8b9), + Felt::new(0xc2de59ce20691978), ]), Word::new([ - Felt::new(0x439b20dce9810169), - Felt::new(0x2b693e2530a1b88c), - Felt::new(0x36b8898f4e900c7a), - Felt::new(0x7bf5064dde3a0da1), + Felt::new(0x7a48631a0bfff3eb), + Felt::new(0x3b94c6e453004591), + Felt::new(0x5fab1652ae822b3), + Felt::new(0x400b37cc56fa1d22), ]), Word::new([ - Felt::new(0x8794201ce6158fe0), - Felt::new(0xfcc53644557471f3), - Felt::new(0xa66d87f6ae6f64d0), - Felt::new(0x4e876d9d933b2ad0), + Felt::new(0x40d0b3847cc462ec), + Felt::new(0x2c5e05c7e87962e3), + Felt::new(0x840520a1bc365f88), + Felt::new(0x2ab54e2273ad9f81), ]), Word::new([ - Felt::new(0x6ff8f4900e43bab6), - Felt::new(0x40014f298cb7b9a3), - Felt::new(0x9d6b252ff946ee3d), - Felt::new(0xb014d99ab8508072), + Felt::new(0xcdf5f717928c8a89), + Felt::new(0xb612eb0a97227ef8), + Felt::new(0xc71f4387804459fd), + Felt::new(0x8bdc0619d4e1659e), ]), Word::new([ - Felt::new(0x9cdd5a4a37511cae), - Felt::new(0x684444122d770c18), - Felt::new(0x8982944b22a22577), - Felt::new(0x50a58d944629de54), + Felt::new(0x52fde7c40e364968), + Felt::new(0xed8b8c233f32a499), + Felt::new(0xdb69dc89c4a1cf9e), + Felt::new(0x8a602b6c7125b3ce), ]), Word::new([ - Felt::new(0x853f5b8ad557fac3), - Felt::new(0xdab1743c03b8da56), - Felt::new(0xc70d6683d4f4c086), - Felt::new(0x2f1d0f67a5dfae4c), + Felt::new(0xde95dfa36608bc73), + Felt::new(0x36893df69ef5c7b6), + Felt::new(0x296e79075c4a7d0f), + Felt::new(0xad9dc949d6b30d78), ]), Word::new([ - Felt::new(0xf3b6fe76eb11284), - Felt::new(0xbeb9e98b146c63a8), - Felt::new(0xc7e8824fce7777ad), - Felt::new(0x5229918b04410d6a), + Felt::new(0xfdd13861d5320017), + Felt::new(0x175043526474a728), + Felt::new(0x9ec8cdd1448b992d), + Felt::new(0x7cf5a38e86cb4f6c), ]), Word::new([ - Felt::new(0xc170c46601ffc4f3), - Felt::new(0x1258e8e47103c39b), - Felt::new(0x612e99da984aac99), - Felt::new(0xc82fcfcf56d6dd94), + Felt::new(0xfda651ec0660e8cd), + Felt::new(0xf04e4f664a56f41a), + Felt::new(0x292a9003e6767a0a), + Felt::new(0xe50ccfe917bd456), ]), Word::new([ - Felt::new(0xf793819d04d5679d), - Felt::new(0xb738b97ec0a52dd3), - Felt::new(0x4df897389119a098), - Felt::new(0xa5af45eb0d007785), + Felt::new(0xc688eadb9f01e59c), + Felt::new(0x47b9cd7023903603), + Felt::new(0x318bfae1e06fe3da), + Felt::new(0xc83189d37992f87f), ]), Word::new([ - Felt::new(0xfcf59c6c9d7280e7), - Felt::new(0x662b993b320f3345), - Felt::new(0xeb8e04ba28f156fa), - Felt::new(0xe72233ee6a444749), + Felt::new(0xe4fb5c90773f9ea1), + Felt::new(0x13b1582bad1f031b), + Felt::new(0x9ee222546a5b1217), + Felt::new(0xcaf5cdadfaf7d9b4), ]), Word::new([ - Felt::new(0x7ad6b7badfc9e757), - Felt::new(0x3332f340184af6f5), - Felt::new(0xe92a736dcdf52022), - Felt::new(0xf1759f8041119245), + Felt::new(0xaf90f25be574025e), + Felt::new(0xa6a79bae7183edb2), + Felt::new(0xfd3f30f11cb7d962), + Felt::new(0xa80fb4b3cb60debb), ]), Word::new([ - Felt::new(0x166382d3c8ca3a95), - Felt::new(0x36c8c25f971d771a), - Felt::new(0xe82cc977ee1402cc), - Felt::new(0xe13f6dc2ab919177), + Felt::new(0x4da76d203efa5600), + Felt::new(0xa8690c93cf9d295a), + Felt::new(0x2f24955130442d09), + Felt::new(0x4ee238c83e47b9aa), ]), Word::new([ - Felt::new(0x41fb8b9d5a9ab5e8), - Felt::new(0xb2a608f5d6fbc37d), - Felt::new(0xe81719d9778c54b4), - Felt::new(0xcc0d4373ef2bb8e1), + Felt::new(0x9d867192ce6c7de8), + Felt::new(0xa5e41d4bc73618e8), + Felt::new(0xb5c83dd5d51d84b0), + Felt::new(0xb18e472768a75d96), ]), Word::new([ - Felt::new(0x60b3788c45c1bc29), - Felt::new(0xcb38969a428c5423), - Felt::new(0xca11f6b9d957f57c), - Felt::new(0x7a166881648514cb), + Felt::new(0x59d6601a9b015b25), + Felt::new(0xc843c1aa885ae236), + Felt::new(0x9a158183e08b5dc6), + Felt::new(0x1145844b22b49390), ]), Word::new([ - Felt::new(0x3548d7dcbe4af37f), - Felt::new(0xb199194f25a6f55a), - Felt::new(0x751017bda8f0d816), - Felt::new(0x80117260c6525c4a), + Felt::new(0x6524ab5a3897e1fb), + Felt::new(0x4734b8ef3529204f), + Felt::new(0x13d39127b429dfab), + Felt::new(0x20b6b93f96712a75), ]), Word::new([ - Felt::new(0x1d1d34d842e95671), - Felt::new(0x38ab2833c4a2bded), - Felt::new(0x3a53caf5f6e20f5f), - Felt::new(0xfee946c5ebce837d), + Felt::new(0x331d2c37945eb6a3), + Felt::new(0xe22e4d90443e4cd3), + Felt::new(0xa6f7c6e30b0aa924), + Felt::new(0x60291d1d37a29298), ]), Word::new([ - Felt::new(0x65dbb5d849e46f92), - Felt::new(0x753679d0d09d1250), - Felt::new(0xc539adf9062e7698), - Felt::new(0xd76f4b13d2635af3), + Felt::new(0x38a14a1754501dbd), + Felt::new(0x4167f7d92b1c2ce2), + Felt::new(0x13ab7681212a624), + Felt::new(0xbaaf8e1ac64cd97d), ]), Word::new([ - Felt::new(0x9eae446581f7076d), - Felt::new(0x237138e3a1c55ee8), - Felt::new(0xfb54da0b58969484), - Felt::new(0x9a899375c4f10483), + Felt::new(0x5fbbcd61ca726726), + Felt::new(0xd2582d23ba908b74), + Felt::new(0x330e3dbb3e9eb2d5), + Felt::new(0x951652929797868e), ]), Word::new([ - Felt::new(0x88b12578d3c36cc4), - Felt::new(0x9cd868d6a29df146), - Felt::new(0x5443d21524637821), - Felt::new(0xceb3692fad9f76b9), + Felt::new(0xec01babca08bd895), + Felt::new(0xba9a7626ddd6668f), + Felt::new(0x9179b39124aedfc4), + Felt::new(0x5affa3c62c4b3a65), ]), Word::new([ - Felt::new(0x4e45d3e34ebfcb0d), - Felt::new(0xedca6a0f8d90eb2e), - Felt::new(0x1a182dad4a914731), - Felt::new(0xd89946f41f53f106), + Felt::new(0x4f8bea84ae68c86b), + Felt::new(0xcef547bf6c813156), + Felt::new(0x57463124b1dc489), + Felt::new(0xb4ea4cc2377e6fe1), ]), Word::new([ - Felt::new(0x42a89e1abee8b12d), - Felt::new(0x3af360678475225a), - Felt::new(0x3e28a1cdede0c7a3), - Felt::new(0x25cc76ad1c8788e), + Felt::new(0x1e5cc70d1dc1841e), + Felt::new(0x321ad7eab2f70418), + Felt::new(0x806dd438381a20e7), + Felt::new(0xa25b9f1a88890e06), ]), Word::new([ - Felt::new(0xa6e955e3b0721737), - Felt::new(0xbbd721b51cbc605f), - Felt::new(0xfa537854669f20a5), - Felt::new(0x2a1ab83bb24d43f7), + Felt::new(0x17dd1a39290a6672), + Felt::new(0xa76b6687282df90a), + Felt::new(0x5549085194b9310), + Felt::new(0x47468128e17ff977), ]), Word::new([ - Felt::new(0x1c289dc62c4e7907), - Felt::new(0x186437cf1f8b3abf), - Felt::new(0x929244addee54abf), - Felt::new(0x42ec87a9141b58fb), + Felt::new(0x8951be2c71b6aa25), + Felt::new(0xc8849cb2f3d17d55), + Felt::new(0x45006c090e491d86), + Felt::new(0x6437fa6577394ca6), ]), Word::new([ - Felt::new(0xf5ea743b81e59fee), - Felt::new(0x32e2c826d0fc57d4), - Felt::new(0xbc411bca1b745388), - Felt::new(0xc9af8de5bc3b8692), + Felt::new(0xa89d3f1ac7597df9), + Felt::new(0xc14f31ba91c1bd97), + Felt::new(0x487e19d8fdfb574), + Felt::new(0x6af87b44b56ed3f6), ]), Word::new([ - Felt::new(0xf75129028d95ebab), - Felt::new(0xf9d02d7713784ff2), - Felt::new(0x944b5fea457c946b), - Felt::new(0xa6645d6f5389a91f), + Felt::new(0xa5eaadab93f885fd), + Felt::new(0xc42867bf591206f4), + Felt::new(0xdfc5efa38a456769), + Felt::new(0x9f6ce48420cdf929), ]), Word::new([ - Felt::new(0x236ce9e32fb0131c), - Felt::new(0x92cac3a2b67600b8), - Felt::new(0x437914d1d9e409bb), - Felt::new(0x6bff102a4ea81e38), + Felt::new(0x1f52d69390fd9980), + Felt::new(0xa06a4c951d9e332), + Felt::new(0xddefc965eb12ccc7), + Felt::new(0x544db122c8ec2200), ]), Word::new([ - Felt::new(0x9906825ec6d45f25), - Felt::new(0x1245ccf4121950a2), - Felt::new(0xff82337f357949bb), - Felt::new(0xe1f59f6b824f97af), + Felt::new(0x9d331e003c39481f), + Felt::new(0xc29377c5b7262063), + Felt::new(0xd10c96634885ae64), + Felt::new(0x53b174d630f0a988), ]), Word::new([ - Felt::new(0xd6030ea8046f0d1e), - Felt::new(0x69fd3c732586f5db), - Felt::new(0x765cccb10c151f30), - Felt::new(0xd1bad2f1ba1bdc5b), + Felt::new(0x7e36a51c053b79c3), + Felt::new(0x1539bac1275df6dc), + Felt::new(0x35d946afc238a3f2), + Felt::new(0x5a32f67c1500f6aa), ]), Word::new([ - Felt::new(0xd4a0cff6578c123e), - Felt::new(0xf11a17948930b14a), - Felt::new(0xd128dd2a4213b53c), - Felt::new(0x2df8fe54f23f6b91), + Felt::new(0xb80fd935de9c2911), + Felt::new(0x15997eaf79765d40), + Felt::new(0xa600dcb22c577529), + Felt::new(0xe15004068a2d6a93), ]), Word::new([ - Felt::new(0xa891ab94552907b2), - Felt::new(0xc64b69708f99b16e), - Felt::new(0xb99d29be9af9df15), - Felt::new(0xa452647d61bd3d7b), + Felt::new(0x97d7528bd226911f), + Felt::new(0x636a7ee15ed43326), + Felt::new(0x25a943cbdbb77f80), + Felt::new(0x2eae2a071905d048), ]), Word::new([ - Felt::new(0xd339a7d5f35bdf7e), - Felt::new(0x296127097a98dbdd), - Felt::new(0x66d3eac876c1a984), - Felt::new(0x2714db555ccbdca4), + Felt::new(0x2cba8fe9fea65ee7), + Felt::new(0x6a41be71d2fc7028), + Felt::new(0x605212e2ee9bc5b), + Felt::new(0xc21c2908a5658935), ]), Word::new([ - Felt::new(0x6ca87920a067acd6), - Felt::new(0x55a102d742879de5), - Felt::new(0xa3f57a4b6a56d7f3), - Felt::new(0x18770879a832a177), + Felt::new(0xaac0de8bd44b1d9f), + Felt::new(0x7225852b69d88957), + Felt::new(0x2f7c909294f15753), + Felt::new(0x7affa1185c0381b7), ]), Word::new([ - Felt::new(0x1208793a0a77e984), - Felt::new(0x89ed5a1f45b34219), - Felt::new(0x8d74e6f75e77ef03), - Felt::new(0xa78cc9b7d29a1ee9), + Felt::new(0x34ca88a0e0d63460), + Felt::new(0x389fbe4ae11a59f6), + Felt::new(0x81e26cd8421a5db7), + Felt::new(0xdfac53bc294b2842), ]), Word::new([ - Felt::new(0x345fffecefd56a65), - Felt::new(0x23dec03b9f663006), - Felt::new(0x66f452be070b34d8), - Felt::new(0xe1c6aaaa54765dc), + Felt::new(0x46568c6daa1fffec), + Felt::new(0x2e2cda75ec40e041), + Felt::new(0x54fc7cb3b80bee28), + Felt::new(0xf0195f14b6ce7a91), ]), Word::new([ - Felt::new(0xb7b714ca60c77011), - Felt::new(0x5ffe9476baa10259), - Felt::new(0xbea15cd2b4150dda), - Felt::new(0x4467804ab919e3d8), + Felt::new(0x13593d27ded29298), + Felt::new(0xefe26b0c14bf1017), + Felt::new(0xfe921a040d8b3627), + Felt::new(0x79e4d45d9160c42), ]), Word::new([ - Felt::new(0x21c65ff7a4185640), - Felt::new(0x5d20fffcc7779035), - Felt::new(0x92b571249fa728d5), - Felt::new(0xe9e2eeca83b49342), + Felt::new(0x55235f121b2222a0), + Felt::new(0x5a3585db845aec02), + Felt::new(0x63530f0bfe01fd8e), + Felt::new(0xe8b1ca6f13d69fd6), ]), Word::new([ - Felt::new(0x2be46f9d0b431948), - Felt::new(0xa5c1a12c95a56f44), - Felt::new(0xc620adca5cd874), - Felt::new(0x51c64b969c1dc0c9), + Felt::new(0xe67cc603113d0cfa), + Felt::new(0xe6e6191b2f335634), + Felt::new(0x586d9798d40674ca), + Felt::new(0xcc05c4b81a3e9cf5), ]), Word::new([ - Felt::new(0xae9e7f421ab12b3f), - Felt::new(0x5f90e40cdb47bbec), - Felt::new(0x3d2a6be00ce19d31), - Felt::new(0x609632a98643a06c), + Felt::new(0x287625a6e0ac9570), + Felt::new(0xb3ca03f21da48806), + Felt::new(0x4d757e14a282da56), + Felt::new(0x62f916fb91c5ad44), ]), Word::new([ - Felt::new(0xde0f38c1d4cf5977), - Felt::new(0x3d6f0f44105b0fb2), - Felt::new(0x5f34005bed22db6f), - Felt::new(0x377009a91543c872), + Felt::new(0x6a3381ff8ac5eda8), + Felt::new(0x18bc36351ee69a6a), + Felt::new(0x96735310f4c0cf6), + Felt::new(0x82d29f8e231dbec6), ]), Word::new([ - Felt::new(0x8763f1c59420f662), - Felt::new(0xbe15cc9b37fdbdb3), - Felt::new(0xeed75857d5451487), - Felt::new(0x10b3507901fcfb8b), + Felt::new(0x22019fe65e285413), + Felt::new(0xf1ea9640113d7e79), + Felt::new(0x6eb829f8d3dac377), + Felt::new(0xa5a5390e2c61e707), ]), Word::new([ - Felt::new(0x2e40aeb53f7ba2f5), - Felt::new(0xed598b103221e46), - Felt::new(0xed943dae7f3be8f7), - Felt::new(0x7115a61b37a95c30), + Felt::new(0x94f3666f3ec0cad6), + Felt::new(0x41af521db5132b0f), + Felt::new(0x12f521b602f26bb7), + Felt::new(0x6fb0099fc03771d7), ]), Word::new([ - Felt::new(0xef9bdb6947abe190), - Felt::new(0xfe47c74c5ad62e2b), - Felt::new(0xf85ee41bc6960d64), - Felt::new(0x55e51b57d5990e2b), + Felt::new(0xb94b561402c5d3f5), + Felt::new(0x74676ed17243d4ab), + Felt::new(0x501728289cec61a7), + Felt::new(0xa261eeff641cf1f), ]), Word::new([ - Felt::new(0x81798808c02cffe0), - Felt::new(0x22df79cb29991e51), - Felt::new(0x965714f831e09f90), - Felt::new(0x67ac8aef55047894), + Felt::new(0x81638d8c4c380987), + Felt::new(0x301ade5b72dae9cf), + Felt::new(0xf83af45539a37292), + Felt::new(0x9c70b7c60b3cd79a), ]), Word::new([ - Felt::new(0x321d58dfe138e326), - Felt::new(0xee80b399b444c937), - Felt::new(0x6cbc565ad3d69ccf), - Felt::new(0x6ea9e44922bdc48e), + Felt::new(0x25e6179ad88ec2c8), + Felt::new(0xd9d92f7f8d44d084), + Felt::new(0x920cf9eac097e734), + Felt::new(0xbe57d8b3b732eee7), ]), Word::new([ - Felt::new(0xf2a11cd35120f6c3), - Felt::new(0x4e77378973b2ca8), - Felt::new(0x1adb26e6c1630440), - Felt::new(0x42e5495895baee92), + Felt::new(0xea4f289f9693ec8d), + Felt::new(0x588619a7df3e0fc6), + Felt::new(0x6389b9f3593c4147), + Felt::new(0x80eddd98a455f424), ]), Word::new([ - Felt::new(0xe07020daabcdebae), - Felt::new(0x2d5c6456b50a05c3), - Felt::new(0x3050bdec1715085b), - Felt::new(0xe4d05bce00c4f30d), + Felt::new(0xfdb071de197aa1fa), + Felt::new(0x9ebf28b5367b0b30), + Felt::new(0x903691bea5e02644), + Felt::new(0x1885c5b911033b78), ]), Word::new([ - Felt::new(0xe64d54038f19cbc3), - Felt::new(0xde70db9c37ffc1a6), - Felt::new(0xb4a54682fe025b15), - Felt::new(0xcb4e28247a791f29), + Felt::new(0x14c62abb80b3a5a), + Felt::new(0xddb6686bbebe29c5), + Felt::new(0xb81da11fbadf796c), + Felt::new(0xf10541bf63efaedc), ]), Word::new([ - Felt::new(0x9cd2815cef52b092), - Felt::new(0xd46fa4485d7aaf5c), - Felt::new(0x275777fd3b9637f7), - Felt::new(0x684317aab8bb48da), + Felt::new(0x53769de620b4d7d5), + Felt::new(0xc8357de15f14c907), + Felt::new(0x3a3430a09e6ab803), + Felt::new(0x349eb5b389339747), ]), Word::new([ - Felt::new(0xfef7ca5bc1a8531), - Felt::new(0x66da24a709f70f60), - Felt::new(0xc6d0048b0222dc8d), - Felt::new(0xd82cc216eed266b4), + Felt::new(0xd32edd92ee3597cd), + Felt::new(0xfed08f68579f5d19), + Felt::new(0x8080848b85559b70), + Felt::new(0x18ee5f8f74772555), ]), Word::new([ - Felt::new(0xc11007d4b20c68e8), - Felt::new(0xb88dea2c92f105d1), - Felt::new(0xfe885fceee959992), - Felt::new(0x4d8c71eeb47c8f90), + Felt::new(0x1eaecabc395eb3ca), + Felt::new(0xcee04708413469f3), + Felt::new(0x9e327fc63d557259), + Felt::new(0xb734b4fb745d8876), ]), Word::new([ - Felt::new(0x980fbe89dd050886), - Felt::new(0xdb7ad3a9a9f39be1), - Felt::new(0xf830b6439c7e9bc0), - Felt::new(0xdd76938b7c686c07), + Felt::new(0xd8334c7f3822e64d), + Felt::new(0xd6fac4cf1a8e9e9b), + Felt::new(0x889e88c42d27086d), + Felt::new(0x9fc028639782ac3e), ]), Word::new([ - Felt::new(0xb678629d183cf841), - Felt::new(0x664f19c21a6465bc), - Felt::new(0xba142578e79eb9d0), - Felt::new(0x1d57cbcdb2bbcb18), + Felt::new(0x2b31fcf3db65a0b8), + Felt::new(0x2335ec0c61381060), + Felt::new(0xf83740c4484f865d), + Felt::new(0xca78a031f895b478), ]), Word::new([ - Felt::new(0xc8822aae44990ed3), - Felt::new(0xf7edce1d2a235ab4), - Felt::new(0x8f35d229e981ca01), - Felt::new(0x50dc4c673c8fc58), + Felt::new(0xb024ed5aaab4e0e2), + Felt::new(0xb679e50459d10961), + Felt::new(0x2aa647595b95809a), + Felt::new(0x6cbb814d03cb1050), ]), Word::new([ - Felt::new(0x86edc215b92306e7), - Felt::new(0xe333ce17fd0f40df), - Felt::new(0xabcca6409bb48e29), - Felt::new(0xa110affea61c2951), + Felt::new(0x973d00d01b315e5c), + Felt::new(0xca40abc63e02d761), + Felt::new(0xffe9668b74f5d3e), + Felt::new(0x9e32938755c526d1), ]), Word::new([ - Felt::new(0x269d782ba380a2e4), - Felt::new(0x32bdc65a619310cd), - Felt::new(0x52895e02cb1df991), - Felt::new(0x1749f76388896455), + Felt::new(0x9d11baa0d7916712), + Felt::new(0xfb39766c72705f4e), + Felt::new(0xb4e2faa466611377), + Felt::new(0xe506307dd8d57b43), ]), Word::new([ - Felt::new(0x8f99ac4698f12102), - Felt::new(0x9983407c99f948c5), - Felt::new(0x7b89856f980cb407), - Felt::new(0x8acff0a017e68367), + Felt::new(0x95ffb9fc14efdecb), + Felt::new(0xbb2eadb4662b9da4), + Felt::new(0x5474a5291e5489f3), + Felt::new(0x95dc151ad0aaca6f), ]), Word::new([ - Felt::new(0xe7983973c759318a), - Felt::new(0xb389a6754d7976ca), - Felt::new(0x1d7ded5044c6ede6), - Felt::new(0x4290fc214bd001d7), + Felt::new(0xea122881fe161b45), + Felt::new(0x96489b253c89ae19), + Felt::new(0xc137c2a9fc3939f9), + Felt::new(0x28ef67075c763533), ]), Word::new([ - Felt::new(0x2a1607db398812eb), - Felt::new(0xbbaaed6d5de95899), - Felt::new(0x53699ff1add9cc48), - Felt::new(0x71c99c4c20a2cbe9), + Felt::new(0xdf9cc227338945fe), + Felt::new(0x4e009f2fa0d11d7a), + Felt::new(0x93d28360b41fea9a), + Felt::new(0x2e23dd18fb5e3430), ]), Word::new([ - Felt::new(0x9c211abaf37beba7), - Felt::new(0x44f91ee2c8f84830), - Felt::new(0xdaf1ca95546ff105), - Felt::new(0x4d15218eb972c855), + Felt::new(0xbbacee1eac480274), + Felt::new(0x5df2420822bbdb29), + Felt::new(0x273876d51ab28a7c), + Felt::new(0x5b2cce865277eb8f), ]), Word::new([ - Felt::new(0x47018b067647ff40), - Felt::new(0xabd25bc93e3cd280), - Felt::new(0x1e33fd9953262800), - Felt::new(0x9b8f68c64db159c3), + Felt::new(0x8eacb9ec570d0bfd), + Felt::new(0xd93cb13f32c59541), + Felt::new(0xa03a7780adeab0cb), + Felt::new(0x96bf26bf16a0c20a), ]), Word::new([ - Felt::new(0xa20fb2bcf2636418), - Felt::new(0xdc8996a5085ba820), - Felt::new(0x349b49cddfc936d4), - Felt::new(0x1d816c1d0bfef815), + Felt::new(0xd02199f182c7c44c), + Felt::new(0x2bcb02e4d9972e10), + Felt::new(0x1947aa10d093b782), + Felt::new(0xf8ce237f239a422e), ]), Word::new([ - Felt::new(0xc19364d95b916e9b), - Felt::new(0xdcb0cf99f9ca31b5), - Felt::new(0x1b5493d83dca1621), - Felt::new(0xf0758e5e3459a0f9), + Felt::new(0xc59e3b7237e49c5d), + Felt::new(0x99ef9f91bd859046), + Felt::new(0x1a045cfcbfc42d3c), + Felt::new(0x52f64e1f7e149d50), ]), Word::new([ - Felt::new(0xdf2cb895c1de5b3a), - Felt::new(0xb7347b591512353a), - Felt::new(0xfdbbce7837412eb7), - Felt::new(0x893fa2af604d446f), + Felt::new(0xd80c9ddbb8d33e12), + Felt::new(0xe2eba2ca287db211), + Felt::new(0xbf3b52bf58c3b6fa), + Felt::new(0xe45d1fcd58fae7c1), ]), Word::new([ - Felt::new(0x75d2b8fc6043d11e), - Felt::new(0xa6559eaebeed7d5f), - Felt::new(0xa9379773dad056b3), - Felt::new(0xf3bcf80d0748d3c1), + Felt::new(0x58b23f68e7c1181), + Felt::new(0xc1957d3818a0f35f), + Felt::new(0xc369c3257cdff85c), + Felt::new(0x4ecfb5f107df28ce), ]), Word::new([ - Felt::new(0x35b731f6c583214a), - Felt::new(0x26249962927dd05f), - Felt::new(0x75fc431a3e7c9e93), - Felt::new(0x170c1036d421083d), + Felt::new(0x4b8c985ba74188b6), + Felt::new(0x66ea95855e191b57), + Felt::new(0x151c0662fe97ef91), + Felt::new(0x517ffd6e5dd87316), ]), Word::new([ - Felt::new(0x1d6fbabfdf0d9096), - Felt::new(0x7d7c9687d9eca6cc), - Felt::new(0xd62974b75d27af1c), - Felt::new(0x93ed9a3825cc1c35), + Felt::new(0xaa310cfa768bc071), + Felt::new(0x35c683204f1f7a5b), + Felt::new(0xf1a3e64c7fd12971), + Felt::new(0xc071d798762a5f59), ]), Word::new([ - Felt::new(0xd30946664518ff6e), - Felt::new(0xd3e54aedfb7ba7e5), - Felt::new(0xb91107b2bfadfa1d), - Felt::new(0x2f7b0b2cb06cc43b), + Felt::new(0xe163a0558e4ada6a), + Felt::new(0x16864ee667320dd0), + Felt::new(0x6a7ee65793d04854), + Felt::new(0x59b459e6c0cfd7e), ]), Word::new([ - Felt::new(0x47d1dc850260558e), - Felt::new(0x8e5dbde02c522c39), - Felt::new(0x3464d9fe9fd4a1e), - Felt::new(0xf9e5bcfe534437be), + Felt::new(0x22e4a0a001eb1015), + Felt::new(0xba711695a8865274), + Felt::new(0x586544b816143930), + Felt::new(0xd6e2bf9b531be327), ]), Word::new([ - Felt::new(0x83378fd3d8e8a235), - Felt::new(0x5c12793119b6dfdb), - Felt::new(0xfc6f110fe6acbc57), - Felt::new(0x3138336422622a48), + Felt::new(0x8c72517df821c34b), + Felt::new(0x1a9838a014fd288e), + Felt::new(0xe5411d1d40288388), + Felt::new(0x7d79eb302daa9e3b), ]), Word::new([ - Felt::new(0x239c939a0a9787a0), - Felt::new(0x6c0d389b75f1cfb4), - Felt::new(0xc1947a136998e2a1), - Felt::new(0x76c1779e38ffb573), + Felt::new(0xe43f22af98d4319c), + Felt::new(0x25e3871ca9f92728), + Felt::new(0x762bf3cdc93e6a14), + Felt::new(0x16f6e357adafee63), ]), Word::new([ - Felt::new(0x7a266f705e62cd23), - Felt::new(0x7246a2960a038c2), - Felt::new(0xc1f47087a22fa2cb), - Felt::new(0xf298d4651af0b8b2), + Felt::new(0xa99f1387a11c6c9d), + Felt::new(0x68a1c792ee1cda6), + Felt::new(0xb6af58d26d306e00), + Felt::new(0xfca5d691fd46cb33), ]), Word::new([ - Felt::new(0x623bcdb6cc15e3ad), - Felt::new(0x8a6e820adf4725c3), - Felt::new(0x48737f1587e13208), - Felt::new(0xbf747c141bf3564c), + Felt::new(0x46b19d9575d5a999), + Felt::new(0x4c85bbe9c316d745), + Felt::new(0xe75c3c0215fdc2a3), + Felt::new(0x627bcc2c05380f82), ]), Word::new([ - Felt::new(0x14842ec18fe2348c), - Felt::new(0x3701e593309841cf), - Felt::new(0x8e85c9f1884fdf7b), - Felt::new(0xa4cc06a6b8cae8e3), + Felt::new(0xe0d9f7bd745a6139), + Felt::new(0xecd57179df992475), + Felt::new(0x14adc18ec0ab9a32), + Felt::new(0x87e2e8c38e84d27d), ]), Word::new([ - Felt::new(0xcfebb64f4bf4f79), - Felt::new(0x54754d70569eeecd), - Felt::new(0x50405a6b79d1ae83), - Felt::new(0x9075f17ccebc056c), + Felt::new(0xd8ad07ca4b066157), + Felt::new(0x40cbe185468109c0), + Felt::new(0x8ff6e16bb6f0acf3), + Felt::new(0x3a8538ff68aeb4a0), ]), Word::new([ - Felt::new(0x9a93d03d0f9c825f), - Felt::new(0xf704fa1580fe53c7), - Felt::new(0xf95df7a7d06a22b7), - Felt::new(0x8462e18adf8b3607), + Felt::new(0x7f0c04ca40410bde), + Felt::new(0xc93b0fc7fe5a4be4), + Felt::new(0x541bd0fff26378a2), + Felt::new(0xf4583e69e45aa98b), ]), Word::new([ - Felt::new(0xb5210a5cbd9556b4), - Felt::new(0x6fd4218ebf3c7336), - Felt::new(0x19d661830be725ae), - Felt::new(0x28a2862b49428353), + Felt::new(0x16c3ad2b8fcbf6a6), + Felt::new(0x20f02cdbe3a422ca), + Felt::new(0xa0c82db5bb435141), + Felt::new(0xdf60ac327044e6dd), ]), Word::new([ - Felt::new(0x93ceddc8a18724fe), - Felt::new(0x4e3299172e9130ed), - Felt::new(0x80229e0e1808c860), - Felt::new(0x13f479347eb7fd78), + Felt::new(0x23f34324486cf69a), + Felt::new(0x56d25f6ea8774a2e), + Felt::new(0x778eb42f8e4203ee), + Felt::new(0xd9bfd51145f77a34), ]), Word::new([ - Felt::new(0x86e4db88d39d4203), - Felt::new(0x81c24ca37b068741), - Felt::new(0x12b7d21371ca58f5), - Felt::new(0xb6546d4722efcbb0), + Felt::new(0x964229279ccb8ee9), + Felt::new(0x21a4dce43c249fc3), + Felt::new(0xd74eb222e6e70016), + Felt::new(0xf1939377a0cd2d8), ]), Word::new([ - Felt::new(0x96ce1320155172c5), - Felt::new(0xbf622c3a5ab86fba), - Felt::new(0x5876a31266554836), - Felt::new(0x4f23fd3646963922), + Felt::new(0x6accdf4f970c96a2), + Felt::new(0x843589dfd6e770c0), + Felt::new(0xdcf316fec1f41538), + Felt::new(0xc679df0c52121fc9), ]), Word::new([ - Felt::new(0x48f59a613c9baa43), - Felt::new(0x761de5ad2fd2c806), - Felt::new(0x2db99e809e35728f), - Felt::new(0x38b05ac131a0edc0), + Felt::new(0xb84e5d32796aae8c), + Felt::new(0xe8059efb9fbdd0bd), + Felt::new(0xd2727b248292d2fa), + Felt::new(0xfe80340c738661b2), ]), Word::new([ - Felt::new(0x6e4fba2ef071cb8a), - Felt::new(0x77c415814dc5a0e5), - Felt::new(0xa0492c8344a64bb1), - Felt::new(0xc6dd5e8dbc841fe5), + Felt::new(0x767c7d96e0863dd9), + Felt::new(0xec2ee4294c5b4456), + Felt::new(0x4e1c55d9f00c292), + Felt::new(0x93d56e40ac873ea4), ]), Word::new([ - Felt::new(0xa31e2e634187fec), - Felt::new(0xa4c019c12457e4b1), - Felt::new(0xa7b9de27a75ec6b4), - Felt::new(0x990bacb76b218164), + Felt::new(0x9a9ef79a545675db), + Felt::new(0xa72b254d8276b0ed), + Felt::new(0x931881e4971e5385), + Felt::new(0x81c8e39b3f7dd52f), ]), Word::new([ - Felt::new(0x97c85363ab1c997e), - Felt::new(0xa95cd8ccab0b41b3), - Felt::new(0xb98b7ebc3680470b), - Felt::new(0x22fe1b13640f19a9), + Felt::new(0x935669bd1213fd04), + Felt::new(0x72c57f762c09437), + Felt::new(0x18217f624bc70556), + Felt::new(0xd64b394846c549af), ]), Word::new([ - Felt::new(0x113c9a5f0dfbf187), - Felt::new(0x77f2dc9c46f3d699), - Felt::new(0xc3d92d34c950f8f4), - Felt::new(0x9cc6aaf7ffdaf2b6), + Felt::new(0x9bbb4616365b2ea2), + Felt::new(0x19c8c5d9137e56ce), + Felt::new(0x9d1111260fecec13), + Felt::new(0x41a2b2e0f870b070), ]), Word::new([ - Felt::new(0xa5f51bc68b62924c), - Felt::new(0x54182d0b8b519f87), - Felt::new(0x15b42760e2ad50a5), - Felt::new(0x3b2d54cae046788), + Felt::new(0xc389cf2838e661df), + Felt::new(0x2b2390795679fc2d), + Felt::new(0x1a06f8f594a5779f), + Felt::new(0x6af322014f565c2f), ]), Word::new([ - Felt::new(0xefec815078a58b7d), - Felt::new(0x2d02bd88ae2b8a3d), - Felt::new(0x7b3dee115eaac60a), - Felt::new(0x8e659da09a00ffad), + Felt::new(0xa5c607667558109a), + Felt::new(0x7b9587a0fa3b82fe), + Felt::new(0x46514e189536926b), + Felt::new(0xf415f181043e7187), ]), Word::new([ - Felt::new(0x1987fb02253b4338), - Felt::new(0xa7c1e3a856b329be), - Felt::new(0x8d90defd305553e8), - Felt::new(0xb132ee2f7526c94d), + Felt::new(0xd116f0cec205c7f8), + Felt::new(0x32b47d268aee9985), + Felt::new(0x33c45a0dce9d411d), + Felt::new(0x1b8666d00071eb40), ]), Word::new([ - Felt::new(0x1556b5441e77734f), - Felt::new(0xa2ceaf4b2822a233), - Felt::new(0x41e5ee79d553e00c), - Felt::new(0xf2cdc04fd67a69f2), + Felt::new(0x763c2acc6485a335), + Felt::new(0x8898a0ecea149931), + Felt::new(0xf950dee87da2cfa0), + Felt::new(0xb67c8db4e1f76963), ]), Word::new([ - Felt::new(0xd4a8d6025cb6e3a), - Felt::new(0xd8d181277e183f21), - Felt::new(0x3bf9725618de11d3), - Felt::new(0xb26a0eb5a7d9c86e), + Felt::new(0xeab92f17cc5669e3), + Felt::new(0x1d7c7c77ec161b77), + Felt::new(0x51339cda396b9126), + Felt::new(0x136d9afecd1ce45d), ]), Word::new([ - Felt::new(0xcdc5ad1e45e351c2), - Felt::new(0xf00b06807244caa6), - Felt::new(0xbbb01495c9a7e17d), - Felt::new(0xd9614df7e656a73f), + Felt::new(0x638db6faffb9b065), + Felt::new(0x46b7c590267345a2), + Felt::new(0x3a83af8bdb9fa24a), + Felt::new(0x7c4b3be077e93d15), ]), Word::new([ - Felt::new(0xfc61931c05c4a55f), - Felt::new(0xcff6ce2372650a9), - Felt::new(0x6e6c32ff4dc92c6), - Felt::new(0x1b72d8c04b0e409d), + Felt::new(0x713ca5afe11f3e5b), + Felt::new(0xaafc34e968ae8792), + Felt::new(0x290b4cdef7a48a56), + Felt::new(0xabff471fe841e07f), ]), Word::new([ - Felt::new(0x77d6e2f32439dbf0), - Felt::new(0xa1f8ce9eb02419a5), - Felt::new(0xd3ad9fb0cea61624), - Felt::new(0x66ab5c684fbb8597), + Felt::new(0x46bbadc4fd475e8b), + Felt::new(0xf26792d3ac61c3ae), + Felt::new(0x3e57dafa1a6af337), + Felt::new(0xc6d722ae0d17a589), ]), - EMPTY_WORD, + Word::new([Felt::new(0x0), Felt::new(0x0), Felt::new(0x0), Felt::new(0x0)]), ]; #[test] @@ -1589,7 +1589,7 @@ fn all_depths_opens_to_zero() { assert_eq!(depth as usize + 1, subtree.len()); // assert the opening is zero - let initial = EMPTY_WORD; + let initial = crate::EMPTY_WORD; assert_eq!(initial, subtree.remove(0)); // compute every node of the path manually and compare with the output @@ -1607,7 +1607,7 @@ fn all_depths_opens_to_zero() { fn test_entry() { // check the leaf is always the empty work for depth in 0..255 { - assert_eq!(EmptySubtreeRoots::entry(depth, depth), &EMPTY_WORD); + assert_eq!(EmptySubtreeRoots::entry(depth, depth), &crate::EMPTY_WORD); } // check the root matches the first element of empty_hashes diff --git a/miden-crypto/src/merkle/smt/forest/tests.rs b/miden-crypto/src/merkle/smt/forest/tests.rs index a6b663cf3..bfb2547ee 100644 --- a/miden-crypto/src/merkle/smt/forest/tests.rs +++ b/miden-crypto/src/merkle/smt/forest/tests.rs @@ -35,10 +35,10 @@ fn test_insert_root_empty() -> Result<(), MerkleError> { assert_eq!( forest.insert(empty_tree_root, key, value)?, Word::new([ - Felt::new(10376354645124572258), - Felt::new(13808228093617896354), - Felt::new(4835829334388921262), - Felt::new(2144113770050911180) + Felt::new(17566703186976592377), + Felt::new(10698964398442624200), + Felt::new(17156877103802520546), + Felt::new(4782456441201120034), ]), ); Ok(()) @@ -55,10 +55,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(10376354645124572258), - Felt::new(13808228093617896354), - Felt::new(4835829334388921262), - Felt::new(2144113770050911180) + Felt::new(17566703186976592377), + Felt::new(10698964398442624200), + Felt::new(17156877103802520546), + Felt::new(4782456441201120034), ]), ); @@ -66,10 +66,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(10376354645124572258), - Felt::new(13808228093617896354), - Felt::new(4835829334388921262), - Felt::new(2144113770050911180) + Felt::new(17566703186976592377), + Felt::new(10698964398442624200), + Felt::new(17156877103802520546), + Felt::new(4782456441201120034), ]), ); @@ -82,10 +82,10 @@ fn test_insert_multiple_values() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(1600265794710932756), - Felt::new(4102884415474859847), - Felt::new(7916203901318401823), - Felt::new(9187865964280213047) + Felt::new(838199083189246611), + Felt::new(16778657488739036237), + Felt::new(13828051603373627066), + Felt::new(2453801083600635673), ]) ); @@ -111,10 +111,10 @@ fn test_batch_insert() -> Result<(), MerkleError> { assert_eq!( new_root, Word::new([ - Felt::new(7086678883692273722), - Felt::new(12292668811816691012), - Felt::new(10126815404170194367), - Felt::new(1147037274136690014) + Felt::new(117604577632613381), + Felt::new(15058212884545544983), + Felt::new(5650876462024416752), + Felt::new(6460194250276012043), ]) );