Note on speed of verification in SLH-DSA

Published

September 3, 2024

Here I’ll compare on the verification functionality of LMS and SLH-DSA. The XMSS is not mentioned, but as both LMS and XMSS are quite similar in this sense, we probably can observe similar results (XMSS is slightly slower than LMS).

When comparing stateful and stateless hash-based signature schemes, the main benefit of the former is significantly shorter signature sizes and much faster verification. The difference in signature size is significant. I summarised differences in a table below, but in brief, an LMS signature is around 4KB, while a signature with SLH-DSA at a similar security level is closer to <50KB, hence ~10x bigger.

SLH-DSA param PubKey Signature Security LMS param SK PK Sig
SLH-DSA-SHA2-128s 32 7856 128 - - - -
SLH-DSA-SHA2-128f 32 17088 128 - - - -
SLH-DSA-SHA2-192s 48 16224 192 LMS-SHA2-M24-H25-W8 44 48 1260
SLH-DSA-SHA2-192f 48 35664 192 LMS-SHA2-M24-H25-W1 44 48 5436
SLH-DSA-SHA2-256s 64 29792 256 LMS-SHA2-M32-H25-W8 52 56 1932
SLH-DSA-SHA2-128f 64 49856 256 LMS-SHA2-M32-H25-W1 52 56 9324

For SHA2-based LMS, there are 40 different parameterizations possible. In the table above we used extreme values. Parameterization with the W1 postfix indicates large, but fast verification and the one with W8 postfix is a parameterization that provides small signatures, but slow verification.

When it comes to SLH-DSA – the s postfix indicates small parameter sets and f indicates the fast one. But, contrary to LMS, the verification procedure of s parameterization is faster than f. That is related to the design of the verification algorithm – namely, a shorter signature implies fewer evaluations of the hash function.

To give some numbers, the runtime of function F() dominates the runtime of SLH-DSA. We calculated (average) the number of calls to that function as well as the percentage of time the verification algorithm spends in the F() function. The results are presented in the table below. One should notice that there are much fewer calls to the F() in the case of s variant.

128f 192f 256f 128s 192s 256s
No of invocations of function F() 5908 8620 8633 1886 2751 4067
% time spent in F() 94.8% 95.7% 95.2% 88.1% 89.3% 90.9%