# Artifacts *State on 6 October 2026. Paths are relative to each repository.* ## 1. Repositories and frozen commits | Repository | Role | Frozen at | Language of docs | |---|---|---|---| | `datekeys-go` | Specification (`spec/`), CDDL, shared test data (`testdata/`), reference implementation in Go: library and CLI | tag `spec-v0.14`, commit `39b2033e3ccf54a91bda8d7e3ced39b26dbfa58c` | English README (a Spanish one too); spec in Spanish | | `datekeys-ts` | TypeScript library and static pages `/inspect` and `/create` | tag `v0.3.0`, commit `3abd7bfee88d5e5c09bda20fcec8a4762d6beb19` (implements spec 0.14) | Spanish README | | `datekeys-dart` | Pure Dart library, for a future Flutter app | branch `v0.14`, commit `013b0695228bae6a4a61e244e679d38f2b8b93fd` | Spanish README | - The repositories are private, on a Gitea server on the author's LAN (`g.activething.com`). They are not reachable from outside. The author will provide them by another means (for example `git bundle` files or archives); see `NOTA_PARA_EL_AUTOR.md`. - The gates of `datekeys-ts` and `datekeys-dart` compare their `testdata/` with a sibling checkout `../datekeys-go`. Lay the three out side by side: ```text work/ datekeys-go/ at spec-v0.14 datekeys-ts/ at v0.3.0 (the author's machine names this folder App) datekeys-dart/ at 013b069 ``` Specification files at the tag: | File | SHA-256 | |---|---| | `spec/DateKeys_Protocol_Specification_v0.14.md` (4 412 lines, about 52 600 words, Spanish) | `390922135931dd61a263ed90259c7a978b5d92944405e641e94cc194f84fb459` | | `spec/datekeys.cddl` (322 lines, English comments) | `35c6e5fb74d65907bcb436242079bcc99cfb81a654a1174f2cac68576bf24a51` at the tag; `9607d1c7ebd2c09df3969a2749a588cf39bc24fe49a05a5f308b798a3ca621fa` at `22f184c`, which changes only its header comment | `spec/README.md` lists the SHA-256 of every frozen version from v0.8.2 to v0.14. Earlier versions are in the same folder; §76 records each normative change with its reproducible case. The specification is CC-BY-4.0; the code is Apache-2.0. ## 2. Build and gates ### datekeys-go (Go 1.26.8) ```bash cd datekeys-go scripts/check.sh # the local gate, without fuzzing scripts/check.sh 20s # and every fuzz target for 20 s each FUZZ_PARALLEL=4 scripts/fuzz.sh 60s # fuzzing only go test -tags interop ./capsule # the official age and tle CLIs open our files go test -tags integration ./capsule ./provider/drand # live Quicknet (network) ``` `scripts/check.sh` runs, in order: `gofmt`; `go mod verify`; `go mod tidy` leaves `go.mod` and `go.sum` unchanged; `go vet`; `go test -race`; coverage of at least 90 % in `codec`, `capsule`, `accesskey`, `datekey` and `agewrap`; `govulncheck` v1.8.0 (downloads the tool); and `genfixtures`, which regenerates `testdata/` and fails if any committed file changes. `scripts/fuzz.sh` has 26 targets: `codec` (Decoder, Walk, Peek, Unmarshal, EncodeImpliesWalk), `extension` (DecodeArray), `profile` (Decode), `datekey` (Parse), `agewrap` (Stanzas), `accesskey` (Decode), `capsule` (ParsePrelude, DecodeHeader, DecodeControl, DecodeHead, EvaluateSecurity, Inspect, EncodeImpliesDecode), `internal/pathrule` (CheckPath), `locator` (Unmarshal, ParseInfo, CheckURI, CheckResolvedIP), `internal/der` (DERCheck), `internal/cms` (ParseSignature, ParseToken, ParseCert). Each worker keeps a 100 MB shared-memory file in the temporary directory. Last recorded run: 60 s per target on `69dbb0c`, clean (`docs/HANDOFF.md`, 6 October 2026). The CLI (`cmd/datekeys`) has `encrypt`, `decrypt`, `inspect`, `author keygen`, `author public`, `profile hash`, `datekey resolve` and `version` (`README.md`). On 6 October 2026, `scripts/fuzz.sh 20s` ran the 26 targets on `39b2033`, the frozen commit, with no failing input. ### datekeys-ts (Node.js 20 or later) ```bash cd datekeys-ts npm ci npm run verify # svelte-check, typecheck, tests with coverage thresholds, build and its check npm run testdata:check # testdata/ equals ../datekeys-go at the recorded commit ``` Coverage thresholds are 100 % for the cryptographic and format modules listed in its README. A guard test fails if a file of `testdata/` is not used by any test, and `src/lib/dependencies.test.ts` pins the exact runtime dependencies. On 6 October 2026, `npm run verify` passed with 8 030 tests on `3abd7bf`, the release commit of 0.3.0. ### datekeys-dart (Dart SDK 3.13 or later; Node.js for the JavaScript run) ```bash cd datekeys-dart dart pub get tool/check.sh # dart format, dart analyze --fatal-infos, dart test, dart test -p node, # and testdata/ against ../datekeys-go ``` On 6 October 2026 the gate passed with 2 193 tests on the VM and 681 on Node (`docs/HANDOFF.md`). ## 3. Shared test vectors (`datekeys-go/testdata/`) Generated by the reference implementation (`go run ./internal/testkit/genfixtures -out testdata`). The `.dkc` and `.dkk` fixtures, `security_cms.json` and `locator.json` hold randomness and are frozen. TypeScript and Dart copy `testdata/` from a Go commit and never generate fixtures. Every file says `"spec": "0.14"`. The format of each file is documented in `testdata/README.md` (1 063 lines, English), so that no Go code needs to be read. | File | Content | Spec | |---|---|---| | `vectors/profile_quicknet.json` | Quicknet Provider Profile: canonical CBOR and `profile_hash` | §11, §12 | | `vectors/quicknet_rounds.json` | date → round resolution | §15, §16, §65 | | `vectors/dk1.json` | canonical `dk1_` strings, and rejected encodings with their code | §18, §19, §66 | | `vectors/cbor.json` | the CBOR profile, and one block of vectors per schema, CONTROL_CBOR in the three formats | §58, CDDL | | `vectors/tlock_ibe.json` | H2 of the tlock IBE: the serialisation of a GT element | §63 step 11 | | `vectors/tlock_steps.json` | steps 10 and 11 for Quicknet value by value: round message, hash to G1, and the decryption of a tlock stanza with H2, H4, H3 and the file key | §63 steps 10 and 11 (v0.14) | | `vectors/padding.json` | padding of formats 2 and 3: P for each L, and the PAYLOAD_AGE length | §29.1 | | `vectors/paths.json` | the paths of a format 3 head: rules of one entry, and of the paths of a head | §29.5 | | `vectors/path_fold.json` | the R7 key of segments, and their NFD | §29.5, §29.5.1 | | `vectors/head_schema.json` | format 3 heads and the result of decoding them | §29.4 to §29.6, §69.1 | | `vectors/security.json` | security areas in the context of a capsule, their verdicts and lines | §29.3, §29.7, §29.9 | | `vectors/security_cms.json` | security areas with an `alg` 2 signature or a `seal_type` 2 seal, with context, verdicts, results and lines | §29.7, §29.10, §29.11 | | `vectors/ed25519_strict.json` | Ed25519 signatures and the result of the strict profile | §29.9 | | `vectors/note.json` | public note data and the result of its rules | §24.1, §29.6 | | `vectors/resolved_ip.json` | the IP a locator name resolves to, NAT64 included, and whether a reader may connect | §44.1 (v0.13) | | `vectors/wordkey.json` | key of words: the words of a text, what a writer refuses, the derived identity | §38.1, §64 | | `vectors/locator.json` | the `datekeys.capsule` extension, its envelope and locator, and what a reader rejects and uses | §44.1, §64 | | `vectors/mutations.json` | the mutation corpus: the 178 mutations of §64 and further cases | §63, §64 | | `vectors/inspect_differential.json` | 5 110 mutations of fourteen fixtures with the verdict of steps 1 to 8 | §63 | | `fixtures/.dkc`, `.json` | official capsules and every intermediate value | §67 | | `fixtures/.dkk`, `.dkk.json` | official access keys | §68 | | `fixtures/.plaintext` | the content of each capsule (formats 1 and 2: the content; format 3: BODY) | §67 | | `fixtures/.inspect.json` | the exact output of `datekeys inspect -json` | §63 | Twenty-six official capsules (`testdata/README.md`): five of format 1 (v0.8.2, compatibility), seven of format 2 (v0.9, compatibility) and fourteen of format 3, among them `format3_signed` (`alg` 1, F4), `format3_signed_cms` (`alg` 2, two signers, ECDSA P-256 and RSA 2048, CAdES-T each, F6), `format3_sealed` (`alg` 1 and an RFC 3161 seal, S4) and `format3_note`. Each record embeds the published Quicknet signature that opens it, so every fixture decrypts offline. Test secrets (`payload_identity`, `access_material`, the seed of the test author key) are in the records on purpose. ## 4. Dependencies ### Go (`datekeys-go/go.mod`, Go 1.26.8) Direct: | Module | Version | Role (`SECURITY.md`) | |---|---|---| | `filippo.io/age` | v1.3.2 | age files, X25519, STREAM, header MAC; scrypt for author key files | | `github.com/drand/tlock` | v1.2.0 | `TimeLock`, `TimeUnlock`, ciphertext encoding | | `github.com/drand/drand/v2` | v2.1.7 | BLS verification, chain-info hash | | `github.com/drand/kyber` | v1.3.2 | pairing, IBE | | `github.com/drand/kyber-bls12381` | v0.3.4 | BLS12-381 on kilic | | `golang.org/x/crypto` | v0.57.0 | required for GO-2026-6354 and GO-2026-6355 | Indirect: `filippo.io/hpke` v0.4.0, `github.com/BurntSushi/toml` v1.6.0, `github.com/kilic/bls12-381` v0.1.0 (archived), `github.com/nikkolasg/hexjson` v0.1.0, `go.dedis.ch/fixbuf` v1.0.3, `go.uber.org/multierr` v1.11.0, `go.uber.org/zap` v1.28.0, `golang.org/x/net` v0.58.0, `golang.org/x/sys` v0.48.0, `golang.org/x/text` v0.42.0, `google.golang.org/genproto/googleapis/rpc` (2026-07-06 pseudo-version), `google.golang.org/grpc` v1.84.0, `google.golang.org/protobuf` v1.36.11, `gopkg.in/yaml.v3` v3.0.1. gRPC and protobuf come in through `drand/v2` `common/chain` (`SECURITY.md`). The Go standard library provides Ed25519 (with strict checks in `internal/ed25519strict`), RSA, ECDSA, SHA-2 and PBKDF2. CBOR (`codec`), DER (`internal/der`) and the CMS/X.509/RFC 3161 reader (`internal/cms`) are the module's own code. ### TypeScript (`datekeys-ts/package.json` at `v0.3.0`, exact versions) Runtime: | Package | Version | Role | |---|---|---| | `age-encryption` | 0.3.1 | the three age files, with own tlock `Identity` and `Recipient`; scrypt for author key files | | `@noble/curves` | 2.4.0 | BLS12-381 (IBE and release verification), X25519, Ed25519 arithmetic, ECDSA P-256/384/521 | | `@noble/hashes` | 2.4.0 | SHA-1, SHA-2, HKDF | | `@noble/ciphers` | 2.4.0 | ChaCha20-Poly1305 | `age-encryption` brings `@scure/base` 2.4.0 and `@noble/post-quantum` 0.5.4, which carries its own `@noble/curves` and `@noble/hashes` 2.0.1. The IBE core (`ibe.ts`) is derived from `tlock-js` (MIT); `tlock-js` itself is not a dependency. Development: TypeScript 5.9.3, Vitest 5.0.1, Vite 8.3.0, Svelte 5.57.1, SvelteKit 2.70.3, svelte-check 4.7.6, adapter-static 3.0.10, `@types/node` 24.13.6. ### Dart (`datekeys-dart/pubspec.yaml` and `pubspec.lock` at `013b069`) - Runtime: `crypto` 3.0.7 (SHA-1, SHA-2, HMAC), with `typed_data` 1.4.0 transitive. Everything else is own code: HKDF, PBKDF2, scrypt, ChaCha20-Poly1305, X25519, Ed25519, BLS12-381, ECDSA, RSA, DER, CMS and CBOR. - Development: `test` 1.31.1 or later (`^1.31.1`). - SDK: Dart `>=3.13.0 <4.0.0`. ## 5. Traceability `datekeys-go/docs/traceability.md` (258 lines) maps every normative section of the specification to the Go code that implements it and the tests that exercise it, row by row from §3 to §76, and marks cases of §64 not yet in the repository as *pending*. It is intended for the external reviewer. Brought up to v0.14 at `22f184c` (branch `v0.14`): the title and the row §12.1, which lists the one scheme of v0.14 (§76 v0.14 change 7). The same commit fixed `datekeys-go/README.md` (one drand scheme, 19 normative errors), `SECURITY.md` (no release exists yet) and the header comment of `spec/datekeys.cddl`. ## 6. Other documents a reviewer may want All in the private `docs` repository; in Spanish: - `REVISION_completitud_protocolo.md`: completeness review against v0.8.2 (29 September 2026), AI-assisted. - `REVISION_completitud_v0.13.md`: completeness review against v0.13 (6 October 2026), AI-assisted. - `spec_v0.14/decisiones.md`: the ten decisions of the v0.14 draft. - `spec_v0.10/revision_fable.md`, `spec_v0.11/revision_fable_astra.md`: reviews by the AI systems Fable and Astra.