initial commit
Some checks failed
CI / lint (push) Successful in 1m37s
CI / test-python (push) Successful in 1m49s
CI / test-zig (push) Successful in 1m39s
CI / test-wasm (push) Successful in 1m54s
CI / test (push) Successful in 14m44s
CI / miri (push) Successful in 14m18s
CI / build (push) Successful in 1m9s
CI / fuzz-regression (push) Successful in 9m9s
CI / publish (push) Failing after 1m10s
CI / publish-python (push) Failing after 1m46s
CI / publish-wasm (push) Has been cancelled

Signed-off-by: Kamal Tufekcic <kamal@lo.sh>
This commit is contained in:
Kamal Tufekcic 2026-04-02 23:48:10 +03:00
commit 1d99048c95
No known key found for this signature in database
165830 changed files with 79062 additions and 0 deletions

146
.config/nextest.toml Normal file
View file

@ -0,0 +1,146 @@
# Nextest configuration for libsoliton workspace.
#
# Profiles:
# default — runs all tests normally
# miri — runs only PQ-free tests (safe for MIRI's instruction-level
# interpretation; PQ operations like ML-KEM/ML-DSA are tested
# upstream by the ml-kem and ml-dsa crates under their own MIRI)
[profile.default]
# Default profile — all tests, no special configuration.
[profile.default.junit]
path = "target/nextest/default/junit.xml"
[profile.miri]
# MIRI profile: skip tests that are impractical under MIRI's instruction-level
# interpreter. Three categories are excluded:
#
# 1. PQ crypto (ML-KEM, ML-DSA, X-Wing keygen/encap/decap) — 2-18 min each;
# memory safety tested upstream by ml-kem/ml-dsa crate MIRI runs.
# 2. zstd compression (C FFI) — MIRI cannot call foreign function ZSTD_createCCtx.
# 3. Proptest / iteration-heavy tests — hundreds of iterations are wasteful
# under MIRI; a single iteration already validates UB.
#
# Included (~408 tests):
# libsoliton (~184):
# random (4), sha3_256 (6), hmac (12), hkdf (10), aead (11), argon2 (18),
# x25519 (8), ed25519 (9), xwing combiner/label/from_bytes (9), call (18),
# storage (33, excluding 3 zstd-dependent + 2 proptests + 1 ignored),
# constants (2), streaming (22 — empty/error-path/pure-math + 7 small-data
# MIRI variants; full-chunk tests use 1 MiB AEAD which exceeds MIRI timeout),
# ratchet/11 (decode_optional_bytes_zero_length_rejected,
# all_default_rejected_by_root_key_check,
# all_default_structural_invariant_rejected,
# recv_seen_cap_in_blob, kdf_msg_key_kat,
# kdf_msg_key_different_counters_produce_different_keys,
# kdf_msg_key_different_epochs_produce_different_keys,
# kdf_root_kat, nonce_from_counter_values, from_bytes_wrong_sized_xwing_sk,
# reset_zeroes_all_fields),
# identity from_bytes/3 (public key, secret key, hybrid signature),
# kex/8 (kex_derivation_kat: from_bytes + HKDF only, no keygen/encap;
# decode_session_init_*: pure parser, zeroed key bytes, no PQ ops)
# libsoliton_capi (~262):
# All error-path and PQ-free happy-path CAPI tests. Covers null-pointer
# guards, output-zeroing, co-presence guards, and safe round-trips
# (aead, sha3_256, hmac, hkdf, argon2id, ratchet PQ-free, storage w/o zstd,
# xwing length-only, verification phrase, streaming). Storage tests use
# compress=false to avoid the zstd C FFI. Streaming uses ruzstd (pure Rust).
#
# Excluded:
# libsoliton:
# PQ-dependent modules: mlkem, mldsa, xwing keygen/round-trip/proptest,
# identity, auth, most kex, ratchet, verification, integration_kex_ratchet,
# integration_storage (absent from positive filter; would also fail via zstd C FFI)
# zstd FFI: encrypt_decrypt_compressed, empty_plaintext_both_modes,
# invalid_compressed_data
# streaming full-chunk (1 MiB AEAD per test, exceeds MIRI timeout):
# all tests using chunk_plaintext() / multi-chunk encrypt-decrypt
# Iteration-heavy: proptest_derive_round_trip, proptest_round_trip,
# round_trip_large_plaintext, sign_bit_normalization,
# boundary_t_cost_accepted, boundary_p_cost_accepted, advance_multiple_steps
# zeroize_verify tests (use xwing keygen/encapsulate — PQ-heavy)
# header_up_to_date (spawns cbindgen subprocess — MIRI cannot exec)
# libsoliton_capi:
# pq::* in binary libsoliton_capi::capi_tests — xwing/identity/auth/kex PQ round-trips
# streaming full-chunk CAPI tests (1 MiB AEAD): capi_stream_round_trip_*,
# capi_stream_random_access, stream_decrypt_chunk_out_too_small,
# stream_decrypt_chunk_zeros_output_on_failure, stream_decrypt_expected_index_increments
#
# Usage:
# MIRIFLAGS="-Zmiri-disable-isolation" cargo +nightly miri nextest run \
# -p libsoliton -p libsoliton_capi --profile miri -j$(nproc)
default-filter = """
(
test(/^primitives::random::/)
| test(/^primitives::sha3_256::/)
| test(/^primitives::hmac::/)
| test(/^primitives::hkdf::/)
| test(/^primitives::aead::/)
| test(/^primitives::argon2::/)
| test(/^primitives::x25519::/)
| test(/^primitives::ed25519::/)
| test(/^primitives::xwing::tests::combiner_/)
| test(/^primitives::xwing::tests::label_/)
| test(/^primitives::xwing::tests::encapsulate_wrong/)
| test(/^primitives::xwing::tests::decapsulate_wrong/)
| test(/^primitives::xwing::tests::sk_from_bytes/)
| test(/^call::/)
| test(/^storage::/)
| test(/^constants::/)
| test(/^ratchet::tests::decode_optional_bytes_zero_length_rejected$/)
| test(/^ratchet::tests::all_default_rejected/)
| test(/^ratchet::tests::recv_seen_cap_in_blob$/)
| test(/^ratchet::tests::kdf_msg_key_kat$/)
| test(/^ratchet::tests::kdf_msg_key_different_counters_produce_different_keys$/)
| test(/^ratchet::tests::kdf_msg_key_different_epochs_produce_different_keys$/)
| test(/^ratchet::tests::kdf_root_kat$/)
| test(/^ratchet::tests::nonce_from_counter_values$/)
| test(/^ratchet::tests::from_bytes_wrong_sized_xwing_sk_returns_invalid_data$/)
| test(/^ratchet::tests::reset_zeroes_all_fields$/)
| test(/^identity::tests::identity_public_key_from_bytes_wrong_size$/)
| test(/^identity::tests::identity_secret_key_from_bytes_wrong_size$/)
| test(/^identity::tests::hybrid_signature_from_bytes_wrong_size$/)
| test(/^kex::tests::kex_derivation_kat$/)
| test(/^kex::tests::decode_session_init_/)
| test(/^streaming::tests::encrypt_decrypt_empty_file$/)
| test(/^streaming::tests::encrypt_after_finalization$/)
| test(/^streaming::tests::decrypt_after_finalization$/)
| test(/^streaming::tests::chunk_too_short$/)
| test(/^streaming::tests::uncompressed_non_final_wrong_ciphertext_size$/)
| test(/^streaming::tests::compression_bypassed_for_empty_final$/)
| test(/^streaming::tests::decrypt_init_wrong_version$/)
| test(/^streaming::tests::decrypt_init_version_0x02$/)
| test(/^streaming::tests::decrypt_init_reserved_flags$/)
| test(/^streaming::tests::nonce_uniqueness_/)
| test(/^streaming::tests::nonce_injectivity$/)
| test(/^streaming::tests::base_nonce_freshness$/)
| test(/^streaming::tests::nonce_derivation_kat$/)
| test(/^streaming::tests::aad_construction_kat$/)
| test(/^streaming::tests::header_construction_kat$/)
| test(/^streaming::tests::miri_/)
| binary_id(/^libsoliton_capi::capi_tests$/)
)
- test(/proptest/)
- test(/round_trip_large_plaintext/)
- test(/sign_bit_normalization/)
- test(/^storage::tests::encrypt_decrypt_compressed$/)
- test(/^storage::tests::empty_plaintext_both_modes$/)
- test(/^storage::tests::invalid_compressed_data$/)
- (test(/^pq::/) & binary_id(/^libsoliton_capi::capi_tests$/))
- test(/^capi_stream_round_trip/)
- test(/^capi_stream_random_access$/)
- test(/^stream_decrypt_chunk_out_too_small$/)
- test(/^stream_decrypt_chunk_zeros_output_on_failure$/)
- test(/^stream_decrypt_expected_index_increments$/)
- test(/concurrent_access_detected/)
- test(/^primitives::argon2::tests::boundary_t_cost_accepted$/)
- test(/^primitives::argon2::tests::boundary_p_cost_accepted$/)
- test(/^call::tests::advance_multiple_steps$/)
- test(/^header_up_to_date$/)
"""
[[profile.miri.overrides]]
# MIRI is slow even for lightweight tests — extend timeout.
filter = "all()"
slow-timeout = { period = "60s", terminate-after = 4 }