jf_poseidon2/constants/
bls12_381.rs

1//! Poseidon2 constants for the scalar field of BLS12-381
2
3use super::from_hex;
4use crate::{define_poseidon2_params, Poseidon2Params};
5use ark_bls12_381::Fr;
6use lazy_static::lazy_static;
7
8define_poseidon2_params!(
9    Poseidon2ParamsBls2,
10    2,             // State size
11    5,             // S-box size
12    8,             // External rounds
13    56,            // Internal rounds
14    RC2_EXT,       // External round constants
15    RC2_INT,       // Internal round constants
16    MAT_DIAG2_M_1  // Diagonal matrix constant
17);
18
19define_poseidon2_params!(
20    Poseidon2ParamsBls3,
21    3,             // State size
22    5,             // S-box size
23    8,             // External rounds
24    56,            // Internal rounds
25    RC3_EXT,       // External round constants
26    RC3_INT,       // Internal round constants
27    MAT_DIAG3_M_1  // Diagonal matrix constant
28);
29
30// adapted from <https://github.com/HorizenLabs/poseidon2/blob/main/plain_implementations/src/poseidon2/poseidon2_instance_bls12.rs>
31lazy_static! {
32    /// internal diagonal matrix, state size = 2
33    pub static ref MAT_DIAG2_M_1: [Fr; 2] = [
34        from_hex("0000000000000000000000000000000000000000000000000000000000000001"),
35        from_hex("0000000000000000000000000000000000000000000000000000000000000002"),
36    ];
37
38    /// external round constants, state size = 2
39    pub static ref RC2_EXT: [[Fr; 2]; 8] = [
40        [
41            from_hex("6267f5556c88257324c1c8b00d5871b2eba13cc39d72aa10dde6b69bc44c41c7"),
42            from_hex("30347723511438a085118166c68bf0c4f4ab5c10a2c55adb5cf87cc9e030f60f"),
43        ],
44        [
45            from_hex("10db856965e40038eb6427303181e7b7439f1a051aa4630c26cf86d0a0451a4b"),
46            from_hex("5a3d2dcd541e4faaae7eb143eec847a0f652b6dc1b92e3f39ec23c808b3a5d63"),
47        ],
48        [
49            from_hex("3b07f0ff7edcf93b1dd0487bc9fab1c6905f9ceee38dcce83efeb3a320398526"),
50            from_hex("40c73c524b9fd0fab63128175befe07b5c63ccdde9ca10e1a37205c9607fdf8a"),
51        ],
52        [
53            from_hex("3a933861cf23752376d94dbb24b0f3c61630787928875c07672b68abfb9191e0"),
54            from_hex("71cc165e208570b2d5ef81db84e3c5e714ea4edfb36fc7fb11ef65a64b2d9755"),
55        ],
56        [
57            from_hex("6e690b956e00b9e339dec49d675586f661f9b081ee3fa7696d73977658aa6fea"),
58            from_hex("660b85bc22de06d476c47bf084ad436f59874f1d630c0f5c91fbef51d5e738c5"),
59        ],
60        [
61            from_hex("32bf3d451b69dde075fc370eaa8c1b77b5c0bc2aab1c7b46da7ef9d1840b0419"),
62            from_hex("73924b40beaa9c1ce4074c2154d1af4d658c09395a568b99b2fbcc3b5685e810"),
63        ],
64        [
65            from_hex("17cbb3ee0adcb9d977e96e9152b36042925244fdd0aa184c7a89a58a2dc40097"),
66            from_hex("29d76a821e3220775c552f6b5977ab94956e52b8dac36ef88ace050d553766a3"),
67        ],
68        [
69            from_hex("62b1a6c06ab26881a1fe57eceac56b5aec0b96da7211557f4e27ec24296d7db6"),
70            from_hex("0dfc474151e5c605a693a51ae8227cc0a99fdc4524fc2810c6eda9035d04334d"),
71        ],
72    ];
73
74    /// internal round constants, state size = 2
75    pub static ref RC2_INT: [Fr; 56] = [
76        from_hex("6c0dc9eb332b5d968bec8ad68fe24ce34087ea54093f153618434475bce402f8"),
77        from_hex("0af5bafd335dae5c86967b11d5dcefb986a54c9d60d35eb06dc7a3fd779b3906"),
78        from_hex("6e12847918f030f2626c150ab69e4be0f13d202ae1f8bc87ea74323e93372e3b"),
79        from_hex("5565d40e21d059a26db241ca125d9316283eadf144b1318e604e253eeae1fe9a"),
80        from_hex("608e01b42d3dca09fed9b54eadaaba3e4ce6aefe92b0dc954a0fa4683a9678f2"),
81        from_hex("16bbe434b24f94e2c40ed1f4f9bd7d17e5be96c3aec15579b35fd80f0f80de9e"),
82        from_hex("0d1be811a8e73220cab01ce981d475522c3d7dd9e2716c3a2cf4ddd541546890"),
83        from_hex("5997a3affb18f942868b86f8ee10a68966e90bac7bbd8c65ede7e6e5ef1f6320"),
84        from_hex("4d92e86d270041061eec80278079fca771499dea5ccdc99682a953bb3a038b8e"),
85        from_hex("616c8c5ce232b9314f694fc6a968446ea9daf7a4079ce1a75fcc950741d680bb"),
86        from_hex("677e31e7846d9131bdc350eaf11a8ff918dd258ddd800444424afab34dfdfe3d"),
87        from_hex("4e7d7f85aefc110b233525ee3e53851aee7d3241e2a132585e0e25005eee0b0e"),
88        from_hex("06a8b4539488b7dddc48c3a226dbda313f906e106f844196d55013d321244f13"),
89        from_hex("5091517b6a85783108999f8e6bda3c793bef3f2e9589641d260bdfde8bdef00d"),
90        from_hex("0d2703e5b30f54d7f414e901802d54f8c14cd6355415df6e0f063d16bef9c43a"),
91        from_hex("56f69096811148eb38eec143d32565c077b3d1a4a4351f2b458f43b1659d4495"),
92        from_hex("622d94d38d1ded428afd062008c5709b43a678f6ba518ec56383e8ffba473504"),
93        from_hex("2730c607bba7333723a4a44577819b7db82a24574f6d13eee4c856c1ca3de9c7"),
94        from_hex("01ac5f59256c5004dc1043c53b23800a3fbab53eb1a83f551056f227b514b9f6"),
95        from_hex("0790b92523c973f1c95b94937afbb5796d89481e7a56328b44bab5ba81ae42f3"),
96        from_hex("1d63b59d97bc269d13964fb3e8771d0acc749bc83eb2f0372484e266142bb8c0"),
97        from_hex("1a52d04e5f14a3a05f7a01262df9e68c77fdf7e2bfb56c8b252d2140efdf0914"),
98        from_hex("5aa9b3b808812b284857e8622843a8717fa5cb49b217017f31d79e8d0f963fc0"),
99        from_hex("6a3d18fdbeb1d77ec1304539b00e6188786dbbc4435269b4c6281367f42656e3"),
100        from_hex("4743e860df269a85dd76fb99dbe9d840eb669dc859754b3f74805e57ba288b00"),
101        from_hex("6c32cac3946825f80a434c5ab397fc1a1c6a9bdfaab53175d4cf3d29ddb6cbc6"),
102        from_hex("333b0eea5da7ed1e3959d16280a361aa77dd24ecbfb28e1b2583ac4e9894305c"),
103        from_hex("3b503fc333b795ccc0c5bb3ae26b077dc3742cb745ec8821648c5ce7ebd9df18"),
104        from_hex("4fa5853188d9f728a17532d94bee6fb28fee510380a5d50927c6c5b1ce283444"),
105        from_hex("5d2ed8a6603a905bac490ebfb9e6c18f0bc9da1bbc2173291b18de6b6186118f"),
106        from_hex("2d830a53584c5556264852f075c78f7f9eb068016ae88af9cda933d6ae52eca7"),
107        from_hex("0250f4d6780ad29ae60e55f135b9ac80ccc7c81e3add37db276c26f1a2b1b86e"),
108        from_hex("6e3e9595f59220599e23e830728d4a0c4d62515ec1ed10b72446cf4df5b4c308"),
109        from_hex("2cd3314555d6faf23ee90cdb884f1c4697ebe98e3a450a624c4d896233b93cd5"),
110        from_hex("584a408d0f370543b8413fee70a060a394e561f504d8679f7bece4bf222e4108"),
111        from_hex("499cd53437b9fcbf7479c00fcc21295759074ce9bd1bb1fbd3460237aef4759e"),
112        from_hex("56a9b567bd0646effd0608d74d537991136098d9a06af6cb3ff8f010efb57578"),
113        from_hex("6a5fae2b00d968b931441b374e27ba4d03b306bd602d48731677169e75a67e8c"),
114        from_hex("2e1cc28e390e64aa1d60edb99c0aeda7c8c32bdb01ba11abbad5026b46eccb27"),
115        from_hex("2d4820000675df7c276beac408fe2e851e734a7008ae09bbcb3c96c70024f71b"),
116        from_hex("0c2fe101a2b52b538b902c6b2dc992cb266f7636e05b0c068385b5fa19e97142"),
117        from_hex("209b790b78c0e7927c6a178ef2f00b8687fc7bd4f21a9e02578551535002bc95"),
118        from_hex("2dd0926cf56bbaaec6491513d08a9983f94a910852a7b4ea4bd4222b93e14c10"),
119        from_hex("4316b39dd7d65b1bb575198104d409b169236a7ade371f7ab176fcbae75a5f0d"),
120        from_hex("540276d61041b91f6ea3068ec260a9338b6e3da15d934e648c24f35aee04e535"),
121        from_hex("37af612900b839977b146324c84772c58a4ccc0f6494cc054571827e74bfd2d3"),
122        from_hex("2af00c93d59ed14c9911e5cb3781d772371e83228e4267bbce11d065c1955338"),
123        from_hex("62b48779b0cf7ff2c10fd9b91a6ff7b7a99f935e961a5a94aa38f9d4f71c8b4c"),
124        from_hex("540bf5bbe01f28563bcbe11a2ce346d8231a2cdd0fe07641f9fa89e5c21978e3"),
125        from_hex("232b6c847a6d23912cb10ecbe50b53491f67f71e9b87a4a30446f2218017874b"),
126        from_hex("0ab34adbe77b8f1e57a370e4fd626071eea74b3f0b66644a629efaa0e96456c0"),
127        from_hex("1a83e43ef118c90046b1bdbeab8dd5cdcab632807c2cd0dc9147cbc5b7084be8"),
128        from_hex("1ec6fa41b41b672d9005468720918130b642567462a3d557a595d4dc6c56f2f9"),
129        from_hex("01f81a153199a751a111b8f5212cfc5bf82aacf0287d03e1864f8e5713fe4a17"),
130        from_hex("2617307587a675f4ecd73a54a7b206162d751cabf3d9fd007bcca4de2c6f0649"),
131        from_hex("1647be94c515178c7974a245624b642bb1ae6e2d4e1682087e362d7f98bc953f"),
132    ];
133
134    /// internal diagonal matrix, state size = 3
135    pub static ref MAT_DIAG3_M_1: [Fr; 3] = [
136        from_hex("0000000000000000000000000000000000000000000000000000000000000001"),
137        from_hex("0000000000000000000000000000000000000000000000000000000000000001"),
138        from_hex("0000000000000000000000000000000000000000000000000000000000000002"),
139    ];
140
141    /// external round constants, state size = 3
142    pub static ref RC3_EXT: [[Fr; 3]; 8] = [
143        [
144            from_hex("6f007a551156b3a449e44936b7c093644a0ed33f33eaccc628e942e836c1a875"),
145            from_hex("360d7470611e473d353f628f76d110f34e71162f31003b7057538c2596426303"),
146            from_hex("4b5fec3aa073df44019091f007a44ca996484965f7036dce3e9d0977edcdc0f6"),
147        ],
148        [
149            from_hex("67cf1868af6396c0b84cce715e539f849e06cd1c383ac5b06100c76bcc973a11"),
150            from_hex("555db4d1dced819f5d3de70fde83f1c7d3e8c98968e516a23a771a5c9c8257aa"),
151            from_hex("2bab94d7ae222d135dc3c6c5febfaa314908ac2f12ebe06fbdb74213bf63188b"),
152        ],
153        [
154            from_hex("66f44be5296682c4fa7882799d6dd049b6d7d2c950ccf98cf2e50d6d1ebb77c2"),
155            from_hex("150c93fef652fb1c2bf03e1a29aa871fef77e7d736766c5d0939d92753cc5dc8"),
156            from_hex("3270661e68928b3a955d55db56dc57c103cc0a60141e894e14259dce537782b2"),
157        ],
158        [
159            from_hex("073f116f04122e25a0b7afe4e2057299b407c370f2b5a1ccce9fb9ffc345afb3"),
160            from_hex("409fda22558cfe4d3dd8dce24f69e76f8c2aaeb1dd0f09d65e654c71f32aa23f"),
161            from_hex("2a32ec5c4ee5b1837affd09c1f53f5fd55c9cd2061ae93ca8ebad76fc71554d8"),
162        ],
163        [
164            from_hex("6cbac5e1700984ebc32da15b4bb9683faabab55f67ccc4f71d9560b3475a77eb"),
165            from_hex("4603c403bbfa9a17738a5c6278eaab1c37ec30b0737aa2409fc4898069eb983c"),
166            from_hex("6894e7e22b2c1d5c70a712a6345ae6b192a9c833a9234c31c56aacd16bc2f100"),
167        ],
168        [
169            from_hex("5be2cbbc44053ad08afa4d1eabc7f3d231eea799b93f226e905b7d4d65c58ebb"),
170            from_hex("58e55f287b453a9808624a8c2a353d528da0f7e713a5c6d0d7711e47063fa611"),
171            from_hex("366ebfafa3ad381c0ee258c9b8fdfccdb868a7d7e1f1f69a2b5dfcc5572555df"),
172        ],
173        [
174            from_hex("45766ab728968c642f90d97ccf5504ddc10518a819ebbcc4d09c3f5d784d67ce"),
175            from_hex("39678f65512f1ee404db3024f41d3f567ef66d89d044d022e6bc229e95bc76b1"),
176            from_hex("463aed1d2f1f955e3078be5bf7bfc46fc0eb8c51551906a8868f18ffae30cf4f"),
177        ],
178        [
179            from_hex("21668f016a8063c0d58b7750a3bc2fe1cf82c25f99dc01a4e534c88fe53d85fe"),
180            from_hex("39d00994a8a5046a1bc749363e98a768e34dea56439fe1954bef429bc5331608"),
181            from_hex("4d7f5dcd78ece9a933984de32c0b48fac2bba91f261996b8e9d1021773bd07cc"),
182        ]
183    ];
184
185    /// internal round constants, state size = 3
186    pub static ref RC3_INT: [Fr; 56] = [
187        from_hex("5848ebeb5923e92555b7124fffba5d6bd571c6f984195eb9cfd3a3e8eb55b1d4"),
188        from_hex("270326ee039df19e651e2cfc740628ca634d24fc6e2559f22d8ccbe292efeead"),
189        from_hex("27c6642ac633bc66dc100fe7fcfa54918af895bce012f182a068fc37c182e274"),
190        from_hex("1bdfd8b01401c70ad27f57396989129d710e1fb6ab976a459ca18682e26d7ff9"),
191        from_hex("491b9ba6983bcf9f05fe4794adb44a30879bf8289662e1f57d90f672414e8a4a"),
192        from_hex("162a14c62f9a89b814b9d6a9c84dd678f4f6fb3f9054d373c832d824261a35ea"),
193        from_hex("2d193e0f76de586b2af6f79e3127feeaac0a1fc71e2cf0c0f79824667b5b6bec"),
194        from_hex("46efd8a9a262d6d8fdc9ca5c04b0982f24ddcc6e9863885a6a732a3906a07b95"),
195        from_hex("509717e0c200e3c92d8dca2973b3db45f0788294351ad07ae75cbb780693a798"),
196        from_hex("7299b28464a8c94fb9d4df61380f39c0dca9c2c014118789e227252820f01bfc"),
197        from_hex("044ca3cc4a85d73b81696ef1104e674f4feff82984990ff85d0bf58dc8a4aa94"),
198        from_hex("1cbaf2b371dac6a81d0453416d3e235cb8d9e2d4f314f46f6198785f0cd6b9af"),
199        from_hex("1d5b2777692c205b0e6c49d061b6b5f4293c4ab038fdbbdc343e07610f3fede5"),
200        from_hex("56ae7c7a5293bdc23e85e1698c81c77f8ad88c4b33a5780437ad047c6edb59ba"),
201        from_hex("2e9bdbba3dd34bffaa30535bdd749a7e06a9adb0c1e6f962f60e971b8d73b04f"),
202        from_hex("2de11886b18011ca8bd5bae36969299fde40fbe26d047b05035a13661f22418b"),
203        from_hex("2e07de1780b8a70d0d5b4a3f1841dcd82ab9395c449be947bc998884ba96a721"),
204        from_hex("0f69f1854d20ca0cbbdb63dbd52dad16250440a99d6b8af3825e4c2bb74925ca"),
205        from_hex("5dc987318e6e59c1afb87b655dd58cc1d22e513a05838cd4585d04b135b957ca"),
206        from_hex("48b725758571c9df6c01dc639a85f07297696b1bb678633a29dc91de95ef53f6"),
207        from_hex("5e565e08c0821099256b56490eaee1d573afd10bb6d17d13ca4e5c611b2a3718"),
208        from_hex("2eb1b25417fe17670d135dc639fb09a46ce5113507f96de9816c059422dc705e"),
209        from_hex("115cd0a0643cfb988c24cb44c3fab48aff36c661d26cc42db8b1bdf4953bd82c"),
210        from_hex("26ca293f7b2c462d066d7378b999868bbb57ddf14e0f958ade801612311d04cd"),
211        from_hex("4147400d8e1aaccf311a6b5b762011ab3e45326e4d4b9de26992816b99c528ac"),
212        from_hex("6b0db7dccc4ba1b268f6bdcc4d372848d4a72976c268ea30519a2f73e6db4d55"),
213        from_hex("17bf1b93c4c7e01a2a830aa162412cd90f160bf9f71e967ff5209d14b24820ca"),
214        from_hex("4b431cd9efedbc94cf1eca6f9e9c1839d0e66a8bffa8c8464cac81a39d3cf8f1"),
215        from_hex("35b41a7ac4f3c571a24f8456369c85dfe03c0354bd8cfd3805c86f2e7dc293c5"),
216        from_hex("3b1480080523c439435927994849bea964e14d3beb2dddde72ac156af435d09e"),
217        from_hex("2cc6810031dc1b0d4950856dc907d57508e286442a2d3eb2271618d874b14c6d"),
218        from_hex("6f4141c8401c5a395ba6790efd71c70c04afea06c3c92826bcabdd5cb5477d51"),
219        from_hex("25bdbbeda1bde8c1059618e2afd2ef999e517aa93b78341d91f318c09f0cb566"),
220        from_hex("392a4a8758e06ee8b95f33c25dde8ac02a5ed0a27b61926cc6313487073f7f7b"),
221        from_hex("272a55878a08442b9aa6111f4de009485e6a6fd15db89365e7bbcef02eb5866c"),
222        from_hex("631ec1d6d28dd9e824ee89a30730aef7ab463acfc9d184b355aa05fd6938eab5"),
223        from_hex("4eb6fda10fd0fbde02c7449bfbddc35bcd8225e7e5c3833a0818a100409dc6f2"),
224        from_hex("2d5b308b0cf02cdfefa13c4e60e26239a6ebba011694dd129b925b3c5b21e0e2"),
225        from_hex("16549fc6af2f3b72dd5d293d72e2e5f244dff42f18b46c56ef38c57c311673ac"),
226        from_hex("42332677ff359c5e8db836d9f5fb54822e39bd5e22340bb9ba975ba1a92be382"),
227        from_hex("49d7d2c0b449e5179bc5ccc3b44c6075d9849b5610465f09ea725ddc97723a94"),
228        from_hex("64c20fb90d7a003831757cc4c6226f6e4985fc9ecb416b9f684ca0351d967904"),
229        from_hex("59cff40de83b52b41bc443d7979510d771c940b9758ca820fe73b5c8d5580934"),
230        from_hex("53db2731730c39b04edd875fe3b7c882808285cdbc621d7af4f80dd53ebb71b0"),
231        from_hex("1b10bb7a82afce39fa69c3a2ad52f76d76398265344203119b7126d9b46860df"),
232        from_hex("561b6012d666bfe179c4dd7f84cdd1531596d3aac7c5700ceb319f91046a63c9"),
233        from_hex("0f1e7505ebd91d2fc79c2df7dc98a3bed1b36968ba0405c090d27f6a00b7dfc8"),
234        from_hex("2f313faf0d3f6187537a7497a3b43f46797fd6e3f18eb1caff457756b819bb20"),
235        from_hex("3a5cbb6de450b481fa3ca61c0ed15bc55cad11ebf0f7ceb8f0bc3e732ecb26f6"),
236        from_hex("681d93411bf8ce63f6716aefbd0e24506454c0348ee38fabeb264702714ccf94"),
237        from_hex("5178e940f50004312646b436727f0e80a7b8f2e9ee1fdc677c4831a7672777fb"),
238        from_hex("3dab54bc9bef688dd92086e253b439d651baa6e20f892b62865527cbca915982"),
239        from_hex("4b3ce75311218f9ae905f84eaa5b2b3818448bbf3972e1aad69de321009015d0"),
240        from_hex("06dbfb42b979884de280d31670123f744c24b33b410fefd4368045acf2b71ae3"),
241        from_hex("068d6b4608aae810c6f039ea1973a63eb8d2de72e3d2c9eca7fc32d22f18b9d3"),
242        from_hex("4c5c254589a92a36084a57d3b1d964278acc7e4fe8f69f2955954f27a79cebef"),
243    ];
244}
245
246#[cfg(test)]
247pub(crate) mod tests {
248    use ark_ff::PrimeField;
249    use ark_std::test_rng;
250
251    use super::*;
252    use crate::Poseidon2;
253
254    pub(crate) fn consistent_perm_helper<
255        F: PrimeField,
256        const N: usize,
257        P: Poseidon2Params<F, N>,
258    >() {
259        let rng = &mut test_rng();
260        for _ in 0..10 {
261            let input1 = [F::rand(rng); N];
262            let input2 = [F::rand(rng); N];
263
264            // same input get the same permutated output
265            assert_eq!(
266                Poseidon2::permute::<P, N>(&input1),
267                Poseidon2::permute::<P, N>(&input1)
268            );
269            // diff input get diff permutated output
270            assert_ne!(
271                Poseidon2::permute::<P, N>(&input1),
272                Poseidon2::permute::<P, N>(&input2)
273            );
274        }
275    }
276    #[test]
277    fn consistent_perm() {
278        consistent_perm_helper::<Fr, 2, Poseidon2ParamsBls2>();
279        consistent_perm_helper::<Fr, 3, Poseidon2ParamsBls3>();
280    }
281
282    // copied from <https://github.com/HorizenLabs/poseidon2/blob/055bde3f4782731ba5f5ce5888a440a94327eaf3/plain_implementations/src/poseidon2/poseidon2.rs#L425>
283    #[test]
284    fn fixed_test_vector() {
285        let mut input = [Fr::from(0), Fr::from(1)];
286        Poseidon2::permute_mut::<Poseidon2ParamsBls2, 2>(&mut input);
287        assert_eq!(
288            input[0],
289            from_hex("73c46dd530e248a87b61d19e67fa1b4ed30fc3d09f16531fe189fb945a15ce4e")
290        );
291        assert_eq!(
292            input[1],
293            from_hex("1f0e305ee21c9366d5793b80251405032a3fee32b9dd0b5f4578262891b043b4")
294        );
295
296        let mut input = [Fr::from(0), Fr::from(1), Fr::from(2)];
297        Poseidon2::permute_mut::<Poseidon2ParamsBls3, 3>(&mut input);
298        assert_eq!(
299            input[0],
300            from_hex("1b152349b1950b6a8ca75ee4407b6e26ca5cca5650534e56ef3fd45761fbf5f0")
301        );
302        assert_eq!(
303            input[1],
304            from_hex("4c5793c87d51bdc2c08a32108437dc0000bd0275868f09ebc5f36919af5b3891")
305        );
306        assert_eq!(
307            input[2],
308            from_hex("1fc8ed171e67902ca49863159fe5ba6325318843d13976143b8125f08b50dc6b")
309        );
310    }
311}