The port of dice.go of datekeys-go at 92e7154, for whoever does not trust
the random numbers of a computer: five dice for each word give a number
from 11111 to 66666, the position of the word in a list of 7776, the first
die the most significant. diceNumber gives the dice of a position,
diceWord the word of five dice, diceWords the words of several numbers
separated by white space, at least 6 and never the same word twice, and
diceList the list numbered for dice, as the EFF publishes its own: for
en, its UTF-8 bytes are the file of the EFF. The same checks in the same
order and Go's texts, in a WordKeyException. The numbers are split as
Go's strings.Fields splits a string, at unicode.IsSpace (goIsSpace), the
white space at which normalizeWords splits, and nothing else changes.
lib/datekeys.dart exports them; diceWordUtf8 and diceWordsUtf8, on the
bytes of a Go string, are internal, for the tests.
testdata and wordlists at datekeys-go 92e7154: only wordlists/README.md
changes, with the SHA-256 of each list numbered for dice, and the commit
of both SOURCE.json. tool/wordlist_go_vectors.go writes the dice too, run
at 92e7154: DiceNumber, DiceWord and DiceWords on the lists of Go and on
lists of indices, DiceList of each list, and DiceWords with every code
point of planes 0, 1 and 14 between two numbers. The rest of the vectors
is the same but for their source and description. The tests port
TestDiceNumber, TestDiceWord, TestDiceWords and TestDiceList, and run the
vectors on the VM and on Node.js.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ -4,6 +4,22 @@ Cambios notables de la librería Dart. El proyecto usa versionado semántico; mi
## Especificación 0.15, en la rama `v0.15` — sin versión
### Los dados de la llave de palabras (07-10-2026)
- `datekeys-go` añade en `92e7154`, en la rama `v0.15`, los dados que decidió el autor, para quien no se fía de los números al azar de un ordenador: cinco dados por palabra, leídos en un orden fijo, dan un número de 11111 a 66666, la posición de la palabra en una lista de 7776, el primer dado el más significativo. Son `wordkey.DiceNumber`, `DiceWord`, `DiceWords` y `DiceList`, con `encrypt -dice` y `datekeys wordlist` en la CLI. No cambia ningún formato ni ninguna derivación.
- **`lib/src/wordlist.dart`** porta `dice.go`, con las mismas comprobaciones en el mismo orden y los mismos textos de error, en una `WordKeyException`:
- `diceNumber` da los dados de una posición, y `diceListSize` es 7776;
- `diceWord` da la palabra de cinco dados, después de comprobar el tamaño de la lista: cinco bytes, cada uno una cifra del 1 al 6;
- `diceWords` da las palabras de varios números separados por espacios, y rechaza, por este orden, una lista de otro tamaño; menos de 6 números; y, número a número, uno que no es de cinco dados o que da una palabra que ya salió, y hay que volver a tirar. Separa los números como `strings.Fields` de Go, en los espacios de `unicode.IsSpace`, que son los del §38.1 en los que `normalizeWords` separa las palabras, y no cambia nada más: una cifra de ancho completo o una marca combinante no es un dado;
- `diceList` escribe la lista numerada para los dados, una línea por palabra con sus dados y un tabulador, como publica la EFF la suya: para `en`, sus bytes UTF-8 son el fichero de la EFF, byte a byte (SHA-256 `addd3553…`), y para `es` tienen el SHA-256 `611f779a…`, los dos de `wordlists/README.md`.
`lib/datekeys.dart` los exporta. `diceWordUtf8` y `diceWordsUtf8`, sobre los bytes de un string de Go, son internas, para las pruebas. Los espacios son los de `goIsSpace` de `go_unicode.dart`, el `unicode.IsSpace` de Go.
- **`testdata` y `wordlists`** pasan a `92e7154`: solo cambian `wordlists/README.md`, con el SHA-256 de cada lista numerada para los dados, y el commit de los dos `SOURCE.json`.
- **Vectores de Go:**`tool/wordlist_go_vectors.go` escribe también los dados, en una exportación de `datekeys-go` en `92e7154`: `DiceNumber` en 24 posiciones; `DiceWord` en 63 casos y `DiceWords` en 78, sobre las listas de Go y sobre listas de índices, con los casos de `TestDiceWord` y `TestDiceWords`, cada espacio de `unicode.IsSpace` entre los números y puntos de código y bytes que no lo son, el orden de las comprobaciones, listas con una palabra más de una vez, también con caracteres que `%q` escapa, y listas de otro tamaño; el SHA-256 de `DiceList` de cada lista; y `DiceWords` con cada punto de código de los planos 0, 1 y 14 entre los dos primeros números, como el SHA-256 de sus resultados. El resto de los vectores sale igual: cambian solo su campo `source` y su descripción.
- **Pruebas.** 12 nuevas en la VM y 7 en Node.js: `test/wordlist_test.dart`, también compilado a JavaScript, con los casos de `TestDiceNumber` de Go, los de `TestDiceWord` y `TestDiceList` que no necesitan una lista de Go, sobre una lista de índices, los vectores sobre los bytes de Go y sobre Strings, y los espacios del plano 0; y `test/wordlist_vm_test.dart`, con los casos de `TestDiceWord`, `TestDiceWords` y `TestDiceList` sobre las dos listas de `wordlists/`, los vectores sobre ellas y los espacios de los planos 0, 1 y 14, que son los de `normalizeWords`. En total, 2243 en la VM y 712 en Node.js.
- **Fallos inyectados** en los dados, uno a uno y revertidos: los 17, en las cifras y su orden, los límites, el orden de las comprobaciones, los espacios, los bytes que no son UTF-8 válido, la palabra que sale dos veces, la lista numerada y los textos, los detectan pruebas que corren también en Node.js. Uno se escapaba al principio, la palabra repetida sin el `%q` de Go, porque las palabras de una lista no tienen nada que escapar, y los vectores tienen ahora una lista con caracteres que `%q` escapa.
- **Diferencias con Go:** ninguna. `diceWord` y `diceWords` toman un String como sus bytes UTF-8, como el resto de `wordlist.dart`, y los bytes UTF-8 del String de `diceList` son el string de Go.
### Las palabras al azar de la llave de palabras (07-10-2026)
- `datekeys-go` saca al azar, en la rama `v0.15` después del tag `spec-v0.15` (`c49c67c` y `27a75ee`), las palabras de una llave de palabras, el SHOULD del §38.1 de ofrecer palabras al azar de una lista pública: `wordkey.Generate`, `List`, `CheckList`, `Bits` y la lista española `wordkey/lists/es.txt`, de 7776 palabras, un borrador sin revisar. No cambia ningún formato ni ninguna derivación.
@ -24,9 +24,9 @@ Están hechas las etapas 0 a 5 del plan (`docs/PLAN_dart.md` del espacio de trab
- la etapa 7, en dos partes:
- la 7a, el localizador y el sobre de `datekeys.capsule`: los datos de la extensión, la lectura y la apertura del localizador, las reglas de sus direcciones y de la IP a la que resuelve un nombre, y el resto del sobre;
- la 7b, las claves de autor `dkauthor1…`, con su firma Ed25519 y su fichero cifrado con scrypt, y el sellado del localizador y la creación del sobre, sobre el escritor de `age` de la 6a;
- fuera del plan, con la v0.15, las palabras al azar de la llave de palabras: las listas de palabras de `datekeys-go`, tomadas solo con su SHA-256 fijado y comprobadas con el alfabeto de su idioma, las palabras sacadas al azar de una y su fuerza en bits.
- fuera del plan, con la v0.15, las palabras al azar de la llave de palabras: las listas de palabras de `datekeys-go`, tomadas solo con su SHA-256 fijado y comprobadas con el alfabeto de su idioma, las palabras sacadas al azar de una y su fuerza en bits, y las de cinco dados cada una, con la lista numerada para los dados.
La librería ya abre cápsulas reales, de los tres formatos, con todas sus credenciales, y evalúa toda su área de seguridad como Go: la firma de `alg` 1, la de `alg` 2 con certificados, el sello de `seal_type` 2 y todos los veredictos de su forma. Y ya escribe cápsulas del formato 3, con todas sus credenciales, su firma y su sello, byte a byte como Go con los mismos valores aleatorios, y Go las abre. Firma con una clave de autor y sella localizadores. Y saca al azar las palabras de una llave de palabras de las listas de `datekeys-go`, que toma solo con su SHA-256 fijado.
La librería ya abre cápsulas reales, de los tres formatos, con todas sus credenciales, y evalúa toda su área de seguridad como Go: la firma de `alg` 1, la de `alg` 2 con certificados, el sello de `seal_type` 2 y todos los veredictos de su forma. Y ya escribe cápsulas del formato 3, con todas sus credenciales, su firma y su sello, byte a byte como Go con los mismos valores aleatorios, y Go las abre. Firma con una clave de autor y sella localizadores. Y saca al azar las palabras de una llave de palabras de las listas de `datekeys-go`, que toma solo con su SHA-256 fijado, o las da de unos dados.
Las etapas 2 y 3 se hicieron en paralelo, en ramas aparte desde la etapa 1, y se integraron el 5 de octubre de 2026. Las partes 4a y 4b también: la 4a, en la rama `stage4a`, se integró encima de la 4b el mismo día. La 4c se hizo después, en la rama `v0.11`, y la 5b también, en paralelo con la 5a, el lector de CMS, que se hizo en la rama `stage5a` y se integró encima de la 5b el mismo día. La 5c, que necesitaba las dos, se hizo después, en la rama `v0.11`. La 6a se hizo en la rama `v0.11`, en paralelo con la 7a, la lectura del localizador, en la rama `stage7a`. La 7a se integró encima de la 6a el mismo día. La 6b, el escritor de cápsulas, se hizo en la rama `v0.11`, en paralelo con la 7b, las claves de autor y el sellado del localizador, en la rama `stage7b`, desde `b23a0ee`. La 7b se integró encima de la 6b el mismo día.
@ -91,20 +91,21 @@ La especificación 0.15 da forma de dato al release de una ronda y distingue dos
### Las palabras al azar de la llave de palabras (v0.15)
El §38.1 pide que un escritor ofrezca por defecto palabras al azar de una lista pública: al menos 6 de una lista de 2048 o más. `datekeys-go` las añade en la rama `v0.15`, después del tag `spec-v0.15` (`c49c67c` y `27a75ee`), sin cambiar ningún formato ni ninguna derivación, y `wordlist.dart` las porta de `generate.go` de `wordkey` en `27a75ee`, con las mismas comprobaciones en el mismo orden y los mismos textos de error:
El §38.1 pide que un escritor ofrezca por defecto palabras al azar de una lista pública: al menos 6 de una lista de 2048 o más. `datekeys-go` las añade en la rama `v0.15`, después del tag `spec-v0.15` (`c49c67c` y `27a75ee`), y los dados en `92e7154`, sin cambiar ningún formato ni ninguna derivación, y `wordlist.dart` las porta de `generate.go` de `wordkey` en `27a75ee` y de `dice.go` en `92e7154`, con las mismas comprobaciones en el mismo orden y los mismos textos de error:
| Módulo | Contenido | En Go |
|---|---|---|
| `lib/src/wordlist.dart` | `readWordList`, las palabras del fichero de una lista; `wordListSha256`, el SHA-256 fijado de cada lista, y `wordListLanguages`; `checkWordList`, las reglas de una lista, con el alfabeto de su idioma; `generateWords`, las palabras sacadas al azar de una lista; `wordBits`, su fuerza en bits; y `defaultWordCount` y `minListSize` | `List`, `Languages`, `CheckList`, `Generate`, `Bits`, `DefaultCount` y `MinListSize` de `wordkey` |
| `lib/src/wordlist.dart` | `readWordList`, las palabras del fichero de una lista; `wordListSha256`, el SHA-256 fijado de cada lista, y `wordListLanguages`; `checkWordList`, las reglas de una lista, con el alfabeto de su idioma; `generateWords`, las palabras sacadas al azar de una lista; `wordBits`, su fuerza en bits; `defaultWordCount` y `minListSize`; y los dados: `diceWords`, las palabras de cinco dados cada una; `diceWord`, la de cinco dados; `diceNumber`, los dados de una posición; `diceList`, la lista numerada para los dados; y `diceListSize` | `List`, `Languages`, `CheckList`, `Generate`, `Bits`, `DefaultCount` y `MinListSize` de `wordkey`; y `DiceWords`, `DiceWord`, `DiceNumber`, `DiceList` y `DiceListSize` |
Notas:
- **Las listas no van en la librería.** Go las lleva dentro del módulo; aquí la app descarga o empaqueta el fichero de una lista, `wordkey/lists/<idioma>.txt` de `datekeys-go`, y se lo da a `readWordList`, que no se fía de él: su SHA-256 debe ser el de `wordListSha256`, con el texto «the list "es" has the SHA-256 …, not …», el mismo de `datekeys-ts`, y sus palabras deben pasar `checkWordList`. Una lista cambia solo con su hash. Hoy hay una, `es`: 7776 palabras, un borrador que todavía no ha revisado un hablante nativo. `wordlists/` tiene la copia de las listas (ver «Datos de prueba»).
- **Las listas no van en la librería.** Go las lleva dentro del módulo; aquí la app descarga o empaqueta el fichero de una lista, `wordkey/lists/<idioma>.txt` de `datekeys-go`, y se lo da a `readWordList`, que no se fía de él: su SHA-256 debe ser el de `wordListSha256`, con el texto «the list "es" has the SHA-256 …, not …», el mismo de `datekeys-ts`, y sus palabras deben pasar `checkWordList`. Una lista cambia solo con su hash. Hoy hay dos, de 7776 palabras cada una: `en`, la lista grande de la EFF, y `es`, un borrador que todavía no ha revisado un hablante nativo. `wordlists/` tiene la copia de las listas (ver «Datos de prueba»).
- **El alfabeto** de cada idioma lo da el código, nunca la lista: para `es`, de la `a` a la `z`, `á`, `é`, `í`, `ó`, `ú`, `ü` y `ñ`, en minúscula y NFC. Una letra de otra escritura que se parece a una de ellas, como la `а` cirílica (U+0430), se volvería a teclear con la latina, y la cápsula no se abriría. Tampoco pasan una mayúscula, una cifra, el CR de un fichero con líneas CRLF ni dos palabras que son una una vez normalizadas, como «papa» y «papá», que valdrían por una.
- **El sorteo** es el de Go: cada índice como lo saca `crypto/rand.Int`, con `randomIndex` de la parte 6a, y un índice que ya salió se saca otra vez, así que los mismos bytes dan las mismas palabras que Go. Son 7 palabras por defecto: 7 de 7776 son unos 90 bits (`wordBits`), y 6 de 2048, el mínimo, unos 66.
- **`wordBits`** suma el `math.Log2` de Go, portado: `Frexp` y el `Log` de FreeBSD que porta Go, con sus operaciones en su orden, así que el double es el de Go en la VM y en la web, bit a bit. El `log` de la plataforma no es el de Go, y `math.log(x) / math.ln2` no da exacto ni el log2 de 2^29 en la VM: la CLI de Go trunca los bits a un entero.
- **Los dados**, para quien no se fía de los números al azar de un ordenador: cinco dados por palabra, leídos en un orden fijo, dan un número de 11111 a 66666, la posición de la palabra en una lista de 7776 (`diceListSize`), el primer dado la cifra más significativa en base 6. `diceWord` toma cinco bytes, cada uno una cifra del 1 al 6, después de comprobar el tamaño de la lista. `diceWords` toma varios números separados por espacios, al menos 6, y nunca da dos veces la misma palabra: hay que volver a tirar los dados. Los números se separan como los separa `strings.Fields` de Go, en los espacios de `unicode.IsSpace`, que son los del §38.1 en los que `normalizeWords` separa las palabras, y nada más cambia: una cifra de ancho completo o una marca combinante no es un dado. Unos dados justos sacan cada palabra como `generateWords`, así que las palabras son igual de fuertes. `diceList` escribe la lista numerada para los dados, para imprimirla: una línea por palabra, con sus dados, un tabulador y la palabra, como publica la EFF la suya. Para `en`, sus bytes UTF-8 son el fichero de la EFF, byte a byte (SHA-256 `addd3553…`), y para `es` tienen el SHA-256 `611f779a…`, como los recoge `wordlists/README.md`.
- **Las diferencias con Go.** Una `RandomSource` no se acaba: lo que lance la fuente sale de `generateWords` tal cual, donde un `io.Reader` de Go que se acaba da `wordkey: EOF`. `readWordList` comprueba el SHA-256, que Go no necesita para sus listas. El fichero se lee como lee Go un string, como bytes: un byte que no es UTF-8 válido es U+FFFD, que ningún alfabeto tiene, así que la comprobación lo rechaza con el texto de Go, y las palabras que pasan se decodifican en estricto.
- **La licencia.** Las listas no son código: `es.txt` es una adaptación de FrequencyWords de Hermit Dave y tiene licencia CC BY-SA 4.0, no Apache-2.0. `wordlists/README.md`, copiado de Go, recoge su fuente, su método y su licencia.
- **Lo que se exporta.**`lib/datekeys.dart` exporta `readWordList`, `checkWordList`, `generateWords`, `wordBits`, `wordListSha256`, `wordListLanguages`, `defaultWordCount` y `minListSize`, como el paquete público `wordkey` de Go. `checkWordListUtf8`, sobre bytes, y `parseWordList`, `readWordList` sin el SHA-256, son internas, para las pruebas. `wordkey.dart` comparte con `wordlist.dart` la comprobación de cada runa, `checkWordRune`, también interna.
- **La licencia.** Las listas no son código: `en.txt` es material original de la EFF, con licencia CC BY 4.0, y `es.txt` es una adaptación de FrequencyWords de Hermit Dave y tiene licencia CC BY-SA 4.0, no Apache-2.0. `wordlists/README.md`, copiado de Go, recoge su fuente, su método y su licencia.
- **Lo que se exporta.**`lib/datekeys.dart` exporta `readWordList`, `checkWordList`, `generateWords`, `wordBits`, `wordListSha256`, `wordListLanguages`, `defaultWordCount` y `minListSize`, y `diceNumber`, `diceWord`, `diceWords`, `diceList` y `diceListSize`, como el paquete público `wordkey` de Go. `checkWordListUtf8`, `diceWordUtf8` y `diceWordsUtf8`, sobre bytes, y `parseWordList`, `readWordList` sin el SHA-256, son internas, para las pruebas. `wordkey.dart` comparte con `wordlist.dart` la comprobación de cada runa, `checkWordRune`, también interna.
La parte 4a de la etapa 4 porta `internal/pathrule` y `wordkey` de `datekeys-go` en `c531e93`, la cabeza de la rama `v0.12`, que sigue la v0.11 con las correcciones de la revisión del 2 de octubre; los dos paquetes no cambian desde el tag `spec-v0.11`. Tienen las mismas comprobaciones, en el mismo orden y con los mismos textos de error:
@ -599,12 +600,12 @@ tool/check.sh
## Datos de prueba
`testdata/` es una copia de `datekeys-go/testdata` en un commit fijo. `testdata/SOURCE.json` registra el commit y el SHA-256 de cada fichero, igual que en `datekeys-ts`. La copia actual es la de `datekeys-go` en `e671032`, la rama `v0.15` después del tag `spec-v0.15`, cuyo `testdata/` es el del tag, `fe50885`, byte a byte: 142 ficheros, con `release.json` y `releases/`, el objeto release, el JSON de drand y el archivo de releases de la v0.15, con el campo `source` de `mutations.json`, con `tlock_steps.json`, los pasos 10 y 11 de Quicknet valor a valor, con `resolved_ip.json`, con `wordkey.json`, los vectores compartidos de la llave de palabras, y los veredictos y las líneas de la v0.12. Cada fichero dice `"spec": "0.15"`, como el `SpecVersion` de Go.
`testdata/` es una copia de `datekeys-go/testdata` en un commit fijo. `testdata/SOURCE.json` registra el commit y el SHA-256 de cada fichero, igual que en `datekeys-ts`. La copia actual es la de `datekeys-go` en `92e7154`, la rama `v0.15` después del tag `spec-v0.15`, cuyo `testdata/` es el del tag, `fe50885`, byte a byte: 142 ficheros, con `release.json` y `releases/`, el objeto release, el JSON de drand y el archivo de releases de la v0.15, con el campo `source` de `mutations.json`, con `tlock_steps.json`, los pasos 10 y 11 de Quicknet valor a valor, con `resolved_ip.json`, con `wordkey.json`, los vectores compartidos de la llave de palabras, y los veredictos y las líneas de la v0.12. Cada fichero dice `"spec": "0.15"`, como el `SpecVersion` de Go.
`wordlists/` es la copia de `wordkey/lists` del mismo commit: las listas de palabras de `wordkey.Generate`, hoy `en.txt`, la de la EFF, y `es.txt`, y su `README.md`, con la fuente, el método y la licencia de cada lista. `wordlists/SOURCE.json` tiene el formato de `testdata/SOURCE.json`, y `.gitattributes` guarda sus bytes exactos, como los de `testdata/`: `lib/src/wordlist.dart` fija el SHA-256 de cada lista.
`wordlists/` es la copia de `wordkey/lists` del mismo commit: las listas de palabras de `wordkey.Generate`, hoy `en.txt`, la de la EFF, y `es.txt`, y su `README.md`, con la fuente, el método y la licencia de cada lista, y el SHA-256 de cada lista numerada para los dados. `wordlists/SOURCE.json` tiene el formato de `testdata/SOURCE.json`, y `.gitattributes` guarda sus bytes exactos, como los de `testdata/`: `lib/src/wordlist.dart` fija el SHA-256 de cada lista.
```bash
dart run tool/sync_testdata.dart sync --commit e671032
dart run tool/sync_testdata.dart sync --commit 92e7154
```
```bash
@ -614,7 +615,7 @@ dart run tool/sync_testdata.dart check --against ../datekeys-go
- `sync` copia los dos árboles del mismo commit y lee los ficheros con git, así que nunca entran cambios sin commit del repositorio de Go. Lo lee todo antes de tocar las copias, y un árbol que falta en el commit es un error.
- `check` comprueba los dos árboles con las mismas reglas, sin ficheros que falten, sobren o cambien, y escribe una línea por árbol, la de `testdata` primero.
- Los ficheros de `testdata/` y de `wordlists/` no se editan ni se generan aquí.
- En cada `dart test`, `test/testdata_test.dart` comprueba las dos copias, y que cada fichero de `testdata/` nombre `specVersion`. `test/wordlist_vm_test.dart` lee la lista española de `wordlists/` con `readWordList`.
- En cada `dart test`, `test/testdata_test.dart` comprueba las dos copias, y que cada fichero de `testdata/` nombre `specVersion`. `test/wordlist_vm_test.dart` lee las dos listas de `wordlists/` con `readWordList`, y numera las dos para los dados.
- `test/tlock_steps_vm_test.dart` recorre `tlock_steps.json` valor a valor con el código de la librería: M, H(M), la ecuación del emparejamiento, las partes del stanza, e(firma, U), H2, sigma, H4, la file key, cada intento de H3 y r, r·G2 = U, y las comprobaciones negativas del generador de Go (otro DST, la ronda sin SHA-256 y H3 que borra solo el bit más alto). `test/tlock_steps_test.dart` hace lo mismo compilado a JavaScript, sobre `test/vectors/tlock_steps.g.dart`, la copia del fichero que escribe `dart run tool/tlock_steps_copy.dart` tras cada `sync`; la prueba de la VM comprueba que es el fichero byte a byte.
- `test/release_object_vm_test.dart` recorre `release.json` caso a caso, con el resultado y el texto de Go: los objetos, con sus capas y el paso 10, el release que dice cada uno y su codificación otra vez byte a byte; el JSON de drand; y las búsquedas en el archivo. Comprueba además cada fichero de `releases/` y los textos de `provider.Archive` sobre archivos editados (`test/vectors/release_archive_texts.json`). `test/release_object_test.dart` hace lo mismo compilado a JavaScript, sobre `test/vectors/release.g.dart`, que escribe `dart run tool/release_copy.dart` tras cada `sync`.
- `test/open_corpus_test.dart` abre cada caso de `mutations.json` con su `source`: `supplied`, el objeto release de su `release` en `OpenOptions.release`, o `network`, una fuente que verifica el release y lo descarta si no cumple el paso 10, como `testkit` de Go.
El de las listas de palabras corre en una exportación del commit de `wordlists/SOURCE.json`, para que sus vectores sean los de esas listas: `tool/wordlist_go_vectors.go` lee `wordkey/lists` y da a `Generate`, en lugar de `crypto/rand`, el keystream de `SeededRandomSource`, bloques de SHA-256 o bytes que se acaban. La salida es la misma en cada ejecución:
El de las listas de palabras corre en una exportación del commit de `wordlists/SOURCE.json`, para que sus vectores sean los de esas listas: `tool/wordlist_go_vectors.go` lee `wordkey/lists`, da a `Generate`, en lugar de `crypto/rand`, el keystream de `SeededRandomSource`, bloques de SHA-256 o bytes que se acaban, y tira los dados sobre las listas de Go y sobre listas de índices. La salida es la misma en cada ejecución:
```bash
commit=$(git -C ../datekeys-go rev-parse e671032)
commit=$(git -C ../datekeys-go rev-parse 92e7154)
out=$PWD/test/vectors
tmp=$(mktemp -d)
git -C ../datekeys-go archive "$commit" | tar -x -C "$tmp"
@ -816,7 +817,7 @@ rm -rf "$tmp"
| `pathrule_vectors.g.dart` | El mismo JSON como constante de Dart |
| `wordkey_vectors.json` | La llave de palabras de `wordkey`: 400 textos con sus palabras, 515 listas de palabras con el resultado de `Check`, y cuatro llaves con su contraseña P y su sal S, el PBKDF2 de 1000 iteraciones para Node.js y el recipient; la primera es el vector del §38.1 |
| `wordkey_vectors.g.dart` | El mismo JSON como constante de Dart |
| `wordlist_vectors.json` | Las listas de palabras de `wordkey` (`generate.go`), en `e671032`: el SHA-256, los bytes y las palabras de cada lista de Go; el cuerpo de `List` sobre 19 textos de una lista base, con y sin el LF final, con líneas CRLF, una línea vacía, una marca de orden de bytes y bytes que no son UTF-8 válido; `CheckList` sobre 83 listas editadas, con los casos de `TestCheckList`; `CheckList` con cada punto de código de los planos 0, 1 y 14 en la primera palabra, como el SHA-256 de sus resultados, y uno a uno hasta U+017F; `Generate` en 51 casos, sobre la lista española y listas de 12 a 2^20 + 1 palabras, con el keystream de `SeededRandomSource`, bloques de SHA-256 y bytes que se acaban, entre ellos la semilla de `TestGenerate`, que solo saca dos índices y se queda sin bytes; y `Bits`, el double de Go bit a bit, en 221 casos y cuatro resúmenes |
| `wordlist_vectors.json` | Las listas de palabras de `wordkey` (`generate.go`) y sus dados (`dice.go`), en `92e7154`: el SHA-256, los bytes y las palabras de cada lista de Go; el cuerpo de `List` sobre 19 textos de una lista base, con y sin el LF final, con líneas CRLF, una línea vacía, una marca de orden de bytes y bytes que no son UTF-8 válido; `CheckList` sobre 83 listas editadas, con los casos de `TestCheckList`; `CheckList` con cada punto de código de los planos 0, 1 y 14 en la primera palabra, como el SHA-256 de sus resultados, y uno a uno hasta U+017F; `Generate` en 51 casos, sobre la lista española y listas de 12 a 2^20 + 1 palabras, con el keystream de `SeededRandomSource`, bloques de SHA-256 y bytes que se acaban, entre ellos la semilla de `TestGenerate`, que solo saca dos índices y se queda sin bytes; `Bits`, el double de Go bit a bit, en 221 casos y cuatro resúmenes; y los dados: `DiceNumber` en 24 posiciones; `DiceWord` en 63 casos y `DiceWords` en 78, sobre las listas de Go y sobre listas de índices, con los casos de `TestDiceWord` y `TestDiceWords`, cada espacio de `unicode.IsSpace` entre los números y puntos de código y bytes que no lo son, el orden de las comprobaciones, listas con una palabra más de una vez, también con caracteres que `%q` escapa, y listas de otro tamaño; el SHA-256 de `DiceList` de cada lista, el fichero de la EFF para `en`; y `DiceWords` con cada punto de código de los planos 0, 1 y 14 entre los dos primeros números, como el SHA-256 de sus resultados |
| `wordlist_vectors.g.dart` | El mismo JSON como constante de Dart |
| `mutation_texts.json` | De `tool/mutation_go_texts.go`, port de `scripts/mutation-go-texts.go` de `datekeys-ts` sobre el `testdata/` de este repositorio: el texto del error de `capsule.Open` en cada caso del corpus de mutaciones, `ok` si se abre, y sus comprobaciones con el detalle de cada paso. Si Go y el corpus discreparan en el código o el paso de un caso, lo diría con `go_error` y `go_step`: en ninguno de los 222 casos del corpus de la v0.15 lo hacen con Go en `fe50885`, que abre cada caso con su `source`, como `testkit` |
| `open_cases.json` | `capsule.Open` sobre cada fixture con cada una de sus credenciales, y sobre fixtures editados o con otras opciones en cada paso que el corpus no alcanza: la trama, los campos, las extensiones y los vínculos de una `.dkk` en el paso 9.a, el reloj y los fallos de la fuente del release, las cabeceras `age` de los pasos 11 y 17, un stanza X25519 mal formado en `INNER_ACCESS_AGE`, `CONTROL_CBOR` sellado otra vez, `BODY` del formato 3 sellado otra vez, los sinks y la salida que fallan, el rechazo de `Accept` y las extensiones inutilizables de cada objeto. Cada caso tiene el resultado, el texto, el paso, las comprobaciones con su detalle, las peticiones del release, el estado del sink y el contenido o los ficheros, y los del formato 3 que se abren, sus veredictos con sus líneas, también con la clave de autor guardada |
"description":"The word lists of package wordkey of the Go reference (generate.go, spec \u00a738.1) for lib/src/wordlist.dart; see tool/wordlist_go_vectors.go. Binary values and words are lower-case hex. The base list is word i = pal and three letters, a + i/676, a + i/26%26 and a + i%26; a case of size n takes its first n words, replaces the word at each at of set, and adds those of append. lists: the SHA-256, bytes and words of each built-in list. parse: the body of List on the text prefix, the base list joined by sep, and suffix (sha256 is that of the text): the words read, and ok or the error. check_list: CheckList, ok or the error (sha256 is that of the words joined by LF). alphabet: CheckList of the base list of 2048 whose first word is pala, a code point and zz, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, the code points of the words it accepts, and alphabet_results, each result up to U+017F. generate: Generate on the list of the Spanish words (list es) or on a list of size words whose indices they are, reading a stream: seeded, the keystream of SeededRandomSource of the seed; counter, SHA-256 of the label and a 32-bit big-endian counter from 0, block after block; bytes, hex repeated repeat times, which end. The indices drawn, the bytes read and the next four of an endless stream, or the error. bits: Bits, its shortest decimal and the hex of its float64. bits_digests: the SHA-256 of the 8 big-endian bytes of each Bits of the sizes and counts, inclusive, sizes outer.",
"description":"The word lists of package wordkey of the Go reference (generate.go and dice.go, spec \u00a738.1) for lib/src/wordlist.dart; see tool/wordlist_go_vectors.go. Binary values and words are lower-case hex. The base list is word i = pal and three letters, a + i/676, a + i/26%26 and a + i%26; a case of size n takes its first n words, replaces the word at each at of set, and adds those of append. lists: the SHA-256, bytes and words of each built-in list. parse: the body of List on the text prefix, the base list joined by sep, and suffix (sha256 is that of the text): the words read, and ok or the error. check_list: CheckList, ok or the error (sha256 is that of the words joined by LF). alphabet: CheckList of the base list of 2048 whose first word is pala, a code point and zz, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, the code points of the words it accepts, and alphabet_results, each result up to U+017F. generate: Generate on the list of the Spanish words (list es) or on a list of size words whose indices they are, reading a stream: seeded, the keystream of SeededRandomSource of the seed; counter, SHA-256 of the label and a 32-bit big-endian counter from 0, block after block; bytes, hex repeated repeat times, which end. The indices drawn, the bytes read and the next four of an endless stream, or the error. bits: Bits, its shortest decimal and the hex of its float64. bits_digests: the SHA-256 of the 8 big-endian bytes of each Bits of the sizes and counts, inclusive, sizes outer. dice_list_size: DiceListSize. dice_space: DiceWords of the text 11111, a code point and 11112 11113 11114 11115 11116 11121 on the list of the 7776 indices, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, and split, the code points at which the numbers are split. dice_number: DiceNumber of i, the dice or the error. dice_word and dice_words: DiceWord and DiceWords of the bytes dice, in hex, on the English or the Spanish list (list en or es) or on a list of size words, each its index in decimal, modulo mod if there is one, followed by suffix: the word or the words, as text, or the error. dice_list: DiceList of the list, the SHA-256 and the bytes of its text, or the error.",
"alphabet":{"word":"pala, the code point and zz, the first word of the base list of 2048","planes":[0,1,14],"count":194560,"sha256":"9119a1741586b087cc8fdcce99b00931d34c926f5dc54d7fa0ff250402a11ba9","ok":["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u00e1","\u00e9","\u00ed","\u00f1","\u00f3","\u00fa","\u00fc"]},
"dice_list_size":7776,
"dice_space":{"text":"11111, the code point and 11112 11113 11114 11115 11116 11121, on the list of the 7776 indices","planes":[0,1,14],"count":194560,"sha256":"cf34ff425b6da4822dd798828c6172861df2e8497502991bc96e67b36a9c64d1","split":[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288]},
{"name":"6 to 8 words of 2048 to 10000","sizes":[2048,10000],"counts":[6,8],"sha256":"9e055008813b6d2ec5b9477a777c44d30d650134cd890eeb679552403297332e"},
{"name":"0 to 600 words of 7776","sizes":[7776,7776],"counts":[0,600],"sha256":"b6e756155be0121f6db294a47b3dbb947652cc931fb078f1db5a9e39643c905a"},
{"name":"1 word of 2^32 - 4096 to 2^32 + 4096","sizes":[4294963200,4294971392],"counts":[1,1],"sha256":"a95430f39eda0ef2865e11d1b92c8b0e604e4a9387ac881905d77af880240d2d"}
],
"dice_number":[
{"i":0,"dice":"11111"},
{"i":1,"dice":"11112"},
{"i":5,"dice":"11116"},
{"i":6,"dice":"11121"},
{"i":35,"dice":"11166"},
{"i":36,"dice":"11211"},
{"i":215,"dice":"11666"},
{"i":216,"dice":"12111"},
{"i":1295,"dice":"16666"},
{"i":1296,"dice":"21111"},
{"i":2047,"dice":"24362"},
{"i":2048,"dice":"24363"},
{"i":3495,"dice":"35214"},
{"i":7774,"dice":"66665"},
{"i":7775,"dice":"66666"},
{"i":-1,"error":"wordkey: no dice give position -1 of a list of 7776 words"},
{"i":7776,"error":"wordkey: no dice give position 7776 of a list of 7776 words"},
{"i":7777,"error":"wordkey: no dice give position 7777 of a list of 7776 words"},
{"i":-7776,"error":"wordkey: no dice give position -7776 of a list of 7776 words"},
{"i":2147483648,"error":"wordkey: no dice give position 2147483648 of a list of 7776 words"},
{"i":-2147483648,"error":"wordkey: no dice give position -2147483648 of a list of 7776 words"},
{"i":4294967296,"error":"wordkey: no dice give position 4294967296 of a list of 7776 words"},
{"i":9007199254740991,"error":"wordkey: no dice give position 9007199254740991 of a list of 7776 words"},
{"i":-9007199254740991,"error":"wordkey: no dice give position -9007199254740991 of a list of 7776 words"}
{"name":"no dice","size":7776,"dice":"","error":"wordkey: \"\" is not five dice: five digits from 1 to 6"},
{"name":"four dice","size":7776,"dice":"31313131","error":"wordkey: \"1111\" is not five dice: five digits from 1 to 6"},
{"name":"six dice","size":7776,"dice":"313131313131","error":"wordkey: \"111111\" is not five dice: five digits from 1 to 6"},
{"name":"a 0","size":7776,"dice":"3131313130","error":"wordkey: \"11110\" is not five dice: five digits from 1 to 6"},
{"name":"a 7","size":7776,"dice":"3131313137","error":"wordkey: \"11117\" is not five dice: five digits from 1 to 6"},
{"name":"a letter","size":7776,"dice":"6131313131","error":"wordkey: \"a1111\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and a space","size":7776,"dice":"3131313120","error":"wordkey: \"1111 \" is not five dice: five digits from 1 to 6"},
{"name":"a full-width 1 and four dice","size":7776,"dice":"efbc9131313131","error":"wordkey: \"\uff111111\" is not five dice: five digits from 1 to 6"},
{"name":"a space and four dice","size":7776,"dice":"2031313131","error":"wordkey: \" 1111\" is not five dice: five digits from 1 to 6"},
{"name":"a space and five dice","size":7776,"dice":"203131313131","error":"wordkey: \" 11111\" is not five dice: five digits from 1 to 6"},
{"name":"five dice and a space","size":7776,"dice":"313131313120","error":"wordkey: \"11111 \" is not five dice: five digits from 1 to 6"},
{"name":"five dice and LF","size":7776,"dice":"31313131310a","error":"wordkey: \"11111\\n\" is not five dice: five digits from 1 to 6"},
{"name":"a tab and four dice","size":7776,"dice":"0931313131","error":"wordkey: \"\\t1111\" is not five dice: five digits from 1 to 6"},
{"name":"two and two dice around a space","size":7776,"dice":"3131203131","error":"wordkey: \"11 11\" is not five dice: five digits from 1 to 6"},
{"name":"NUL","size":7776,"dice":"3131313100","error":"wordkey: \"1111\\x00\" is not five dice: five digits from 1 to 6"},
{"name":"DEL","size":7776,"dice":"313131317f","error":"wordkey: \"1111\\x7f\" is not five dice: five digits from 1 to 6"},
{"name":"a quotation mark","size":7776,"dice":"3131313122","error":"wordkey: \"1111\\\"\" is not five dice: five digits from 1 to 6"},
{"name":"a backslash","size":7776,"dice":"313131315c","error":"wordkey: \"1111\\\\\" is not five dice: five digits from 1 to 6"},
{"name":"00000","size":7776,"dice":"3030303030","error":"wordkey: \"00000\" is not five dice: five digits from 1 to 6"},
{"name":"77777","size":7776,"dice":"3737373737","error":"wordkey: \"77777\" is not five dice: five digits from 1 to 6"},
{"name":"99999","size":7776,"dice":"3939393939","error":"wordkey: \"99999\" is not five dice: five digits from 1 to 6"},
{"name":"a slash, the byte before 0","size":7776,"dice":"313131312f","error":"wordkey: \"1111/\" is not five dice: five digits from 1 to 6"},
{"name":"a colon, the byte after 9","size":7776,"dice":"313131313a","error":"wordkey: \"1111:\" is not five dice: five digits from 1 to 6"},
{"name":"five full-width digits","size":7776,"dice":"efbc91efbc92efbc93efbc94efbc95","error":"wordkey: \"\uff11\uff12\uff13\uff14\uff15\" is not five dice: five digits from 1 to 6"},
{"name":"five Arabic-Indic digits","size":7776,"dice":"d9a1d9a2d9a3d9a4d9a5","error":"wordkey: \"\u0661\u0662\u0663\u0664\u0665\" is not five dice: five digits from 1 to 6"},
{"name":"a superscript 1","size":7776,"dice":"31313131c2b9","error":"wordkey: \"1111\u00b9\" is not five dice: five digits from 1 to 6"},
{"name":"a circled 1 and two dice: five bytes","size":7776,"dice":"e291a03131","error":"wordkey: \"\u246011\" is not five dice: five digits from 1 to 6"},
{"name":"a mathematical bold 1 and a die: five bytes","size":7776,"dice":"f09d9f8f31","error":"wordkey: \"\ud835\udfcf1\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and an e with an acute accent: five characters","size":7776,"dice":"31313131c3a9","error":"wordkey: \"1111\u00e9\" is not five dice: five digits from 1 to 6"},
{"name":"three dice and an e with an acute accent: five bytes","size":7776,"dice":"313131c3a9","error":"wordkey: \"111\u00e9\" is not five dice: five digits from 1 to 6"},
{"name":"five dice and a combining acute accent","size":7776,"dice":"3131313131cc81","error":"wordkey: \"11111\u0301\" is not five dice: five digits from 1 to 6"},
{"name":"three dice and the emoji of a die: five UTF-16 code units","size":7776,"dice":"313131f09f8eb2","error":"wordkey: \"111\ud83c\udfb2\" is not five dice: five digits from 1 to 6"},
{"name":"NBSP and four dice","size":7776,"dice":"c2a031313131","error":"wordkey: \"\\u00a01111\" is not five dice: five digits from 1 to 6"},
{"name":"an ideographic space and five dice","size":7776,"dice":"e380803131313131","error":"wordkey: \"\\u300011111\" is not five dice: five digits from 1 to 6"},
{"name":"two dice and a surrogate in UTF-8 bytes: five bytes","size":7776,"dice":"3131eda080","error":"wordkey: \"11\\xed\\xa0\\x80\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and a byte that is not valid UTF-8","size":7776,"dice":"31313131ff","error":"wordkey: \"1111\\xff\" is not five dice: five digits from 1 to 6"},
{"name":"five bytes that are not valid UTF-8","size":7776,"dice":"fffefdfcfb","error":"wordkey: \"\\xff\\xfe\\xfd\\xfc\\xfb\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and a sequence cut short","size":7776,"dice":"31313131c3","error":"wordkey: \"1111\\xc3\" is not five dice: five digits from 1 to 6"},
{"name":"\"11111\" on a list of 2048 words","size":2048,"dice":"3131313131","error":"wordkey: dice draw from a list of 7776 words, not 2048"},
{"name":"\"11111\" on a list of 7775 words","size":7775,"dice":"3131313131","error":"wordkey: dice draw from a list of 7776 words, not 7775"},
{"name":"\"66666\" on a list of 7777 words","size":7777,"dice":"3636363636","error":"wordkey: dice draw from a list of 7776 words, not 7777"},
{"name":"\"\" on a list of 0 words","size":0,"dice":"","error":"wordkey: dice draw from a list of 7776 words, not 0"},
{"name":"\"x\" on a list of 1 words","size":1,"dice":"78","error":"wordkey: dice draw from a list of 7776 words, not 1"}
],
"dice_words":[
{"name":"en, seven numbers among white space","list":"en","size":7776,"dice":"2031313131312031313131320931313131330a313131313420313131313520313131313620313131323120","words":["abacus","abdomen","abdominal","abide","abiding","ability","ablaze"]},
{"name":"en, five numbers","list":"en","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135","error":"wordkey: a key of words needs at least 6 words, not 5"},
{"name":"en, no numbers","list":"en","size":7776,"dice":"","error":"wordkey: a key of words needs at least 6 words, not 0"},
{"name":"en, four dice","list":"en","size":7776,"dice":"31313131312031313131322031313131332031313131342031313131352031313136","error":"wordkey: \"1116\" is not five dice: five digits from 1 to 6"},
{"name":"en, 11111 twice","list":"en","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135203131313131","error":"wordkey: the dice 11111 give \"abacus\" a second time; roll them again"},
{"name":"en, a comma between two numbers","list":"en","size":7776,"dice":"31313131312c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111,11112\" is not five dice: five digits from 1 to 6"},
{"name":"seven numbers among white space","size":7776,"dice":"2031313131312031313131320931313131330a313131313420313131313520313131313620313131323120","words":["0","1","2","3","4","5","6"]},
{"name":"five numbers","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135","error":"wordkey: a key of words needs at least 6 words, not 5"},
{"name":"no numbers","size":7776,"dice":"","error":"wordkey: a key of words needs at least 6 words, not 0"},
{"name":"four dice","size":7776,"dice":"31313131312031313131322031313131332031313131342031313131352031313136","error":"wordkey: \"1116\" is not five dice: five digits from 1 to 6"},
{"name":"11111 twice","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135203131313131","error":"wordkey: the dice 11111 give \"0\" a second time; roll them again"},
{"name":"a comma between two numbers","size":7776,"dice":"31313131312c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111,11112\" is not five dice: five digits from 1 to 6"},
{"name":"a list of 7775 words","size":7775,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136","error":"wordkey: dice draw from a list of 7776 words, not 7775"},
{"name":"es, 66666 twice","list":"es","size":7776,"dice":"3636363636203131313131203335323134203132333435203534333231203233343536203636363636","error":"wordkey: the dice 66666 give \"\u00fatil\" a second time; roll them again"},
{"name":"white space only","size":7776,"dice":"20090ac2a0e3808020","error":"wordkey: a key of words needs at least 6 words, not 0"},
{"name":"U+0009 between the numbers","size":7776,"dice":"3131313131093131313132093131313133093131313134093131313135093131313136093131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000A between the numbers","size":7776,"dice":"31313131310a31313131320a31313131330a31313131340a31313131350a31313131360a3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000B between the numbers","size":7776,"dice":"31313131310b31313131320b31313131330b31313131340b31313131350b31313131360b3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000C between the numbers","size":7776,"dice":"31313131310c31313131320c31313131330c31313131340c31313131350c31313131360c3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000D between the numbers","size":7776,"dice":"31313131310d31313131320d31313131330d31313131340d31313131350d31313131360d3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+0020 between the numbers","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+0085 between the numbers","size":7776,"dice":"3131313131c2853131313132c2853131313133c2853131313134c2853131313135c2853131313136c2853131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+00A0 between the numbers","size":7776,"dice":"3131313131c2a03131313132c2a03131313133c2a03131313134c2a03131313135c2a03131313136c2a03131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+1680 between the numbers","size":7776,"dice":"3131313131e19a803131313132e19a803131313133e19a803131313134e19a803131313135e19a803131313136e19a803131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2000 between the numbers","size":7776,"dice":"3131313131e280803131313132e280803131313133e280803131313134e280803131313135e280803131313136e280803131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2001 between the numbers","size":7776,"dice":"3131313131e280813131313132e280813131313133e280813131313134e280813131313135e280813131313136e280813131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2002 between the numbers","size":7776,"dice":"3131313131e280823131313132e280823131313133e280823131313134e280823131313135e280823131313136e280823131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2003 between the numbers","size":7776,"dice":"3131313131e280833131313132e280833131313133e280833131313134e280833131313135e280833131313136e280833131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2004 between the numbers","size":7776,"dice":"3131313131e280843131313132e280843131313133e280843131313134e280843131313135e280843131313136e280843131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2005 between the numbers","size":7776,"dice":"3131313131e280853131313132e280853131313133e280853131313134e280853131313135e280853131313136e280853131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2006 between the numbers","size":7776,"dice":"3131313131e280863131313132e280863131313133e280863131313134e280863131313135e280863131313136e280863131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2007 between the numbers","size":7776,"dice":"3131313131e280873131313132e280873131313133e280873131313134e280873131313135e280873131313136e280873131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2008 between the numbers","size":7776,"dice":"3131313131e280883131313132e280883131313133e280883131313134e280883131313135e280883131313136e280883131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2009 between the numbers","size":7776,"dice":"3131313131e280893131313132e280893131313133e280893131313134e280893131313135e280893131313136e280893131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+200A between the numbers","size":7776,"dice":"3131313131e2808a3131313132e2808a3131313133e2808a3131313134e2808a3131313135e2808a3131313136e2808a3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2028 between the numbers","size":7776,"dice":"3131313131e280a83131313132e280a83131313133e280a83131313134e280a83131313135e280a83131313136e280a83131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2029 between the numbers","size":7776,"dice":"3131313131e280a93131313132e280a93131313133e280a93131313134e280a93131313135e280a93131313136e280a93131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+202F between the numbers","size":7776,"dice":"3131313131e280af3131313132e280af3131313133e280af3131313134e280af3131313135e280af3131313136e280af3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+205F between the numbers","size":7776,"dice":"3131313131e2819f3131313132e2819f3131313133e2819f3131313134e2819f3131313135e2819f3131313136e2819f3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+3000 between the numbers","size":7776,"dice":"3131313131e380803131313132e380803131313133e380803131313134e380803131313135e380803131313136e380803131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+001C between the first two numbers","size":7776,"dice":"31313131311c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1c11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+001D between the first two numbers","size":7776,"dice":"31313131311d3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1d11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+001E between the first two numbers","size":7776,"dice":"31313131311e3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1e11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+001F between the first two numbers","size":7776,"dice":"31313131311f3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1f11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+00AD between the first two numbers","size":7776,"dice":"3131313131c2ad3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u00ad11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+0301 between the first two numbers","size":7776,"dice":"3131313131cc813131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u030111112\" is not five dice: five digits from 1 to 6"},
{"name":"U+180E between the first two numbers","size":7776,"dice":"3131313131e1a08e3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u180e11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+200B between the first two numbers","size":7776,"dice":"3131313131e2808b3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u200b11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+200C between the first two numbers","size":7776,"dice":"3131313131e2808c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u200c11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+200D between the first two numbers","size":7776,"dice":"3131313131e2808d3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u200d11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+2060 between the first two numbers","size":7776,"dice":"3131313131e281a03131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u206011112\" is not five dice: five digits from 1 to 6"},
{"name":"U+2800 between the first two numbers","size":7776,"dice":"3131313131e2a0803131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u280011112\" is not five dice: five digits from 1 to 6"},
{"name":"U+3164 between the first two numbers","size":7776,"dice":"3131313131e385a43131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u316411112\" is not five dice: five digits from 1 to 6"},
{"name":"U+FEFF between the first two numbers","size":7776,"dice":"3131313131efbbbf3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\ufeff11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+FFFD between the first two numbers","size":7776,"dice":"3131313131efbfbd3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\ufffd11112\" is not five dice: five digits from 1 to 6"},
{"name":"the byte A0 alone, which is not NBSP","size":7776,"dice":"3131313131a03131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\xa011112\" is not five dice: five digits from 1 to 6"},
{"name":"the byte 85 alone, which is not NEL","size":7776,"dice":"3131313131853131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x8511112\" is not five dice: five digits from 1 to 6"},
{"name":"a byte that is not valid UTF-8 after a number","size":7776,"dice":"3131313131ff203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\xff\" is not five dice: five digits from 1 to 6"},
{"name":"a surrogate in UTF-8 bytes after a number","size":7776,"dice":"3131313131eda080203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\xed\\xa0\\x80\" is not five dice: five digits from 1 to 6"},
{"name":"five full-width digits","size":7776,"dice":"efbc91efbc91efbc91efbc91efbc91203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"\uff11\uff11\uff11\uff11\uff11\" is not five dice: five digits from 1 to 6"},
{"name":"a combining acute accent after a number","size":7776,"dice":"3131313131cc81203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u0301\" is not five dice: five digits from 1 to 6"},
{"name":"a combining acute accent before a number","size":7776,"dice":"cc813131313131203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"\u030111111\" is not five dice: five digits from 1 to 6"},
{"name":"five fields that are not dice: the count first","size":7776,"dice":"612062206320642065","error":"wordkey: a key of words needs at least 6 words, not 5"},
{"name":"six fields, the first not dice","size":7776,"dice":"616263203131313131203131313132203131313133203131313134203131313135","error":"wordkey: \"abc\" is not five dice: five digits from 1 to 6"},
{"name":"not dice before a word given twice","size":7776,"dice":"313131313120313131313220616263203131313131203131313133203131313134","error":"wordkey: \"abc\" is not five dice: five digits from 1 to 6"},
{"name":"a word given twice before not dice","size":7776,"dice":"313131313120313131313220313131313320313131313420313131313520313131313120616263","error":"wordkey: the dice 11111 give \"0\" a second time; roll them again"},
{"name":"indices modulo 1: 11112 11113 11114 11115 11116 11121","size":7776,"mod":1,"dice":"3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: the dice 11113 give \"0\" a second time; roll them again"},
{"name":"indices modulo 7: 11111 11112 11113 11114 11115 11116 11121 11122","size":7776,"mod":7,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231203131313232","error":"wordkey: the dice 11122 give \"0\" a second time; roll them again"},
{"name":"indices modulo 1000: 11111 11112 11113 11114 11115 15455","size":7776,"mod":1000,"dice":"3131313131203131313132203131313133203131313134203131313135203135343535","error":"wordkey: the dice 15455 give \"0\" a second time; roll them again"},
{"name":"indices modulo 7 and a suffix: 11111 11112 11113 11114 11115 11116 11121","size":7776,"mod":7,"suffix":"\"\\\t\u00a0\u200b","dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231","words":["0\"\\\t\u00a0\u200b","1\"\\\t\u00a0\u200b","2\"\\\t\u00a0\u200b","3\"\\\t\u00a0\u200b","4\"\\\t\u00a0\u200b","5\"\\\t\u00a0\u200b","6\"\\\t\u00a0\u200b"]},
{"name":"indices modulo 7 and a suffix: 11111 11112 11113 11114 11115 11116 11121 11122","size":7776,"mod":7,"suffix":"\"\\\t\u00a0\u200b","dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231203131313232","error":"wordkey: the dice 11122 give \"0\\\"\\\\\\t\\u00a0\\u200b\" a second time; roll them again"},
{"name":"\"\" on a list of 0 words","size":0,"dice":"","error":"wordkey: dice draw from a list of 7776 words, not 0"},
{"name":"\"11111 11112 11113 11114 11115 11116 11121\" on a list of 2048 words","size":2048,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: dice draw from a list of 7776 words, not 2048"},
{"name":"\"x\" on a list of 7777 words","size":7777,"dice":"78","error":"wordkey: dice draw from a list of 7776 words, not 7777"}
"description":"The word lists of package wordkey of the Go reference (generate.go, spec \u00a738.1) for lib/src/wordlist.dart; see tool/wordlist_go_vectors.go. Binary values and words are lower-case hex. The base list is word i = pal and three letters, a + i/676, a + i/26%26 and a + i%26; a case of size n takes its first n words, replaces the word at each at of set, and adds those of append. lists: the SHA-256, bytes and words of each built-in list. parse: the body of List on the text prefix, the base list joined by sep, and suffix (sha256 is that of the text): the words read, and ok or the error. check_list: CheckList, ok or the error (sha256 is that of the words joined by LF). alphabet: CheckList of the base list of 2048 whose first word is pala, a code point and zz, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, the code points of the words it accepts, and alphabet_results, each result up to U+017F. generate: Generate on the list of the Spanish words (list es) or on a list of size words whose indices they are, reading a stream: seeded, the keystream of SeededRandomSource of the seed; counter, SHA-256 of the label and a 32-bit big-endian counter from 0, block after block; bytes, hex repeated repeat times, which end. The indices drawn, the bytes read and the next four of an endless stream, or the error. bits: Bits, its shortest decimal and the hex of its float64. bits_digests: the SHA-256 of the 8 big-endian bytes of each Bits of the sizes and counts, inclusive, sizes outer.",
"description":"The word lists of package wordkey of the Go reference (generate.go and dice.go, spec \u00a738.1) for lib/src/wordlist.dart; see tool/wordlist_go_vectors.go. Binary values and words are lower-case hex. The base list is word i = pal and three letters, a + i/676, a + i/26%26 and a + i%26; a case of size n takes its first n words, replaces the word at each at of set, and adds those of append. lists: the SHA-256, bytes and words of each built-in list. parse: the body of List on the text prefix, the base list joined by sep, and suffix (sha256 is that of the text): the words read, and ok or the error. check_list: CheckList, ok or the error (sha256 is that of the words joined by LF). alphabet: CheckList of the base list of 2048 whose first word is pala, a code point and zz, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, the code points of the words it accepts, and alphabet_results, each result up to U+017F. generate: Generate on the list of the Spanish words (list es) or on a list of size words whose indices they are, reading a stream: seeded, the keystream of SeededRandomSource of the seed; counter, SHA-256 of the label and a 32-bit big-endian counter from 0, block after block; bytes, hex repeated repeat times, which end. The indices drawn, the bytes read and the next four of an endless stream, or the error. bits: Bits, its shortest decimal and the hex of its float64. bits_digests: the SHA-256 of the 8 big-endian bytes of each Bits of the sizes and counts, inclusive, sizes outer. dice_list_size: DiceListSize. dice_space: DiceWords of the text 11111, a code point and 11112 11113 11114 11115 11116 11121 on the list of the 7776 indices, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, and split, the code points at which the numbers are split. dice_number: DiceNumber of i, the dice or the error. dice_word and dice_words: DiceWord and DiceWords of the bytes dice, in hex, on the English or the Spanish list (list en or es) or on a list of size words, each its index in decimal, modulo mod if there is one, followed by suffix: the word or the words, as text, or the error. dice_list: DiceList of the list, the SHA-256 and the bytes of its text, or the error.",
"alphabet":{"word":"pala, the code point and zz, the first word of the base list of 2048","planes":[0,1,14],"count":194560,"sha256":"9119a1741586b087cc8fdcce99b00931d34c926f5dc54d7fa0ff250402a11ba9","ok":["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u00e1","\u00e9","\u00ed","\u00f1","\u00f3","\u00fa","\u00fc"]},
"dice_list_size":7776,
"dice_space":{"text":"11111, the code point and 11112 11113 11114 11115 11116 11121, on the list of the 7776 indices","planes":[0,1,14],"count":194560,"sha256":"cf34ff425b6da4822dd798828c6172861df2e8497502991bc96e67b36a9c64d1","split":[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288]},
{"name":"6 to 8 words of 2048 to 10000","sizes":[2048,10000],"counts":[6,8],"sha256":"9e055008813b6d2ec5b9477a777c44d30d650134cd890eeb679552403297332e"},
{"name":"0 to 600 words of 7776","sizes":[7776,7776],"counts":[0,600],"sha256":"b6e756155be0121f6db294a47b3dbb947652cc931fb078f1db5a9e39643c905a"},
{"name":"1 word of 2^32 - 4096 to 2^32 + 4096","sizes":[4294963200,4294971392],"counts":[1,1],"sha256":"a95430f39eda0ef2865e11d1b92c8b0e604e4a9387ac881905d77af880240d2d"}
],
"dice_number":[
{"i":0,"dice":"11111"},
{"i":1,"dice":"11112"},
{"i":5,"dice":"11116"},
{"i":6,"dice":"11121"},
{"i":35,"dice":"11166"},
{"i":36,"dice":"11211"},
{"i":215,"dice":"11666"},
{"i":216,"dice":"12111"},
{"i":1295,"dice":"16666"},
{"i":1296,"dice":"21111"},
{"i":2047,"dice":"24362"},
{"i":2048,"dice":"24363"},
{"i":3495,"dice":"35214"},
{"i":7774,"dice":"66665"},
{"i":7775,"dice":"66666"},
{"i":-1,"error":"wordkey: no dice give position -1 of a list of 7776 words"},
{"i":7776,"error":"wordkey: no dice give position 7776 of a list of 7776 words"},
{"i":7777,"error":"wordkey: no dice give position 7777 of a list of 7776 words"},
{"i":-7776,"error":"wordkey: no dice give position -7776 of a list of 7776 words"},
{"i":2147483648,"error":"wordkey: no dice give position 2147483648 of a list of 7776 words"},
{"i":-2147483648,"error":"wordkey: no dice give position -2147483648 of a list of 7776 words"},
{"i":4294967296,"error":"wordkey: no dice give position 4294967296 of a list of 7776 words"},
{"i":9007199254740991,"error":"wordkey: no dice give position 9007199254740991 of a list of 7776 words"},
{"i":-9007199254740991,"error":"wordkey: no dice give position -9007199254740991 of a list of 7776 words"}
{"name":"no dice","size":7776,"dice":"","error":"wordkey: \"\" is not five dice: five digits from 1 to 6"},
{"name":"four dice","size":7776,"dice":"31313131","error":"wordkey: \"1111\" is not five dice: five digits from 1 to 6"},
{"name":"six dice","size":7776,"dice":"313131313131","error":"wordkey: \"111111\" is not five dice: five digits from 1 to 6"},
{"name":"a 0","size":7776,"dice":"3131313130","error":"wordkey: \"11110\" is not five dice: five digits from 1 to 6"},
{"name":"a 7","size":7776,"dice":"3131313137","error":"wordkey: \"11117\" is not five dice: five digits from 1 to 6"},
{"name":"a letter","size":7776,"dice":"6131313131","error":"wordkey: \"a1111\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and a space","size":7776,"dice":"3131313120","error":"wordkey: \"1111 \" is not five dice: five digits from 1 to 6"},
{"name":"a full-width 1 and four dice","size":7776,"dice":"efbc9131313131","error":"wordkey: \"\uff111111\" is not five dice: five digits from 1 to 6"},
{"name":"a space and four dice","size":7776,"dice":"2031313131","error":"wordkey: \" 1111\" is not five dice: five digits from 1 to 6"},
{"name":"a space and five dice","size":7776,"dice":"203131313131","error":"wordkey: \" 11111\" is not five dice: five digits from 1 to 6"},
{"name":"five dice and a space","size":7776,"dice":"313131313120","error":"wordkey: \"11111 \" is not five dice: five digits from 1 to 6"},
{"name":"five dice and LF","size":7776,"dice":"31313131310a","error":"wordkey: \"11111\\n\" is not five dice: five digits from 1 to 6"},
{"name":"a tab and four dice","size":7776,"dice":"0931313131","error":"wordkey: \"\\t1111\" is not five dice: five digits from 1 to 6"},
{"name":"two and two dice around a space","size":7776,"dice":"3131203131","error":"wordkey: \"11 11\" is not five dice: five digits from 1 to 6"},
{"name":"NUL","size":7776,"dice":"3131313100","error":"wordkey: \"1111\\x00\" is not five dice: five digits from 1 to 6"},
{"name":"DEL","size":7776,"dice":"313131317f","error":"wordkey: \"1111\\x7f\" is not five dice: five digits from 1 to 6"},
{"name":"a quotation mark","size":7776,"dice":"3131313122","error":"wordkey: \"1111\\\"\" is not five dice: five digits from 1 to 6"},
{"name":"a backslash","size":7776,"dice":"313131315c","error":"wordkey: \"1111\\\\\" is not five dice: five digits from 1 to 6"},
{"name":"00000","size":7776,"dice":"3030303030","error":"wordkey: \"00000\" is not five dice: five digits from 1 to 6"},
{"name":"77777","size":7776,"dice":"3737373737","error":"wordkey: \"77777\" is not five dice: five digits from 1 to 6"},
{"name":"99999","size":7776,"dice":"3939393939","error":"wordkey: \"99999\" is not five dice: five digits from 1 to 6"},
{"name":"a slash, the byte before 0","size":7776,"dice":"313131312f","error":"wordkey: \"1111/\" is not five dice: five digits from 1 to 6"},
{"name":"a colon, the byte after 9","size":7776,"dice":"313131313a","error":"wordkey: \"1111:\" is not five dice: five digits from 1 to 6"},
{"name":"five full-width digits","size":7776,"dice":"efbc91efbc92efbc93efbc94efbc95","error":"wordkey: \"\uff11\uff12\uff13\uff14\uff15\" is not five dice: five digits from 1 to 6"},
{"name":"five Arabic-Indic digits","size":7776,"dice":"d9a1d9a2d9a3d9a4d9a5","error":"wordkey: \"\u0661\u0662\u0663\u0664\u0665\" is not five dice: five digits from 1 to 6"},
{"name":"a superscript 1","size":7776,"dice":"31313131c2b9","error":"wordkey: \"1111\u00b9\" is not five dice: five digits from 1 to 6"},
{"name":"a circled 1 and two dice: five bytes","size":7776,"dice":"e291a03131","error":"wordkey: \"\u246011\" is not five dice: five digits from 1 to 6"},
{"name":"a mathematical bold 1 and a die: five bytes","size":7776,"dice":"f09d9f8f31","error":"wordkey: \"\ud835\udfcf1\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and an e with an acute accent: five characters","size":7776,"dice":"31313131c3a9","error":"wordkey: \"1111\u00e9\" is not five dice: five digits from 1 to 6"},
{"name":"three dice and an e with an acute accent: five bytes","size":7776,"dice":"313131c3a9","error":"wordkey: \"111\u00e9\" is not five dice: five digits from 1 to 6"},
{"name":"five dice and a combining acute accent","size":7776,"dice":"3131313131cc81","error":"wordkey: \"11111\u0301\" is not five dice: five digits from 1 to 6"},
{"name":"three dice and the emoji of a die: five UTF-16 code units","size":7776,"dice":"313131f09f8eb2","error":"wordkey: \"111\ud83c\udfb2\" is not five dice: five digits from 1 to 6"},
{"name":"NBSP and four dice","size":7776,"dice":"c2a031313131","error":"wordkey: \"\\u00a01111\" is not five dice: five digits from 1 to 6"},
{"name":"an ideographic space and five dice","size":7776,"dice":"e380803131313131","error":"wordkey: \"\\u300011111\" is not five dice: five digits from 1 to 6"},
{"name":"two dice and a surrogate in UTF-8 bytes: five bytes","size":7776,"dice":"3131eda080","error":"wordkey: \"11\\xed\\xa0\\x80\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and a byte that is not valid UTF-8","size":7776,"dice":"31313131ff","error":"wordkey: \"1111\\xff\" is not five dice: five digits from 1 to 6"},
{"name":"five bytes that are not valid UTF-8","size":7776,"dice":"fffefdfcfb","error":"wordkey: \"\\xff\\xfe\\xfd\\xfc\\xfb\" is not five dice: five digits from 1 to 6"},
{"name":"four dice and a sequence cut short","size":7776,"dice":"31313131c3","error":"wordkey: \"1111\\xc3\" is not five dice: five digits from 1 to 6"},
{"name":"\"11111\" on a list of 2048 words","size":2048,"dice":"3131313131","error":"wordkey: dice draw from a list of 7776 words, not 2048"},
{"name":"\"11111\" on a list of 7775 words","size":7775,"dice":"3131313131","error":"wordkey: dice draw from a list of 7776 words, not 7775"},
{"name":"\"66666\" on a list of 7777 words","size":7777,"dice":"3636363636","error":"wordkey: dice draw from a list of 7776 words, not 7777"},
{"name":"\"\" on a list of 0 words","size":0,"dice":"","error":"wordkey: dice draw from a list of 7776 words, not 0"},
{"name":"\"x\" on a list of 1 words","size":1,"dice":"78","error":"wordkey: dice draw from a list of 7776 words, not 1"}
],
"dice_words":[
{"name":"en, seven numbers among white space","list":"en","size":7776,"dice":"2031313131312031313131320931313131330a313131313420313131313520313131313620313131323120","words":["abacus","abdomen","abdominal","abide","abiding","ability","ablaze"]},
{"name":"en, five numbers","list":"en","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135","error":"wordkey: a key of words needs at least 6 words, not 5"},
{"name":"en, no numbers","list":"en","size":7776,"dice":"","error":"wordkey: a key of words needs at least 6 words, not 0"},
{"name":"en, four dice","list":"en","size":7776,"dice":"31313131312031313131322031313131332031313131342031313131352031313136","error":"wordkey: \"1116\" is not five dice: five digits from 1 to 6"},
{"name":"en, 11111 twice","list":"en","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135203131313131","error":"wordkey: the dice 11111 give \"abacus\" a second time; roll them again"},
{"name":"en, a comma between two numbers","list":"en","size":7776,"dice":"31313131312c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111,11112\" is not five dice: five digits from 1 to 6"},
{"name":"seven numbers among white space","size":7776,"dice":"2031313131312031313131320931313131330a313131313420313131313520313131313620313131323120","words":["0","1","2","3","4","5","6"]},
{"name":"five numbers","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135","error":"wordkey: a key of words needs at least 6 words, not 5"},
{"name":"no numbers","size":7776,"dice":"","error":"wordkey: a key of words needs at least 6 words, not 0"},
{"name":"four dice","size":7776,"dice":"31313131312031313131322031313131332031313131342031313131352031313136","error":"wordkey: \"1116\" is not five dice: five digits from 1 to 6"},
{"name":"11111 twice","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135203131313131","error":"wordkey: the dice 11111 give \"0\" a second time; roll them again"},
{"name":"a comma between two numbers","size":7776,"dice":"31313131312c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111,11112\" is not five dice: five digits from 1 to 6"},
{"name":"a list of 7775 words","size":7775,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136","error":"wordkey: dice draw from a list of 7776 words, not 7775"},
{"name":"es, 66666 twice","list":"es","size":7776,"dice":"3636363636203131313131203335323134203132333435203534333231203233343536203636363636","error":"wordkey: the dice 66666 give \"\u00fatil\" a second time; roll them again"},
{"name":"white space only","size":7776,"dice":"20090ac2a0e3808020","error":"wordkey: a key of words needs at least 6 words, not 0"},
{"name":"U+0009 between the numbers","size":7776,"dice":"3131313131093131313132093131313133093131313134093131313135093131313136093131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000A between the numbers","size":7776,"dice":"31313131310a31313131320a31313131330a31313131340a31313131350a31313131360a3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000B between the numbers","size":7776,"dice":"31313131310b31313131320b31313131330b31313131340b31313131350b31313131360b3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000C between the numbers","size":7776,"dice":"31313131310c31313131320c31313131330c31313131340c31313131350c31313131360c3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+000D between the numbers","size":7776,"dice":"31313131310d31313131320d31313131330d31313131340d31313131350d31313131360d3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+0020 between the numbers","size":7776,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+0085 between the numbers","size":7776,"dice":"3131313131c2853131313132c2853131313133c2853131313134c2853131313135c2853131313136c2853131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+00A0 between the numbers","size":7776,"dice":"3131313131c2a03131313132c2a03131313133c2a03131313134c2a03131313135c2a03131313136c2a03131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+1680 between the numbers","size":7776,"dice":"3131313131e19a803131313132e19a803131313133e19a803131313134e19a803131313135e19a803131313136e19a803131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2000 between the numbers","size":7776,"dice":"3131313131e280803131313132e280803131313133e280803131313134e280803131313135e280803131313136e280803131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2001 between the numbers","size":7776,"dice":"3131313131e280813131313132e280813131313133e280813131313134e280813131313135e280813131313136e280813131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2002 between the numbers","size":7776,"dice":"3131313131e280823131313132e280823131313133e280823131313134e280823131313135e280823131313136e280823131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2003 between the numbers","size":7776,"dice":"3131313131e280833131313132e280833131313133e280833131313134e280833131313135e280833131313136e280833131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2004 between the numbers","size":7776,"dice":"3131313131e280843131313132e280843131313133e280843131313134e280843131313135e280843131313136e280843131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2005 between the numbers","size":7776,"dice":"3131313131e280853131313132e280853131313133e280853131313134e280853131313135e280853131313136e280853131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2006 between the numbers","size":7776,"dice":"3131313131e280863131313132e280863131313133e280863131313134e280863131313135e280863131313136e280863131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2007 between the numbers","size":7776,"dice":"3131313131e280873131313132e280873131313133e280873131313134e280873131313135e280873131313136e280873131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2008 between the numbers","size":7776,"dice":"3131313131e280883131313132e280883131313133e280883131313134e280883131313135e280883131313136e280883131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2009 between the numbers","size":7776,"dice":"3131313131e280893131313132e280893131313133e280893131313134e280893131313135e280893131313136e280893131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+200A between the numbers","size":7776,"dice":"3131313131e2808a3131313132e2808a3131313133e2808a3131313134e2808a3131313135e2808a3131313136e2808a3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2028 between the numbers","size":7776,"dice":"3131313131e280a83131313132e280a83131313133e280a83131313134e280a83131313135e280a83131313136e280a83131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+2029 between the numbers","size":7776,"dice":"3131313131e280a93131313132e280a93131313133e280a93131313134e280a93131313135e280a93131313136e280a93131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+202F between the numbers","size":7776,"dice":"3131313131e280af3131313132e280af3131313133e280af3131313134e280af3131313135e280af3131313136e280af3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+205F between the numbers","size":7776,"dice":"3131313131e2819f3131313132e2819f3131313133e2819f3131313134e2819f3131313135e2819f3131313136e2819f3131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+3000 between the numbers","size":7776,"dice":"3131313131e380803131313132e380803131313133e380803131313134e380803131313135e380803131313136e380803131313231","words":["0","1","2","3","4","5","6"]},
{"name":"U+001C between the first two numbers","size":7776,"dice":"31313131311c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1c11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+001D between the first two numbers","size":7776,"dice":"31313131311d3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1d11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+001E between the first two numbers","size":7776,"dice":"31313131311e3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1e11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+001F between the first two numbers","size":7776,"dice":"31313131311f3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x1f11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+00AD between the first two numbers","size":7776,"dice":"3131313131c2ad3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u00ad11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+0301 between the first two numbers","size":7776,"dice":"3131313131cc813131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u030111112\" is not five dice: five digits from 1 to 6"},
{"name":"U+180E between the first two numbers","size":7776,"dice":"3131313131e1a08e3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u180e11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+200B between the first two numbers","size":7776,"dice":"3131313131e2808b3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u200b11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+200C between the first two numbers","size":7776,"dice":"3131313131e2808c3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u200c11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+200D between the first two numbers","size":7776,"dice":"3131313131e2808d3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u200d11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+2060 between the first two numbers","size":7776,"dice":"3131313131e281a03131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\u206011112\" is not five dice: five digits from 1 to 6"},
{"name":"U+2800 between the first two numbers","size":7776,"dice":"3131313131e2a0803131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u280011112\" is not five dice: five digits from 1 to 6"},
{"name":"U+3164 between the first two numbers","size":7776,"dice":"3131313131e385a43131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u316411112\" is not five dice: five digits from 1 to 6"},
{"name":"U+FEFF between the first two numbers","size":7776,"dice":"3131313131efbbbf3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\ufeff11112\" is not five dice: five digits from 1 to 6"},
{"name":"U+FFFD between the first two numbers","size":7776,"dice":"3131313131efbfbd3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\ufffd11112\" is not five dice: five digits from 1 to 6"},
{"name":"the byte A0 alone, which is not NBSP","size":7776,"dice":"3131313131a03131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\xa011112\" is not five dice: five digits from 1 to 6"},
{"name":"the byte 85 alone, which is not NEL","size":7776,"dice":"3131313131853131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\x8511112\" is not five dice: five digits from 1 to 6"},
{"name":"a byte that is not valid UTF-8 after a number","size":7776,"dice":"3131313131ff203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\xff\" is not five dice: five digits from 1 to 6"},
{"name":"a surrogate in UTF-8 bytes after a number","size":7776,"dice":"3131313131eda080203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\\xed\\xa0\\x80\" is not five dice: five digits from 1 to 6"},
{"name":"five full-width digits","size":7776,"dice":"efbc91efbc91efbc91efbc91efbc91203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"\uff11\uff11\uff11\uff11\uff11\" is not five dice: five digits from 1 to 6"},
{"name":"a combining acute accent after a number","size":7776,"dice":"3131313131cc81203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"11111\u0301\" is not five dice: five digits from 1 to 6"},
{"name":"a combining acute accent before a number","size":7776,"dice":"cc813131313131203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: \"\u030111111\" is not five dice: five digits from 1 to 6"},
{"name":"five fields that are not dice: the count first","size":7776,"dice":"612062206320642065","error":"wordkey: a key of words needs at least 6 words, not 5"},
{"name":"six fields, the first not dice","size":7776,"dice":"616263203131313131203131313132203131313133203131313134203131313135","error":"wordkey: \"abc\" is not five dice: five digits from 1 to 6"},
{"name":"not dice before a word given twice","size":7776,"dice":"313131313120313131313220616263203131313131203131313133203131313134","error":"wordkey: \"abc\" is not five dice: five digits from 1 to 6"},
{"name":"a word given twice before not dice","size":7776,"dice":"313131313120313131313220313131313320313131313420313131313520313131313120616263","error":"wordkey: the dice 11111 give \"0\" a second time; roll them again"},
{"name":"indices modulo 1: 11112 11113 11114 11115 11116 11121","size":7776,"mod":1,"dice":"3131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: the dice 11113 give \"0\" a second time; roll them again"},
{"name":"indices modulo 7: 11111 11112 11113 11114 11115 11116 11121 11122","size":7776,"mod":7,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231203131313232","error":"wordkey: the dice 11122 give \"0\" a second time; roll them again"},
{"name":"indices modulo 1000: 11111 11112 11113 11114 11115 15455","size":7776,"mod":1000,"dice":"3131313131203131313132203131313133203131313134203131313135203135343535","error":"wordkey: the dice 15455 give \"0\" a second time; roll them again"},
{"name":"indices modulo 7 and a suffix: 11111 11112 11113 11114 11115 11116 11121","size":7776,"mod":7,"suffix":"\"\\\t\u00a0\u200b","dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231","words":["0\"\\\t\u00a0\u200b","1\"\\\t\u00a0\u200b","2\"\\\t\u00a0\u200b","3\"\\\t\u00a0\u200b","4\"\\\t\u00a0\u200b","5\"\\\t\u00a0\u200b","6\"\\\t\u00a0\u200b"]},
{"name":"indices modulo 7 and a suffix: 11111 11112 11113 11114 11115 11116 11121 11122","size":7776,"mod":7,"suffix":"\"\\\t\u00a0\u200b","dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231203131313232","error":"wordkey: the dice 11122 give \"0\\\"\\\\\\t\\u00a0\\u200b\" a second time; roll them again"},
{"name":"\"\" on a list of 0 words","size":0,"dice":"","error":"wordkey: dice draw from a list of 7776 words, not 0"},
{"name":"\"11111 11112 11113 11114 11115 11116 11121\" on a list of 2048 words","size":2048,"dice":"3131313131203131313132203131313133203131313134203131313135203131313136203131313231","error":"wordkey: dice draw from a list of 7776 words, not 2048"},
{"name":"\"x\" on a list of 7777 words","size":7777,"dice":"78","error":"wordkey: dice draw from a list of 7776 words, not 7777"}
returndiceSpaceHead{"11111, the code point and 11112 11113 11114 11115 11116 11121, on the list of the 7776 indices",planes,count,hex.EncodeToString(digest.Sum(nil)),split}
{"description","The word lists of package wordkey of the Go reference (generate.go, spec \u00a738.1) for lib/src/wordlist.dart; see tool/wordlist_go_vectors.go. " +
{"description","The word lists of package wordkey of the Go reference (generate.go and dice.go, spec \u00a738.1) for lib/src/wordlist.dart; see tool/wordlist_go_vectors.go. " +
"Binary values and words are lower-case hex. The base list is word i = pal and three letters, a + i/676, a + i/26%26 and a + i%26; a case of size n takes its first n words, replaces the word at each at of set, and adds those of append. "+
"lists: the SHA-256, bytes and words of each built-in list. parse: the body of List on the text prefix, the base list joined by sep, and suffix (sha256 is that of the text): the words read, and ok or the error. "+
"check_list: CheckList, ok or the error (sha256 is that of the words joined by LF). alphabet: CheckList of the base list of 2048 whose first word is pala, a code point and zz, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, the code points of the words it accepts, and alphabet_results, each result up to U+017F. "+
"generate: Generate on the list of the Spanish words (list es) or on a list of size words whose indices they are, reading a stream: seeded, the keystream of SeededRandomSource of the seed; counter, SHA-256 of the label and a 32-bit big-endian counter from 0, block after block; bytes, hex repeated repeat times, which end. The indices drawn, the bytes read and the next four of an endless stream, or the error. "+
"bits: Bits, its shortest decimal and the hex of its float64. bits_digests: the SHA-256 of the 8 big-endian bytes of each Bits of the sizes and counts, inclusive, sizes outer."},
"bits: Bits, its shortest decimal and the hex of its float64. bits_digests: the SHA-256 of the 8 big-endian bytes of each Bits of the sizes and counts, inclusive, sizes outer. "+
"dice_list_size: DiceListSize. dice_space: DiceWords of the text 11111, a code point and 11112 11113 11114 11115 11116 11121 on the list of the 7776 indices, for each code point of the planes but the surrogates: the SHA-256 of the lines U+XXXX result, and split, the code points at which the numbers are split. "+
"dice_number: DiceNumber of i, the dice or the error. dice_word and dice_words: DiceWord and DiceWords of the bytes dice, in hex, on the English or the Spanish list (list en or es) or on a list of size words, each its index in decimal, modulo mod if there is one, followed by suffix: the word or the words, as text, or the error. "+
"dice_list: DiceList of the list, the SHA-256 and the bytes of its text, or the error."},