Skip to content

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-SHA256 by 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 via sc.perf.warmup)
    • Measurement iterations: 10 (configurable via sc.perf.measurements)
  • 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

  1. Composite Key Generation: Two composite keys are generated (oldKid and newKid) with the same algorithm combination
  2. Warm-up Loop: Multiple re-encryption operations stabilize JIT and memory
  3. Measurement Loop: Metrics collected per iteration for re-encryption operation
  4. Validation: Decrypted result verified against original input

🔐 Re-encryption Process

Re-encryption (atomic decrypt + encrypt):

  1. Decrypt JWE with oldKid (composite key decapsulation)
  2. Extract plaintext (never exposed to caller)
  3. Encrypt plaintext with newKid (composite key encapsulation)
  4. 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


Implementation Details

Test class: SCPerformanceEnhancedCompositeReencryptionTest.java

Location: ankasecure-core-api/src/test/java/co/ankatech/ankasecure/core/controller/

Key dependencies:

  • SecureCoreTestHelper.getValidHybridKemCombinations() - Dynamic combination discovery
  • SecureCoreTestHelper.generateCompositeKey() - Composite key generation
  • SecureCoreController.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