From 081ecb325069a62bc4d2d2a7c90571ef11a0bd24 Mon Sep 17 00:00:00 2001 From: dev Date: Tue, 6 Oct 2026 13:41:56 +0200 Subject: [PATCH] Stages 6b and 7b of Dart done and integrated: the library is complete Co-Authored-By: Claude Opus 5.5 --- HANDOFF.md | 57 ++++++++++++++++++++++++++-------------------------- PLAN_dart.md | 26 +++++++++++++++++++----- README.md | 2 +- 3 files changed, 50 insertions(+), 35 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index 0408619..70834a3 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,4 +1,4 @@ -# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 6 de octubre por la noche: etapas 2 a 5 de Dart, y 6a y 7a) +# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 6 de octubre por la tarde: la librería Dart, completa) Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude. Las secciones 0 a 4, al final, son el historial; el estado actual es este apartado. @@ -6,37 +6,36 @@ Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude. --- -## Retomar aquí (para la sesión del 7 de octubre) +## Retomar aquí **Para empezar:** 1. Abre la sesión en `G:\bussines\datekeys`, la raíz, no en `App`. Comprueba que corre en Opus. La memoria buena es la de la raíz. -2. Comprueba los repos con `git status` y `git log`. Todos estaban limpios y subidos al cerrar: - - `datekeys-go`: rama `v0.12` en `c531e93`; - - `App`: rama `v0.10` en `289fe71`; - - `datekeys-dart`: rama `v0.11` en `b23a0ee`, con el remoto `go/dateKeys-dart`, que el autor creó el 6-10; - - `docs`: rama `main` en el commit de este handoff, con el remoto `go/datekeys-doc`, creado también el 6-10. -3. **Dart, fase 2 de las etapas 6 y 7.** Las dos partes van en paralelo, con el esquema de siempre: - - un agente Opus por parte, uno en la copia principal y otro en un worktree junto a los repos; - - solo ficheros nuevos, y los cambios a los comunes en un último commit; - - después, la sesión revisa contra Go, integra con `rebase`, pasa `tool/check.sh` y sube. - - [PLAN_dart.md](PLAN_dart.md) tiene, al final, la revisión de cada parte y el esquema de los encargos. - - **6b, el escritor de cápsulas del formato 3,** sobre la 6a: - - el área de 32 KiB, `time_only` y `time_and_key`, la `.dkk`, la llave de palabras y la nota; - - los 16 huecos con señuelos y su orden al azar, con `permute` de la 6a, que es la de Go; - - el relleno, la longitud del `.dkc` antes de escribirlo y las reglas del §62.1 con sus autocomprobaciones; - - la escritura en streaming; - - los enganches de firma CMS y de sello, como `CMSSigner` y `Sealer` de Go; - - interoperabilidad: Go abre con cada credencial lo que escribe Dart y lo vuelve a codificar a los mismos bytes, como hizo TypeScript con `capsule-vectors.json`. Con el azar fijo, las secciones deterministas salen iguales que las de Go. - - **7b, las claves de autor y el sellado del localizador:** - - `authorkey` de Go: generar una clave, `dkauthor1…` y su fichero cifrado con scrypt de logN 16, que se escribe con `ScryptRecipient` de la 6a; - - la firma Ed25519, en código propio, como la de TweetNaCl, con el SHA-512 de `package:crypto`; - - `Seal` y `NewEnvelope` del localizador, sobre `TimeRecipient` y `ageEncrypt` de la 6a, y la parte ya portada en la 7a, `splitEnvelope`. - - **Al final:** la firma `alg` 1 en el escritor, con la clave de autor de la 7b. - - La API de la 6a y la 7a está en el README y en el CHANGELOG de `datekeys-dart`. - -**Qué hizo la sesión del 5 y 6 de octubre.** Corrió en Opus 5.5. Se abrió en `App` y pasó a la raíz sin cerrarse. Cada parte la hizo un agente Opus, y la sesión la revisó contra Go, la integró y pasó el gate. Ninguna revisión encontró fallos. +2. Comprueba los repos con `git status` y `git log`: + - `datekeys-go`: rama `v0.12` en `c531e93`, subida; + - `App`: rama `v0.10` en `289fe71`, subida; + - `datekeys-dart`: rama `v0.11` en `d77ef9e`; + - `docs`: rama `main` en el commit de este handoff. + + Si al cerrar la sesión del 6-10 por la tarde no se subieron `datekeys-dart` y `docs`, lo dice el apartado siguiente. +3. **Lo siguiente lo decide el autor.** La librería Dart está completa: todas las etapas del plan. Lo abierto: + - las cinco decisiones pendientes del localizador, en el apartado de la sesión del 5 y 6 de octubre, que tocan a Go primero; + - la aprobación del borrador v0.12 y la medida del área de 32 KiB; + - el TypeScript: el localizador, la nota en la página y cerrar `0.2.0`; + - la app Flutter, que ya puede usar la librería como dependencia de ruta. + +**Qué hizo la sesión del 6 de octubre por la tarde.** Corrió en Opus 5.5, abierta en la raíz. El autor dijo «SI» a la fase 2 de las etapas 6 y 7 de Dart: +- **6b, el escritor del formato 3** (`4c9bc72` a `6239e30`), de un agente Opus en la copia principal: escribe cápsulas byte a byte como `EncryptFiles` de Go con los mismos valores al azar, y Go las abre con cada credencial. +- **7b, las claves de autor y el sellado del localizador** (`3358f5c` a `d77ef9e`), de otro agente Opus en un worktree: `authorkey`, la firma Ed25519 propia, y `Seal` y `NewEnvelope`, también byte a byte como Go. +- **Integración:** la 7b, encima de la 6b con `rebase`. El enganche de la firma de `alg` 1 pasó a llamarse `AuthorSigner`, y la `AuthorKey` de la 7b lo implementa: el escritor firma ya con la clave real. El gate pasa con 2 059 pruebas en la VM y 665 en Node. +- **Revisión** de la sesión contra Go: sin fallos. Los detalles están en [PLAN_dart.md](PLAN_dart.md), al final. +- **Cosas de Go que Dart copia,** encontradas por los agentes: + - el texto de `PublicString` de `authorkey` con una clave de otra longitud tiene los números al revés: «a public key has 32 bytes, not 31»; + - el error de una nota pública con un carácter de control habla del «declared author», ya anotado el 5-10; + - un comentario que es solo `\r` pasa a `\n` y se acepta. + +## La sesión del 5 y 6 de octubre (histórico: lo actual está arriba) + +**Qué hizo.** Corrió en Opus 5.5. Se abrió en `App` y pasó a la raíz sin cerrarse. Cada parte la hizo un agente Opus, y la sesión la revisó contra Go, la integró y pasó el gate. Ninguna revisión encontró fallos. - **`datekeys-go`:** `internal/pathrule/gen -dart` escribe las tablas de Unicode para Dart. Es `c531e93`, subido. - **Etapas de Dart:** - **2**, primitivas y `age`; y **3**, BLS12-381 y tlock, en paralelo; diff --git a/PLAN_dart.md b/PLAN_dart.md index bb37623..9dfbc82 100644 --- a/PLAN_dart.md +++ b/PLAN_dart.md @@ -11,7 +11,7 @@ Un paquete Dart **puro**: sin Flutter y sin plataforma. Estado de la máquina: el 5-10, Flutter está instalado en `C:\dev\flutter`, y su Dart 3.13.0 es el `dart` del PATH. La librería no necesita Flutter; la app sí. -**Hecho:** las etapas 0 a 5 y las partes 6a y 7a, el 5 y el 6-10, en la rama `v0.11` de `datekeys-dart`, hasta `b23a0ee`. Los commits de cada parte están al final de este plan, y el estado de cada etapa en el README del repo. +**Hecho:** todas las etapas, 0 a 7, el 5 y el 6-10, en la rama `v0.11` de `datekeys-dart`, hasta `d77ef9e`. Los commits de cada parte están al final de este plan, y el estado de cada etapa en el README del repo. ## Decidido (2 de octubre) @@ -252,7 +252,23 @@ La revisión de la sesión comparó `securitycms.dart` con `signature2.go`: el o El gate pasa con 1 713 pruebas en la VM y 432 en Node. -**Fase 2, para la sesión siguiente, en paralelo:** -- **6b:** el escritor de cápsulas del formato 3, con el área, `time_only` y `time_and_key`, la `.dkk`, la llave de palabras, la nota, los señuelos, las autocomprobaciones del §62.1, los enganches de firma CMS y de sello, y la interoperabilidad con Go. -- **7b:** las claves de autor `dkauthor1…`, con la firma Ed25519 y su fichero cifrado con scrypt de logN 16, y el `Seal` y el `NewEnvelope` del localizador. -- **Al final:** la firma `alg` 1 en el escritor. +**Fase 2, hecha, revisada e integrada el 6-10.** El autor dijo «sí» a lanzarla. Dos agentes Opus en paralelo, con el esquema de siempre: la 6b en la copia principal, rama `v0.11`, y la 7b en el worktree `datekeys-dart-stage7b`, rama `stage7b`, desde `b23a0ee`. La 7b se integró encima de la 6b con `rebase`; el worktree y la rama están borrados. El gate pasa con 2 059 pruebas en la VM y 665 en Node, y `v0.11` está en `d77ef9e`. +- **6b, el escritor de cápsulas del formato 3:** `4c9bc72` a `6239e30`. + - `encrypt3.dart`: `encryptFiles`, port de `EncryptFiles`, `sealer` y el área de seguridad, con `EncryptOptions`, `FileSource`, `EncryptResult`, `CapsuleWriteException` y los enganches `AuthorSigner`, `CmsSigner` y `Sealer`, que pueden devolver un `Future`. El reloj es la opción `now`, obligatoria. El sink se cierra solo con la cápsula completa y comprobada, y se aborta ante cualquier fallo. + - Vectores de Go, como una prueba de Go en una exportación: 87 recetas. Las 21 cápsulas salen iguales byte a byte, con su `.dkk`, su resultado y los mismos valores al azar en el mismo orden; los 66 errores dan el mismo texto, el mismo código y los mismos bytes escritos antes. + - En la otra dirección, Go abre con cada credencial las 12 muestras de Dart, sola y todas juntas, y vuelve a codificar cada capa a los mismos bytes. + - Las pruebas detectaron los 20 fallos inyectados. + - Una diferencia a propósito: Go sella un control de prueba para medir `SEALED_CONTROL`; Dart calcula la longitud y saca y descarta los mismos valores al azar, para que los siguientes coincidan. El formato 2 (`Encrypt`) no se porta. + - Tiempos: una cápsula pequeña `time_only`, 48 ms en la VM y 0,71 s en Node; un fichero de 64 MiB, 4,7 s en la VM, por el SHA-256. +- **7b, las claves de autor y el sellado del localizador:** `3358f5c` a `d77ef9e`. + - `authorkey.dart`, port de `authorkey`: `AuthorKey`, las cadenas `dkauthor1…` y `DKAUTHOR-SECRET-KEY-1…` y el fichero cifrado con scrypt de logN 16. `go_unicode.dart`, generado con Go, da la caja y los espacios de Go, para que los textos de error coincidan con cualquier entrada. + - `ed25519_sign.dart`: la firma de TweetNaCl con el SHA-512 de `package:crypto`, exacta en la VM y en JavaScript, sin `BigInt` con secretos. + - `locator_seal.dart`: `sealLocator` y `newEnvelope`, `Seal` y `NewEnvelope` de Go. + - Con los mismos valores al azar, Dart escribe los bytes de Go en todos los casos, y Go abre las 15 muestras de Dart. Las pruebas detectaron los 20 fallos inyectados. + - Diferencias: tras `clear`, la clave lanza un `StateError`, donde Go firma con una clave a ceros; y se copia un fallo de Go, el texto de `PublicString` con los números al revés. + - Tiempos en la VM: una firma, 4,5 ms; el fichero de clave, 0,57 s al escribirlo y al leerlo. +- **Al integrar:** la interfaz de la firma de `alg` 1, que la 6b llamaba `AuthorKey`, pasa a `AuthorSigner`, y la `AuthorKey` de la 7b la implementa. Las pruebas del escritor firman las cápsulas de `alg` 1 con la clave de la semilla de Go, y escriben los mismos bytes que Go. + +La revisión de la sesión comparó con Go `EncryptFiles`, `newSealer`, `newHead`, `security`, `write`, `readSource`, `accessRecipients` y `fillSlots`, y `authorkey`, `Seal` y `NewEnvelope`. No encontró fallos. Una nota menor: si `AuthorSigner.sign` lanza, el error no lleva el prefijo `capsule:`; en Go esa firma no puede fallar. + +**Con esto están hechas todas las etapas del plan.** diff --git a/README.md b/README.md index 17a4d7c..2d1dc1a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Para retomar el trabajo, lee [HANDOFF.md](HANDOFF.md): el estado de cada repo, l |---|---|---| | `datekeys-go/` | Especificación del protocolo (`spec/`), CDDL, testdata compartido e implementación de referencia en Go: librería y CLI | `go/DateKeys` | | `datekeys-ts/` | Implementación en TypeScript y página `/inspect` | `go/DateKeys-App` | -| `datekeys-dart/` | Librería Dart para la app Flutter, según [PLAN_dart.md](PLAN_dart.md). Rama `v0.11`: etapas 0 a 5 hechas, `testdata/` en `c531e93` (el borrador v0.12), y la 6 y la 7 en marcha | `go/dateKeys-dart`, desde el 6-10 | +| `datekeys-dart/` | Librería Dart para la app Flutter, según [PLAN_dart.md](PLAN_dart.md). Rama `v0.11`: todas las etapas hechas, de la 0 a la 7, con `testdata/` en `c531e93` (el borrador v0.12) | `go/dateKeys-dart`, desde el 6-10 | | `web/` | Landing de datekeys.com, con `api/enquiry.php` | ninguno | | `docs/` | Este repositorio | `go/datekeys-doc`, desde el 6-10 | | `brand/` | Logos | no es un repo |