Repository navigation
Conversation
Align LMOTS with RFC 8554 Table 1 (N and W, not tree height) and add the HSS levels pattern from RFC 8554 §6 / NIST SP 800-208. Signed-off-by: Mehrn0ush <mehrnoush.vaseghi@gmail.com>
Would there be any way to express that? Dependencies? Note for reviewers, RFC 8554 explicitly allows a lot of flexibility:
|
|
Hi, |
|
If I understand correctly, we would like to describe an ordered sequence of LMS parameter sets for HSS, one per level, including the associated LMOTS parameter sets. Is that correct? What we could do is extending the naming-pattern convention to support repetition. For example, |
|
Yes, that’s exactly it — HSS is an ordered sequence of L levels, each with its own LMS and LMOTS parameter set (RFC 8554 secion 6; SP 800-208 narrows the allowed sets but keeps the per-level structure). I like extending the naming-pattern notation rather than changing the schema. Three things I’d want covered when we document it:
Since this touches the convention for the whole registry, do you suggest keeping this PR as the LMOTS/HSS correctness fix and doing the notation + full HSS pattern as a follow-up (happy to open it). Fine to fold it in here instead if you prefer. @bhess |
Extend the algorithm naming convention with variant references (<Name>)
and repeated groups ((...)+) to describe ordered LMS/LMOTS pairs in HSS,
and document the full notation on the pattern property, including the
constructs already in use (top-level alternation, plain grouping,
literal -, _, /, +). HSS pairs are ordered root level first; when both
{levels} and pairs are present their number shall match; omitted
parameters are unspecified and not inherited between pairs. Rename the
LMOTS N placeholder to hashOutputLength (RFC 8554 n, in bytes), make the
SHA256/SHAKE tokens explicit, and add RFC 9858 to the LMS family.
The JSON structure is unchanged; consumers interpreting naming patterns
may need to support the new notation.
Signed-off-by: Mehrn0ush <mehrnoush.vaseghi@gmail.com>
|
Pushed the extended approach following @bhess's suggestion. pattern now documents the notation ({} placeholders, | alternation pattern-wide or in a group, ( ) grouping, [ ] optional, ( )+ repetition, references resolved by leading literal; unique and non-cyclic). One thing @bhess to confirm: under the written grammar FFDH(E)[-{namedGroup}] reads as a required E (FFDHE…); if FFDH[E] was intended, I can open a separate PR. |
|
@bhess Can you please review when you get a chance. |
bhess
left a comment
There was a problem hiding this comment.
Thanks for this update!
One thing @bhess to confirm: under the written grammar FFDH(E)[-{namedGroup}] reads as a required E (FFDHE…); if FFDH[E] was intended, I can open a separate PR.
Right, the E is optional (stands for ephemeral). Thanks for the catch, and for offering to fix this!
| "title": "Standard Name", | ||
| "description": "Defines the pattern used to construct the complete algorithm name. Placeholders are defined by {} for algorithm-specific properties." | ||
| "title": "Naming Pattern", | ||
| "description": "Defines the pattern used to construct the algorithm name. Notation: `{name}` is a placeholder for an algorithm-specific property; `|` separates alternatives, of which exactly one is used, either across the whole pattern or within a parenthesized group such as `(a|b)`; `( )` groups content, and a group without `|` is plain grouping; `[ ]` marks optional content; `( )+` marks one or more repetitions of the group; `<Name>` references the variant pattern in the cryptographic algorithm definitions registry whose leading literal is `Name`, the leading literal being the initial literal token before the first notation construct (for example `LMS` in `LMS[_(SHA256|SHAKE)]...`), and stands for a name constructed from that pattern, preserving its optional parts. Braces, brackets, parentheses, angle brackets, `|`, and a `+` directly following `)` are notation and are not part of the constructed name; every other character is literal, including `-`, `_`, `/`, and a `+` elsewhere (as in `SPAKE2+`). A reference shall resolve to exactly one variant pattern and shall not be cyclic. Omitted optional parts mean that the corresponding parameters are unspecified, so a name following this notation may be a partial identification rather than a fully specified parameter configuration. For `LMS` and `LMOTS`, `{bytesPerNode}` and `{hashOutputLength}` are measured in bytes. For `HSS`, repeated `LMS`/`LMOTS` pairs are ordered from the root level downward; when both `{levels}` and the repeated pairs are present, the number of pairs shall equal `{levels}`; omission of the pairs leaves the per-level parameters unspecified, and parameters omitted from one pair are unspecified and are not inherited from another pair." |
There was a problem hiding this comment.
Thanks a lot for writing this up, and for checking that all existing patterns parse under it, that was really helpful!
One thought, and I'm curious what you think: the description is what implementers see in the generated docs, and I wonder whether the full grammar might be a bit heavy there. Maybe we could keep a short list of the constructs with examples in the schema, and move the detailed grammar into the updated CBOM guide, where there's more room for edge cases and examples?
As a starting point:
Defines the pattern used to construct the algorithm name.
{name}is a placeholder for an algorithm-specific value,[ ]marks optional content,|separates alternatives of which exactly one is used, across the whole pattern or within( ), and( )+repeats a group one or more times.<Name>stands for a name built from the variant pattern whose text before the first notation character isName, for example<LMS>. All other characters, such as-,_and the+inSPAKE2+, are part of the name. An omitted optional part means the value is unspecified, except for a fixed literal such as[-PKCS7], whose absence selects the variant without it. ForHSS, theLMS/LMOTSpairs are listed per level, starting at the root; when both{levels}and pairs are given, their numbers shall be equal.
@stevespringett, curious to hear what you think.
Keep a construct summary in the schema (placeholders, optional content, alternation, group repetition, <Name> references, literal +, HSS ordering/count). Move the detailed grammar to the CBOM guide. Distinguish omitted parameters from omitted fixed literals such as [-PKCS7] or [E]. Signed-off-by: Mehrn0ush <mehrnoush.vaseghi@gmail.com>
Hi,
LMOTS had a treeHeight parameter it shouldn't — LM-OTS doesn't use a Merkle tree, so there's no height involved. Swapped it for the Winternitz parameter w, which is what actually distinguishes the RFC's parameter sets (LMOTS_SHA256_N32_W1/W2/W4/W8).
Also added HSS, which was missing entirely. It's just the multi-level LMS construction, parameterized by number of levels (L), so the pattern is intentionally minimal — no hash/M/H, since those come from whichever LMS parameter set each level uses.
LMS itself was already correct.
One question — LMOTS still reuses {bytesPerNode} for its N parameter, but RFC 8554 calls this n — the LM-OTS hash output length, not a node value (LM-OTS has no tree nodes). Should this be renamed to something like {hashOutputLength} on LMOTS, keeping {bytesPerNode} only on LMS where it's accurate? Didn't want to bundle a naming change into this fix, so leaving it open — happy to push a follow-up if there's agreement either way.
Closes #1028.