From ccf9d95ee7e035442a479469814ceefca624ee8a Mon Sep 17 00:00:00 2001 From: Marcin Date: Fri, 9 Feb 2024 17:07:48 +0100 Subject: [PATCH] `Absorb` derive (#135) * move crypto-primitives to its own crate dir * create new crate "macros" * Macro derive working with tests * rename to Absorb, clean up and format * add test for struct with no named fields, panics now * implement `Absorb` macro for structs with unnamed fields too * inline variable * re-export Absorb derive * workspace inheritance * minimize the diff * add licenses to each crate * change generic type's name to `FieldType`. `F` is often used in caller * add tests with generic type `F` * replace licenses with symlinks --- Cargo.toml | 87 ++--------------- crypto-primitives/Cargo.toml | 90 ++++++++++++++++++ crypto-primitives/LICENSE-APACHE | 1 + crypto-primitives/LICENSE-MIT | 1 + .../benches}/comm.rs | 0 {benches => crypto-primitives/benches}/crh.rs | 0 .../benches}/merkle_tree.rs | 0 {benches => crypto-primitives/benches}/prf.rs | 0 .../benches}/signature.rs | 0 .../src}/commitment/blake2s/constraints.rs | 0 .../src}/commitment/blake2s/mod.rs | 0 .../src}/commitment/constraints.rs | 0 .../commitment/injective_map/constraints.rs | 0 .../src}/commitment/injective_map/mod.rs | 0 .../src}/commitment/mod.rs | 0 .../src}/commitment/pedersen/constraints.rs | 0 .../src}/commitment/pedersen/mod.rs | 0 .../src}/crh/bowe_hopwood/constraints.rs | 0 .../src}/crh/bowe_hopwood/mod.rs | 0 .../src}/crh/constraints.rs | 0 .../src}/crh/injective_map/constraints.rs | 0 .../src}/crh/injective_map/mod.rs | 0 {src => crypto-primitives/src}/crh/mod.rs | 0 .../src}/crh/pedersen/constraints.rs | 0 .../src}/crh/pedersen/mod.rs | 0 .../src}/crh/poseidon/constraints.rs | 0 .../src}/crh/poseidon/mod.rs | 0 .../src}/crh/sha256/constraints.rs | 0 .../src}/crh/sha256/mod.rs | 0 .../src}/encryption/constraints.rs | 0 .../src}/encryption/elgamal/constraints.rs | 0 .../src}/encryption/elgamal/mod.rs | 0 .../src}/encryption/mod.rs | 0 {src => crypto-primitives/src}/lib.rs | 0 {src => crypto-primitives/src}/macros.rs | 0 .../src}/merkle_tree/constraints.rs | 0 .../src}/merkle_tree/mod.rs | 0 .../src}/merkle_tree/tests/constraints.rs | 0 .../src}/merkle_tree/tests/mod.rs | 0 .../src}/merkle_tree/tests/test_utils.rs | 0 .../src}/prf/blake2s/constraints.rs | 0 .../src}/prf/blake2s/mod.rs | 0 .../src}/prf/constraints.rs | 0 {src => crypto-primitives/src}/prf/mod.rs | 0 .../src}/signature/constraints.rs | 0 .../src}/signature/mod.rs | 0 .../src}/signature/schnorr/constraints.rs | 0 .../src}/signature/schnorr/mod.rs | 0 .../src}/snark/constraints.rs | 0 {src => crypto-primitives/src}/snark/mod.rs | 0 .../src}/sponge/absorb.rs | 76 ++++++++++++++- .../src}/sponge/constraints/absorb.rs | 0 .../src}/sponge/constraints/mod.rs | 0 {src => crypto-primitives/src}/sponge/mod.rs | 0 .../src}/sponge/poseidon/constraints.rs | 0 .../src}/sponge/poseidon/grain_lfsr.rs | 0 .../src}/sponge/poseidon/mod.rs | 2 + .../src}/sponge/poseidon/tests.rs | 0 .../src}/sponge/poseidon/traits.rs | 0 {src => crypto-primitives/src}/sponge/test.rs | 0 macros/Cargo.toml | 21 +++++ macros/LICENSE-APACHE | 1 + macros/LICENSE-MIT | 1 + macros/src/lib.rs | 94 +++++++++++++++++++ 64 files changed, 294 insertions(+), 80 deletions(-) create mode 100644 crypto-primitives/Cargo.toml create mode 120000 crypto-primitives/LICENSE-APACHE create mode 120000 crypto-primitives/LICENSE-MIT rename {benches => crypto-primitives/benches}/comm.rs (100%) rename {benches => crypto-primitives/benches}/crh.rs (100%) rename {benches => crypto-primitives/benches}/merkle_tree.rs (100%) rename {benches => crypto-primitives/benches}/prf.rs (100%) rename {benches => crypto-primitives/benches}/signature.rs (100%) rename {src => crypto-primitives/src}/commitment/blake2s/constraints.rs (100%) rename {src => crypto-primitives/src}/commitment/blake2s/mod.rs (100%) rename {src => crypto-primitives/src}/commitment/constraints.rs (100%) rename {src => crypto-primitives/src}/commitment/injective_map/constraints.rs (100%) rename {src => crypto-primitives/src}/commitment/injective_map/mod.rs (100%) rename {src => crypto-primitives/src}/commitment/mod.rs (100%) rename {src => crypto-primitives/src}/commitment/pedersen/constraints.rs (100%) rename {src => crypto-primitives/src}/commitment/pedersen/mod.rs (100%) rename {src => crypto-primitives/src}/crh/bowe_hopwood/constraints.rs (100%) rename {src => crypto-primitives/src}/crh/bowe_hopwood/mod.rs (100%) rename {src => crypto-primitives/src}/crh/constraints.rs (100%) rename {src => crypto-primitives/src}/crh/injective_map/constraints.rs (100%) rename {src => crypto-primitives/src}/crh/injective_map/mod.rs (100%) rename {src => crypto-primitives/src}/crh/mod.rs (100%) rename {src => crypto-primitives/src}/crh/pedersen/constraints.rs (100%) rename {src => crypto-primitives/src}/crh/pedersen/mod.rs (100%) rename {src => crypto-primitives/src}/crh/poseidon/constraints.rs (100%) rename {src => crypto-primitives/src}/crh/poseidon/mod.rs (100%) rename {src => crypto-primitives/src}/crh/sha256/constraints.rs (100%) rename {src => crypto-primitives/src}/crh/sha256/mod.rs (100%) rename {src => crypto-primitives/src}/encryption/constraints.rs (100%) rename {src => crypto-primitives/src}/encryption/elgamal/constraints.rs (100%) rename {src => crypto-primitives/src}/encryption/elgamal/mod.rs (100%) rename {src => crypto-primitives/src}/encryption/mod.rs (100%) rename {src => crypto-primitives/src}/lib.rs (100%) rename {src => crypto-primitives/src}/macros.rs (100%) rename {src => crypto-primitives/src}/merkle_tree/constraints.rs (100%) rename {src => crypto-primitives/src}/merkle_tree/mod.rs (100%) rename {src => crypto-primitives/src}/merkle_tree/tests/constraints.rs (100%) rename {src => crypto-primitives/src}/merkle_tree/tests/mod.rs (100%) rename {src => crypto-primitives/src}/merkle_tree/tests/test_utils.rs (100%) rename {src => crypto-primitives/src}/prf/blake2s/constraints.rs (100%) rename {src => crypto-primitives/src}/prf/blake2s/mod.rs (100%) rename {src => crypto-primitives/src}/prf/constraints.rs (100%) rename {src => crypto-primitives/src}/prf/mod.rs (100%) rename {src => crypto-primitives/src}/signature/constraints.rs (100%) rename {src => crypto-primitives/src}/signature/mod.rs (100%) rename {src => crypto-primitives/src}/signature/schnorr/constraints.rs (100%) rename {src => crypto-primitives/src}/signature/schnorr/mod.rs (100%) rename {src => crypto-primitives/src}/snark/constraints.rs (100%) rename {src => crypto-primitives/src}/snark/mod.rs (100%) rename {src => crypto-primitives/src}/sponge/absorb.rs (85%) rename {src => crypto-primitives/src}/sponge/constraints/absorb.rs (100%) rename {src => crypto-primitives/src}/sponge/constraints/mod.rs (100%) rename {src => crypto-primitives/src}/sponge/mod.rs (100%) rename {src => crypto-primitives/src}/sponge/poseidon/constraints.rs (100%) rename {src => crypto-primitives/src}/sponge/poseidon/grain_lfsr.rs (100%) rename {src => crypto-primitives/src}/sponge/poseidon/mod.rs (99%) rename {src => crypto-primitives/src}/sponge/poseidon/tests.rs (100%) rename {src => crypto-primitives/src}/sponge/poseidon/traits.rs (100%) rename {src => crypto-primitives/src}/sponge/test.rs (100%) create mode 100644 macros/Cargo.toml create mode 120000 macros/LICENSE-APACHE create mode 120000 macros/LICENSE-MIT create mode 100644 macros/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 2ef07709..086db375 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,11 @@ -[package] -name = "ark-crypto-primitives" +[workspace] +members = [ + "crypto-primitives", + "macros", +] +resolver = "2" + +[workspace.package] version = "0.4.0" authors = [ "arkworks contributors" ] description = "A library of useful cryptographic primitives" @@ -11,51 +17,6 @@ categories = ["cryptography"] include = ["Cargo.toml", "src", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] license = "MIT/Apache-2.0" edition = "2021" -resolver = "2" - -################################# Dependencies ################################ - -[dependencies] -ark-ff = { version = "^0.4.0", default-features = false } -ark-ec = { version = "^0.4.0", default-features = false } -ark-std = { version = "^0.4.0", default-features = false } -ark-relations = { version = "^0.4.0", default-features = false } -ark-serialize = { version = "^0.4.0", default-features = false, features = [ "derive" ] } - -blake2 = { version = "0.10", default-features = false } -sha2 = { version = "0.10", default-features = false } -digest = { version = "0.10", default-features = false } - -ark-r1cs-std = { version = "^0.4.0", optional = true, default-features = false } -ark-snark = { version = "^0.4.0", default-features = false } - -rayon = { version = "1.0", optional = true } -derivative = { version = "2.0", features = ["use_core"] } -tracing = { version = "0.1", default-features = false, features = [ "attributes" ], optional = true } - -[features] -default = ["std"] -std = [ "ark-ff/std", "ark-ec/std", "ark-std/std", "ark-relations/std" ] -print-trace = [ "ark-std/print-trace" ] -parallel = [ "std", "rayon", "ark-ec/parallel", "ark-std/parallel", "ark-ff/parallel" ] -r1cs = [ "ark-r1cs-std", "tracing" ] -crh = [ "sponge" ] -sponge = [] -commitment = ["crh"] -merkle_tree = ["crh"] -encryption = [] -prf = [] -snark = [] -signature = [] - -[dev-dependencies] -ark-ed-on-bls12-377 = { version = "^0.4.0", default-features = false } -ark-ed-on-bls12-381 = { version = "^0.4.0", default-features = false, features = [ "r1cs" ] } -ark-bls12-377 = { version = "^0.4.0", default-features = false, features = [ "curve", "r1cs" ] } -ark-mnt4-298 = { version = "^0.4.0", default-features = false, features = [ "curve", "r1cs" ] } -ark-mnt6-298 = { version = "^0.4.0", default-features = false, features = [ "r1cs" ] } -criterion = { version = "0.4" } - [profile.release] opt-level = 3 @@ -82,38 +43,6 @@ incremental = true debug-assertions = true debug = true -################################# Benchmarks ################################## - -[[bench]] -name = "pedersen_crh" -path = "benches/crh.rs" -harness = false -required-features = [ "crh" ] - -[[bench]] -name = "pedersen_comm" -path = "benches/comm.rs" -harness = false -required-features = [ "commitment" ] - -[[bench]] -name = "blake2s_prf" -path = "benches/prf.rs" -harness = false -required-features = [ "prf" ] - -[[bench]] -name = "schnorr_sig" -path = "benches/signature.rs" -harness = false -required-features = [ "signature" ] - -[[bench]] -name = "merkle_tree" -path = "benches/merkle_tree.rs" -harness = false -required-features = [ "merkle_tree" ] - [patch.crates-io] ark-r1cs-std = { git = "https://github.com/arkworks-rs/r1cs-std/" } ark-ff = { git = "https://github.com/arkworks-rs/algebra/" } diff --git a/crypto-primitives/Cargo.toml b/crypto-primitives/Cargo.toml new file mode 100644 index 00000000..3dc2baf5 --- /dev/null +++ b/crypto-primitives/Cargo.toml @@ -0,0 +1,90 @@ +[package] +name = "ark-crypto-primitives" +description.workspace = true +documentation.workspace = true +keywords.workspace = true +version.workspace = true +authors.workspace = true +homepage.workspace = true +repository.workspace = true +categories.workspace = true +include.workspace = true +license.workspace = true +edition.workspace = true + +################################# Dependencies ################################ + +[dependencies] +ark-crypto-primitives-macros = { version = "^0.4.0", path = "../macros" } + +ark-ff = { version = "^0.4.0", default-features = false } +ark-ec = { version = "^0.4.0", default-features = false } +ark-std = { version = "^0.4.0", default-features = false } +ark-relations = { version = "^0.4.0", default-features = false } +ark-serialize = { version = "^0.4.0", default-features = false, features = [ "derive" ] } + +blake2 = { version = "0.10", default-features = false } +sha2 = { version = "0.10", default-features = false } +digest = { version = "0.10", default-features = false } + +ark-r1cs-std = { version = "^0.4.0", optional = true, default-features = false } +ark-snark = { version = "^0.4.0", default-features = false } + +rayon = { version = "1.0", optional = true } +derivative = { version = "2.0", features = ["use_core"] } +tracing = { version = "0.1", default-features = false, features = [ "attributes" ], optional = true } + +[features] +default = ["std"] +std = [ "ark-ff/std", "ark-ec/std", "ark-std/std", "ark-relations/std" ] +print-trace = [ "ark-std/print-trace" ] +parallel = [ "std", "rayon", "ark-ec/parallel", "ark-std/parallel", "ark-ff/parallel" ] +r1cs = [ "ark-r1cs-std", "tracing" ] +crh = [ "sponge" ] +sponge = [] +commitment = ["crh"] +merkle_tree = ["crh"] +encryption = [] +prf = [] +snark = [] +signature = [] + +[dev-dependencies] +ark-ed-on-bls12-377 = { version = "^0.4.0", default-features = false } +ark-ed-on-bls12-381 = { version = "^0.4.0", default-features = false, features = [ "r1cs" ] } +ark-bls12-377 = { version = "^0.4.0", default-features = false, features = [ "curve", "r1cs" ] } +ark-mnt4-298 = { version = "^0.4.0", default-features = false, features = [ "curve", "r1cs" ] } +ark-mnt6-298 = { version = "^0.4.0", default-features = false, features = [ "r1cs" ] } +criterion = { version = "0.4" } + +################################# Benchmarks ################################## + +[[bench]] +name = "pedersen_crh" +path = "benches/crh.rs" +harness = false +required-features = [ "crh" ] + +[[bench]] +name = "pedersen_comm" +path = "benches/comm.rs" +harness = false +required-features = [ "commitment" ] + +[[bench]] +name = "blake2s_prf" +path = "benches/prf.rs" +harness = false +required-features = [ "prf" ] + +[[bench]] +name = "schnorr_sig" +path = "benches/signature.rs" +harness = false +required-features = [ "signature" ] + +[[bench]] +name = "merkle_tree" +path = "benches/merkle_tree.rs" +harness = false +required-features = [ "merkle_tree" ] diff --git a/crypto-primitives/LICENSE-APACHE b/crypto-primitives/LICENSE-APACHE new file mode 120000 index 00000000..6b579aae --- /dev/null +++ b/crypto-primitives/LICENSE-APACHE @@ -0,0 +1 @@ +LICENSE-APACHE \ No newline at end of file diff --git a/crypto-primitives/LICENSE-MIT b/crypto-primitives/LICENSE-MIT new file mode 120000 index 00000000..7f9a88ec --- /dev/null +++ b/crypto-primitives/LICENSE-MIT @@ -0,0 +1 @@ +LICENSE-MIT \ No newline at end of file diff --git a/benches/comm.rs b/crypto-primitives/benches/comm.rs similarity index 100% rename from benches/comm.rs rename to crypto-primitives/benches/comm.rs diff --git a/benches/crh.rs b/crypto-primitives/benches/crh.rs similarity index 100% rename from benches/crh.rs rename to crypto-primitives/benches/crh.rs diff --git a/benches/merkle_tree.rs b/crypto-primitives/benches/merkle_tree.rs similarity index 100% rename from benches/merkle_tree.rs rename to crypto-primitives/benches/merkle_tree.rs diff --git a/benches/prf.rs b/crypto-primitives/benches/prf.rs similarity index 100% rename from benches/prf.rs rename to crypto-primitives/benches/prf.rs diff --git a/benches/signature.rs b/crypto-primitives/benches/signature.rs similarity index 100% rename from benches/signature.rs rename to crypto-primitives/benches/signature.rs diff --git a/src/commitment/blake2s/constraints.rs b/crypto-primitives/src/commitment/blake2s/constraints.rs similarity index 100% rename from src/commitment/blake2s/constraints.rs rename to crypto-primitives/src/commitment/blake2s/constraints.rs diff --git a/src/commitment/blake2s/mod.rs b/crypto-primitives/src/commitment/blake2s/mod.rs similarity index 100% rename from src/commitment/blake2s/mod.rs rename to crypto-primitives/src/commitment/blake2s/mod.rs diff --git a/src/commitment/constraints.rs b/crypto-primitives/src/commitment/constraints.rs similarity index 100% rename from src/commitment/constraints.rs rename to crypto-primitives/src/commitment/constraints.rs diff --git a/src/commitment/injective_map/constraints.rs b/crypto-primitives/src/commitment/injective_map/constraints.rs similarity index 100% rename from src/commitment/injective_map/constraints.rs rename to crypto-primitives/src/commitment/injective_map/constraints.rs diff --git a/src/commitment/injective_map/mod.rs b/crypto-primitives/src/commitment/injective_map/mod.rs similarity index 100% rename from src/commitment/injective_map/mod.rs rename to crypto-primitives/src/commitment/injective_map/mod.rs diff --git a/src/commitment/mod.rs b/crypto-primitives/src/commitment/mod.rs similarity index 100% rename from src/commitment/mod.rs rename to crypto-primitives/src/commitment/mod.rs diff --git a/src/commitment/pedersen/constraints.rs b/crypto-primitives/src/commitment/pedersen/constraints.rs similarity index 100% rename from src/commitment/pedersen/constraints.rs rename to crypto-primitives/src/commitment/pedersen/constraints.rs diff --git a/src/commitment/pedersen/mod.rs b/crypto-primitives/src/commitment/pedersen/mod.rs similarity index 100% rename from src/commitment/pedersen/mod.rs rename to crypto-primitives/src/commitment/pedersen/mod.rs diff --git a/src/crh/bowe_hopwood/constraints.rs b/crypto-primitives/src/crh/bowe_hopwood/constraints.rs similarity index 100% rename from src/crh/bowe_hopwood/constraints.rs rename to crypto-primitives/src/crh/bowe_hopwood/constraints.rs diff --git a/src/crh/bowe_hopwood/mod.rs b/crypto-primitives/src/crh/bowe_hopwood/mod.rs similarity index 100% rename from src/crh/bowe_hopwood/mod.rs rename to crypto-primitives/src/crh/bowe_hopwood/mod.rs diff --git a/src/crh/constraints.rs b/crypto-primitives/src/crh/constraints.rs similarity index 100% rename from src/crh/constraints.rs rename to crypto-primitives/src/crh/constraints.rs diff --git a/src/crh/injective_map/constraints.rs b/crypto-primitives/src/crh/injective_map/constraints.rs similarity index 100% rename from src/crh/injective_map/constraints.rs rename to crypto-primitives/src/crh/injective_map/constraints.rs diff --git a/src/crh/injective_map/mod.rs b/crypto-primitives/src/crh/injective_map/mod.rs similarity index 100% rename from src/crh/injective_map/mod.rs rename to crypto-primitives/src/crh/injective_map/mod.rs diff --git a/src/crh/mod.rs b/crypto-primitives/src/crh/mod.rs similarity index 100% rename from src/crh/mod.rs rename to crypto-primitives/src/crh/mod.rs diff --git a/src/crh/pedersen/constraints.rs b/crypto-primitives/src/crh/pedersen/constraints.rs similarity index 100% rename from src/crh/pedersen/constraints.rs rename to crypto-primitives/src/crh/pedersen/constraints.rs diff --git a/src/crh/pedersen/mod.rs b/crypto-primitives/src/crh/pedersen/mod.rs similarity index 100% rename from src/crh/pedersen/mod.rs rename to crypto-primitives/src/crh/pedersen/mod.rs diff --git a/src/crh/poseidon/constraints.rs b/crypto-primitives/src/crh/poseidon/constraints.rs similarity index 100% rename from src/crh/poseidon/constraints.rs rename to crypto-primitives/src/crh/poseidon/constraints.rs diff --git a/src/crh/poseidon/mod.rs b/crypto-primitives/src/crh/poseidon/mod.rs similarity index 100% rename from src/crh/poseidon/mod.rs rename to crypto-primitives/src/crh/poseidon/mod.rs diff --git a/src/crh/sha256/constraints.rs b/crypto-primitives/src/crh/sha256/constraints.rs similarity index 100% rename from src/crh/sha256/constraints.rs rename to crypto-primitives/src/crh/sha256/constraints.rs diff --git a/src/crh/sha256/mod.rs b/crypto-primitives/src/crh/sha256/mod.rs similarity index 100% rename from src/crh/sha256/mod.rs rename to crypto-primitives/src/crh/sha256/mod.rs diff --git a/src/encryption/constraints.rs b/crypto-primitives/src/encryption/constraints.rs similarity index 100% rename from src/encryption/constraints.rs rename to crypto-primitives/src/encryption/constraints.rs diff --git a/src/encryption/elgamal/constraints.rs b/crypto-primitives/src/encryption/elgamal/constraints.rs similarity index 100% rename from src/encryption/elgamal/constraints.rs rename to crypto-primitives/src/encryption/elgamal/constraints.rs diff --git a/src/encryption/elgamal/mod.rs b/crypto-primitives/src/encryption/elgamal/mod.rs similarity index 100% rename from src/encryption/elgamal/mod.rs rename to crypto-primitives/src/encryption/elgamal/mod.rs diff --git a/src/encryption/mod.rs b/crypto-primitives/src/encryption/mod.rs similarity index 100% rename from src/encryption/mod.rs rename to crypto-primitives/src/encryption/mod.rs diff --git a/src/lib.rs b/crypto-primitives/src/lib.rs similarity index 100% rename from src/lib.rs rename to crypto-primitives/src/lib.rs diff --git a/src/macros.rs b/crypto-primitives/src/macros.rs similarity index 100% rename from src/macros.rs rename to crypto-primitives/src/macros.rs diff --git a/src/merkle_tree/constraints.rs b/crypto-primitives/src/merkle_tree/constraints.rs similarity index 100% rename from src/merkle_tree/constraints.rs rename to crypto-primitives/src/merkle_tree/constraints.rs diff --git a/src/merkle_tree/mod.rs b/crypto-primitives/src/merkle_tree/mod.rs similarity index 100% rename from src/merkle_tree/mod.rs rename to crypto-primitives/src/merkle_tree/mod.rs diff --git a/src/merkle_tree/tests/constraints.rs b/crypto-primitives/src/merkle_tree/tests/constraints.rs similarity index 100% rename from src/merkle_tree/tests/constraints.rs rename to crypto-primitives/src/merkle_tree/tests/constraints.rs diff --git a/src/merkle_tree/tests/mod.rs b/crypto-primitives/src/merkle_tree/tests/mod.rs similarity index 100% rename from src/merkle_tree/tests/mod.rs rename to crypto-primitives/src/merkle_tree/tests/mod.rs diff --git a/src/merkle_tree/tests/test_utils.rs b/crypto-primitives/src/merkle_tree/tests/test_utils.rs similarity index 100% rename from src/merkle_tree/tests/test_utils.rs rename to crypto-primitives/src/merkle_tree/tests/test_utils.rs diff --git a/src/prf/blake2s/constraints.rs b/crypto-primitives/src/prf/blake2s/constraints.rs similarity index 100% rename from src/prf/blake2s/constraints.rs rename to crypto-primitives/src/prf/blake2s/constraints.rs diff --git a/src/prf/blake2s/mod.rs b/crypto-primitives/src/prf/blake2s/mod.rs similarity index 100% rename from src/prf/blake2s/mod.rs rename to crypto-primitives/src/prf/blake2s/mod.rs diff --git a/src/prf/constraints.rs b/crypto-primitives/src/prf/constraints.rs similarity index 100% rename from src/prf/constraints.rs rename to crypto-primitives/src/prf/constraints.rs diff --git a/src/prf/mod.rs b/crypto-primitives/src/prf/mod.rs similarity index 100% rename from src/prf/mod.rs rename to crypto-primitives/src/prf/mod.rs diff --git a/src/signature/constraints.rs b/crypto-primitives/src/signature/constraints.rs similarity index 100% rename from src/signature/constraints.rs rename to crypto-primitives/src/signature/constraints.rs diff --git a/src/signature/mod.rs b/crypto-primitives/src/signature/mod.rs similarity index 100% rename from src/signature/mod.rs rename to crypto-primitives/src/signature/mod.rs diff --git a/src/signature/schnorr/constraints.rs b/crypto-primitives/src/signature/schnorr/constraints.rs similarity index 100% rename from src/signature/schnorr/constraints.rs rename to crypto-primitives/src/signature/schnorr/constraints.rs diff --git a/src/signature/schnorr/mod.rs b/crypto-primitives/src/signature/schnorr/mod.rs similarity index 100% rename from src/signature/schnorr/mod.rs rename to crypto-primitives/src/signature/schnorr/mod.rs diff --git a/src/snark/constraints.rs b/crypto-primitives/src/snark/constraints.rs similarity index 100% rename from src/snark/constraints.rs rename to crypto-primitives/src/snark/constraints.rs diff --git a/src/snark/mod.rs b/crypto-primitives/src/snark/mod.rs similarity index 100% rename from src/snark/mod.rs rename to crypto-primitives/src/snark/mod.rs diff --git a/src/sponge/absorb.rs b/crypto-primitives/src/sponge/absorb.rs similarity index 85% rename from src/sponge/absorb.rs rename to crypto-primitives/src/sponge/absorb.rs index 3827d428..3dea6b46 100644 --- a/src/sponge/absorb.rs +++ b/crypto-primitives/src/sponge/absorb.rs @@ -9,6 +9,8 @@ use ark_ff::{BigInteger, Field, PrimeField, ToConstraintField}; use ark_serialize::CanonicalSerialize; use ark_std::vec::Vec; +pub use ark_crypto_primitives_macros::*; + /// An interface for objects that can be absorbed by a `CryptographicSponge`. pub trait Absorb { /// Converts the object into a list of bytes that can be absorbed by a `CryptographicSponge`. @@ -370,8 +372,11 @@ macro_rules! collect_sponge_field_elements { #[cfg(test)] mod tests { - use crate::sponge::field_cast; + use crate::sponge::poseidon::{poseidon_parameters_for_test, PoseidonSponge}; use crate::sponge::test::Fr; + use crate::sponge::Absorb; + use crate::sponge::{field_cast, CryptographicSponge}; + use ark_ff::PrimeField; use ark_std::{test_rng, vec::Vec, UniformRand}; #[test] @@ -382,4 +387,73 @@ mod tests { field_cast::<_, Fr>(&expected, &mut actual).unwrap(); assert_eq!(actual, expected); } + + #[derive(Absorb)] + struct SubStruct { + a: u8, + b: u16, + } + + #[derive(Absorb)] + struct StructWithGeneric(F); + + #[derive(Absorb)] + struct StructWithNoNamedFields(u16); + + #[derive(Absorb)] + struct TestStruct { + a: u8, + b: u16, + c: u32, + d: u64, + e: u128, + f: Fr, + g: SubStruct, + h: StructWithNoNamedFields, + i: StructWithGeneric, + } + + #[test] + fn test_absorb_derive() { + let a = TestStruct { + a: 1, + b: 2, + c: 3, + d: 4, + e: 5, + f: Fr::from(6), + g: SubStruct { a: 7, b: 8 }, + h: StructWithNoNamedFields(9), + i: StructWithGeneric(Fr::from(10)), + }; + + let sponge_param = poseidon_parameters_for_test(); + let mut sponge = PoseidonSponge::::new(&sponge_param); + + sponge.absorb(&a); + let out_derived = sponge.squeeze_bytes(32); + + let mut sponge = PoseidonSponge::::new(&sponge_param); + sponge.absorb(&a.a); + sponge.absorb(&a.b); + sponge.absorb(&a.c); + sponge.absorb(&a.d); + sponge.absorb(&a.e); + // we forgot to absorb some fields, assert that output is different + let out_manual = sponge.squeeze_bytes(32); + assert_ne!(out_derived, out_manual); + + let mut sponge = PoseidonSponge::::new(&sponge_param); + sponge.absorb(&a.a); + sponge.absorb(&a.b); + sponge.absorb(&a.c); + sponge.absorb(&a.d); + sponge.absorb(&a.e); + sponge.absorb(&a.f); + sponge.absorb(&a.g); + sponge.absorb(&a.h); + sponge.absorb(&a.i); + let out_manual = sponge.squeeze_bytes(32); + assert_eq!(out_derived, out_manual); + } } diff --git a/src/sponge/constraints/absorb.rs b/crypto-primitives/src/sponge/constraints/absorb.rs similarity index 100% rename from src/sponge/constraints/absorb.rs rename to crypto-primitives/src/sponge/constraints/absorb.rs diff --git a/src/sponge/constraints/mod.rs b/crypto-primitives/src/sponge/constraints/mod.rs similarity index 100% rename from src/sponge/constraints/mod.rs rename to crypto-primitives/src/sponge/constraints/mod.rs diff --git a/src/sponge/mod.rs b/crypto-primitives/src/sponge/mod.rs similarity index 100% rename from src/sponge/mod.rs rename to crypto-primitives/src/sponge/mod.rs diff --git a/src/sponge/poseidon/constraints.rs b/crypto-primitives/src/sponge/poseidon/constraints.rs similarity index 100% rename from src/sponge/poseidon/constraints.rs rename to crypto-primitives/src/sponge/poseidon/constraints.rs diff --git a/src/sponge/poseidon/grain_lfsr.rs b/crypto-primitives/src/sponge/poseidon/grain_lfsr.rs similarity index 100% rename from src/sponge/poseidon/grain_lfsr.rs rename to crypto-primitives/src/sponge/poseidon/grain_lfsr.rs diff --git a/src/sponge/poseidon/mod.rs b/crypto-primitives/src/sponge/poseidon/mod.rs similarity index 99% rename from src/sponge/poseidon/mod.rs rename to crypto-primitives/src/sponge/poseidon/mod.rs index 6166ba9f..69dd01ff 100644 --- a/src/sponge/poseidon/mod.rs +++ b/crypto-primitives/src/sponge/poseidon/mod.rs @@ -13,6 +13,8 @@ use ark_std::vec::Vec; pub mod constraints; #[cfg(test)] mod tests; +#[cfg(test)] +pub(crate) use tests::poseidon_parameters_for_test; /// default parameters traits for Poseidon pub mod traits; diff --git a/src/sponge/poseidon/tests.rs b/crypto-primitives/src/sponge/poseidon/tests.rs similarity index 100% rename from src/sponge/poseidon/tests.rs rename to crypto-primitives/src/sponge/poseidon/tests.rs diff --git a/src/sponge/poseidon/traits.rs b/crypto-primitives/src/sponge/poseidon/traits.rs similarity index 100% rename from src/sponge/poseidon/traits.rs rename to crypto-primitives/src/sponge/poseidon/traits.rs diff --git a/src/sponge/test.rs b/crypto-primitives/src/sponge/test.rs similarity index 100% rename from src/sponge/test.rs rename to crypto-primitives/src/sponge/test.rs diff --git a/macros/Cargo.toml b/macros/Cargo.toml new file mode 100644 index 00000000..7b20973d --- /dev/null +++ b/macros/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "ark-crypto-primitives-macros" +description.workspace = true +documentation.workspace = true +version.workspace = true +authors.workspace = true +homepage.workspace = true +repository.workspace = true +categories.workspace = true +include.workspace = true +license.workspace = true +edition.workspace = true +publish = false + +[dependencies] +quote = { version = "1.0" } +syn = { version = "2.0" } +proc-macro2 = { version = "1.0" } + +[lib] +proc-macro = true diff --git a/macros/LICENSE-APACHE b/macros/LICENSE-APACHE new file mode 120000 index 00000000..6b579aae --- /dev/null +++ b/macros/LICENSE-APACHE @@ -0,0 +1 @@ +LICENSE-APACHE \ No newline at end of file diff --git a/macros/LICENSE-MIT b/macros/LICENSE-MIT new file mode 120000 index 00000000..7f9a88ec --- /dev/null +++ b/macros/LICENSE-MIT @@ -0,0 +1 @@ +LICENSE-MIT \ No newline at end of file diff --git a/macros/src/lib.rs b/macros/src/lib.rs new file mode 100644 index 00000000..7011b31b --- /dev/null +++ b/macros/src/lib.rs @@ -0,0 +1,94 @@ +extern crate proc_macro; +use proc_macro::TokenStream; +use proc_macro2::TokenStream as TokenStream2; +use quote::quote; +use syn::{parse_macro_input, Data, DeriveInput, Fields, Index}; + +#[proc_macro_derive(Absorb)] +pub fn derive_absorb(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let name = input.ident; + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + let len = if let Data::Struct(ref data_struct) = input.data { + data_struct.fields.len() + } else { + panic!( + "`Absorb` can only be derived for structs, {} is not a struct", + name + ); + }; + + let mut to_sponge_bytes = Vec::::with_capacity(len); + let mut to_sponge_field_elements = Vec::::with_capacity(len); + + match input.data { + Data::Struct(ref data_struct) => match data_struct.fields { + Fields::Named(ref fields) => { + let _: Vec<_> = fields + .named + .iter() + .map(|f| { + let name = &f.ident; + to_sponge_bytes.push(quote! { + Absorb::to_sponge_bytes(&self.#name, dest); + }); + }) + .collect(); + + let _: Vec<_> = fields + .named + .iter() + .map(|f| { + let name = &f.ident; + to_sponge_field_elements.push(quote! { + Absorb::to_sponge_field_elements(&self.#name, dest); + }); + }) + .collect(); + } + Fields::Unnamed(ref fields) => { + let _: Vec<_> = fields + .unnamed + .iter() + .enumerate() + .map(|(i, _)| { + let index = Index::from(i); + to_sponge_bytes.push(quote! { + Absorb::to_sponge_bytes(&self.#index, dest); + }); + }) + .collect(); + + let _: Vec<_> = fields + .unnamed + .iter() + .enumerate() + .map(|(i, _)| { + let index = Index::from(i); + to_sponge_field_elements.push(quote! { + Absorb::to_sponge_field_elements(&self.#index, dest); + }); + }) + .collect(); + } + _ => panic!("Absorb only supports named and unnamed fields"), + }, + // this should be unreachable, we already checked + _ => panic!("Absorb only supports structs"), + } + + quote! { + impl #impl_generics Absorb for #name #ty_generics #where_clause { + fn to_sponge_bytes(&self, dest: &mut Vec) { + #( #to_sponge_bytes )* + } + + fn to_sponge_field_elements(&self, dest: &mut Vec) { + #( #to_sponge_field_elements )* + } + } + } + .into() +}