Files
crypto/rust/lux-crypto-ntt/build.rs
T
Hanzo AI fe5fdbbca5 crypto/rust: add lux-crypto-ntt + lux-crypto-poly_mul bindings
Two new no_std crates wrapping the C-ABI from luxcpp/crypto/ntt and
luxcpp/crypto/poly_mul.

lux-crypto-ntt:
  * forward / inverse — generic-prime NTT (caller-supplied modulus + root)
  * Cyclone-FFT fast path engaged automatically when (modulus, root) ==
    (Q=998244353, PRIMITIVE_ROOT=629671588)
  * 6 spec-vector tests:
      - forward+inverse roundtrip across n in {2,4,...,1024}
      - q97/omega=28 generic-prime roundtrip (matches Go reference)
      - input rejection: empty, non-pow2, modulus=0

lux-crypto-poly_mul:
  * multiply / multiply_into — Z_Q[X]/(X^n+1) negacyclic convolution
  * Pinned to Cyclone-FFT prime (the C-ABI rejects other rings)
  * 4 spec-vector tests including the canonical 10-case KAT table
    (sum/first/last byte-equal to luxfi/crypto/poly_mul Go reference)
    and the (1+2X+3X^2+4X^3)*(5+6X+7X^2+8X^3) hand-written negacyclic case.

build.rs links statically against libntt_cpu.a / libpoly_mul_cpu.a
produced by luxcpp/crypto/ntt and luxcpp/crypto/poly_mul; CRYPTO_BUILD_DIR
or CRYPTO_DIR points at the cmake build / install layout.

Verified: cargo test -p lux-crypto-ntt -p lux-crypto-poly_mul
  6/6 ntt tests PASS, 4/4 poly_mul tests PASS.
2025-12-28 02:53:12 -08:00

35 lines
1019 B
Rust

use std::env;
use std::path::PathBuf;
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let base: PathBuf = if let Ok(d) = env::var("CRYPTO_DIR") {
PathBuf::from(d).join("lib")
} else if let Ok(d) = env::var("CRYPTO_BUILD_DIR") {
PathBuf::from(d)
} else {
manifest_dir
.join("..")
.join("..")
.join("..")
.join("..")
.join("luxcpp")
.join("crypto")
.join("build-cto")
};
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-env-changed=CRYPTO_DIR");
println!("cargo:rerun-if-env-changed=CRYPTO_BUILD_DIR");
let lib_path = base.join("ntt");
println!("cargo:rustc-link-search=native={}", lib_path.display());
println!("cargo:rustc-link-lib=static=ntt_cpu");
if cfg!(target_os = "macos") {
println!("cargo:rustc-link-lib=c++");
} else {
println!("cargo:rustc-link-lib=stdc++");
}
}