Performance measurements › arm_1 › kex-09 · system: x86_1 · arm_1
kex-09 TriQ-KEX — performance on AArch64 (system arm_1)
Independent measurement following the structure of the NICCS ARM self-assessment guide, §3.5 (1)–(7). Not a submitter self-assessment.
1. Basic information
- Category: public-key algorithm; function: key exchange
- Algorithm: TriQ-KEX
- Implementation versions measured: reference
- Parameter sets:
TriQ-KEX-128,TriQ-KEX-256,TriQ-KEX-384,TriQ-KEX-512 - Security evaluation: kex-09 report
- Measurement method: arm_1 method
- Submission: NICCS page
2. Assessment environment
| item | value |
|---|---|
| processor | Qualcomm Oryon (CPU 2, one core) |
| machine | ASUS Vivobook S 15 |
| clock | fixed 2.71 GHz (governor performance, minimum = maximum), boost off, SMT none |
| memory | 30562 MiB |
| OS / kernel | Ubuntu 26.04.1 LTS / 7.0.0-34-generic |
| compiler / build tool | gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0 / cmake version 4.2.3 |
| campaign start / end (UTC) | 2026-09-28T15:05:46 / 2026-09-29T08:43:52 |
3. Functional testing (KAT)
Each library was checked against the submitted KAT vectors (SHA-256 manifest kex-09/kat.sha256 in the harness) before timing.
| instance | build flags | KAT |
|---|---|---|
TriQ-KEX-128 |
guide | PASS |
TriQ-KEX-256 |
guide | PASS |
TriQ-KEX-384 |
guide | PASS |
TriQ-KEX-512 |
guide | PASS |
4. Performance
| instance | operation | mean cycles | mean time | ops/s | median trial | n (trials × iters) |
|---|---|---|---|---|---|---|
TriQ-KEX-128 |
exchange | 37.66 M | 14 ms | 71.5 | 14 ms | 230 (5 × 46) |
TriQ-KEX-128 |
init_a | 2.23 M | 827 µs | 1.21e+03 | 826 µs | 230 (5 × 46) |
TriQ-KEX-128 |
init_b | 2.23 M | 826 µs | 1.21e+03 | 826 µs | 230 (5 × 46) |
TriQ-KEX-128 |
pass1 | 6.60 M | 2.45 ms | 409 | 2.45 ms | 230 (5 × 46) |
TriQ-KEX-128 |
pass2 | 15.46 M | 5.74 ms | 174 | 5.74 ms | 230 (5 × 46) |
TriQ-KEX-128 |
derive_a | 10.06 M | 3.73 ms | 268 | 3.73 ms | 230 (5 × 46) |
TriQ-KEX-128 |
derive_b | 1.11 M | 412 µs | 2.43e+03 | 412 µs | 230 (5 × 46) |
TriQ-KEX-256 |
exchange | 217.58 M | 80.7 ms | 12.4 | 80.7 ms | 100 (5 × 20) |
TriQ-KEX-256 |
init_a | 13.26 M | 4.92 ms | 203 | 4.92 ms | 100 (5 × 20) |
TriQ-KEX-256 |
init_b | 13.25 M | 4.92 ms | 203 | 4.92 ms | 100 (5 × 20) |
TriQ-KEX-256 |
pass1 | 39.63 M | 14.7 ms | 68 | 14.7 ms | 100 (5 × 20) |
TriQ-KEX-256 |
pass2 | 92.24 M | 34.2 ms | 29.2 | 34.2 ms | 100 (5 × 20) |
TriQ-KEX-256 |
derive_a | 55.80 M | 20.7 ms | 48.3 | 20.7 ms | 100 (5 × 20) |
TriQ-KEX-256 |
derive_b | 3.39 M | 1.26 ms | 795 | 1.26 ms | 100 (5 × 20) |
TriQ-KEX-384 |
exchange | 602.41 M | 223 ms | 4.47 | 223 ms | 100 (5 × 20) |
TriQ-KEX-384 |
init_a | 36.09 M | 13.4 ms | 74.7 | 13.4 ms | 100 (5 × 20) |
TriQ-KEX-384 |
init_b | 36.09 M | 13.4 ms | 74.7 | 13.4 ms | 100 (5 × 20) |
TriQ-KEX-384 |
pass1 | 108.08 M | 40.1 ms | 24.9 | 40.1 ms | 100 (5 × 20) |
TriQ-KEX-384 |
pass2 | 252.06 M | 93.5 ms | 10.7 | 93.5 ms | 100 (5 × 20) |
TriQ-KEX-384 |
derive_a | 156.81 M | 58.2 ms | 17.2 | 58.1 ms | 100 (5 × 20) |
TriQ-KEX-384 |
derive_b | 13.13 M | 4.89 ms | 205 | 4.87 ms | 100 (5 × 20) |
TriQ-KEX-512 |
exchange | 1.28 G | 475 ms | 2.11 | 474 ms | 100 (5 × 20) |
TriQ-KEX-512 |
init_a | 77.98 M | 28.9 ms | 34.6 | 28.9 ms | 100 (5 × 20) |
TriQ-KEX-512 |
init_b | 78.04 M | 29 ms | 34.5 | 29 ms | 100 (5 × 20) |
TriQ-KEX-512 |
pass1 | 232.89 M | 86.4 ms | 11.6 | 86.4 ms | 100 (5 × 20) |
TriQ-KEX-512 |
pass2 | 540.80 M | 201 ms | 4.98 | 201 ms | 100 (5 × 20) |
TriQ-KEX-512 |
derive_a | 327.84 M | 122 ms | 8.22 | 122 ms | 100 (5 × 20) |
TriQ-KEX-512 |
derive_b | 21.19 M | 7.86 ms | 127 | 7.86 ms | 100 (5 × 20) |
5. Resource consumption
Static memory is approximated by the library's loadable ELF segments; peak memory is the process high-water mark (VmHWM) including the benchmark driver and libc, so both are upper-bound proxies rather than isolated algorithm memory.
| instance | operation | static: ELF image (bytes) | baseline RSS | peak RSS |
|---|---|---|---|---|
TriQ-KEX-128 |
exchange | 44624 | 3836 KiB | 3900 KiB |
TriQ-KEX-128 |
init_a | 44624 | 1796 KiB | 1876 KiB |
TriQ-KEX-128 |
init_b | 44624 | 1796 KiB | 1876 KiB |
TriQ-KEX-128 |
pass1 | 44624 | 3612 KiB | 3676 KiB |
TriQ-KEX-128 |
pass2 | 44624 | 3728 KiB | 3792 KiB |
TriQ-KEX-128 |
derive_a | 44624 | 3644 KiB | 3708 KiB |
TriQ-KEX-128 |
derive_b | 44624 | 1796 KiB | 1876 KiB |
TriQ-KEX-256 |
exchange | 47836 | 4476 KiB | 4540 KiB |
TriQ-KEX-256 |
init_a | 47836 | 4380 KiB | 4444 KiB |
TriQ-KEX-256 |
init_b | 47836 | 4356 KiB | 4420 KiB |
TriQ-KEX-256 |
pass1 | 47836 | 4492 KiB | 4556 KiB |
TriQ-KEX-256 |
pass2 | 47836 | 4280 KiB | 4344 KiB |
TriQ-KEX-256 |
derive_a | 47836 | 4440 KiB | 4504 KiB |
TriQ-KEX-256 |
derive_b | 47836 | 3788 KiB | 3852 KiB |
TriQ-KEX-384 |
exchange | 58368 | 5132 KiB | 5196 KiB |
TriQ-KEX-384 |
init_a | 58368 | 4476 KiB | 5584 KiB |
TriQ-KEX-384 |
init_b | 58368 | 4848 KiB | 4912 KiB |
TriQ-KEX-384 |
pass1 | 58368 | 5000 KiB | 5568 KiB |
TriQ-KEX-384 |
pass2 | 58368 | 5328 KiB | 5392 KiB |
TriQ-KEX-384 |
derive_a | 58368 | 5152 KiB | 5644 KiB |
TriQ-KEX-384 |
derive_b | 58368 | 5384 KiB | 5636 KiB |
TriQ-KEX-512 |
exchange | 64824 | 6284 KiB | 6348 KiB |
TriQ-KEX-512 |
init_a | 64824 | 6320 KiB | 6384 KiB |
TriQ-KEX-512 |
init_b | 64824 | 5960 KiB | 6024 KiB |
TriQ-KEX-512 |
pass1 | 64824 | 5304 KiB | 5368 KiB |
TriQ-KEX-512 |
pass2 | 64824 | 6064 KiB | 6128 KiB |
TriQ-KEX-512 |
derive_a | 64824 | 5524 KiB | 5588 KiB |
TriQ-KEX-512 |
derive_b | 64824 | 6012 KiB | 6076 KiB |
6. Transmission and storage overhead
Bandwidth counts all specified protocol messages and each required public key once. Public keys are transmitted bytes too. Certificates and transport framing are excluded. The published raw timing records are unchanged.
| instance | passes | messages (bytes; raw API) | protocol-message bytes | public key A / B | bandwidth (bytes) | long-term sk (API cap) | shared secret |
|---|---|---|---|---|---|---|---|
TriQ-KEX-128 |
2 | 6148 / 8180 | 14328 | 2054 / 2054 | 18436 | 2134 | 16 |
TriQ-KEX-256 |
2 | 18808 / 24952 | 43760 | 6328 / 6328 | 56416 | 6488 | 32 |
TriQ-KEX-384 |
2 | 36598 / 48678 | 85276 | 12255 / 12255 | 109786 | 12495 | 48 |
TriQ-KEX-512 |
2 | 59096 / 78648 | 137744 | 19768 / 19768 | 177280 | 20088 | 64 |
Symmetric primitives
Survey verdict: ICCS-only
Share of each operation spent in the ICCS placeholder hash functions and in the ICCS DRNG (reference build, measured in the same run with link-time wrappers):
| instance | operation | pseudohash/XOF/sm3 | DRNG | calls per operation |
|---|---|---|---|---|
TriQ-KEX-128 |
exchange | 11% | 0.2% | drng 14, pseudoXOF 74.6 |
TriQ-KEX-256 |
exchange | 5.3% | 0.0% | drng 14, pseudoXOF 65.9, pseudohash 9 |
TriQ-KEX-384 |
exchange | 6.3% | 0.0% | drng 14, pseudoXOF 70.7, pseudohash 9 |
TriQ-KEX-512 |
exchange | 5.6% | 0.0% | drng 14, pseudoXOF 63, pseudohash 17 |
7. Raw evidence index
Paths are relative to performance/data/arm_1/ in the harness; each JSON file records its commands, environment and trials.
| instance | item | file |
|---|---|---|
TriQ-KEX-128 |
KAT log (sha256 b53a7b6ac1262b30…) |
kat/kex-09/TriQ-KEX-128.log |
TriQ-KEX-128 |
timing derive_a | records/kex-09/TriQ-KEX-128__derive_a.json |
TriQ-KEX-128 |
timing derive_b | records/kex-09/TriQ-KEX-128__derive_b.json |
TriQ-KEX-128 |
timing exchange | records/kex-09/TriQ-KEX-128__exchange.json |
TriQ-KEX-128 |
timing init_a | records/kex-09/TriQ-KEX-128__init_a.json |
TriQ-KEX-128 |
timing init_b | records/kex-09/TriQ-KEX-128__init_b.json |
TriQ-KEX-128 |
timing pass1 | records/kex-09/TriQ-KEX-128__pass1.json |
TriQ-KEX-128 |
timing pass2 | records/kex-09/TriQ-KEX-128__pass2.json |
TriQ-KEX-128 |
hash profile exchange | profile/kex-09/TriQ-KEX-128__exchange.json |
TriQ-KEX-256 |
KAT log (sha256 ff3859812595cf76…) |
kat/kex-09/TriQ-KEX-256.log |
TriQ-KEX-256 |
timing derive_a | records/kex-09/TriQ-KEX-256__derive_a.json |
TriQ-KEX-256 |
timing derive_b | records/kex-09/TriQ-KEX-256__derive_b.json |
TriQ-KEX-256 |
timing exchange | records/kex-09/TriQ-KEX-256__exchange.json |
TriQ-KEX-256 |
timing init_a | records/kex-09/TriQ-KEX-256__init_a.json |
TriQ-KEX-256 |
timing init_b | records/kex-09/TriQ-KEX-256__init_b.json |
TriQ-KEX-256 |
timing pass1 | records/kex-09/TriQ-KEX-256__pass1.json |
TriQ-KEX-256 |
timing pass2 | records/kex-09/TriQ-KEX-256__pass2.json |
TriQ-KEX-256 |
hash profile exchange | profile/kex-09/TriQ-KEX-256__exchange.json |
TriQ-KEX-384 |
KAT log (sha256 bb396809c1d4bb7c…) |
kat/kex-09/TriQ-KEX-384.log |
TriQ-KEX-384 |
timing derive_a | records/kex-09/TriQ-KEX-384__derive_a.json |
TriQ-KEX-384 |
timing derive_b | records/kex-09/TriQ-KEX-384__derive_b.json |
TriQ-KEX-384 |
timing exchange | records/kex-09/TriQ-KEX-384__exchange.json |
TriQ-KEX-384 |
timing init_a | records/kex-09/TriQ-KEX-384__init_a.json |
TriQ-KEX-384 |
timing init_b | records/kex-09/TriQ-KEX-384__init_b.json |
TriQ-KEX-384 |
timing pass1 | records/kex-09/TriQ-KEX-384__pass1.json |
TriQ-KEX-384 |
timing pass2 | records/kex-09/TriQ-KEX-384__pass2.json |
TriQ-KEX-384 |
hash profile exchange | profile/kex-09/TriQ-KEX-384__exchange.json |
TriQ-KEX-512 |
KAT log (sha256 2b6807a92bffa604…) |
kat/kex-09/TriQ-KEX-512.log |
TriQ-KEX-512 |
timing derive_a | records/kex-09/TriQ-KEX-512__derive_a.json |
TriQ-KEX-512 |
timing derive_b | records/kex-09/TriQ-KEX-512__derive_b.json |
TriQ-KEX-512 |
timing exchange | records/kex-09/TriQ-KEX-512__exchange.json |
TriQ-KEX-512 |
timing init_a | records/kex-09/TriQ-KEX-512__init_a.json |
TriQ-KEX-512 |
timing init_b | records/kex-09/TriQ-KEX-512__init_b.json |
TriQ-KEX-512 |
timing pass1 | records/kex-09/TriQ-KEX-512__pass1.json |
TriQ-KEX-512 |
timing pass2 | records/kex-09/TriQ-KEX-512__pass2.json |
TriQ-KEX-512 |
hash profile exchange | profile/kex-09/TriQ-KEX-512__exchange.json |
Scripts: performance/campaign.py, performance/ngcc_perf.c, performance/hashprof/ in the harness.