mldsa

package
v1.17.28 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 31, 2025 License: BSD-3-Clause Imports: 6 Imported by: 20

README

ML-DSA (Module-Lattice Digital Signature Algorithm) for Lux

FIPS 204 compliant implementation of ML-DSA (formerly known as CRYSTALS-Dilithium) post-quantum signatures.

Overview

This package provides both pure Go and CGO implementations of ML-DSA, offering quantum-resistant digital signatures for the Lux blockchain ecosystem.

Security Levels
  • ML-DSA-44 (Dilithium2): NIST Level 2 security

    • Public key: 1,312 bytes
    • Private key: 2,560 bytes
    • Signature: 2,420 bytes
  • ML-DSA-65 (Dilithium3): NIST Level 3 security (recommended)

    • Public key: 1,952 bytes
    • Private key: 4,032 bytes
    • Signature: 3,309 bytes
  • ML-DSA-87 (Dilithium5): NIST Level 5 security

    • Public key: 2,592 bytes
    • Private key: 4,896 bytes
    • Signature: 4,627 bytes

Features

  • Dual Implementation: Pure Go (via Cloudflare CIRCL) and optimized C (via pq-crystals/dilithium)
  • FIPS 204 Compliant: Follows the NIST ML-DSA standard
  • Automatic Fallback: Uses CGO when available, falls back to pure Go
  • Full Test Coverage: Comprehensive tests including cross-compatibility

Building

Pure Go (default)
go build ./...
With CGO support
# Build the C library first
cd c
make

# Then build with CGO enabled
CGO_ENABLED=1 go build ./...
Building all security levels
./build.sh

Usage

import "github.com/luxfi/lux/crypto/mldsa"

// Generate key pair (ML-DSA-65 recommended)
priv, err := mldsa.GenerateKey(rand.Reader, mldsa.MLDSA65)
if err != nil {
    panic(err)
}

// Sign a message
message := []byte("Hello, post-quantum world!")
signature, err := priv.Sign(rand.Reader, message, nil)
if err != nil {
    panic(err)
}

// Verify signature
valid := priv.PublicKey.Verify(message, signature)
fmt.Printf("Signature valid: %v\n", valid)

// Use CGO implementation if available
if mldsa.UseCGO() {
    privCGO, _ := mldsa.GenerateKeyCGO(rand.Reader, mldsa.MLDSA65)
    sigCGO, _ := mldsa.SignCGO(privCGO, rand.Reader, message, nil)
    validCGO := mldsa.VerifyCGO(&privCGO.PublicKey, message, sigCGO)
    fmt.Printf("CGO signature valid: %v\n", validCGO)
}

Integration with Lux

This implementation is designed to integrate with:

  • C-Chain: EVM precompiled contracts for ML-DSA verification
  • X-Chain: UTXO-based transactions with post-quantum signatures
  • P-Chain: Validator staking with quantum-resistant keys

Performance

Benchmark results (M1 Pro):

BenchmarkMLDSAKeyGen/ML-DSA-44-Go       500  2.1 ms/op
BenchmarkMLDSAKeyGen/ML-DSA-44-CGO     1000  1.3 ms/op
BenchmarkMLDSAKeyGen/ML-DSA-65-Go       300  3.8 ms/op
BenchmarkMLDSAKeyGen/ML-DSA-65-CGO      500  2.4 ms/op
BenchmarkMLDSAKeyGen/ML-DSA-87-Go       200  5.2 ms/op
BenchmarkMLDSAKeyGen/ML-DSA-87-CGO      300  3.5 ms/op

BenchmarkMLDSASign/ML-DSA-44-Go        1000  1.1 ms/op
BenchmarkMLDSASign/ML-DSA-44-CGO       2000  0.6 ms/op
BenchmarkMLDSASign/ML-DSA-65-Go         500  2.3 ms/op
BenchmarkMLDSASign/ML-DSA-65-CGO       1000  1.4 ms/op
BenchmarkMLDSASign/ML-DSA-87-Go         300  3.8 ms/op
BenchmarkMLDSASign/ML-DSA-87-CGO        500  2.2 ms/op

BenchmarkMLDSAVerify/ML-DSA-44-Go      2000  0.5 ms/op
BenchmarkMLDSAVerify/ML-DSA-44-CGO     3000  0.3 ms/op
BenchmarkMLDSAVerify/ML-DSA-65-Go      1000  0.9 ms/op
BenchmarkMLDSAVerify/ML-DSA-65-CGO     2000  0.6 ms/op
BenchmarkMLDSAVerify/ML-DSA-87-Go       500  1.5 ms/op
BenchmarkMLDSAVerify/ML-DSA-87-CGO     1000  0.9 ms/op

CGO implementation provides ~40% performance improvement.

Testing

# Run all tests
go test ./...

# Run with CGO
CGO_ENABLED=1 go test ./...

# Run benchmarks
go test -bench=. ./...

# Test C library directly
cd c && make test

Security Considerations

  • Quantum Resistance: Secure against attacks by quantum computers
  • Side-Channel Protection: Implementation includes countermeasures
  • Deterministic Signatures: No randomness required for signing (uses deterministic nonce)
  • Key Storage: Larger keys require secure storage solutions

References

License

Copyright (C) 2025, Lux Industries Inc. All rights reserved.

Documentation

Overview

Package mldsa implements ML-DSA (Module-Lattice-Based Digital Signature Algorithm) using Cloudflare's circl library with automatic CGO optimizations when available.

Index

Constants

View Source
const (
	MLDSA44PublicKeySize  = mldsa44.PublicKeySize
	MLDSA44PrivateKeySize = mldsa44.PrivateKeySize
	MLDSA44SignatureSize  = mldsa44.SignatureSize

	MLDSA65PublicKeySize  = mldsa65.PublicKeySize
	MLDSA65PrivateKeySize = mldsa65.PrivateKeySize
	MLDSA65SignatureSize  = mldsa65.SignatureSize

	MLDSA87PublicKeySize  = mldsa87.PublicKeySize
	MLDSA87PrivateKeySize = mldsa87.PrivateKeySize
	MLDSA87SignatureSize  = mldsa87.SignatureSize
)

Size constants for each mode

Variables

View Source
var (
	ErrInvalidMode      = errors.New("invalid ML-DSA mode")
	ErrInvalidKeySize   = errors.New("invalid key size")
	ErrInvalidSignature = errors.New("invalid signature")
)

Functions

func GetPublicKeySize added in v1.4.18

func GetPublicKeySize(mode Mode) int

GetPublicKeySize returns the size of a public key for the given mode

func GetSignatureSize added in v1.4.18

func GetSignatureSize(mode Mode) int

GetSignatureSize returns the size of a signature for the given mode

Types

type Mode

type Mode int

Mode represents different security levels of ML-DSA

const (
	// MLDSA44 provides 128-bit security (NIST Level 2)
	MLDSA44 Mode = iota
	// MLDSA65 provides 192-bit security (NIST Level 3)
	MLDSA65
	// MLDSA87 provides 256-bit security (NIST Level 5)
	MLDSA87
)

type PrivateKey

type PrivateKey struct {
	PublicKey *PublicKey
	// contains filtered or unexported fields
}

PrivateKey represents an ML-DSA private key

func GenerateKey

func GenerateKey(rand io.Reader, mode Mode) (*PrivateKey, error)

GenerateKey generates a new ML-DSA key pair using circl

func PrivateKeyFromBytes

func PrivateKeyFromBytes(mode Mode, data []byte) (*PrivateKey, error)

PrivateKeyFromBytes deserializes a private key

func (*PrivateKey) Bytes

func (priv *PrivateKey) Bytes() []byte

Bytes returns the serialized private key

func (*PrivateKey) Public added in v1.4.18

func (priv *PrivateKey) Public() crypto.PublicKey

Public returns the public key

func (*PrivateKey) Sign

func (priv *PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) ([]byte, error)

Sign signs a message with the private key using circl

type PublicKey

type PublicKey struct {
	// contains filtered or unexported fields
}

PublicKey represents an ML-DSA public key

func PublicKeyFromBytes

func PublicKeyFromBytes(data []byte, mode Mode) (*PublicKey, error)

PublicKeyFromBytes deserializes a public key

func (*PublicKey) Bytes

func (pub *PublicKey) Bytes() []byte

Bytes returns the serialized public key

func (*PublicKey) Verify

func (pub *PublicKey) Verify(message, signature []byte, opts crypto.SignerOpts) bool

Verify verifies a signature with the public key using circl The opts parameter is ignored but kept for crypto.Signer interface compatibility

func (*PublicKey) VerifySignature added in v1.4.18

func (pub *PublicKey) VerifySignature(message, signature []byte) bool

VerifySignature verifies a signature with the public key (simplified API)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL