clock-curve-math
High-performance, constant-time, cryptography-grade number theory library for the ClockCurve ecosystem.
π Version 0.6.0 - Feature-Complete Stable Release! Production-ready cryptography foundation with full ecosystem integration, cross-platform support, and comprehensive security guarantees.
Overview
clock-curve-math provides the mathematical foundation for ClockCurve cryptography, implementing:
- Big integer arithmetic with constant-time operations
- Montgomery arithmetic for efficient modular operations
- FieldElement modulo
p = 2^255 - 19(Ed25519 field) - Scalar modulo
l = 2^252 + 27742317777372353535851937790883648493(Ed25519 group order) - Constant-time helpers for secure computations
All operations are designed for cryptographic security with timing attack resistance.
β Version 0.6.0 - Feature-Complete Stable Release
This stable release provides production-ready cryptography with full ecosystem integration:
- β BigInt Operations: Full arithmetic (add, sub, mul, cmp) with constant-time guarantees
- β Montgomery Arithmetic: Complete REDC algorithm with precomputed constants
- β FieldElement Operations: All arithmetic (add, sub, mul, inv, pow, square, neg) modulo p
- β Scalar Operations: All arithmetic (add, sub, mul, inv, pow, square, neg) modulo l
- β Advanced Field Operations: Batch inversion, multi-exponentiation, modular square root, Legendre symbol
- β Constant-Time Helpers: ct_eq, ct_neq, ct_lt, ct_gt, ct_select, ct_swap operations
- β Multiple Backends: Both
bigint-backend(clock-bigint) andcustom-limbsimplementations - β Optional Features: Serde serialization and random generation via clock-rand
- β Security Verified: Comprehensive audit with constant-time verification
- β Cross-Platform: Tested on x86_64, aarch64, riscv64, armv7, powerpc64, embedded targets
- β Production Ready: No unsafe code, comprehensive error handling, input validation
- β Comprehensive Documentation: Tutorials, examples, and API reference complete
- β API Stability Assessment: Complete API review with backward compatibility guarantees
- β Ecosystem Integration: Comprehensive testing with clock-bigint, clock-rand, and serde
- β Cross-Feature Compatibility: All feature flag combinations validated and tested
- β Production Readiness: Security audit preparation and performance benchmarking complete
Features
Backend Options
bigint-backend(default): Useclock-bigintfor optimized performancecustom-limbs: Use custom limb array implementation (fallback)alloc: Heap allocations (required for advanced operations)std: Standard library supportrand: Random generation viaclock-randserde: Serialization support
Installation
Add this to your Cargo.toml:
[]
= "0.6.0"
π¦ Latest Release: v0.6.0 - Feature-Complete Stable Release
π― Version 0.6.0 - Final Release Roadmap
The 0.6.0 release is the first stable version of clock-curve-math, providing:
- API Stability Guarantees: Backward compatibility for the 0.6.x series
- Production Readiness: Comprehensive testing and security validation
- Ecosystem Integration: Seamless integration with ClockCurve components
- Documentation: Complete API reference and integration guides
Release Schedule
- β 0.6.0: Feature-Complete Stable Release (Complete)
Feature Flags
For custom backend:
[]
= { = "0.6.0", = false, = ["custom-limbs", "alloc"] }
Tutorials
Getting Started
This section provides step-by-step guides for common use cases.
1. Basic Field Arithmetic
use ;
// Create field elements from various sources
let a = from_u64;
let b = from_bytes
.expect;
// Perform basic arithmetic
let sum = a.add;
let difference = a.sub;
let product = a.mul;
let square = a.square;
// Check if element is valid (in range [0, p))
assert!;
assert!;
2. Scalar Arithmetic for Digital Signatures
use ;
// Generate a random scalar (private key)
let private_key = from_u64;
// Perform scalar operations used in signature schemes
let k = from_u64; // Random nonce
let r = private_key.mul; // r = private_key * k
let s = k.inv.mul; // s = k^(-1) * r (simplified)
// Convert to bytes for transmission
let signature_bytes = r.to_bytes;
3. Batch Operations for Efficiency
use ;
// When computing many inverses, use batch inversion for better performance
let elements = vec!;
let inverses = batch_inverse.expect;
// Verify: element[i] * inverse[i] β‘ 1 mod p
for in elements.iter.zip
4. Multi-Exponentiation for Pairings
use ;
// Multi-exponentiation: gβα΅ΒΉ * gβα΅Β² * ... * gβα΅βΏ
let bases = vec!;
let exponents = vec!;
// Compute β bases[i]^exponents[i]
let result = multi_exp.expect;
5. Backend Selection Guide
For Performance (Default):
[]
= "0.6.0"
For Embedded/No-Std:
[]
= { = "0.6.0", = false, = ["custom-limbs"] }
For Random Generation:
[]
= { = "0.6.0", = ["rand"] }
For Serialization:
[]
= { = "0.6.0", = ["serde"] }
Usage
Basic Arithmetic
use ;
// Create field elements (mod p)
let a = from_u64;
let b = from_u64;
let sum = a.add;
let product = a.mul;
// Create scalars (mod l)
let s1 = from_u64;
let s2 = from_u64;
let scalar_product = s1.mul;
Byte Conversions
use FieldElement;
// From canonical bytes (32 bytes)
let bytes = ;
let fe = from_bytes.expect;
// Back to bytes
let recovered_bytes = fe.to_bytes;
// From u64
let fe_from_int = from_u64;
Serialization with Serde
use ;
use serde_json;
// Serialize to JSON
let element = from_u64;
let json = to_string.unwrap;
println!;
// Deserialize from JSON
let deserialized: FieldElement = from_str.unwrap;
assert_eq!;
Random Generation
use ;
use Xoshiro256Plus;
let mut rng = new;
// Generate random field element in [0, p)
let random_fe = random;
// Generate random non-zero field element in [1, p)
let random_nonzero_fe = random_nonzero;
// Generate random scalar in [0, l)
let random_scalar = random;
// Generate random non-zero scalar in [1, l)
let random_nonzero_scalar = random_nonzero;
Error Handling and Validation
The library provides comprehensive error handling with the [MathError] enum:
use ;
// Byte validation before construction
let bytes = ;
validate_field_bytes.expect;
let element = from_bytes.expect;
// Invalid bytes will return an error
let invalid_bytes = ; // May be >= p
match from_bytes
// Scalars work similarly
let scalar_bytes = ;
let scalar = from_bytes.expect;
No-Std Usage
This crate supports no_std environments with flexible configurations for embedded systems and constrained environments.
Minimal Embedded Configuration
For microcontrollers and kernels with minimal memory:
[]
= { = "0.6.0", = false, = ["custom-limbs"] }
use ;
// All basic operations work without heap allocation
let a = from_u64;
let b = from_u64;
let sum = a.add;
let product = a.mul;
// Scalar operations work similarly
let s1 = from_u64;
let s2 = from_u64;
let scalar_product = s1.mul;
With Heap Allocation
For environments with allocators but no full std:
[]
= { = "0.6.0", = false, = ["alloc", "custom-limbs"] }
use ;
// Basic operations still work
let a = from_u64;
// Advanced operations requiring allocation
let elements = vec!;
let inverses = batch_inverse.unwrap;
Backend Options
custom-limbs: Pure Rust implementation, no external dependencies, full no_stdbigint-backend: High-performance usingclock-bigint(requiresalloc)
Tested Architectures
- Desktop/Server: x86_64, aarch64, riscv64gc, armv7, powerpc64
- Embedded: thumbv7em-none-eabi, thumbv8m.main-none-eabi
- Cross-compilation: All major Rust targets supported
Advanced Operations
Batch Inversion
Efficiently compute the multiplicative inverse of multiple field elements:
use ;
// Batch inversion is more efficient than computing inverses individually
let elements = vec!;
let inverses = batch_inverse.expect;
// Verify: elements[i] * inverses[i] β‘ 1 mod p
for in elements.iter.zip
// Performance: O(n) multiplications + O(1) inversions vs O(n) inversions individually
Multi-Exponentiation
Compute products of multiple bases raised to exponents efficiently:
use ;
// Multi-exponentiation: β bases[i]^exponents[i]
let bases = vec!;
let exponents = vec!;
// Result = 2^10 * 3^20 * 5^30 mod p
let result = multi_exp.expect;
// Uses binary method for efficiency: O(n * max_bit_length) vs O(n * max_bit_lengthΒ²)
Modular Square Root
Compute square roots in the finite field:
use ;
// Check if a number is a quadratic residue
let num = from_u64;
let legendre = legendre_symbol;
// legendre_symbol returns:
// 1 if num is a quadratic residue (has square root)
// -1 if num is not a quadratic residue
// 0 if num β‘ 0 mod p
if legendre == 1
Windowed Multi-Exponentiation
For better performance with large exponents:
use ;
// Windowed multi-exponentiation trades space for time
let bases = vec!;
let exponents = vec!;
// Window size w=4: precomputes tables of size 2^w for each base
let result = multi_exp_windowed.expect;
// Optimal window size is typically 4-6 for cryptographic field sizes
Comprehensive Advanced Operations Reference
| Operation | Function | Purpose | Performance |
|---|---|---|---|
| Batch Inversion | batch_inverse() |
Invert multiple elements efficiently | O(n) vs O(n log p) |
| Batch Inversion (Checked) | batch_inverse_checked() |
Batch inversion with error handling | O(n) vs O(n log p) |
| Small Batch Inversion | batch_inverse_small() |
Optimized for small arrays | O(n) |
| Multi-Exponentiation | multi_exp() |
β bases[i]^exponents[i] | O(n Γ bit_length) |
| Multi-Exponentiation (Checked) | multi_exp_checked() |
Multi-exp with validation | O(n Γ bit_length) |
| Windowed Multi-Exponentiation | multi_exp_windowed() |
Multi-exp with window optimization | O(n Γ bit_length / w) |
| Legendre Symbol | legendre_symbol() |
Quadratic residue test | O(log p) |
| Modular Square Root | sqrt() |
Square root in finite field | O(logΒ³ p) |
When to Use Each Operation
- Use
batch_inverse()when computing many modular inverses simultaneously - Use
multi_exp()for cryptographic protocols like signature verification - Use
sqrt()for operations requiring square roots (e.g., some signature schemes) - Use
legendre_symbol()to test if elements are quadratic residues - Use windowed variants when exponents are large (>256 bits)
Architecture
clock-curve-math
βββ ct/ # Constant-time operations and verification
βββ bigint/ # Big integer arithmetic
βββ montgomery/ # Montgomery reduction
βββ field/ # FieldElement (mod p)
βββ scalar/ # Scalar (mod l)
βββ validation.rs # Input validation functions
βββ error.rs # Error handling and MathError enum
βββ constants.rs # Mathematical constants
Constant-Time Guarantees
All cryptographic operations execute in constant time regardless of input values:
- Comparisons use bitwise operations, not branches
- Conditional operations use masking, not
if/else - Loop iterations are fixed, not data-dependent
- All arithmetic avoids secret-dependent branches
Montgomery Arithmetic
The library uses Montgomery form internally for efficient modular multiplication:
// Values are stored in Montgomery representation
let a = from_u64; // Automatically converted to Montgomery form
let b = from_u64;
let product = a.mul; // Montgomery multiplication
Mathematical Constants
Field Modulus (p)
p = 2^255 - 19
= 57896044618658097711785492504343953926634992332820282019728792003956564819949
Scalar Modulus (l)
l = 2^252 + 27742317777372353535851937790883648493
= 7237005577332262213973186563042994240857116359379907606001950938285454250989
Security Considerations
See SECURITY.md for comprehensive security documentation including:
- Constant-Time Guarantees: All operations execute in constant time
- Threat Model: Attack vectors and mitigation strategies
- Input Validation: Comprehensive validation prevents invalid states
- Memory Safety: No unsafe code, Rust's safety guarantees maintained
- Security Testing: Constant-time verification and vulnerability scanning
- Hardening Measures: Build and runtime security features
Constant-Time Verification Tools
For rigorous constant-time verification, use the included SageMath-based analysis tool:
# Setup the verification environment
# Run constant-time verification
This tool performs statistical analysis using SageMath to detect timing variations that could indicate side-channel vulnerabilities. Results are saved to constant_time_analysis.json with detailed statistical metrics including confidence intervals, distribution normality tests, and coefficient of variation analysis.
Testing
Run the full test suite:
Run with different backends:
# Default backend
# Custom limbs backend
Test Coverage
- 160+ comprehensive tests covering all functionality including advanced operations
- Unit tests for all arithmetic operations (add, sub, mul, square, neg, inv, pow)
- Advanced operation tests for batch inversion, multi-exponentiation, square root, Legendre symbol
- Property-based tests with randomized inputs verifying algebraic properties
- Edge case testing (zero, one, boundary values, large numbers, invalid inputs)
- Constant-time verification tests ensuring timing attack resistance
- Backend compatibility testing across different feature configurations
- Error handling validation for all public APIs
- Cross-platform testing for x86_64, aarch64, riscv64, armv7, powerpc64, embedded targets
Benchmarks
Run performance benchmarks:
Benchmarks cover:
- Arithmetic operations (add, multiply, etc.)
- Montgomery reduction
- Modular exponentiation
- Constant-time verification
API Reference
Complete API documentation is available at docs.rs/clock-curve-math.
Core Types
| Type | Purpose | Documentation |
|---|---|---|
[FieldElement] |
Finite field arithmetic modulo p | FieldElement docs |
[Scalar] |
Scalar arithmetic modulo l | Scalar docs |
[BigInt] |
Big integer arithmetic | BigInt docs |
Traits
| Trait | Purpose | Documentation |
|---|---|---|
[FieldOps] |
Field element operations | FieldOps docs |
[ScalarOps] |
Scalar operations | ScalarOps docs |
[BigIntOps] |
Big integer operations | BigIntOps docs |
Advanced Operations
| Module | Purpose | Documentation |
|---|---|---|
field::advanced |
Batch operations, multi-exp, square root | Advanced Field docs |
ct |
Constant-time helpers | CT helpers docs |
montgomery |
Montgomery arithmetic | Montgomery docs |
validation |
Input validation | Validation docs |
Error Handling
| Type | Purpose | Documentation |
|---|---|---|
[MathError] |
Cryptographic math errors | MathError docs |
For local API documentation generation:
Ecosystem Integration
clock-curve-math integrates seamlessly with the ClockIn ecosystem:
Core Dependencies
clock-bigint: High-performance BigInt backend (default)clock-rand: Cryptographic random number generation (randfeature)
Optional Integration
serde: JSON/binary serialization support- Cross-platform: Tested on x86_64, aarch64, riscv64, armv7, powerpc64
Integration Testing
Comprehensive ecosystem tests ensure compatibility:
For detailed integration guides, see:
- ECOSYSTEM_INTEGRATION.md - Complete integration guide
- API_STABILITY_ASSESSMENT.md - API stability guarantees
- BACKWARD_COMPATIBILITY_GUARANTEES.md - Compatibility promises
Contributing
- Follow the SPEC.md specification
- Ensure constant-time properties are maintained
- Add comprehensive tests for new functionality
- Update documentation for API changes
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
at your option.
Changelog
See CHANGELOG.md for detailed release notes and version history.