You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.9 KiB
6.9 KiB
The v0.9 draft is written in spec/DateKeys_Protocol_Specification_v0.9.md (title "Borrador normativo v0.9", date 29 septiembre 2026) and in spec/datekeys.cddl. Nothing is committed. spec/README.md, testdata, Go and TS are untouched. The two Go tests that read the spec still pass, because they read the v0.8.2 file. The existing §76 text is byte-identical to v0.8.2.
I rechecked the design's numbers and the critics' claims before writing:
- Padding: every value recomputes exactly, and the stated properties hold for L from 0 to 300 000 and for 200 000 random L up to L_MAX.
- Fixture lengths: all 5 fixtures match the length formulas.
- JS arithmetic: 32-bit operators first give a wrong P at L = 2³² + 1, and in Node
Math.log2(2^49 − 1)returns 49 instead of 48. - Recipients: with a recipient whose bit 255 is set, both
filippo.io/age1.3.2 andage-encryption0.3.1 encrypt a stanza that the identity cannot open. With the zero point (low order), both refuse to encrypt.
Sections changed
- Top of the document: title, date, §1, §4 (goal 8), §5 (new non-goal), §15.
- Format and header: §22 (table mapping each format to its control version), §23, §24, §26, §27, §28.1.
- Padding: §29, new §29.1 «Relleno del payload», §30, §30.1.
- Control and slots: §31 (keys 6 and 7, the 103-byte control), §33, §36, §36.1, §37, §38, §39 (rewritten, defines «credencial» and «señuelo»), §40.
- Privacy and limits: §55.1, new §55.2 «Consideraciones de privacidad», §56, §57, §58, §58.1.
- Writing: §61, §62, new §62.1 «Reglas del escritor».
- Reading and tests: §63 steps 2, 4, 12, 13, 14, 16, 17 and 18, §64, §67, §68.
- Precedence and compatibility: §69.1 (layers 1 to 3, the cross-object paragraph, Alcance, 7 new examples), §70, §72.
- Closing sections: §73, §74 (with a new «Trabajo futuro» part), §75, new «Cambios normativos de la v0.9» at the end of §76 (13 numbered items, each with Cambio / Motivo / Caso / Tests), §77.
- Unchanged: §65, §66 and §69.
- CDDL: new header;
control = control-v1 / control-v2;payload-length,padding-schemeandmax-payload-length; the rule linking control version to format, and the 8-byte reading rule.
Where I followed a critic over the design
- Relabel tests (both critics): the
time_and_keyrelabel cases offer the identity, not the.dkk. A.dkkcarries acapsule_digest, and editing the VERSION byte breaks it, so those cases would fail earlier (step 9.a,ERR_ACCESS_INVALID). I qualified §26 and §70 the same way, added a §69.1 example for the.dkkcase, and plannedspec:falsecompanion cases. - Downgrade claim scoped (both): §70 now says only a capsule whose control was not resealed never outputs its padding. Resealing by someone who knows
I_PAYLOADis described as a rewrite, not a downgrade. - Format table, not "control version equals VERSION" (consistency): §22 has the table and says a new padding code needs a new format. I dropped the clause «salvo que su registro diga otra cosa» from §72.
- Padding arithmetic (security): rows above 2³² added to §29.1; a MUST NOT on 32-bit operations and
Math.clz32; the float example is now 2⁴⁹ − 1, which is inside the range; a planned accept vector48 0000000100000001. - Dummies (security):
- A dummy's private key is stated to be a full credential while it exists, with a note on how to generate and wipe it.
- The permutation and which slots are dummies are MUST NOT stored or delivered.
- The shuffle rule binds the written header order, unbiased (Fisher–Yates).
- The indistinguishability argument now rests on age's recipient anonymity under the Diffie–Hellman assumption, not on the distribution of keys.
- Readers (both): L and P MUST NOT drive memory or disk reservation; a MAY check of the
PAYLOAD_AGElength at step 17, with the same code; §56 gets a MUST NOT for format 2. I_PAYLOADreason (security): the stated reason is now confidentiality (shared, content-derived or master-derived keys), not only the binding.- §55.2 additions (security):
- a subsection on what format 2 makes impossible to check;
- the quantum caveat;
- whether a portable
.dkkexists; - the fixed 256-byte bucket of
bloque256; - what VERSION 1 and the choice of code reveal.
- Writers (consistency): a writer MAY spool the source to learn L and MUST NOT guess it; "abortar" became "report the error, and the receiver MUST discard the output". The self-check also counts P and checks the
PAYLOAD_AGElength (security). - Smaller corrections:
- §62.1 fixture note (C = 127 for
time_only_extensions); - «como mucho 256»;
- format 1 «contiene (MUST, §33)»;
- one definition of «credencial»;
- §69.1 cross-object list now includes the control version;
- §74 no longer contradicts itself (the CONTROL_CBOR schema stays open, L stays fixed-width);
- the precedence case "padding 3 + unknown critical extension" is a step test, not a
cbor.jsonvector; - forward references are marked "(por generar)" / "(por implementar)".
- §62.1 fixture note (C = 127 for
Rules I added that were not in D1–D7 (please confirm)
- L_MAX = 2⁵³ − 2⁴⁶, with a reader rejection (
ERR_NON_CANONICAL_CBOR). - The MUST for a uniform, unbiased stanza order.
- The MAY to reject twist points (the Legendre check in §37). The security critic offered SHOULD or "the list is not exhaustive"; I wrote the latter plus a MAY.
- The official SDK SHOULD show the effective round time, and MAY compare it with the latest published round when online (§62.1 rule 2).
- The MAY check of the
PAYLOAD_AGElength at step 17. - The MUST NOT on presenting content before step 17 ends (§56).
Open questions for the author
- Is
bstr .size 8for L acceptable, instead of a CBORuint(which would leak L's width through the control length)? - Should readers report the format as SHOULD (as written) or MAY?
- Keep goal 8 in §4 and the new non-goal in §5?
- Any new format-1 test objects need a test-only builder, since conforming writers MUST NOT write format 1. Is that acceptable?
- The
format2_prefix for the planned fixture names. - Optional change, not written: a dummy could be a random valid public key (a canonical u that is not low order), so no private key ever exists. D1 fixes the mechanism, so this needs your approval.
- Twist points: keep MAY, or make it SHOULD?
Notes
- README: the design also proposed edits to
spec/README.md; I left them out because the task forbids touching that file. It will need the v0.9 entry onceSpecVersionbecomes "0.9". - Effects on the TS phase 3 plan (from the consistency critic, not written into the spec):
R_ACCESSmust move from last place to the shuffle.- The "1 024 recipients" test becomes a rejection above 16.
I_PAYLOADshould be wiped after the new self-check, not right after sealing.