Skip to content

ANKASecure Composite Streaming Encryption & Decryption Micro-Benchmark

Overview

This document describes the methodology, scope, and results of the SecureCore Composite Streaming Encryption & Decryption Micro-Benchmark, a performance test suite designed to evaluate the cryptographic efficiency of COMPOSITE_KEM_COMBINE composite keys in streaming mode within the AnkaSecure system.

This benchmark systematically measures dual encryption and dual decryption performance for hybrid composite keys that combine classical and post-quantum key encapsulation mechanisms (KEMs) across multiple large payload sizes using streaming I/O. All outputs use JWE General JSON Serialization with streaming encryption, providing empirical evidence of the platform's ability to deliver quantum-resistant encryption with memory-efficient processing for large files.


Objectives

The goals of this benchmark are to:

  • Validate the efficiency and scalability of SecureCore's composite streaming encryption operations for large files.

  • Compare classical and post-quantum KEM combinations in streaming scenarios.

  • Quantify the performance overhead of dual-KEM streaming encryption and decryption.

  • Provide externally auditable evidence of the platform's enterprise-grade quantum-resistant streaming capabilities.


Scope

  • Operations:

    • Dual encryption that produces a JWE General JSON Serialization encrypted payload with two KEK layers (classical + PQC) using streaming I/O
    • Dual decryption by parsing and decrypting both KEM layers against streamed data according to the decryption policy
  • Composite Mode: COMPOSITE_KEM_COMBINE

    • Combines classical KEM with post-quantum KEM
    • Uses dual-layer key encapsulation (both KEMs must decrypt successfully)
    • 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: P-256, P-384, P-521, X25519, X448
    • PQC KEMs: ML-KEM-768, ML-KEM-1024, HQC-128, HQC-192, HQC-256
  • Payload Sizes: 4 input sizes from 5 MiB to 100 MiB:

    • 5 MiB, 10 MiB, 50 MiB, 100 MiB
  • Iteration Strategy:

    • Warm-up iterations: 5 (configurable via sc.perf.warmup)
    • Measurement iterations: 10 (configurable via sc.perf.measurements)
  • Total Measurements: 80 (20 combinations × 4 payload sizes)


Algorithm Taxonomy

Classical Key Encapsulation Mechanisms (5 algorithms)

Elliptic Curve Diffie-Hellman (ECDH) - NIST curves:

  • P-256 (NIST P-256/secp256r1, security level 1)
  • P-384 (NIST P-384/secp384r1, security level 3)
  • P-521 (NIST P-521/secp521r1, security level 5)

Elliptic Curve Diffie-Hellman (ECDH) - Montgomery curves:

  • X25519 (Curve25519, security level 1)
  • X448 (Curve448, security level 3)

Post-Quantum Key Encapsulation Mechanisms (5 algorithms)

ML-KEM (NIST FIPS 203 - Module-Lattice-Based Key Encapsulation Mechanism, formerly Kyber):

  • 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)

Valid Combinations (20 total)

The benchmark dynamically discovers valid combinations using:

  • Security level difference ≤ 2 (e.g., P-256 L1 + HQC-128 L1 ✅, P-256 L1 + ML-KEM-1024 L5 ❌)
  • RECOMMENDED status only
  • Catalog flag: allowedInComposite=true

Example combinations:

  • P-256 + HQC-128 (L1 + L1 = Δ0)
  • P-256 + HQC-192 (L1 + L3 = Δ2)
  • P-256 + ML-KEM-768 (L1 + L3 = Δ2)
  • P-384 + HQC-128 (L3 + L1 = Δ2)
  • P-384 + HQC-192 (L3 + L3 = Δ0)
  • P-384 + HQC-256 (L3 + L5 = Δ2)
  • P-384 + ML-KEM-768 (L3 + L3 = Δ0)
  • P-384 + ML-KEM-1024 (L3 + L5 = Δ2)
  • P-521 + HQC-192 (L5 + L3 = Δ2)
  • P-521 + HQC-256 (L5 + L5 = Δ0)
  • P-521 + ML-KEM-768 (L5 + L3 = Δ2)
  • P-521 + ML-KEM-1024 (L5 + L5 = Δ0)
  • X25519 + HQC-128 (L1 + L1 = Δ0)
  • X25519 + HQC-192 (L1 + L3 = Δ2)
  • X25519 + ML-KEM-768 (L1 + L3 = Δ2)
  • X448 + HQC-128 (L3 + L1 = Δ2)
  • X448 + HQC-192 (L3 + L3 = Δ0)
  • X448 + HQC-256 (L3 + L5 = Δ2)
  • X448 + ML-KEM-768 (L3 + L3 = Δ0)
  • X448 + ML-KEM-1024 (L3 + L5 = Δ2)

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: A fresh composite key is generated with:

    • Mode: COMPOSITE_KEM_COMBINE
    • Decryption Policy: ALL (both KEMs must decrypt successfully)
    • Components: classical KEM (role="classical") + PQC KEM (role="pqc")
    • Standard test parameters: 100K max usage, 365-day expiry
  2. Warm-up Loop: The system runs several stream encrypt/decrypt operations to stabilize JIT compilation and memory allocation

  3. Measurement Loop: The following metrics are collected per iteration:

    • Wall-clock time for streaming encryption and decryption (milliseconds)
    • Thread-level CPU time for streaming encryption and decryption (milliseconds)
    • Heap memory delta during streaming encryption and decryption (KiB)
  4. Validation:

    • The decrypted plaintext must match the original payload
    • The benchmark fails the iteration if decryption returns null or mismatched data

🔐 Composite Streaming Encryption Process

Streaming Encryption (dual KEM encapsulation):

  1. Generate ephemeral classical KEM keypair: (ek_classical, dk_classical) = P-256.generateKEM()
  2. No ephemeral PQC key pair: ML-KEM / HQC encapsulation draws its own randomness
  3. Encapsulate classical shared secret: (ct_classical, ss_classical) = P-256.encapsulate(pk_classical_recipient)
  4. Encapsulate PQC shared secret: (ct_pqc, ss_pqc) = ML_KEM.encapsulate(pk_pqc_recipient)
  5. Derive composite CEK as the combiner's output: cek = KeyCombine(ss_classical, ss_pqc, ct_classical, ct_pqc, pk_classical, pk_pqc, domain)
  6. Initialize AES-GCM stream cipher: cipher = AES-256-GCM.initEncrypt(cek)
  7. Read payload incrementally (chunked streaming):
    • For each chunk: ciphertext_chunk = cipher.update(chunk)
  8. Finalize encryption: (final_chunk, auth_tag) = cipher.doFinal()
  9. Construct JWE General JSON with two KEK layers:
    • KEK 1: classical KEM ciphertext with alg header
    • KEK 2: PQC KEM ciphertext with alg header
  10. Return JWE General JSON Serialization string (streaming ciphertext)

Streaming Decryption (dual KEM decapsulation):

  1. Parse JWE General JSON structure
  2. Extract classical KEM ciphertext: ct_classical = header1.encrypted_key
  3. Extract PQC KEM ciphertext: ct_pqc = header2.encrypted_key
  4. Decapsulate classical shared secret: ss_classical = P-256.decapsulate(ct_classical, sk_classical)
  5. Decapsulate PQC shared secret: ss_pqc = ML_KEM.decapsulate(ct_pqc, sk_pqc)
  6. Derive composite CEK as the combiner's output: cek = KeyCombine(ss_classical, ss_pqc, ct_classical, ct_pqc, pk_classical, pk_pqc, domain)
  7. Initialize AES-GCM stream decipher: decipher = AES-256-GCM.initDecrypt(cek)
  8. Read ciphertext incrementally (chunked streaming):
    • For each chunk: plaintext_chunk = decipher.update(chunk)
  9. Verify authentication tag and finalize: final_chunk = decipher.doFinal(auth_tag)
  10. Return streaming plaintext

🧠 Deterministic RNG

A fixed seed is used in the random number generator (0xC0FFEE_BABEFACE) to ensure reproducible test runs.

📈 Metrics Aggregation

For each metric, the median value across all measurement iterations is recorded, providing robust resistance to outliers.


Metrics Collected

For each combination of (classical_kem, pqc_kem, payload size), the following metrics are measured independently for both encryption and decryption:

Metric Description Units
CLASSICAL Classical KEM name (P-256, P-384, X25519, etc.) String
PQC Post-quantum KEM name (ML-KEM-768, HQC-128, etc.) String
BYTES Payload size in bytes Integer
ENC Median wall-clock time for streaming encryption Milliseconds
DEC Median wall-clock time for streaming decryption Milliseconds
CPU-E Median thread CPU time for streaming encryption Milliseconds
CPU-D Median thread CPU time for streaming decryption Milliseconds
MEM-E Median heap delta for streaming encryption Kibibytes
MEM-D Median heap delta for streaming decryption Kibibytes

Each metric is calculated as the median across the measurement iterations to reduce the influence of transient spikes or system noise.


Execution Notes

  • Composite keys use JWE General JSON Serialization with streaming encryption for memory efficiency

  • The benchmark is implemented using JUnit 5 with @ParameterizedTest

  • All runs are sequential to avoid interference from thread scheduling (enforced via @Execution(SAME_THREAD))

  • Thread CPU-time measurement is required; the test is skipped if unavailable on the system

  • A deterministic RNG (fixed seed) ensures repeatability

  • Results are exported as a CSV file: benchmark_composite_stream_enc_20260118_224018.csv

Streaming overhead notes: Streaming operations process data incrementally without loading entire payloads into memory, providing constant memory footprint regardless of file size. The reported heap delta reflects this memory-efficient design.

Scope of the heap delta. The figure above is a heap measurement and says nothing about disk. The disk-free property — no uploaded part written to a temporary file — is measured separately (512 MiB through -Xmx256m, zero temporary files observed in flight); see Memory & Performance*.


Complete Results

CLASSICAL | PQC         |       BYTES |      ENC |      DEC |    CPU-E |    CPU-D |   MEM-E |   MEM-D
----------+-------------+-------------+----------+----------+----------+----------+---------+---------
P-256     | HQC-128     |   5.242.880 |       80 |       85 |       78 |       78 |  15.607 |  20.518
P-256     | HQC-128     |  10.485.760 |      155 |      157 |      140 |      156 |  48.375 |  53.288
P-256     | HQC-128     |  52.428.800 |      692 |      726 |      671 |      703 | 269.567 | 274.478
P-256     | HQC-128     | 104.857.600 |     1509 |     1507 |     1476 |     1460 | 180.286 | 561.194
P-256     | HQC-192     |   5.242.880 |       90 |       96 |       85 |       93 |  15.607 |  20.519
P-256     | HQC-192     |  10.485.760 |      172 |      170 |      156 |      171 |  48.375 |  53.289
P-256     | HQC-192     |  52.428.800 |      705 |      698 |      679 |      671 | 269.565 | 274.472
P-256     | HQC-192     | 104.857.600 |     1350 |     1364 |     1351 |     1328 | 184.379 | 385.085
P-256     | ML-KEM-768  |   5.242.880 |       89 |       86 |       85 |       78 |  20.480 |  20.505
P-256     | ML-KEM-768  |  10.485.760 |      134 |      135 |      125 |      125 |  46.142 |  53.274
P-256     | ML-KEM-768  |  52.428.800 |      613 |      601 |      593 |      585 | 332.870 | 274.468
P-256     | ML-KEM-768  | 104.857.600 |     1307 |     1307 |     1288 |     1265 | 490.045 | 561.193
P-384     | HQC-128     |   5.242.880 |       82 |       84 |       78 |       78 |  15.628 |  20.518
P-384     | HQC-128     |  10.485.760 |      137 |      141 |      140 |      140 |  48.398 |  53.288
P-384     | HQC-128     |  52.428.800 |      660 |      638 |      640 |      609 | 269.584 | 274.474
P-384     | HQC-128     | 104.857.600 |     1099 |     1158 |     1078 |     1132 | 155.709 | 561.195
P-384     | HQC-192     |   5.242.880 |       71 |       68 |       62 |       62 |  15.628 |  20.521
P-384     | HQC-192     |  10.485.760 |      125 |      126 |      109 |      125 |  48.385 |  53.274
P-384     | HQC-192     |  52.428.800 |      578 |      583 |      570 |      570 | 269.570 | 274.457
P-384     | HQC-192     | 104.857.600 |     1149 |     1073 |     1132 |     1070 | 536.216 | 352.295
P-384     | HQC-256     |   5.242.880 |       64 |       67 |       62 |       62 |  15.614 |  20.504
P-384     | HQC-256     |  10.485.760 |      127 |      131 |      117 |      125 |  48.382 |  53.271
P-384     | HQC-256     |  52.428.800 |      456 |      456 |      437 |      453 | 269.572 | 274.456
P-384     | HQC-256     | 104.857.600 |     1298 |     1292 |     1265 |     1273 | 172.081 | 561.178
P-384     | ML-KEM-1024 |   5.242.880 |       81 |       82 |       78 |       78 |  13.721 |  20.515
P-384     | ML-KEM-1024 |  10.485.760 |      142 |      144 |      140 |      132 |  46.490 |  53.284
P-384     | ML-KEM-1024 |  52.428.800 |      802 |      748 |      765 |      718 | 333.217 | 274.474
P-384     | ML-KEM-1024 | 104.857.600 |     1352 |     1316 |     1328 |     1288 | 669.091 | 561.190
P-384     | ML-KEM-768  |   5.242.880 |       80 |       78 |       78 |       78 |  13.397 |  20.514
P-384     | ML-KEM-768  |  10.485.760 |      133 |      126 |      125 |      125 |  46.165 |  53.284
P-384     | ML-KEM-768  |  52.428.800 |      496 |      488 |      484 |      468 | 332.889 | 274.469
P-384     | ML-KEM-768  | 104.857.600 |     1381 |     1320 |     1351 |     1304 | 490.054 | 561.190
P-521     | HQC-192     |   5.242.880 |       78 |       74 |       70 |       70 |  15.639 |  20.503
P-521     | HQC-192     |  10.485.760 |      135 |      139 |      140 |      132 |  48.407 |  53.271
P-521     | HQC-192     |  52.428.800 |      460 |      444 |      460 |      437 | 269.597 | 274.455
P-521     | HQC-192     | 104.857.600 |     1245 |     1240 |     1218 |     1234 | 184.367 | 561.177
P-521     | HQC-256     |   5.242.880 |       94 |       95 |       93 |       93 |  15.638 |  20.502
P-521     | HQC-256     |  10.485.760 |      179 |      182 |      171 |      171 |  48.407 |  53.270
P-521     | HQC-256     |  52.428.800 |      739 |      714 |      718 |      710 | 269.596 | 274.459
P-521     | HQC-256     | 104.857.600 |     1429 |     1420 |     1374 |     1413 | 159.794 | 561.178
P-521     | ML-KEM-1024 |   5.242.880 |       78 |       82 |       78 |       78 |  13.734 |  20.503
P-521     | ML-KEM-1024 |  10.485.760 |      117 |      117 |      109 |      109 |  46.502 |  53.271
P-521     | ML-KEM-1024 |  52.428.800 |      653 |      602 |      624 |      593 | 333.227 | 274.459
P-521     | ML-KEM-1024 | 104.857.600 |     1215 |     1155 |     1218 |     1148 | 669.103 | 561.178
P-521     | ML-KEM-768  |   5.242.880 |       77 |       74 |       78 |       78 |  13.411 |  20.503
P-521     | ML-KEM-768  |  10.485.760 |      140 |      140 |      132 |      125 |  46.180 |  53.272
P-521     | ML-KEM-768  |  52.428.800 |      531 |      549 |      507 |      546 | 332.905 | 274.457
P-521     | ML-KEM-768  | 104.857.600 |     1242 |     1144 |     1218 |     1124 | 660.583 | 561.175
X25519    | HQC-128     |   5.242.880 |       82 |       83 |       78 |       78 |  15.563 |  20.503
X25519    | HQC-128     |  10.485.760 |      148 |      147 |      140 |      140 |  48.331 |  53.270
X25519    | HQC-128     |  52.428.800 |      698 |      677 |      679 |      663 | 269.521 | 274.457
X25519    | HQC-128     | 104.857.600 |      953 |      951 |      921 |      937 | 167.978 | 561.175
X25519    | HQC-192     |   5.242.880 |       59 |       57 |       46 |       54 |  15.564 |  20.502
X25519    | HQC-192     |  10.485.760 |      104 |      102 |      109 |      109 |  48.333 |  53.271
X25519    | HQC-192     |  52.428.800 |      465 |      459 |      460 |      453 | 269.521 | 274.457
X25519    | HQC-192     | 104.857.600 |      923 |      927 |      921 |      921 | 155.692 | 561.174
X25519    | ML-KEM-768  |   5.242.880 |       94 |       88 |       93 |       78 |  29.720 |  20.502
X25519    | ML-KEM-768  |  10.485.760 |      179 |      175 |      171 |      171 |  70.681 |  53.271
X25519    | ML-KEM-768  |  52.428.800 |      758 |      731 |      750 |      695 | 316.446 | 274.459
X25519    | ML-KEM-768  | 104.857.600 |     1418 |     1315 |     1406 |     1296 | 635.932 | 561.176
X448      | HQC-128     |   5.242.880 |       60 |       59 |       62 |       46 |  15.575 |  20.502
X448      | HQC-128     |  10.485.760 |      101 |       95 |       93 |       93 |  48.343 |  53.272
X448      | HQC-128     |  52.428.800 |      417 |      410 |      421 |      406 | 269.534 | 274.460
X448      | HQC-128     | 104.857.600 |      974 |      996 |      953 |      984 | 163.885 | 561.178
X448      | HQC-192     |   5.242.880 |       62 |       62 |       54 |       62 |  15.575 |  20.502
X448      | HQC-192     |  10.485.760 |      108 |      106 |      109 |      109 |  48.343 |  53.272
X448      | HQC-192     |  52.428.800 |      480 |      511 |      484 |      507 | 269.535 | 274.456
X448      | HQC-192     | 104.857.600 |      902 |      920 |      890 |      913 | 163.880 | 561.176
X448      | HQC-256     |   5.242.880 |       60 |       58 |       62 |       54 |  15.575 |  20.503
X448      | HQC-256     |  10.485.760 |      126 |      127 |      117 |      125 |  48.343 |  53.272
X448      | HQC-256     |  52.428.800 |      583 |      579 |      562 |      562 | 269.535 | 274.459
X448      | HQC-256     | 104.857.600 |     1356 |     1389 |     1328 |     1374 | 163.888 | 561.177
X448      | ML-KEM-1024 |   5.242.880 |       77 |       72 |       78 |       62 |  13.670 |  20.502
X448      | ML-KEM-1024 |  10.485.760 |      139 |      138 |      125 |      125 |  46.437 |  53.272
X448      | ML-KEM-1024 |  52.428.800 |      607 |      591 |      593 |      562 | 333.165 | 274.458
X448      | ML-KEM-1024 | 104.857.600 |      936 |      900 |      937 |      898 | 669.032 | 561.178
X448      | ML-KEM-768  |   5.242.880 |       54 |       51 |       62 |       46 |  29.731 |  20.503
X448      | ML-KEM-768  |  10.485.760 |       97 |       94 |       93 |       93 |  46.115 |  53.271
X448      | ML-KEM-768  |  52.428.800 |      553 |      554 |      546 |      538 | 332.842 | 274.458
X448      | ML-KEM-768  | 104.857.600 |     1294 |     1202 |     1257 |     1156 | 660.522 | 561.177
----------+-------------+-------------+----------+----------+----------+----------+---------+---------

Summary Statistics:

  • Total combinations tested: 20 (5 classical × 5 PQC KEMs, filtered by security level constraints)
  • Total measurements: 80 (20 combinations × 4 payload sizes)
  • Total bytes processed: 3,460,300,800 bytes (~3.46 GB)
  • Total encryption time: 40.488 ms (cumulative across all measurements)
  • Total decryption time: 39.848 ms (cumulative across all measurements)
  • Median streaming encryption time: 306 ms (across all measurements)
  • Median streaming decryption time: 301 ms (across all measurements)

Performance Observations

Based on benchmark results with default settings (5 warm-up, 10 measurement iterations):

✅ Memory-Efficient Streaming

Composite streaming encryption demonstrates excellent memory efficiency:

  • Small payloads (5-10 MiB): Minimal heap delta (~13-70 KiB) regardless of KEM combination
  • Large payloads (50-100 MiB): Predictable heap growth proportional to payload size (~160-670 KiB)
  • Memory safety: Constant memory footprint enables processing of arbitrarily large files

🔍 Algorithm Characteristics

Fastest streaming combinations:

  • X448 + ML-KEM-768: ~54-1294ms (5-100 MiB payloads) for encryption
  • X25519 + HQC-192: ~59-923ms (5-100 MiB payloads) for encryption
  • P-384 + HQC-256: ~64-1298ms (5-100 MiB payloads) for encryption

Performance by KEM family:

  • Montgomery curves (X25519, X448): Consistently fast with minimal heap overhead
  • NIST curves (P-256, P-384, P-521): Balanced performance across all payload sizes
  • ML-KEM combinations: Excellent scalability with moderate memory usage
  • HQC combinations: Competitive performance with larger payloads

📊 Scalability

  • Linear scaling with payload size (dominated by incremental AES-GCM streaming)
  • Memory efficiency: Heap deltas remain sub-linear with payload growth
  • Encryption ≈ Decryption: Performance parity between encryption and decryption operations (~1-2% variance)

🚀 Production Readiness

Composite streaming encryption is production-ready for large file processing:

  • Document encryption: Acceptable latency for payloads up to 100 MiB
  • Large file protection: Suitable for encrypting multi-gigabyte files with constant memory footprint
  • Batch processing: Excellent throughput for processing large volumes of data
  • Quantum resistance: Provides defense-in-depth with minimal streaming overhead

Comparison to Compact Mode Composite Encryption

Operation Compact Mode (P-256 + ML-KEM-768, 1 MiB) Streaming Mode (P-256 + ML-KEM-768, 5 MiB) Delta
Encryption ~47ms ~89ms ~5× larger payload, ~1.9× time (sub-linear!)
Decryption ~43ms ~86ms ~5× larger payload, ~2.0× time (sub-linear!)
Memory (encryption) 8.192 KiB 20.480 KiB ~2.5× more (still efficient)
Memory (decryption) 8.192 KiB 20.505 KiB ~2.5× more (still efficient)

Key insight: Streaming mode provides better scalability for large payloads with acceptable memory overhead.


Comparison to Single-KEM Streaming Encryption

Operation Single KEM (X25519) Composite (X25519 + ML-KEM-768) Overhead
5 MiB encryption ~62ms ~94ms ~1.5×
5 MiB decryption ~58ms ~88ms ~1.5×
50 MiB encryption ~421ms ~758ms ~1.8×
50 MiB decryption ~406ms ~731ms ~1.8×

Key insight: Composite overhead increases slightly with payload size due to dual-KEM processing, but remains acceptable for enterprise use cases requiring quantum resistance.


Test Execution

Running the Benchmark

Default settings (5 warm-up, 10 measurement iterations):

cd ankasecure-core-api
mvn test -Dtest=SCPerformanceEnhancedStreamingCompositeEncryptionTest

Custom iteration counts:

mvn test -Dtest=SCPerformanceEnhancedStreamingCompositeEncryptionTest \
  -Dsc.perf.warmup=10 \
  -Dsc.perf.measurements=20

Expected runtime: ~20-25 minutes with default settings

Output Location

CSV file exported to:

/tmp/sc_bench_<random>/benchmark_composite_stream_enc_YYYYMMDD_HHMMSS.csv

Console output shows ASCII table with all measurements sorted by (CLASSICAL, PQC, BYTES).


CSV Data Format

The exported CSV file contains the following columns:

CLASSICAL,PQC,BYTES,ENC_MS,DEC_MS,CPU_ENC_MS,CPU_DEC_MS,ENC_MEM_KIB,DEC_MEM_KIB
P-256,HQC-128,5242880,80,85,78,78,15607,20518
P-256,HQC-128,10485760,155,157,140,156,48375,53288
...

Use cases:

  • Import into spreadsheet tools (Excel, Google Sheets) for analysis
  • Generate charts and visualizations
  • Statistical analysis (percentiles, distributions)
  • Regression testing (compare across versions)


Implementation Details

Test class: SCPerformanceEnhancedStreamingCompositeEncryptionTest.java

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

Key dependencies:

  • SecureCoreTestHelper.getValidKemCombinations() - Dynamic combination discovery
  • SecureCoreTestHelper.generateCompositeKey() - Composite key generation
  • SecureCoreController.encryptDataStreamAsJwe() - JWE streaming encryption
  • SecureCoreController.decryptDataStreamJwe() - JWE streaming decryption

Thread safety: Single-threaded execution (@Execution(SAME_THREAD))

Lifecycle: Per-class instance (@TestInstance(Lifecycle.PER_CLASS))


Security Considerations

✅ Defense-in-Depth

Composite streaming encryption provides dual-layer security for large files:

  • Classical KEM protects against current threats
  • PQC KEM protects against future quantum threats
  • Dual decryption requirement ensures both KEMs must succeed (prevents downgrade attacks)

✅ Algorithm Diversity

Combining different algorithm families (ECDH + lattice-based/code-based) reduces risk of common-mode failures:

  • X25519/X448/P-curves: Discrete logarithm problem (DLP) hardness
  • ML-KEM: Module-LWE (Learning With Errors) hardness
  • HQC: Syndrome decoding hardness

✅ Memory Safety

Streaming operations ensure constant or sub-linear memory usage regardless of file size, preventing memory exhaustion attacks.


Conclusion

This benchmark provides strong, reproducible evidence that SecureCore's composite streaming encryption operations:

  • Efficiently support large file processing with minimal memory footprint across a wide variety of hybrid classical+PQC KEM combinations.

  • Perform reliably and predictably across payload sizes from 5 MiB to 100 MiB, with linear or sub-linear performance scaling.

  • Offer memory-efficient streaming critical for cloud, enterprise, and resource-constrained environments.

  • Demonstrate that PQC KEMs (especially ML-KEM and HQC) are production-ready for streaming workloads, with performance comparable to or better than classical alternatives.

These results demonstrate SecureCore's readiness for enterprise deployment of streaming cryptographic operations, regulatory compliance, and future-proof cryptographic agility for large-scale quantum-resistant data protection.


Changelog

Date Change Author
2026-01-18 Created composite streaming encryption performance benchmark ANKASecure Performance Team
2026-01-18 Validated 20 COMPOSITE_KEM_COMBINE combinations across 80 streaming measurements ANKASecure Performance Team
* restricted content — see higher-tier documentation