Skip to content

Commit

Permalink
crypto: poseidon2: poseidonPerm: Add full poseidon2 permutation
Browse files Browse the repository at this point in the history
  • Loading branch information
joeykraut committed Jan 27, 2025
1 parent c12d129 commit 6cac3fc
Show file tree
Hide file tree
Showing 9 changed files with 394 additions and 24 deletions.
33 changes: 28 additions & 5 deletions codegen/poseidon-codegen/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use anyhow::Result;
use clap::Parser;
use itertools::Itertools;
use num_bigint::BigUint;
use renegade_constants::Scalar;
use renegade_crypto::fields::scalar_to_biguint;
use renegade_crypto::hash::{FULL_ROUND_CONSTANTS, PARTIAL_ROUND_CONSTANTS, R_F, R_P};
Expand All @@ -26,18 +25,42 @@ fn generate_huff_code() -> String {
const HALF_FULL: usize = R_F / 2;
let partial_rounds = R_P;

// Add warning header
code.push_str("// ⚠️ WARNING: This code is automatically generated. DO NOT modify by hand.\n");
code.push_str("// Generated by renegade-solidity-contracts/codegen/poseidon-codegen\n\n");

// Add the function signature
code.push_str("/// @dev Poseidon2 permutation function\n");
code.push_str("#define macro POSEIDON_PERM() = takes(3) returns(3) {\n");
code.push_str("\t // Takes [state[0], state[1]]\n\n");

code.push_str("\t// Start with the external MDS transformation\n\tEXTERNAL_MDS()\n\n");

// Add the first set of full rounds
code.push_str("\t// =====================\n");
code.push_str("\t// | First Full Rounds |\n");
code.push_str("\t// =====================\n\n");
for i in 0..HALF_FULL {
code.push_str(&generate_full_round(i));
}

// Add the partial rounds
code.push_str("\t// ==================\n");
code.push_str("\t// | Partial Rounds |\n");
code.push_str("\t// ==================\n\n");
for i in 0..partial_rounds {
code.push_str(&generate_partial_round(i));
}

// Add the second set of full rounds
code.push_str("\t// ======================\n");
code.push_str("\t// | Second Full Rounds |\n");
code.push_str("\t// ======================\n\n");
for i in HALF_FULL..R_F {
code.push_str(&generate_full_round(i));
}

code.push_str("}\n");
code
}

Expand All @@ -51,9 +74,9 @@ fn generate_full_round(i: usize) -> String {
.map(scalar_to_hex)
.collect_vec();

code.push_str(&format!("// --- Full Round {i} --- //\n"));
code.push_str(&format!("\t// --- Full Round {i} --- //\n"));
code.push_str(&format!(
"EXTERNAL_ROUND({}, {}, {})\n\n",
"\tEXTERNAL_ROUND({}, {}, {})\n\n",
round_constants_str[0], round_constants_str[1], round_constants_str[2]
));
code
Expand All @@ -66,8 +89,8 @@ fn generate_partial_round(i: usize) -> String {
let round_constant = PARTIAL_ROUND_CONSTANTS[i];
let round_constant_str = scalar_to_hex(Scalar::new(round_constant));

code.push_str(&format!("// --- Partial Round {i} --- //\n"));
code.push_str(&format!("INTERNAL_ROUND({round_constant_str})\n\n"));
code.push_str(&format!("\t// --- Partial Round {i} --- //\n"));
code.push_str(&format!("\tINTERNAL_ROUND({round_constant_str})\n\n"));
code
}

Expand Down
3 changes: 3 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ src = "src"
out = "out"
libs = ["lib"]
remappings = ["forge-std/=lib/forge-std/src/"]

[ffi]
enabled = true
215 changes: 215 additions & 0 deletions src/crypto/poseidon2/poseidonPerm.huff
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
// ⚠️ WARNING: This code is automatically generated. DO NOT modify by hand.
// Generated by renegade-solidity-contracts/codegen/poseidon-codegen

/// @dev Poseidon2 permutation function
#define macro POSEIDON_PERM() = takes(3) returns(3) {
// Takes [state[0], state[1]]

// Start with the external MDS transformation
EXTERNAL_MDS()

// =====================
// | First Full Rounds |
// =====================

// --- Full Round 0 --- //
EXTERNAL_ROUND(0x1d066a255517b7fd8bddd3a93f7804ef7f8fcde48bb4c37a59a09a1a97052816, 0x29daefb55f6f2dc6ac3f089cebcc6120b7c6fef31367b68eb7238547d32c1610, 0x1f2cb1624a78ee001ecbd88ad959d7012572d76f08ec5c4f9e8b7ad7b0b4e1d1)

// --- Full Round 1 --- //
EXTERNAL_ROUND(0xaad2e79f15735f2bd77c0ed3d14aa27b11f092a53bbc6e1db0672ded84f31e5, 0x2252624f8617738cd6f661dd4094375f37028a98f1dece66091ccf1595b43f28, 0x1a24913a928b38485a65a84a291da1ff91c20626524b2b87d49f4f2c9018d735)

// --- Full Round 2 --- //
EXTERNAL_ROUND(0x22fc468f1759b74d7bfc427b5f11ebb10a41515ddff497b14fd6dae1508fc47a, 0x1059ca787f1f89ed9cd026e9c9ca107ae61956ff0b4121d5efd65515617f6e4d, 0x2be9473358461d8f61f3536d877de982123011f0bf6f155a45cbbfae8b981ce)

// --- Full Round 3 --- //
EXTERNAL_ROUND(0xec96c8e32962d462778a749c82ed623aba9b669ac5b8736a1ff3a441a5084a4, 0x292f906e073677405442d9553c45fa3f5a47a7cdb8c99f9648fb2e4d814df57e, 0x274982444157b86726c11b9a0f5e39a5cc611160a394ea460c63f0b2ffe5657e)

// ==================
// | Partial Rounds |
// ==================

// --- Partial Round 0 --- //
INTERNAL_ROUND(0x1a1d063e54b1e764b63e1855bff015b8cedd192f47308731499573f23597d4b5)

// --- Partial Round 1 --- //
INTERNAL_ROUND(0x26abc66f3fdf8e68839d10956259063708235dccc1aa3793b91b002c5b257c37)

// --- Partial Round 2 --- //
INTERNAL_ROUND(0xc7c64a9d887385381a578cfed5aed370754427aabca92a70b3c2b12ff4d7be8)

// --- Partial Round 3 --- //
INTERNAL_ROUND(0x1cf5998769e9fab79e17f0b6d08b2d1eba2ebac30dc386b0edd383831354b495)

// --- Partial Round 4 --- //
INTERNAL_ROUND(0xf5e3a8566be31b7564ca60461e9e08b19828764a9669bc17aba0b97e66b0109)

// --- Partial Round 5 --- //
INTERNAL_ROUND(0x18df6a9d19ea90d895e60e4db0794a01f359a53a180b7d4b42bf3d7a531c976e)

// --- Partial Round 6 --- //
INTERNAL_ROUND(0x4f7bf2c5c0538ac6e4b782c3c6e601ad0ea1d3a3b9d25ef4e324055fa3123dc)

// --- Partial Round 7 --- //
INTERNAL_ROUND(0x29c76ce22255206e3c40058523748531e770c0584aa2328ce55d54628b89ebe6)

// --- Partial Round 8 --- //
INTERNAL_ROUND(0x198d425a45b78e85c053659ab4347f5d65b1b8e9c6108dbe00e0e945dbc5ff15)

// --- Partial Round 9 --- //
INTERNAL_ROUND(0x25ee27ab6296cd5e6af3cc79c598a1daa7ff7f6878b3c49d49d3a9a90c3fdf74)

// --- Partial Round 10 --- //
INTERNAL_ROUND(0x138ea8e0af41a1e024561001c0b6eb1505845d7d0c55b1b2c0f88687a96d1381)

// --- Partial Round 11 --- //
INTERNAL_ROUND(0x306197fb3fab671ef6e7c2cba2eefd0e42851b5b9811f2ca4013370a01d95687)

// --- Partial Round 12 --- //
INTERNAL_ROUND(0x1a0c7d52dc32a4432b66f0b4894d4f1a21db7565e5b4250486419eaf00e8f620)

// --- Partial Round 13 --- //
INTERNAL_ROUND(0x2b46b418de80915f3ff86a8e5c8bdfccebfbe5f55163cd6caa52997da2c54a9f)

// --- Partial Round 14 --- //
INTERNAL_ROUND(0x12d3e0dc0085873701f8b777b9673af9613a1af5db48e05bfb46e312b5829f64)

// --- Partial Round 15 --- //
INTERNAL_ROUND(0x263390cf74dc3a8870f5002ed21d089ffb2bf768230f648dba338a5cb19b3a1f)

// --- Partial Round 16 --- //
INTERNAL_ROUND(0xa14f33a5fe668a60ac884b4ca607ad0f8abb5af40f96f1d7d543db52b003dcd)

// --- Partial Round 17 --- //
INTERNAL_ROUND(0x28ead9c586513eab1a5e86509d68b2da27be3a4f01171a1dd847df829bc683b9)

// --- Partial Round 18 --- //
INTERNAL_ROUND(0x1c6ab1c328c3c6430972031f1bdb2ac9888f0ea1abe71cffea16cda6e1a7416c)

// --- Partial Round 19 --- //
INTERNAL_ROUND(0x1fc7e71bc0b819792b2500239f7f8de04f6decd608cb98a932346015c5b42c94)

// --- Partial Round 20 --- //
INTERNAL_ROUND(0x3e107eb3a42b2ece380e0d860298f17c0c1e197c952650ee6dd85b93a0ddaa8)

// --- Partial Round 21 --- //
INTERNAL_ROUND(0x2d354a251f381a4669c0d52bf88b772c46452ca57c08697f454505f6941d78cd)

// --- Partial Round 22 --- //
INTERNAL_ROUND(0x94af88ab05d94baf687ef14bc566d1c522551d61606eda3d14b4606826f794b)

// --- Partial Round 23 --- //
INTERNAL_ROUND(0x19705b783bf3d2dc19bcaeabf02f8ca5e1ab5b6f2e3195a9d52b2d249d1396f7)

// --- Partial Round 24 --- //
INTERNAL_ROUND(0x9bf4acc3a8bce3f1fcc33fee54fc5b28723b16b7d740a3e60cef6852271200e)

// --- Partial Round 25 --- //
INTERNAL_ROUND(0x1803f8200db6013c50f83c0c8fab62843413732f301f7058543a073f3f3b5e4e)

// --- Partial Round 26 --- //
INTERNAL_ROUND(0xf80afb5046244de30595b160b8d1f38bf6fb02d4454c0add41f7fef2faf3e5c)

// --- Partial Round 27 --- //
INTERNAL_ROUND(0x126ee1f8504f15c3d77f0088c1cfc964abcfcf643f4a6fea7dc3f98219529d78)

// --- Partial Round 28 --- //
INTERNAL_ROUND(0x23c203d10cfcc60f69bfb3d919552ca10ffb4ee63175ddf8ef86f991d7d0a591)

// --- Partial Round 29 --- //
INTERNAL_ROUND(0x2a2ae15d8b143709ec0d09705fa3a6303dec1ee4eec2cf747c5a339f7744fb94)

// --- Partial Round 30 --- //
INTERNAL_ROUND(0x7b60dee586ed6ef47e5c381ab6343ecc3d3b3006cb461bbb6b5d89081970b2b)

// --- Partial Round 31 --- //
INTERNAL_ROUND(0x27316b559be3edfd885d95c494c1ae3d8a98a320baa7d152132cfe583c9311bd)

// --- Partial Round 32 --- //
INTERNAL_ROUND(0x1d5c49ba157c32b8d8937cb2d3f84311ef834cc2a743ed662f5f9af0c0342e76)

// --- Partial Round 33 --- //
INTERNAL_ROUND(0x2f8b124e78163b2f332774e0b850b5ec09c01bf6979938f67c24bd5940968488)

// --- Partial Round 34 --- //
INTERNAL_ROUND(0x1e6843a5457416b6dc5b7aa09a9ce21b1d4cba6554e51d84665f75260113b3d5)

// --- Partial Round 35 --- //
INTERNAL_ROUND(0x11cdf00a35f650c55fca25c9929c8ad9a68daf9ac6a189ab1f5bc79f21641d4b)

// --- Partial Round 36 --- //
INTERNAL_ROUND(0x21632de3d3bbc5e42ef36e588158d6d4608b2815c77355b7e82b5b9b7eb560bc)

// --- Partial Round 37 --- //
INTERNAL_ROUND(0xde625758452efbd97b27025fbd245e0255ae48ef2a329e449d7b5c51c18498a)

// --- Partial Round 38 --- //
INTERNAL_ROUND(0x2ad253c053e75213e2febfd4d976cc01dd9e1e1c6f0fb6b09b09546ba0838098)

// --- Partial Round 39 --- //
INTERNAL_ROUND(0x1d6b169ed63872dc6ec7681ec39b3be93dd49cdd13c813b7d35702e38d60b077)

// --- Partial Round 40 --- //
INTERNAL_ROUND(0x1660b740a143664bb9127c4941b67fed0be3ea70a24d5568c3a54e706cfef7fe)

// --- Partial Round 41 --- //
INTERNAL_ROUND(0x65a92d1de81f34114f4ca2deef76e0ceacdddb12cf879096a29f10376ccbfe)

// --- Partial Round 42 --- //
INTERNAL_ROUND(0x1f11f065202535987367f823da7d672c353ebe2ccbc4869bcf30d50a5871040d)

// --- Partial Round 43 --- //
INTERNAL_ROUND(0x26596f5c5dd5a5d1b437ce7b14a2c3dd3bd1d1a39b6759ba110852d17df0693e)

// --- Partial Round 44 --- //
INTERNAL_ROUND(0x16f49bc727e45a2f7bf3056efcf8b6d38539c4163a5f1e706743db15af91860f)

// --- Partial Round 45 --- //
INTERNAL_ROUND(0x1abe1deb45b3e3119954175efb331bf4568feaf7ea8b3dc5e1a4e7438dd39e5f)

// --- Partial Round 46 --- //
INTERNAL_ROUND(0xe426ccab66984d1d8993a74ca548b779f5db92aaec5f102020d34aea15fba59)

// --- Partial Round 47 --- //
INTERNAL_ROUND(0xe7c30c2e2e8957f4933bd1942053f1f0071684b902d534fa841924303f6a6c6)

// --- Partial Round 48 --- //
INTERNAL_ROUND(0x812a017ca92cf0a1622708fc7edff1d6166ded6e3528ead4c76e1f31d3fc69d)

// --- Partial Round 49 --- //
INTERNAL_ROUND(0x21a5ade3df2bc1b5bba949d1db96040068afe5026edd7a9c2e276b47cf010d54)

// --- Partial Round 50 --- //
INTERNAL_ROUND(0x1f3035463816c84ad711bf1a058c6c6bd101945f50e5afe72b1a5233f8749ce)

// --- Partial Round 51 --- //
INTERNAL_ROUND(0xb115572f038c0e2028c2aafc2d06a5e8bf2f9398dbd0fdf4dcaa82b0f0c1c8b)

// --- Partial Round 52 --- //
INTERNAL_ROUND(0x1c38ec0b99b62fd4f0ef255543f50d2e27fc24db42bc910a3460613b6ef59e2f)

// --- Partial Round 53 --- //
INTERNAL_ROUND(0x1c89c6d9666272e8425c3ff1f4ac737b2f5d314606a297d4b1d0b254d880c53e)

// --- Partial Round 54 --- //
INTERNAL_ROUND(0x3326e643580356bf6d44008ae4c042a21ad4880097a5eb38b71e2311bb88f8f)

// --- Partial Round 55 --- //
INTERNAL_ROUND(0x268076b0054fb73f67cee9ea0e51e3ad50f27a6434b5dceb5bdde2299910a4c9)

// ======================
// | Second Full Rounds |
// ======================

// --- Full Round 4 --- //
EXTERNAL_ROUND(0x1acd63c67fbc9ab1626ed93491bda32e5da18ea9d8e4f10178d04aa6f8747ad0, 0x19f8a5d670e8ab66c4e3144be58ef6901bf93375e2323ec3ca8c86cd2a28b5a5, 0x1c0dc443519ad7a86efa40d2df10a011068193ea51f6c92ae1cfbb5f7b9b6893)

// --- Full Round 5 --- //
EXTERNAL_ROUND(0x14b39e7aa4068dbe50fe7190e421dc19fbeab33cb4f6a2c4180e4c3224987d3d, 0x1d449b71bd826ec58f28c63ea6c561b7b820fc519f01f021afb1e35e28b0795e, 0x1ea2c9a89baaddbb60fa97fe60fe9d8e89de141689d1252276524dc0a9e987fc)

// --- Full Round 6 --- //
EXTERNAL_ROUND(0x478d66d43535a8cb57e9c1c3d6a2bd7591f9a46a0e9c058134d5cefdb3c7ff1, 0x19272db71eece6a6f608f3b2717f9cd2662e26ad86c400b21cde5e4a7b00bebe, 0x14226537335cab33c749c746f09208abb2dd1bd66a87ef75039be846af134166)

// --- Full Round 7 --- //
EXTERNAL_ROUND(0x1fd6af15956294f9dfe38c0d976a088b21c21e4a1c2e823f912f44961f9a9ce, 0x18e5abedd626ec307bca190b8b2cab1aaee2e62ed229ba5a5ad8518d4e5f2a57, 0xfc1bbceba0590f5abbdffa6d3b35e3297c021a3a409926d0e2d54dc1c84fda6)

}
13 changes: 13 additions & 0 deletions src/crypto/poseidon2/roundUtils.huff
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,19 @@
/// @dev The scalar field modulus of BN254
#define constant PRIME = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001

/// @dev Absorb two elements into a 2-1 poseidon sponge, permute, then return the first output
/// Implicitly this is a 2-1 sponge with rate 2 and capacity 1 -- for a width-3 sponge state
#define macro POSEIDON_TWO_TO_ONE() = takes(2) returns(1) {
// Takes [a, b]

// The initial 2-1 sponge state is [0, a, b]
push0 // [0, a, b]
POSEIDON_PERM() // [state'[0], state'[1], state'[2]]

// We return the first element past the state capacity, in this case state'[1]
dup2 // [state'[1], state'[0], state'[1], state'[2], ...]
}

/// @dev Apply an external round to the state
/// @param Takes [a, b, c]
/// @return [a', b', c']
Expand Down
Binary file added test/.DS_Store
Binary file not shown.
Loading

0 comments on commit 6cac3fc

Please sign in to comment.