# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 1 de octubre por la noche: el formato 3 en la página, la llave de palabras y la consulta sobre el área de firmas)
# Handoff DateKeys, 26 de septiembre de 2026 (actualizado al cerrar la sesión del 1 de octubre: el borrador del spec v0.11 y los primeros pasos de la firma en Go)
Estado al parar la sesión del 26 por el límite semanal de uso. Se actualizó el 28 de septiembre tras cerrar la v0.8.2 del spec (§2.1), el 29 de madrugada tras cerrar la fase 2 (§2.2), el 29 a mediodía tras reorganizar el espacio de trabajo (§0) y el 29 por la noche tras implementar el formato 2 de la v0.9 en Go y en TypeScript, poner el tag `spec-v0.9` y escribir el writer TypeScript con su interoperabilidad con Go (§2.5). El 30 de madrugada se diseñó el formato de cápsula 3 y Fable lo revisó; a mediodía se aplicaron al diseño esa revisión y las decisiones del autor, y quedó separado en tres entregas; por la tarde, el autor cerró las preguntas de la entrega 1, y se redactó y revisó el borrador del spec v0.10 (§2.5, al final). Por la noche, el autor aprobó ese borrador, con Unicode 18.0.0 y la regla de invisibles, y la referencia Go implementó el formato 3 (§2.5, al final). Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude.
---
## Retomar aquí (1 de octubre por la noche)
**Repositorios**, subidos con permiso del autor («comiteas y pusheas»):
- `App` (`datekeys-ts`): la rama `v0.10`, en `67d626e`. `main` sigue en `da26862`.
- `datekeys-go`: `main` en `13910b3` y la rama `v0.11` en `5b3d2d4`, sin tags nuevos.
- `docs` no tiene remoto: este handoff va en su último commit.
- GATES
**Hecho el 01-10:**
- **Formato 3 en `datekeys-ts`:** los pasos 0 a 8 del [plan](PLAN_formato3_ts.md), con interoperabilidad con Go en los dos sentidos (hasta `4883c90`). Lo pendiente está en el punto 4 de abajo.
- **Diseño de las páginas:**`/create` rediseñada y el sitio siempre claro (`e6cca0b`); `/inspect` a una columna, con los ejemplos plegados (`0d98480`). El autor no aprobó `/create` como estilo. Sus reglas: nunca fondo oscuro, nada del estilo de la web corporativa, y diseñar con la skill de diseño sobre la página real.
- **Pedir la firma a drand:**`/inspect` la pide con un botón a `api.drand.sh`, `api2.drand.sh` y `api3.drand.sh` a la vez y comprueba que `randomness` sea el SHA-256 de la firma, que después se verifica en el paso 10. La CSP abre `connect-src` solo a esos tres (`2ec7102`).
- **Llave de palabras:** al menos 6 palabras que elige la persona abren una cápsula `time_and_key` en lugar de la `.dkk`.
- Se normalizan (NFD sin marcas, minúsculas y los espacios de Go) y se estiran con PBKDF2-SHA256 de 600 000 rondas, con la sal `DateKeys llave de palabras v1|<cadena>|<ronda>`.
- Dan una identidad X25519 que entra como un destinatario más, así que el formato no cambia.
- Está en la página (`b617007` y `67d626e`) y en la CLI de Go, con `-words` y `-words-file` en `encrypt` y `decrypt` (`5b3d2d4`, rama `v0.11`). Las dos comparten un vector, y la CLI abrió una cápsula hecha en la página. El detalle está en [spec_v0.11/llave_palabras.md](spec_v0.11/llave_palabras.md).
- **Firma de autor:** el [plan](PLAN_firma_go.md), con los cambios que pidió el autor: firma con certificado reconocido (`alg` 2, CAdES separada), hecha fuera de la web y nativa en escritorio, móvil y CLI; escritor en dos tiempos; sello RFC 3161 de una autoridad cualificada; OpenTimestamps en estudio.
- **Nota pública:** decidida para la v0.11, con una copia, junto con la fecha, en la `.dkk`. La `.dkk` dirá también dónde está el `.dkc`, cifrado para la fecha. Los ficheros fuera de la cápsula quedan como propuesta. Las dos, en el [plan de la firma](PLAN_firma_go.md).
- **El área de firmas y sellos:** el autor no está convencido de fijar su tamaño. La consulta para Fable y Astra está en [spec_v0.11/area_firmas_para_revision.md](spec_v0.11/area_firmas_para_revision.md) y en un artefacto privado, https://claude.ai/artifact/8hVZGDWpv6ZqzzxcWVS7Rc.
**Siguiente:**
1. Hecho: la propuesta de Fable y Astra está en [spec_v0.11/revision_fable_astra.md](spec_v0.11/revision_fable_astra.md). El autor cerró con ella el área fija de 32 KiB provisionales y el sello obligatorio con certificado. El [plan](PLAN_firma_go.md#propuesta-de-fable-y-astra-01-10) recoge siete comprobaciones contra la spec, y el autor confirmó las tres primeras.
2. Medir una firma CAdES real: firmar con AutoFirma un fichero de 98 bytes y anotar cuánto ocupa con la cadena y con sello.
3. El borrador del spec v0.11, paso 0 del plan, está en la rama `v0.11` de `datekeys-go`, sin subir: `e224119` lo redacta y `5a0b95b` aplica la revisión adversarial ([spec_v0.11/revision_borrador.md](spec_v0.11/revision_borrador.md)) y las cuatro decisiones del autor (autoridades reconocidas, `capsule_id` en la sal de la llave de palabras, sobre opaco y `AUTHOR_MESSAGE` en texto). Falta que el autor apruebe el texto. El autor quitó después la lista de autoridades (`46ca90b`): la app comprueba la criptografía y el validador oficial de cada país, quién firmó. El código pendiente de la revisión está hecho: la llave de palabras v2 y la tabla de minúsculas (`150d952` y `2213b8c` en `datekeys-go`, `c3c124a` en `datekeys-ts`, sin subir). Después, los pasos de Go del plan.
4. Pendiente en `datekeys-ts`:
- en `/inspect`, el resultado delante y los pasos 1 a 18 plegados;
- el texto del paso 17 cuando la cápsula se corta tras un chunk completo;
- `open()` en un worker para heads grandes;
- los menores del punto 5 de §2.5.
5. Sin cambios en §2.3: el correo de seguridad, la ruta pública del módulo Go y si `datekeys-ts` cierra `0.2.0`.
**Para probar:** la clave age de prueba del autor está en `G:/tmp/datekeys-prueba/clave-age-prueba.txt`; su parte secreta no se copia en el chat. La vista previa hay que reiniciarla tras cada build, y el modo de desarrollo con el panel oculto va lento: los tiempos se miden con el build.
## Retomar aquí (al cerrar la sesión del 1 de octubre)
**Repositorios.** Desde el último push, autorizado por el autor, todo va en local. Subir solo con su permiso.
- `App` (`datekeys-ts`), rama `v0.10`: subida hasta `67d626e`. En local, `c3c124a`: la llave de palabras v2.
- `datekeys-go`, rama `v0.11`: subida hasta `5b3d2d4`. En local:
- el borrador del spec v0.11: `e224119`, `5a0b95b`, `46ca90b` y `48b496f`;
- la tabla de minúsculas y la llave de palabras v2: `150d952` y `2213b8c`;
- los pasos 1 y 2 del [plan de la firma](PLAN_firma_go.md) y el comienzo de los pasos 3 y 4: `c402857`, `7e7681e` y `3d85a0b`.
- `main` de `datekeys-go` sigue en `13910b3`. `docs` no tiene remoto.
**El spec v0.11** es un borrador, sin aprobación escrita del autor: `datekeys-go/spec/DateKeys_Protocol_Specification_v0.11.md`. Su §76 lista los cambios. Lo que el autor decidió el 01-10:
- **Área fija de 32 KiB,** firme o no, y de 64 KiB solo con ampliación expresa. Los 32 KiB están por confirmar con firmas reales de varios países.
- **`AUTHOR_MESSAGE` en texto,** 99 bytes con el resumen en hexadecimal y un código de 8 caracteres. No cubre L, así que el área puede ampliarse después de firmar.
- **Firmas:**`alg` 1 es Ed25519 estricto; `alg` 2 es CMS con uno o varios firmantes, la lista de firmantes exigidos en la clave 1 y un CAdES-T por firmante.
- **Sello:**`seal_type` 2 (RFC 3161), sin firma o con `alg` 1.
- **Sin lista de autoridades.** La app comprueba la criptografía y avisa de que no comprueba quién emitió el certificado ni el sello; eso lo hace un validador oficial. Vale para certificados de cualquier país: P-521 sí; brainpool, GOST y SM2, todavía no.
- **Llave de palabras v2:** la sal lleva el `capsule_id`.
- **Nota pública** en `PUBLIC_HEADER`.
- **Extensión `datekeys.capsule` de la `.dkk`:** la nota, la fecha y un localizador cifrado para la fecha. Fuera se guarda solo el resto de un sobre `age`, cuya cabecera va en el localizador; ese resto puede ir dentro de otro fichero, indicando el desplazamiento.
- La revisión adversarial y sus arreglos están en [spec_v0.11/revision_borrador.md](spec_v0.11/revision_borrador.md) y en el plan de la firma.
**Siguiente, en orden:**
1. **Terminar los pasos 3 y 4 del plan de la firma en Go.**
- **El escritor:**
- `AreaLen` = 32768, y 65536 con una opción `EncryptOptions.LargeArea`;
- `EncryptOptions.AuthorKey`, con la interfaz `capsule.AuthorKey`, que cumple `*authorkey.Key`;
- la firma, dentro de `sealer.write`, con un gancho que reciba el `Control` ya construido y actúe antes de escribir nada: `ControlCommit`, `HeadDigest`, `AuthorMessage`, firmar, verificar con `ed25519strict` (regla 19) y montar `SECURITY_CBOR` y la trama;
- las pruebas que fijan longitudes con el área de 512 bytes cambian, como el caso de 577 y 768 de `open3_test.go`.
- **El lector:**`openBody` evalúa `security` después de leer el head, con `EvaluateSecurityIn` y un `SecurityContext`: el `control_commit` del control abierto, el `head_digest`, la hora de la ronda y una opción nueva, `OpenOptions.AuthorKeys`.
2. **Paso 5, la CLI:**`author keygen` y `author public`, `encrypt -sign` y `decrypt -expect-author`. Para leer la contraseña sin eco haría falta `golang.org/x/sys`, que ya está como dependencia indirecta: preguntar antes al autor, por la regla de dependencias.
3. **El resto del spec en Go:**
- `alg` 2 (CMS), con código propio sobre `encoding/asn1` y `crypto/x509`;
- `seal_type` 2 (RFC 3161);
- la nota pública y la extensión de la `.dkk`, con su localizador y su sobre.
4. **Paso 6, los datos de prueba:**
- los casos «no soportado» con `alg` y `seal_type` 4294967295;
- `security.json` y fixtures con firma;
- los vectores de lo firmado sobre `format3_single`.
5. **Después, la página** (`datekeys-ts`), con su propio plan.
6. **Pendiente del autor:** aprobar el texto del spec v0.11, autorizar la subida y conseguir firmas de prueba de varios países para medir el área.
**Para trabajar:** en esta máquina los heredocs de Bash rompen las barras invertidas y los apóstrofos, así que los cambios con ellas se escriben como scripts con la herramienta Write. La vista previa hay que reiniciarla tras cada build. Los secretos de prueba no se muestran en el chat.
---
## 0. Reorganización del espacio de trabajo (29-09, mediodía)
@ -120,3 +120,10 @@ Tres revisores adversariales (criptografía, interoperabilidad y privacidad) rev
- Una tabla de minúsculas de Unicode 18.0.0, generada con `pathrule/gen`, para Go y TypeScript; y el rechazo de controles, Default_Ignorable y Cn al escribir.
- ~~La lista de autoridades reconocidas~~: descartada.
## Estado al cerrar la sesión del 01-10
- Paso 0: el borrador del spec v0.11, a falta de la aprobación escrita del autor.
- Paso 1, hecho (`c402857`): `internal/ed25519strict` y `testdata/vectors/ed25519_strict.json`, con 18 firmas; `crypto/ed25519` acepta 11 que el perfil rechaza.
- Paso 2, hecho (`7e7681e`): `authorkey`, con las claves `dkauthor1…` y `DKAUTHOR-SECRET-KEY-1…` y el fichero cifrado con scrypt de factor 16.
- Pasos 3 y 4, empezados (`3d85a0b`): `capsule/signature.go`, con los compromisos, `AUTHOR_MESSAGE`, `SIG_PART` y `SEAL_SUBJECT`, y `EvaluateSecurityIn`, que da F2, F3 o F4 a `alg` 1. Falta conectarlos al escritor y al lector; el [handoff](HANDOFF.md) dice cómo.