LULA is Ring0 Labs’ research family of hash-based signature schemes. This first paper studies signing with a reusable cache.
Summary
The cache stores work in advance, making signing fast. For the same key and message, an honest restore leaves the signature unchanged whenever signing completes.
- Cache ready
- 3.6 ms
- Sign with the prepared data already in memory.
- After restarting
- 5.7 s
- Load the saved cache, then produce the first signature.
- Cache missing
- ~5.5 min
- Recompute the data needed for one signature.
Same key + same message → same signature, whenever signing completes.
32-byte messages. The first two times are medians. Cache loss: three runs (330–338 s), with recomputation required again for later signatures.
Measured comparison
32-byte messages. All times are milliseconds. Signing and verification are measured separately. N is the number of calls; “max” is the maximum observed, not a guarantee.
Prepared cache: stability campaign
Six blocks on one machine, one pinned logical processor. Different signing-query targets: LULA I 2^40, conditional; SLH-DSA 2^64. Hash backends differ; the physical core was not isolated.
| Implementation | Signature (bytes) | Sign median / p99 / max (ms) | Verify median (ms) | N |
|---|---|---|---|---|
| LULA I, cache in memory | 5,720 | 3.59 / 6.32 / 57.26 | 0.119 | 6,000 |
| SLH-DSA-SHA2-128f, OpenSSL | 17,088 | 10.78 / 16.92 / 125.57 | 0.631 | 6,000 |
| SLH-DSA-SHA2-128s, OpenSSL | 7,856 | 232.17 / 330.25 / 605.57 | 0.230 | 1,200 |
Separate exploratory measurements
Earlier campaign, with background load and different state and preprocessing assumptions. These rows are not pooled with the stability results. Small N limits the interpretation of p99.
| Implementation / mode | Signature (bytes) | Sign median / p99 / max (ms) | Verify median (ms) | N |
|---|---|---|---|---|
| SHRINCS C B32, stateful | 324–3,508 | 48.52 / 71.83 / 96.67 | 0.120 | 200 |
| SHRINCS C B32, forced fallback | 3,680 | 471.96 / 616.74 / 616.74 | 0.448 | 20 |
| Compact PORS+FP, third-party Go | 4,036 | 1,897.78 / 4,450.32 / 4,450.32 | 0.905 | 12 |
| Compact WOTS+C, our C reconstruction | 3,952 | 3,613.61 / 4,128.47 / 4,128.47 | 0.542 | 20 |
The compact rows use third-party or reconstructed code for Kudinov–Nick configurations, not the authors’ optimized implementation. SHRINCS sizes cover 200 measured indices; forced fallback was timed separately. Values are rounded.
After a restore
A backup can rewind a counter and make a signer reuse a one-time key. LULA I keeps no key-use counter.
The cache occupies about 72 MiB. Signatures are 5,720 bytes; public keys are 32 bytes. The 5.7-second restart result includes loading and first signing, across 15 restarts. Cache-loss runs took 330.0, 331.8 and 337.6 seconds.
Those cache-loss runs used one CPU thread. GPU acceleration could reduce recomputation time; no GPU speedup has been measured for LULA I.
Read the paper
Published on Zenodo, DOI 10.5281/zenodo.23353281, CC BY 4.0. Developed by Ring0 Labs; published by Lugel Labs.
Loading paper…
A note on the name
“I named it LULA because I felt like it. Sorry, friends—I need to have some fun sometimes.”