scripts/recovery opens a time_and_key capsule with the words of a key of words (-words FILE), as the annex says in 79.7: the normalization without tables for the text of the DateKeys lists (printable ASCII, the ASCII spaces, á é í ó ú ü ñ and their capitals, and the marks U+0300 to U+036F), and for any other text the full one, NFD, without the marks, simple lower case and the spaces of 38.1, from UnicodeData.txt of Unicode 18.0.0 (-unicodedata FILE), checked by its SHA-256; then PBKDF2-HMAC-SHA256 of the standard library. Its tests check both normalizations against every case of wordkey.json and the two vectors of the annex. Two fixtures of v0.16: format3_time_and_key_words, opened with the text of the second vector of the annex, recorded in words_text with the identity it gives; and format3_full_chunk, whose BODY and P are 65536 bytes, so that PAYLOAD_AGE ends in a full STREAM chunk (79.5). recovery_check.sh opens both. wordkey.json gains the text of the annex, also with its marks apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>main
parent
b57033813d
commit
7ef9e61c60
@ -0,0 +1,220 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"crypto/pbkdf2"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// The key of words (annex 79.7, spec §38.1): words give the X25519 identity
|
||||
// of a credential of a time_and_key capsule.
|
||||
//
|
||||
// P = the words, normalized, in UTF-8, separated by a space
|
||||
// S = "DateKeys llave de palabras v2|" || chain_hash || "|" || round || "|" || capsule_id
|
||||
// id = PBKDF2-HMAC-SHA256(P, S, 600000 iterations, 32 bytes)
|
||||
//
|
||||
// with the chain hash and capsule_id in lower-case hexadecimal and the round
|
||||
// in decimal.
|
||||
|
||||
const wordKeyIterations = 600000
|
||||
|
||||
// wordKey derives the identity of the words of the capsule.
|
||||
func wordKey(words []string, round uint64, capsuleID []byte) ([]byte, error) {
|
||||
p := strings.Join(words, " ")
|
||||
s := "DateKeys llave de palabras v2|" + quicknetChainHash + "|" + strconv.FormatUint(round, 10) + "|" + hex.EncodeToString(capsuleID)
|
||||
return pbkdf2.Key(sha256.New, p, []byte(s), wordKeyIterations, 32)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// The normalization without tables (79.7): for a text of printable ASCII,
|
||||
// the ASCII spaces, á, é, í, ó, ú, ü, ñ and their capitals, and the marks
|
||||
// U+0300 to U+036F, which is what any word of the DateKeys lists gives. It
|
||||
// is exactly the normalization of §38.1 for that text.
|
||||
|
||||
// latinBase maps the letters of the recipe to their base letter, in lower
|
||||
// case.
|
||||
var latinBase = map[rune]rune{
|
||||
0x00e1: 'a', 0x00c1: 'a', // á Á
|
||||
0x00e9: 'e', 0x00c9: 'e', // é É
|
||||
0x00ed: 'i', 0x00cd: 'i', // í Í
|
||||
0x00f3: 'o', 0x00d3: 'o', // ó Ó
|
||||
0x00fa: 'u', 0x00fc: 'u', 0x00da: 'u', 0x00dc: 'u', // ú ü Ú Ü
|
||||
0x00f1: 'n', 0x00d1: 'n', // ñ Ñ
|
||||
}
|
||||
|
||||
func asciiSpace(r rune) bool { return r == ' ' || r >= 0x09 && r <= 0x0d }
|
||||
|
||||
// normalizeSimple applies the recipe without tables, and returns false when
|
||||
// the text holds a character outside it.
|
||||
func normalizeSimple(text string) ([]string, bool) {
|
||||
var sb strings.Builder
|
||||
for _, r := range text {
|
||||
switch {
|
||||
case r >= 0x300 && r <= 0x36f: // 1. the marks go
|
||||
case latinBase[r] != 0: // 2. the letters with marks, to their base
|
||||
sb.WriteRune(latinBase[r])
|
||||
case r >= 'A' && r <= 'Z': // 3. A to Z, to a to z
|
||||
sb.WriteRune(r + 'a' - 'A')
|
||||
case r >= 0x21 && r <= 0x7e || asciiSpace(r):
|
||||
sb.WriteRune(r)
|
||||
default:
|
||||
return nil, false
|
||||
}
|
||||
}
|
||||
return strings.FieldsFunc(sb.String(), asciiSpace), true // 4.
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// The full normalization (79.7), for any other text: NFD of UAX #15, without
|
||||
// U+0300 to U+036F, the simple lower case of each code point, and the split
|
||||
// at the spaces of §38.1. It reads UnicodeData.txt of Unicode 18.0.0, which
|
||||
// the annex names by its SHA-256.
|
||||
|
||||
const unicodeDataSHA256 = "0736451de439ae7baf1425136617da495e09ee5afbe6e394374db7009ea08950"
|
||||
|
||||
// unicodeData holds what the normalization takes from UnicodeData.txt: the
|
||||
// canonical decomposition (field 5, without the tagged ones), the canonical
|
||||
// combining class (field 3) and the simple lower case (field 13).
|
||||
type unicodeData struct {
|
||||
decomposition map[rune][]rune
|
||||
class map[rune]int
|
||||
lower map[rune]rune
|
||||
}
|
||||
|
||||
// parseUnicodeData reads UnicodeData.txt, which must be that of Unicode
|
||||
// 18.0.0: another version can give other words.
|
||||
func parseUnicodeData(b []byte) (*unicodeData, error) {
|
||||
sum := sha256.Sum256(b)
|
||||
if hex.EncodeToString(sum[:]) != unicodeDataSHA256 {
|
||||
return nil, fmt.Errorf("UnicodeData.txt has the SHA-256 %x, not that of Unicode 18.0.0, %s", sum, unicodeDataSHA256)
|
||||
}
|
||||
u := &unicodeData{decomposition: map[rune][]rune{}, class: map[rune]int{}, lower: map[rune]rune{}}
|
||||
sc := bufio.NewScanner(bytes.NewReader(b))
|
||||
for sc.Scan() {
|
||||
f := strings.Split(sc.Text(), ";")
|
||||
if len(f) != 15 {
|
||||
return nil, fmt.Errorf("UnicodeData.txt: a line of %d fields", len(f))
|
||||
}
|
||||
cp, err := codePoint(f[0])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// A range, <…, First> to <…, Last>, has no decomposition, class or
|
||||
// lower case: its two lines say nothing more.
|
||||
if c, _ := strconv.Atoi(f[3]); c != 0 {
|
||||
u.class[cp] = c
|
||||
}
|
||||
if f[5] != "" && !strings.HasPrefix(f[5], "<") {
|
||||
for _, h := range strings.Fields(f[5]) {
|
||||
d, err := codePoint(h)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
u.decomposition[cp] = append(u.decomposition[cp], d)
|
||||
}
|
||||
}
|
||||
if f[13] != "" {
|
||||
if u.lower[cp], err = codePoint(f[13]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
return u, sc.Err()
|
||||
}
|
||||
|
||||
func codePoint(h string) (rune, error) {
|
||||
n, err := strconv.ParseUint(h, 16, 32)
|
||||
if err != nil || n > 0x10ffff {
|
||||
return 0, fmt.Errorf("UnicodeData.txt: %q is not a code point", h)
|
||||
}
|
||||
return rune(n), nil
|
||||
}
|
||||
|
||||
// The Hangul syllables decompose by computation (Unicode, §3.12).
|
||||
const (
|
||||
hangulS, hangulL, hangulV, hangulT = 0xac00, 0x1100, 0x1161, 0x11a7
|
||||
hangulVCount, hangulTCount = 21, 28
|
||||
hangulCount = 19 * hangulVCount * hangulTCount
|
||||
)
|
||||
|
||||
// decompose appends the full canonical decomposition of r.
|
||||
func (u *unicodeData) decompose(out []rune, r rune) []rune {
|
||||
if s := r - hangulS; s >= 0 && s < hangulCount {
|
||||
out = append(out, hangulL+s/(hangulVCount*hangulTCount), hangulV+s%(hangulVCount*hangulTCount)/hangulTCount)
|
||||
if t := s % hangulTCount; t != 0 {
|
||||
out = append(out, hangulT+t)
|
||||
}
|
||||
return out
|
||||
}
|
||||
d, ok := u.decomposition[r]
|
||||
if !ok {
|
||||
return append(out, r)
|
||||
}
|
||||
for _, x := range d {
|
||||
out = u.decompose(out, x)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// nfd is the NFD of text: the full canonical decomposition, then the
|
||||
// canonical ordering of each run of marks by their combining class.
|
||||
func (u *unicodeData) nfd(text string) []rune {
|
||||
var out []rune
|
||||
for _, r := range text {
|
||||
out = u.decompose(out, r)
|
||||
}
|
||||
for i := 1; i < len(out); i++ {
|
||||
for j := i; j > 0; j-- {
|
||||
a, b := u.class[out[j-1]], u.class[out[j]]
|
||||
if b == 0 || a <= b {
|
||||
break
|
||||
}
|
||||
out[j-1], out[j] = out[j], out[j-1]
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// wordSpace is a space of §38.1, step 4: those of Go's unicode.IsSpace.
|
||||
func wordSpace(r rune) bool {
|
||||
switch {
|
||||
case asciiSpace(r), r == 0x85, r == 0xa0, r == 0x1680, r >= 0x2000 && r <= 0x200a,
|
||||
r == 0x2028, r == 0x2029, r == 0x202f, r == 0x205f, r == 0x3000:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// normalize applies the full normalization.
|
||||
func (u *unicodeData) normalize(text string) []string {
|
||||
var sb strings.Builder
|
||||
for _, r := range u.nfd(text) {
|
||||
if r >= 0x300 && r <= 0x36f {
|
||||
continue
|
||||
}
|
||||
if l, ok := u.lower[r]; ok {
|
||||
r = l
|
||||
}
|
||||
sb.WriteRune(r)
|
||||
}
|
||||
return strings.FieldsFunc(sb.String(), wordSpace)
|
||||
}
|
||||
|
||||
// normalizeWords normalizes text without tables when it can, and with u
|
||||
// otherwise.
|
||||
func normalizeWords(text string, u *unicodeData) ([]string, error) {
|
||||
if words, ok := normalizeSimple(text); ok {
|
||||
return words, nil
|
||||
}
|
||||
if u == nil {
|
||||
return nil, errors.New("the words hold a character outside the normalization without tables of the annex (79.7): give UnicodeData.txt of Unicode 18.0.0 with -unicodedata")
|
||||
}
|
||||
return u.normalize(text), nil
|
||||
}
|
||||
Binary file not shown.
@ -0,0 +1,61 @@
|
||||
{
|
||||
"file": "format3_full_chunk.dkc",
|
||||
"format": 3,
|
||||
"capsule_id": "9c672412223e65667407568b2ffab62d",
|
||||
"datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0",
|
||||
"profile": "datekeys:quicknet:v1",
|
||||
"round": 1000,
|
||||
"unlock_at": "2023-08-23T15:59:24Z",
|
||||
"access_policy": "time_only",
|
||||
"valid": true,
|
||||
"checks": [
|
||||
{
|
||||
"step": 1,
|
||||
"name": "parse DKC1",
|
||||
"ok": true,
|
||||
"detail": "magic DKC1"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "prelude",
|
||||
"ok": true,
|
||||
"detail": "DKC1 v3, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=458"
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "public header",
|
||||
"ok": true,
|
||||
"detail": "121 bytes"
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"name": "header validation",
|
||||
"ok": true,
|
||||
"detail": "capsule_id=9c672412223e65667407568b2ffab62d datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0 policy=time_only profile=datekeys:quicknet:v1"
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"name": "sealed control structure",
|
||||
"ok": true,
|
||||
"detail": "one tlock stanza"
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"name": "payload structure",
|
||||
"ok": true,
|
||||
"detail": "one X25519 stanza"
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"name": "condition",
|
||||
"ok": true,
|
||||
"detail": "round 1000, unlock at 2023-08-23T15:59:24Z"
|
||||
},
|
||||
{
|
||||
"step": 8,
|
||||
"name": "tlock stanza",
|
||||
"ok": true,
|
||||
"detail": "round 1000, chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,152 @@
|
||||
{
|
||||
"description": "format 3 time_only capsule with padding code 1 (bloque256) and one file, whose BODY and P are 65536 bytes: PAYLOAD_AGE ends in a full STREAM chunk, which the annex of spec v0.16 (79.5) allows",
|
||||
"spec": "0.15",
|
||||
"format": 3,
|
||||
"file": "format3_full_chunk.dkc",
|
||||
"sha256": "af658967b0b2c79379e25edfe3a785095e9aa2686203e93e9f30dacf27a38684",
|
||||
"release": {
|
||||
"round": 1000,
|
||||
"signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
|
||||
},
|
||||
"prelude": "444b43310300000000000079000001ca",
|
||||
"public_header": "a5006a646174656b6579636170010102509c672412223e65667407568b2ffab62d037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400",
|
||||
"datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0",
|
||||
"capsule_id": "9c672412223e65667407568b2ffab62d",
|
||||
"access_policy": "time_only",
|
||||
"structure": "time_only",
|
||||
"unlock_at": "2023-08-23T15:59:24Z",
|
||||
"header_binding": "ea2cd41f6216135cd349fceb1891772252e3f90ed945fc71fd73852a982fbf1f",
|
||||
"outer_stanzas": [
|
||||
{
|
||||
"type": "tlock",
|
||||
"args": [
|
||||
"1000",
|
||||
"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
|
||||
]
|
||||
}
|
||||
],
|
||||
"payload_stanzas": [
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"QsnJmO1LaffXIjpp0ms0Rh2IXta9VzX38GP6TMYlAHA"
|
||||
]
|
||||
}
|
||||
],
|
||||
"control_cbor": "a60070646174656b6579732d636f6e74726f6c0103025820ea2cd41f6216135cd349fceb1891772252e3f90ed945fc71fd73852a982fbf1f0358205be72d0295b21d37b6c8380a91d7c875a2dcab7257fa7ea44dcee5ae6280c95a064800000000000100000701",
|
||||
"payload_identity": "5be72d0295b21d37b6c8380a91d7c875a2dcab7257fa7ea44dcee5ae6280c95a",
|
||||
"payload_length": 65536,
|
||||
"padding": 1,
|
||||
"padded_length": 65536,
|
||||
"plaintext_file": "format3_full_chunk.plaintext",
|
||||
"plaintext_sha256": "ec5bfd307b2e36c1b8e232031167401a1f06d205ccade7a054d39914ebf5c9f8",
|
||||
"area_len": 32768,
|
||||
"security_cbor": "a20071646174656b6579732d73656375726974790101",
|
||||
"head_cbor": "a4006d646174656b6579732d68656164010102582029068855227bf0d314be5b3b5e16392b7157581cf62b0c8d156f74017e2f19bf0581a6006a626c6f7175652e62696e01197f7d020003197f7d045820b84764fc9aa813643c9b76145bfdc87673a4b83ccb3cdfaa3c07bbbc5dba560d051a6abcf9c0",
|
||||
"salt": "29068855227bf0d314be5b3b5e16392b7157581cf62b0c8d156f74017e2f19bf",
|
||||
"content_offset": 32899,
|
||||
"files": [
|
||||
{
|
||||
"path": "bloque.bin",
|
||||
"size": 32637,
|
||||
"start": 0,
|
||||
"end": 32637,
|
||||
"sha256": "b84764fc9aa813643c9b76145bfdc87673a4b83ccb3cdfaa3c07bbbc5dba560d",
|
||||
"mtime": 1790769600
|
||||
}
|
||||
],
|
||||
"verdicts": {
|
||||
"signature": "F0",
|
||||
"seal": "S0",
|
||||
"lines": [
|
||||
"Sin firma de autor."
|
||||
]
|
||||
},
|
||||
"stages": [
|
||||
{
|
||||
"step": 1,
|
||||
"name": "parse DKC1",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "prelude",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "public header",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"name": "header validation",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"name": "sealed control structure",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"name": "payload structure",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"name": "condition",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 8,
|
||||
"name": "tlock stanza",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 9,
|
||||
"name": "release",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 10,
|
||||
"name": "release verification",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 11,
|
||||
"name": "open sealed control",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 12,
|
||||
"name": "policy structure",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 14,
|
||||
"name": "control",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 15,
|
||||
"name": "header binding",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 16,
|
||||
"name": "payload identity",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 17,
|
||||
"name": "open payload",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 18,
|
||||
"name": "commit",
|
||||
"ok": true
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,61 @@
|
||||
{
|
||||
"file": "format3_time_and_key_words.dkc",
|
||||
"format": 3,
|
||||
"capsule_id": "30e865a5c1e148c14410817a65eecfd1",
|
||||
"datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0",
|
||||
"profile": "datekeys:quicknet:v1",
|
||||
"round": 1000,
|
||||
"unlock_at": "2023-08-23T15:59:24Z",
|
||||
"access_policy": "time_and_key",
|
||||
"valid": true,
|
||||
"checks": [
|
||||
{
|
||||
"step": 1,
|
||||
"name": "parse DKC1",
|
||||
"ok": true,
|
||||
"detail": "magic DKC1"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "prelude",
|
||||
"ok": true,
|
||||
"detail": "DKC1 v3, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=2128"
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "public header",
|
||||
"ok": true,
|
||||
"detail": "121 bytes"
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"name": "header validation",
|
||||
"ok": true,
|
||||
"detail": "capsule_id=30e865a5c1e148c14410817a65eecfd1 datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0 policy=time_and_key profile=datekeys:quicknet:v1"
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"name": "sealed control structure",
|
||||
"ok": true,
|
||||
"detail": "one tlock stanza"
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"name": "payload structure",
|
||||
"ok": true,
|
||||
"detail": "one X25519 stanza"
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"name": "condition",
|
||||
"ok": true,
|
||||
"detail": "round 1000, unlock at 2023-08-23T15:59:24Z"
|
||||
},
|
||||
{
|
||||
"step": 8,
|
||||
"name": "tlock stanza",
|
||||
"ok": true,
|
||||
"detail": "round 1000, chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,267 @@
|
||||
{
|
||||
"description": "format 3 time_and_key capsule with one credential, a key of words, and 15 dummies: the text of the vector of the annex of spec v0.16 (79.7), «Ñandú», two spaces, «PINGÜINO», a tab and «camión árbol Éter ola», whose words are «nandu pinguino camion arbol eter ola»",
|
||||
"spec": "0.15",
|
||||
"format": 3,
|
||||
"file": "format3_time_and_key_words.dkc",
|
||||
"sha256": "64a11824630b6134892087a4d4ad3ee6e27941513507ad17fc87a7a2b4421e33",
|
||||
"release": {
|
||||
"round": 1000,
|
||||
"signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39"
|
||||
},
|
||||
"prelude": "444b4331030000000000007900000850",
|
||||
"public_header": "a5006a646174656b65796361700101025030e865a5c1e148c14410817a65eecfd1037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300401",
|
||||
"datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0",
|
||||
"capsule_id": "30e865a5c1e148c14410817a65eecfd1",
|
||||
"access_policy": "time_and_key",
|
||||
"structure": "time_and_key",
|
||||
"unlock_at": "2023-08-23T15:59:24Z",
|
||||
"header_binding": "4bc6ecdcd80e37d0ed1f51ef781db6800564c309e222ba6151665ddd1fe4c99d",
|
||||
"outer_stanzas": [
|
||||
{
|
||||
"type": "tlock",
|
||||
"args": [
|
||||
"1000",
|
||||
"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
|
||||
]
|
||||
}
|
||||
],
|
||||
"payload_stanzas": [
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"y+DAEDO0p07P4YDE2pHXFhIpzVKiv+YUku15lbotTjM"
|
||||
]
|
||||
}
|
||||
],
|
||||
"inner_stanzas": [
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"MSeAnfrz4I+Pn3yhL+/+hkNASJPwQzNQLxeiYu4YeBc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"5VwR2r6e5MknAz//TJrRNRYOtQOeqCaTDdJ+A8QV+S8"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"X09hnKn4HOIFwf6H4GfJe3vSG5f5/EqDtV6Bx+OPgFY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"GhhTyyFwZItGXCDKsG3sIcDYJrD9QU45ybqQxjUQUQ4"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"SS7ZyiY/U4O6PokUavgTMRMghx4lHDiJ+k+K/rsC8FU"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"zchoCmsfxz/dR7YbYGOEoMkSjrDVzOLt5al0CprXG2E"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"xg6iz12nCO/jm/rpa4k6aUM1mu2MUm7CwLJsF8qDwUA"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"NfHtp8ATUtya6UcudC1FTfiL2SMfrKCFj8V3/slMfEw"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"89gYRmkwISvkX1BNb/opcezkVOmNkj7mh89WkniGkWU"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"yBQHKKHENrGZfD9qysIoZ/2sMcSXvKClt6VUL4Sx6Sc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"POtK0+b9IiRSRxlNBYm7DPzApiULuJaVWWOSHap4C00"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"2dGTxtsPQRUHGAros0o30jqTpEa4+6d5KRt4U86Qx2o"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"EKRbRpTDe5KZJgGgsfvnwb0iaHXkzVsqplsmCj3HzHY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"+wHShSAq5PhGXD9ZHs+AwjXxq0TRbcpXwjf46fwW1wc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"HRclh6xyQdsMOSV2MBP0ewe7JB+6EvgTod/4BOYXNAo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "X25519",
|
||||
"args": [
|
||||
"ZIfAt94wDxyQ4Y3WWw54v7H55b26Ye19HFn7USqSwnE"
|
||||
]
|
||||
}
|
||||
],
|
||||
"identity_stanzas": [
|
||||
1
|
||||
],
|
||||
"identities": [
|
||||
"AGE-SECRET-KEY-1CWYUF8E9RJ4SYWL8D7WN43M30XHFFFXD6LSZDRYS2WZ8CMUWWENSEXCGDP"
|
||||
],
|
||||
"words_text": "Ñandú PINGÜINO\tcamión árbol Éter ola",
|
||||
"control_cbor": "a60070646174656b6579732d636f6e74726f6c01030258204bc6ecdcd80e37d0ed1f51ef781db6800564c309e222ba6151665ddd1fe4c99d035820a5f41e788e692ea55a3931bc5e25c7e6180ecc1d14235994198f8e00edb7420a064800000000000080b00702",
|
||||
"payload_identity": "a5f41e788e692ea55a3931bc5e25c7e6180ecc1d14235994198f8e00edb7420a",
|
||||
"payload_length": 32944,
|
||||
"padding": 2,
|
||||
"padded_length": 34816,
|
||||
"plaintext_file": "format3_time_and_key_words.plaintext",
|
||||
"plaintext_sha256": "2ff49df00ad9a37446c626be6d0353e94bd3bf41d73a6141e10f77b586abcb67",
|
||||
"area_len": 32768,
|
||||
"security_cbor": "a20071646174656b6579732d73656375726974790101",
|
||||
"head_cbor": "a4006d646174656b6579732d686561640101025820702740f9850339d6907640e1de069200437bf8688288ed4cc735b37bd875eb260581a6006b7365637265746f2e74787401182e020003182e045820937492203d207d6fe36161b8696bf1f05b8b4cc56d855c44853f4b76aad3a05b051a6abcf9c0",
|
||||
"salt": "702740f9850339d6907640e1de069200437bf8688288ed4cc735b37bd875eb26",
|
||||
"content_offset": 32898,
|
||||
"files": [
|
||||
{
|
||||
"path": "secreto.txt",
|
||||
"size": 46,
|
||||
"start": 0,
|
||||
"end": 46,
|
||||
"sha256": "937492203d207d6fe36161b8696bf1f05b8b4cc56d855c44853f4b76aad3a05b",
|
||||
"mtime": 1790769600
|
||||
}
|
||||
],
|
||||
"verdicts": {
|
||||
"signature": "F0",
|
||||
"seal": "S0",
|
||||
"lines": [
|
||||
"Sin firma de autor."
|
||||
]
|
||||
},
|
||||
"stages": [
|
||||
{
|
||||
"step": 1,
|
||||
"name": "parse DKC1",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "prelude",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "public header",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"name": "header validation",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"name": "sealed control structure",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"name": "payload structure",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"name": "condition",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 8,
|
||||
"name": "tlock stanza",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 9,
|
||||
"name": "access credential",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 9,
|
||||
"name": "release",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 10,
|
||||
"name": "release verification",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 11,
|
||||
"name": "open sealed control",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 12,
|
||||
"name": "policy structure",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 13,
|
||||
"name": "open access layer",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 14,
|
||||
"name": "control",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 15,
|
||||
"name": "header binding",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 16,
|
||||
"name": "payload identity",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 17,
|
||||
"name": "open payload",
|
||||
"ok": true
|
||||
},
|
||||
{
|
||||
"step": 18,
|
||||
"name": "commit",
|
||||
"ok": true
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in new issue