mirror of
https://github.com/saymrwulf/anza-ed25519-verified.git
synced 2026-09-03 20:13:46 +00:00
(verify_accepts_iff_decompress, button-enforced)
Port of the dalek decompress chain (byte-identical gen: the anza
extraction of sqrt_ratio_i / from_bytes / decompress matches dalek's
exactly, so DecompressSpec + FromBytesSpec port verbatim modulo the
crate namespace):
- source patch 994c469 (solana-ed25519): decompress step_2
negate-then-conditional-assign (the documented sqrt_ratio_i rewrite);
extract.sh: decompress un-opaqued, re-extracted (the step_1/step_2
external axioms vanish from the template - decompress is transparent).
- Proofs/DecompressSpec.lean: pow_p58, ct_eq/cond-assign semantics,
sqrt_core, sqrt_ratio_i_sq_spec (even root, v*r^2 = u).
- Proofs/FromBytesSpec.lean: load8_at loader, 5-window LE parse,
from_bytes_spec (exact below bit 255).
- Proofs/DecompressMain.lean: edwards_d_denote, decompress_of_canonical
(standard three axioms), verify_accepts_iff_decompress against the
anza apex shape (rb/sb/s, minus_A):
accept <=> decompress(R) = [k]*minus_A + [s]*B (as points).
check.sh: 4-tier Phase 3b (byte apex, half-lift, point equation, full
lift), each cone exactly [3 standard + Signature + sha512_hash3 +
r_bytes + s_bytes]. Full button green fresh.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
73 lines
3.7 KiB
Bash
Executable file
73 lines
3.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Regenerate the Lean model in gen/ from the Rust sources.
|
|
#
|
|
# SCOPE: field arithmetic + Edwards point arithmetic
|
|
# roots: crate::field, crate::backend::serial::u64::field,
|
|
# crate::backend::serial::curve_models, crate::edwards
|
|
# (same widening the reference solution used for its Tier-1 addition-law
|
|
# theorem; scalar-mul backends stay opaque — upstream Aeneas cannot
|
|
# translate them; they are modeled/axiomatized in
|
|
# gen/CurveField/FunsExternal.lean OUTSIDE every certificate's cone.
|
|
# decompress IS extracted since the phase-2 full lift — the source's
|
|
# step_2 uses the documented negate-then-conditional-assign rewrite).
|
|
#
|
|
# Rust --charon--> CurveField.llbc --aeneas--> gen/CurveField/*.lean
|
|
#
|
|
# The hand-written gen/CurveField/{TypesExternal,FunsExternal}.lean are NOT
|
|
# touched by regeneration (Aeneas only rewrites the *_Template variants).
|
|
# After regenerating, diff the templates against the hand-written files:
|
|
# diff gen/CurveField/FunsExternal_Template.lean gen/CurveField/FunsExternal.lean
|
|
#
|
|
# Usage: ./extract.sh
|
|
set -euo pipefail
|
|
|
|
source ~/aeneas-toolchain/env.sh
|
|
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
CRATE=~/GitClone/FormalVerification/sources/anza-cryptography-source/curve25519/solana-ed25519
|
|
|
|
echo "[1/2] charon: Rust -> LLBC (field + curve_models + edwards + scalar + verify [MERGED GEN])"
|
|
cd "$CRATE"
|
|
# Pin the serial backend: the AVX2 dispatch arm compiles out, so backend
|
|
# selection extracts as the real constant Serial (no dispatch axiom).
|
|
export RUSTFLAGS='--cfg curve25519_serial_only'
|
|
cargo clean -p solana-ed25519 2>/dev/null || true
|
|
charon cargo --preset=aeneas \
|
|
--start-from crate::field \
|
|
--start-from crate::backend::serial::u64::field \
|
|
--start-from crate::backend::serial::curve_models \
|
|
--start-from crate::edwards \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::add' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::sub' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::mul' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::square' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::montgomery_mul' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::montgomery_square' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::montgomery_reduce' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::montgomery_invert' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::as_montgomery' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::from_montgomery' \
|
|
--start-from 'crate::backend::serial::u64::scalar::_::from_bytes_wide' \
|
|
--start-from 'crate::scalar::_::from_bytes_mod_order' \
|
|
--start-from 'crate::scalar::_::from_bytes_mod_order_wide' \
|
|
--start-from 'crate::ed_sigs::verification_key::_::verify_sha512' \
|
|
--opaque 'crate::ed_sigs::sha512_hash3' \
|
|
--opaque 'ed25519' \
|
|
--opaque 'crate::field::_::internal_invert_batch' \
|
|
--opaque 'crate::backend::serial::scalar_mul::variable_base' \
|
|
--opaque 'crate::backend::serial::scalar_mul::vartime_triple_base' \
|
|
--opaque 'crate::scalar::_::non_adjacent_form_128' \
|
|
--opaque 'crate::backend::serial::scalar_mul::straus' \
|
|
--opaque 'crate::backend::serial::scalar_mul::precomputed_straus' \
|
|
--opaque 'crate::backend::serial::scalar_mul::pippenger' \
|
|
--opaque 'crate::backend::vector' \
|
|
--opaque 'crate::backend::scalar_fits_in_128_bits' \
|
|
--opaque 'crate::edwards::_::sum' \
|
|
--opaque 'crate::edwards::_::from_slice' \
|
|
--dest-file "$HERE/CurveField.llbc" \
|
|
-- --no-default-features
|
|
|
|
echo "[2/2] aeneas: LLBC -> Lean (split files, CurveField.* modules)"
|
|
cd "$HERE"
|
|
aeneas -backend lean -split-files -subdir CurveField -dest gen CurveField.llbc
|
|
|
|
echo "Done. Now run ./check.sh to type-check the regenerated model."
|