Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions crates/crypto/post_quantum/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ repository.workspace = true
rust-version.workspace = true
version.workspace = true

[features]
default = ["signature-scheme-prod"]

signature-scheme-prod = []
signature-scheme-test = []

[dependencies]
anyhow.workspace = true
ethereum_ssz.workspace = true
Expand Down
7 changes: 5 additions & 2 deletions crates/crypto/post_quantum/src/hashsig/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
pub mod errors;
pub mod private_key;
pub mod public_key;
pub mod scheme;
pub mod signature;

use hashsig::signature::generalized_xmss::instantiations_poseidon::lifetime_2_to_the_18::winternitz::SIGWinternitzLifetime18W4;
#[cfg(feature = "signature-scheme-prod")]
pub type HashSigScheme = hashsig::signature::generalized_xmss::instantiations_poseidon_top_level::lifetime_2_to_the_32::hashing_optimized::SIGTopLevelTargetSumLifetime32Dim64Base8;

pub type HashSigScheme = SIGWinternitzLifetime18W4;
#[cfg(feature = "signature-scheme-test")]
pub type HashSigScheme = crate::hashsig::scheme::SIGTopLevelTargetSumLifetime8Dim16Base4;
62 changes: 62 additions & 0 deletions crates/crypto/post_quantum/src/hashsig/scheme.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use hashsig::{
inc_encoding::target_sum::TargetSumEncoding,
signature::generalized_xmss::GeneralizedXMSSSignatureScheme,
symmetric::{
message_hash::top_level_poseidon::TopLevelPoseidonMessageHash,
prf::shake_to_field::ShakePRFtoF, tweak_hash::poseidon::PoseidonTweakHash,
},
};

// TEST_CONFIG signature scheme parameters based on leanSpec configuration
// Source: https://github.com/leanEthereum/leanSpec/blob/a2bc45b66b1fa8506dfae54f9966563d1e54101c/src/lean_spec/subspecs/xmss/constants.py#L121-L137

const LOG_LIFETIME: usize = 8;
const DIMENSION: usize = 16;
const BASE: usize = 4;
const FINAL_LAYER: usize = 24;
const TARGET_SUM: usize = 24;

const PARAMETER_LENGTH: usize = 5;
const TWEAK_LENGTH_FIELD_ELEMENTS: usize = 2;
const MESSAGE_LENGTH_FIELD_ELEMENTS: usize = 9;
const RAND_LENGTH_FIELD_ELEMENTS: usize = 7;
const HASH_LENGTH_FIELD_ELEMENTS: usize = 8;

const CAPACITY: usize = 9;

const POSEIDON_OUTPUT_LENGTH_PER_INVOCATION_FIELD_ELEMENTS: usize = 15;
const POSEIDON_INVOCATIONS: usize = 1;
const POSEIDON_OUTPUT_LENGTH_FIELD_ELEMENTS: usize =
POSEIDON_OUTPUT_LENGTH_PER_INVOCATION_FIELD_ELEMENTS * POSEIDON_INVOCATIONS;

type MessageHash = TopLevelPoseidonMessageHash<
POSEIDON_OUTPUT_LENGTH_PER_INVOCATION_FIELD_ELEMENTS,
POSEIDON_INVOCATIONS,
POSEIDON_OUTPUT_LENGTH_FIELD_ELEMENTS,
DIMENSION,
BASE,
FINAL_LAYER,
TWEAK_LENGTH_FIELD_ELEMENTS,
MESSAGE_LENGTH_FIELD_ELEMENTS,
PARAMETER_LENGTH,
RAND_LENGTH_FIELD_ELEMENTS,
>;
type TweakableHash = PoseidonTweakHash<
PARAMETER_LENGTH,
HASH_LENGTH_FIELD_ELEMENTS,
TWEAK_LENGTH_FIELD_ELEMENTS,
CAPACITY,
DIMENSION,
>;

#[allow(clippy::upper_case_acronyms)]
type PseudoRandomFunction = ShakePRFtoF<HASH_LENGTH_FIELD_ELEMENTS>;

type IncomparableEncoding = TargetSumEncoding<MessageHash, TARGET_SUM>;

pub type SIGTopLevelTargetSumLifetime8Dim16Base4 = GeneralizedXMSSSignatureScheme<
PseudoRandomFunction,
IncomparableEncoding,
TweakableHash,
LOG_LIFETIME,
>;