diff --git a/README.md b/README.md index cfeac61de..ef907cee8 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,10 @@ Messages sealed as one type must be unsealed using the corresponding method, oth - `RpoRandomCoin`: a struct implementing `FeltRng` as well as the [`RandomCoin`](https://github.com/facebook/winterfell/blob/main/crypto/src/random/mod.rs) trait using RPO hash function. - `RpxRandomCoin`: a struct implementing `FeltRng` as well as the [`RandomCoin`](https://github.com/facebook/winterfell/blob/main/crypto/src/random/mod.rs) trait using RPX hash function. +## STARK proving system + +The STARK module exports foundational components for the STARK proving system. It primarily consists of re-exports from the [Plonky3](https://github.com/Plonky3/Plonky3) project with some Miden-specific [adaptations](https://github.com/0xMiden/p3-miden). + ## Make commands We use `make` to automate building, testing, and other processes. In most cases, `make` commands are wrappers around `cargo` commands with specific arguments. You can view the list of available commands in the [Makefile](Makefile), or run the following command: diff --git a/miden-crypto/benches/common/data.rs b/miden-crypto/benches/common/data.rs index 9e7709496..de9c9efb0 100644 --- a/miden-crypto/benches/common/data.rs +++ b/miden-crypto/benches/common/data.rs @@ -31,7 +31,7 @@ use std::iter; use miden_crypto::{ Felt, ONE, Word, - test_utils::{prng_array, rand_value}, + rand::test_utils::{prng_array, rand_value}, }; // === Byte Array Generation === @@ -81,11 +81,11 @@ pub fn generate_word(seed: &mut [u8; 32]) -> Word { } /// Generate a generic value from seed using PRNG -pub fn generate_value( +pub fn generate_value( seed: &mut [u8; 32], ) -> T { *seed = prng_array(*seed); - let value: [T; 1] = miden_crypto::test_utils::prng_array(*seed); + let value: [T; 1] = miden_crypto::rand::test_utils::prng_array(*seed); value[0].clone() } diff --git a/miden-crypto/benches/store.rs b/miden-crypto/benches/store.rs index 59d714330..c198f3fbd 100644 --- a/miden-crypto/benches/store.rs +++ b/miden-crypto/benches/store.rs @@ -8,7 +8,7 @@ use miden_crypto::{ smt::{LeafIndex, SMT_MAX_DEPTH, SimpleSmt}, store::MerkleStore, }, - test_utils::{rand_array, rand_value}, + rand::test_utils::{rand_array, rand_value}, }; /// Since MerkleTree can only be created when a power-of-two number of elements is used, the sample diff --git a/miden-crypto/src/aead/aead_rpo/mod.rs b/miden-crypto/src/aead/aead_rpo/mod.rs index a019d3331..67d971dc4 100644 --- a/miden-crypto/src/aead/aead_rpo/mod.rs +++ b/miden-crypto/src/aead/aead_rpo/mod.rs @@ -27,8 +27,8 @@ use crate::{ ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, bytes_to_elements_exact, bytes_to_elements_with_padding, elements_to_bytes, padded_elements_to_bytes, + zeroize::{Zeroize, ZeroizeOnDrop}, }, - zeroize::{Zeroize, ZeroizeOnDrop}, }; #[cfg(all(test, feature = "std"))] diff --git a/miden-crypto/src/aead/mod.rs b/miden-crypto/src/aead/mod.rs index 6164a4cb0..9809a050f 100644 --- a/miden-crypto/src/aead/mod.rs +++ b/miden-crypto/src/aead/mod.rs @@ -9,8 +9,10 @@ use thiserror::Error; use crate::{ Felt, - utils::Deserializable, - zeroize::{Zeroize, ZeroizeOnDrop}, + utils::{ + Deserializable, + zeroize::{Zeroize, ZeroizeOnDrop}, + }, }; pub mod aead_rpo; diff --git a/miden-crypto/src/aead/xchacha/mod.rs b/miden-crypto/src/aead/xchacha/mod.rs index 7166e5cfb..8b5cb643b 100644 --- a/miden-crypto/src/aead/xchacha/mod.rs +++ b/miden-crypto/src/aead/xchacha/mod.rs @@ -24,8 +24,8 @@ use crate::{ utils::{ ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, bytes_to_elements_exact, elements_to_bytes, + zeroize::{Zeroize, ZeroizeOnDrop}, }, - zeroize::{Zeroize, ZeroizeOnDrop}, }; #[cfg(all(test, feature = "std"))] diff --git a/miden-crypto/src/dsa/ecdsa_k256_keccak/mod.rs b/miden-crypto/src/dsa/ecdsa_k256_keccak/mod.rs index bf11f8fdd..c59ec38f4 100644 --- a/miden-crypto/src/dsa/ecdsa_k256_keccak/mod.rs +++ b/miden-crypto/src/dsa/ecdsa_k256_keccak/mod.rs @@ -17,8 +17,8 @@ use crate::{ utils::{ ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, bytes_to_packed_u32_elements, + zeroize::{Zeroize, ZeroizeOnDrop}, }, - zeroize::{Zeroize, ZeroizeOnDrop}, }; #[cfg(all(test, feature = "std"))] diff --git a/miden-crypto/src/dsa/eddsa_25519_sha512/mod.rs b/miden-crypto/src/dsa/eddsa_25519_sha512/mod.rs index 36a928eb6..70c8171b9 100644 --- a/miden-crypto/src/dsa/eddsa_25519_sha512/mod.rs +++ b/miden-crypto/src/dsa/eddsa_25519_sha512/mod.rs @@ -14,8 +14,8 @@ use crate::{ utils::{ ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, bytes_to_packed_u32_elements, + zeroize::{Zeroize, ZeroizeOnDrop}, }, - zeroize::{Zeroize, ZeroizeOnDrop}, }; #[cfg(all(test, feature = "std"))] diff --git a/miden-crypto/src/dsa/falcon512_rpo/keys/secret_key.rs b/miden-crypto/src/dsa/falcon512_rpo/keys/secret_key.rs index 5ea787628..df9f8f69f 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/keys/secret_key.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/keys/secret_key.rs @@ -18,7 +18,7 @@ use crate::{ Word, dsa::falcon512_rpo::{LOG_N, SK_LEN, hash_to_point::hash_to_point_rpo256, math::ntru_gen}, hash::blake::Blake3_256, - zeroize::{Zeroize, ZeroizeOnDrop}, + utils::zeroize::{Zeroize, ZeroizeOnDrop}, }; // CONSTANTS diff --git a/miden-crypto/src/dsa/falcon512_rpo/math/ffsampling.rs b/miden-crypto/src/dsa/falcon512_rpo/math/ffsampling.rs index 1d05d992b..2ea7cc4b1 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/math/ffsampling.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/math/ffsampling.rs @@ -5,7 +5,7 @@ use num_complex::{Complex, Complex64}; use rand::Rng; use super::{fft::FastFft, polynomial::Polynomial, samplerz::sampler_z}; -use crate::zeroize::{Zeroize, ZeroizeOnDrop}; +use crate::utils::zeroize::{Zeroize, ZeroizeOnDrop}; const SIGMIN: f64 = 1.2778336969128337; diff --git a/miden-crypto/src/dsa/falcon512_rpo/math/polynomial.rs b/miden-crypto/src/dsa/falcon512_rpo/math/polynomial.rs index 665634da8..bbcc02972 100644 --- a/miden-crypto/src/dsa/falcon512_rpo/math/polynomial.rs +++ b/miden-crypto/src/dsa/falcon512_rpo/math/polynomial.rs @@ -14,7 +14,7 @@ use super::{Inverse, field::FalconFelt}; use crate::{ Felt, dsa::falcon512_rpo::{MODULUS, N}, - zeroize::{Zeroize, ZeroizeOnDrop}, + utils::zeroize::{Zeroize, ZeroizeOnDrop}, }; /// Represents a polynomial with coefficients of type F. @@ -651,11 +651,12 @@ impl ZeroizeOnDrop for Polynomial {} #[cfg(all(test, feature = "std"))] mod tests { use super::{FalconFelt, N, Polynomial}; + use crate::rand::test_utils::rand_array; #[test] fn test_negacyclic_reduction() { - let coef1: [u8; N] = crate::test_utils::rand_array(); - let coef2: [u8; N] = crate::test_utils::rand_array(); + let coef1: [u8; N] = rand_array(); + let coef2: [u8; N] = rand_array(); let poly1 = Polynomial::new(coef1.iter().map(|&a| FalconFelt::new(a as i16)).collect()); let poly2 = Polynomial::new(coef2.iter().map(|&a| FalconFelt::new(a as i16)).collect()); diff --git a/miden-crypto/src/ecdh/k256.rs b/miden-crypto/src/ecdh/k256.rs index c401a3d37..2f94849fe 100644 --- a/miden-crypto/src/ecdh/k256.rs +++ b/miden-crypto/src/ecdh/k256.rs @@ -21,8 +21,10 @@ use rand::{CryptoRng, RngCore}; use crate::{ dsa::ecdsa_k256_keccak::{PUBLIC_KEY_BYTES, PublicKey, SecretKey}, ecdh::KeyAgreementScheme, - utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, - zeroize::{Zeroize, ZeroizeOnDrop}, + utils::{ + ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, + zeroize::{Zeroize, ZeroizeOnDrop}, + }, }; // SHARED SECRET diff --git a/miden-crypto/src/ecdh/mod.rs b/miden-crypto/src/ecdh/mod.rs index b6b416536..782893ebf 100644 --- a/miden-crypto/src/ecdh/mod.rs +++ b/miden-crypto/src/ecdh/mod.rs @@ -5,8 +5,8 @@ use alloc::vec::Vec; use rand::{CryptoRng, RngCore}; use thiserror::Error; -use crate::{ - utils::{Deserializable, Serializable}, +use crate::utils::{ + Deserializable, Serializable, zeroize::{Zeroize, ZeroizeOnDrop}, }; diff --git a/miden-crypto/src/ecdh/x25519.rs b/miden-crypto/src/ecdh/x25519.rs index 4bc0eccee..bc34af77e 100644 --- a/miden-crypto/src/ecdh/x25519.rs +++ b/miden-crypto/src/ecdh/x25519.rs @@ -21,8 +21,10 @@ use rand::{CryptoRng, RngCore}; use crate::{ dsa::eddsa_25519_sha512::{PublicKey, SecretKey}, ecdh::KeyAgreementScheme, - utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, - zeroize::{Zeroize, ZeroizeOnDrop}, + utils::{ + ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, + zeroize::{Zeroize, ZeroizeOnDrop}, + }, }; // SHARED SECRETE diff --git a/miden-crypto/src/hash/algebraic_sponge/mod.rs b/miden-crypto/src/hash/algebraic_sponge/mod.rs index 28c6f0ef8..97ce24503 100644 --- a/miden-crypto/src/hash/algebraic_sponge/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/mod.rs @@ -17,23 +17,11 @@ use core::ops::Range; use p3_field::PrimeCharacteristicRing; use super::{Felt, Word, ZERO}; -use crate::{BasedVectorSpace, PrimeField64}; +use crate::field::{BasedVectorSpace, PrimeField64}; pub(crate) mod poseidon2; pub(crate) mod rescue; -// Re-export the main hash function types -pub use poseidon2::Poseidon2; -// Re-export P3 integration types for public API -pub use poseidon2::{ - Poseidon2Challenger, Poseidon2Compression, Poseidon2Hasher, Poseidon2Permutation256, -}; -pub use rescue::{ - Rpo256, Rpx256, - rpo::{RpoChallenger, RpoCompression, RpoHasher, RpoPermutation256}, - rpx::{RpxChallenger, RpxCompression, RpxHasher, RpxPermutation256}, -}; - // CONSTANTS // ================================================================================================ diff --git a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs index ee7f8b668..a13ae459d 100644 --- a/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/poseidon2/mod.rs @@ -1,7 +1,7 @@ use super::{ AlgebraicSponge, CAPACITY_RANGE, DIGEST_RANGE, Felt, RATE_RANGE, Range, STATE_WIDTH, Word, ZERO, }; -use crate::PrimeCharacteristicRing; +use crate::field::PrimeCharacteristicRing; mod constants; use constants::{ @@ -134,7 +134,7 @@ impl Poseidon2 { /// Returns a hash of the provided field elements. #[inline(always)] - pub fn hash_elements>(elements: &[E]) -> Word { + pub fn hash_elements>(elements: &[E]) -> Word { ::hash_elements(elements) } diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs index f314beaa2..b8209a349 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/mod.rs @@ -16,10 +16,7 @@ mod mds; use mds::{MDS, apply_mds}; pub(crate) mod rpo; -pub use rpo::Rpo256; - pub(crate) mod rpx; -pub use rpx::Rpx256; #[cfg(test)] mod tests; diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs index ea8009a53..94dd72f91 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/mod.rs @@ -124,7 +124,7 @@ impl Rpo256 { /// Returns a hash of the provided field elements. #[inline(always)] - pub fn hash_elements>(elements: &[E]) -> Word { + pub fn hash_elements>(elements: &[E]) -> Word { ::hash_elements(elements) } diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs index 66cf69b58..18bf0ff88 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpo/tests.rs @@ -8,9 +8,10 @@ use super::{ Felt, Rpo256, STATE_WIDTH, }; use crate::{ - ONE, PrimeCharacteristicRing, PrimeField64, Word, ZERO, + ONE, Word, ZERO, + field::{PrimeCharacteristicRing, PrimeField64}, hash::algebraic_sponge::{AlgebraicSponge, BINARY_CHUNK_SIZE, CAPACITY_RANGE, RATE_WIDTH}, - test_utils::rand_value, + rand::test_utils::rand_value, }; #[test] diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs index 61e6e36a6..73d4d14c2 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/mod.rs @@ -126,7 +126,7 @@ impl Rpx256 { /// Returns a hash of the provided field elements. #[inline(always)] - pub fn hash_elements>(elements: &[E]) -> Word { + pub fn hash_elements>(elements: &[E]) -> Word { ::hash_elements(elements) } @@ -250,7 +250,7 @@ impl Rpx256 { /// over the field arithmetic. mod cubic_ext { use super::Felt; - use crate::PrimeCharacteristicRing; + use crate::field::PrimeCharacteristicRing; /// Multiplies two cubic extension field elements. /// diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs index 3930f38fc..723179c23 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/rpx/tests.rs @@ -5,7 +5,9 @@ use p3_field::PrimeField64; use proptest::prelude::*; use super::{Felt, Rpx256}; -use crate::{ONE, Word, ZERO, hash::algebraic_sponge::AlgebraicSponge, test_utils::rand_value}; +use crate::{ + ONE, Word, ZERO, hash::algebraic_sponge::AlgebraicSponge, rand::test_utils::rand_value, +}; // The number of iterations to run the `ext_round_matches_reference_many` test. #[cfg(all( diff --git a/miden-crypto/src/hash/algebraic_sponge/rescue/tests.rs b/miden-crypto/src/hash/algebraic_sponge/rescue/tests.rs index 55f07cb63..b8d750230 100644 --- a/miden-crypto/src/hash/algebraic_sponge/rescue/tests.rs +++ b/miden-crypto/src/hash/algebraic_sponge/rescue/tests.rs @@ -2,7 +2,7 @@ use p3_field::PrimeCharacteristicRing; use super::{ALPHA, Felt, INV_ALPHA}; -use crate::test_utils::rand_value; +use crate::rand::test_utils::rand_value; #[test] fn test_alphas() { diff --git a/miden-crypto/src/hash/blake/tests.rs b/miden-crypto/src/hash/blake/tests.rs index 32e926463..5ad6b659d 100644 --- a/miden-crypto/src/hash/blake/tests.rs +++ b/miden-crypto/src/hash/blake/tests.rs @@ -6,7 +6,7 @@ use p3_miden_goldilocks::Goldilocks as Felt; use proptest::prelude::*; use super::*; -use crate::test_utils::rand_vector; +use crate::rand::test_utils::rand_vector; #[test] fn blake3_hash_elements() { diff --git a/miden-crypto/src/hash/keccak/mod.rs b/miden-crypto/src/hash/keccak/mod.rs index 8c7d6a82e..02a32ea66 100644 --- a/miden-crypto/src/hash/keccak/mod.rs +++ b/miden-crypto/src/hash/keccak/mod.rs @@ -10,7 +10,7 @@ use sha3::Digest as Sha3Digest; use super::{Felt, HasherExt}; use crate::{ - PrimeField64, + field::PrimeField64, utils::{ ByteReader, ByteWriter, Deserializable, DeserializationError, HexParseError, Serializable, bytes_to_hex_string, hex_to_bytes, diff --git a/miden-crypto/src/hash/keccak/tests.rs b/miden-crypto/src/hash/keccak/tests.rs index 61dc984fe..2c8bd1331 100644 --- a/miden-crypto/src/hash/keccak/tests.rs +++ b/miden-crypto/src/hash/keccak/tests.rs @@ -4,7 +4,7 @@ use alloc::vec::Vec; use proptest::prelude::*; use super::*; -use crate::test_utils::rand_vector; +use crate::rand::test_utils::rand_vector; #[test] fn keccak256_hash_elements() { diff --git a/miden-crypto/src/hash/mod.rs b/miden-crypto/src/hash/mod.rs index 2ba7e4801..57d452988 100644 --- a/miden-crypto/src/hash/mod.rs +++ b/miden-crypto/src/hash/mod.rs @@ -13,20 +13,29 @@ pub mod sha2; /// Poseidon2 hash function. pub mod poseidon2 { - pub use super::algebraic_sponge::poseidon2::Poseidon2; + pub use p3_miden_goldilocks::Poseidon2Goldilocks; + + pub use super::algebraic_sponge::poseidon2::{ + Poseidon2, Poseidon2Challenger, Poseidon2Compression, Poseidon2Hasher, + Poseidon2Permutation256, + }; } /// Rescue Prime Optimized (RPO) hash function. pub mod rpo { - pub use super::algebraic_sponge::rescue::Rpo256; + pub use super::algebraic_sponge::rescue::rpo::{ + Rpo256, RpoChallenger, RpoCompression, RpoHasher, RpoPermutation256, + }; } /// Rescue Prime Extended (RPX) hash function. pub mod rpx { - pub use super::algebraic_sponge::rescue::Rpx256; + pub use super::algebraic_sponge::rescue::rpx::{ + Rpx256, RpxChallenger, RpxCompression, RpxHasher, RpxPermutation256, + }; } -pub mod algebraic_sponge; +mod algebraic_sponge; // TRAITS // ================================================================================================ diff --git a/miden-crypto/src/hash/sha2/tests.rs b/miden-crypto/src/hash/sha2/tests.rs index 3064d8f8a..623c413a9 100644 --- a/miden-crypto/src/hash/sha2/tests.rs +++ b/miden-crypto/src/hash/sha2/tests.rs @@ -4,7 +4,7 @@ use alloc::vec::Vec; use proptest::prelude::*; use super::*; -use crate::test_utils::rand_vector; +use crate::rand::test_utils::rand_vector; // SHA-256 TESTS // ================================================================================================ diff --git a/miden-crypto/src/ies/crypto_box.rs b/miden-crypto/src/ies/crypto_box.rs index 693b79764..2ebf00725 100644 --- a/miden-crypto/src/ies/crypto_box.rs +++ b/miden-crypto/src/ies/crypto_box.rs @@ -9,7 +9,7 @@ use alloc::vec::Vec; use rand::{CryptoRng, RngCore}; use super::IesError; -use crate::{Felt, aead::AeadScheme, ecdh::KeyAgreementScheme, zeroize::Zeroizing}; +use crate::{Felt, aead::AeadScheme, ecdh::KeyAgreementScheme, utils::zeroize::Zeroizing}; // CRYPTO BOX // ================================================================================================ diff --git a/miden-crypto/src/lib.rs b/miden-crypto/src/lib.rs index df28062b7..748cf56b6 100644 --- a/miden-crypto/src/lib.rs +++ b/miden-crypto/src/lib.rs @@ -5,6 +5,8 @@ extern crate alloc; #[cfg(feature = "std")] extern crate std; +use field::PrimeCharacteristicRing; + pub mod aead; pub mod dsa; pub mod ecdh; @@ -15,36 +17,48 @@ pub mod rand; pub mod utils; pub mod word; -// Test utilities for generating random data (used in tests and benchmarks) -#[cfg(any(test, feature = "std"))] -pub mod test_utils; - // RE-EXPORTS // ================================================================================================ - -pub use k256::elliptic_curve::zeroize; -pub use p3_air::{ - Air, AirBuilder, AirBuilderWithPublicValues, BaseAir, BaseAirWithPublicValues, - ExtensionBuilder, FilteredAirBuilder, PairBuilder, PairCol, PermutationAirBuilder, - VirtualPairCol, -}; -pub use p3_field::{ - BasedVectorSpace, ExtensionField, Field, PrimeCharacteristicRing, PrimeField64, - batch_multiplicative_inverse, extension::BinomialExtensionField, integers::QuotientMap, -}; -pub use p3_miden_air::{BaseAirWithAuxTrace, FilteredMidenAirBuilder, MidenAir, MidenAirBuilder}; -pub use p3_miden_goldilocks::{Goldilocks as Felt, Poseidon2Goldilocks}; -pub use p3_miden_prover::{ - Commitments, Domain, Entry, OpenedValues, PackedChallenge, PackedVal, PcsError, Proof, - ProverConstraintFolder, StarkConfig, StarkGenericConfig, SymbolicAirBuilder, - SymbolicExpression, SymbolicVariable, Val, VerificationError, VerifierConstraintFolder, - generate_logup_trace, get_log_quotient_degree, get_max_constraint_degree, - get_symbolic_constraints, prove, quotient_values, recompose_quotient_from_chunks, verify, - verify_constraints, -}; +pub use p3_miden_goldilocks::Goldilocks as Felt; pub use word::{Word, WordError}; -pub use crate::rand::{Randomizable, RpoRandomCoin, RpxRandomCoin}; +pub mod field { + //! Traits and utilities for working with the Goldilocks finite field (i.e., + //! [Felt](super::Felt)). + + pub use p3_field::{ + BasedVectorSpace, ExtensionField, Field, PrimeCharacteristicRing, PrimeField64, + batch_multiplicative_inverse, extension::BinomialExtensionField, integers::QuotientMap, + }; +} + +pub mod stark { + //! Foundational components for the STARK proving system based on Plonky3. + //! + //! This module contains components needed to build a STARK prover/verifier and define + //! Algebraic Intermediate Representation (AIR) for the Miden VM and other components. + //! It primarily consists of re-exports from the Plonky3 project with some Miden-specific + //! adaptations. + pub use p3_miden_prover::{ + Commitments, Domain, Entry, OpenedValues, PackedChallenge, PackedVal, PcsError, Proof, + ProverConstraintFolder, StarkConfig, StarkGenericConfig, SymbolicAirBuilder, + SymbolicExpression, SymbolicVariable, Val, VerificationError, VerifierConstraintFolder, + generate_logup_trace, get_log_quotient_degree, get_max_constraint_degree, + get_symbolic_constraints, prove, quotient_values, recompose_quotient_from_chunks, verify, + verify_constraints, + }; + + pub mod air { + pub use p3_air::{ + Air, AirBuilder, AirBuilderWithPublicValues, BaseAir, BaseAirWithPublicValues, + ExtensionBuilder, FilteredAirBuilder, PairBuilder, PairCol, PermutationAirBuilder, + VirtualPairCol, + }; + pub use p3_miden_air::{ + BaseAirWithAuxTrace, FilteredMidenAirBuilder, MidenAir, MidenAirBuilder, + }; + } +} // TYPE ALIASES // ================================================================================================ diff --git a/miden-crypto/src/main.rs b/miden-crypto/src/main.rs index ff8b217bb..e511d1481 100644 --- a/miden-crypto/src/main.rs +++ b/miden-crypto/src/main.rs @@ -7,7 +7,7 @@ use miden_crypto::{ EMPTY_WORD, Felt, ONE, Word, hash::rpo::Rpo256, merkle::smt::{LargeSmt, LargeSmtError, MemoryStorage, SmtStorage}, - test_utils::rand_value, + rand::test_utils::rand_value, }; use rand::{Rng, prelude::IteratorRandom, rng}; diff --git a/miden-crypto/src/merkle/mmr/forest.rs b/miden-crypto/src/merkle/mmr/forest.rs index f7b4e1718..97458ddbe 100644 --- a/miden-crypto/src/merkle/mmr/forest.rs +++ b/miden-crypto/src/merkle/mmr/forest.rs @@ -5,7 +5,8 @@ use core::{ use super::InOrderIndex; use crate::{ - Felt, PrimeField64, + Felt, + field::PrimeField64, utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, }; diff --git a/miden-crypto/src/merkle/smt/full/leaf.rs b/miden-crypto/src/merkle/smt/full/leaf.rs index fa498e9e1..69ef0f284 100644 --- a/miden-crypto/src/merkle/smt/full/leaf.rs +++ b/miden-crypto/src/merkle/smt/full/leaf.rs @@ -3,7 +3,8 @@ use core::cmp::Ordering; use super::EMPTY_WORD; use crate::{ - Felt, PrimeField64, Word, + Felt, Word, + field::PrimeField64, hash::rpo::Rpo256, merkle::smt::{LeafIndex, MAX_LEAF_ENTRIES, SMT_DEPTH, SmtLeafError}, utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, diff --git a/miden-crypto/src/merkle/smt/full/mod.rs b/miden-crypto/src/merkle/smt/full/mod.rs index 2d383d19b..b8afdba63 100644 --- a/miden-crypto/src/merkle/smt/full/mod.rs +++ b/miden-crypto/src/merkle/smt/full/mod.rs @@ -4,7 +4,7 @@ use super::{ EMPTY_WORD, EmptySubtreeRoots, InnerNode, InnerNodeInfo, InnerNodes, LeafIndex, MerkleError, MutationSet, NodeIndex, SparseMerklePath, SparseMerkleTree, Word, }; -use crate::PrimeField64; +use crate::field::PrimeField64; mod error; pub use error::{SmtLeafError, SmtProofError}; diff --git a/miden-crypto/src/merkle/smt/large/tests.rs b/miden-crypto/src/merkle/smt/large/tests.rs index 8d2af22b1..172420915 100644 --- a/miden-crypto/src/merkle/smt/large/tests.rs +++ b/miden-crypto/src/merkle/smt/large/tests.rs @@ -5,7 +5,8 @@ use rand::{Rng, prelude::IteratorRandom, rng}; use super::MemoryStorage; use crate::{ - EMPTY_WORD, Felt, ONE, PrimeField64, WORD_SIZE, Word, + EMPTY_WORD, Felt, ONE, WORD_SIZE, Word, + field::PrimeField64, merkle::{ InnerNodeInfo, smt::{ diff --git a/miden-crypto/src/merkle/smt/large_forest/history/tests.rs b/miden-crypto/src/merkle/smt/large_forest/history/tests.rs index 88c08155f..b3b763704 100644 --- a/miden-crypto/src/merkle/smt/large_forest/history/tests.rs +++ b/miden-crypto/src/merkle/smt/large_forest/history/tests.rs @@ -7,7 +7,7 @@ use super::{CompactLeaf, History, LeafChanges, NodeChanges, error::Result}; use crate::{ Felt, Word, merkle::{NodeIndex, smt::LeafIndex}, - test_utils::rand_value, + rand::test_utils::rand_value, }; // TESTS diff --git a/miden-crypto/src/merkle/smt/partial/tests.rs b/miden-crypto/src/merkle/smt/partial/tests.rs index 11dc88fe4..602450f6f 100644 --- a/miden-crypto/src/merkle/smt/partial/tests.rs +++ b/miden-crypto/src/merkle/smt/partial/tests.rs @@ -4,7 +4,7 @@ use assert_matches::assert_matches; use super::{PartialSmt, SMT_DEPTH}; #[cfg(any(test, feature = "std"))] -use crate::test_utils::{rand_array, rand_value}; +use crate::rand::test_utils::{rand_array, rand_value}; use crate::{ EMPTY_WORD, Felt, ONE, Word, ZERO, merkle::{ diff --git a/miden-crypto/src/merkle/store/mod.rs b/miden-crypto/src/merkle/store/mod.rs index 9fa75a35a..51c28ded9 100644 --- a/miden-crypto/src/merkle/store/mod.rs +++ b/miden-crypto/src/merkle/store/mod.rs @@ -39,7 +39,7 @@ pub struct StoreNode { /// # use miden_crypto::{ZERO, Felt, Word}; /// # use miden_crypto::merkle::{NodeIndex, MerkleTree, store::MerkleStore}; /// # use miden_crypto::hash::rpo::Rpo256; -/// # use miden_crypto::PrimeCharacteristicRing; +/// # use miden_crypto::field::PrimeCharacteristicRing; /// # const fn int_to_node(value: u64) -> Word { /// # Word::new([Felt::new(value), ZERO, ZERO, ZERO]) /// # } diff --git a/miden-crypto/src/rand/mod.rs b/miden-crypto/src/rand/mod.rs index b4d2be996..43bf52640 100644 --- a/miden-crypto/src/rand/mod.rs +++ b/miden-crypto/src/rand/mod.rs @@ -11,6 +11,10 @@ pub use rpo::RpoRandomCoin; mod rpx; pub use rpx::RpxRandomCoin; +// Test utilities for generating random data (used in tests and benchmarks) +#[cfg(any(test, feature = "std"))] +pub mod test_utils; + // RANDOMNESS (ported from Winterfell's winter-utils) // ================================================================================================ diff --git a/miden-crypto/src/test_utils.rs b/miden-crypto/src/rand/test_utils.rs similarity index 89% rename from miden-crypto/src/test_utils.rs rename to miden-crypto/src/rand/test_utils.rs index f12223b7d..998f46bb6 100644 --- a/miden-crypto/src/test_utils.rs +++ b/miden-crypto/src/rand/test_utils.rs @@ -9,13 +9,13 @@ use alloc::vec::Vec; use rand::{Rng, SeedableRng}; use rand_chacha::ChaCha20Rng; -use crate::utils::Randomizable; +use crate::rand::Randomizable; /// Generates a random value of type T using the thread-local random number generator. /// /// # Examples /// ``` -/// # use miden_crypto::test_utils::rand_value; +/// # use miden_crypto::rand::test_utils::rand_value; /// let x: u64 = rand_value(); /// let y: u128 = rand_value(); /// ``` @@ -31,7 +31,7 @@ pub fn rand_value() -> T { /// /// # Examples /// ``` -/// # use miden_crypto::test_utils::rand_array; +/// # use miden_crypto::rand::test_utils::rand_array; /// let arr: [u64; 4] = rand_array(); /// ``` #[cfg(feature = "std")] @@ -43,7 +43,7 @@ pub fn rand_array() -> [T; N] { /// /// # Examples /// ``` -/// # use miden_crypto::test_utils::rand_vector; +/// # use miden_crypto::rand::test_utils::rand_vector; /// let vec: Vec = rand_vector(100); /// ``` #[cfg(feature = "std")] @@ -58,7 +58,7 @@ pub fn rand_vector(length: usize) -> Vec { /// /// # Examples /// ``` -/// # use miden_crypto::test_utils::prng_array; +/// # use miden_crypto::rand::test_utils::prng_array; /// let seed = [0u8; 32]; /// let arr: [u64; 4] = prng_array(seed); /// ``` @@ -75,7 +75,7 @@ pub fn prng_array(seed: [u8; 32]) -> [T; N] { /// /// # Examples /// ``` -/// # use miden_crypto::test_utils::prng_vector; +/// # use miden_crypto::rand::test_utils::prng_vector; /// let seed = [0u8; 32]; /// let vec: Vec = prng_vector(seed, 100); /// ``` diff --git a/miden-crypto/src/utils/mod.rs b/miden-crypto/src/utils/mod.rs index 0af1cb8e8..45b8d3c01 100644 --- a/miden-crypto/src/utils/mod.rs +++ b/miden-crypto/src/utils/mod.rs @@ -19,7 +19,7 @@ mod iterators; #[cfg(feature = "concurrent")] use iterators::{IndexedParallelIterator, IntoParallelRefMutIterator, ParallelIterator}; -use crate::{Felt, PrimeField64, Word}; +use crate::{Felt, Word, field::PrimeField64}; // CONSTANTS // ================================================================================================ @@ -27,6 +27,11 @@ use crate::{Felt, PrimeField64, Word}; /// The number of byte chunks that can be safely embedded in a field element const BINARY_CHUNK_SIZE: usize = 7; +// RE-EXPORTS +// ================================================================================================ + +pub use k256::elliptic_curve::zeroize; + // UTILITY FUNCTIONS // ================================================================================================ @@ -354,8 +359,3 @@ pub fn transpose_slice(source: &[T]) -> V }); result } - -// RANDOMNESS (ported from Winterfell's winter-utils) -// ================================================================================================ - -pub use crate::rand::Randomizable; diff --git a/miden-crypto/src/word/mod.rs b/miden-crypto/src/word/mod.rs index adcfa431f..b802e409d 100644 --- a/miden-crypto/src/word/mod.rs +++ b/miden-crypto/src/word/mod.rs @@ -18,7 +18,7 @@ use p3_field::integers::QuotientMap; use super::{Felt, ZERO}; use crate::{ - PrimeCharacteristicRing, PrimeField64, + field::{PrimeCharacteristicRing, PrimeField64}, rand::Randomizable, utils::{ ByteReader, ByteWriter, Deserializable, DeserializationError, HexParseError, Serializable, diff --git a/miden-crypto/src/word/tests.rs b/miden-crypto/src/word/tests.rs index 14b952ecd..0fe119824 100644 --- a/miden-crypto/src/word/tests.rs +++ b/miden-crypto/src/word/tests.rs @@ -4,7 +4,7 @@ use alloc::string::String; use p3_field::PrimeCharacteristicRing; use super::{Deserializable, Felt, Serializable, WORD_SIZE_BYTES, WORD_SIZE_FELT, Word}; -use crate::{test_utils::rand_value, utils::SliceReader, word}; +use crate::{rand::test_utils::rand_value, utils::SliceReader, word}; // TESTS // ================================================================================================