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
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1 +1 @@
scarb nightly-2025-06-07
scarb 2.14.0
44 changes: 22 additions & 22 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
TARGET_DIR = target
PROVING_UTILS_REV=efbaeebfdce3463aa61e16d7d8e6069f03df0994

install-cairo-prove:
RUSTFLAGS="-C target-cpu=native -C opt-level=3" \
cargo install \
--git https://github.com/starkware-libs/stwo-cairo \
--rev adc68829b0e913d5a8bdf14932a45fde27a2e335 \
cairo-prove
install-stwo-run-and-prove:
cargo +nightly-2025-07-14 install \
--git ssh://git@github.com/m-kus/proving-utils.git \
--rev $(PROVING_UTILS_REV) \
stwo_run_and_prove --force

falcon-execute:
rm -rf $(TARGET_DIR)/execute/falcon \
Expand All @@ -19,14 +19,14 @@ falcon-args:
falcon-build:
scarb --profile release build --package falcon

falcon-prove: falcon-build
rm -rf $(TARGET_DIR)/execute/falcon
mkdir -p $(TARGET_DIR)/execute/falcon
cairo-prove prove \
$(TARGET_DIR)/release/falcon.executable.json \
$(TARGET_DIR)/execute/falcon/proof.json \
--arguments-file packages/falcon/tests/data/args_512_1.json \
--proof-format cairo-serde
falcon-prove:
stwo_run_and_prove \
--program resources/simple_bootloader_compiled.json \
--program_input packages/falcon/proving_task.json \
--prover_params_json prover_params.json \
--proofs_dir $(TARGET_DIR) \
--proof-format cairo-serde \
--verify

falcon-burn:
scarb burn --package falcon \
Expand All @@ -52,11 +52,11 @@ sphincs-burn: sphincs-build
--arguments-file packages/sphincs-plus/tests/data/sha2_simple_128s.json \
--open-in-browser

sphincs-prove: sphincs-build
rm -rf $(TARGET_DIR)/execute/sphincs_plus
mkdir -p $(TARGET_DIR)/execute/sphincs_plus
cairo-prove prove \
$(TARGET_DIR)/release/sphincs_plus.executable.json \
$(TARGET_DIR)/execute/sphincs_plus/proof.json \
--arguments-file packages/sphincs-plus/tests/data/sha2_simple_128s.json \
--proof-format cairo-serde
sphincs-prove:
stwo_run_and_prove \
--program resources/simple_bootloader_compiled.json \
--program_input packages/sphincs-plus/proving_task.json \
--prover_params_json prover_params.json \
--proofs_dir $(TARGET_DIR) \
--proof-format cairo-serde \
--verify
9 changes: 9 additions & 0 deletions packages/falcon/proving_task.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"single_page": true,
"tasks": [{
"type": "Cairo1Executable",
"path": "target/release/falcon.executable.json",
"program_hash_function": "blake",
"user_args_file": "packages/falcon/tests/data/args_512_1.json"
}]
}
6 changes: 4 additions & 2 deletions packages/falcon/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ fn main(args: Args) {
let Args { attestations, n } = args;
println!("Verifying {} signatures", attestations.len());

for attestation in attestations {
falcon::verify_uncompressed::<512>(attestation.s1, attestation.pk, attestation.msg_point, n)
for attestation in attestations.span() {
falcon::verify_uncompressed::<
512,
>(*attestation.s1, *attestation.pk, *attestation.msg_point, n)
.expect('Invalid signature');
}
println!("OK");
Expand Down
9 changes: 9 additions & 0 deletions packages/sphincs-plus/proving_task.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"single_page": true,
"tasks": [{
"type": "Cairo1Executable",
"path": "target/release/sphincs_plus.executable.json",
"program_hash_function": "blake",
"user_args_file": "packages/sphincs-plus/tests/data/sha2_simple_128s.json"
}]
}
11 changes: 4 additions & 7 deletions packages/sphincs-plus/src/hasher.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ mod sha256;

// Cairo-friendly hash function (custom AIR in Stwo)
#[cfg(feature: "blake_hash")]
pub use blake2s::{HashState, hash_finalize, hash_init, hash_update};
pub use blake2s::{HashState, hash_finalize, hash_init, hash_update, hash_update_block};

// Default hash function according to the sha256-128s parameters.
#[cfg(not(feature: "blake_hash"))]
pub use sha256::{HashState, hash_finalize, hash_init, hash_update};
pub use sha256::{HashState, hash_finalize, hash_init, hash_update, hash_update_block};

// Imports.
use crate::address::{Address, AddressTrait, AddressType};
Expand All @@ -32,13 +32,10 @@ pub struct SpxCtx {
/// This initializes state_seeded and state_seeded_512, which can then be
/// reused input thash
pub fn initialize_hash_function(pk_seed: HashOutput) -> SpxCtx {
let mut data = pk_seed.span().into();
data.append_span(array![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].span());

let mut state: HashState = Default::default();
let [a, b, c, d] = pk_seed;
hash_init(ref state);
hash_update(ref state, data.span());

hash_update_block(ref state, [a, b, c, d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
SpxCtx { state_seeded: state }
}

Expand Down
13 changes: 11 additions & 2 deletions packages/sphincs-plus/src/hasher/blake2s.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ pub fn hash_init(ref state: HashState) {
state.byte_len = 0;
}

pub fn hash_update_block(ref state: HashState, data: [u32; 16]) {
state.byte_len += 64;
state.h = blake2s_compress(state.h, state.byte_len, BoxImpl::new(data));
}

pub fn hash_finalize_block(ref state: HashState, data: [u32; 16]) -> [u32; 8] {
blake2s_finalize(state.h, state.byte_len + 64, BoxImpl::new(data)).unbox()
}

/// Updates the Blake2s hasher state with the given data (data length must be a multiple of 16).
pub fn hash_update(ref state: HashState, mut data: Span<u32>) {
while let Some(chunk) = data.multi_pop_front::<16>() {
Expand Down Expand Up @@ -59,13 +68,13 @@ pub fn hash_finalize(
buffer.append(last_input_word * 0x100);
}

state.byte_len += buffer.len() * 4;

for _ in buffer.len()..16 {
buffer.append(0);
}

let msg = buffer.span().try_into().expect('Cast to @Blake2sInput failed');
state.byte_len += 64;

let res = blake2s_finalize(state.h, state.byte_len, *msg);
res.unbox()
}
6 changes: 6 additions & 0 deletions packages/sphincs-plus/src/hasher/sha256.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ pub fn hash_update(ref state: HashState, mut data: Span<u32>) {
state.byte_len += data_len * 4;
}

/// Updates the SHA-256 hasher state with the given data (data length must be a multiple of 16).
pub fn hash_update_block(ref state: HashState, data: [u32; 16]) {
state.byte_len += 64;
state.h = sha256_inner(data.span(), state.h);
}

/// Finalizes the SHA-256 hasher state and returns the hash.
///
/// Adds padding to the input array for SHA-256. The padding is defined as follows:
Expand Down
4 changes: 2 additions & 2 deletions packages/sphincs-plus/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ pub struct Args {
fn main(args: Args) {
let Args { pk, sig, message } = args;
let res = sphincs::verify_128s(message.span(), sig, pk);
// TODO: generate a valid signature for blake_hash
check_result(res);
}

#[cfg(feature: "blake_hash")]
fn check_result(res: bool) {}
fn check_result(res: bool) { // TODO: generate a valid signature for blake_hash
}

#[cfg(not(feature: "blake_hash"))]
fn check_result(res: bool) {
Expand Down
6 changes: 3 additions & 3 deletions packages/sphincs-plus/src/sphincs.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ use crate::params_128s::{SPX_D, SPX_DGST_BYTES, SPX_TREE_HEIGHT};
use crate::word_array::{WordArrayTrait, WordSpan, WordSpanTrait};
use crate::wots::{WotsSignature, WotsSignatureDefault, WotsSignatureSerde, wots_pk_from_sig};

#[derive(Drop, Serde, Default)]
#[derive(Drop, Serde, Default, Copy)]
pub struct SphincsSignature {
pub randomizer: HashOutput,
pub fors_sig: ForsSignature,
pub wots_merkle_sig_list: [WotsMerkleSignature; SPX_D],
}

#[derive(Drop, Serde, Default)]
#[derive(Drop, Serde, Default, Copy)]
pub struct SphincsPublicKey {
pub pk_seed: HashOutput,
pub pk_root: HashOutput,
}

#[derive(Drop, Serde, Default)]
#[derive(Drop, Serde, Default, Copy)]
pub struct WotsMerkleSignature {
pub wots_sig: WotsSignature,
pub auth_path: [HashOutput; SPX_TREE_HEIGHT],
Expand Down
12 changes: 12 additions & 0 deletions prover_params.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"channel_hash": "blake2s",
"pcs_config": {
"pow_bits": 26,
"fri_config": {
"log_last_layer_degree_bound": 0,
"log_blowup_factor": 1,
"n_queries": 70
}
},
"preprocessed_trace": "canonical_without_pedersen"
}
Loading
Loading