The author approved specification v0.16 on 7 October 2026, tagged
spec-v0.16 at b6ff17a. Only the annex changes, with the SHA-256 of the
approved text, and so does its generated constant, and the README of
testdata; the README and the CHANGELOG name the approved version.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
specVersion is 0.16, and testdata, wordlists and annex are synced with
datekeys-go at 3fd0e93 (branch v0.16, the draft v0.16): 150 files, with
the two fixtures of v0.16, security_cms.json made again (143 cases, with
seal_reason), 26 cases of drand's JSON in release.json, the annex vector in
wordkey.json, and the annex of the draft. The code follows 4f78854; 3fd0e93
only restores the escapes of the JSON vectors.
A valid seal is S4 only when its token carries accuracy and t plus the
accuracy is before round_time; otherwise S5, with the first reason that
holds: late, no accuracy under the BTSP policy of ETSI EN 319 421, or no
accuracy (spec v0.16, 29.7, 29.11), as 7e3b810 of Go. cms.Token gains
hasAccuracy, policy and btsp; SealReason, Detail.sealReason and
SignerLine.reason carry the reason, and the lines of S5 and of a signer of
F6 say it with the texts of Go. A CmsEvaluator that gives S5 without a
reason or S4 with one is out of range: S2. EncryptResult.security gives the
verdicts of the area the writer wrote, as Result.Security, so that the app
warns of a seal that proves nothing before the opening date (rule 19).
drand's JSON is read strictly, as b570338 of Go: parseDrandJson, exported,
reads RFC 8259 JSON in valid UTF-8 whose value is an object, with no name
repeated in any object, names compared exactly after their escapes are
decoded, no lone surrogate escape, a round without sign, fraction or
exponent from 1 to 2^53 - 1 (compared as text at 16 digits, exact on the
web), and string signature and randomness. The error texts are those of
Go. A round above 2^53 - 1 is no longer a difference with Go.
Tests: the new fixtures (format3_time_and_key_words opens with the identity
of its words_text, as TestFixtureWords; format3_full_chunk is one full
STREAM chunk), the annex vector of wordkey.json, seal_reason in every case
of security_cms.json, the reasons and their lines, the token fields, and
TestStrictJSON and TestJSONRound of Go, also compiled to JavaScript.
Vectors regenerated by the Go programs of tool/ in an export of datekeys-go
at 4f78854: security and securitycms (reasons, BTSP tokens, an accuracy of
0 seconds and an empty one; the part for Node.js has each reason), the CMS
files (has_accuracy, policy and btsp of each token, oidBTSP, the new
corpus), the capsule writer (sealed with an accuracy of a second, two
recipes without accuracy, Result.Security), and the formats, open,
mutation, IBE and age fixture vectors, for the new fixtures and the spec
field.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tool/sync_testdata.dart also copies every blob under annex/ of the same
commit of Go into annex/, with a SOURCE.json in the format of
testdata/SOURCE.json, after reading every blob of the three trees; check
verifies it with the same rules, also against the repository, and prints a
third line, annex: N files match ... test/testdata_test.dart checks the annex
tree and its line too, and tool/check.sh names it.
Synced at aefc8f6, the branch v0.15 after the tag spec-v0.15, which adds
annex/recovery.md, the text of datekeys.RecoveryAnnex: §79 of the
specification under a title with its version and SHA-256, which the official
SDK saves next to each .dkc (spec §62.1, rule 27). The files of testdata and
wordlists do not change, only the commit of their SOURCE.json.
.gitattributes keeps the exact bytes of annex/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
testdata and wordlists at datekeys-go e671032, with the same testdata:
wordlists/en.txt is the large wordlist of the EFF, 7776 words, CC BY 4.0,
in its order and without the dice numbers. wordListSha256 pins it, and
the alphabet of en is a to z and the hyphen of its four compound words,
as Go has them. The vectors are generated again by Go at e671032: only
their source and the list of lists change. The tests read the English
list too, and check the hyphen and the accent in each alphabet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tool/sync_testdata.dart also copies every blob under wordkey/lists of the
same commit of Go into wordlists/, with a SOURCE.json in the format of
testdata/SOURCE.json, after reading every blob of both trees; a tree missing
at the commit is an error. check verifies both trees with the same rules,
also against the repository, and prints one line per tree, testdata first;
test/testdata_test.dart checks the wordlists tree and its line too.
Synced at 27a75ee, the branch v0.15 after the tag spec-v0.15: the 142 files
of testdata are those of the tag, byte for byte, so that only the commit of
testdata/SOURCE.json changes; wordlists/ holds README.md and es.txt, the
Spanish list, whose SHA-256 is the one that wordlist.dart pins. The list is
CC BY-SA 4.0, an adaptation of FrequencyWords by Hermit Dave, unlike the
code; its README, copied from Go, records its source, method and license.
.gitattributes keeps the exact bytes of wordlists/.
wordlist_vm_test.dart reads the Spanish list with readWordList, as
TestBuiltInLists of Go, draws from it the words of Go, and runs TestGenerate
and TestGenerateUniform with the CSPRNG of the platform.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>