ANKASecure Composite Re-encryption Micro-Benchmark
Overview
This document describes the methodology, scope, and results of the SecureCore Composite Re-encryption Micro-Benchmark, a performance test suite that evaluates the cryptographic efficiency of COMPOSITE_KEM_COMBINE composite key re-encryption operations in the AnkaSecure platform.
The benchmark measures re-encryption (decrypt-then-encrypt) throughput using JWE General JSON Serialization (RFC 7516) for hybrid composite keys that combine classical and post-quantum Key Encapsulation Mechanisms (KEMs). Metrics include wall-clock time, thread CPU time, and heap deltas, providing reproducible evidence of the platform's ability to perform quantum-resistant key rotation with acceptable performance overhead.
Scope
-
Operations:
- Decrypt existing JWE General JSON Serialization token with old composite key
- Encrypt decrypted plaintext with new composite key (same algorithm combination), producing new JWE General JSON token
-
Composite Mode: COMPOSITE_KEM_COMBINE
- Combines classical KEM with post-quantum KEM
- Current construction: the key's KDF token (
HKDF-SHA256by default) instantiates the NIST SP 800-227 §4.6.1 key combiner; the recorded runs predate it (see the note under How It Works) - Security level difference constraint: ≤ 2 steps
- Only RECOMMENDED algorithms with
allowedInComposite=true
-
Algorithms Tested: 20 valid combinations discovered dynamically from the algorithm catalog:
- Classical KEMs: X25519, X448, P-256, P-384, P-521
- PQC KEMs: ML-KEM-512, ML-KEM-768, ML-KEM-1024, HQC-128, HQC-192, HQC-256
-
Payload Sizes: 1 KiB, 5 KiB, 10 KiB, 50 KiB, 100 KiB, 500 KiB, 1 MiB, 5 MiB
-
Iteration Strategy:
- Warm-up iterations:
5(configurable viasc.perf.warmup) - Measurement iterations:
10(configurable viasc.perf.measurements)
- Warm-up iterations:
-
Total Measurements: 160 (20 combinations × 8 payload sizes)
Algorithm Taxonomy
Classical KEMs (5 algorithms)
Elliptic Curve Diffie-Hellman (ECDH):
- X25519 (Curve25519, security level 2)
- X448 (Curve448, security level 3)
- P-256 (NIST P-256/secp256r1, security level 2)
- P-384 (NIST P-384/secp384r1, security level 3)
- P-521 (NIST P-521/secp521r1, security level 4)
Post-Quantum KEMs (6 algorithms)
ML-KEM (NIST FIPS 203):
- ML-KEM-512 (security level 1)
- ML-KEM-768 (security level 3)
- ML-KEM-1024 (security level 5)
HQC (Hamming Quasi-Cyclic):
- HQC-128 (security level 1)
- HQC-192 (security level 3)
- HQC-256 (security level 5)
Measured on the earlier composite construction
The timings on this page were recorded on 2026-01-18, on the composite construction that preceded the current key combiner: one random content key was wrapped under each component. The steps under How It Works describe the current construction (two real KEMs and the NIST SP 800-227 key combiner), which moves the per-operation cost and the size of each encrypted_key. On that build an HQC-192 or HQC-256 key also carried HQC-128 material, so the HQC-192 and HQC-256 rows measure the HQC-128 parameter set. Re-run the benchmark before quoting a composite figure.
How It Works
🔁 Iteration Process
- Composite Key Generation: Two composite keys are generated (oldKid and newKid) with the same algorithm combination
- Warm-up Loop: Multiple re-encryption operations stabilize JIT and memory
- Measurement Loop: Metrics collected per iteration for re-encryption operation
- Validation: Decrypted result verified against original input
🔐 Re-encryption Process
Re-encryption (atomic decrypt + encrypt):
- Decrypt JWE with oldKid (composite key decapsulation)
- Extract plaintext (never exposed to caller)
- Encrypt plaintext with newKid (composite key encapsulation)
- Return new JWE General JSON token
This is a zero-knowledge operation - the plaintext is never returned to the caller, ensuring secure key rotation.
Metrics Reported
| Metric | Description | Units |
|---|---|---|
| CLASSICAL | Classical algorithm name | String |
| PQC | Post-quantum algorithm name | String |
| BYTES | Payload size in bytes | Integer |
| REENC | Median wall-clock time for re-encryption | Milliseconds |
| CPU-R | Median thread CPU time for re-encryption | Milliseconds |
| MEM-R | Median heap delta for re-encryption | Kibibytes |
Execution Notes
- Re-encryption uses atomic decrypt+encrypt internally (plaintext never exposed)
- Results are exported as a CSV file:
benchmark_composite_reenc_20260118_171433.csv - Each combination uses two keys (oldKid, newKid) with same algorithm combination
- Thread CPU-time measurement required; test skipped if unavailable
Complete Results
CLASSICAL | PQC | BYTES | REENC | CPU-R | MEM-R
----------+-------------+-----------+----------+----------+---------
P-256 | HQC-128 | 1.024 | 32 | 31 | 0
P-256 | HQC-128 | 5.120 | 29 | 31 | 0
P-256 | HQC-128 | 10.240 | 29 | 31 | 0
P-256 | HQC-128 | 51.200 | 31 | 31 | 0
P-256 | HQC-128 | 102.400 | 32 | 31 | 0
P-256 | HQC-128 | 512.000 | 52 | 62 | 8.192
P-256 | HQC-128 | 1.048.576 | 78 | 78 | 24.576
P-256 | HQC-128 | 5.242.880 | 251 | 234 | 46.614
P-256 | HQC-192 | 1.024 | 31 | 31 | 0
P-256 | HQC-192 | 5.120 | 31 | 31 | 0
P-256 | HQC-192 | 10.240 | 31 | 31 | 0
P-256 | HQC-192 | 51.200 | 31 | 31 | 0
P-256 | HQC-192 | 102.400 | 33 | 31 | 0
P-256 | HQC-192 | 512.000 | 48 | 46 | 8.192
P-256 | HQC-192 | 1.048.576 | 67 | 70 | 24.576
P-256 | HQC-192 | 5.242.880 | 230 | 226 | 62.976
P-256 | ML-KEM-768 | 1.024 | 24 | 31 | 0
P-256 | ML-KEM-768 | 5.120 | 25 | 15 | 0
P-256 | ML-KEM-768 | 10.240 | 21 | 15 | 0
P-256 | ML-KEM-768 | 51.200 | 24 | 23 | 0
P-256 | ML-KEM-768 | 102.400 | 23 | 15 | 0
P-256 | ML-KEM-768 | 512.000 | 38 | 46 | 8.192
P-256 | ML-KEM-768 | 1.048.576 | 59 | 54 | 24.576
P-256 | ML-KEM-768 | 5.242.880 | 216 | 218 | 84.815
P-384 | HQC-128 | 1.024 | 28 | 31 | 0
P-384 | HQC-128 | 5.120 | 28 | 31 | 0
P-384 | HQC-128 | 10.240 | 30 | 31 | 0
P-384 | HQC-128 | 51.200 | 31 | 31 | 0
P-384 | HQC-128 | 102.400 | 31 | 31 | 0
P-384 | HQC-128 | 512.000 | 46 | 46 | 8.192
P-384 | HQC-128 | 1.048.576 | 61 | 62 | 16.384
P-384 | HQC-128 | 5.242.880 | 233 | 218 | 34.198
P-384 | HQC-192 | 1.024 | 32 | 31 | 0
P-384 | HQC-192 | 5.120 | 32 | 31 | 0
P-384 | HQC-192 | 10.240 | 34 | 31 | 0
P-384 | HQC-192 | 51.200 | 34 | 31 | 0
P-384 | HQC-192 | 102.400 | 35 | 31 | 0
P-384 | HQC-192 | 512.000 | 49 | 46 | 8.192
P-384 | HQC-192 | 1.048.576 | 68 | 78 | 16.384
P-384 | HQC-192 | 5.242.880 | 222 | 210 | 169.291
P-384 | HQC-256 | 1.024 | 27 | 31 | 0
P-384 | HQC-256 | 5.120 | 29 | 31 | 0
P-384 | HQC-256 | 10.240 | 29 | 31 | 0
P-384 | HQC-256 | 51.200 | 32 | 31 | 0
P-384 | HQC-256 | 102.400 | 34 | 31 | 0
P-384 | HQC-256 | 512.000 | 46 | 46 | 8.192
P-384 | HQC-256 | 1.048.576 | 69 | 62 | 16.384
P-384 | HQC-256 | 5.242.880 | 225 | 218 | 34.199
P-384 | ML-KEM-1024 | 1.024 | 18 | 15 | 0
P-384 | ML-KEM-1024 | 5.120 | 18 | 15 | 0
P-384 | ML-KEM-1024 | 10.240 | 18 | 15 | 0
P-384 | ML-KEM-1024 | 51.200 | 22 | 15 | 0
P-384 | ML-KEM-1024 | 102.400 | 22 | 15 | 0
P-384 | ML-KEM-1024 | 512.000 | 35 | 31 | 8.192
P-384 | ML-KEM-1024 | 1.048.576 | 56 | 62 | 16.384
P-384 | ML-KEM-1024 | 5.242.880 | 217 | 195 | 38.538
P-384 | ML-KEM-768 | 1.024 | 17 | 15 | 0
P-384 | ML-KEM-768 | 5.120 | 17 | 15 | 0
P-384 | ML-KEM-768 | 10.240 | 18 | 15 | 0
P-384 | ML-KEM-768 | 51.200 | 19 | 15 | 0
P-384 | ML-KEM-768 | 102.400 | 22 | 15 | 0
P-384 | ML-KEM-768 | 512.000 | 38 | 46 | 8.192
P-384 | ML-KEM-768 | 1.048.576 | 54 | 46 | 16.384
P-384 | ML-KEM-768 | 5.242.880 | 210 | 203 | 42.501
P-521 | HQC-192 | 1.024 | 30 | 31 | 0
P-521 | HQC-192 | 5.120 | 29 | 31 | 0
P-521 | HQC-192 | 10.240 | 27 | 31 | 0
P-521 | HQC-192 | 51.200 | 31 | 31 | 0
P-521 | HQC-192 | 102.400 | 32 | 31 | 0
P-521 | HQC-192 | 512.000 | 48 | 46 | 8.192
P-521 | HQC-192 | 1.048.576 | 68 | 62 | 24.576
P-521 | HQC-192 | 5.242.880 | 237 | 234 | 150.281
P-521 | HQC-256 | 1.024 | 29 | 31 | 0
P-521 | HQC-256 | 5.120 | 29 | 23 | 0
P-521 | HQC-256 | 10.240 | 30 | 31 | 0
P-521 | HQC-256 | 51.200 | 28 | 31 | 0
P-521 | HQC-256 | 102.400 | 33 | 31 | 0
P-521 | HQC-256 | 512.000 | 45 | 46 | 8.192
P-521 | HQC-256 | 1.048.576 | 63 | 54 | 24.576
P-521 | HQC-256 | 5.242.880 | 226 | 210 | 169.344
P-521 | ML-KEM-1024 | 1.024 | 18 | 15 | 0
P-521 | ML-KEM-1024 | 5.120 | 18 | 15 | 0
P-521 | ML-KEM-1024 | 10.240 | 18 | 15 | 0
P-521 | ML-KEM-1024 | 51.200 | 21 | 15 | 0
P-521 | ML-KEM-1024 | 102.400 | 21 | 15 | 0
P-521 | ML-KEM-1024 | 512.000 | 38 | 31 | 8.192
P-521 | ML-KEM-1024 | 1.048.576 | 51 | 46 | 24.576
P-521 | ML-KEM-1024 | 5.242.880 | 204 | 203 | 101.386
P-521 | ML-KEM-768 | 1.024 | 18 | 15 | 0
P-521 | ML-KEM-768 | 5.120 | 17 | 15 | 0
P-521 | ML-KEM-768 | 10.240 | 18 | 15 | 0
P-521 | ML-KEM-768 | 51.200 | 17 | 15 | 0
P-521 | ML-KEM-768 | 102.400 | 20 | 15 | 0
P-521 | ML-KEM-768 | 512.000 | 38 | 38 | 8.192
P-521 | ML-KEM-768 | 1.048.576 | 55 | 62 | 24.576
P-521 | ML-KEM-768 | 5.242.880 | 225 | 218 | 33.427
X25519 | HQC-128 | 1.024 | 23 | 15 | 0
X25519 | HQC-128 | 5.120 | 24 | 31 | 0
X25519 | HQC-128 | 10.240 | 22 | 15 | 0
X25519 | HQC-128 | 51.200 | 23 | 15 | 0
X25519 | HQC-128 | 102.400 | 26 | 31 | 0
X25519 | HQC-128 | 512.000 | 42 | 38 | 8.192
X25519 | HQC-128 | 1.048.576 | 57 | 62 | 16.384
X25519 | HQC-128 | 5.242.880 | 195 | 187 | 45.387
X25519 | HQC-192 | 1.024 | 21 | 23 | 0
X25519 | HQC-192 | 5.120 | 21 | 23 | 0
X25519 | HQC-192 | 10.240 | 23 | 15 | 0
X25519 | HQC-192 | 51.200 | 28 | 31 | 0
X25519 | HQC-192 | 102.400 | 29 | 31 | 0
X25519 | HQC-192 | 512.000 | 44 | 46 | 8.192
X25519 | HQC-192 | 1.048.576 | 63 | 62 | 16.384
X25519 | HQC-192 | 5.242.880 | 206 | 203 | 150.281
X25519 | ML-KEM-768 | 1.024 | 13 | 15 | 0
X25519 | ML-KEM-768 | 5.120 | 14 | 15 | 0
X25519 | ML-KEM-768 | 10.240 | 14 | 15 | 0
X25519 | ML-KEM-768 | 51.200 | 15 | 15 | 0
X25519 | ML-KEM-768 | 102.400 | 15 | 15 | 0
X25519 | ML-KEM-768 | 512.000 | 28 | 31 | 8.192
X25519 | ML-KEM-768 | 1.048.576 | 44 | 46 | 16.384
X25519 | ML-KEM-768 | 5.242.880 | 202 | 195 | 92.999
X448 | HQC-128 | 1.024 | 26 | 31 | 0
X448 | HQC-128 | 5.120 | 27 | 31 | 0
X448 | HQC-128 | 10.240 | 24 | 23 | 0
X448 | HQC-128 | 51.200 | 28 | 31 | 0
X448 | HQC-128 | 102.400 | 27 | 31 | 0
X448 | HQC-128 | 512.000 | 43 | 46 | 8.192
X448 | HQC-128 | 1.048.576 | 60 | 62 | 16.384
X448 | HQC-128 | 5.242.880 | 208 | 195 | 137.994
X448 | HQC-192 | 1.024 | 26 | 15 | 0
X448 | HQC-192 | 5.120 | 28 | 31 | 0
X448 | HQC-192 | 10.240 | 28 | 15 | 0
X448 | HQC-192 | 51.200 | 29 | 31 | 0
X448 | HQC-192 | 102.400 | 30 | 31 | 0
X448 | HQC-192 | 512.000 | 40 | 46 | 8.192
X448 | HQC-192 | 1.048.576 | 63 | 62 | 16.384
X448 | HQC-192 | 5.242.880 | 212 | 203 | 137.994
X448 | HQC-256 | 1.024 | 24 | 23 | 0
X448 | HQC-256 | 5.120 | 24 | 15 | 0
X448 | HQC-256 | 10.240 | 28 | 31 | 0
X448 | HQC-256 | 51.200 | 30 | 31 | 0
X448 | HQC-256 | 102.400 | 29 | 31 | 0
X448 | HQC-256 | 512.000 | 47 | 46 | 8.192
X448 | HQC-256 | 1.048.576 | 67 | 62 | 16.384
X448 | HQC-256 | 5.242.880 | 212 | 203 | 161.152
X448 | ML-KEM-1024 | 1.024 | 13 | 15 | 0
X448 | ML-KEM-1024 | 5.120 | 12 | 15 | 0
X448 | ML-KEM-1024 | 10.240 | 13 | 15 | 0
X448 | ML-KEM-1024 | 51.200 | 13 | 15 | 0
X448 | ML-KEM-1024 | 102.400 | 16 | 15 | 0
X448 | ML-KEM-1024 | 512.000 | 30 | 31 | 8.192
X448 | ML-KEM-1024 | 1.048.576 | 51 | 46 | 16.384
X448 | ML-KEM-1024 | 5.242.880 | 199 | 195 | 123.027
X448 | ML-KEM-768 | 1.024 | 16 | 15 | 0
X448 | ML-KEM-768 | 5.120 | 15 | 15 | 0
X448 | ML-KEM-768 | 10.240 | 15 | 15 | 0
X448 | ML-KEM-768 | 51.200 | 18 | 15 | 0
X448 | ML-KEM-768 | 102.400 | 20 | 15 | 0
X448 | ML-KEM-768 | 512.000 | 34 | 31 | 8.192
X448 | ML-KEM-768 | 1.048.576 | 53 | 46 | 16.384
X448 | ML-KEM-768 | 5.242.880 | 208 | 203 | 137.993
----------+-------------+-----------+----------+----------+---------
Summary Statistics:
- Total combinations tested: 20
- Total measurements: 160 (20 combinations × 8 payload sizes)
- Total bytes processed: 139,468,800 bytes (~139.5 MB)
- Total re-encryption time: 8,812 ms (~8.8 seconds)
Performance Observations
Based on benchmark results with default settings (5 warm-up, 10 measurement iterations):
✅ Excellent Performance
Composite re-encryption is highly efficient for key rotation scenarios:
- Small payloads (1-10 KiB): 13-34ms typical
- Large payloads (1-5 MiB): 44-251ms typical
- Fastest combination: X25519 + ML-KEM-768 (13-202ms across all payload sizes)
🔍 Algorithm Characteristics
Fastest composite re-encryption:
- X25519 + ML-KEM-768: 13-15ms (small payloads), 44-202ms (large payloads)
- X448 + ML-KEM-768: 15-20ms (small payloads), 53-208ms (large payloads)
- P-384 + ML-KEM-768: 17-22ms (small payloads), 54-210ms (large payloads)
Slower combinations (HQC-based):
- P-256 + HQC-192: 31-33ms (small payloads), 67-230ms (large payloads)
- X448 + HQC-256: 24-30ms (small payloads), 67-212ms (large payloads)
📊 Scalability
- Linear scaling with payload size
- Memory efficiency: Heap deltas proportional to ciphertext size
- CPU utilization: Near-linear with payload size for large payloads
🚀 Production Readiness
Composite re-encryption is production-ready for key rotation scenarios:
- Key rotation: Acceptable latency for rotating encryption keys
- Compliance: Zero-knowledge operation (plaintext never exposed)
- Quantum resistance: Maintains defense-in-depth during key transitions
Related Documentation
- Composite Encryption Performance - COMPOSITE_KEM_COMBINE encryption benchmark
- Reencryption Performance - Single-algorithm re-encryption benchmark
Implementation Details
Test class: SCPerformanceEnhancedCompositeReencryptionTest.java
Location: ankasecure-core-api/src/test/java/co/ankatech/ankasecure/core/controller/
Key dependencies:
SecureCoreTestHelper.getValidHybridKemCombinations()- Dynamic combination discoverySecureCoreTestHelper.generateCompositeKey()- Composite key generationSecureCoreController.reencryptJwe()- Atomic re-encryption operation
Changelog
| Date | Change | Author |
|---|---|---|
| 2026-01-18 | Created composite re-encryption performance benchmark | ANKASecure Performance Team |
| 2026-01-18 | Validated 20 COMPOSITE_KEM_COMBINE combinations | ANKASecure Performance Team |