mirror of
https://github.com/luxfi/crypto.git
synced 2026-10-30 16:59:13 +00:00
luxfi/crypto becomes the single Go entry point for ALL Lux-family crypto. Every public function in this module now dispatches between three implementations through a runtime-selectable backend: - vanilla: pure-Go reference (always available) - cgo: native binding (blst, libsecp256k1, ckzg) where present - gpu: batch acceleration via github.com/luxfi/accel The dispatcher reads LUX_CRYPTO_BACKEND (auto|vanilla|cgo|gpu); auto picks the most capable backend the binary was compiled and linked with. New canonical packages: backend/ runtime backend selector (env + programmatic) internal/gpuhost/ accel session lifecycle, single per-process keccak/ Keccak-256 with batch GPU dispatch sha256/ SHA-256 with batch GPU dispatch sha3/ SHA3 / SHAKE family ripemd160/ RIPEMD-160 (Bitcoin/Lux address derivation) ed25519/ Ed25519 with batch GPU verify bn254/ canonical alias for bn256 (matches FIPS naming) modexp/ canonical alias for bigmodexp evm256/ EIP-196/197 precompile ABI wrappers poseidon/ Poseidon2 hash via gnark-crypto pedersen/ Pedersen commitments over BN254 ntt/ Number-Theoretic Transform reference polymul/ negacyclic polynomial multiplication Extended existing packages with batch GPU paths: bls/batch.go BatchVerify routes through accel.BLSVerifyBatch mldsa/batch.go BatchVerify (ML-DSA-65) via accel.DilithiumVerifyBatch mlkem/batch.go BatchEncapsulate / BatchDecapsulate via Kyber kernels secp256k1/batch.go BatchVerifySignature via accel.ECDSAVerifyBatch GPU dispatch is gated on (a) backend.Default(), (b) batch size threshold, and (c) accel.Available(). When any gate fails the call falls through to the vanilla CPU path; output is byte-identical. The legacy gpu/ stub is replaced with a thin probe surface (Available, Backend, Devices, Version) that delegates to the same gpuhost session. Tests show vanilla and gpu backends produce identical outputs across all batch entry points (-race clean). See AUDIT.md for the per-algorithm state matrix and honest gaps.
79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package ed25519
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerateSignVerify(t *testing.T) {
|
|
pub, priv, err := GenerateKey(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
msg := []byte("hello")
|
|
sig := Sign(priv, msg)
|
|
if !Verify(pub, msg, sig) {
|
|
t.Fatal("Verify failed for valid signature")
|
|
}
|
|
if Verify(pub, []byte("other"), sig) {
|
|
t.Fatal("Verify accepted wrong message")
|
|
}
|
|
}
|
|
|
|
func TestNewKeyFromSeed(t *testing.T) {
|
|
seed := make([]byte, SeedSize)
|
|
if _, err := rand.Read(seed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
priv1, err := NewKeyFromSeed(seed)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
priv2, err := NewKeyFromSeed(seed)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(priv1, priv2) {
|
|
t.Fatal("seed not deterministic")
|
|
}
|
|
|
|
_, err = NewKeyFromSeed(seed[:31])
|
|
if err == nil {
|
|
t.Fatal("expected error for short seed")
|
|
}
|
|
}
|
|
|
|
func TestBatchVerifyMatchesScalar(t *testing.T) {
|
|
n := BatchThreshold + 4
|
|
pubs := make([]PublicKey, n)
|
|
msgs := make([][]byte, n)
|
|
sigs := make([][]byte, n)
|
|
for i := 0; i < n; i++ {
|
|
pub, priv, err := GenerateKey(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
msgs[i] = []byte{byte(i), byte(i << 1)}
|
|
sigs[i] = Sign(priv, msgs[i])
|
|
pubs[i] = pub
|
|
}
|
|
|
|
got := BatchVerify(pubs, msgs, sigs)
|
|
for i, g := range got {
|
|
if !g {
|
|
t.Errorf("batch[%d] reported invalid", i)
|
|
}
|
|
if Verify(pubs[i], msgs[i], sigs[i]) != g {
|
|
t.Errorf("batch/scalar disagree at %d", i)
|
|
}
|
|
}
|
|
|
|
// Flip one signature byte to ensure we report invalid.
|
|
sigs[0][0] ^= 0xff
|
|
got = BatchVerify(pubs, msgs, sigs)
|
|
if got[0] {
|
|
t.Fatal("batch accepted tampered signature")
|
|
}
|
|
}
|