diff --git a/src/lib/dkc/accesskey.ts b/src/lib/dkc/accesskey.ts index 68c1ab5..b719f3e 100644 --- a/src/lib/dkc/accesskey.ts +++ b/src/lib/dkc/accesskey.ts @@ -1,22 +1,15 @@ // The DateKeys Access Key, the portable .dkk credential (spec §38, §40-§44), -// as the Go package accesskey at afb44a3. +// as the Go package accesskey at 3820066. // // A .dkk is a sensitive capability (spec §7.4): its X25519 identity is stored // as 32 raw bytes in `material`. Nothing here prints it. -import { checkSchema, type Decoder, Encoder, MAX_SAFE_UINT, cborError, unmarshal } from './cbor.ts'; +import { concatBytes, copyBytes, goQuote, utf8Length } from './bytes.ts'; +import { checkSchema, type Decoder, Encoder, unmarshal } from './cbor.ts'; import { DateKeysError, withContext } from './errors.ts'; -import { - checkDisjoint, - decodeExtensions, - decodeWireArray, - encodeExtensions, - encodeWireArray, - type Extension, - type ExtensionWire, -} from './extension.ts'; -import { concatBytes, copyBytes, goQuote } from './bytes.ts'; +import { canonicalExtensions, checkDisjoint, decodeArray, type Extension } from './extension.ts'; import { dkkPreludeBytes, MAX_DKK_BODY_LEN, splitAccessKey } from './framing.ts'; +import { encodeExtensionArrays, fieldOf, presence, requireKeys } from './schema.ts'; export const ACCESS_KEY_TYPE_TAG = 'datekeys-access-key'; export const ACCESS_KEY_VERSION = 1; @@ -65,74 +58,101 @@ function validateMaterial(type: string, material: Uint8Array): void { } } +// BODY_CBOR as it is encoded: keys 2 to 8, keys 0 and 1 being the constants +// ACCESS_KEY_TYPE_TAG and ACCESS_KEY_VERSION. interface BodyWire { - typeTag: string; - version: number; credentialId: Uint8Array; capsuleId: Uint8Array; accessType: string; + /** SECRET. */ material: Uint8Array; - /** undefined when absent; an empty digest for the empty map. */ - capsuleDigest: Uint8Array | undefined; - critical: ExtensionWire[] | undefined; - noncritical: ExtensionWire[] | undefined; + /** capsule_digest, the only key of verification_metadata (key 6); undefined when key 6 is omitted. */ + digest: Uint8Array | undefined; + critical: Extension[] | undefined; + noncritical: Extension[] | undefined; } +// Reads BODY_CBOR with every CDDL rule whose violation is +// ERR_NON_CANONICAL_CBOR (layer 3 of spec §69.1); access_type and +// access_material, which have a code of their own (spec §57), are checked +// afterwards. On failure it wipes the copy of the material it read. function decodeWire(d: Decoder): BodyWire { - d.map(9); - d.expectKey(0); - const typeTag = d.text(MAX_SAFE_UINT); - d.expectKey(1); - const version = d.uint(); - d.expectKey(2); - const credentialId = d.bstr(0, MAX_SAFE_UINT); - d.expectKey(3); - const capsuleId = d.bstr(0, MAX_SAFE_UINT); - d.expectKey(4); - const accessType = d.text(MAX_SAFE_UINT); - d.expectKey(5); - const material = d.bstr(0, MAX_SAFE_UINT); - // From here on, a failure wipes the copy of the secret it read. + const w: BodyWire = { + credentialId: new Uint8Array(0), + capsuleId: new Uint8Array(0), + accessType: '', + material: new Uint8Array(0), + digest: undefined, + critical: undefined, + noncritical: undefined, + }; try { - let capsuleDigest: Uint8Array | undefined; - let critical: ExtensionWire[] | undefined; - let noncritical: ExtensionWire[] | undefined; - while (d.pairsLeft() > 0) { + const pairs = d.map(9); + const seen = new Set(); + for (let i = 0; i < pairs; i++) { const k = d.key(); - if (k === 6) { - // An empty map decodes, as in the reference, and is rejected - // afterwards for its missing digest; h'' is not the canonical form of - // anything. - const n = d.map(1); - if (n === 1) { - d.expectKey(0); - capsuleDigest = d.bstr(1, MAX_SAFE_UINT); - } else { - capsuleDigest = new Uint8Array(0); - } - d.endMap(); - } else if (k === 7) { - critical = decodeWireArray(d); - } else if (k === 8) { - noncritical = decodeWireArray(d); - } else { - throw cborError(`unknown .dkk BODY_CBOR key ${k}`); + const field = fieldOf(k); + switch (k) { + case 0: + field(() => d.text(utf8Length(ACCESS_KEY_TYPE_TAG))); + break; + case 1: + field(() => d.uint(ACCESS_KEY_VERSION)); + break; + case 2: + w.credentialId = field(() => d.bstr(ID_SIZE, ID_SIZE)); + break; + case 3: + w.capsuleId = field(() => d.bstr(ID_SIZE, ID_SIZE)); + break; + case 4: + w.accessType = field(() => d.text(MAX_DKK_BODY_LEN)); + break; + case 5: + w.material = field(() => d.bstr(0, MAX_DKK_BODY_LEN)); + break; + case 6: + w.digest = field(() => decodeVerification(d)); + break; + case 7: + w.critical = field(() => decodeArray(d)); + break; + case 8: + w.noncritical = field(() => decodeArray(d)); + break; + default: + throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `key ${k} is not defined`); } + seen.add(Number(k)); } + requireKeys(seen, 6); d.endMap(); - return { typeTag, version, credentialId, capsuleId, accessType, material, capsuleDigest, critical, noncritical }; + return w; } catch (err) { - material.fill(0); + w.material.fill(0); throw err; } } +// Reads verification_metadata, {0: capsule_digest}. It is present only when +// it holds a digest: an empty map is not a representation of absence (spec +// §43, §58.1). +function decodeVerification(d: Decoder): Uint8Array { + const pairs = d.map(1); + if (pairs === 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'empty verification_metadata; an absent one omits key 6'); + const k = d.key(); + if (k !== 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `verification_metadata key ${k} is not defined`); + const digest = withContext('capsule_digest', () => d.bstr(DIGEST_SIZE, DIGEST_SIZE)); + d.endMap(); + return digest; +} + function encodeWire(e: Encoder, w: BodyWire): void { - e.map(6 + (w.capsuleDigest ? 1 : 0) + (w.critical ? 1 : 0) + (w.noncritical ? 1 : 0)); + e.map(6 + (w.digest === undefined ? 0 : 1) + presence(w.critical) + presence(w.noncritical)); e.uint(0); - e.text(w.typeTag); + e.text(ACCESS_KEY_TYPE_TAG); e.uint(1); - e.uint(w.version); + e.uint(ACCESS_KEY_VERSION); e.uint(2); e.bstr(w.credentialId); e.uint(3); @@ -141,30 +161,23 @@ function encodeWire(e: Encoder, w: BodyWire): void { e.text(w.accessType); e.uint(5); e.bstr(w.material); - if (w.capsuleDigest) { + if (w.digest !== undefined) { e.uint(6); - const has = w.capsuleDigest.length > 0; - e.map(has ? 1 : 0); - if (has) { - e.uint(0); - e.bstr(w.capsuleDigest); - } - } - if (w.critical) { - e.uint(7); - encodeWireArray(e, w.critical); - } - if (w.noncritical) { - e.uint(8); - encodeWireArray(e, w.noncritical); + e.map(1); + e.uint(0); + e.bstr(w.digest); } + encodeExtensionArrays(e, 7, w.critical, w.noncritical); } /** * Validates and decodes BODY_CBOR, bounded by the DKK BODY limit of spec §57 - * whatever it was read from. The checks run in the order of the reference: - * limit, schema head, canonical CBOR, identifier sizes, verification - * metadata, extension arrays and, last, the access material. + * whatever it was read from, in the layers of spec §69.1: the limit + * (ERR_INTEGRITY); the type tag and the schema version; canonical CBOR and + * the CDDL, verification metadata and extension arrays included, and no + * identifier in both arrays (ERR_NON_CANONICAL_CBOR); and only then + * access_type and access_material (ERR_ACCESS_INVALID). The critical + * extensions are checked by the consumer (spec §63 step 9.a). */ export function decodeAccessKeyBody(body: Uint8Array): AccessKey { if (body.length > MAX_DKK_BODY_LEN) { @@ -176,17 +189,8 @@ export function decodeAccessKeyBody(body: Uint8Array): AccessKey { // decoded value is rejected, and by the finally block below otherwise. const w = withContext('accesskey', () => unmarshal(body, decodeWire, encodeWire, (v) => v.material.fill(0))); try { - if (w.credentialId.length !== ID_SIZE || w.capsuleId.length !== ID_SIZE) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `accesskey: credential_id and capsule_id must be ${ID_SIZE} bytes`); - } - if (w.capsuleDigest !== undefined && w.capsuleDigest.length !== DIGEST_SIZE) { - throw new DateKeysError( - 'ERR_NON_CANONICAL_CBOR', - `accesskey: verification_metadata must hold a ${DIGEST_SIZE}-byte capsule_digest`, - ); - } - const critical = withContext('accesskey: critical_extensions', () => decodeExtensions(w.critical ?? [])); - const noncritical = withContext('accesskey: noncritical_extensions', () => decodeExtensions(w.noncritical ?? [])); + const critical = w.critical ?? []; + const noncritical = w.noncritical ?? []; withContext('accesskey', () => checkDisjoint(critical, noncritical)); validateMaterial(w.accessType, w.material); return { @@ -194,7 +198,7 @@ export function decodeAccessKeyBody(body: Uint8Array): AccessKey { capsuleId: w.capsuleId, type: w.accessType, material: copyBytes(w.material), - verification: w.capsuleDigest === undefined ? undefined : { capsuleDigest: w.capsuleDigest }, + verification: w.digest === undefined ? undefined : { capsuleDigest: w.digest }, critical, noncritical, }; @@ -224,18 +228,16 @@ export function marshalAccessKeyBody(k: AccessKey): Uint8Array { // An empty map is not a canonical representation of absence (spec §43). throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `accesskey: capsule_digest must be ${DIGEST_SIZE} bytes`); } - const critical = encodeExtensions(k.critical); - const noncritical = encodeExtensions(k.noncritical); + const critical = canonicalExtensions(k.critical); + const noncritical = canonicalExtensions(k.noncritical); checkDisjoint(k.critical, k.noncritical); const e = new Encoder(); encodeWire(e, { - typeTag: ACCESS_KEY_TYPE_TAG, - version: ACCESS_KEY_VERSION, credentialId: k.credentialId, capsuleId: k.capsuleId, accessType: k.type, material: k.material, - capsuleDigest: k.verification?.capsuleDigest, + digest: k.verification?.capsuleDigest, critical, noncritical, }); diff --git a/src/lib/dkc/cbor.ts b/src/lib/dkc/cbor.ts index 9ad5608..5448d83 100644 --- a/src/lib/dkc/cbor.ts +++ b/src/lib/dkc/cbor.ts @@ -2,9 +2,10 @@ // restricted to major types 0 (unsigned integer), 2 (byte string), 3 (text // string), 4 (array) and 5 (map), with unsigned integer map keys in strictly // ascending order, shortest-form integers and lengths, definite lengths only -// and valid UTF-8 text. +// and valid UTF-8 text. It is the hand-written codec of the Go reference +// (package codec at 3820066), with the same reads, the same checks in the +// same order and the same error texts. // -// The design is the one of plan §4 and §5: // - Encoder accumulates bytes; the first error is sticky and out() throws it. // - Decoder is a strict cursor: every form outside the profile is rejected // while reading, and lengths are checked against the remaining input @@ -12,79 +13,74 @@ // - unmarshal decodes, re-encodes the decoded value and requires the exact // input bytes back, an independent defense of canonicality. // - peek and checkSchema read the type tag (key 0) and the schema version -// (key 1) before strict decoding (spec §70). +// (key 1) from the start of an object, before its strict decoding: layer +// 2 of the error precedence of spec §69.1. // - walk is a bounded generic reader for vectors and informative views; it // never decides the validity of a protocol object. // -// Integers are JavaScript numbers. Every unsigned integer of the protocol is -// at most 2^53-1 (spec §58), so the decoder rejects anything larger, with one -// exception: Decoder.wideUint reads the two fields where the reference -// implementation decodes any uint64 and checks the range only after a check -// with another error code (PUBLIC_HEADER access_policy and extension_version, -// see WideUint). -// // Every failure is ERR_NON_CANONICAL_CBOR, except the schema version check of // checkSchema, which is ERR_UNSUPPORTED_VERSION. -import { copyBytes, decodeUtf8, equalBytes, goQuote, readUint32BE, toHex, utf8Bytes } from './bytes.ts'; +import { copyBytes, decodeUtf8, equalBytes, goQuote, readUint32BE, utf8Bytes } from './bytes.ts'; import { DateKeysError } from './errors.ts'; -/** The largest unsigned integer of the protocol, 2^53-1 (spec §58). */ +/** The largest unsigned integer of every schema of the protocol, 2^53-1 (spec §58). */ export const MAX_SAFE_UINT = Number.MAX_SAFE_INTEGER; +/** The largest unsigned integer of CBOR, 2^64-1, which walk accepts. */ +export const MAX_UINT64 = 2n ** 64n - 1n; + /** - * Limits of the decoder used by the reference implementation at afb44a3 - * (codec.MaxNestedLevels, MaxArrayElements, MaxMapPairs). peek applies them - * as the reference does; the schema decoders bound extension arrays by - * MAX_ARRAY_ELEMENTS before the 64-extension rule of spec §54. + * The largest type tag peek reads, in bytes. Every type tag of V1 is at most + * 25 bytes; an implementation limit of the reference (spec §74). */ -export const MAX_NESTED_LEVELS = 16; -export const MAX_ARRAY_ELEMENTS = 65536; -export const MAX_MAP_PAIRS = 65536; +export const MAX_TYPE_TAG_LEN = 64; + +/** + * An unsigned integer as the decoder reads it: a number up to 2^53-1, a + * bigint above. The two compare exactly with <, <=, > and >=. + */ +export type Uint = number | bigint; + +// Major types of the profile (spec §58). +const MAJOR_UINT = 0; +const MAJOR_BYTES = 2; +const MAJOR_TEXT = 3; +const MAJOR_ARRAY = 4; +const MAJOR_MAP = 5; const MAJOR_NAMES = [ - 'unsigned integer', - 'negative integer', - 'byte string', - 'text string', - 'array', - 'map', - 'tag', - 'float or simple value', + 'an unsigned integer', + 'a negative integer', + 'a byte string', + 'a text string', + 'an array', + 'a map', + 'a tag', + 'a float or simple value', ] as const; const TWO_POW_32 = 2 ** 32; /** The largest high 32-bit half of an integer at most 2^53-1. */ const MAX_HI32 = 0x1fffff; -/** - * An unsigned integer of up to 64 bits, read by Decoder.wideUint. `value` is - * the integer, or Infinity above 2^53-1; `arg` then holds the 8 bytes of the - * argument, so that the value re-encodes to the same bytes and an error - * message can show it in decimal. Never a protocol value by itself: the - * schema check rejects anything above its own bound. - */ -export interface WideUint { - readonly value: number; - readonly arg?: Uint8Array; -} - -/** The exact decimal text of `w`, as Go's %d of a uint64. */ -export function wideUintText(w: WideUint): string { - return w.arg === undefined ? String(w.value) : BigInt(`0x${toHex(w.arg)}`).toString(); -} - -/** Returns the ERR_NON_CANONICAL_CBOR error with the given detail. */ +/** Returns the ERR_NON_CANONICAL_CBOR error "codec: ". */ export function cborError(detail: string): DateKeysError { - return new DateKeysError('ERR_NON_CANONICAL_CBOR', `cbor: ${detail}`); + return new DateKeysError('ERR_NON_CANONICAL_CBOR', `codec: ${detail}`); } +// Go's %#02x of an initial byte, which is never below 0x10 in a message. +const initialByte = (b: number): string => `0x${b.toString(16).padStart(2, '0')}`; + // --------------------------------------------------------------------------- // Encoder /** - * Encoder writes the canonical encoding of the profile. The first invalid - * call fixes an error; later calls do nothing and out() throws that error. + * Encoder writes the deterministic encoding of data items of the profile. + * The first invalid call fixes an error; later calls do nothing and out() + * throws that error. It does not know the schema: the caller writes the map + * keys in ascending order and as many entries as it announced, and the + * decoder of the schema checks the output. */ export class Encoder { #buf = new Uint8Array(256); @@ -96,41 +92,33 @@ export class Encoder { return this.#err; } + /** + * Records `err` as the error of the encoding unless one is recorded + * already. The encoder of a schema calls it when its value breaks a rule of + * the schema, so that bytes the decoder rejects are never returned. + */ + fail(err: DateKeysError): void { + this.#err ??= err; + } + /** Map header of `pairs` entries; the caller writes the keys in order. */ map(pairs: number): void { - this.#head(5, pairs); + this.#head(MAJOR_MAP, pairs); } /** Array header of `items` elements. */ array(items: number): void { - this.#head(4, items); + this.#head(MAJOR_ARRAY, items); } /** Unsigned integer 0..2^53-1. */ uint(v: number): void { - this.#head(0, v); - } - - /** - * An integer read by Decoder.wideUint: its value when at most 2^53-1, - * otherwise its original 8-byte argument. - */ - wideUint(w: WideUint): void { - if (w.arg === undefined) { - this.uint(w.value); - return; - } - if (w.value !== Infinity || w.arg.length !== 8 || readUint32BE(w.arg, 0) <= MAX_HI32) { - this.#fail('malformed integer above 2^53-1'); - return; - } - this.#write(Uint8Array.of(27)); - this.#write(w.arg); + this.#head(MAJOR_UINT, v); } /** Byte string. */ bstr(b: Uint8Array): void { - this.#head(2, b.length); + this.#head(MAJOR_BYTES, b.length); this.#write(b); } @@ -140,11 +128,11 @@ export class Encoder { */ text(s: string): void { if (!s.isWellFormed()) { - this.#fail('text is not well-formed Unicode (lone surrogate)'); + this.fail(cborError('text string is not well-formed Unicode (lone surrogate)')); return; } const b = utf8Bytes(s); - this.#head(3, b.length); + this.#head(MAJOR_TEXT, b.length); this.#write(b); } @@ -160,14 +148,10 @@ export class Encoder { this.#len = 0; } - #fail(detail: string): void { - this.#err ??= cborError(detail); - } - #head(major: number, v: number): void { if (this.#err !== undefined) return; if (!Number.isSafeInteger(v) || v < 0) { - this.#fail(`${v} is not an unsigned integer in 0..2^53-1`); + this.fail(cborError(`${v} is not an unsigned integer in 0..2^53-1`)); return; } const mt = major << 5; @@ -214,186 +198,221 @@ export class Encoder { // --------------------------------------------------------------------------- // Decoder -interface MapFrame { - remaining: number; - lastKey: number; +interface OpenMap { + /** Entries not read yet. */ + left: number; + /** Last key read. */ + last: Uint; + /** At least one key was read. */ + started: boolean; } /** - * Decoder is a strict cursor over one encoded item of the profile. Each map - * opened with map() records its last key and requires strictly ascending - * unsigned integer keys. + * Decoder is a strict cursor over the encoding of one data item of the + * profile, as the Go codec.Decoder. Each method reads one data item, or one + * head, and throws ERR_NON_CANONICAL_CBOR ("codec: offset N: …") for a major + * type outside the profile, a major type other than the one asked for, an + * indefinite length, an integer or length not in its shortest form, a length + * beyond the remaining input and a value outside the bounds the caller + * gives. Within each open map the keys are unsigned integers in strictly + * ascending order. */ export class Decoder { - readonly #buf: Uint8Array; - #pos = 0; - readonly #maps: MapFrame[] = []; + readonly #in: Uint8Array; + #off = 0; + readonly #maps: OpenMap[] = []; constructor(input: Uint8Array) { - this.#buf = input; + this.#in = input; } /** Bytes not read yet. */ get remaining(): number { - return this.#buf.length - this.#pos; + return this.#in.length - this.#off; } - /** Major type of the next item, without consuming it. */ - peekMajor(): number { - if (this.#pos >= this.#buf.length) throw cborError('unexpected end of input'); - return this.#buf[this.#pos]! >> 5; + /** + * Major type of the next data item, or 0 (unsigned integer) at the end of + * the input, where reading it reports the truncation. + */ + next(): number { + return this.#off >= this.#in.length ? MAJOR_UINT : this.#in[this.#off]! >> 5; } - /** Map header of at most `max` pairs; returns the number of pairs. */ + /** + * Reads the head of a map of at most `max` entries and returns the number + * of entries. The caller reads each entry with key() and a value, then + * calls endMap(). + */ map(max: number): number { - const n = this.#head(5); - if (n > max) throw cborError(`map of ${n} pairs exceeds ${max}`); - this.#maps.push({ remaining: n, lastKey: -1 }); - return n; - } - - /** Pairs of the innermost open map not read yet. */ - pairsLeft(): number { - return this.#frame().remaining; + const n = this.#expect(MAJOR_MAP); + if (n > max) throw this.fail(`map of ${n} entries, at most ${max}`); + if (n > Math.floor(this.remaining / 2)) throw this.fail(`truncated input: map of ${n} entries`); + this.#maps.push({ left: Number(n), last: 0, started: false }); + return Number(n); } - /** Next key of the innermost map, strictly greater than the previous one. */ - key(): number { - const f = this.#frame(); - if (f.remaining === 0) throw cborError('no map entry left'); - const k = this.#head(0, 'unsigned integer map key'); - if (k <= f.lastKey) throw cborError(k === f.lastKey ? `duplicate map key ${k}` : `map key ${k} out of order`); - f.lastKey = k; - f.remaining--; + /** + * Reads the key of the next entry of the innermost open map: an unsigned + * integer greater than the previous key of that map. + */ + key(): Uint { + const m = this.#maps.at(-1); + if (m === undefined) throw this.fail('map key outside a map'); + if (m.left === 0) throw this.fail('map key after the last entry'); + const start = this.#off; + const k = this.#expect(MAJOR_UINT); + if (m.started && k <= m.last) { + this.#off = start; + throw this.fail(`map key ${k} after key ${m.last}: keys must be strictly ascending`); + } + m.left--; + m.last = k; + m.started = true; return k; } - /** Reads the next key and requires it to be `want`. */ - expectKey(want: number): void { - const k = this.key(); - if (k !== want) throw cborError(`map key ${k} where key ${want} was expected`); - } - - /** Closes the innermost map, which must have no entries left. */ + /** Closes the innermost open map, all of whose entries must have been read. */ endMap(): void { - const f = this.#frame(); - if (f.remaining !== 0) throw cborError(`${f.remaining} unexpected map entries`); + const m = this.#maps.at(-1); + if (m === undefined) throw this.fail('end of a map outside a map'); + if (m.left !== 0) throw this.fail(`${m.left} map entries not read`); this.#maps.pop(); } - /** Array header of at most `max` items; returns the number of items. */ + /** Reads the head of an array of at most `max` items and returns the number of items. */ array(max: number): number { - const n = this.#head(4); - if (n > max) throw cborError(`array of ${n} items exceeds ${max}`); - return n; + const n = this.#expect(MAJOR_ARRAY); + if (n > max) throw this.fail(`array of ${n} items, at most ${max}`); + if (n > this.remaining) throw this.fail(`truncated input: array of ${n} items`); + return Number(n); } - /** Unsigned integer at most `max` (itself at most 2^53-1). */ + /** Reads an unsigned integer of at most `max`, itself at most 2^53-1. */ uint(max: number = MAX_SAFE_UINT): number { - const v = this.#head(0); - if (v > max) throw cborError(`integer ${v} exceeds ${max}`); - return v; + return this.uint64(max) as number; } - /** - * Unsigned integer of up to 64 bits, for the fields where the reference - * implementation decodes a uint64 and checks its range only later, after a - * check with another error code: a value above 2^53-1 is returned as - * Infinity with its argument bytes instead of failing here. The caller must - * apply its own bound. Every other rule is the one of uint(). - */ - wideUint(): WideUint { - const p = this.#pos; - const value = this.#head(0, MAJOR_NAMES[0], true); - return value === Infinity ? { value, arg: copyBytes(this.#buf.subarray(p + 1, p + 9)) } : { value }; + /** Reads an unsigned integer of at most `max` (2^64-1 by default). */ + uint64(max: Uint = MAX_UINT64): Uint { + const v = this.#expect(MAJOR_UINT); + if (v > max) throw this.fail(`unsigned integer ${v} above ${max}`); + return v; } - /** Byte string of `min` to `max` bytes, copied. */ + /** Reads a byte string of `min` to `max` bytes and returns a copy of its content. */ bstr(min: number, max: number): Uint8Array { - const n = this.#head(2); - this.#checkLength(n, min, max, 'byte string'); - const out = copyBytes(this.#buf.subarray(this.#pos, this.#pos + n)); - this.#pos += n; - return out; + return copyBytes(this.#content(MAJOR_BYTES, min, max)); } - /** Text string of at most `max` UTF-8 bytes. */ + /** Reads a text string of at most `max` bytes of valid UTF-8. */ text(max: number): string { return this.textUtf8(max).text; } - /** Text string of at most `max` UTF-8 bytes, with its exact UTF-8 bytes. */ + /** text(), with a copy of the exact UTF-8 bytes of the string. */ textUtf8(max: number): { text: string; utf8: Uint8Array } { - const n = this.#head(3); - this.#checkLength(n, 0, max, 'text string'); - const utf8 = copyBytes(this.#buf.subarray(this.#pos, this.#pos + n)); - const text = decodeUtf8(utf8); - if (text === undefined) throw cborError('text string is not valid UTF-8'); - this.#pos += n; - return { text, utf8 }; + const start = this.#off; + const b = this.#content(MAJOR_TEXT, 0, max); + const text = decodeUtf8(b); + if (text === undefined) { + this.#off = start; + throw this.fail('text string is not valid UTF-8'); + } + return { text, utf8: copyBytes(b) }; } - /** Requires that every map is closed and that no byte is left. */ + /** Checks that every map was closed and that no byte follows the data item. */ done(): void { - if (this.#maps.length !== 0) throw cborError('unclosed map'); - if (this.#pos !== this.#buf.length) throw cborError(`${this.#buf.length - this.#pos} trailing bytes`); - } - - #frame(): MapFrame { - const f = this.#maps.at(-1); - if (f === undefined) throw cborError('no open map'); - return f; + if (this.#maps.length !== 0) throw this.fail(`${this.#maps.length} maps not closed`); + if (this.#off !== this.#in.length) throw this.fail(`${this.#in.length - this.#off} trailing bytes`); } - #checkLength(n: number, min: number, max: number, what: string): void { - if (n > this.remaining) throw cborError(`${what} of ${n} bytes exceeds the remaining input`); - if (n < min || n > max) throw cborError(`${what} of ${n} bytes outside ${min}..${max}`); - } - - // Reads the head of the next item, which must have major type `major`, and - // returns its argument: shortest form, definite length, at most 2^53-1, or - // Infinity for a larger argument when `wide` is set. - #head(major: number, what: string = MAJOR_NAMES[major]!, wide = false): number { - const b = this.#buf; - const p = this.#pos; - if (p >= b.length) throw cborError(`unexpected end of input, expected ${what}`); + /** + * The ERR_NON_CANONICAL_CBOR error "codec: offset N: detail" at the current + * offset, for the checks a caller makes on what it read (Go's d.fail). + */ + fail(detail: string): DateKeysError { + return cborError(`offset ${this.#off}: ${detail}`); + } + + // Reads the head of the next data item and returns its major type and + // argument. It rejects the major types outside the profile, reserved + // values, indefinite lengths, arguments not in their shortest form and + // truncation. + #head(): [number, Uint] { + const b = this.#in; + const p = this.#off; + if (p >= b.length) throw this.fail('truncated input'); const ib = b[p]!; - if (ib >> 5 !== major) throw cborError(`expected ${what}, found ${MAJOR_NAMES[ib >> 5]!}`); - const ai = ib & 0x1f; - if (ai < 24) { - this.#pos = p + 1; - return ai; + const major = ib >> 5; + const info = ib & 0x1f; + if (major === 1 || major === 6 || major === 7) { + throw this.fail(`${MAJOR_NAMES[major]} (initial byte ${initialByte(ib)}) is outside the CBOR profile`); } - if (ai > 27) throw cborError(ai === 31 ? 'indefinite length' : `reserved additional information ${ai}`); - const n = 1 << (ai - 24); - if (b.length - p - 1 < n) throw cborError(`truncated ${what}`); - let v: number; + if (info < 24) { + this.#off++; + return [major, info]; + } + if (info === 31) throw this.fail(`indefinite length (initial byte ${initialByte(ib)})`); + if (info > 27) throw this.fail(`reserved additional information (initial byte ${initialByte(ib)})`); + const n = 1 << (info - 24); + if (this.remaining < 1 + n) throw this.fail('truncated input'); + let arg: Uint; + let min: number; if (n === 1) { - v = b[p + 1]!; + arg = b[p + 1]!; + min = 24; } else if (n === 2) { - v = (b[p + 1]! << 8) | b[p + 2]!; + arg = (b[p + 1]! << 8) | b[p + 2]!; + min = 0x100; } else if (n === 4) { - v = readUint32BE(b, p + 1); + arg = readUint32BE(b, p + 1); + min = 0x10000; } else { const hi = readUint32BE(b, p + 1); - if (hi <= MAX_HI32) v = hi * TWO_POW_32 + readUint32BE(b, p + 5); - else if (wide) v = Infinity; - else throw cborError(`${what} above 2^53-1`); + const lo = readUint32BE(b, p + 5); + arg = hi <= MAX_HI32 ? hi * TWO_POW_32 + lo : (BigInt(hi) << 32n) | BigInt(lo); + min = TWO_POW_32; } - if (v < (n === 1 ? 24 : 2 ** (4 * n))) throw cborError(`${what} ${v} not in its shortest form`); - this.#pos = p + 1 + n; - return v; + if (arg < min) throw this.fail(`${arg} is not in its shortest form (initial byte ${initialByte(ib)})`); + this.#off = p + 1 + n; + return [major, arg]; + } + + // Reads the head of a data item of major type `want`. + #expect(want: number): Uint { + const start = this.#off; + const [major, arg] = this.#head(); + if (major !== want) { + this.#off = start; + throw this.fail(`${MAJOR_NAMES[major]!} where ${MAJOR_NAMES[want]!} was expected`); + } + return arg; + } + + // Reads a string of major type `want` and returns its content, a view of + // the input. The length is checked against the remaining input and then + // against min and max. + #content(want: number, min: number, max: number): Uint8Array { + const n = this.#expect(want); + if (n > this.remaining) throw this.fail(`truncated input: ${MAJOR_NAMES[want]!} of ${n} bytes`); + if (n < min || n > max) throw this.fail(`${MAJOR_NAMES[want]!} of ${n} bytes outside ${min}..${max}`); + const len = Number(n); + const b = this.#in.subarray(this.#off, this.#off + len); + this.#off += len; + return b; } } /** - * Decodes exactly one item of `input` with `decode`, re-encodes the result - * with `encode` and requires the re-encoding to equal the input byte for - * byte. The re-encoding is wiped on every path, since it may hold secrets. - * When the decoded value is rejected (trailing bytes, or a re-encoding that - * differs), `onReject` runs on it before the error is thrown, so that a value - * holding secrets can be wiped; `decode` wipes what it read when it fails - * itself. + * Decodes exactly one item of `input` with `decode`, requires that the whole + * input was read, re-encodes the result with `encode` and requires the + * re-encoding to equal the input byte for byte. The re-encoding is wiped on + * every path, since it may hold secrets. When the decoded value is rejected + * (trailing bytes, or a re-encoding that differs), `onReject` runs on it + * before the error is thrown, so that a value holding secrets can be wiped; + * `decode` wipes what it read when it fails itself. */ export function unmarshal( input: Uint8Array, @@ -420,250 +439,128 @@ export function unmarshal( } // --------------------------------------------------------------------------- -// Schema peek (spec §70) - -/** - * Head of an item as read by the reference decoder: `val` is the argument, or - * Infinity above 2^53-1; `key` is the exact argument in decimal. - */ -interface RefHead { - major: number; - ai: number; - val: number; - key: string; - aboveInt64: boolean; - indefinite: boolean; -} - -// RefScanner reproduces the checks the reference implementation applies -// before its strict decoding (fxamacker/cbor v2.9.4 with the options of -// codec.CheckSchema at afb44a3): well-formedness with no tags, no indefinite -// lengths, at most 16 nested levels, 65536 array elements and 65536 map pairs, -// and no extraneous data. Text is not validated here. -class RefScanner { - off = 0; - readonly #b: Uint8Array; - - constructor(b: Uint8Array) { - this.#b = b; - } - - head(): RefHead { - const b = this.#b; - if (this.off >= b.length) throw cborError('unexpected end of input'); - const ib = b[this.off++]!; - const major = ib >> 5; - const ai = ib & 0x1f; - const h: RefHead = { major, ai, val: ai, key: String(ai), aboveInt64: false, indefinite: false }; - if (ai < 24) return h; - if (ai === 31) { - if (major === 0 || major === 1 || major === 6) throw cborError(`invalid additional information 31 for ${MAJOR_NAMES[major]!}`); - if (major === 7) throw cborError('unexpected break code'); - h.indefinite = true; - return h; - } - if (ai > 27) throw cborError(`invalid additional information ${ai}`); - const n = 1 << (ai - 24); - if (b.length - this.off < n) throw cborError('unexpected end of input'); - if (n === 8) { - const hi = readUint32BE(b, this.off); - h.aboveInt64 = hi >= 0x80000000; - h.val = hi > MAX_HI32 ? Infinity : hi * TWO_POW_32 + readUint32BE(b, this.off + 4); - // Only a key and a message need the exact value above 2^53-1. - h.key = h.val === Infinity ? BigInt(`0x${toHex(b.subarray(this.off, this.off + 8))}`).toString() : String(h.val); - } else { - h.val = n === 1 ? b[this.off]! : n === 2 ? (b[this.off]! << 8) | b[this.off + 1]! : readUint32BE(b, this.off); - h.key = String(h.val); - if (n === 1 && major === 7 && h.val < 32) throw cborError(`invalid simple value ${h.val}`); - } - this.off += n; - return h; - } - - // Checks one well-formed item; `depth` counts the enclosing containers. - item(depth: number): void { - const h = this.head(); - switch (h.major) { - case 2: - case 3: - if (h.indefinite) throw cborError(`indefinite-length ${MAJOR_NAMES[h.major]!}`); - this.take(h.val); - return; - case 4: - case 5: { - if (depth + 1 > MAX_NESTED_LEVELS) throw cborError(`exceeded max nested level ${MAX_NESTED_LEVELS}`); - if (h.indefinite) throw cborError(`indefinite-length ${MAJOR_NAMES[h.major]!}`); - if (h.val > (h.major === 4 ? MAX_ARRAY_ELEMENTS : MAX_MAP_PAIRS)) throw cborError(`${MAJOR_NAMES[h.major]!} of ${h.val} entries exceeds the limit`); - const n = h.major === 5 ? 2 * h.val : h.val; - for (let i = 0; i < n; i++) this.item(depth + 1); - return; - } - case 6: - throw cborError('tags are not allowed'); - default: - return; - } - } - - take(n: number): Uint8Array { - if (n > this.#b.length - this.off) throw cborError('unexpected end of input'); - const out = this.#b.subarray(this.off, this.off + n); - this.off += n; - return out; - } - - // A text value decoded into a Go string: text, or null/undefined (no-op). - string(): string { - const h = this.head(); - if (h.major === 3) { - const s = decodeUtf8(this.take(h.val)); - if (s === undefined) throw cborError('type tag is not valid UTF-8'); - return s; - } - if (h.major === 7 && (h.ai === 22 || h.ai === 23)) return ''; - throw cborError(`type tag is a ${MAJOR_NAMES[h.major]!}`); - } - - // A value decoded into a Go uint64, with its decimal text: an unsigned - // integer, a simple value other than false and true (its number), or - // null/undefined (no-op). - uint64(): [number, string] { - const h = this.head(); - if (h.major === 0) return [h.val, h.key]; - if (h.major === 7) { - if (h.ai === 22 || h.ai === 23) return [0, '0']; - if (h.ai < 20 || h.ai === 24) return [h.val, h.key]; - } - throw cborError(`schema version is a ${MAJOR_NAMES[h.major]!}`); - } -} +// Schema head (spec §69.1 layer 2, §70) /** Type tag (key 0) and schema version (key 1) of an encoded object. */ export interface SchemaHead { typeTag: string; - /** The version; Infinity stands for any value above 2^53-1. */ version: number; } /** - * Reads the type tag and the schema version of a map before its strict - * decoding, so that an unknown version is reported as such (spec §70). It - * accepts exactly what the reference implementation's codec.Peek accepts at - * afb44a3: the whole item must be well-formed within the limits above, every - * other key is skipped, and only duplicate keys, keys that are not integers - * or valid text, and ill-typed values of keys 0 and 1 are rejected. Its - * result is never the decoded object. + * Reads the type tag (key 0, a text string of at most MAX_TYPE_TAG_LEN + * bytes) and the schema version (key 1, an unsigned integer of at most + * 2^53-1) of the map at the start of `input`, before its strict decoding, so + * that an unknown schema version is reported as such (spec §69.1, §70). The + * map must announce at least two entries and no more than half the bytes + * after its head, and start with keys 0 and 1 in the profile; nothing after + * them is read. The result is never the decoded object. */ export function peek(input: Uint8Array): SchemaHead { - const { typeTag, version } = peekHead(input); - return { typeTag, version }; -} - -function peekHead(input: Uint8Array): SchemaHead & { versionText: string } { - const s = new RefScanner(input); - s.item(0); - if (s.off !== input.length) throw cborError(`${input.length - s.off} bytes of extraneous data`); - s.off = 0; - const top = s.head(); - if (top.major !== 5) throw cborError(`cannot read the schema of a ${MAJOR_NAMES[top.major]!}`); - const head = { typeTag: '', version: 0, versionText: '0' }; - const found = [false, false]; - const unmatched = new Set(); - for (let i = 0; i < top.val; i++) { - const k = s.head(); - let id: string; - if (k.major === 3) { - const t = decodeUtf8(s.take(k.val)); - if (t === undefined) throw cborError('map key is not valid UTF-8'); - id = `t${t}`; - } else if (k.major === 0 || k.major === 1) { - if (k.aboveInt64) throw cborError('map key overflows int64'); - if (k.major === 0 && k.val <= 1) { - if (found[k.val]) throw cborError(`duplicate map key ${k.val}`); - found[k.val] = true; - if (k.val === 0) head.typeTag = s.string(); - else [head.version, head.versionText] = s.uint64(); - continue; - } - id = `${k.major}:${k.key}`; - } else { - throw cborError(`map key of type ${MAJOR_NAMES[k.major]!}`); - } - if (unmatched.has(id)) throw cborError('duplicate map key'); - unmatched.add(id); - s.item(1); + const d = new Decoder(input); + const pairs = d.map(Number.MAX_SAFE_INTEGER); + if (pairs < 2) throw d.fail('map without a type tag and a schema version'); + let typeTag = ''; + let version = 0; + for (const want of [0, 1]) { + const k = d.key(); + if (k !== want) throw d.fail(`map key ${k} where key ${want} was expected`); + if (want === 0) typeTag = d.text(MAX_TYPE_TAG_LEN); + else version = d.uint(MAX_SAFE_UINT); } - return head; + return { typeTag, version }; } /** - * Requires key 0 to be `typeTag` (ERR_NON_CANONICAL_CBOR otherwise) and key - * 1 to be `version` (ERR_UNSUPPORTED_VERSION otherwise), as the reference - * codec.CheckSchema. + * Reads the schema head with peek and requires the expected values: another + * type tag is ERR_NON_CANONICAL_CBOR whatever the version, and only then + * another version is ERR_UNSUPPORTED_VERSION, whatever follows it (spec + * §69.1 layer 2). */ export function checkSchema(input: Uint8Array, typeTag: string, version: number): void { - const h = peekHead(input); - if (h.typeTag !== typeTag) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `codec: type ${goQuote(h.typeTag)}, want ${goQuote(typeTag)}`); - } + const h = peek(input); + if (h.typeTag !== typeTag) throw cborError(`type ${goQuote(h.typeTag)}, want ${goQuote(typeTag)}`); if (h.version !== version) { - throw new DateKeysError('ERR_UNSUPPORTED_VERSION', `codec: ${typeTag} schema version ${h.versionText}, want ${version}`); + throw new DateKeysError('ERR_UNSUPPORTED_VERSION', `codec: ${typeTag} schema version ${h.version}, want ${version}`); } } // --------------------------------------------------------------------------- // Walk -/** A decoded item of the profile. Map entries keep their order. */ +/** + * A decoded item of the profile. Map entries keep their order. Unsigned + * integers and map keys are numbers up to 2^53-1 and bigints above. + */ export type Item = - | { kind: 'uint'; value: number } + | { kind: 'uint'; value: Uint } | { kind: 'bytes'; value: Uint8Array } | { kind: 'text'; value: string } | { kind: 'array'; items: Item[] } - | { kind: 'map'; entries: { key: number; value: Item }[] }; + | { kind: 'map'; entries: { key: Uint; value: Item }[] }; + +/** The depth walk allows by default, and the one of the inspector's informative view. */ +export const MAX_NESTED_LEVELS = 16; + +interface WalkLevel { + /** Entries of a map or items of an array not read yet. */ + left: number; + item: Extract; + /** The key of the map entry whose value is read next. */ + key: Uint; +} /** - * Decodes any item of the profile with at most `maxDepth` nested containers - * and at most `maxLen` input bytes, applying the same strict rules as - * Decoder. It is a helper for shared vectors and for informative views of - * extension data; it never decides the validity of a protocol object. + * Decodes `input` as exactly one data item of the profile, as the Go + * codec.Walk: containers nested at most `maxDepth` deep (a scalar has depth + * 0, `81818100` has depth 3) and every byte string and text string at most + * `maxLen` bytes, every array at most `maxLen` items and every map at most + * `maxLen` entries. Unsigned integers take any value up to 2^64-1. It reads + * iteratively, so deep input cannot exhaust the stack. + * + * A helper for shared vectors and for informative views of extension data; + * it never decides the validity of a protocol object. */ export function walk(input: Uint8Array, maxDepth: number = MAX_NESTED_LEVELS, maxLen: number = input.length): Item { - if (input.length > maxLen) throw cborError(`input of ${input.length} bytes exceeds ${maxLen}`); const d = new Decoder(input); - const item = walkItem(d, maxDepth, 0); - d.done(); - return item; -} - -function walkItem(d: Decoder, maxDepth: number, depth: number): Item { - const major = d.peekMajor(); - switch (major) { - case 0: - return { kind: 'uint', value: d.uint() }; - case 2: - return { kind: 'bytes', value: d.bstr(0, d.remaining) }; - case 3: - return { kind: 'text', value: d.text(d.remaining) }; - case 4: - case 5: { - if (depth >= maxDepth) throw cborError(`more than ${maxDepth} nested containers`); - if (major === 4) { - const n = d.array(d.remaining); - const items: Item[] = []; - for (let i = 0; i < n; i++) items.push(walkItem(d, maxDepth, depth + 1)); - return { kind: 'array', items }; - } - const n = d.map(d.remaining); - const entries: { key: number; value: Item }[] = []; - for (let i = 0; i < n; i++) { - const key = d.key(); - entries.push({ key, value: walkItem(d, maxDepth, depth + 1) }); - } - d.endMap(); - return { kind: 'map', entries }; + const open: WalkLevel[] = []; + let root: Item | undefined; + const attach = (it: Item): void => { + const parent = open.at(-1); + if (parent === undefined) root = it; + else if (parent.item.kind === 'array') parent.item.items.push(it); + else parent.item.entries.push({ key: parent.key, value: it }); + }; + for (let first = true; first || open.length > 0; first = false) { + const top = open.at(-1); + if (top !== undefined && top.left === 0) { + // The innermost container is complete. + if (top.item.kind === 'map') d.endMap(); + open.pop(); + continue; + } + if (top !== undefined) { + top.left--; + if (top.item.kind === 'map') top.key = d.key(); + } + const major = d.next(); + if (major === MAJOR_MAP || major === MAJOR_ARRAY) { + if (open.length >= maxDepth) throw d.fail(`containers nested deeper than ${maxDepth}`); + const level: WalkLevel = + major === MAJOR_MAP + ? { left: d.map(maxLen), item: { kind: 'map', entries: [] }, key: 0 } + : { left: d.array(maxLen), item: { kind: 'array', items: [] }, key: 0 }; + attach(level.item); + open.push(level); + } else if (major === MAJOR_BYTES) { + attach({ kind: 'bytes', value: d.bstr(0, maxLen) }); + } else if (major === MAJOR_TEXT) { + attach({ kind: 'text', value: d.text(maxLen) }); + } else { + // An unsigned integer, or the error of whatever is there. + attach({ kind: 'uint', value: d.uint64() }); } - default: - throw cborError(`${MAJOR_NAMES[major]!} is outside the protocol profile`); } + d.done(); + return root!; } diff --git a/src/lib/dkc/control.ts b/src/lib/dkc/control.ts index 7bd68d2..39c3ed8 100644 --- a/src/lib/dkc/control.ts +++ b/src/lib/dkc/control.ts @@ -1,18 +1,11 @@ // CONTROL_CBOR (spec §31, §63 step 14), as DecodeControl and EncodeControl of -// the Go package capsule at afb44a3. payloadIdentity is I_PAYLOAD, a secret. +// the Go package capsule at 3820066. payloadIdentity is I_PAYLOAD, a secret. -import { copyBytes } from './bytes.ts'; -import { checkSchema, type Decoder, Encoder, MAX_SAFE_UINT, cborError, unmarshal } from './cbor.ts'; +import { copyBytes, utf8Length } from './bytes.ts'; +import { checkSchema, type Decoder, Encoder, unmarshal } from './cbor.ts'; import { DateKeysError, withContext } from './errors.ts'; -import { - checkDisjoint, - decodeExtensions, - decodeWireArray, - encodeExtensions, - encodeWireArray, - type Extension, - type ExtensionWire, -} from './extension.ts'; +import { canonicalExtensions, checkDisjoint, decodeArray, type Extension } from './extension.ts'; +import { encodeExtensionArrays, fieldOf, presence, requireKeys } from './schema.ts'; export const CONTROL_TYPE_TAG = 'datekeys-control'; export const CONTROL_VERSION = 1; @@ -29,84 +22,95 @@ export interface Control { readonly noncritical: readonly Extension[]; } +// CONTROL_CBOR as it is encoded: keys 2 to 5, keys 0 and 1 being the +// constants CONTROL_TYPE_TAG and CONTROL_VERSION. interface ControlWire { - typeTag: string; - version: number; headerBinding: Uint8Array; + /** SECRET. */ payloadIdentity: Uint8Array; - critical: ExtensionWire[] | undefined; - noncritical: ExtensionWire[] | undefined; + critical: Extension[] | undefined; + noncritical: Extension[] | undefined; } +// Reads CONTROL_CBOR with every CDDL rule. On failure it wipes the copy of +// I_PAYLOAD it read. function decodeWire(d: Decoder): ControlWire { - d.map(6); - d.expectKey(0); - const typeTag = d.text(MAX_SAFE_UINT); - d.expectKey(1); - const version = d.uint(); - d.expectKey(2); - const headerBinding = d.bstr(0, MAX_SAFE_UINT); - d.expectKey(3); - const payloadIdentity = d.bstr(0, MAX_SAFE_UINT); - // From here on, a failure wipes the copy of the secret it read. + const w: ControlWire = { headerBinding: new Uint8Array(0), payloadIdentity: new Uint8Array(0), critical: undefined, noncritical: undefined }; try { - let critical: ExtensionWire[] | undefined; - let noncritical: ExtensionWire[] | undefined; - while (d.pairsLeft() > 0) { + const pairs = d.map(6); + const seen = new Set(); + for (let i = 0; i < pairs; i++) { const k = d.key(); - if (k === 4) critical = decodeWireArray(d); - else if (k === 5) noncritical = decodeWireArray(d); - else throw cborError(`unknown CONTROL_CBOR key ${k}`); + const field = fieldOf(k); + switch (k) { + case 0: + field(() => d.text(utf8Length(CONTROL_TYPE_TAG))); + break; + case 1: + field(() => d.uint(CONTROL_VERSION)); + break; + case 2: + w.headerBinding = field(() => d.bstr(32, 32)); + break; + case 3: + w.payloadIdentity = field(() => d.bstr(32, 32)); + break; + case 4: + w.critical = field(() => decodeArray(d)); + break; + case 5: + w.noncritical = field(() => decodeArray(d)); + break; + default: + throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `key ${k} is not defined`); + } + seen.add(Number(k)); } + requireKeys(seen, 4); d.endMap(); - return { typeTag, version, headerBinding, payloadIdentity, critical, noncritical }; + return w; } catch (err) { - payloadIdentity.fill(0); + w.payloadIdentity.fill(0); throw err; } } function encodeWire(e: Encoder, w: ControlWire): void { - e.map(4 + (w.critical ? 1 : 0) + (w.noncritical ? 1 : 0)); + e.map(4 + presence(w.critical) + presence(w.noncritical)); e.uint(0); - e.text(w.typeTag); + e.text(CONTROL_TYPE_TAG); e.uint(1); - e.uint(w.version); + e.uint(CONTROL_VERSION); e.uint(2); e.bstr(w.headerBinding); e.uint(3); e.bstr(w.payloadIdentity); - if (w.critical) { - e.uint(4); - encodeWireArray(e, w.critical); - } - if (w.noncritical) { - e.uint(5); - encodeWireArray(e, w.noncritical); - } + encodeExtensionArrays(e, 4, w.critical, w.noncritical); } /** - * Validates and decodes CONTROL_CBOR. A non-canonical encoding is rejected - * even though CONTROL_CBOR is not hashed. + * Validates and decodes CONTROL_CBOR in the layers of spec §69.1: the type + * tag and the schema version, then canonical CBOR and the CDDL, then no + * identifier in both extension arrays. A non-canonical encoding is rejected + * even though CONTROL_CBOR is not hashed. Its critical extensions (layer 4) + * are checked by the caller. */ export function decodeControl(b: Uint8Array): Control { - withContext('capsule: CONTROL_CBOR', () => checkSchema(b, CONTROL_TYPE_TAG, CONTROL_VERSION)); - // I_PAYLOAD is wiped on every path: by decodeWire when decoding fails, by - // unmarshal's onReject when the decoded value is rejected, and by the - // finally block below otherwise. - const w = withContext('capsule: CONTROL_CBOR', () => unmarshal(b, decodeWire, encodeWire, (v) => v.payloadIdentity.fill(0))); - try { - if (w.headerBinding.length !== 32 || w.payloadIdentity.length !== 32) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'capsule: header_binding and payload_identity must be 32 bytes'); + return withContext('capsule: CONTROL_CBOR', () => { + checkSchema(b, CONTROL_TYPE_TAG, CONTROL_VERSION); + // I_PAYLOAD is wiped on every path: by decodeWire when decoding fails, by + // unmarshal's onReject when the decoded value is rejected, and by the + // finally block below otherwise. + const w = unmarshal(b, decodeWire, encodeWire, (v) => v.payloadIdentity.fill(0)); + try { + const critical = w.critical ?? []; + const noncritical = w.noncritical ?? []; + checkDisjoint(critical, noncritical); + return { headerBinding: w.headerBinding, payloadIdentity: copyBytes(w.payloadIdentity), critical, noncritical }; + } finally { + w.payloadIdentity.fill(0); } - const critical = withContext('capsule: CONTROL_CBOR critical_extensions', () => decodeExtensions(w.critical ?? [])); - const noncritical = withContext('capsule: CONTROL_CBOR noncritical_extensions', () => decodeExtensions(w.noncritical ?? [])); - withContext('capsule: CONTROL_CBOR', () => checkDisjoint(critical, noncritical)); - return { headerBinding: w.headerBinding, payloadIdentity: copyBytes(w.payloadIdentity), critical, noncritical }; - } finally { - w.payloadIdentity.fill(0); - } + }); } /** The Deterministic CBOR bytes of `c`. The caller must wipe them. */ @@ -114,18 +118,11 @@ export function encodeControl(c: Control): Uint8Array { if (c.headerBinding.length !== 32 || c.payloadIdentity.length !== 32) { throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'capsule: header_binding and payload_identity must be 32 bytes'); } - const critical = encodeExtensions(c.critical); - const noncritical = encodeExtensions(c.noncritical); + const critical = canonicalExtensions(c.critical); + const noncritical = canonicalExtensions(c.noncritical); checkDisjoint(c.critical, c.noncritical); const e = new Encoder(); - encodeWire(e, { - typeTag: CONTROL_TYPE_TAG, - version: CONTROL_VERSION, - headerBinding: c.headerBinding, - payloadIdentity: c.payloadIdentity, - critical, - noncritical, - }); + encodeWire(e, { headerBinding: c.headerBinding, payloadIdentity: c.payloadIdentity, critical, noncritical }); const out = e.out(); e.wipe(); return out; diff --git a/src/lib/dkc/datekey.ts b/src/lib/dkc/datekey.ts index a63c879..3777daf 100644 --- a/src/lib/dkc/datekey.ts +++ b/src/lib/dkc/datekey.ts @@ -1,4 +1,4 @@ -// DateKeys (spec §14-§19), as the Go package datekey at afb44a3: local +// DateKeys (spec §14-§19), as the Go package datekey at 3820066: local // resolution of an instant to a round and the canonical dk1_ representation. // // Instants carry full nanosecond precision: they are parsed by an RFC 3339 @@ -174,10 +174,14 @@ export function goBase64Decode(src: Uint8Array, url: boolean, padded: boolean, s return typeof r === 'number' ? undefined : r; } -// Go's datekey.decodeBase64: unpadded Base64URL, and also the padded and -// standard-alphabet variants so that they are reported as non-canonical -// rather than invalid; the final comparison rejects them. +// Go's datekey.decodeBase64, step 1 of spec §19: unpadded Base64URL, and +// also the padded and standard-alphabet variants and non-zero trailing bits, +// so that they are reported as non-canonical rather than invalid; the final +// comparison rejects them. CR and LF are rejected first: Go's decoders, and +// goBase64 with them, would skip them, and spec §19 allows no character +// outside the alphabet. function decodeBase64Lenient(src: Uint8Array): Uint8Array | undefined { + if (src.includes(0x0a) || src.includes(0x0d)) return undefined; return ( goBase64Decode(src, true, false, false) ?? goBase64Decode(src, true, true, false) ?? diff --git a/src/lib/dkc/extension.ts b/src/lib/dkc/extension.ts index a6e86ae..1e52b07 100644 --- a/src/lib/dkc/extension.ts +++ b/src/lib/dkc/extension.ts @@ -1,23 +1,23 @@ // The generic extension mechanism shared by PUBLIC_HEADER, CONTROL_CBOR and -// .dkk (spec §31, §44, §54, §72), as the Go package extension at afb44a3. +// .dkk (spec §31, §44, §54, §72), as the Go package extension at 3820066. // // Extension data is opaque bytes: the base protocol never decodes or // validates its content. This module enforces the structural rules only: // valid UTF-8 identifiers of 1 to 256 bytes, extension_version at most // 2^32-1, data that is absent or a non-empty byte string, 1 to 64 extensions -// per array, no identifier repeated within an object or present in both -// arrays, canonical order by the UTF-8 bytes of extension_id (never by -// JavaScript string comparison, which orders UTF-16 code units), rejection -// of unknown critical extensions and omission of empty arrays (spec §58.1). +// per array, in strictly ascending order of the UTF-8 bytes of extension_id +// (never JavaScript string order, which compares UTF-16 code units), no +// identifier in both arrays of an object, rejection of unknown critical +// extensions and omission of empty arrays (spec §58.1). // -// The checks run in two phases, as in the reference: the CBOR decoding of -// each extension map (decodeWire, part of the strict decoding of the -// containing object) and the array rules (decodeExtensions), which the -// containing object applies after its own field checks. +// Every rule of an array is checked while the array is decoded, with the +// rest of the CDDL of the containing object (layer 3 of spec §69.1); the +// critical extensions are checked against a registry afterwards, with the +// fields of the object (layer 4). -import { compareBytes, copyBytes, equalBytes, goQuote, utf8Bytes } from './bytes.ts'; -import { cborError, type Decoder, type Encoder, MAX_ARRAY_ELEMENTS, MAX_SAFE_UINT, type WideUint, wideUintText } from './cbor.ts'; -import { DateKeysError } from './errors.ts'; +import { compareBytes, copyBytes, goQuote, utf8Bytes } from './bytes.ts'; +import type { Decoder, Encoder } from './cbor.ts'; +import { DateKeysError, withContext } from './errors.ts'; /** Largest extension_id in UTF-8 bytes; an implementation limit (spec §74). */ export const MAX_ID_LEN = 256; @@ -41,18 +41,7 @@ export interface Extension { readonly data: Uint8Array | undefined; } -/** - * One extension map as decoded from CBOR, before the array rules. `idUtf8` - * holds the exact UTF-8 bytes of the identifier, the ordering key. `version` - * is any uint64, as in the reference: its bound is an array rule, checked by - * decodeExtensions after the field checks of the containing object. - */ -export interface ExtensionWire { - readonly id: string; - readonly idUtf8: Uint8Array; - readonly version: WideUint; - readonly data: Uint8Array | undefined; -} +const nonCanonical = (context: string): DateKeysError => new DateKeysError('ERR_NON_CANONICAL_CBOR', context); /** * Returns an extension that carries data, of which it keeps a copy. `data` @@ -61,132 +50,169 @@ export interface ExtensionWire { */ export function newExtension(id: string, version: number, data: Uint8Array): Extension { if (!(data instanceof Uint8Array)) { - throw new DateKeysError( - 'ERR_NON_CANONICAL_CBOR', - `extension ${goQuote(id)}: newExtension needs data; an extension without data is { id, version, data: undefined }`, - ); + throw nonCanonical(`extension ${goQuote(id)}: newExtension needs data; an extension without data is { id, version, data: undefined }`); } const e: Extension = { id, version, data: copyBytes(data) }; - validate(e.id, utf8Bytes(id), { value: e.version }, e.data); + validate(e, idBytes(e)); return e; } -function validate(id: string, idUtf8: Uint8Array, version: WideUint, data: Uint8Array | undefined): void { - if (idUtf8.length === 0 || idUtf8.length > MAX_ID_LEN || !id.isWellFormed()) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension: invalid extension_id ${goQuote(id)}`); +// The UTF-8 bytes of an identifier, or undefined when it is not well-formed +// Unicode (a lone surrogate), which no valid UTF-8 encodes. +function idBytes(e: Extension): Uint8Array | undefined { + return e.id.isWellFormed() ? utf8Bytes(e.id) : undefined; +} + +function validate(e: Extension, id: Uint8Array | undefined): void { + if (id === undefined || id.length === 0 || id.length > MAX_ID_LEN) { + throw nonCanonical(`extension: invalid extension_id ${goQuote(e.id)}`); } - if (!Number.isInteger(version.value) || version.value < 0 || version.value > MAX_VERSION) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension ${id}: extension_version ${wideUintText(version)} exceeds ${MAX_VERSION}`); + if (!Number.isInteger(e.version) || e.version < 0 || e.version > MAX_VERSION) { + throw nonCanonical(`extension ${e.id}: extension_version ${e.version} exceeds ${MAX_VERSION}`); } - if (data !== undefined && (data.length === 0 || data.length > MAX_DATA_LEN)) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension ${id}: data of ${data.length} bytes outside 1..${MAX_DATA_LEN}`); + if (e.data !== undefined && (e.data.length === 0 || e.data.length > MAX_DATA_LEN)) { + throw nonCanonical(`extension ${e.id}: data of ${e.data.length} bytes outside 1..${MAX_DATA_LEN}`); } } +// The order of spec §54 between two consecutive entries: an identifier +// equal to the previous one is repeated, a smaller one is out of order. +function checkOrder(prev: Uint8Array, id: Uint8Array, e: Extension): void { + const c = compareBytes(prev, id); + if (c === 0) throw nonCanonical(`extension ${e.id}: appears more than once`); + if (c > 0) throw nonCanonical(`extension ${e.id}: array is not in canonical order`); +} + // --------------------------------------------------------------------------- -// CBOR +// Encoding /** - * Decodes one extension map: key 0 a text string, key 1 an unsigned integer - * of up to 64 bits and, when present, key 2 a byte string of at least one - * byte. The empty byte string and every other CBOR type at key 2 are rejected - * here (spec §54, §58.1). The array rules, the bound of extension_version - * among them, are applied later by decodeExtensions. + * Validates one extension array and returns it in canonical order, sorted + * by the UTF-8 bytes of extension_id: 1 to 64 valid extensions, no + * identifier repeated. An empty input yields undefined, so that the array + * key is omitted (spec §58.1). */ -export function decodeWire(d: Decoder): ExtensionWire { - const n = d.map(3); - d.expectKey(0); - const { text: id, utf8: idUtf8 } = d.textUtf8(MAX_SAFE_UINT); - d.expectKey(1); - const version = d.wideUint(); - let data: Uint8Array | undefined; - if (n === 3) { - d.expectKey(2); - data = d.bstr(1, MAX_DATA_LEN); - } - d.endMap(); - return { id, idUtf8, version, data }; +export function canonicalExtensions(exts: readonly Extension[]): Extension[] | undefined { + if (exts.length === 0) return undefined; + if (exts.length > MAX_EXTENSIONS) throw errTooMany(exts.length); + const sorted = exts.map((e) => ({ e, id: idBytes(e) })); + for (const { e, id } of sorted) validate(e, id); + sorted.sort((a, b) => compareBytes(a.id!, b.id!)); + for (let i = 1; i < sorted.length; i++) checkOrder(sorted[i - 1]!.id!, sorted[i]!.id!, sorted[i]!.e); + return sorted.map(({ e }) => ({ id: e.id, version: e.version, data: e.data === undefined ? undefined : copyBytes(e.data) })); } -/** - * Decodes the value of an extension-array key: an array of 1 to 65536 - * extension maps (the element limit of the reference decoder). The empty - * array is rejected: an absent array omits its key (spec §58.1). - */ -export function decodeWireArray(d: Decoder): ExtensionWire[] { - const n = d.array(MAX_ARRAY_ELEMENTS); - if (n === 0) throw cborError('empty extension array; an array without extensions omits its key'); - const out: ExtensionWire[] = []; - for (let i = 0; i < n; i++) out.push(decodeWire(d)); - return out; +function errTooMany(n: number): DateKeysError { + return nonCanonical(`extension: ${n} extensions in one array, at most ${MAX_EXTENSIONS}`); } -/** Encodes one extension map; data omits key 2 when undefined or empty. */ -export function encodeWire(e: Encoder, w: ExtensionWire): void { - const hasData = w.data !== undefined && w.data.length > 0; - e.map(hasData ? 3 : 2); - e.uint(0); - e.text(w.id); - e.uint(1); - e.wideUint(w.version); - if (hasData) { - e.uint(2); - e.bstr(w.data!); +/** + * Writes a non-empty extension array as canonicalExtensions returns it: each + * extension is the map {0: extension_id, 1: extension_version} with key 2, + * the data as a byte string, only when it carries data (spec §54). An array + * that decodeArray would reject is not written: its error is recorded in + * `e`, whose out() throws it. + */ +export function encodeArray(e: Encoder, exts: readonly Extension[]): void { + try { + checkArray(exts); + } catch (err) { + e.fail(err as DateKeysError); + return; + } + e.array(exts.length); + for (const x of exts) { + e.map(x.data === undefined ? 2 : 3); + e.uint(0); + e.text(x.id); + e.uint(1); + e.uint(x.version); + if (x.data !== undefined) { + e.uint(2); + e.bstr(x.data); + } } } -/** Encodes an extension array. */ -export function encodeWireArray(e: Encoder, ws: readonly ExtensionWire[]): void { - e.array(ws.length); - for (const w of ws) encodeWire(e, w); +// The rules of decodeArray applied to an array to be written. +function checkArray(exts: readonly Extension[]): void { + if (exts.length === 0) throw nonCanonical('extension: empty array; an absent array omits its key'); + if (exts.length > MAX_EXTENSIONS) throw errTooMany(exts.length); + let prev: Uint8Array | undefined; + for (const x of exts) { + const id = idBytes(x); + validate(x, id); + if (prev !== undefined) checkOrder(prev, id!, x); + prev = id; + } } // --------------------------------------------------------------------------- -// Array rules +// Decoding /** - * Validates one extension array and returns its canonical wire form, sorted - * by the UTF-8 bytes of extension_id. An empty input yields undefined, so - * that the array key is omitted (spec §58.1). + * Reads one extension array, as the Go extension.DecodeArray. The array + * holds 1 to 64 entries, which its head declares before any is read; each + * entry is a map with key 0, a non-empty UTF-8 extension_id of at most + * MAX_ID_LEN bytes, key 1, an extension_version of at most MAX_VERSION, and + * optionally key 2, a byte string of at least one byte whose content is + * copied and never decoded (spec §54, §58.1). Entries are in strictly + * ascending order of the UTF-8 bytes of extension_id. Every failure is + * ERR_NON_CANONICAL_CBOR. */ -export function encodeExtensions(exts: readonly Extension[]): ExtensionWire[] | undefined { - if (exts.length === 0) return undefined; - if (exts.length > MAX_EXTENSIONS) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension: ${exts.length} extensions in one array, at most ${MAX_EXTENSIONS}`); - } - const sorted = exts.map((e) => ({ e, idUtf8: utf8Bytes(e.id) })).sort((a, b) => compareBytes(a.idUtf8, b.idUtf8)); - const out: ExtensionWire[] = []; - for (const [i, { e, idUtf8 }] of sorted.entries()) { - const version: WideUint = { value: e.version }; - validate(e.id, idUtf8, version, e.data); - if (i > 0 && equalBytes(sorted[i - 1]!.idUtf8, idUtf8)) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension ${e.id}: appears more than once`); - } - out.push({ id: e.id, idUtf8, version, data: e.data === undefined ? undefined : copyBytes(e.data) }); +export function decodeArray(d: Decoder): Extension[] { + const n = withContext('extension', () => d.array(MAX_EXTENSIONS)); + if (n === 0) throw nonCanonical('extension: empty array; an absent array omits its key'); + const out: Extension[] = []; + let prev: Uint8Array | undefined; + for (let i = 0; i < n; i++) { + const { e, id } = decodeOne(d); + if (prev !== undefined) checkOrder(prev, id, e); + prev = id; + out.push(e); } return out; } -/** - * Validates one decoded extension array: at most 64 entries, each one valid, - * in canonical order and with no repeated identifier. The data is copied, - * never decoded. - */ -export function decodeExtensions(ws: readonly ExtensionWire[]): Extension[] { - if (ws.length > MAX_EXTENSIONS) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension: ${ws.length} extensions in one array, at most ${MAX_EXTENSIONS}`); - } - const out: Extension[] = []; - for (const [i, w] of ws.entries()) { - validate(w.id, w.idUtf8, w.version, w.data); - if (i > 0) { - const c = compareBytes(ws[i - 1]!.idUtf8, w.idUtf8); - if (c === 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension ${w.id}: appears more than once`); - if (c > 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension ${w.id}: array is not in canonical order`); +// Reads the map of one extension. Key 2, when present, must be a byte string +// of at least one byte: the empty byte string and every other CBOR type are +// rejected explicitly (spec §54, §58.1). +function decodeOne(d: Decoder): { e: Extension; id: Uint8Array } { + let id = ''; + let idUtf8: Uint8Array = new Uint8Array(0); + let version = 0; + let data: Uint8Array | undefined; + let seenId = false; + let seenVersion = false; + const pairs = withContext('extension', () => d.map(3)); + for (let i = 0; i < pairs; i++) { + const k = withContext('extension', () => d.key()); + // A read that fails names the extension and the key. + const field = (read: () => T): T => withContext(`extension ${goQuote(id)}: key ${k}`, read); + switch (k) { + case 0: + ({ text: id, utf8: idUtf8 } = field(() => d.textUtf8(MAX_ID_LEN))); + seenId = true; + break; + case 1: + version = field(() => d.uint(MAX_VERSION)); + seenVersion = true; + break; + case 2: + data = field(() => d.bstr(0, MAX_DATA_LEN)); + if (data.length === 0) { + throw nonCanonical(`extension ${goQuote(id)}: data is present but empty; an extension without data omits key 2`); + } + break; + default: + throw nonCanonical(`extension ${goQuote(id)}: unknown key ${k}`); } - out.push({ id: w.id, version: w.version.value, data: w.data === undefined ? undefined : copyBytes(w.data) }); } - return out; + if (!seenId || !seenVersion) throw nonCanonical(`extension ${goQuote(id)}: extension_id and extension_version are required`); + const e: Extension = { id, version, data }; + validate(e, idUtf8); + d.endMap(); + return { e, id: idUtf8 }; } /** @@ -199,7 +225,7 @@ export function checkDisjoint(critical: readonly Extension[], noncritical: reado const b = sortedIds(noncritical); for (let i = 0, j = 0; i < a.length && j < b.length; ) { const c = compareBytes(a[i]!.utf8, b[j]!.utf8); - if (c === 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `extension ${a[i]!.id}: both critical and noncritical`); + if (c === 0) throw nonCanonical(`extension ${a[i]!.id}: both critical and noncritical`); if (c < 0) i++; else j++; } @@ -240,7 +266,8 @@ export class ExtensionSet implements ExtensionRegistry { * Rejects every critical extension unknown to `reg` with * ERR_EXTENSION_CRITICAL_UNKNOWN and, when `reg` validates data, every known * one whose data it rejects with ERR_EXTENSION_DATA_INVALID (spec §54, §70). - * An unknown extension takes precedence over invalid data. + * An unknown extension anywhere in the array takes precedence over invalid + * data (spec §69.1). */ export function checkCritical(critical: readonly Extension[], reg?: ExtensionRegistry): void { for (const c of critical) { diff --git a/src/lib/dkc/framing.ts b/src/lib/dkc/framing.ts index 5d9f54d..74edc28 100644 --- a/src/lib/dkc/framing.ts +++ b/src/lib/dkc/framing.ts @@ -1,5 +1,5 @@ // DKC1 and DKK1 framing (spec §22, §23, §40, §57), as the Go packages capsule -// (framing.go, inspect.go) and accesskey at afb44a3. +// (framing.go, inspect.go) and accesskey at 3820066. // // A .dkc is PRELUDE || PUBLIC_HEADER || SEALED_CONTROL || PAYLOAD_AGE; the // payload runs to EOF. A .dkk is a 12-byte prelude and BODY_CBOR. @@ -36,9 +36,10 @@ const hx = (v: number): string => v.toString(16); const hx2 = (v: number): string => v.toString(16).padStart(2, '0'); /** - * Validates the prelude (spec §22, §63 step 2): magic, version, FLAGS == 0, - * RESERVED == 0 and the length limits of spec §57. `b` holds the bytes read, - * at most 16. + * Validates the prelude (spec §22, §23, §63 steps 1 and 2), in the order of + * spec §23: magic, a complete prelude, version, FLAGS == 0 and RESERVED == 0, + * and each length from 1 up to its limit of spec §57. `b` holds the bytes + * read, at most 16. */ export function parsePrelude(b: Uint8Array): Prelude { if (!hasMagic(b, DKC_MAGIC)) throw new DateKeysError('ERR_INVALID_MAGIC', 'capsule'); @@ -154,9 +155,10 @@ export function dkkPreludeBytes(bodyLen: number): Uint8Array { } /** - * Validates the DKK1 framing of a whole .dkk and returns BODY_CBOR: magic, - * version, FLAGS and RESERVED, the §57 limit, the declared length and no - * data after the body (spec §40). + * Validates the DKK1 framing of a whole .dkk and returns BODY_CBOR, in the + * order of spec §40: magic, a complete prelude, version, FLAGS and RESERVED, + * BODY_LEN in 1..16 MiB (spec §57), the declared length and no data after + * the body. */ export function splitAccessKey(dkk: Uint8Array): Uint8Array { const pre = dkk.subarray(0, DKK_PRELUDE_SIZE); @@ -166,9 +168,11 @@ export function splitAccessKey(dkk: Uint8Array): Uint8Array { if (pre[5] !== 0 || pre[6] !== 0 || pre[7] !== 0) { throw new DateKeysError('ERR_INVALID_FLAGS', `accesskey: flags 0x${hx(pre[5]!)}, reserved 0x${hx(pre[6]!)}${hx2(pre[7]!)}`); } + // Spec §40, §57: BODY_LEN in 1..16 MiB. No empty frame holds a valid body, + // so 0 is a framing error, like a PUBLIC_HEADER_LEN of 0 (§22). const bodyLen = readUint32BE(pre, 8); - if (bodyLen > MAX_DKK_BODY_LEN) { - throw new DateKeysError('ERR_INTEGRITY', `accesskey: BODY_LEN ${bodyLen} exceeds the ${MAX_DKK_BODY_LEN}-byte limit`); + if (bodyLen === 0 || bodyLen > MAX_DKK_BODY_LEN) { + throw new DateKeysError('ERR_INTEGRITY', `accesskey: BODY_LEN ${bodyLen} outside 1..${MAX_DKK_BODY_LEN}`); } const end = DKK_PRELUDE_SIZE + bodyLen; if (dkk.length < end) throw new DateKeysError('ERR_INTEGRITY', 'accesskey: truncated body'); diff --git a/src/lib/dkc/header.ts b/src/lib/dkc/header.ts index 6329ad6..b06de38 100644 --- a/src/lib/dkc/header.ts +++ b/src/lib/dkc/header.ts @@ -1,20 +1,13 @@ // PUBLIC_HEADER (spec §24, §27), as DecodeHeader and EncodeHeader of the Go -// package capsule at afb44a3. +// package capsule at 3820066. -import { goQuote, toHex } from './bytes.ts'; -import { checkSchema, type Decoder, Encoder, MAX_SAFE_UINT, cborError, unmarshal, type WideUint, wideUintText } from './cbor.ts'; +import { goQuote, toHex, utf8Length } from './bytes.ts'; +import { checkSchema, type Decoder, Encoder, MAX_SAFE_UINT, unmarshal } from './cbor.ts'; import { compactDateKey, type DateKey, parseDateKey } from './datekey.ts'; import { DateKeysError, withContext } from './errors.ts'; import { MAX_PUBLIC_HEADER_LEN } from './framing.ts'; -import { - checkDisjoint, - decodeExtensions, - decodeWireArray, - encodeExtensions, - encodeWireArray, - type Extension, - type ExtensionWire, -} from './extension.ts'; +import { canonicalExtensions, checkDisjoint, decodeArray, type Extension } from './extension.ts'; +import { encodeExtensionArrays, fieldOf, presence, requireKeys } from './schema.ts'; export const HEADER_TYPE_TAG = 'datekeycap'; export const HEADER_VERSION = 1; @@ -58,87 +51,100 @@ export function capsuleIdHex(h: Header): string { return toHex(h.capsuleId); } +// PUBLIC_HEADER as it is encoded: keys 2 to 6, keys 0 and 1 being the +// constants HEADER_TYPE_TAG and HEADER_VERSION. interface HeaderWire { - typeTag: string; - version: number; capsuleId: Uint8Array; dateKey: string; - /** Any uint64, as in the reference: its range is checked after the DateKey. */ - policy: WideUint; - critical: ExtensionWire[] | undefined; - noncritical: ExtensionWire[] | undefined; + policy: number; + critical: Extension[] | undefined; + noncritical: Extension[] | undefined; } +// Reads PUBLIC_HEADER with every CDDL rule whose violation is +// ERR_NON_CANONICAL_CBOR, the extension arrays included (layer 3 of spec +// §69.1); the DateKey, which has codes of its own (spec §57), is parsed +// afterwards. function decodeWire(d: Decoder): HeaderWire { - d.map(7); - d.expectKey(0); - const typeTag = d.text(MAX_SAFE_UINT); - d.expectKey(1); - const version = d.uint(); - d.expectKey(2); - const capsuleId = d.bstr(0, MAX_SAFE_UINT); - d.expectKey(3); - const dateKey = d.text(MAX_SAFE_UINT); - d.expectKey(4); - const policy = d.wideUint(); - let critical: ExtensionWire[] | undefined; - let noncritical: ExtensionWire[] | undefined; - while (d.pairsLeft() > 0) { + const w: HeaderWire = { capsuleId: new Uint8Array(0), dateKey: '', policy: 0, critical: undefined, noncritical: undefined }; + const pairs = d.map(7); + const seen = new Set(); + for (let i = 0; i < pairs; i++) { const k = d.key(); - if (k === 5) critical = decodeWireArray(d); - else if (k === 6) noncritical = decodeWireArray(d); - else throw cborError(`unknown PUBLIC_HEADER key ${k}`); + const field = fieldOf(k); + switch (k) { + case 0: + field(() => d.text(utf8Length(HEADER_TYPE_TAG))); + break; + case 1: + field(() => d.uint(HEADER_VERSION)); + break; + case 2: + w.capsuleId = field(() => d.bstr(CAPSULE_ID_SIZE, CAPSULE_ID_SIZE)); + break; + case 3: + w.dateKey = field(() => d.text(MAX_PUBLIC_HEADER_LEN)); + break; + case 4: + // Compared as read: 256, 257 or 2^32 are not a V1 policy. + w.policy = field(() => { + const p = d.uint(MAX_SAFE_UINT); + if (p > TIME_AND_KEY) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `access_policy ${p} is not defined in V1`); + return p; + }); + break; + case 5: + w.critical = field(() => decodeArray(d)); + break; + case 6: + w.noncritical = field(() => decodeArray(d)); + break; + default: + throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `key ${k} is not defined`); + } + seen.add(Number(k)); } + requireKeys(seen, 5); d.endMap(); - return { typeTag, version, capsuleId, dateKey, policy, critical, noncritical }; + return w; } function encodeWire(e: Encoder, w: HeaderWire): void { - e.map(5 + (w.critical ? 1 : 0) + (w.noncritical ? 1 : 0)); + e.map(5 + presence(w.critical) + presence(w.noncritical)); e.uint(0); - e.text(w.typeTag); + e.text(HEADER_TYPE_TAG); e.uint(1); - e.uint(w.version); + e.uint(HEADER_VERSION); e.uint(2); e.bstr(w.capsuleId); e.uint(3); e.text(w.dateKey); e.uint(4); - e.wideUint(w.policy); - if (w.critical) { - e.uint(5); - encodeWireArray(e, w.critical); - } - if (w.noncritical) { - e.uint(6); - encodeWireArray(e, w.noncritical); - } + e.uint(w.policy); + encodeExtensionArrays(e, 5, w.critical, w.noncritical); } /** - * Validates and decodes PUBLIC_HEADER bytes (spec §24, §27, §63 step 4): the - * §57 limit, the schema head, canonical CBOR, a 16-byte capsule_id, a - * canonical DateKey, a V1 access policy and well-formed extension arrays, in - * that order. Whether the profile is pinned and the critical extensions known - * is decided by the caller. + * Validates and decodes PUBLIC_HEADER bytes (spec §24, §27, §63 step 4) in + * the layers of spec §69.1: the §57 limit (layer 1, ERR_INTEGRITY); the type + * tag and the schema version (layer 2); canonical CBOR and the CDDL, with a + * 16-byte capsule_id, a V1 access policy and well-formed extension arrays in + * strictly ascending order, and no identifier in both arrays (layer 3, + * ERR_NON_CANONICAL_CBOR); and only then a canonical DateKey (layer 4). + * Whether the profile is pinned and the critical extensions known is decided + * by the caller, still in layer 4. */ export function decodeHeader(b: Uint8Array): Header { if (b.length > MAX_PUBLIC_HEADER_LEN) { throw new DateKeysError('ERR_INTEGRITY', `capsule: PUBLIC_HEADER of ${b.length} bytes exceeds ${MAX_PUBLIC_HEADER_LEN}`); } - withContext('capsule: PUBLIC_HEADER', () => checkSchema(b, HEADER_TYPE_TAG, HEADER_VERSION)); - const w = withContext('capsule: PUBLIC_HEADER', () => unmarshal(b, decodeWire, encodeWire)); - if (w.capsuleId.length !== CAPSULE_ID_SIZE) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `capsule: capsule_id is ${w.capsuleId.length} bytes, want ${CAPSULE_ID_SIZE}`); - } - const dateKey = withContext('capsule: PUBLIC_HEADER', () => parseDateKey(w.dateKey)); - if (w.policy.value > 1) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `capsule: access_policy ${wideUintText(w.policy)} is not defined in V1`); - } - const critical = withContext('capsule: PUBLIC_HEADER critical_extensions', () => decodeExtensions(w.critical ?? [])); - const noncritical = withContext('capsule: PUBLIC_HEADER noncritical_extensions', () => decodeExtensions(w.noncritical ?? [])); - withContext('capsule: PUBLIC_HEADER', () => checkDisjoint(critical, noncritical)); - return { capsuleId: w.capsuleId, dateKey, policy: w.policy.value, critical, noncritical }; + return withContext('capsule: PUBLIC_HEADER', () => { + checkSchema(b, HEADER_TYPE_TAG, HEADER_VERSION); + const w = unmarshal(b, decodeWire, encodeWire); + checkDisjoint(w.critical ?? [], w.noncritical ?? []); + const dateKey = parseDateKey(w.dateKey); + return { capsuleId: w.capsuleId, dateKey, policy: w.policy, critical: w.critical ?? [], noncritical: w.noncritical ?? [] }; + }); } /** The Deterministic CBOR bytes of `h`, at most MAX_PUBLIC_HEADER_LEN. */ @@ -149,22 +155,15 @@ export function encodeHeader(h: Header): Uint8Array { if (h.capsuleId.length !== CAPSULE_ID_SIZE) { throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `capsule: capsule_id is ${h.capsuleId.length} bytes, want ${CAPSULE_ID_SIZE}`); } - const critical = encodeExtensions(h.critical); - const noncritical = encodeExtensions(h.noncritical); + const critical = canonicalExtensions(h.critical); + const noncritical = canonicalExtensions(h.noncritical); checkDisjoint(h.critical, h.noncritical); const e = new Encoder(); - encodeWire(e, { - typeTag: HEADER_TYPE_TAG, - version: HEADER_VERSION, - capsuleId: h.capsuleId, - dateKey: compact, - policy: { value: h.policy }, - critical, - noncritical, - }); + encodeWire(e, { capsuleId: h.capsuleId, dateKey: compact, policy: h.policy, critical, noncritical }); const b = e.out(); if (b.length > MAX_PUBLIC_HEADER_LEN) { throw new DateKeysError('ERR_INTEGRITY', `capsule: PUBLIC_HEADER of ${b.length} bytes exceeds ${MAX_PUBLIC_HEADER_LEN}`); } return b; } + diff --git a/src/lib/dkc/inspect.ts b/src/lib/dkc/inspect.ts index 1ad978b..2fd54cd 100644 --- a/src/lib/dkc/inspect.ts +++ b/src/lib/dkc/inspect.ts @@ -1,4 +1,4 @@ -// Steps 1 to 8 of spec §63, as Inspect of the Go package capsule at afb44a3, +// Steps 1 to 8 of spec §63, as Inspect of the Go package capsule at 3820066, // and the JSON view of `datekeys inspect -json`. // // The inspection never contacts a release source and never uses a secret, so @@ -280,3 +280,16 @@ function orderView(v: InspectView): InspectView { for (const k of keys) if (v[k] !== undefined) o[k] = v[k]; return o as unknown as InspectView; } + +/** + * The exact output of `datekeys inspect -json` for `view` (Go's + * inspectview.WriteJSON): json.Encoder with SetIndent("", " "), which + * escapes <, > and & (SetEscapeHTML is on by default) and U+2028 and + * U+2029, and ends with a newline. Keys and non-string values never hold + * those characters, so escaping the whole text only touches strings. + * JSON.stringify writes every other escape as Go 1.22 and later do. + */ +export function inspectJSON(view: InspectView): string { + const text = JSON.stringify(view, null, 2).replace(/[<>&\u{2028}\u{2029}]/gu, (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`); + return `${text}\n`; +} diff --git a/src/lib/dkc/profile.ts b/src/lib/dkc/profile.ts index 7b2cb78..82354b2 100644 --- a/src/lib/dkc/profile.ts +++ b/src/lib/dkc/profile.ts @@ -1,9 +1,9 @@ -// Provider Profiles (spec §10-§13), as the Go package profile at afb44a3: +// Provider Profiles (spec §10-§13), as the Go package profile at 3820066: // their Deterministic CBOR, profile_hash, validation and the locally pinned // registry that forms the root of trust. import { checkCompressedPoint, type Group } from './bls12381.ts'; -import { concatBytes, copyBytes, equalBytes, goQuote, fromHex, sha256, toHex, utf8Bytes } from './bytes.ts'; +import { concatBytes, copyBytes, equalBytes, goQuote, fromHex, sha256, toHex, utf8Bytes, utf8Length } from './bytes.ts'; import { checkSchema, type Decoder, Encoder, MAX_SAFE_UINT, unmarshal } from './cbor.ts'; import { DateKeysError, withContext } from './errors.ts'; @@ -92,9 +92,9 @@ export function cloneProfile(p: Profile): Profile { // --------------------------------------------------------------------------- // CBOR +// The CBOR map of spec §11, keys 2 to 10; keys 0 and 1 are the constants +// PROFILE_TYPE_TAG and PROFILE_SCHEMA_VERSION. Every key is required. interface ProfileWire { - typeTag: string; - version: number; id: string; provider: string; network: string; @@ -106,40 +106,82 @@ interface ProfileWire { genesisSeed: Uint8Array; } +const WIRE_KEYS = 11; + +// Bounds a field only by the input: its rule carries its own error code +// (spec §57) and is checked with the fields, after decoding. +const UNBOUNDED = Number.MAX_SAFE_INTEGER; + +// Reads the map with every CDDL rule whose violation is +// ERR_NON_CANONICAL_CBOR (rule 1 of spec §12.1); the names and the public +// key are left to the field rules. function decodeWire(d: Decoder): ProfileWire { - d.map(11); - d.expectKey(0); - const typeTag = d.text(MAX_SAFE_UINT); - d.expectKey(1); - const version = d.uint(); - d.expectKey(2); - const id = d.text(MAX_SAFE_UINT); - d.expectKey(3); - const provider = d.text(MAX_SAFE_UINT); - d.expectKey(4); - const network = d.text(MAX_SAFE_UINT); - d.expectKey(5); - const chainHash = d.bstr(0, MAX_SAFE_UINT); - d.expectKey(6); - const publicKey = d.bstr(0, MAX_SAFE_UINT); - d.expectKey(7); - const period = d.uint(); - d.expectKey(8); - const genesisTime = d.uint(); - d.expectKey(9); - const scheme = d.text(MAX_SAFE_UINT); - d.expectKey(10); - const genesisSeed = d.bstr(0, MAX_SAFE_UINT); + const w: ProfileWire = { + id: '', + provider: '', + network: '', + chainHash: new Uint8Array(0), + publicKey: new Uint8Array(0), + period: 0, + genesisTime: 0, + scheme: '', + genesisSeed: new Uint8Array(0), + }; + const pairs = d.map(WIRE_KEYS); + if (pairs !== WIRE_KEYS) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `${pairs} keys, want all ${WIRE_KEYS}`); + for (let want = 0; want < WIRE_KEYS; want++) { + const k = d.key(); + if (k !== want) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `key ${k} where key ${want} was expected`); + withContext(`key ${k}`, () => { + switch (want) { + case 0: + d.text(utf8Length(PROFILE_TYPE_TAG)); + break; + case 1: + d.uint(PROFILE_SCHEMA_VERSION); + break; + case 2: + w.id = d.text(UNBOUNDED); + break; + case 3: + w.provider = d.text(UNBOUNDED); + break; + case 4: + w.network = d.text(UNBOUNDED); + break; + case 5: + w.chainHash = d.bstr(32, 32); + break; + case 6: + w.publicKey = d.bstr(0, UNBOUNDED); + break; + case 7: + // Spec §11: period in 1..2^53-1. + w.period = d.uint(MAX_SAFE_UINT); + if (w.period === 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'period 0'); + break; + case 8: + // Spec §11: genesis_time in 0..2^53-1, unsigned. + w.genesisTime = d.uint(MAX_SAFE_UINT); + break; + case 9: + w.scheme = d.text(UNBOUNDED); + break; + default: + w.genesisSeed = d.bstr(32, 32); + } + }); + } d.endMap(); - return { typeTag, version, id, provider, network, chainHash, publicKey, period, genesisTime, scheme, genesisSeed }; + return w; } function encodeWire(e: Encoder, w: ProfileWire): void { - e.map(11); + e.map(WIRE_KEYS); e.uint(0); - e.text(w.typeTag); + e.text(PROFILE_TYPE_TAG); e.uint(1); - e.uint(w.version); + e.uint(PROFILE_SCHEMA_VERSION); e.uint(2); e.text(w.id); e.uint(3); @@ -172,7 +214,7 @@ export function canonicalCBOR(p: Profile): Uint8Array { throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'profile: chain hash and genesis seed must be 32 bytes'); } const e = new Encoder(); - encodeWire(e, { typeTag: PROFILE_TYPE_TAG, version: PROFILE_SCHEMA_VERSION, ...p }); + encodeWire(e, p); return e.out(); } @@ -182,46 +224,65 @@ export async function profileHash(p: Profile): Promise { } /** - * Parses the Deterministic CBOR of a Provider Profile and validates it. It - * does not make the profile trusted: only a registry built by the caller - * does (spec §13). + * Parses the Deterministic CBOR of a Provider Profile and validates it with + * rules 1 to 3 of spec §12.1, in their order: the type tag, the schema + * version and the CDDL with the period limit (ERR_NON_CANONICAL_CBOR or + * ERR_UNSUPPORTED_VERSION), the field rules (ERR_UNKNOWN_PROFILE) and the + * chain-hash self-check (ERR_PROFILE_MISMATCH). It does not make the profile + * trusted: only a registry built by the caller does (spec §13). */ export async function decodeProfile(b: Uint8Array): Promise { - withContext('profile', () => checkSchema(b, PROFILE_TYPE_TAG, PROFILE_SCHEMA_VERSION)); - const w = withContext('profile', () => unmarshal(b, decodeWire, encodeWire)); - if (w.chainHash.length !== 32 || w.genesisSeed.length !== 32) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'profile: chain hash and genesis seed must be 32 bytes'); - } - // Spec §11: period in 1..2^53-1 and genesis_time in 0..2^53-1; the decoder - // already rejected every integer above 2^53-1. - if (w.period === 0) { - throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `profile: period ${w.period} or genesis time ${w.genesisTime} outside the schema`); - } + const w = withContext('profile', () => { + checkSchema(b, PROFILE_TYPE_TAG, PROFILE_SCHEMA_VERSION); + return unmarshal(b, decodeWire, encodeWire); + }); if (w.period > MAX_PERIOD) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `profile: period ${w.period} s out of range`); - const p: Profile = { - id: w.id, - provider: w.provider, - network: w.network, - chainHash: w.chainHash, - publicKey: w.publicKey, - period: w.period, - genesisTime: w.genesisTime, - scheme: w.scheme, - genesisSeed: w.genesisSeed, - }; + const p: Profile = { ...w }; await validateProfile(p); return p; } // --------------------------------------------------------------------------- -// Validation +// Validation (spec §12.1) /** - * Checks the syntax of every field and, for drand profiles, that the scheme - * is supported by tlock, that the public key is a valid group element and - * that the chain hash is the drand chain-info hash of the other parameters. + * Applies rules 1 to 3 of spec §12.1 to a Profile value, in their order, so + * that it reports the code decodeProfile reports for the encoding of the + * value (spec §69.1): + * + * 1. the schema rules a value can break (ERR_NON_CANONICAL_CBOR): a period + * that is not a whole number of seconds in 1..86400, the implementation + * limit of spec §74; a genesis time outside 0..2^53-1; a name that is not + * well-formed Unicode; a chain hash or a genesis seed that is not 32 + * bytes; + * 2. the rules of each field (ERR_UNKNOWN_PROFILE): the name alphabets and + * their length limits, the public key length limit, genesis_time in + * 1..253402300798, the provider drand, a scheme tlock supports, and a + * public key in the prime-order subgroup of the key group of the scheme, + * not the identity; period at most 2^32-1 is also a rule of this point, + * which the limit of point 1 makes unreachable here (chainInfoHash still + * enforces it); + * 3. the chain-hash self-check (ERR_PROFILE_MISMATCH): chain_hash is the + * drand chain-info hash of the other parameters (chainInfoHash). */ export async function validateProfile(p: Profile): Promise { + if (!Number.isSafeInteger(p.period) || p.period <= 0 || p.period > MAX_PERIOD) { + throw new DateKeysError( + 'ERR_NON_CANONICAL_CBOR', + `profile ${goQuote(p.id)}: period ${p.period}s is not a whole number of seconds in 1..${MAX_PERIOD}`, + ); + } + if (!Number.isSafeInteger(p.genesisTime) || p.genesisTime < 0) { + throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `profile ${goQuote(p.id)}: genesis time ${p.genesisTime} outside 0..${MAX_SAFE_UINT}`); + } + for (const s of [p.id, p.provider, p.network, p.scheme]) { + if (!s.isWellFormed()) { + throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `profile ${goQuote(p.id)}: name ${goQuote(s)} is not valid UTF-8`); + } + } + if (p.chainHash.length !== 32 || p.genesisSeed.length !== 32) { + throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `profile ${goQuote(p.id)}: chain hash and genesis seed must be 32 bytes`); + } if (!validID(p.id)) throw new DateKeysError('ERR_UNKNOWN_PROFILE', `profile: invalid profile_id ${goQuote(p.id)}`); if (!validName(p.provider) || !validName(p.network) || !validName(p.scheme)) { throw new DateKeysError('ERR_UNKNOWN_PROFILE', `profile ${p.id}: invalid provider, network or scheme name`); @@ -229,10 +290,7 @@ export async function validateProfile(p: Profile): Promise { if (p.publicKey.length === 0 || p.publicKey.length > MAX_PUBLIC_KEY_LEN) { throw new DateKeysError('ERR_UNKNOWN_PROFILE', `profile ${p.id}: invalid public key length ${p.publicKey.length}`); } - if (!Number.isSafeInteger(p.period) || p.period <= 0 || p.period > MAX_PERIOD) { - throw new DateKeysError('ERR_UNKNOWN_PROFILE', `profile ${p.id}: invalid period ${p.period}s`); - } - if (!Number.isSafeInteger(p.genesisTime) || p.genesisTime <= 0 || p.genesisTime >= MAX_UNIX_TIME) { + if (p.genesisTime <= 0 || p.genesisTime >= MAX_UNIX_TIME) { throw new DateKeysError('ERR_UNKNOWN_PROFILE', `profile ${p.id}: invalid genesis time ${p.genesisTime}`); } if (p.provider !== PROVIDER_DRAND) { @@ -272,12 +330,24 @@ async function validateDrand(p: Profile): Promise { } } +/** The largest period the chain-info hash can encode, 2^32-1 seconds (spec §12.1). */ +export const MAX_CHAIN_HASH_PERIOD = 2 ** 32 - 1; + /** - * The drand chain-info hash: SHA-256 of the period (uint32), the genesis - * time (int64), the public key, the genesis seed and, for a network other - * than "default", its name. + * The drand chain-info hash of spec §12.1, rule 3: + * + * SHA-256(uint32_be(period) || int64_be(genesis_time) || public_key || + * genesis_seed || network) + * + * with network the UTF-8 bytes of key 4, left out when it is "default"; + * profile_id, provider and scheme are not hashed. A period outside + * 1..2^32-1 has no chain hash: rule 2 rejects it with ERR_UNKNOWN_PROFILE, + * and so does this function rather than truncate it to 32 bits. */ -async function chainInfoHash(p: Profile): Promise { +export async function chainInfoHash(p: Profile): Promise { + if (!Number.isSafeInteger(p.period) || p.period < 1 || p.period > MAX_CHAIN_HASH_PERIOD) { + throw new DateKeysError('ERR_UNKNOWN_PROFILE', `profile ${p.id}: period ${p.period}s does not fit the 32 bits of the chain hash`); + } const fixed = new Uint8Array(12); const view = new DataView(fixed.buffer); view.setUint32(0, p.period); @@ -330,14 +400,19 @@ export interface Pin { /** * Validates every profile, checks it against its expected profile_hash and - * returns an immutable registry holding private copies. + * returns an immutable registry holding private copies. Each profile goes + * through the rules of spec §12.1 in their order, as its encoding would: it + * is encoded and decoded again (rules 1 to 3, with the codes decodeProfile + * reports), and only then compared with its pinned profile_hash (rule 4). */ export async function newRegistry(...pins: Pin[]): Promise { const m = new Map(); for (const pin of pins) { - const p = cloneProfile(pin.profile); - await validateProfile(p); - const h = await profileHash(p); + // Rules 1 to 3 of spec §12.1 as the encoding of the profile would get + // them, then rule 4, the pinned profile_hash. + const b = canonicalCBOR(pin.profile); + const p = await decodeProfile(b); + const h = await sha256(b); if (!equalBytes(h, pin.hash)) { throw new DateKeysError( 'ERR_PROFILE_MISMATCH', diff --git a/src/lib/dkc/schema.ts b/src/lib/dkc/schema.ts new file mode 100644 index 0000000..6e65a92 --- /dev/null +++ b/src/lib/dkc/schema.ts @@ -0,0 +1,43 @@ +// Helpers shared by the decoders of the protocol objects (PUBLIC_HEADER, +// CONTROL_CBOR, .dkk BODY_CBOR), as the Go reference writes each of them: a +// loop over the keys of the map, one read per key, "key N: " before the +// error of a read, and the required keys checked after the loop. + +import type { Encoder, Uint } from './cbor.ts'; +import { DateKeysError, withContext } from './errors.ts'; +import { encodeArray, type Extension } from './extension.ts'; + +/** Runs the read of the value of key `k`, prefixing its error with "key k". */ +export function fieldOf(k: Uint): (read: () => T) => T { + return (read) => withContext(`key ${k}`, read); +} + +/** Requires the keys 0 to n-1 in `seen` (ERR_NON_CANONICAL_CBOR otherwise). */ +export function requireKeys(seen: ReadonlySet, n: number): void { + for (let k = 0; k < n; k++) { + if (!seen.has(k)) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', `key ${k} is missing`); + } +} + +/** 1 for an extension array that is written, 0 for one that is omitted (spec §58.1). */ +export function presence(exts: readonly Extension[] | undefined): number { + return exts !== undefined && exts.length > 0 ? 1 : 0; +} + +/** + * Writes the critical and noncritical extension arrays at keys `key` and + * `key + 1`, each only when it is present (spec §58.1). + */ +export function encodeExtensionArrays( + e: Encoder, + key: number, + critical: readonly Extension[] | undefined, + noncritical: readonly Extension[] | undefined, +): void { + for (const [i, exts] of [critical, noncritical].entries()) { + if (presence(exts) === 1) { + e.uint(key + i); + encodeArray(e, exts!); + } + } +} diff --git a/src/lib/dkc/testing/vectors.ts b/src/lib/dkc/testing/vectors.ts new file mode 100644 index 0000000..a593d63 --- /dev/null +++ b/src/lib/dkc/testing/vectors.ts @@ -0,0 +1,131 @@ +// Readers of the shared vector formats of the Go reference, as +// testdata/README.md documents them. Every reader checks the structure it +// reads and throws on anything else: an unknown key, a missing one or a value +// of another type, so that a format change fails the harness instead of +// being skipped. Tests only. + +import { fromHex } from '../bytes.ts'; +import { isErrorCode } from '../errors.ts'; + +export type Json = Record; + +/** The version of the specification every vector file must name. */ +export const SPEC_VERSION = '0.8.2'; + +export class FormatError extends Error { + constructor(where: string, what: string) { + super(`${where}: ${what}`); + this.name = 'FormatError'; + } +} + +/** Requires a plain JSON object. */ +export function object(v: unknown, where: string): Json { + if (v === null || typeof v !== 'object' || Array.isArray(v)) throw new FormatError(where, 'not an object'); + return v as Json; +} + +/** Requires an array. */ +export function array(v: unknown, where: string): unknown[] { + if (!Array.isArray(v)) throw new FormatError(where, 'not an array'); + return v; +} + +/** + * Requires exactly the keys of `required` and at most those of `optional`: + * an unknown key fails, and so does a missing one. + */ +export function keys(o: Json, where: string, required: readonly string[], optional: readonly string[] = []): void { + for (const k of required) if (!Object.hasOwn(o, k)) throw new FormatError(where, `missing "${k}"`); + for (const k of Object.keys(o)) { + if (!required.includes(k) && !optional.includes(k)) throw new FormatError(where, `unknown key "${k}"`); + } +} + +export function str(v: unknown, where: string): string { + if (typeof v !== 'string') throw new FormatError(where, 'not a string'); + return v; +} + +export function bool(v: unknown, where: string): boolean { + if (typeof v !== 'boolean') throw new FormatError(where, 'not a boolean'); + return v; +} + +/** A non-negative safe integer. */ +export function int(v: unknown, where: string): number { + if (!Number.isSafeInteger(v) || (v as number) < 0) throw new FormatError(where, 'not a non-negative integer'); + return v as number; +} + +/** Lowercase hexadecimal, as every binary value of the files (README conventions). */ +export function hexBytes(v: unknown, where: string): Uint8Array { + const s = str(v, where); + if (!/^(?:[0-9a-f]{2})*$/.test(s)) throw new FormatError(where, 'not lowercase hex'); + return fromHex(s); +} + +/** A normative code of spec §69. */ +export function code(v: unknown, where: string): string { + const s = str(v, where); + if (!isErrorCode(s)) throw new FormatError(where, `"${s}" is not a normative code`); + return s; +} + +/** "ok" or a normative code. */ +export function result(v: unknown, where: string): string { + const s = str(v, where); + return s === 'ok' ? s : code(s, where); +} + +/** A step of the reading flow of spec §63, 1 to 18. */ +export function step(v: unknown, where: string): number { + const n = int(v, where); + if (n < 1 || n > 18) throw new FormatError(where, `step ${n} outside 1..18`); + return n; +} + +/** The file-level "spec" field. */ +export function checkSpec(o: Json, where: string): void { + if (str(o.spec, `${where}.spec`) !== SPEC_VERSION) throw new FormatError(where, `spec ${String(o.spec)}, want ${SPEC_VERSION}`); +} + +/** One edit [at, delete, insert] of README "Edited files". */ +export interface Edit { + readonly at: number; + readonly delete: number; + readonly insert: Uint8Array; +} + +export function edits(v: unknown, where: string): Edit[] { + return array(v, where).map((e, i) => { + const w = `${where}[${i}]`; + const a = array(e, w); + if (a.length !== 3) throw new FormatError(w, 'an edit is [at, delete, insert]'); + return { at: int(a[0], `${w}.at`), delete: int(a[1], `${w}.delete`), insert: hexBytes(a[2], `${w}.insert`) }; + }); +} + +/** + * Applies edits to `base` in one pass, as README "Edited files" states: the + * edits refer to offsets of the unmodified base, are sorted by offset, do not + * overlap and stay within the base. Anything else throws. + */ +export function applyEdits(base: Uint8Array, list: readonly Edit[]): Uint8Array { + const parts: Uint8Array[] = []; + let pos = 0; + for (const [i, e] of list.entries()) { + if (e.at < pos) throw new Error(`edit ${i} at ${e.at} is out of order or overlaps the previous one`); + if (e.at + e.delete > base.length) throw new Error(`edit ${i} goes beyond the base of ${base.length} bytes`); + parts.push(base.subarray(pos, e.at), e.insert); + pos = e.at + e.delete; + } + parts.push(base.subarray(pos)); + const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0)); + let o = 0; + for (const p of parts) { + out.set(p, o); + o += p.length; + } + return out; +} diff --git a/src/lib/dkc/vectors.test.ts b/src/lib/dkc/vectors.test.ts index 036b2fd..8f1750d 100644 --- a/src/lib/dkc/vectors.test.ts +++ b/src/lib/dkc/vectors.test.ts @@ -1,80 +1,193 @@ -// Shared vectors of the Go reference (testdata/vectors) and the frozen -// outputs it produces for this implementation. Files that Go has not -// produced yet are skipped; once synced, they run without changes here as -// long as they follow the format of plan §6 and §7. A file whose structure -// is not recognized fails, every case is checked for the fields it needs, -// and a file under testdata/ that no test runs fails too, so that a format -// change or a new export is noticed. +// The shared vectors and frozen outputs of the Go reference (testdata/, synced +// from g.activething.com/go/DateKeys), read in the formats that +// testdata/README.md documents: +// +// - vectors/dk1.json, quicknet_rounds.json, profile_quicknet.json; +// - vectors/cbor.json: every generic vector through walk with the file's +// max_depth and max_len, and every schema vector through the decoder of +// its schema, with the exact result; +// - vectors/mutations.json: every case whose step is 1 to 8 through +// inspect, with its registry and extensions, and the same code and step; +// the cases of steps 9 to 18 need the release, the credentials and the +// decryption of phase 2 (open), and are skipped one by one with that +// reason; +// - vectors/inspect_differential.json: every mutation with the Go verdict, +// code and step; +// - fixtures/*.inspect.json: byte for byte the output of +// `datekeys inspect -json`. +// +// Nothing is skipped silently: a file, a case or a field that does not +// follow the documented format fails, and so does a file under testdata/ +// that no test runs. import { describe, expect, it } from 'vitest'; -import { decodeAccessKeyBody } from './accesskey.ts'; -import { toHex } from './bytes.ts'; -import { Decoder, type Item, walk } from './cbor.ts'; -import { decodeControl } from './control.ts'; +import { decodeAccessKeyBody, marshalAccessKeyBody, wipeAccessKey } from './accesskey.ts'; +import { equalBytes, sha256, toHex } from './bytes.ts'; +import { type Item, MAX_SAFE_UINT, walk } from './cbor.ts'; +import { decodeControl, encodeControl } from './control.ts'; import { canonicalJSON, compactDateKey, formatRFC3339Nano, parseDateKey, parseRFC3339, resolveDateKey, unlockAt } from './datekey.ts'; -import { errorCode, isErrorCode } from './errors.ts'; -import { decodeExtensions, decodeWire, decodeWireArray } from './extension.ts'; -import { decodeHeader } from './header.ts'; -import { type CheckResult, inspect, inspectView } from './inspect.ts'; -import { canonicalCBOR, decodeProfile, profileHash, QUICKNET_ID, quicknet } from './profile.ts'; -import { h, hasTestdata, hx, listTestdata, readBytes, readJSON, testdataPath } from './testing/testdata.ts'; - -type Json = Record; - -async function codeOf(fn: () => unknown): Promise { +import { DateKeysError, errorCode } from './errors.ts'; +import type { Extension, ExtensionRegistry } from './extension.ts'; +import { decodeHeader, encodeHeader } from './header.ts'; +import { inspect, inspectJSON, inspectView } from './inspect.ts'; +import { + canonicalCBOR, + decodeProfile, + defaultRegistry, + newRegistry, + profileHash, + type ProfileRegistry, + QUICKNET_ID, + quicknet, +} from './profile.ts'; +import { hasTestdata, hx, listTestdata, readBytes, readJSON } from './testing/testdata.ts'; +import { + applyEdits, + array, + bool, + checkSpec, + code, + type Edit, + edits, + FormatError, + hexBytes, + int, + type Json, + keys, + object, + result, + step, + str, +} from './testing/vectors.ts'; + +/** The code of a thrown DateKeysError, "ok" when `fn` returns; anything else is rethrown. */ +async function resultOf(fn: () => unknown): Promise { try { await fn(); - return ''; + return 'ok'; } catch (err) { - const code = errorCode(err); - if (code === '') throw err; - return code; + if (!(err instanceof DateKeysError)) throw err; + return err.code; } } +/** + * Parses a vector file at collection time. A file that does not follow its + * documented format registers one failing test with the reason, and no case. + */ +function load(file: string, parse: (json: unknown) => T): T | undefined { + let parsed: T | undefined; + let error: unknown; + try { + parsed = parse(readJSON(file)); + } catch (err) { + error = err; + } + it(`${file} follows the format of testdata/README.md`, () => { + if (error !== undefined) throw error; + }); + return parsed; +} + // --------------------------------------------------------------------------- -// Vectors present at afb44a3 +// vectors/dk1.json + +interface Dk1Valid { + name: string; + network: string; + round: number; + canonical_json: string; + base64url: string; + dk1: string; +} +interface Dk1Invalid { + name: string; + input: string; + error: string; +} describe('vectors/dk1.json', () => { - const file = readJSON<{ vectors: Json[] }>('vectors/dk1.json'); - - it.each(file.vectors.map((v) => [v.name as string, v]))('%s', (_name, v) => { - if (typeof v.dk1 === 'string') { - const d = parseDateKey(v.dk1); - expect(d).toEqual({ profileId: v.network, round: v.round }); - expect(canonicalJSON(d)).toBe(v.canonical_json); - expect(Buffer.from(v.canonical_json as string).toString('base64url')).toBe(v.base64url); - expect(compactDateKey(d)).toBe(v.dk1); - } else { - let code = 'accepted'; - try { - parseDateKey(v.input as string); - } catch (err) { - code = errorCode(err); + const f = load('vectors/dk1.json', (json) => { + const o = object(json, 'dk1.json'); + keys(o, 'dk1.json', ['spec', 'description', 'vectors']); + checkSpec(o, 'dk1.json'); + const valid: Dk1Valid[] = []; + const invalid: Dk1Invalid[] = []; + for (const [i, v] of array(o.vectors, 'vectors').entries()) { + const w = `vectors[${i}]`; + const c = object(v, w); + if (Object.hasOwn(c, 'input')) { + keys(c, w, ['name', 'input', 'error']); + invalid.push({ name: str(c.name, w), input: str(c.input, w), error: code(c.error, w) }); + } else { + keys(c, w, ['name', 'network', 'round', 'canonical_json', 'base64url', 'dk1']); + valid.push({ + name: str(c.name, w), + network: str(c.network, w), + round: int(c.round, w), + canonical_json: str(c.canonical_json, w), + base64url: str(c.base64url, w), + dk1: str(c.dk1, w), + }); } - expect(code).toBe(v.error); } + return { valid, invalid }; + }); + if (f === undefined) return; + + it('holds the three vectors of the v0.8.2 refinements (§19)', () => { + const names = f.invalid.map((v) => v.name); + expect(names).toContain('line feed inside the Base64'); + expect(names).toContain('carriage return and line feed after the Base64'); + expect(names).toContain('version 1.0000000000000001: its exact value, not a double'); + }); + + it.each(f.valid.map((v) => [v.name, v] as const))('valid: %s', (_n, v) => { + const d = parseDateKey(v.dk1); + expect(d).toEqual({ profileId: v.network, round: v.round }); + expect(canonicalJSON(d)).toBe(v.canonical_json); + expect(Buffer.from(v.canonical_json).toString('base64url')).toBe(v.base64url); + expect(`dk1_${v.base64url}`).toBe(v.dk1); + expect(compactDateKey(d)).toBe(v.dk1); + }); + + it.each(f.invalid.map((v) => [v.name, v] as const))('invalid: %s', async (_n, v) => { + expect(await resultOf(() => parseDateKey(v.input))).toBe(v.error); }); }); +// --------------------------------------------------------------------------- +// vectors/quicknet_rounds.json + describe('vectors/quicknet_rounds.json', () => { - const file = readJSON<{ profile: string; vectors: Json[] }>('vectors/quicknet_rounds.json'); - const p = quicknet(); + const f = load('vectors/quicknet_rounds.json', (json) => { + const o = object(json, 'quicknet_rounds.json'); + keys(o, 'quicknet_rounds.json', ['spec', 'profile', 'description', 'vectors']); + checkSpec(o, 'quicknet_rounds.json'); + const profile = str(o.profile, 'profile'); + const vectors = array(o.vectors, 'vectors').map((v, i) => { + const w = `vectors[${i}]`; + const c = object(v, w); + if (Object.hasOwn(c, 'error')) { + keys(c, w, ['name', 'requested', 'error']); + return { name: str(c.name, w), requested: str(c.requested, w), error: code(c.error, w) }; + } + keys(c, w, ['name', 'requested', 'round', 'effective']); + return { name: str(c.name, w), requested: str(c.requested, w), round: int(c.round, w), effective: str(c.effective, w) }; + }); + return { profile, vectors }; + }); + if (f === undefined) return; it('is for the pinned Quicknet profile', () => { - expect(file.profile).toBe(QUICKNET_ID); + expect(f.profile).toBe(QUICKNET_ID); }); - it.each(file.vectors.map((v) => [v.name as string, v]))('%s', (_name, v) => { - const at = parseRFC3339(v.requested as string); - if (v.error !== undefined) { - let code = ''; - try { - resolveDateKey(p, at); - } catch (err) { - code = errorCode(err); - } - expect(code).toBe(v.error); + it.each(f.vectors.map((v) => [v.name, v] as const))('%s', async (_n, v) => { + const p = quicknet(); + const at = parseRFC3339(v.requested); + if ('error' in v) { + expect(await resultOf(() => resolveDateKey(p, at))).toBe(v.error); return; } const d = resolveDateKey(p, at); @@ -83,9 +196,32 @@ describe('vectors/quicknet_rounds.json', () => { }); }); +// --------------------------------------------------------------------------- +// vectors/profile_quicknet.json + describe('vectors/profile_quicknet.json', () => { + const PROFILE_KEYS = [ + 'profile_id', + 'provider', + 'network', + 'chain_hash', + 'public_key', + 'period_seconds', + 'genesis_time', + 'genesis_seed', + 'scheme', + 'canonical_cbor', + 'profile_hash', + ]; + const v = load('vectors/profile_quicknet.json', (json) => { + const o = object(json, 'profile_quicknet.json'); + keys(o, 'profile_quicknet.json', ['spec', 'description', ...PROFILE_KEYS]); + checkSpec(o, 'profile_quicknet.json'); + return o; + }); + if (v === undefined) return; + it('reproduces the exact CBOR and profile_hash, field by field', async () => { - const v = readJSON('vectors/profile_quicknet.json'); const p = quicknet(); expect({ profile_id: p.id, @@ -110,410 +246,429 @@ describe('vectors/profile_quicknet.json', () => { }); expect(hx(canonicalCBOR(p))).toBe(v.canonical_cbor); expect(hx(await profileHash(p))).toBe(v.profile_hash); - expect(await decodeProfile(Buffer.from(v.canonical_cbor as string, 'hex'))).toEqual(p); + expect(await decodeProfile(hexBytes(v.canonical_cbor, 'canonical_cbor'))).toEqual(p); }); }); // --------------------------------------------------------------------------- -// Vectors produced by Go after afb44a3 (plan §6, §7) - -const HEX = /^(?:[0-9a-fA-F]{2})*$/; -const BASE64 = /^[A-Za-z0-9+/]*={0,2}$/; -const BASE64URL = /^[A-Za-z0-9_-]*$/; -const TESTDATA_FILE = /^(?:testdata\/)?((?:[\w.-]+\/)*[\w.-]+\.\w+)$/; - -// Strict base64 (standard or URL alphabet): the text must be the canonical -// encoding of its bytes, so that other text is never read as bytes. -function strictBase64(v: string): Uint8Array | undefined { - if (BASE64.test(v)) { - const b = Buffer.from(v, 'base64'); - if (b.toString('base64') === v || b.toString('base64').replace(/=+$/, '') === v) return new Uint8Array(b); - } - if (BASE64URL.test(v)) { - const b = Buffer.from(v, 'base64url'); - if (b.toString('base64url') === v) return new Uint8Array(b); - } - return undefined; -} +// vectors/cbor.json -// A file under testdata/ named by a case, never outside it. -function testdataFile(v: string): Uint8Array | undefined { - const m = TESTDATA_FILE.exec(v); - if (!m || m[1]!.split('/').includes('..') || !hasTestdata(m[1]!)) return undefined; - return readBytes(m[1]!); +interface GenericVector { + name: string; + input: Uint8Array; + value?: number | string; + error?: string; +} +interface SchemaVector { + block: string; + schema: string; + name: string; + input: Uint8Array; + result: string; } -const BYTES_KEYS = ['hex', 'base64', 'b64', 'dkc', 'bytes', 'input', 'data', 'file', 'path'] as const; +// The decoder of each schema. It returns a writer of the decoded object, +// which must reproduce an accepted encoding byte for byte. +const SCHEMAS: ReadonlyMap Promise<() => Uint8Array>> = new Map([ + [ + 'provider_profile', + async (b: Uint8Array) => { + const p = await decodeProfile(b); + return () => canonicalCBOR(p); + }, + ], + [ + 'public_header', + async (b: Uint8Array) => { + const h = decodeHeader(b); + return () => encodeHeader(h); + }, + ], + [ + 'control_cbor', + async (b: Uint8Array) => { + const c = decodeControl(b); + return () => encodeControl(c); + }, + ], + [ + 'dkk_body', + async (b: Uint8Array) => { + const k = decodeAccessKeyBody(b); + return () => { + try { + return marshalAccessKeyBody(k); + } finally { + wipeAccessKey(k); + } + }; + }, + ], +]); -/** - * The input bytes of a case. `hex` is strict hexadecimal; `base64`/`b64` - * strict base64; `file`/`path` a file under testdata/; `dkc`, `bytes`, - * `input` and `data` strict hexadecimal, else a file under testdata/, else - * strict base64. Anything else throws: no case is ever run on bytes it did - * not mean. - */ -function bytesOf(c: Json): Uint8Array { - for (const k of BYTES_KEYS) { - const v = c[k]; - if (typeof v !== 'string') continue; - let out: Uint8Array | undefined; - if (k === 'hex') out = HEX.test(v) ? new Uint8Array(Buffer.from(v, 'hex')) : undefined; - else if (k === 'base64' || k === 'b64') out = strictBase64(v); - else if (k === 'file' || k === 'path') out = testdataFile(v); - else out = HEX.test(v) ? new Uint8Array(Buffer.from(v, 'hex')) : (testdataFile(v) ?? strictBase64(v)); - if (out === undefined) throw new Error(`case ${JSON.stringify(c.name ?? c.id)}: "${k}" is not strict hex, strict base64 or a file under testdata/`); - return out; - } - throw new Error(`case ${JSON.stringify(c.name ?? c.id)} has no bytes (${BYTES_KEYS.join(', ')})`); -} +// The blocks of README "Schema vectors": each schema itself, and two blocks +// that vary one key of another schema. +const BLOCKS: ReadonlyMap = new Map([ + ['provider_profile', 'provider_profile'], + ['public_header', 'public_header'], + ['control_cbor', 'control_cbor'], + ['dkk_body', 'dkk_body'], + ['verification_metadata', 'dkk_body'], + ['extension', 'public_header'], +]); -function expectedCode(c: Json): string | undefined { - for (const k of ['error', 'code', 'want']) if (typeof c[k] === 'string') return c[k] as string; - return undefined; -} +describe('vectors/cbor.json', () => { + const f = load('vectors/cbor.json', (json) => { + const o = object(json, 'cbor.json'); + keys(o, 'cbor.json', ['spec', 'description', 'walk', 'accept', 'reject', 'schemas']); + checkSpec(o, 'cbor.json'); + const w = object(o.walk, 'walk'); + keys(w, 'walk', ['max_depth', 'max_len']); + const maxDepth = int(w.max_depth, 'walk.max_depth'); + const maxLen = int(w.max_len, 'walk.max_len'); + const accept: GenericVector[] = array(o.accept, 'accept').map((v, i) => { + const at = `accept[${i}]`; + const c = object(v, at); + keys(c, at, ['name', 'hex'], ['value']); + const g: GenericVector = { name: str(c.name, at), input: hexBytes(c.hex, at) }; + if (Object.hasOwn(c, 'value')) { + const value = c.value; + // README: a JSON number up to 2^53-1, a decimal string above. + if (typeof value === 'number') { + if (!Number.isSafeInteger(value) || value < 0) throw new FormatError(at, 'value is not an unsigned integer up to 2^53-1'); + } else if (typeof value !== 'string' || !/^[1-9][0-9]*$/.test(value) || BigInt(value) <= BigInt(MAX_SAFE_UINT)) { + throw new FormatError(at, 'value is neither a JSON number nor a decimal string above 2^53-1'); + } + g.value = value; + } + return g; + }); + const reject: GenericVector[] = array(o.reject, 'reject').map((v, i) => { + const at = `reject[${i}]`; + const c = object(v, at); + keys(c, at, ['name', 'hex', 'error']); + return { name: str(c.name, at), input: hexBytes(c.hex, at), error: code(c.error, at) }; + }); + const schemas: SchemaVector[] = array(o.schemas, 'schemas').map((v, i) => { + const at = `schemas[${i}]`; + const c = object(v, at); + keys(c, at, ['block', 'schema', 'name', 'hex', 'result']); + const s: SchemaVector = { + block: str(c.block, at), + schema: str(c.schema, at), + name: str(c.name, at), + input: hexBytes(c.hex, at), + result: result(c.result, at), + }; + if (!SCHEMAS.has(s.schema)) throw new FormatError(at, `unknown schema "${s.schema}"`); + if (BLOCKS.get(s.block) !== s.schema) throw new FormatError(at, `block "${s.block}" is not a block of schema "${s.schema}"`); + return s; + }); + return { maxDepth, maxLen, accept, reject, schemas }; + }); + if (f === undefined) return; -function caseName(c: Json, i: number): string { - return String(c.name ?? c.id ?? `#${i}`); -} + it('has every block of README "Schema vectors" with at least five vectors', () => { + for (const block of BLOCKS.keys()) { + expect(f.schemas.filter((s) => s.block === block).length, block).toBeGreaterThanOrEqual(5); + } + expect(f.accept.length).toBeGreaterThan(0); + expect(f.reject.length).toBeGreaterThan(0); + }); -// The cases of a file: the file itself when it is an array, else the first -// array under one of `keys`; an empty list otherwise, which fails. -function casesOf(file: unknown, keys: readonly string[]): Json[] { - if (Array.isArray(file)) return file as Json[]; - if (file && typeof file === 'object') { - for (const k of keys) { - const v = (file as Json)[k]; - if (Array.isArray(v)) return v as Json[]; + it.each(f.accept.map((v) => [v.name, v] as const))('walk accepts: %s', (_n, v) => { + const item: Item = walk(v.input, f.maxDepth, f.maxLen); + // README: "value is present for an accepted unsigned integer". + expect(item.kind === 'uint', 'a value exactly for an unsigned integer').toBe(v.value !== undefined); + if (item.kind === 'uint') { + if (typeof v.value === 'number') expect(item.value).toBe(v.value); + else expect(item.value).toBe(BigInt(v.value!)); } - } - return []; -} + }); -// The value of a walked item in the notation of `want`: integers above 2^53 -// are decimal strings (plan §6), so an integer is compared as a string where -// the vector has one; bytes are hex; a map is a list of [key, value] pairs or -// an object keyed by the decimal keys. -function itemValue(it: Item, want: unknown): unknown { - switch (it.kind) { - case 'uint': - return typeof want === 'string' ? String(it.value) : it.value; - case 'bytes': - return toHex(it.value); - case 'text': - return it.value; - case 'array': - return it.items.map((x, i) => itemValue(x, Array.isArray(want) ? want[i] : undefined)); - case 'map': - if (want && typeof want === 'object' && !Array.isArray(want)) { - const w = want as Json; - return Object.fromEntries(it.entries.map((e) => [String(e.key), itemValue(e.value, w[String(e.key)])])); - } - return it.entries.map((e, i) => { - const pair = Array.isArray(want) ? want[i] : undefined; - return [e.key, itemValue(e.value, Array.isArray(pair) ? pair[1] : undefined)]; - }); - } + it.each(f.reject.map((v) => [v.name, v] as const))('walk rejects: %s', async (_n, v) => { + expect(await resultOf(() => walk(v.input, f.maxDepth, f.maxLen))).toBe(v.error); + // README: the vectors above a limit fail on that limit only. + if (v.name.includes('above max_len')) expect(() => walk(v.input, f.maxDepth, v.input.length)).not.toThrow(); + if (v.name.includes('above max_depth')) expect(() => walk(v.input, v.input.length, f.maxLen)).not.toThrow(); + }); + + it.each(f.schemas.map((v) => [`${v.block} (${v.schema}): ${v.name}`, v] as const))('%s', async (_n, v) => { + let write: (() => Uint8Array) | undefined; + expect( + await resultOf(async () => { + write = await SCHEMAS.get(v.schema)!(v.input); + }), + ).toBe(v.result); + // An accepted object is written back to the same bytes. + if (write !== undefined) expect(hx(write())).toBe(hx(v.input)); + }); +}); + +// --------------------------------------------------------------------------- +// vectors/mutations.json + +interface MutationCase { + index: number; + name: string; + spec: boolean; + dkc: { base?: string; edits: Edit[] }; + registry: 'default' | 'empty'; + extensions?: { id: string; version: number; validData: Uint8Array }[]; + network: boolean; + frozen: boolean; + error: string; + step: number; } -/** - * Reports whether `b` is one well-formed item of the profile that holds an - * unsigned integer (value or map key) above 2^53-1. Go's generic decoder - * accepts it; this implementation rejects it on purpose (plan §5, README). - */ -function holdsUintAbove53(b: Uint8Array): boolean { - let pos = 0; - let found = false; - const head = (): [number, bigint] => { - if (pos >= b.length) throw new Error('end'); - const ib = b[pos++]!; - const ai = ib & 0x1f; - if (ai < 24) return [ib >> 5, BigInt(ai)]; - if (ai > 27) throw new Error('additional information'); - const n = 1 << (ai - 24); - if (pos + n > b.length) throw new Error('end'); - let v = 0n; - for (let i = 0; i < n; i++) v = (v << 8n) | BigInt(b[pos++]!); - return [ib >> 5, v]; +// The extensions a case says the application implements: known at (id, +// version), with valid data only when it equals valid_data. +function caseExtensions(list: MutationCase['extensions']): ExtensionRegistry | undefined { + if (list === undefined) return undefined; + return { + known: (id, version) => list.some((x) => x.id === id && x.version === version), + validateData: (e: Extension) => { + const x = list.find((y) => y.id === e.id && y.version === e.version)!; + return e.data !== undefined && equalBytes(e.data, x.validData) ? undefined : new Error(`data is not ${toHex(x.validData)}`); + }, }; - const item = (depth: number): void => { - if (depth > 64) throw new Error('depth'); - const [major, v] = head(); - if (major === 0) { - if (v > BigInt(Number.MAX_SAFE_INTEGER)) found = true; - } else if (major === 2 || major === 3) { - if (v > BigInt(b.length - pos)) throw new Error('end'); - pos += Number(v); - } else if (major === 4 || major === 5) { - // Each item takes at least one byte, so this ends with the input. - for (let i = 0n; i < (major === 5 ? 2n * v : v); i++) item(depth + 1); - } else { - throw new Error('outside the profile'); - } - }; - try { - item(0); - return found && pos === b.length; - } catch { - return false; - } } -// Block names of cbor.json and the decoder of each (a Map: the names come -// from the file). -const SCHEMA_DECODERS: ReadonlyMap unknown> = new Map unknown>([ - ['walk', (b) => walk(b)], - ['generic', (b) => walk(b)], - ['profile', (b) => decodeProfile(b)], - ['provider_profile', (b) => decodeProfile(b)], - ['header', (b) => decodeHeader(b)], - ['public_header', (b) => decodeHeader(b)], - ['control', (b) => decodeControl(b)], - ['control_cbor', (b) => decodeControl(b)], - ['access_key', (b) => decodeAccessKeyBody(b)], - ['accesskey', (b) => decodeAccessKeyBody(b)], - ['dkk_body', (b) => decodeAccessKeyBody(b)], - ['body_cbor', (b) => decodeAccessKeyBody(b)], - ['extension', (b) => decodeOneExtension(b)], - ['extensions', (b) => decodeOneExtension(b)], -]); - -// One extension map, or an extension array with its array rules. -function decodeOneExtension(b: Uint8Array): unknown { - const d = new Decoder(b); - const out = d.peekMajor() === 4 ? decodeExtensions(decodeWireArray(d)) : decodeExtensions([decodeWire(d)]); - d.done(); - return out; +function capsuleOf(c: { base?: string; edits: Edit[] }): Uint8Array { + return applyEdits(c.base === undefined ? new Uint8Array(0) : readBytes(`fixtures/${c.base}`), c.edits); } -async function runCase(decoder: (b: Uint8Array) => unknown, c: Json, accept: boolean | undefined): Promise { - const want = expectedCode(c); - const shouldAccept = accept ?? want === undefined; - const input = bytesOf(c); - let result: unknown; - const code = await codeOf(async () => { - result = await decoder(input); +/** The last step that inspect can replay; later steps need open (phase 2). */ +const LAST_INSPECT_STEP = 8; + +describe('vectors/mutations.json', () => { + const f = load('vectors/mutations.json', (json) => { + const o = object(json, 'mutations.json'); + keys(o, 'mutations.json', ['spec', 'description', 'cases']); + checkSpec(o, 'mutations.json'); + return array(o.cases, 'cases').map((v, index): MutationCase => { + const at = `cases[${index}]`; + const c = object(v, at); + keys(c, at, ['name', 'spec', 'dkc', 'release', 'now', 'registry', 'network', 'frozen', 'error', 'step'], ['dkk', 'identities', 'extensions']); + const d = object(c.dkc, `${at}.dkc`); + keys(d, `${at}.dkc`, ['edits'], ['base']); + const registry = str(c.registry, `${at}.registry`); + if (registry !== 'default' && registry !== 'empty') throw new FormatError(at, `unknown registry "${registry}"`); + // What only steps 9 to 18 use is still checked for its form. + if (c.release !== null) { + const r = object(c.release, `${at}.release`); + keys(r, `${at}.release`, ['round', 'signature']); + int(r.round, `${at}.release.round`); + hexBytes(r.signature, `${at}.release.signature`); + } + parseRFC3339(str(c.now, `${at}.now`)); + if (Object.hasOwn(c, 'dkk')) hexBytes(c.dkk, `${at}.dkk`); + if (Object.hasOwn(c, 'identities')) { + for (const [j, id] of array(c.identities, `${at}.identities`).entries()) { + if (!str(id, `${at}.identities[${j}]`).startsWith('AGE-SECRET-KEY-1')) throw new FormatError(at, 'identity is not AGE-SECRET-KEY-1…'); + } + } + const m: MutationCase = { + index, + name: str(c.name, at), + spec: bool(c.spec, `${at}.spec`), + dkc: { edits: edits(d.edits, `${at}.dkc.edits`) }, + registry, + network: bool(c.network, `${at}.network`), + frozen: bool(c.frozen, `${at}.frozen`), + error: code(c.error, `${at}.error`), + step: step(c.step, `${at}.step`), + }; + if (Object.hasOwn(d, 'base')) m.dkc.base = str(d.base, `${at}.dkc.base`); + if (m.frozen === (m.dkc.base !== undefined)) throw new FormatError(at, 'a frozen case has no base, and only a frozen one'); + if (Object.hasOwn(c, 'extensions')) { + m.extensions = array(c.extensions, `${at}.extensions`).map((x, j) => { + const w = `${at}.extensions[${j}]`; + const e = object(x, w); + keys(e, w, ['id', 'version', 'valid_data']); + return { id: str(e.id, w), version: int(e.version, w), validData: hexBytes(e.valid_data, w) }; + }); + } + return m; + }); }); - if (shouldAccept && holdsUintAbove53(input)) { - // Accepted by Go's uint64, rejected here by design (plan §5): the one - // known difference of the generic reader, listed in the README. - expect(code, `${String(c.name)}: an integer above 2^53-1 is rejected by design`).toBe('ERR_NON_CANONICAL_CBOR'); - return; - } - if (shouldAccept) { - expect(code, `${String(c.name)} must be accepted`).toBe(''); - if ('value' in c && result && typeof result === 'object' && 'kind' in (result as Item)) { - expect(itemValue(result as Item, c.value)).toEqual(c.value); - } - } else { - expect(want === undefined || isErrorCode(want), `${String(c.name)}: "${String(want)}" is not a normative code`).toBe(true); - expect(code, String(c.name)).toBe(want ?? code); - expect(code, `${String(c.name)} must be rejected`).not.toBe(''); - } -} + if (f === undefined) return; -const hasCbor = hasTestdata('vectors/cbor.json'); -describe.skipIf(!hasCbor)('vectors/cbor.json (plan §6)', () => { - const file = hasCbor ? readJSON('vectors/cbor.json') : {}; - const blocks: [string, string, Json[], boolean | undefined][] = []; - const addBlock = (schema: string, v: unknown, accept?: boolean): void => { - if (Array.isArray(v)) { - blocks.push([schema, accept === undefined ? 'cases' : accept ? 'accept' : 'reject', v as Json[], accept]); - } else if (v && typeof v === 'object') { - for (const [k, sub] of Object.entries(v as Json)) { - if (k === 'accept' || k === 'valid') addBlock(schema, sub, true); - else if (k === 'reject' || k === 'invalid') addBlock(schema, sub, false); - else if (Array.isArray(sub) || (sub && typeof sub === 'object')) addBlock(`${schema}.${k}`, sub, accept); - } - } - }; - for (const [k, v] of Object.entries(file)) { - if (k === 'accept') addBlock('walk', v, true); - else if (k === 'reject') addBlock('walk', v, false); - else if (Array.isArray(v) || (v && typeof v === 'object')) addBlock(k, v); - } + const inspected = f.filter((c) => c.step <= LAST_INSPECT_STEP); + const opened = f.filter((c) => c.step > LAST_INSPECT_STEP); - it('has recognizable blocks and cases', () => { - expect(blocks.length).toBeGreaterThan(0); - for (const [schema, , cases] of blocks) { - expect(SCHEMA_DECODERS.get(schema.split('.')[0]!), `cbor.json block "${schema}" has no decoder in vectors.test.ts`).toBeDefined(); - expect(cases.length, `cbor.json block "${schema}" is empty`).toBeGreaterThan(0); - for (const [i, c] of cases.entries()) { - expect(c && typeof c === 'object' && !Array.isArray(c), `cbor.json block "${schema}" case ${i} is not an object`).toBe(true); - expect(() => bytesOf(c), `cbor.json block "${schema}" case ${caseName(c, i)}`).not.toThrow(); - } - } + it('has the cases README counts: the 23 of §64 first, 31 in steps 1 to 8, 13 of them from §64', () => { + expect(f.slice(0, 23).every((c) => c.spec)).toBe(true); + expect(f.slice(23).some((c) => c.spec)).toBe(false); + expect(inspected.length).toBe(31); + expect(inspected.filter((c) => c.spec).length).toBe(13); + expect(new Set(f.map((c) => c.name)).size, 'unique names').toBe(f.length); }); - for (const [schema, kind, cases, accept] of blocks) { - const decoder = SCHEMA_DECODERS.get(schema.split('.')[0]!); - if (!decoder) continue; - it.each(cases.map((c, i) => [caseName(c, i), c]))(`${schema} ${kind}: %s`, async (_n, c) => { - await runCase(decoder, c, accept); - }); - } -}); + it('fails every case of steps 1 to 8 without the network (§27, §63)', () => { + expect(inspected.filter((c) => c.network).map((c) => c.name)).toEqual([]); + }); -// Mutations export the §64 corpus: bytes, the normative code and the step. -// Steps 1 to 8 run here; later steps need a release and the phase-2 code, -// and show as skipped. Plan §7.4 counts 23 cases in steps 1 to 8. -const MIN_MUTATIONS_1_TO_8 = 23; -const hasMutations = hasTestdata('vectors/mutations.json'); -describe.skipIf(!hasMutations)('vectors/mutations.json (plan §7.4)', () => { - const file = hasMutations ? readJSON('vectors/mutations.json') : []; - const cases = casesOf(file, ['mutations', 'vectors', 'cases']); - const runnable = (c: Json): boolean => Number.isInteger(c.step) && (c.step as number) >= 1 && (c.step as number) <= 8; - - it('has cases with bytes, a normative code and a step', () => { - expect(cases.length, 'no case array (the file itself, or under mutations, vectors or cases)').toBeGreaterThan(0); - for (const [i, c] of cases.entries()) { - const id = caseName(c, i); - expect(Number.isInteger(c.step) && (c.step as number) >= 1, `${id}: "step" is not a step number`).toBe(true); - expect(isErrorCode(expectedCode(c)), `${id}: no normative code (error, code or want)`).toBe(true); - expect(() => bytesOf(c), id).not.toThrow(); - } - expect(cases.filter(runnable).length, 'cases in steps 1 to 8').toBeGreaterThanOrEqual(MIN_MUTATIONS_1_TO_8); + it.each(inspected.map((c) => [c.index, c.name, c.step, c] as const))('#%i %s (step %i)', async (_i, _n, _s, c) => { + const registry: ProfileRegistry = c.registry === 'empty' ? await newRegistry() : await defaultRegistry(); + const r = await inspect(capsuleOf(c.dkc), { registry, extensions: caseExtensions(c.extensions) }); + const last = r.checks.at(-1)!; + expect({ step: last.step, ok: last.ok, error: last.error }).toEqual({ step: c.step, ok: false, error: c.error }); + expect(r.error?.code).toBe(c.error); }); - for (const [i, c] of cases.entries()) { - it.skipIf(!runnable(c))(`${caseName(c, i)} (step ${String(c.step)})`, async () => { - const r = await inspect(bytesOf(c)); - const last = r.checks.at(-1)!; - expect({ step: last.step, ok: last.ok, error: last.error }, `options of the case: ${JSON.stringify(Object.keys(c))}`).toEqual({ - step: c.step, - ok: false, - error: expectedCode(c), - }); - }); + // Steps 9 to 18 need the release, the credentials and the decryption of + // phase 2: each case is listed, skipped, with the reason. + for (const c of opened) { + it.skip(`#${c.index} ${c.name} (step ${c.step}): needs open(), steps 9 to 18, phase 2`, () => {}); } }); -// Compares checks: step, name, ok and code always; the detail of passed -// steps exactly (the detail of a failure carries decoder messages that are -// not part of the protocol). -function expectChecks(got: readonly CheckResult[], want: CheckResult[], label = ''): void { - expect(got.map((c) => ({ step: c.step, name: c.name, ok: c.ok, error: c.error })), label).toEqual( - want.map((c) => ({ step: c.step, name: c.name, ok: c.ok, error: c.error || undefined })), - ); - for (const [i, w] of want.entries()) if (w.ok) expect(got[i]!.detail, label).toBe(w.detail); +// --------------------------------------------------------------------------- +// vectors/inspect_differential.json + +interface DifferentialCase { + index: number; + base: string; + kind: string; + edits: Edit[]; + result: string; + step?: number; } -// The Go verdict of a differential case: an object under one of these keys, -// else the case itself. -const VERDICT_KEYS = ['view', 'inspect', 'result', 'go', 'verdict', 'expected', 'want'] as const; -function verdictOf(c: Json): Json { - for (const k of VERDICT_KEYS) { - const v = c[k]; - if (v && typeof v === 'object' && !Array.isArray(v)) return v as Json; - } - return c; -} -const hasVerdict = (v: Json): boolean => typeof v.valid === 'boolean' || expectedCode(v) !== undefined || Array.isArray(v.checks); - -const hasDifferential = hasTestdata('vectors/inspect_differential.json'); -describe.skipIf(!hasDifferential)('vectors/inspect_differential.json (plan §7.4)', () => { - const file = hasDifferential ? readJSON('vectors/inspect_differential.json') : []; - const cases = casesOf(file, ['cases', 'vectors', 'mutations']); - - it('has cases with bytes and a Go verdict', () => { - expect(cases.length, 'no case array (the file itself, or under cases, vectors or mutations)').toBeGreaterThan(0); - for (const [i, c] of cases.entries()) { - const id = caseName(c, i); - expect(() => bytesOf(c), id).not.toThrow(); - expect(hasVerdict(verdictOf(c)), `${id}: no Go verdict (valid, error or checks, at the top or under ${VERDICT_KEYS.join(', ')})`).toBe(true); - } +describe('vectors/inspect_differential.json', () => { + const f = load('vectors/inspect_differential.json', (json) => { + const o = object(json, 'inspect_differential.json'); + keys(o, 'inspect_differential.json', ['spec', 'description', 'format', 'seed', 'bases', 'mutations']); + checkSpec(o, 'inspect_differential.json'); + str(o.format, 'format'); + int(o.seed, 'seed'); + const bases = array(o.bases, 'bases').map((v, i) => { + const at = `bases[${i}]`; + const b = object(v, at); + keys(b, at, ['file', 'sha256']); + return { file: str(b.file, at), sha256: str(b.sha256, at) }; + }); + const mutations = array(o.mutations, 'mutations').map((v, index): DifferentialCase => { + const at = `mutations[${index}]`; + const c = object(v, at); + const res = result(c.result, `${at}.result`); + // README: step is the step that failed, absent when ok. + keys(c, at, ['base', 'kind', 'edits', 'result', ...(res === 'ok' ? [] : ['step'])]); + const base = int(c.base, `${at}.base`); + if (base >= bases.length) throw new FormatError(at, `base ${base} is not in bases`); + const m: DifferentialCase = { index, base: bases[base]!.file, kind: str(c.kind, at), edits: edits(c.edits, `${at}.edits`), result: res }; + if (res !== 'ok') m.step = step(c.step, `${at}.step`); + if (m.step !== undefined && m.step > LAST_INSPECT_STEP) throw new FormatError(at, `step ${m.step} is not a step of inspect`); + return m; + }); + return { bases, mutations }; }); + if (f === undefined) return; - it('reproduces the Go verdict of every case', async () => { - for (const [i, c] of cases.entries()) { - const id = caseName(c, i); - const want = verdictOf(c); - if (!hasVerdict(want)) continue; // reported by the test above - const view = inspectView(await inspect(bytesOf(c))); - if (typeof want.valid === 'boolean') expect(view.valid, `${id} valid`).toBe(want.valid); - const code = expectedCode(want); - if (code !== undefined) expect(view.error ?? '', `${id} error`).toBe(code); - if (Array.isArray(want.checks)) expectChecks(view.checks, want.checks as CheckResult[], id); - if (typeof want.step === 'number') expect(view.checks.at(-1)!.step, `${id} step`).toBe(want.step); - for (const k of ['capsule_id', 'datekey', 'profile', 'round', 'unlock_at', 'access_policy'] as const) { - if (k in want) expect(view[k], `${id} ${k}`).toEqual(want[k]); - } - } + it('has bases that are the official fixtures, byte for byte', async () => { + for (const b of f.bases) expect(hx(await sha256(readBytes(`fixtures/${b.file}`))), b.file).toBe(b.sha256); + }); + + it.each(f.mutations.map((c) => [c.index, c.kind, c.base, c.result, c] as const))('#%i %s of %s: %s', async (_i, _k, _b, _r, c) => { + const view = inspectView(await inspect(capsuleOf({ base: c.base, edits: c.edits }))); + expect({ valid: view.valid, error: view.error ?? 'ok', step: view.valid ? undefined : view.checks.at(-1)!.step }).toEqual({ + valid: c.result === 'ok', + error: c.result, + step: c.step, + }); }); }); -// Frozen `datekeys inspect -json` outputs (plan §7.6), next to their .dkc. -const goldens = listTestdata('', '.inspect.json'); -describe.skipIf(goldens.length === 0)('*.inspect.json goldens (plan §7.6)', () => { - it.each(goldens)('%s', async (golden) => { - const want = readJSON(golden); - const base = golden.slice(0, -'.inspect.json'.length); - const candidates = [`${base}.dkc`, `${base}`, `fixtures/${String(want.file ?? '').split(/[\\/]/).pop()}`]; - const dkcPath = candidates.find((p) => p.endsWith('.dkc') && hasTestdata(p)); - expect(dkcPath, `no .dkc for ${golden} (tried ${candidates.join(', ')} under ${testdataPath('')})`).toBeDefined(); - expect(Array.isArray(want.checks) && typeof want.valid === 'boolean', `${golden} is not an inspect view`).toBe(true); - const view = inspectView(await inspect(readBytes(dkcPath!))); - const { file: _file, checks, ...rest } = want; - const { checks: gotChecks, ...gotRest } = view; - expect(gotRest).toEqual(rest); - expectChecks(gotChecks, checks as CheckResult[]); +// --------------------------------------------------------------------------- +// fixtures/*.inspect.json + +describe('fixtures/*.inspect.json', () => { + const goldens = listTestdata('fixtures', '.inspect.json'); + const capsules = listTestdata('fixtures', '.dkc'); + + it('has one output for each official .dkc, and no other', () => { + expect(goldens.map((g) => g.slice(0, -'.inspect.json'.length))).toEqual(capsules.map((c) => c.slice(0, -'.dkc'.length))); + }); + + it.each(goldens)('%s is byte for byte the view of inspect', async (golden) => { + const text = new TextDecoder('utf-8', { fatal: true }).decode(readBytes(golden)); + const file = golden.slice('fixtures/'.length, -'.inspect.json'.length) + '.dkc'; + expect(object(JSON.parse(text), golden).file).toBe(file); + const view = inspectView(await inspect(readBytes(`fixtures/${file}`)), file); + expect(inspectJSON(view)).toBe(text); }); }); // --------------------------------------------------------------------------- // Every synced file is run -// The vector files some test above runs; a new export needs its own block. -const KNOWN_VECTORS = new Set([ - 'vectors/dk1.json', - 'vectors/quicknet_rounds.json', - 'vectors/profile_quicknet.json', +// The vector files the blocks above run; a new export needs its own block. +const VECTOR_FILES = [ 'vectors/cbor.json', - 'vectors/mutations.json', + 'vectors/dk1.json', 'vectors/inspect_differential.json', -]); + 'vectors/mutations.json', + 'vectors/profile_quicknet.json', + 'vectors/quicknet_rounds.json', +]; describe('testdata/', () => { it('holds no file that no test runs', () => { + expect(listTestdata('vectors', '')).toEqual(VECTOR_FILES); const fixtureJSON = listTestdata('fixtures', '.json').filter((f) => !f.endsWith('.inspect.json')); // Files named by a fixture record: the fixture itself (fixtures.test.ts), // the capsule of a .dkk and the plaintext kept for phase 2. const referenced = new Set(); for (const f of fixtureJSON) { - const fx = readJSON(f); + const fx = object(readJSON(f), f); expect(typeof fx.file === 'string' && /\.(dkc|dkk)$/.test(fx.file), `${f}: "file" is not a .dkc or .dkk`).toBe(true); for (const k of ['file', 'capsule', 'plaintext_file']) if (typeof fx[k] === 'string') referenced.add(`fixtures/${fx[k] as string}`); } + const documentation = ['README.md', 'SOURCE.json']; const unhandled = listTestdata('', '').filter( - (f) => f !== 'SOURCE.json' && !f.endsWith('.inspect.json') && !KNOWN_VECTORS.has(f) && !fixtureJSON.includes(f) && !referenced.has(f), + (f) => + !documentation.includes(f) && + !VECTOR_FILES.includes(f) && + !f.endsWith('.inspect.json') && + !fixtureJSON.includes(f) && + !referenced.has(f), ); expect(unhandled, 'testdata files that no test runs: add a block for them in vectors.test.ts').toEqual([]); }); + it('documents every vector file in testdata/README.md', () => { + const readme = new TextDecoder().decode(readBytes('README.md')); + for (const f of VECTOR_FILES) expect(readme, f).toContain(`\`${f}\``); + }); + it('checks the harness itself', () => { - // bytesOf reads only what a case means. - expect(hx(bytesOf({ hex: '00ff' }))).toBe('00ff'); - expect(hx(bytesOf({ dkc: 'AP8=' }))).toBe('00ff'); - expect(hx(bytesOf({ data: 'AP8' }))).toBe('00ff'); - expect(hx(bytesOf({ b64: '_w' }))).toBe('ff'); - expect(bytesOf({ dkc: 'fixtures/time_only.dkc' })).toEqual(readBytes('fixtures/time_only.dkc')); - expect(bytesOf({ file: 'testdata/fixtures/time_only.dkc' })).toEqual(readBytes('fixtures/time_only.dkc')); - for (const c of [{}, { hex: 'abc' }, { hex: 'AP8=' }, { dkc: 'fixtures/missing.dkc' }, { dkc: 'a b' }, { base64: 'AP9' + '=' }, { file: '../package.json' }, { input: 3 }]) { - expect(() => bytesOf(c as Json), JSON.stringify(c)).toThrow(); + const base = Uint8Array.of(0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39); + const ed = (list: unknown): Edit[] => edits(list, 'test'); + const text = (b: Uint8Array): string => new TextDecoder().decode(b); + expect(text(applyEdits(base, ed([])))).toBe('0123456789'); + expect(text(applyEdits(base, ed([[2, 1, '58']])))).toBe('01X3456789'); + expect(text(applyEdits(base, ed([[3, 7, '']])))).toBe('012'); + expect(text(applyEdits(base, ed([[0, 10, '']])))).toBe(''); + expect(text(applyEdits(base, ed([[10, 0, '30']])))).toBe('01234567890'); + expect(text(applyEdits(base, ed([[1, 1, '6162'], [5, 2, ''], [10, 0, '21']])))).toBe('0ab234789!'); + expect(text(applyEdits(new Uint8Array(0), ed([[0, 0, '6869']])))).toBe('hi'); + for (const bad of [ + [[5, 1, ''], [2, 1, '']], + [[2, 3, ''], [4, 1, '']], + [[9, 2, '']], + ]) { + expect(() => applyEdits(base, ed(bad)), JSON.stringify(bad)).toThrow(); } - // Integers above 2^53-1 are spotted anywhere in a well-formed item. - expect(holdsUintAbove53(h('1b0020000000000000'))).toBe(true); - expect(holdsUintAbove53(h('82 01 a1 1bffffffffffffffff 40'))).toBe(true); - expect(holdsUintAbove53(h('1b001fffffffffffff'))).toBe(false); - for (const hex of ['1b0020000000000000 00', '1b00200000', '9b0000000000000002 00', 'c1 1b0020000000000000', '5b0020000000000000']) { - expect(holdsUintAbove53(h(hex)), hex).toBe(false); + for (const bad of [[[1, 2]], [[1, 2, 'zz']], [['1', 2, '']], [[-1, 0, '']], [[0, 0, 'AB']], {}]) { + expect(() => ed(bad), JSON.stringify(bad)).toThrow(FormatError); } - // Map values follow the notation of the vector. - const m = walk(h('a2 00 1b001fffffffffffff 01 41ff')); - expect(itemValue(m, [[0, '9007199254740991'], [1, 'ff']])).toEqual([[0, '9007199254740991'], [1, 'ff']]); - expect(itemValue(m, { 0: 9007199254740991, 1: 'ff' })).toEqual({ 0: 9007199254740991, 1: 'ff' }); - expect(casesOf({ other: [1] }, ['cases'])).toEqual([]); - expect(hasVerdict({ valid: true })).toBe(true); - expect(hasVerdict({ name: 'x' })).toBe(false); - expect(verdictOf({ go: { valid: false } })).toEqual({ valid: false }); + expect(() => keys({ a: 1, b: 2 }, 'x', ['a'])).toThrow(/unknown key "b"/); + expect(() => keys({ b: 2 }, 'x', ['a'], ['b'])).toThrow(/missing "a"/); + expect(() => code('ERR_NOPE', 'x')).toThrow(/not a normative code/); + expect(() => step(19, 'x')).toThrow(/outside 1..18/); + expect(() => checkSpec({ spec: '0.8.1' }, 'x')).toThrow(/want 0.8.2/); + expect(hasTestdata('README.md')).toBe(true); + expect(errorCode(new Error('x'))).toBe(''); }); }); diff --git a/src/lib/inspector/format.ts b/src/lib/inspector/format.ts index bb09ef7..6b54dd0 100644 --- a/src/lib/inspector/format.ts +++ b/src/lib/inspector/format.ts @@ -2,7 +2,7 @@ // keyed by input: every lookup below is a switch over a closed set of values // that the library produces (step numbers, normative codes, policies). -import { decodeUtf8, type ErrorCode, goIsPrintNonASCII, goQuote, type Instant, type InspectView } from '../dkc/index.ts'; +import { decodeUtf8, type ErrorCode, goIsPrintNonASCII, goQuote, type Instant, inspectJSON, type InspectView } from '../dkc/index.ts'; /** The eight steps of spec §63 run before unlock, in order. */ export const INSPECT_STEPS = [1, 2, 3, 4, 5, 6, 7, 8] as const; @@ -241,16 +241,10 @@ export function formatRelative(epochMs: number, nowMs: number): string { // JSON of the CLI /** - * The exact output of `datekeys inspect -json`: Go's json.Encoder with - * SetIndent("", " "), which escapes <, > and & (SetEscapeHTML is on by - * default) and U+2028 and U+2029, and ends with a newline. Keys and non-string - * values never hold those characters, so escaping the whole text only touches - * strings. JSON.stringify writes every other escape as Go 1.22 and later do. + * The exact output of `datekeys inspect -json`, the library's inspectJSON: + * Go's json.Encoder with SetIndent("", " "), <, >, &, U+2028 and U+2029 + * escaped, and a final newline. */ export function cliJSON(view: InspectView): string { - const text = JSON.stringify(view, null, 2).replace( - /[<>&\u2028\u2029]/g, - (c) => `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`, - ); - return `${text}\n`; + return inspectJSON(view); } diff --git a/testdata/README.md b/testdata/README.md new file mode 100644 index 0000000..294a496 --- /dev/null +++ b/testdata/README.md @@ -0,0 +1,326 @@ +# DateKeys test data + +Official vectors, fixtures and corpora of the DateKeys Protocol Specification +v0.8.2, generated by the reference implementation. Another implementation +consumes them as they are: this file documents every format, so that no Go code +has to be read. The rules that decide each verdict are in the specification; +this file points to them, and states only what belongs to the files +themselves. + +``` +go run ./internal/testkit/genfixtures -out testdata +``` + +regenerates everything except the `.dkc` and `.dkk` fixtures, which are +generated once and frozen (spec §67). The local gate (`scripts/check.sh`) and CI +run it and fail if any committed file changes: every file below is exactly what +the implementation computes today. + +Conventions for every file: + +- JSON in UTF-8, with LF line endings. Binary values are lowercase hex strings. +- `error`, `result` and similar fields hold the normative codes of spec §69, such + as `ERR_NON_CANONICAL_CBOR`. +- `step` is a step of the reading flow of spec §63, 1 to 18. Steps 1 to 8 are the + pre-unlock checks (`datekeys inspect`, `capsule.Inspect`): no network, no + secret. +- The `spec` field names the version of the specification. + +| File | Content | Spec | +|---|---|---| +| `vectors/profile_quicknet.json` | Quicknet Provider Profile: its 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 | §58, CDDL | +| `vectors/mutations.json` | the mutation corpus: 23 mutations of §64 and further cases | §63, §64 | +| `vectors/inspect_differential.json` | 1825 mutations of the 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 plaintext of each capsule | §67 | +| `fixtures/.inspect.json` | the exact output of `datekeys inspect -json` for each `.dkc` | §63 | + +The five official capsules are `time_only`, `time_only_extensions`, +`time_and_key_portable`, `time_and_key_recipients` and `empty_payload`. The +release that opens each one, a published Quicknet signature, is in its +`.json`, so they all decrypt offline. + +## Edited files + +`mutations.json` and `inspect_differential.json` give each mutated `.dkc` as +edits of a base file, not as its full bytes: + +```json +{ "base": "time_only.dkc", "edits": [[4, 1, "02"]] } +``` + +- `base` is a file of `testdata/fixtures`. In `mutations.json` it may be absent: + the base is then the empty file, and the single edit holds the whole capsule. +- An edit is `[at, delete, insert]`: the `delete` bytes at offset `at` of the + base are replaced by the bytes of the hex string `insert`. +- The edits of one file refer to offsets of the unmodified base, are sorted by + `at` and do not overlap. The result is therefore built in one pass: copy the + base up to `at`, append `insert`, skip `delete` bytes of the base, go on with + the next edit, and copy the rest of the base. +- `[0, 78799, ""]` on `time_only.dkc` is the empty file; `"edits": []` is the + base unchanged. + +## `vectors/cbor.json` + +```json +{ + "spec": "0.8.2", + "walk": { "max_depth": 3, "max_len": 64 }, + "accept": [ { "name": "uint 2^53 eight bytes", "hex": "1b0020000000000000", "value": "9007199254740992" } ], + "reject": [ { "name": "tag", "hex": "c101", "error": "ERR_NON_CANONICAL_CBOR" } ], + "schemas": [ { "block": "extension", "schema": "public_header", "name": "65 extensions", "hex": "a600…", "result": "ERR_NON_CANONICAL_CBOR" } ] +} +``` + +### Generic vectors: `accept` and `reject` + +Each `hex` is checked as exactly one data item of the CBOR profile of spec §58: +major types 0, 2, 3, 4 and 5 only; integers and lengths in their shortest form; +definite lengths; map keys that are unsigned integers in strictly ascending +order; valid UTF-8 text; nothing after the item. `accept` holds the inputs that +pass, `reject` those that fail, all with `ERR_NON_CANONICAL_CBOR`. + +The `walk` limits apply as well, as in the reference `codec.Walk`: containers +nest at most `max_depth` deep (a scalar has depth 0, `81818100` has depth 3), +and every byte string and text string has at most `max_len` bytes, every array +at most `max_len` items and every map at most `max_len` entries. The vectors +named "above max_len" or "above max_depth" fail on these limits only. + +`value` is present for an accepted unsigned integer: a JSON number up to +2^53 − 1, and a decimal string above, so that no reader loses precision. + +Among them: shortest-form boundaries, `a200010101` (the two-key map +`{0: 1, 1: 1}`), a text with a leading BOM, keys out of order or repeated, +non-integer keys, indefinite lengths, tags, floats, simple values, negative +integers, truncation, lengths beyond the input, trailing bytes, overlong UTF-8 +and surrogates. + +### Schema vectors: `schemas` + +Each vector is one encoded object: + +- `schema` names the object and the decoder to run on `hex`: + - `provider_profile`: a Provider Profile (§11), decoded and then validated + as a profile to pin, by rules 1 to 3 of spec §12.1 in their order: the + CDDL with the `period` limit of the reference, the field rules + (`ERR_UNKNOWN_PROFILE`) and the chain-hash self-check + (`ERR_PROFILE_MISMATCH`), whose formula §12.1 gives. No `profile_hash` is + expected (rule 4). A vector that changes a hashed key recomputes + `chain_hash`, unless its name says that the chain hash no longer matches. + - `public_header`: PUBLIC_HEADER (§24). No profile registry is consulted and + no extension is known: a header naming an unpinned profile is valid here + (`ERR_UNKNOWN_PROFILE` comes from the registry at step 4), and critical + extensions are not checked here. + - `control_cbor`: CONTROL_CBOR (§31). + - `dkk_body`: BODY_CBOR of a `.dkk` (§41), without the 12-byte DKK1 + prelude. +- `block` names the schema the vector exercises: the same as `schema`, or + `verification_metadata` (the `.dkk` body's key 6 varies) or `extension` (the + PUBLIC_HEADER's key 6, `noncritical_extensions`, varies). +- `result` is `ok` or the error code. + +When bytes break several rules, the code is the one of the first failing +layer of spec §69.1: the type tag and the schema version, read first from keys +0 and 1 (layer 2), then the CDDL, the implementation limits included, and the +re-encoding (layer 3), and only then the fields with codes of their own in +ascending key order (layer 4). The objects of these vectors have no frame, so +layer 1 does not apply, and their critical extensions are not checked (see +above). + +Each block has a minimal valid object, an unknown key, a missing required key, a +wrong type and values out of size or range. The `extension` block has, besides: +data `40` (empty) and `5801xx` (length not in its shortest form), data of every +other type (text, `null`, integer, map, array, tag, indefinite length), 64 and +65 extensions, an `extension_id` starting with a BOM, the pair U+FF61 and +U+10000 in UTF-8 byte order (valid) and in UTF-16 order (invalid), and +`extension_version` 2^32 − 1 (valid), 2^32 and 2^53 (invalid). + +#### Implementation limits + +The vectors apply the implementation limits of the reference that spec §74 +lists: the maximum `extension_id` length, the Provider Profile `period` of one +day, the maximum name lengths and the `public_key` length. The vectors named +"the implementation limit" sit at a limit and are valid; those named "above +the implementation limit" go one past it and are otherwise valid, so that an +implementation without the limit accepts them. The name alphabets, the +`genesis_time` range and the drand rules of the `provider_profile` +validation are not limits: they are rules of spec §12.1. Neither is the +minimum of one byte of `extension_id` (spec §31). + +## `vectors/mutations.json` + +The mutation corpus of spec §64, as frozen data. Each case is a `.dkc`, what +the reader is given to open it, and the exact error and step at which the full +reading flow (`capsule.Open`, §63) must fail. + +```json +{ + "name": "version changed", + "spec": true, + "dkc": { "base": "time_only.dkc", "edits": [[4, 1, "02"]] }, + "release": { "round": 1000, "signature": "b446…" }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_UNSUPPORTED_VERSION", + "step": 2 +} +``` + +- `name`: unique, stable. +- `spec`: true for the 23 mutations listed in spec §64 (the first 23 cases), + false for the further cases of the reference. +- `dkc`: the capsule, as edits of a fixture (see above). The reader gets it as a + seekable file, so that the `capsule_digest` of an offered `.dkk` is checked + before any release request (spec §63 step 9.a). +- `dkk`: the hex of a complete `.dkk` file (prelude and body) offered as the + access credential; absent when none is offered. +- `identities`: age X25519 identities (`AGE-SECRET-KEY-1…`) offered as access + credentials; absent when none. +- `release`: what the release source answers to every request, whatever round + is asked for. The reader must verify it (§51): a case may serve a release of + another round, or a round with the signature of another. `null` means that + no release is available (`ERR_RELEASE_UNAVAILABLE`). +- `now`: the reader's clock, RFC 3339. No release is requested before the round + time of the DateKey. +- `registry`: `default` pins exactly the Quicknet profile of + `profile_quicknet.json`; `empty` pins none. +- `extensions`: the extensions the application implements. Each entry is known + at `(id, version)`, and its data is valid only when it equals the bytes of + `valid_data`. Absent: the application knows no extension, the state of the + base protocol V1. +- `network`: whether the failure may come after a release request. When false, + the reader must fail without requesting any release (§27, §63): every failure + of steps 1 to 8 and of step 9 before the request (9.a to 9.c). +- `frozen`: the capsule was built once with age randomness; its bytes are kept + and never regenerated. These cases have no `base`. +- `error`, `step`: the expected code and the step of §63 that fails. + +Every case reproduces offline: the recorded release stands in for the network. +A reader that implements only steps 1 to 8 can replay every case whose `step` is +at most 8: 31 cases, 13 of them from §64. Steps 1 to 8 are summarised in "The +checks of steps 1 to 8" below. + +### Credentials and the release: step 9 + +What happens between step 8 and the release request is spec §63 step 9: for +`time_and_key` only, an offered `.dkk` is checked as an object and then bound +to the capsule (9.a), at least one credential must be offered (9.b), and for +either policy a `now` before the round time of the DateKey fails without a +request (9.c); only then is the release requested. For `time_only` the +credentials play no part: the §64 case "access_policy=time_only with +time_and_key structure" offers a `.dkk` whose `capsule_digest` is that of the +unmutated capsule, and fails at step 12, not at step 9. The codes after the +request, for the release (step 10) and for the identities that open each age +file (steps 11, 13 and 17), are those of spec §63 as well. In this corpus: + +- identities are not examined before the release (spec §63 step 13); +- a `release` of `null` is `ERR_RELEASE_UNAVAILABLE` at step 9; +- every `.dkk` offered decodes: the corpus checks step 9.a, not the decoding + of a `.dkk`, whose errors spec §63 also places at step 9.a. + +## The checks of steps 1 to 8 + +`mutations.json` and `inspect_differential.json` follow the rules of the +specification for steps 1 to 8, with the `default` registry (Quicknet pinned), +no extension known unless a case lists some, and no secret. The first failure +ends the flow, and within one object the first failing layer decides the code +(spec §69.1): + +| Step | Rules | Spec | +|---|---|---| +| 1, 2 | magic, truncated prelude, framing version, FLAGS and RESERVED, `PUBLIC_HEADER_LEN` in 1 to 1048576 and `SEALED_CONTROL_LEN` in 1 to 67108864 | §22, §23 | +| 3 | the PUBLIC_HEADER bytes are present | §23 | +| 4 | PUBLIC_HEADER: layers 2 to 4, the `public_header` decoder of the schema vectors, then the pinned profile of the DateKey and the critical extensions; with no extension known, every `critical_extensions` array fails | §63, §69.1 | +| 5 | the SEALED_CONTROL bytes are present, then its age header, parsed within `SEALED_CONTROL_LEN` bytes: malformed is `ERR_INTEGRITY`, one tlock stanza is required | §28.1 | +| 6 | the age header of PAYLOAD_AGE, from its offset to the end of the file: malformed is `ERR_INTEGRITY`, one X25519 stanza is required | §22, §28.1 | +| 7 | the round time of the DateKey is at most 9999-12-31T23:59:59Z (Quicknet: round 83903165811 at most); a `dk1_` round above it passes step 4 and fails here | §15 | +| 8 | the tlock stanza has exactly two arguments, the canonical decimal round and the lowercase hex chain hash, compared as strings | §63 step 8 | + +The reference parses age headers with `filippo.io/age` v1.3.2, whose parser +limits (1024 stanzas, 128 arguments after the type, 2 MiB) spec §74 lists as +implementation limits. No case of these corpora depends on them. + +## `vectors/inspect_differential.json` + +A differential corpus of the pre-unlock checks: 1825 deterministic mutations of +the five official `.dkc` fixtures, with the verdict of steps 1 to 8 of §63 as +the reference computes it (`capsule.Inspect` with the `default` registry, no +extension known, no network, no secret), by the rules that "The checks of +steps 1 to 8" above points to. The file repeats the format below in its +`format` field. + +```json +{ + "seed": 20260925, + "bases": [ { "file": "time_only.dkc", "sha256": "99e9…" } ], + "mutations": [ + {"base":0,"kind":"flip","edits":[[121,1,"b3"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[725,1,"4d"]],"result":"ok"} + ] +} +``` + +- `bases`: the fixtures, with the SHA-256 of their exact bytes. `base` in a + mutation is an index into this list. +- `edits`: see "Edited files". +- `result`: `ok` when steps 1 to 8 pass, or the error code; `step` is the step + that failed, absent when `ok`. +- `kind` names the generator and is informative: `flip` (one bit), `byte` (one + byte replaced), `truncate`, `insert` and `delete` (one to four bytes), + `length` (PUBLIC_HEADER_LEN and SEALED_CONTROL_LEN), `header` (PUBLIC_HEADER + re-encoded with one CBOR-aware change: a key removed, added or retyped, the + type tag, version, `capsule_id`, DateKey or `access_policy` changed, an + extension array added, a head not in its shortest form, keys out of order or + repeated, the whole item tagged, wrapped, made indefinite, truncated or + followed by bytes), `datekey` (the DateKey string alone), `age` (the age + header of SEALED_CONTROL or PAYLOAD_AGE edited: intro line, stanza type, + arguments, stanzas added or removed, body lines, MAC line, line endings). + Most `header`, `datekey` and SEALED_CONTROL `age` mutations also rewrite the + prelude lengths to match; some keep the old ones on purpose. +- `seed` seeds the generator of the reference and is informative too: every + mutation is stored explicitly. + +## `fixtures/.inspect.json` + +For each official `.dkc`, the exact bytes that `datekeys inspect -json -in +.dkc` prints when run in `testdata/fixtures`: JSON indented with two +spaces, fields in this order, and a final newline. The pre-unlock checks use +the `default` registry. + +| Field | Content | +|---|---| +| `file` | the `-in` argument, `.dkc` | +| `capsule_id` | hex, once step 4 has decoded the header | +| `datekey`, `profile`, `round` | the canonical `dk1_` string, its profile and round | +| `unlock_at` | the round time of the DateKey, RFC 3339 in UTC, once step 7 passes | +| `access_policy` | `time_only` or `time_and_key` | +| `valid` | true when steps 1 to 8 pass | +| `error` | the code of the failure, absent when valid | +| `checks` | one entry per step run: `step`, `name`, `ok`, `detail` (free text) and, for a failed step, `error` | + +`detail` is informative text of the reference; a second implementation compares +at least `step`, `name`, `ok` and `error`, and every other field. + +## Existing vectors and fixtures + +- `vectors/profile_quicknet.json`: the Quicknet profile fields, + `canonical_cbor` (hex) and `profile_hash`. +- `vectors/quicknet_rounds.json`: `vectors` of `requested` instants (RFC 3339 + with nanoseconds) and the resolved `round` and `effective` time, or `error`. +- `vectors/dk1.json`: valid `vectors` with `network`, `round`, + `canonical_json`, `base64url` and `dk1`; invalid ones with `input` and the + `error` code (`accepted` would mean the input decodes). +- `fixtures/.json`: for each `.dkc`, its SHA-256, the release that opens + it, the hex of the prelude, PUBLIC_HEADER and CONTROL_CBOR, the DateKey, + `capsule_id`, `header_binding`, `payload_identity` (I_PAYLOAD, a test + secret), the visible stanzas of each age file, the identities or `.dkk` that + open it, the exact extension data, and the result of every step of §63. +- `fixtures/.dkk.json`: for each `.dkk`, its SHA-256, `credential_id`, + `capsule_id`, `access_type`, `access_material` (a test secret), + `capsule_digest`, extensions and the capsule it opens. diff --git a/testdata/SOURCE.json b/testdata/SOURCE.json index 6bedf1b..db813d1 100644 --- a/testdata/SOURCE.json +++ b/testdata/SOURCE.json @@ -1,13 +1,16 @@ { "module": "g.activething.com/go/DateKeys", - "commit": "afb44a396ea23db34ca3495130a2414198cfe5db", + "commit": "382006649fc950ffc41c6adb1346055860280cf5", "files": { + "README.md": "f8f41632ee3e7cd3f7a3d3fa4459bc7bdbd201d905109ba8a9f9c6a5defcda78", "fixtures/empty_payload.dkc": "871e9bf05b52bbae17f3adfbbf97b46e7f0e53aa8f57bcaa506e43f36f53a9d4", + "fixtures/empty_payload.inspect.json": "dd2b21faefdfe3aa59b5eeef9130a6896070ae30a2b16933f3aefd146828207e", "fixtures/empty_payload.json": "490a6e7f7acc882bcb956b297ad8c817d7b21da29e8d4c4a2cd31c852707eee0", "fixtures/empty_payload.plaintext": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "fixtures/time_and_key_portable.dkc": "2e97878078bae6358037a9c264f379a3cbe839f767d69836b0343f35657b2972", "fixtures/time_and_key_portable.dkk": "e528fa2c832c91119f0684bb9d6fb3c4c2d0d55183482890e7c4fe92f668426a", "fixtures/time_and_key_portable.dkk.json": "24eab4758e4abdb09e2316e0330ac16872dd021612eb32c40fac607f80f10a18", + "fixtures/time_and_key_portable.inspect.json": "a80724f68facb94be3d64ec2587dd547be38b9e492e9c30149b1c6cf2753ba01", "fixtures/time_and_key_portable.json": "258fb17f95a0dbf074d017bffac6415b2982dffc7895a3b31a1ccd9132d6a5fc", "fixtures/time_and_key_portable.plaintext": "937492203d207d6fe36161b8696bf1f05b8b4cc56d855c44853f4b76aad3a05b", "fixtures/time_and_key_portable_extension.dkk": "0bf463a7c65627b7dda2234d728df89ec5b835816a2a37b91497d8fecc5ea548", @@ -15,15 +18,21 @@ "fixtures/time_and_key_recipients.dkc": "69ac110380f5d768b5b6afaa157a50ed17d8ceccfbd4604ffa5b6da38539b635", "fixtures/time_and_key_recipients.dkk": "19f6c47150c3194712d454f43c7392b7344e6b4e7b074d83e9ca5f563a8e072f", "fixtures/time_and_key_recipients.dkk.json": "d5a0c241a1fbef52bcb848b2531bda4020d9a7882bfc4f49755c61ae97a4d6bc", + "fixtures/time_and_key_recipients.inspect.json": "12c7f2200474c383ad93de7b2835dc60b4d7486926ce02955ac3ae97fc23952d", "fixtures/time_and_key_recipients.json": "ebc77cd00ff52e08743976558605159cc0cc3747399c3ce05dc46f7cafb35b2d", "fixtures/time_and_key_recipients.plaintext": "0e9fd50e98a85953aa9cf07a11ee3c62bb3d7622f344f1c6ce744d1ed111659f", "fixtures/time_only.dkc": "99e915810d595f1092700b728f5e5081d78efe83f5343e76325b1bcc2c33ccf2", + "fixtures/time_only.inspect.json": "67a95a7ff711ec830fcd53b9328d5cd7c70bb34a205bc72ae99610c22ed8a6f4", "fixtures/time_only.json": "9ea5576bfa237066b92ad07e5f1c26d6d782e975edd071a8728b21bc7998afaa", "fixtures/time_only.plaintext": "53b8ee821fb7b678e89d4f93da1812339f6cc1ab83aac6ed1432db99df784be5", "fixtures/time_only_extensions.dkc": "0446c9b73e267adcb24e5cc89afba2544a386ec9a050016e06517a4a57aa2085", + "fixtures/time_only_extensions.inspect.json": "168d61d22e41e55a94d5f057afd2c4dd2ceef2a5bd4c5abaedea76c6faa29ab9", "fixtures/time_only_extensions.json": "117636691ab04d0a6274d09de7c7763fe99595a46dae9c42d066f118f816e85b", "fixtures/time_only_extensions.plaintext": "1129768e195e2f1e50b7a6f926b6eebef120212c29b5642c8a662c503b2a9131", - "vectors/dk1.json": "618ff753996f6967eddf9ebd781dff5943b9784c99c782aa323ce4f861d632e5", + "vectors/cbor.json": "444fe6104476fbcda91e1873c12752186dbf7e55ad0769e1eb0678ed9673c9d6", + "vectors/dk1.json": "3c461ffea754a80017f257767807330307d5b73a02d9e5b946e1fb82013271af", + "vectors/inspect_differential.json": "fe207b67d307e3ae7a78295b7a882d98669adbf498b725443ab4757eb9da03f7", + "vectors/mutations.json": "0ab1f3dd30f4aef86c39a69b314a2843d0819193153a97fd3b9959199d0dbd65", "vectors/profile_quicknet.json": "4f9de60475d0807aa580f59cf3e6df38cba2a55a62f590aefa2a55753ddb0055", "vectors/quicknet_rounds.json": "22c764aac454ce320daf7e65b9494ff2d207cac974c68d07e84f4ec18c3ed920" } diff --git a/testdata/fixtures/empty_payload.inspect.json b/testdata/fixtures/empty_payload.inspect.json new file mode 100644 index 0000000..546e878 --- /dev/null +++ b/testdata/fixtures/empty_payload.inspect.json @@ -0,0 +1,60 @@ +{ + "file": "empty_payload.dkc", + "capsule_id": "ab10174561a9a19a6d9dc9ab1ef59c66", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMX0", + "profile": "datekeys:quicknet:v1", + "round": 1001, + "unlock_at": "2023-08-23T15:59:27Z", + "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 v1, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=446" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "121 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=ab10174561a9a19a6d9dc9ab1ef59c66 datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMX0 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 1001, unlock at 2023-08-23T15:59:27Z" + }, + { + "step": 8, + "name": "tlock stanza", + "ok": true, + "detail": "round 1001, chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" + } + ] +} diff --git a/testdata/fixtures/time_and_key_portable.inspect.json b/testdata/fixtures/time_and_key_portable.inspect.json new file mode 100644 index 0000000..df7e14d --- /dev/null +++ b/testdata/fixtures/time_and_key_portable.inspect.json @@ -0,0 +1,60 @@ +{ + "file": "time_and_key_portable.dkc", + "capsule_id": "448e134a13457c319cab7fceaf7ffa1f", + "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 v1, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=646" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "121 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=448e134a13457c319cab7fceaf7ffa1f 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" + } + ] +} diff --git a/testdata/fixtures/time_and_key_recipients.inspect.json b/testdata/fixtures/time_and_key_recipients.inspect.json new file mode 100644 index 0000000..839d778 --- /dev/null +++ b/testdata/fixtures/time_and_key_recipients.inspect.json @@ -0,0 +1,60 @@ +{ + "file": "time_and_key_recipients.dkc", + "capsule_id": "c75dfc8e9c576d1369910664df93693a", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMX0", + "profile": "datekeys:quicknet:v1", + "round": 1001, + "unlock_at": "2023-08-23T15:59:27Z", + "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 v1, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=842" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "121 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=c75dfc8e9c576d1369910664df93693a datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMX0 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 1001, unlock at 2023-08-23T15:59:27Z" + }, + { + "step": 8, + "name": "tlock stanza", + "ok": true, + "detail": "round 1001, chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" + } + ] +} diff --git a/testdata/fixtures/time_only.inspect.json b/testdata/fixtures/time_only.inspect.json new file mode 100644 index 0000000..3e70a03 --- /dev/null +++ b/testdata/fixtures/time_only.inspect.json @@ -0,0 +1,60 @@ +{ + "file": "time_only.dkc", + "capsule_id": "ad4d676812b134ff8a3de263f77018b4", + "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 v1, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=446" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "121 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=ad4d676812b134ff8a3de263f77018b4 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" + } + ] +} diff --git a/testdata/fixtures/time_only_extensions.inspect.json b/testdata/fixtures/time_only_extensions.inspect.json new file mode 100644 index 0000000..249fb2f --- /dev/null +++ b/testdata/fixtures/time_only_extensions.inspect.json @@ -0,0 +1,60 @@ +{ + "file": "time_only_extensions.dkc", + "capsule_id": "4286085c21ca34d1a71e649326a4a0f6", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MjAwMH0", + "profile": "datekeys:quicknet:v1", + "round": 2000, + "unlock_at": "2023-08-23T16:49: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 v1, PUBLIC_HEADER_LEN=159, SEALED_CONTROL_LEN=482" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "159 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=4286085c21ca34d1a71e649326a4a0f6 datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MjAwMH0 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 2000, unlock at 2023-08-23T16:49:24Z" + }, + { + "step": 8, + "name": "tlock stanza", + "ok": true, + "detail": "round 2000, chain 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" + } + ] +} diff --git a/testdata/vectors/cbor.json b/testdata/vectors/cbor.json new file mode 100644 index 0000000..b92de98 --- /dev/null +++ b/testdata/vectors/cbor.json @@ -0,0 +1,1450 @@ +{ + "spec": "0.8.2", + "description": "CBOR profile of spec §58 and the schemas of spec/datekeys.cddl, generated by the reference implementation. accept and reject are walked as one data item of the profile with the limits of walk; schemas are decoded with the decoder of their schema. See testdata/README.md.", + "walk": { + "max_depth": 3, + "max_len": 64 + }, + "accept": [ + { + "name": "uint 0", + "hex": "00", + "value": 0 + }, + { + "name": "uint 23 inline", + "hex": "17", + "value": 23 + }, + { + "name": "uint 24 one byte", + "hex": "1818", + "value": 24 + }, + { + "name": "uint 255 one byte", + "hex": "18ff", + "value": 255 + }, + { + "name": "uint 256 two bytes", + "hex": "190100", + "value": 256 + }, + { + "name": "uint 65535 two bytes", + "hex": "19ffff", + "value": 65535 + }, + { + "name": "uint 65536 four bytes", + "hex": "1a00010000", + "value": 65536 + }, + { + "name": "uint 2^32-1 four bytes", + "hex": "1affffffff", + "value": 4294967295 + }, + { + "name": "uint 2^32 eight bytes", + "hex": "1b0000000100000000", + "value": 4294967296 + }, + { + "name": "uint 2^53-1 eight bytes", + "hex": "1b001fffffffffffff", + "value": 9007199254740991 + }, + { + "name": "uint 2^53 eight bytes", + "hex": "1b0020000000000000", + "value": "9007199254740992" + }, + { + "name": "uint 2^64-1 eight bytes", + "hex": "1bffffffffffffffff", + "value": "18446744073709551615" + }, + { + "name": "empty bstr", + "hex": "40" + }, + { + "name": "bstr of one byte", + "hex": "4100" + }, + { + "name": "bstr of 23 bytes, inline length", + "hex": "57ababababababababababababababababababababababab" + }, + { + "name": "bstr of 24 bytes, one-byte length", + "hex": "5818abababababababababababababababababababababababab" + }, + { + "name": "bstr of 64 bytes, max_len", + "hex": "5840abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab" + }, + { + "name": "empty text", + "hex": "60" + }, + { + "name": "text a", + "hex": "6161" + }, + { + "name": "text with NUL", + "hex": "6100" + }, + { + "name": "text with leading BOM", + "hex": "64efbbbf61" + }, + { + "name": "text U+FF61", + "hex": "63efbda1" + }, + { + "name": "text U+10000", + "hex": "64f0908080" + }, + { + "name": "text U+10FFFF", + "hex": "64f48fbfbf" + }, + { + "name": "text of 64 bytes, max_len", + "hex": "784061616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161" + }, + { + "name": "empty array", + "hex": "80" + }, + { + "name": "empty map", + "hex": "a0" + }, + { + "name": "map two sorted keys", + "hex": "a200010101" + }, + { + "name": "map keys 23 and 24", + "hex": "a21700181800" + }, + { + "name": "map keys 255 and 256", + "hex": "a218ff0019010000" + }, + { + "name": "map with text and bstr values", + "hex": "a2006161014100" + }, + { + "name": "array of mixed items", + "hex": "8500406080a0" + }, + { + "name": "array of 64 items, max_len", + "hex": "984000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "map of 64 entries, max_len", + "hex": "b84000000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700181800181900181a00181b00181c00181d00181e00181f00182000182100182200182300182400182500182600182700182800182900182a00182b00182c00182d00182e00182f00183000183100183200183300183400183500183600183700183800183900183a00183b00183c00183d00183e00183f00" + }, + { + "name": "containers nested 3 deep, max_depth", + "hex": "81818100" + }, + { + "name": "map in array in map", + "hex": "a10081a10000" + } + ], + "reject": [ + { + "name": "empty input", + "hex": "", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "uint 23 with one extra byte", + "hex": "1817", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "uint 255 in two bytes", + "hex": "1900ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "uint 65535 in four bytes", + "hex": "1a0000ffff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "uint 2^32-1 in eight bytes", + "hex": "1b00000000ffffffff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "bstr length not shortest", + "hex": "5800", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "text length not shortest", + "hex": "7800", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "array length not shortest", + "hex": "9800", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "map length not shortest", + "hex": "b800", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "map key not shortest", + "hex": "a1180000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "keys out of order", + "hex": "a201000001", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "duplicate key", + "hex": "a200000001", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "keys out of order in a nested map", + "hex": "a100a201000000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "text key", + "hex": "a1616100", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "bstr key", + "hex": "a1416100", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "negative integer key", + "hex": "a12000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "array key", + "hex": "a18000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "float key", + "hex": "a1f93c0000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "indefinite array", + "hex": "9f01ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "indefinite map", + "hex": "bf0000ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "indefinite bstr", + "hex": "5f4100ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "indefinite text", + "hex": "7f6161ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "break", + "hex": "ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "tag", + "hex": "c101", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "tag 24, encoded CBOR data item", + "hex": "d8184100", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "tag 2, bignum", + "hex": "c24101", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "float", + "hex": "f97e00", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "half-precision float 1.0", + "hex": "f93c00", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "single-precision float 1.0", + "hex": "fa3f800000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "double-precision float 1.0", + "hex": "fb3ff0000000000000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "false", + "hex": "f4", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "true", + "hex": "f5", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "null", + "hex": "f6", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "undefined", + "hex": "f7", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "simple value 16", + "hex": "f0", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "simple value 32", + "hex": "f820", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "negative int", + "hex": "20", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "negative int -25", + "hex": "3818", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "reserved additional information 28", + "hex": "1c", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "reserved additional information 29 in a bstr head", + "hex": "5d", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "reserved additional information 30 in an array head", + "hex": "9e", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated uint", + "hex": "1901", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated eight-byte uint", + "hex": "1b00000000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated bstr", + "hex": "4200", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated text", + "hex": "6261", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated array", + "hex": "8200", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "map without the value of its last key", + "hex": "a100", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated map head", + "hex": "b900", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "length beyond input", + "hex": "5affffffff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "array count beyond input", + "hex": "9affffffff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "map count beyond input", + "hex": "baffffffff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "trailing byte", + "hex": "0100", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "trailing byte after a map", + "hex": "a000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "invalid UTF-8", + "hex": "61ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "overlong UTF-8", + "hex": "62c080", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "overlong three-byte UTF-8", + "hex": "63e08080", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "UTF-8 surrogate", + "hex": "63eda080", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "truncated UTF-8 sequence", + "hex": "62e282", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "UTF-8 above U+10FFFF", + "hex": "64f4908080", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "invalid UTF-8 in a map value", + "hex": "a10061ff", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "tag inside an array", + "hex": "81c101", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "float inside a map", + "hex": "a100f93c00", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "containers nested 4 deep, above max_depth", + "hex": "8181818100", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "bstr of 65 bytes, above max_len", + "hex": "5841ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "text of 65 bytes, above max_len", + "hex": "78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "array of 65 items, above max_len", + "hex": "98410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "ERR_NON_CANONICAL_CBOR" + }, + { + "name": "map of 65 entries, above max_len", + "hex": "b84100000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700181800181900181a00181b00181c00181d00181e00181f00182000182100182200182300182400182500182600182700182800182900182a00182b00182c00182d00182e00182f00183000183100183200183300183400183500183600183700183800183900183a00183b00183c00183d00183e00183f00184000", + "error": "ERR_NON_CANONICAL_CBOR" + } + ], + "schemas": [ + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "Quicknet profile", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ok" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "unknown key 11", + "hex": "ac007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e0b00", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "missing key 10, genesis_seed", + "hex": "aa007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d72666339333830", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "missing key 6, public_key", + "hex": "aa007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e9710703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "keys 2 and 3 out of order", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c65010103656472616e640274646174656b6579733a717569636b6e65743a76310468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "period as a text string", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a076133081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "chain_hash as a text string", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e65740578406162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616206586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "null genesis_seed", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300af6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "chain_hash of 31 bytes", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405581f52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e906586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "genesis_seed of 33 bytes", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5821f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e00", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "period 0", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0700081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "network default, left out of the chain hash", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e64046764656661756c74055820bb53bd3c1f404463b224d27e22872c4754f7d4f5549693d349f616c3ac27d4a906586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ok" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "period of one day, the implementation limit", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e6574055820c11da7002fbe7b2ab5db749677c90aed2afdf497830e0b1ffecb743c823b288806586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a071a00015180081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ok" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "period of one day and one second, above the implementation limit", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582031383a308a47c8d7e3d3523953720259090943f8f66a41eaf61ccacc66228e0a06586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a071a00015181081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "period 2^53", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a071b0020000000000000081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "genesis_time 2^53", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081b0020000000000000097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "negative genesis_time", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a07030820097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "period not in shortest form", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a071a00000003081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "schema version 2", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501020274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNSUPPORTED_VERSION" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "schema version 2 and an unknown key 11: the version is read first", + "hex": "ac007819646174656b6579732d70726f76696465722d70726f66696c6501020274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e0b00", + "result": "ERR_UNSUPPORTED_VERSION" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "schema version 2^53", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c65011b00200000000000000274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "type tag of PUBLIC_HEADER", + "hex": "ab006a646174656b657963617001010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "type tag of PUBLIC_HEADER and schema version 2: the type tag is checked first", + "hex": "ab006a646174656b657963617001020274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "invalid profile_id", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274446174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "network changed: the chain hash no longer matches", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640469717569636b6e65743205582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_PROFILE_MISMATCH" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "network changed with its chain hash", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640469717569636b6e657432055820f9ebb46d628f46c5337d56d07caff03a068bfc999069229248124c18cec7628a06586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ok" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "empty public_key", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106400703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "public_key of 1025 bytes", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e6574055820ee45f5fd67c9882102c9e97de655ef03d5dc080c2622437f29fe3d55e044a7a006590401aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "public_key that is not a group element", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e6574055820313a115287626894ee150d2c0465aaae0241143a68ae351f4d123b1cf2c8379f0658600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "public_key the identity element", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e65740558206889aad9dcb373aed5873d336eba3f07c5b06b3934126e49377534cbd2219582065860c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "provider other than drand", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103666472616e64320468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "unknown scheme", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e62127096b626c732d756e6b6e6f776e0a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "scheme pedersen-bls-chained, not supported by tlock", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e657405582052db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e97106586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081a64e621270974706564657273656e2d626c732d636861696e65640a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "genesis_time 0", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e65740558203c9211f43dcdf3ffdc7c19ab0a111b844c063d27b2cfc558ed22752bb60f9b3806586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a07030800097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "genesis_time 253402300798, 9999-12-31T23:59:58Z", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e65740558205daeb5ff2fdfcd368828087dd982690008eccb638dc31cb78b7bfa450cbede1806586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081b0000003afff4417e097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ok" + }, + { + "block": "provider_profile", + "schema": "provider_profile", + "name": "genesis_time 253402300799, 9999-12-31T23:59:59Z", + "hex": "ab007819646174656b6579732d70726f76696465722d70726f66696c6501010274646174656b6579733a717569636b6e65743a763103656472616e640468717569636b6e6574055820bc40718f2c5f868c82f31e803bbfed2a5d1260c0c408aa6fa14f0da1603be73006586083cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a0703081b0000003afff4417f097818626c732d756e636861696e65642d67312d726663393338300a5820f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e", + "result": "ERR_UNKNOWN_PROFILE" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "minimal header", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ok" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "time_and_key policy", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300401", + "result": "ok" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "both extension arrays", + "hex": "a7006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000581a2006d6f72672e6578616d706c652e6101010681a3006d6f72672e6578616d706c652e620101024100", + "result": "ok" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "DateKey of a profile that is not pinned: the registry decides", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037850646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d365a585a74626d56304f6e597849697769636d3931626d51694f6a45774d4442390400", + "result": "ok" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "unknown key 7", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000700", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "missing key 2, capsule_id", + "hex": "a4006a646174656b65796361700101037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "missing key 4, access_policy", + "hex": "a4006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "keys 3 and 4 out of order", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f0400037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "capsule_id as a text string", + "hex": "a5006a646174656b65796361700101027030313233343536373839616263646566037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "DateKey as a byte string", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f035853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "capsule_id of 15 bytes", + "hex": "a5006a646174656b65796361700101024f000102030405060708090a0b0c0d0e037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "capsule_id of 17 bytes", + "hex": "a5006a646174656b657963617001010251000102030405060708090a0b0c0d0e0f10037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "access_policy 2", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300402", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "access_policy 256", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004190100", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "access_policy not in shortest form", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830041800", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "null access_policy", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004f6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "schema version 2", + "hex": "a5006a646174656b657963617001020250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_UNSUPPORTED_VERSION" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "schema version 2 and a trailing byte: the version is read first", + "hex": "a5006a646174656b657963617001020250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040000", + "result": "ERR_UNSUPPORTED_VERSION" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "schema version 2^53", + "hex": "a5006a646174656b6579636170011b00200000000000000250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "schema version 2^64-1", + "hex": "a5006a646174656b6579636170011bffffffffffffffff0250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "type tag of CONTROL_CBOR", + "hex": "a50070646174656b6579732d636f6e74726f6c01010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "type tag of CONTROL_CBOR and schema version 2: the type tag is checked first", + "hex": "a50070646174656b6579732d636f6e74726f6c01020250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "empty critical_extensions", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000580", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "same extension_id in both arrays", + "hex": "a7006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000581a2006d6f72672e6578616d706c652e6101010681a2006d6f72672e6578616d706c652e610101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "trailing byte after the map", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040000", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "non-canonical dk1_ JSON", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037856646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d44417766510400", + "result": "ERR_DATEKEY_NON_CANONICAL" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "DateKey that is not dk1_", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f036568656c6c6f0400", + "result": "ERR_DATEKEY_INVALID" + }, + { + "block": "public_header", + "schema": "public_header", + "name": "non-canonical DateKey and undefined access_policy: the CDDL is checked first", + "hex": "a5006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037856646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d44417766510402", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "minimal control", + "hex": "a40070646174656b6579732d636f6e74726f6c010102582011111111111111111111111111111111111111111111111111111111111111110358202222222222222222222222222222222222222222222222222222222222222222", + "result": "ok" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "both extension arrays", + "hex": "a60070646174656b6579732d636f6e74726f6c0101025820111111111111111111111111111111111111111111111111111111111111111103582022222222222222222222222222222222222222222222222222222222222222220481a2006d6f72672e6578616d706c652e6101010581a3006d6f72672e6578616d706c652e620101024178", + "result": "ok" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "unknown key 6", + "hex": "a50070646174656b6579732d636f6e74726f6c0101025820111111111111111111111111111111111111111111111111111111111111111103582022222222222222222222222222222222222222222222222222222222222222220600", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "missing key 3, payload_identity", + "hex": "a30070646174656b6579732d636f6e74726f6c01010258201111111111111111111111111111111111111111111111111111111111111111", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "missing key 2, header_binding", + "hex": "a30070646174656b6579732d636f6e74726f6c01010358202222222222222222222222222222222222222222222222222222222222222222", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "header_binding as a text string", + "hex": "a40070646174656b6579732d636f6e74726f6c010102782061616161616161616161616161616161616161616161616161616161616161610358202222222222222222222222222222222222222222222222222222222222222222", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "header_binding of 31 bytes", + "hex": "a40070646174656b6579732d636f6e74726f6c010102581f111111111111111111111111111111111111111111111111111111111111110358202222222222222222222222222222222222222222222222222222222222222222", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "payload_identity of 33 bytes", + "hex": "a40070646174656b6579732d636f6e74726f6c01010258201111111111111111111111111111111111111111111111111111111111111111035821222222222222222222222222222222222222222222222222222222222222222222", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "null payload_identity", + "hex": "a40070646174656b6579732d636f6e74726f6c0101025820111111111111111111111111111111111111111111111111111111111111111103f6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "schema version 2", + "hex": "a40070646174656b6579732d636f6e74726f6c010202582011111111111111111111111111111111111111111111111111111111111111110358202222222222222222222222222222222222222222222222222222222222222222", + "result": "ERR_UNSUPPORTED_VERSION" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "type tag of PUBLIC_HEADER", + "hex": "a4006a646174656b6579636170010102582011111111111111111111111111111111111111111111111111111111111111110358202222222222222222222222222222222222222222222222222222222222222222", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "control_cbor", + "schema": "control_cbor", + "name": "empty noncritical_extensions", + "hex": "a50070646174656b6579732d636f6e74726f6c0101025820111111111111111111111111111111111111111111111111111111111111111103582022222222222222222222222222222222222222222222222222222222222222220580", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "minimal body", + "hex": "a60073646174656b6579732d6163636573732d6b6579010102503333333333333333333333333333333303504444444444444444444444444444444404667832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ok" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "verification_metadata and both extension arrays", + "hex": "a90073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a100582066666666666666666666666666666666666666666666666666666666666666660781a2006d6f72672e6578616d706c652e6101010881a3006d6f72672e6578616d706c652e620101024178", + "result": "ok" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "unknown key 9", + "hex": "a70073646174656b6579732d6163636573732d6b65790101025033333333333333333333333333333333035044444444444444444444444444444444046678323535313905582055555555555555555555555555555555555555555555555555555555555555550900", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "missing key 5, access_material", + "hex": "a50073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "missing key 3, capsule_id", + "hex": "a50073646174656b6579732d6163636573732d6b6579010102503333333333333333333333333333333304667832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "access_type as a byte string", + "hex": "a60073646174656b6579732d6163636573732d6b6579010102503333333333333333333333333333333303504444444444444444444444444444444404467832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "credential_id of 15 bytes", + "hex": "a60073646174656b6579732d6163636573732d6b65790101024f33333333333333333333333333333303504444444444444444444444444444444404667832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "capsule_id of 17 bytes", + "hex": "a60073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330351444444444444444444444444444444444404667832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "null access_material", + "hex": "a60073646174656b6579732d6163636573732d6b65790101025033333333333333333333333333333333035044444444444444444444444444444444046678323535313905f6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "access_type x448", + "hex": "a60073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440464783434380558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_ACCESS_INVALID" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "access_material of 31 bytes", + "hex": "a60073646174656b6579732d6163636573732d6b65790101025033333333333333333333333333333333035044444444444444444444444444444444046678323535313905581f55555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_ACCESS_INVALID" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "access_material of 33 bytes", + "hex": "a60073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055821555555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_ACCESS_INVALID" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "schema version 2", + "hex": "a60073646174656b6579732d6163636573732d6b6579010202503333333333333333333333333333333303504444444444444444444444444444444404667832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_UNSUPPORTED_VERSION" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "type tag of CONTROL_CBOR", + "hex": "a60070646174656b6579732d636f6e74726f6c010102503333333333333333333333333333333303504444444444444444444444444444444404667832353531390558205555555555555555555555555555555555555555555555555555555555555555", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "dkk_body", + "schema": "dkk_body", + "name": "empty critical_extensions", + "hex": "a70073646174656b6579732d6163636573732d6b65790101025033333333333333333333333333333333035044444444444444444444444444444444046678323535313905582055555555555555555555555555555555555555555555555555555555555555550780", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "capsule_digest", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a10058206666666666666666666666666666666666666666666666666666666666666666", + "result": "ok" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "empty map", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a0", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "unknown key 1 instead of key 0", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a10158206666666666666666666666666666666666666666666666666666666666666666", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "unknown key 1 after capsule_digest", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a200582066666666666666666666666666666666666666666666666666666666666666660100", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "capsule_digest of 31 bytes", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a100581f66666666666666666666666666666666666666666666666666666666666666", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "capsule_digest of 33 bytes", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a1005821666666666666666666666666666666666666666666666666666666666666666666", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "capsule_digest as a text string", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a10078206666666666666666666666666666666666666666666666666666666666666666", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "null capsule_digest", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506a100f6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "verification_metadata as an array", + "hex": "a70073646174656b6579732d6163636573732d6b6579010102503333333333333333333333333333333303504444444444444444444444444444444404667832353531390558205555555555555555555555555555555555555555555555555555555555555555068158206666666666666666666666666666666666666666666666666666666666666666", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "verification_metadata", + "schema": "dkk_body", + "name": "null verification_metadata", + "hex": "a70073646174656b6579732d6163636573732d6b657901010250333333333333333333333333333333330350444444444444444444444444444444440466783235353139055820555555555555555555555555555555555555555555555555555555555555555506f6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "one extension without data", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2006d6f72672e6578616d706c652e610101", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data of one byte", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e610101024100", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data that is not CBOR", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e6101010242fffe", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data 40, an empty byte string", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e6101010240", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data 5801xx, a length not in its shortest form", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e6101010258012a", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data as a text string", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e610101026c7075626c6963206c6162656c", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "null data", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e61010102f6", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data as an unsigned integer", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e6101010207", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data as a map", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e61010102a10007", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data as an array", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e61010102814100", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data as a tagged byte string", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e61010102c14100", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "data as an indefinite-length byte string", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e610101025f4100ff", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "64 extensions", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400069840a2006f6f72672e6578616d706c652e3030300101a2006f6f72672e6578616d706c652e3030310101a2006f6f72672e6578616d706c652e3030320101a2006f6f72672e6578616d706c652e3030330101a2006f6f72672e6578616d706c652e3030340101a2006f6f72672e6578616d706c652e3030350101a2006f6f72672e6578616d706c652e3030360101a2006f6f72672e6578616d706c652e3030370101a2006f6f72672e6578616d706c652e3030380101a2006f6f72672e6578616d706c652e3030390101a2006f6f72672e6578616d706c652e3031300101a2006f6f72672e6578616d706c652e3031310101a2006f6f72672e6578616d706c652e3031320101a2006f6f72672e6578616d706c652e3031330101a2006f6f72672e6578616d706c652e3031340101a2006f6f72672e6578616d706c652e3031350101a2006f6f72672e6578616d706c652e3031360101a2006f6f72672e6578616d706c652e3031370101a2006f6f72672e6578616d706c652e3031380101a2006f6f72672e6578616d706c652e3031390101a2006f6f72672e6578616d706c652e3032300101a2006f6f72672e6578616d706c652e3032310101a2006f6f72672e6578616d706c652e3032320101a2006f6f72672e6578616d706c652e3032330101a2006f6f72672e6578616d706c652e3032340101a2006f6f72672e6578616d706c652e3032350101a2006f6f72672e6578616d706c652e3032360101a2006f6f72672e6578616d706c652e3032370101a2006f6f72672e6578616d706c652e3032380101a2006f6f72672e6578616d706c652e3032390101a2006f6f72672e6578616d706c652e3033300101a2006f6f72672e6578616d706c652e3033310101a2006f6f72672e6578616d706c652e3033320101a2006f6f72672e6578616d706c652e3033330101a2006f6f72672e6578616d706c652e3033340101a2006f6f72672e6578616d706c652e3033350101a2006f6f72672e6578616d706c652e3033360101a2006f6f72672e6578616d706c652e3033370101a2006f6f72672e6578616d706c652e3033380101a2006f6f72672e6578616d706c652e3033390101a2006f6f72672e6578616d706c652e3034300101a2006f6f72672e6578616d706c652e3034310101a2006f6f72672e6578616d706c652e3034320101a2006f6f72672e6578616d706c652e3034330101a2006f6f72672e6578616d706c652e3034340101a2006f6f72672e6578616d706c652e3034350101a2006f6f72672e6578616d706c652e3034360101a2006f6f72672e6578616d706c652e3034370101a2006f6f72672e6578616d706c652e3034380101a2006f6f72672e6578616d706c652e3034390101a2006f6f72672e6578616d706c652e3035300101a2006f6f72672e6578616d706c652e3035310101a2006f6f72672e6578616d706c652e3035320101a2006f6f72672e6578616d706c652e3035330101a2006f6f72672e6578616d706c652e3035340101a2006f6f72672e6578616d706c652e3035350101a2006f6f72672e6578616d706c652e3035360101a2006f6f72672e6578616d706c652e3035370101a2006f6f72672e6578616d706c652e3035380101a2006f6f72672e6578616d706c652e3035390101a2006f6f72672e6578616d706c652e3036300101a2006f6f72672e6578616d706c652e3036310101a2006f6f72672e6578616d706c652e3036320101a2006f6f72672e6578616d706c652e3036330101", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "65 extensions", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400069841a2006f6f72672e6578616d706c652e3030300101a2006f6f72672e6578616d706c652e3030310101a2006f6f72672e6578616d706c652e3030320101a2006f6f72672e6578616d706c652e3030330101a2006f6f72672e6578616d706c652e3030340101a2006f6f72672e6578616d706c652e3030350101a2006f6f72672e6578616d706c652e3030360101a2006f6f72672e6578616d706c652e3030370101a2006f6f72672e6578616d706c652e3030380101a2006f6f72672e6578616d706c652e3030390101a2006f6f72672e6578616d706c652e3031300101a2006f6f72672e6578616d706c652e3031310101a2006f6f72672e6578616d706c652e3031320101a2006f6f72672e6578616d706c652e3031330101a2006f6f72672e6578616d706c652e3031340101a2006f6f72672e6578616d706c652e3031350101a2006f6f72672e6578616d706c652e3031360101a2006f6f72672e6578616d706c652e3031370101a2006f6f72672e6578616d706c652e3031380101a2006f6f72672e6578616d706c652e3031390101a2006f6f72672e6578616d706c652e3032300101a2006f6f72672e6578616d706c652e3032310101a2006f6f72672e6578616d706c652e3032320101a2006f6f72672e6578616d706c652e3032330101a2006f6f72672e6578616d706c652e3032340101a2006f6f72672e6578616d706c652e3032350101a2006f6f72672e6578616d706c652e3032360101a2006f6f72672e6578616d706c652e3032370101a2006f6f72672e6578616d706c652e3032380101a2006f6f72672e6578616d706c652e3032390101a2006f6f72672e6578616d706c652e3033300101a2006f6f72672e6578616d706c652e3033310101a2006f6f72672e6578616d706c652e3033320101a2006f6f72672e6578616d706c652e3033330101a2006f6f72672e6578616d706c652e3033340101a2006f6f72672e6578616d706c652e3033350101a2006f6f72672e6578616d706c652e3033360101a2006f6f72672e6578616d706c652e3033370101a2006f6f72672e6578616d706c652e3033380101a2006f6f72672e6578616d706c652e3033390101a2006f6f72672e6578616d706c652e3034300101a2006f6f72672e6578616d706c652e3034310101a2006f6f72672e6578616d706c652e3034320101a2006f6f72672e6578616d706c652e3034330101a2006f6f72672e6578616d706c652e3034340101a2006f6f72672e6578616d706c652e3034350101a2006f6f72672e6578616d706c652e3034360101a2006f6f72672e6578616d706c652e3034370101a2006f6f72672e6578616d706c652e3034380101a2006f6f72672e6578616d706c652e3034390101a2006f6f72672e6578616d706c652e3035300101a2006f6f72672e6578616d706c652e3035310101a2006f6f72672e6578616d706c652e3035320101a2006f6f72672e6578616d706c652e3035330101a2006f6f72672e6578616d706c652e3035340101a2006f6f72672e6578616d706c652e3035350101a2006f6f72672e6578616d706c652e3035360101a2006f6f72672e6578616d706c652e3035370101a2006f6f72672e6578616d706c652e3035380101a2006f6f72672e6578616d706c652e3035390101a2006f6f72672e6578616d706c652e3036300101a2006f6f72672e6578616d706c652e3036310101a2006f6f72672e6578616d706c652e3036320101a2006f6f72672e6578616d706c652e3036330101a2006f6f72672e6578616d706c652e3036340101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "empty array", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000680", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_id starting with a BOM", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a20070efbbbf6f72672e6578616d706c652e610101", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "U+FF61 before U+10000: UTF-8 byte order", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000682a20063efbda10101a20064f09080800101", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "U+10000 before U+FF61: UTF-16 order, not UTF-8 byte order", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000682a20064f09080800101a20063efbda10101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extensions out of order", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000682a2006d6f72672e6578616d706c652e620101a2006d6f72672e6578616d706c652e610101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_id repeated", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000682a2006d6f72672e6578616d706c652e610101a2006d6f72672e6578616d706c652e610102", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_version 2^32-1", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2006d6f72672e6578616d706c652e61011affffffff", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_version 2^32", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2006d6f72672e6578616d706c652e61011b0000000100000000", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_version 2^53", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2006d6f72672e6578616d706c652e61011b0020000000000000", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_version 0", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2006d6f72672e6578616d706c652e610100", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "unknown key 3", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e610101034100", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "missing key 1, extension_version", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a1006d6f72672e6578616d706c652e61", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "missing key 0, extension_id", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a10101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "keys 0 and 1 out of order", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a20101006d6f72672e6578616d706c652e61", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_id as a byte string", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2004d6f72672e6578616d706c652e610101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "empty extension_id", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a200600101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_id of 256 bytes, the implementation limit", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a200790100616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610101", + "result": "ok" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_id of 257 bytes, above the implementation limit", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a20079010161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension_id that is not valid UTF-8", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a2006d6f72672e6578616d706c652eff0101", + "result": "ERR_NON_CANONICAL_CBOR" + }, + { + "block": "extension", + "schema": "public_header", + "name": "extension that is not a map", + "hex": "a6006a646174656b657963617001010250000102030405060708090a0b0c0d0e0f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400068101", + "result": "ERR_NON_CANONICAL_CBOR" + } + ] +} diff --git a/testdata/vectors/dk1.json b/testdata/vectors/dk1.json index fc1fe9b..066c375 100644 --- a/testdata/vectors/dk1.json +++ b/testdata/vectors/dk1.json @@ -148,6 +148,21 @@ "name": "uppercase prefix", "input": "DK1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6NjY4ODQyMTJ9", "error": "ERR_DATEKEY_INVALID" + }, + { + "name": "line feed inside the Base64", + "input": "dk1_eyJ2ZXJz\naW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6NjY4ODQyMTJ9", + "error": "ERR_DATEKEY_INVALID" + }, + { + "name": "carriage return and line feed after the Base64", + "input": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6NjY4ODQyMTJ9\r\n", + "error": "ERR_DATEKEY_INVALID" + }, + { + "name": "version 1.0000000000000001: its exact value, not a double", + "input": "dk1_eyJ2ZXJzaW9uIjoxLjAwMDAwMDAwMDAwMDAwMDEsIm5ldHdvcmsiOiJkYXRla2V5czpxdWlja25ldDp2MSIsInJvdW5kIjo2Njg4NDIxMn0", + "error": "ERR_DATEKEY_INVALID" } ] } diff --git a/testdata/vectors/inspect_differential.json b/testdata/vectors/inspect_differential.json new file mode 100644 index 0000000..02d4413 --- /dev/null +++ b/testdata/vectors/inspect_differential.json @@ -0,0 +1,1855 @@ +{ + "spec": "0.8.2", + "description": "Differential corpus of the pre-unlock checks (spec §63 steps 1 to 8): deterministic mutations of the official .dkc fixtures with the verdict of the reference implementation. See testdata/README.md.", + "format": "Each mutation is bases[base].file (in testdata/fixtures) with its edits applied. An edit is [at, delete, insert]: the delete bytes at offset at of the base are replaced by the bytes of the hex string insert. The edits of one mutation refer to offsets of the unmodified base, are sorted by offset and do not overlap. result is the verdict of steps 1 to 8 of spec §63 (capsule.Inspect, the Quicknet profile pinned, no extension known, no network, no secret): ok, or the normative error code, with step the step that failed. kind names the generator of the mutation and is informative.", + "seed": 20260925, + "bases": [ + { + "file": "time_only.dkc", + "sha256": "99e915810d595f1092700b728f5e5081d78efe83f5343e76325b1bcc2c33ccf2" + }, + { + "file": "time_only_extensions.dkc", + "sha256": "0446c9b73e267adcb24e5cc89afba2544a386ec9a050016e06517a4a57aa2085" + }, + { + "file": "time_and_key_portable.dkc", + "sha256": "2e97878078bae6358037a9c264f379a3cbe839f767d69836b0343f35657b2972" + }, + { + "file": "time_and_key_recipients.dkc", + "sha256": "69ac110380f5d768b5b6afaa157a50ed17d8ceccfbd4604ffa5b6da38539b635" + }, + { + "file": "empty_payload.dkc", + "sha256": "871e9bf05b52bbae17f3adfbbf97b46e7f0e53aa8f57bcaa506e43f36f53a9d4" + } + ], + "mutations": [ + {"base":0,"kind":"flip","edits":[[725,1,"4d"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[615,1,"48"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[121,1,"b3"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[76,1,"da"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[13774,1,"a3"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[591,1,"78"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[608,1,"18"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[144,1,"73"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[51,1,"13"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[96,1,"6d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[53,1,"2b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[624,1,"29"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[528,1,"c5"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[0,1,"04"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"flip","edits":[[34178,1,"cb"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[263,1,"64"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[651,1,"55"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[454,1,"ea"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[58,1,"4e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[84,1,"41"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[567,1,"d7"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[46,1,"f0"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[73,1,"42"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[258,1,"61"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[89,1,"67"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[19,1,"e4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[712,1,"6e"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[393,1,"5c"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[697,1,"3b"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[736,1,"4a"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[303,1,"41"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[11,1,"71"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[2,1,"53"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"flip","edits":[[719,1,"29"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[60,1,"5b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[464,1,"ee"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[300,1,"ec"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[0,1,"46"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"flip","edits":[[49,1,"0b"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[31,1,"06"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[603,1,"b1"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[32934,1,"4f"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[117,1,"42"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[413,1,"6d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[263,1,"54"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[648,1,"48"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[93,1,"53"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"flip","edits":[[699,1,"47"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[15,1,"ae"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[254,1,"71"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[196,1,"60"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":0,"kind":"flip","edits":[[251,1,"2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[138,1,"65"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"flip","edits":[[525,1,"8c"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[750,1,"0b"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"flip","edits":[[61166,1,"3b"]],"result":"ok"}, + {"base":0,"kind":"flip","edits":[[24,1,"61"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[12,1,"04"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"flip","edits":[[57,1,"f9"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"flip","edits":[[50,1,"68"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[657,1,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"byte","edits":[[56003,1,"00"]],"result":"ok"}, + {"base":0,"kind":"byte","edits":[[412,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"byte","edits":[[9,1,"80"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"byte","edits":[[696,1,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"byte","edits":[[621,1,"a0"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"byte","edits":[[61,1,"40"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"byte","edits":[[515,1,"7f"]],"result":"ok"}, + {"base":0,"kind":"byte","edits":[[115,1,"00"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"byte","edits":[[78,1,"ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[694,1,"f6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"byte","edits":[[671,1,"80"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"byte","edits":[[1,1,"7f"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"byte","edits":[[26,1,"2d"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[718,1,"80"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"byte","edits":[[59671,1,"80"]],"result":"ok"}, + {"base":0,"kind":"byte","edits":[[8,1,"40"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"byte","edits":[[376,1,"1a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"byte","edits":[[12,1,"18"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"byte","edits":[[18,1,"a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[64,1,"2d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"byte","edits":[[452,1,"80"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"byte","edits":[[239,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"byte","edits":[[101,1,"20"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"byte","edits":[[112,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[121,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[63,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"byte","edits":[[105,1,"0a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"byte","edits":[[384,1,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"byte","edits":[[614,1,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"truncate","edits":[[782,78017,""]],"result":"ok"}, + {"base":0,"kind":"truncate","edits":[[517,78282,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[324,78475,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[469,78330,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[10,78789,""]],"result":"ERR_INTEGRITY","step":1}, + {"base":0,"kind":"truncate","edits":[[28,78771,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":0,"kind":"truncate","edits":[[307,78492,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[387,78412,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[350,78449,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[180,78619,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[631,78168,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"truncate","edits":[[11,78788,""]],"result":"ERR_INTEGRITY","step":1}, + {"base":0,"kind":"truncate","edits":[[732,78067,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"truncate","edits":[[696,78103,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"truncate","edits":[[410,78389,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[275,78524,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[274,78525,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[385,78414,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[507,78292,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[299,78500,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[373,78426,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[394,78405,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[287,78512,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[262,78537,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"truncate","edits":[[86,78713,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":0,"kind":"insert","edits":[[272,0,"9235cf58"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[28,0,"70ae"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[114,0,"05c4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[2,0,"99881975"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"insert","edits":[[287,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[171,0,"a4"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[708,0,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"insert","edits":[[97,0,"b56a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[10,0,"31"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"insert","edits":[[120,0,"0c21e7"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[718,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"insert","edits":[[173,0,"5c29cb"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[126,0,"5a45b7"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[697,0,"f6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"insert","edits":[[76,0,"c5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[20,0,"db1e91"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[703,0,"d1"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"insert","edits":[[648,0,"20"]],"result":"ok"}, + {"base":0,"kind":"insert","edits":[[324,0,"b6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[6,0,"eb1c8f41"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":0,"kind":"insert","edits":[[72995,0,"af"]],"result":"ok"}, + {"base":0,"kind":"insert","edits":[[8885,0,"0d"]],"result":"ok"}, + {"base":0,"kind":"insert","edits":[[57,0,"5e37bd"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[247,0,"ff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[12,0,"7c690c"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"insert","edits":[[730,0,"e9f9d6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"insert","edits":[[10,0,"0d"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"insert","edits":[[20,0,"ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"insert","edits":[[202,0,"ea85"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"insert","edits":[[9,0,"856db5bc"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"delete","edits":[[322,3,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[165,4,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":0,"kind":"delete","edits":[[118,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[603,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"delete","edits":[[2,1,""]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"delete","edits":[[621,1,""]],"result":"ok"}, + {"base":0,"kind":"delete","edits":[[718,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"delete","edits":[[450,3,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[262,3,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[243,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[26,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[697,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"delete","edits":[[27,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[714,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"delete","edits":[[65,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[46,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[442,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[682,4,""]],"result":"ok"}, + {"base":0,"kind":"delete","edits":[[17,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[23,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"delete","edits":[[736,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"delete","edits":[[252,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[3,3,""]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":0,"kind":"delete","edits":[[684,4,""]],"result":"ok"}, + {"base":0,"kind":"delete","edits":[[287,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[655,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"delete","edits":[[75881,2,""]],"result":"ok"}, + {"base":0,"kind":"delete","edits":[[382,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[308,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"delete","edits":[[356,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"length","edits":[[10,6,"01be00000079"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[15,1,"bf"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"length","edits":[[9,3,"100001"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[9,7,"01007900000181"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[12,4,"04000001"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[9,3,"100000"]],"result":"ERR_INTEGRITY","step":3}, + {"base":0,"kind":"length","edits":[[11,5,"92000001d9"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[15,1,"84"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"length","edits":[[12,4,"3bb86b8d"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[8,1,"04"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[12,4,"04000000"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"length","edits":[[10,6,"010000000010"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[8,8,"04000000000001bd"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[11,5,"7a00100001"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[15,1,"91"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"length","edits":[[15,1,"b3"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"length","edits":[[14,2,"0001"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"length","edits":[[11,5,"7a0000018e"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[10,2,"ffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[15,1,"bd"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"length","edits":[[8,8,"5b511f85000001bd"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[12,1,"10"]],"result":"ERR_INTEGRITY","step":2}, + {"base":0,"kind":"length","edits":[[11,5,"7a000001f8"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"length","edits":[[15,1,"b5"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"length","edits":[[15,1,"00"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"header","edits":[[16,121,"bf006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[17,14,"0101006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[32,17,"5820dab413cbb44eaf8f7d6b8ca531dedfe955929399ca26558207716110bd2fdce0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040007f5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"67"],[16,33,"a4006a646174656b65796361700101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040005a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"81"],[30,1,"1b0000000100000000"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"81"],[30,1,"1b001fffffffffffff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"f2"],[137,0,"a5006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"81"],[136,0,"1b00000001000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"81"],[30,1,"1bffffffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000701"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"6f"],[18,11,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[137,0,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"78"],[32,17,"4f416e2c6f0c746fe011e7bd309c9433"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"81"],[136,0,"1b00200000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[10,2,"0590"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400059841a2006f6f72672e6578616d706c652e3030300101a2006f6f72672e6578616d706c652e3030310101a2006f6f72672e6578616d706c652e3030320101a2006f6f72672e6578616d706c652e3030330101a2006f6f72672e6578616d706c652e3030340101a2006f6f72672e6578616d706c652e3030350101a2006f6f72672e6578616d706c652e3030360101a2006f6f72672e6578616d706c652e3030370101a2006f6f72672e6578616d706c652e3030380101a2006f6f72672e6578616d706c652e3030390101a2006f6f72672e6578616d706c652e3031300101a2006f6f72672e6578616d706c652e3031310101a2006f6f72672e6578616d706c652e3031320101a2006f6f72672e6578616d706c652e3031330101a2006f6f72672e6578616d706c652e3031340101a2006f6f72672e6578616d706c652e3031350101a2006f6f72672e6578616d706c652e3031360101a2006f6f72672e6578616d706c652e3031370101a2006f6f72672e6578616d706c652e3031380101a2006f6f72672e6578616d706c652e3031390101a2006f6f72672e6578616d706c652e3032300101a2006f6f72672e6578616d706c652e3032310101a2006f6f72672e6578616d706c652e3032320101a2006f6f72672e6578616d706c652e3032330101a2006f6f72672e6578616d706c652e3032340101a2006f6f72672e6578616d706c652e3032350101a2006f6f72672e6578616d706c652e3032360101a2006f6f72672e6578616d706c652e3032370101a2006f6f72672e6578616d706c652e3032380101a2006f6f72672e6578616d706c652e3032390101a2006f6f72672e6578616d706c652e3033300101a2006f6f72672e6578616d706c652e3033310101a2006f6f72672e6578616d706c652e3033320101a2006f6f72672e6578616d706c652e3033330101a2006f6f72672e6578616d706c652e3033340101a2006f6f72672e6578616d706c652e3033350101a2006f6f72672e6578616d706c652e3033360101a2006f6f72672e6578616d706c652e3033370101a2006f6f72672e6578616d706c652e3033380101a2006f6f72672e6578616d706c652e3033390101a2006f6f72672e6578616d706c652e3034300101a2006f6f72672e6578616d706c652e3034310101a2006f6f72672e6578616d706c652e3034320101a2006f6f72672e6578616d706c652e3034330101a2006f6f72672e6578616d706c652e3034340101a2006f6f72672e6578616d706c652e3034350101a2006f6f72672e6578616d706c652e3034360101a2006f6f72672e6578616d706c652e3034370101a2006f6f72672e6578616d706c652e3034380101a2006f6f72672e6578616d706c652e3034390101a2006f6f72672e6578616d706c652e3035300101a2006f6f72672e6578616d706c652e3035310101a2006f6f72672e6578616d706c652e3035320101a2006f6f72672e6578616d706c652e3035330101a2006f6f72672e6578616d706c652e3035340101a2006f6f72672e6578616d706c652e3035350101a2006f6f72672e6578616d706c652e3035360101a2006f6f72672e6578616d706c652e3035370101a2006f6f72672e6578616d706c652e3035380101a2006f6f72672e6578616d706c652e3035390101a2006f6f72672e6578616d706c652e3036300101a2006f6f72672e6578616d706c652e3036310101a2006f6f72672e6578616d706c652e3036320101a2006f6f72672e6578616d706c652e3036330101a2006f6f72672e6578616d706c652e3036340101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[30,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[136,1,"1b001fffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[16,0,"c1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"82"],[18,11,"73646174656b6579732d6163636573732d6b6579"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"27"],[50,85,"62c080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7c"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400181840"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7c"],[16,120,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000841"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7d"],[16,120,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040008f93c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[32,17,"510aa18372ace1523d2e46c907a54269012a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"a1"],[16,121,"a7006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000581a2006d6f72672e6578616d706c652e6101010681a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"23"],[16,119,"a4006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"6b"],[32,17,"5f40ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7d"],[16,120,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040007f93c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[136,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[136,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7b"],[136,1,"190101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7d"],[16,120,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040019ffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936496a45774d4441696651"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"header","edits":[[29,108,"04000250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[100,1,"2f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"header","edits":[[30,1,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"77"],[16,121,"a4006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[16,1,"b805"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[136,1,"1801"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7c"],[16,120,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004001818"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d57557a6651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[136,1,"1818"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[16,0,"81"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"8b"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a1006d6f72672e6578616d706c652e61"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[32,17,"51cc04158b7fd1286382290eb72fe97ff0d9"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"8f"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d6f72672e6578616d706c652e6101010207"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[18,11,"6b646174656b657963617078"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[30,1,"1b001fffffffffffff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[32,17,"5176f186c0e42d841b7497a6da7dd994ef19"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[16,119,"a4006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[16,121,"a4006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"77"],[16,15,"a4006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"6d"],[16,13,"a4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7d"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040019fffff6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[136,1,"03"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[16,0,"81"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[51,84,"54646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48303d"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040005f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[133,1,"58"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"header","edits":[[16,13,"a4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a20070efbbbf6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"69"],[32,17,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[52,2,"444b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"header","edits":[[136,1,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"25"],[50,85,"f5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7d"],[136,0,"1a000100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"91"],[16,120,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000581a3006d6f72672e6578616d706c652e61010102c141"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"29"],[50,85,"64646b315f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[16,121,"bf006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[32,1,"5810"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"7a"],[136,0,"c1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[32,17,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[136,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"8c"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000582a20064f09080800101a20063efbda10101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"8a"],[32,17,"58201b4346c9444b3d9407acd382e36fa9ed1ab6a55be839ee134a04dd0075b50954"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":0,"kind":"header","edits":[[11,1,"8c"],[16,121,"a6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000682a20063efbda10101a20064f09080800101"]],"result":"ok"}, + {"base":0,"kind":"header","edits":[[30,1,"00"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f546b356651"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"datekey","edits":[[11,1,"71"],[51,64,"4b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a484a68626d513663585670593274755a5851"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5334776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"89"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d58"]],"result":"ERR_DATEKEY_INVALID","step":7}, + {"base":0,"kind":"datekey","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d4441776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":0,"kind":"datekey","edits":[[77,1,"30"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"75"],[51,83,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d58"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"datekey","edits":[[77,1,"7a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"019d"],[50,85,"790176646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"5d"],[51,84,"37646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"75"],[51,84,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[127,1,"2b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"49"],[51,84,"23646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[114,1,"49"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":0,"kind":"datekey","edits":[[77,1,"41"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[122,1,"2e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"0182"],[50,85,"79015b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"018d"],[50,85,"790166646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"018f"],[50,85,"790168646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"82"],[51,84,"5c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f444d354d444d784e6a55344d544a39"]],"result":"ERR_DATEKEY_INVALID","step":7}, + {"base":0,"kind":"datekey","edits":[[84,1,"2b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"0143"],[50,85,"79011c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[11,1,"89"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d6e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"015c"],[50,85,"790135646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"datekey","edits":[[10,2,"016f"],[50,85,"790148646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":0,"kind":"age","edits":[[701,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[411,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[614,44,""]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[704,0,"3e20736372797074206332467364484e686248527a595778306332467364412031380a434343434343434343434343434343434343434343434343434343434343434343434343434343434343430a2d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[657,1,""]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[704,0,"3e2058323535313920414141414141414141414141414141414141414141414141414141414141414141414141414141414141410a424242424242424242424242424242424242424242424242424242424242424242424242424242424242420a2d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[15,1,"c4"],[237,0,"206578747261"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[237,0,"41"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"c3"],[237,0,"2031303030"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[14,2,"02bb"],[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a67492b4f36746b50507576754c6d3456314a4369713563794644554e463532634b662f49424f59532b50335557385053725068564c437337746d5a7634776c490a4564706c48647773384a5268715645484a686d65474f67583369712f445051684b574366584b564773396441437a654c69657352534c74796467582f6f416b380a62435948626e705136755561775854674a5342647748507232587a4e56733234454758492b3676375543770a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":0,"kind":"age","edits":[[606,98,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[658,0,"206578747261"]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[172,0,"61"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[459,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[703,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[14,2,"00c1"],[160,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[750,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[411,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[750,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[616,42,"5652322b35424156494a50454949595739365646545731474e5a545733444257495047555139414d4557"]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[15,1,"bd"],[366,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[658,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[608,1,"78"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[368,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[14,2,"024f"],[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[238,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"ce"],[169,3,"38343436373434303733373039353531363136"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"c3"],[237,0,"2041414141"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[162,5,"544c4f434b"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[167,0,"32"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"7d"],[172,65,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[302,0,"41"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[628,1,"61"]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[15,1,"a9"],[137,21,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[177,1,"2b"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[168,0,"30"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[608,6,"746c6f636b32"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[367,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[659,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[702,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[370,1,"2f"]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[303,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a67492b4f36746b50507576754c6d3456314a4369713563794644554e463532634b662f49424f59532b50335557385053725068564c437337746d5a7634776c490a4564706c48647773384a5268715645484a686d65474f67583369712f445051684b574366584b564773396441437a654c69657352534c74796467582f6f416b380a62435948626e705136755561775854674a5342647748507232587a4e56733234454758492b3676375543770a2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[157,1,"32"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"bc"],[168,4,"2d31"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[608,6,"736372797074"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[172,0,"30"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":0,"kind":"age","edits":[[15,1,"92"],[415,44,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[725,1,"42"]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[697,1,"2f"]],"result":"ok"}, + {"base":0,"kind":"age","edits":[[604,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[237,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"bd"],[414,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"cf"],[413,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":0,"kind":"age","edits":[[15,1,"bf"],[158,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[583,21,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[156,1,"56"]],"result":"ERR_INTEGRITY","step":5}, + {"base":0,"kind":"age","edits":[[604,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":0,"kind":"age","edits":[[704,0,"3e20583235353139204c7652322b35626176694a50654969797739365666545731476e7a547733446257495047757139616d45770a67657530345736505249677754745463753167413166724a764d73532b50647750554c4d4f6239764f64510a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":0,"kind":"age","edits":[[706,44,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[3,1,"39"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"flip","edits":[[105,1,"3a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[2,1,"c3"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"flip","edits":[[59,1,"3a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[776,1,"08"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[3,1,"35"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"flip","edits":[[231,1,"39"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":1,"kind":"flip","edits":[[785,1,"77"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[15,1,"a2"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[389,1,"78"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[437,1,"17"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[77,1,"18"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[9,1,"01"]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"flip","edits":[[36,1,"1c"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[430,1,"b2"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[128,1,"0d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[219,1,"70"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":1,"kind":"flip","edits":[[24,1,"75"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"flip","edits":[[448,1,"40"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[534,1,"40"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[268,1,"23"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":1,"kind":"flip","edits":[[845,1,"9a"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[108,1,"1a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[142,1,"4f"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[347,1,"79"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[143,1,"73"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[799,1,"63"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[50,1,"79"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"flip","edits":[[833,1,"fe"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[289,1,"37"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[28,1,"72"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"flip","edits":[[660,1,"ad"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[9,1,"08"]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"flip","edits":[[887,1,"49"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[543,1,"23"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[591,1,"2c"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[466,1,"6b"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[806,1,"6b"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[358,1,"74"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[160,1,"05"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[671,1,"0e"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[159,1,"11"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"flip","edits":[[297,1,"6f"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[199,1,"00"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[129,1,"62"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[733,1,"72"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[491,1,"14"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[673,1,"52"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[111,1,"32"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":1,"kind":"flip","edits":[[260,1,"3a"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":1,"kind":"flip","edits":[[13,1,"40"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[75,1,"71"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[73,1,"4b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[0,1,"04"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"flip","edits":[[485,1,"06"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"flip","edits":[[678,1,"0b"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"flip","edits":[[81,1,"73"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[128,1,"49"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"flip","edits":[[152,1,"75"]],"result":"ok"}, + {"base":1,"kind":"flip","edits":[[285,1,"c3"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[542,1,"7f"]],"result":"ok"}, + {"base":1,"kind":"byte","edits":[[416,1,"a0"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[285,1,"60"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[2,1,"a0"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"byte","edits":[[6,1,"7f"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":1,"kind":"byte","edits":[[42,1,"80"]],"result":"ok"}, + {"base":1,"kind":"byte","edits":[[695,1,"7f"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"byte","edits":[[839,1,"7e"]],"result":"ok"}, + {"base":1,"kind":"byte","edits":[[436,1,"a0"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[701,1,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"byte","edits":[[4,1,"a7"]],"result":"ERR_UNSUPPORTED_VERSION","step":2}, + {"base":1,"kind":"byte","edits":[[5,1,"4a"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":1,"kind":"byte","edits":[[465,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[474,1,"1b"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[47,1,"80"]],"result":"ok"}, + {"base":1,"kind":"byte","edits":[[373,1,"2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[438,1,"2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[360,1,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[241,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[316,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[777,1,"18"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"byte","edits":[[27,1,"1b"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"byte","edits":[[181,1,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[86,1,"60"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"byte","edits":[[693,1,"40"]],"result":"ok"}, + {"base":1,"kind":"byte","edits":[[10,1,"7f"]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"byte","edits":[[381,1,"bd"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"byte","edits":[[721,1,"2d"]],"result":"ok"}, + {"base":1,"kind":"byte","edits":[[1,1,"80"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"byte","edits":[[0,1,"60"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"truncate","edits":[[719,172,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"truncate","edits":[[118,773,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"truncate","edits":[[685,206,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"truncate","edits":[[204,687,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[103,788,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"truncate","edits":[[57,834,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"truncate","edits":[[555,336,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[197,694,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[415,476,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[814,77,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"truncate","edits":[[662,229,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"truncate","edits":[[433,458,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[818,73,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"truncate","edits":[[222,669,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[196,695,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[444,447,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[510,381,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[666,225,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"truncate","edits":[[205,686,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[331,560,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[32,859,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"truncate","edits":[[256,635,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[583,308,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[450,441,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"truncate","edits":[[582,309,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"insert","edits":[[763,0,"16d2e0"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"insert","edits":[[832,0,"3d"]],"result":"ok"}, + {"base":1,"kind":"insert","edits":[[3,0,"d6"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"insert","edits":[[23,0,"b1804d4e"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[66,0,"3d6dd46e"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[0,0,"20"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"insert","edits":[[843,0,"83347d"]],"result":"ok"}, + {"base":1,"kind":"insert","edits":[[579,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"insert","edits":[[250,0,"fc"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"insert","edits":[[855,0,"b1"]],"result":"ok"}, + {"base":1,"kind":"insert","edits":[[115,0,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[114,0,"6d9d6a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[12,0,"c5bde5"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"insert","edits":[[5,0,"3086"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":1,"kind":"insert","edits":[[91,0,"b339"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[10,0,"f6"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"insert","edits":[[5,0,"17"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":1,"kind":"insert","edits":[[7,0,"e686"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":1,"kind":"insert","edits":[[433,0,"6f997c2a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"insert","edits":[[53,0,"3eb33330"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[814,0,"b70f28"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"insert","edits":[[51,0,"958d97"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[741,0,"05b9"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"insert","edits":[[794,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"insert","edits":[[1,0,"f9"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":1,"kind":"insert","edits":[[356,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"insert","edits":[[314,0,"68"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"insert","edits":[[460,0,"ed"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"insert","edits":[[46,0,"e4ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"insert","edits":[[81,0,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[17,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[762,4,""]],"result":"ok"}, + {"base":1,"kind":"delete","edits":[[95,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[13,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[97,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[723,1,""]],"result":"ok"}, + {"base":1,"kind":"delete","edits":[[381,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"delete","edits":[[686,4,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":1,"kind":"delete","edits":[[801,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"delete","edits":[[757,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"delete","edits":[[473,3,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"delete","edits":[[117,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[64,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[658,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"delete","edits":[[48,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[41,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[9,3,""]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"delete","edits":[[273,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"delete","edits":[[782,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"delete","edits":[[51,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[512,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"delete","edits":[[72,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[59,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[471,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"delete","edits":[[704,2,""]],"result":"ok"}, + {"base":1,"kind":"delete","edits":[[153,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[691,2,""]],"result":"ok"}, + {"base":1,"kind":"delete","edits":[[12,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"delete","edits":[[346,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"delete","edits":[[351,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"length","edits":[[11,4,"a0000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[11,1,"a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[15,1,"e3"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"length","edits":[[10,6,"01e20000009f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[11,5,"ba000001e1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[12,4,"04000001"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[11,1,"90"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[11,1,"67"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[11,5,"a30000021c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[14,2,"0001"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"length","edits":[[8,4,"ffffffff"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[11,1,"10"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[15,1,"e1"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"length","edits":[[9,7,"010000e9d278ec"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[8,5,"61f780d280"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[8,4,"04000001"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[11,5,"71000001f0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[8,1,"04"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[9,7,"100000000001ca"]],"result":"ERR_INTEGRITY","step":3}, + {"base":1,"kind":"length","edits":[[11,5,"a0000001a2"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[11,1,"ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[11,5,"a1000001e3"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"length","edits":[[14,2,"0207"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"length","edits":[[8,8,"decd68bf04000000"]],"result":"ERR_INTEGRITY","step":2}, + {"base":1,"kind":"length","edits":[[11,1,"c7"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[136,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[136,1,"1818"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[32,1,"5810"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"79"],[16,159,"a5006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d48300400"]],"result":"ok"}, + {"base":1,"kind":"header","edits":[[11,1,"d7"],[18,11,"78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a7"],[136,1,"1b001fffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a7"],[30,1,"1bffffffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[136,0,"1901"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"90"],[32,17,"4196"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[19,10,"444154454b4559434150"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a7"],[30,1,"1b0020000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[32,17,"5192a8e119bdbe0c64868bcf7add3db24422"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"b1"],[16,121,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000581a1006d6f72672e6578616d706c652e61"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"9e"],[32,17,"4f34c9b31a7d1adf3821ca199836ddf8"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"95"],[18,11,"60"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"7b"],[138,37,"a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"8f"],[141,34,"6d6f72672e6578616d706c652e6101010240"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a9"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c1b000000010000000080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"9d"],[16,15,"a5006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"8f"],[141,34,"6d6f72672e6578616d706c652e6101010300"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[18,11,"78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a7"],[30,1,"1b001fffffffffffff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":1,"kind":"header","edits":[[32,17,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a5"],[18,11,"70646174656b6579732d636f6e74726f6c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"9e"],[174,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[10,2,"013e"],[175,0,"a6006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[16,1,"b806"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"8c"],[138,37,"82a20063efbda10101a20064f09080800101"]],"result":"ok"}, + {"base":1,"kind":"header","edits":[[11,1,"a3"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c1818c100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[18,11,"6b646174656b657963617078"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a3"],[136,0,"1a000100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"96"],[18,11,"6178"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"95"],[18,11,"a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"c5"],[16,121,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[30,1,"190100"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":1,"kind":"header","edits":[[10,2,"05b6"],[16,121,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d48300400059841a2006f6f72672e6578616d706c652e3030300101a2006f6f72672e6578616d706c652e3030310101a2006f6f72672e6578616d706c652e3030320101a2006f6f72672e6578616d706c652e3030330101a2006f6f72672e6578616d706c652e3030340101a2006f6f72672e6578616d706c652e3030350101a2006f6f72672e6578616d706c652e3030360101a2006f6f72672e6578616d706c652e3030370101a2006f6f72672e6578616d706c652e3030380101a2006f6f72672e6578616d706c652e3030390101a2006f6f72672e6578616d706c652e3031300101a2006f6f72672e6578616d706c652e3031310101a2006f6f72672e6578616d706c652e3031320101a2006f6f72672e6578616d706c652e3031330101a2006f6f72672e6578616d706c652e3031340101a2006f6f72672e6578616d706c652e3031350101a2006f6f72672e6578616d706c652e3031360101a2006f6f72672e6578616d706c652e3031370101a2006f6f72672e6578616d706c652e3031380101a2006f6f72672e6578616d706c652e3031390101a2006f6f72672e6578616d706c652e3032300101a2006f6f72672e6578616d706c652e3032310101a2006f6f72672e6578616d706c652e3032320101a2006f6f72672e6578616d706c652e3032330101a2006f6f72672e6578616d706c652e3032340101a2006f6f72672e6578616d706c652e3032350101a2006f6f72672e6578616d706c652e3032360101a2006f6f72672e6578616d706c652e3032370101a2006f6f72672e6578616d706c652e3032380101a2006f6f72672e6578616d706c652e3032390101a2006f6f72672e6578616d706c652e3033300101a2006f6f72672e6578616d706c652e3033310101a2006f6f72672e6578616d706c652e3033320101a2006f6f72672e6578616d706c652e3033330101a2006f6f72672e6578616d706c652e3033340101a2006f6f72672e6578616d706c652e3033350101a2006f6f72672e6578616d706c652e3033360101a2006f6f72672e6578616d706c652e3033370101a2006f6f72672e6578616d706c652e3033380101a2006f6f72672e6578616d706c652e3033390101a2006f6f72672e6578616d706c652e3034300101a2006f6f72672e6578616d706c652e3034310101a2006f6f72672e6578616d706c652e3034320101a2006f6f72672e6578616d706c652e3034330101a2006f6f72672e6578616d706c652e3034340101a2006f6f72672e6578616d706c652e3034350101a2006f6f72672e6578616d706c652e3034360101a2006f6f72672e6578616d706c652e3034370101a2006f6f72672e6578616d706c652e3034380101a2006f6f72672e6578616d706c652e3034390101a2006f6f72672e6578616d706c652e3035300101a2006f6f72672e6578616d706c652e3035310101a2006f6f72672e6578616d706c652e3035320101a2006f6f72672e6578616d706c652e3035330101a2006f6f72672e6578616d706c652e3035340101a2006f6f72672e6578616d706c652e3035350101a2006f6f72672e6578616d706c652e3035360101a2006f6f72672e6578616d706c652e3035370101a2006f6f72672e6578616d706c652e3035380101a2006f6f72672e6578616d706c652e3035390101a2006f6f72672e6578616d706c652e3036300101a2006f6f72672e6578616d706c652e3036310101a2006f6f72672e6578616d706c652e3036320101a2006f6f72672e6578616d706c652e3036330101a2006f6f72672e6578616d706c652e3036340101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"9c"],[51,84,"50646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d365a585a74626d56304f6e597849697769636d3931626d51694f6a49774d444239"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":1,"kind":"header","edits":[[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c18fff6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[136,1,"17"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[30,1,"6131"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c0800"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[136,1,"190101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"83"],[138,37,"1b0020000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"b1"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c02504286085c21ca34d1a71e649326a4a0f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"c5"],[16,121,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000582a2006d6f72672e6578616d706c652e610101a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[136,1,"190101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"bb"],[16,120,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000581a2006d6f72672e6578616d706c652e61011b00000001000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"93"],[16,13,"a5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[30,1,"00"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"9d"],[16,121,"a5006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"c5"],[16,121,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000582a2006d6f72672e6578616d706c652e620101a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"ab"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[174,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c0400"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[16,0,"c1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[50,85,"790143646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"8f"],[32,17,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[16,0,"81"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"7b"],[138,37,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c181801"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[30,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"8d"],[16,33,"a5006a646174656b65796361700101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[136,0,"1900"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c17a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a0"],[16,159,"bf006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656cff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"9b"],[51,81,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"header","edits":[[17,118,"037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830010102504286085c21ca34d1a71e649326a4a0f6006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a1"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000581a2006d6f72672e6578616d706c652e6101010681a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[50,85,"62c080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[138,37,"82a2006d6f72672e6578616d706c652e610101a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"8f"],[141,34,"6d6f72672e6578616d706c652e6101010280"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c0740"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[136,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"49"],[16,119,"a5006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"90"],[139,36,"a20070efbbbf6f72672e6578616d706c652e610101"]],"result":"ok"}, + {"base":1,"kind":"header","edits":[[133,1,"58"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":1,"kind":"header","edits":[[32,17,"1b0020000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"a3"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c075f40ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[11,1,"f5"],[16,159,"a7006a646174656b6579636170010102504286085c21ca34d1a71e649326a4a0f6037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483004000681a300716f72672e6578616d706c652e6c6162656c0101024c7075626c6963206c6162656c037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"header","edits":[[16,15,"a5006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"datekey","edits":[[10,2,"01a2"],[50,85,"790155646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"4f"],[50,85,"64646b315f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"7d"],[51,84,"31646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"a2"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f794d4441776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"9e"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5334776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"a0"],[51,84,"54646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d48303d"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"4d"],[50,85,"62c080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"80"],[51,84,"34646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[10,2,"018f"],[50,85,"790142646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d48304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"5d"],[50,85,"72646b315f65794a325a584a7a61573975496a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[52,2,"444b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[10,2,"0181"],[50,85,"790134646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"af"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d58"]],"result":"ERR_DATEKEY_INVALID","step":7}, + {"base":1,"kind":"datekey","edits":[[86,1,"61"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[10,2,"0169"],[50,85,"79011c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[10,2,"01a6"],[50,85,"790159646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d483041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[10,2,"019c"],[50,85,"79014f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d4830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"7a"],[51,84,"2e646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c6558"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"af"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d6e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"a8"],[51,84,"5c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f444d354d444d784e6a55344d544639"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":1,"kind":"datekey","edits":[[11,1,"5a"],[50,85,"6f646b315f65794a325a584a7a615739"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"83"],[51,84,"37646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[68,1,"2d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"89"],[51,84,"3d646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a58513664"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"datekey","edits":[[11,1,"61"],[50,85,"76646b315f65794a325a584a7a61573975496a6f784c43"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[206,0,"30"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[275,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[14,2,"0273"],[451,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":1,"kind":"age","edits":[[213,59,"4442394241373045304343304636454146373830334444303734343741314635343737373335464433463636313739324241393436303043383445"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[14,2,"0244"],[451,0,"3e2058323535313920414141414141414141414141414141414141414141414141414141414141414141414141414141414141410a424242424242424242424242424242424242424242424242424242424242424242424242424242424242420a2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[680,98,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[682,1,"78"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":1,"kind":"age","edits":[[676,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e1"],[448,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[200,5,"544c4f434b"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":1,"kind":"age","edits":[[688,44,""]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[15,1,"f3"],[451,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":1,"kind":"age","edits":[[678,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[777,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e7"],[275,0,"2031303030"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[778,0,"3e20583235353139206f385441784e784b44796556785969584e33426f55536d4332566666694941646d61394c35387531337a730a7a4d30624367342f677a2f4e706d6a51553546583378766b4b37386a51376939356e6c46366b326c5371300a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":1,"kind":"age","edits":[[194,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[824,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[206,4,"31303031"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[768,1,"41"]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[780,44,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[14,2,"02df"],[451,0,"3e20746c6f636b203230303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a73554d68633132775643385464773033512b61383867743069526843646951764b533253666c664e5931775231456f715975504535584f307a576b36795866650a474944716d4b592b4343737a384e304b50646e544d746f457855496852523666695a4375447377427074372f546a3174386a535a76506555347a726a506458750a5974784832637139786757527770546b31736f767a50385a326a456f535064376365743559455850786d410a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":1,"kind":"age","edits":[[14,2,"00e5"],[198,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[732,0,"41"]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[778,0,"3e2058323535313920414141414141414141414141414141414141414141414141414141414141414141414141414141414141410a424242424242424242424242424242424242424242424242424242424242424242424242424242424242420a2d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[340,0,"41"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[732,0,"2041414141"]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[15,1,"e8"],[275,0,"206578747261"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[405,0,"41"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[194,1,"56"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[340,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[276,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e7"],[275,0,"2041414141"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[406,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[198,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[449,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e1"],[404,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[405,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[824,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[733,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[497,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[795,1,"41"]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[776,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[776,0,"41"]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[497,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[676,1,"56"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[210,0,"61"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[15,1,"b6"],[453,44,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"cd"],[175,21,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[682,6,"544c4f434b"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[210,0,"30"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[449,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[677,1,"32"]],"result":"ERR_INTEGRITY","step":6}, + {"base":1,"kind":"age","edits":[[461,1,"2b"]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[778,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":1,"kind":"age","edits":[[778,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[341,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[15,1,"e3"],[196,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":1,"kind":"age","edits":[[731,1,""]],"result":"ok"}, + {"base":1,"kind":"age","edits":[[15,1,"a1"],[210,65,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":2,"kind":"flip","edits":[[363,1,"ee"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[582,1,"04"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[971,1,"9d"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[15,1,"87"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"flip","edits":[[400,1,"46"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[828,1,"26"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[15,1,"06"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"flip","edits":[[212,1,"31"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":2,"kind":"flip","edits":[[291,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[391,1,"6a"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[526,1,"6a"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[277,1,"3a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[0,1,"c4"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":2,"kind":"flip","edits":[[12,1,"20"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"flip","edits":[[45,1,"ae"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[876,1,"3c"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"flip","edits":[[88,1,"52"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[957,1,"4b"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[810,1,"3d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":2,"kind":"flip","edits":[[106,1,"7c"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[608,1,"9a"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[83,1,"52"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[293,1,"36"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[108,1,"da"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"flip","edits":[[170,1,"38"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"flip","edits":[[643,1,"64"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[151,1,"0e"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[87,1,"61"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[362,1,"3b"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[5,1,"80"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":2,"kind":"flip","edits":[[44,1,"cc"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[330,1,"0b"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[847,1,"37"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[953,1,"3d"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[231,1,"78"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":2,"kind":"flip","edits":[[1011,1,"23"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[269,1,"52"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[45,1,"ad"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[66,1,"3d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[6,1,"01"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":2,"kind":"flip","edits":[[938,1,"75"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[114,1,"65"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[10,1,"40"]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"flip","edits":[[96,1,"e5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"flip","edits":[[412,1,"3d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[42,1,"aa"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[339,1,"65"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[286,1,"e7"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[134,1,"32"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":2,"kind":"flip","edits":[[891,1,"49"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[81,1,"3b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[70,1,"67"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[307,1,"5b"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"flip","edits":[[440,1,"67"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[124,1,"4a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[95,1,"6e"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":2,"kind":"flip","edits":[[33,1,"64"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[391,1,"4e"]],"result":"ok"}, + {"base":2,"kind":"flip","edits":[[92,1,"7a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"flip","edits":[[809,1,"3a"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":2,"kind":"byte","edits":[[119,1,"7f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"byte","edits":[[110,1,"18"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"byte","edits":[[137,1,"ff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[964,1,"80"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[371,1,"1b"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[93,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"byte","edits":[[37,1,"ff"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[8,1,"0a"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"byte","edits":[[896,1,"f6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"byte","edits":[[47,1,"f6"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[18,1,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"byte","edits":[[330,1,"18"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[971,1,"2d"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[57,1,"40"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"byte","edits":[[405,1,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[1007,1,"1b"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[355,1,"18"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[95,1,"18"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"byte","edits":[[27,1,"60"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"byte","edits":[[333,1,"ff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[10,1,"0a"]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"byte","edits":[[362,1,"ff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[841,1,"2d"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[1,1,"18"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":2,"kind":"byte","edits":[[33,1,"80"]],"result":"ok"}, + {"base":2,"kind":"byte","edits":[[73,1,"60"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"byte","edits":[[10,1,"7f"]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"byte","edits":[[845,1,"80"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"byte","edits":[[363,1,"b6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"byte","edits":[[114,1,"60"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"truncate","edits":[[205,824,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[761,268,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[134,895,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[249,780,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[118,911,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[62,967,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[874,155,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"truncate","edits":[[226,803,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[120,909,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[912,117,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"truncate","edits":[[794,235,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"truncate","edits":[[600,429,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[889,140,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"truncate","edits":[[282,747,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[636,393,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[104,925,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[61,968,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[60,969,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"truncate","edits":[[141,888,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[570,459,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[174,855,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[595,434,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[187,842,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[349,680,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"truncate","edits":[[222,807,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[963,0,"613a"]],"result":"ok"}, + {"base":2,"kind":"insert","edits":[[947,0,"874dee"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[294,0,"1f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[457,0,"95b23e"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[979,0,"20"]],"result":"ok"}, + {"base":2,"kind":"insert","edits":[[351,0,"5dd100"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[355,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[140,0,"d95e"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[908,0,"b40f"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[796,0,"255ad9"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[110,0,"bee70b44"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[352,0,"66aad0c6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[79,0,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[307,0,"ff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[950,0,"3c78edd4"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[26,0,"69"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[74,0,"ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[11,0,"6ee3"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"insert","edits":[[3,0,"00"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":2,"kind":"insert","edits":[[325,0,"a82cd8cf"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[74,0,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[855,0,"f232"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[873,0,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[107,0,"1763"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[863,0,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[70,0,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"insert","edits":[[919,0,"961de71e"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[838,0,"d17902"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"insert","edits":[[167,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"insert","edits":[[394,0,"64"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[107,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[821,2,""]],"result":"ok"}, + {"base":2,"kind":"delete","edits":[[695,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[199,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[867,3,""]],"result":"ok"}, + {"base":2,"kind":"delete","edits":[[71,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[54,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[131,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[818,4,""]],"result":"ok"}, + {"base":2,"kind":"delete","edits":[[891,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[876,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[84,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[383,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[72,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[30,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[184,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[196,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[115,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[90,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[529,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[230,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[889,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[979,3,""]],"result":"ok"}, + {"base":2,"kind":"delete","edits":[[38,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[399,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"delete","edits":[[686,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[51,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[111,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"delete","edits":[[190,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"delete","edits":[[806,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"length","edits":[[9,1,"04"]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"length","edits":[[14,2,"0010"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"length","edits":[[9,3,"100000"]],"result":"ERR_INTEGRITY","step":3}, + {"base":2,"kind":"length","edits":[[15,1,"c6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"length","edits":[[11,1,"8a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[15,1,"85"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"length","edits":[[11,1,"78"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[8,8,"b387db98000002a9"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[8,5,"4646a6e110"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[10,3,"010002"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[14,2,"ffff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"length","edits":[[11,5,"78ffffffff"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[11,5,"7d00000260"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[11,1,"00"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[10,2,"0100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[11,1,"a3"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[11,1,"10"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[8,4,"055a7e06"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[13,1,"40"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"length","edits":[[10,6,"028600000079"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"length","edits":[[12,4,"1f451fc6"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[12,4,"04000001"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[8,4,"b09cfaec"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[9,3,"100001"]],"result":"ERR_INTEGRITY","step":2}, + {"base":2,"kind":"length","edits":[[11,1,"7a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"582038a8e8399e615cf1c47709698c1227dedbeda212396ed092e237158a774b1a53"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"78"],[18,11,"69646174656b65796361"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[136,1,"02"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"69"],[32,17,"01"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[32,1,"5810"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[16,120,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040119ffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[30,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"81"],[136,1,"1b0000000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[136,1,"1818"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"6a"],[32,17,"4106"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[16,121,"bf006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300401ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"5820fa25a257a009f76402c0d05ee33cf055ba1e7e4fadcd79d40b6e6dc6f0fb2f45"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"78"],[136,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[30,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[29,20,"0250448e134a13457c319cab7fceaf7ffa1f0101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[30,1,"02"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"85"],[16,121,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300401006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[16,33,"a4006a646174656b65796361700101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"6f"],[18,11,"60"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[29,107,"04010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483001"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[32,17,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7b"],[136,0,"1901"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[49,88,"0401037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"77"],[16,15,"a4006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7d"],[136,1,"1a00010000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[50,85,"a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"6f"],[18,11,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[30,1,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"69"],[32,17,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[136,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"90"],[16,120,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004010681a20070efbbbf6f72672e6578616d706c652e6101"]],"result":"ok"}, + {"base":2,"kind":"header","edits":[[31,104,"037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300250448e134a13457c319cab7fceaf7ffa1f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"6d"],[16,13,"a4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7b"],[136,1,"190000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"81"],[30,1,"1bffffffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7b"],[136,1,"190100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[32,17,"5145c984a55e75c6c7de9856f46c00348a18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[16,0,"81"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"82"],[18,11,"73646174656b6579732d6163636573732d6b6579"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[32,17,"517ff36324125250962f2edfed67a9ab6458"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[136,1,"1800"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[136,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"582091988f062194e273bf1b508c8022c319f282899a6a39cd8bc0cee3c836ef081a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7b"],[30,1,"190100"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"70"],[18,11,"4100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8b"],[16,121,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004010250448e134a13457c319cab7fceaf7ffa1f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"9f"],[16,120,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004010582a2006d6f72672e6578616d706c652e620101a2006d6f72672e6578616d706c652e6101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7b"],[16,120,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"81"],[30,1,"1b001fffffffffffff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"81"],[136,1,"1b001fffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[137,0,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"67"],[16,33,"a4006a646174656b65796361700101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"27"],[50,85,"62c080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[32,17,"5820d4368e448650829e063f858c1ee374227979ce0d20fd69e93ca55810f7544f68"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"58204f086038f0f514b7f828ad4d32aa454399f3f0a6c2c4e16e3f5719235cbb7696"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[136,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"b1"],[18,11,"78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[19,10,"444154454b4559434150"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7d"],[16,121,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040118ff4100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8b"],[16,121,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004010581a1006d6f72672e6578616d706c652e61"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[16,0,"c1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[30,1,"18ff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f546b356651"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[30,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"5820becf562eb2a47bc9ad5493fc82e9429afb0fa450891aee3beff04ea7e11f0419"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7c"],[16,121,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300401086178"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7f"],[18,11,"70646174656b6579732d636f6e74726f6c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"5820bca2c11da980e5d39b617c75d954a96e9fdd4429e7e86f14031a1f3fe07f9196"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[30,1,"1b0000000100000000"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"78"],[32,17,"4fe577d2ee255e7c31637a262a0b86bb"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8c"],[16,120,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004010682a20064f09080800101a20063efbda101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"78"],[32,17,"4f8fa8743a647a73417dd9fbad277422"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7a"],[32,17,"5111c5863eca62dc7ec57b21f7d328ca7492"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[32,17,"4187"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"f2"],[137,0,"a5006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300401"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"23"],[16,119,"a4006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[136,1,"190000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"8a"],[32,17,"58204150751f98e1e2c151189e2db297d5d2917a2bd8f7f1518983e6704494bb92a1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"7c"],[16,121,"a6006a646174656b657963617001010250448e134a13457c319cab7fceaf7ffa1f037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004011818a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"header","edits":[[11,1,"78"],[32,17,"4fa77644f49ccfcab95034630ca4576f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"7a"],[51,84,"54646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48303d"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":2,"kind":"datekey","edits":[[10,2,"014e"],[50,85,"790127646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d4441776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"76"],[51,84,"50646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d365a585a74626d56304f6e597849697769636d3931626d51694f6a45774d444239"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"37"],[50,85,"72646b315f65794a325a584a7a61573975496a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"32"],[50,85,"6d646b315f65794a325a584a7a61"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"71"],[51,64,"4b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a484a68626d513663585670593274755a5851"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"7e"],[51,84,"58646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364e6a59344f4451794d544a39"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"datekey","edits":[[10,2,"0192"],[50,85,"79016b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[10,2,"0151"],[50,85,"79012a646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936496a45774d4441696651"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"29"],[50,85,"64646b315f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[69,1,"61"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"89"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d6e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"30"],[50,85,"6b646b315f65794a325a584a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[64,1,"2b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[10,2,"01a5"],[50,85,"79017e646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[52,2,"444b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"82"],[51,84,"5c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f444d354d444d784e6a55344d544639"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"datekey","edits":[[11,1,"89"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d58"]],"result":"ERR_DATEKEY_INVALID","step":7}, + {"base":2,"kind":"datekey","edits":[[124,1,"30"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[11,1,"75"],[51,81,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[133,1,"58"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"datekey","edits":[[11,1,"42"],[51,84,"1c646b315f65794a325a584a7a61573975496a6f784c434a755a585233"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"datekey","edits":[[10,2,"018f"],[50,85,"790168646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[158,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[15,1,"45"],[172,65,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":2,"kind":"age","edits":[[803,1,"32"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[14,2,"0383"],[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6f33755256762b6a5332595973685961594e76357032473149473161382f6c42787a74794b37633855316e384c615733676175453277383277726356454b6e680a426e394d4b48784169306f4c465064553166303742516e525959694b52735241376262706d426a77426f46493266745055506d6248346f7653315a396e3676410a56637741507031545553584177744e5174482b6e654e774a724936505a39437a444c547066424a4641586b0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[459,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[904,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":2,"kind":"age","edits":[[901,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[367,0,"41"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[15,1,"85"],[414,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[804,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"96"],[169,3,"38343436373434303733373039353531363136"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[162,5,"736372797074"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[175,59,"4442394241373045304343304636454146373830334444303734343741314635343737373335464433463636313739324241393436303043383445"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":2,"kind":"age","edits":[[15,1,"82"],[163,4,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[903,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[816,37,"473358572b4b4b395536355146574c5a533548554f46422f4a4943394551473351424f4655"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[15,1,"84"],[156,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[367,0,"41"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[904,0,"3e20583235353139202f673378572b6b4b397536357166574c7a533568756f46422f4a4963394571473351424f66754f395056510a4274314b2b694248306273596f7268362f34677955544e45463755326c576c434874556e5275542f6d65550a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":2,"kind":"age","edits":[[804,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[168,0,"30"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[367,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[902,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[303,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[368,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[428,1,"41"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[783,21,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6f33755256762b6a5332595973685961594e76357032473149473161382f6c42787a74794b37633855316e384c615733676175453277383277726356454b6e680a426e394d4b48784169306f4c465064553166303742516e525959694b52735241376262706d426a77426f46493266745055506d6248346f7653315a396e3676410a56637741507031545553584177744e5174482b6e654e774a724936505a39437a444c547066424a4641586b0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[857,1,""]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[858,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[806,98,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[904,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[162,5,"783235353139"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[950,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"97"],[413,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[942,1,"41"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[15,1,"85"],[301,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[814,44,""]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[411,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[902,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[950,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[906,44,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[905,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[808,1,"78"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":2,"kind":"age","edits":[[14,2,"0317"],[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[925,1,"41"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[156,1,"56"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[441,1,"41"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[157,1,"32"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[444,1,"2f"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[167,0,"32"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[921,1,"2f"]],"result":"ok"}, + {"base":2,"kind":"age","edits":[[14,2,"0189"],[160,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[805,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[15,1,"8b"],[237,0,"2031303030"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[159,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":2,"kind":"age","edits":[[168,1,"32"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":2,"kind":"age","edits":[[15,1,"87"],[162,5,"583235353139"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":2,"kind":"age","edits":[[802,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":2,"kind":"age","edits":[[808,6,"746c6f636b"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":3,"kind":"flip","edits":[[276,1,"6a"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[309,1,"68"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[152,1,"2f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"flip","edits":[[473,1,"0f"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[0,1,"4c"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":3,"kind":"flip","edits":[[102,1,"5e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[14,1,"83"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"flip","edits":[[289,1,"45"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[6,1,"10"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":3,"kind":"flip","edits":[[393,1,"5a"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[440,1,"44"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[1040,1,"ea"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[62,1,"42"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[1033,1,"46"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[1060,1,"6b"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[1172,1,"29"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[785,1,"bf"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[456,1,"39"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[15,1,"5a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[545,1,"d6"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[13,1,"02"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"flip","edits":[[1,1,"43"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":3,"kind":"flip","edits":[[485,1,"ac"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[1003,1,"30"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[112,1,"6c"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[1089,1,"6a"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[1108,1,"22"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[129,1,"14"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[356,1,"48"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[3,1,"21"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":3,"kind":"flip","edits":[[9,1,"80"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"flip","edits":[[360,1,"67"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[401,1,"4d"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[14,1,"07"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"flip","edits":[[75,1,"35"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[12,1,"80"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"flip","edits":[[1100,1,"2f"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[1061,1,"44"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[63,1,"3a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[135,1,"0c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"flip","edits":[[1006,1,"34"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":3,"kind":"flip","edits":[[443,1,"71"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[37,1,"1c"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[107,1,"65"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[1115,1,"62"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[823,1,"6a"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[1160,1,"e4"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[882,1,"9a"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[982,1,"6d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[1002,1,"1e"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"flip","edits":[[1030,1,"53"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[556,1,"f7"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[928,1,"49"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[105,1,"22"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[100,1,"43"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[401,1,"cc"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"flip","edits":[[18,1,"6e"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"flip","edits":[[1197,1,"bc"]],"result":"ok"}, + {"base":3,"kind":"flip","edits":[[65,1,"77"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"flip","edits":[[314,1,"10"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[53,1,"20"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"byte","edits":[[65,1,"2d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"byte","edits":[[982,1,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[49,1,"ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"byte","edits":[[1149,1,"2d"]],"result":"ok"}, + {"base":3,"kind":"byte","edits":[[5,1,"f6"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":3,"kind":"byte","edits":[[1111,1,"a0"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[433,1,"f6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[1045,1,"20"]],"result":"ok"}, + {"base":3,"kind":"byte","edits":[[24,1,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"byte","edits":[[196,1,"7f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[1021,1,"a0"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[3,1,"20"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":3,"kind":"byte","edits":[[1098,1,"00"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[378,1,"2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[114,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"byte","edits":[[14,1,"f6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[415,1,"51"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[32,1,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"byte","edits":[[1125,1,"2d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[398,1,"60"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[367,1,"ff"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[364,1,"2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"byte","edits":[[44,1,"f6"]],"result":"ok"}, + {"base":3,"kind":"byte","edits":[[1037,1,"f6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[1070,1,"2d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[1065,1,"40"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"byte","edits":[[55,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"byte","edits":[[85,1,"2d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"byte","edits":[[838,1,"2d"]],"result":"ok"}, + {"base":3,"kind":"truncate","edits":[[857,363,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[973,247,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[86,1134,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":3,"kind":"truncate","edits":[[386,834,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[905,315,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[898,322,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[883,337,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[1022,198,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"truncate","edits":[[349,871,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[285,935,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[405,815,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[937,283,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[397,823,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[1024,196,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"truncate","edits":[[341,879,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[786,434,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[1175,45,""]],"result":"ok"}, + {"base":3,"kind":"truncate","edits":[[124,1096,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":3,"kind":"truncate","edits":[[563,657,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[72,1148,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":3,"kind":"truncate","edits":[[216,1004,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[1057,163,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"truncate","edits":[[46,1174,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":3,"kind":"truncate","edits":[[567,653,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"truncate","edits":[[1021,199,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[24,0,"fbe0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[1119,0,"557b"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[339,0,"d1b016d7"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"insert","edits":[[152,0,"d6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"insert","edits":[[15,0,"21"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[122,0,"76"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[5,0,"3859fb"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":3,"kind":"insert","edits":[[76,0,"bdd5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[141,0,"f10ff3a3"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"insert","edits":[[146,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"insert","edits":[[22,0,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[996,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[1078,0,"a0"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[13,0,"0a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[1044,0,"5f"]],"result":"ok"}, + {"base":3,"kind":"insert","edits":[[349,0,"f1"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"insert","edits":[[114,0,"0d"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[987,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[1074,0,"79b3bbf5"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[21,0,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[3,0,"554c5b"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":3,"kind":"insert","edits":[[2,0,"0d"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":3,"kind":"insert","edits":[[355,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"insert","edits":[[979,0,"f6"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[31,0,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[1107,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[1042,0,"bf198445"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[1058,0,"ff"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"insert","edits":[[107,0,"1f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"insert","edits":[[127,0,"e5e226a5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[291,3,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"delete","edits":[[103,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[119,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[72,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[989,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[1124,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[299,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"delete","edits":[[766,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[15,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[115,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[336,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"delete","edits":[[1001,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[100,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[15,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[1132,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[12,3,""]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"delete","edits":[[61,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[11,4,""]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"delete","edits":[[154,4,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"delete","edits":[[6,2,""]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"delete","edits":[[1041,1,""]],"result":"ok"}, + {"base":3,"kind":"delete","edits":[[141,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"delete","edits":[[12,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[57,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"delete","edits":[[172,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[998,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[1054,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[613,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[982,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"delete","edits":[[75,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[10,6,"034a00000079"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[8,1,"80"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[8,8,"ffffffff00000000"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[15,1,"3a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"length","edits":[[10,2,"0100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[15,1,"64"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"length","edits":[[12,4,"dbaafd16"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[8,8,"040000017fe7fd04"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[11,5,"780000ffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[14,1,"23"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"length","edits":[[11,5,"78ffffffff"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[13,3,"010000"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"length","edits":[[9,1,"08"]],"result":"ERR_INTEGRITY","step":3}, + {"base":3,"kind":"length","edits":[[15,1,"43"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"length","edits":[[11,5,"78c7807935"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[8,4,"04000000"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[8,1,"04"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[11,5,"514dd3b3c9"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[8,8,"0610927d5228cd38"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[11,1,"7a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[12,4,"f192d90e"]],"result":"ERR_INTEGRITY","step":2}, + {"base":3,"kind":"length","edits":[[11,3,"a20002"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[11,5,"3d04000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"length","edits":[[9,1,"02"]],"result":"ERR_INTEGRITY","step":3}, + {"base":3,"kind":"length","edits":[[11,1,"78"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[30,1,"18ff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"6d"],[16,13,"a4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"82"],[18,11,"73646174656b6579732d6163636573732d6b6579"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[30,1,"4100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"95"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010681a2006d6f72672e6578616d706c652e61011b0000000100000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[133,1,"6e"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":3,"kind":"header","edits":[[30,1,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[30,1,"1b0020000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"81"],[136,1,"1b0020000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"81"],[136,1,"1b001fffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[51,84,"54646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58303d"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[32,1,"5810"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"81"],[30,1,"1b001fffffffffffff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010800"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[114,1,"49"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"85"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004011b0000000100000000f93c00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[136,1,"17"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a20070efbbbf6f72672e6578616d706c652e6101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8d"],[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a2006d6f72672e6578616d706c652e6101"]],"result":"ERR_EXTENSION_CRITICAL_UNKNOWN","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"81"],[136,1,"1b0000000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d4441786651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"23"],[16,119,"a4006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"77"],[16,15,"a4006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[30,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[29,107,"04010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583001"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"67"],[16,33,"a4006a646174656b65796361700101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[32,17,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[29,106,"037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300250c75dfc8e9c576d1369910664df93693a0101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7e"],[51,84,"58646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364e6a59344f4451794d544a39"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[136,1,"1818"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"83"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004011b000000010000000020"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"78"],[32,17,"4f572df577acdd43706cc5dcab6541e4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[18,11,"6b646174656b657963617078"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8c"],[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010682a20063efbda10101a20064f090808001"]],"result":"ok"}, + {"base":3,"kind":"header","edits":[[11,1,"8b"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010681a1006d6f72672e6578616d706c652e61"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8f"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a3006d6f72672e6578616d706c652e61010102f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[137,0,"a5006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300401"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"header","edits":[[11,1,"7d"],[136,1,"1a00010000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[16,121,"bf006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300401ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7c"],[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004011818"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"27"],[50,85,"62c080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8c"],[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010582a20064f09080800101a20063efbda101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[50,85,"64646b315f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[82,1,"39"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[16,0,"c1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[30,1,"02"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7d"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040119fffff6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"81"],[30,1,"1bffffffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"cf"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300401037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"69"],[32,17,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[52,2,"444b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7d"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040107f93c00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"90"],[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a20070efbbbf6f72672e6578616d706c652e6101"]],"result":"ERR_EXTENSION_CRITICAL_UNKNOWN","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[30,1,"6131"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"76"],[51,84,"50646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d365a585a74626d56304f6e597849697769636d3931626d51694f6a45774d444639"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"78"],[18,11,"69646174656b65796361"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"6f"],[18,11,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7c"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040118ff00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[19,10,"444154454b4559434150"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[136,1,"02"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"b1"],[18,11,"78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8f"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a3006d6f72672e6578616d706c652e6101010240"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[32,17,"51afb1d17f1de53c33e769eeae84757082f4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8b"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010250c75dfc8e9c576d1369910664df93693a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"83"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300401081b0020000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[18,11,"70646174656b6579732d636f6e74726f6c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[31,104,"037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300250c75dfc8e9c576d1369910664df93693a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"6a"],[32,17,"41b8"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[30,1,"c100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"77"],[16,121,"a4006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"6f"],[18,11,"60"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7a"],[137,0,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"90"],[16,120,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010681a20070efbbbf6f72672e6578616d706c652e6101"]],"result":"ok"}, + {"base":3,"kind":"header","edits":[[11,1,"84"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004011b00000001000000004100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"6a"],[32,17,"41b4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[16,120,"a7006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a2006d6f72672e6578616d706c652e6101010681a2006d6f72672e6578616d706c652e6101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"8a"],[32,17,"5820317df0d69b800307526494d10e4072f119588e2f6e3e5add7fa1b626a849361d"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"7c"],[16,121,"a6006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300401076178"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"25"],[50,85,"a0"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"header","edits":[[11,1,"a1"],[16,120,"a7006a646174656b657963617001010250c75dfc8e9c576d1369910664df93693a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004010581a2006d6f72672e6578616d706c652e6101010681a2006d6f72672e6578616d706c652e6101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":3,"kind":"datekey","edits":[[10,2,"0164"],[50,85,"79013d646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"82"],[51,84,"5c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f444d354d444d784e6a55344d544a39"]],"result":"ERR_DATEKEY_INVALID","step":7}, + {"base":3,"kind":"datekey","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5334776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"76"],[51,84,"50646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364c544639"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"29"],[50,85,"64646b315f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"71"],[51,64,"4b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a484a68626d513663585670593274755a5851"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":3,"kind":"datekey","edits":[[10,2,"0171"],[50,85,"79014a646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[117,1,"5f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[80,1,"41"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936496a45774d4441696651"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"75"],[51,83,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d48"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"75"],[51,81,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":3,"kind":"datekey","edits":[[11,1,"89"],[51,83,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b354d6e"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[10,2,"01a2"],[50,85,"79017b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[10,2,"0162"],[50,85,"79013b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"77"],[51,84,"51646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d57557a6651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":3,"kind":"datekey","edits":[[133,1,"48"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":3,"kind":"datekey","edits":[[112,1,"61"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":3,"kind":"datekey","edits":[[118,1,"2d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[10,2,"0184"],[50,85,"79015d646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"67"],[51,84,"41646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"7a"],[51,84,"54646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58303d"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"43"],[51,84,"1d646b315f65794a325a584a7a61573975496a6f784c434a755a58523362"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"datekey","edits":[[11,1,"5e"],[51,84,"38646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d366358567059327475"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":3,"kind":"age","edits":[[1100,0,"3e20583235353139206577394a704f30414754476d5758705a4345487353724e304579326b536a7a7068626f6b666a434d6f46340a3366456a542b452b435a33623764432f307647794a51686c4e3050694d6b4c6561667a7149456f634c62550a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":3,"kind":"age","edits":[[1053,1,""]],"result":"ok"}, + {"base":3,"kind":"age","edits":[[15,1,"35"],[137,21,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[168,4,"32303030"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[15,1,"50"],[237,0,"206578747261"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[1101,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[400,1,"41"]],"result":"ok"}, + {"base":3,"kind":"age","edits":[[15,1,"09"],[172,65,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[1054,0,"41"]],"result":"ok"}, + {"base":3,"kind":"age","edits":[[998,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[15,1,"9a"],[413,0,"3e20736372797074206332467364484e686248527a595778306332467364412031380a434343434343434343434343434343434343434343434343434343434343434343434343434343434343430a2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[158,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[367,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[413,0,"3e20746c6f636b203130303120353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a7542354f56614530474536794568796637596d6f564f574346304232637a4c415a6979334347624a2f7a4971314f764a354f3555594a37754952316d616334750a45533646314e6a62523254507759336e7a465647654f767644416d3841705357306f4e3057326d695435506174613635696c5775626868507466745338696c390a705337744b774848776c70362b462f6f7170434d7a7778646f7a714c6f396459614c732f4478516c5039380a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":3,"kind":"age","edits":[[1004,1,"78"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":3,"kind":"age","edits":[[414,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[167,0,"32"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":3,"kind":"age","edits":[[1099,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[14,2,"024d"],[160,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"5b"],[413,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":3,"kind":"age","edits":[[1001,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[168,4,"30"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[15,1,"4f"],[237,0,"2031303030"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[1146,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[14,2,"0447"],[413,0,"3e20746c6f636b203130303120353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a7542354f56614530474536794568796637596d6f564f574346304232637a4c415a6979334347624a2f7a4971314f764a354f3555594a37754952316d616334750a45533646314e6a62523254507759336e7a465647654f767644416d3841705357306f4e3057326d695435506174613635696c5775626868507466745338696c390a705337744b774848776c70362b462f6f7170434d7a7778646f7a714c6f396459614c732f4478516c5039380a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[411,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"49"],[410,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[998,1,"56"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[999,1,"32"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[1004,6,"736372797074"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":3,"kind":"age","edits":[[15,1,"4f"],[237,0,"2041414141"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[301,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"47"],[168,4,"30"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[15,1,"db"],[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":3,"kind":"age","edits":[[160,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"49"],[414,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[1082,1,"2f"]],"result":"ok"}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[367,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[238,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[1000,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[1109,1,"2f"]],"result":"ok"}, + {"base":3,"kind":"age","edits":[[15,1,"1e"],[415,44,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[1002,98,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[1054,0,"206578747261"]],"result":"ok"}, + {"base":3,"kind":"age","edits":[[1100,0,"3e20736372797074206332467364484e686248527a595778306332467364412031380a434343434343434343434343434343434343434343434343434343434343434343434343434343434343430a2d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[368,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[412,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"49"],[301,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[156,1,"56"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"ac"],[413,0,"3e2058323535313920414141414141414141414141414141414141414141414141414141414141414141414141414141414141410a424242424242424242424242424242424242424242424242424242424242424242424242424242424242420a2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[162,5,"544c4f434b"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":3,"kind":"age","edits":[[15,1,"48"],[156,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[210,1,"41"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[158,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[1004,6,"74"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":3,"kind":"age","edits":[[175,59,"4442394241373045304343304636454146373830334444303734343741314635343737373335464433463636313739324241393436303043383445"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":3,"kind":"age","edits":[[237,0,"2031303030"]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[1102,44,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":3,"kind":"age","edits":[[15,1,"4b"],[459,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":3,"kind":"age","edits":[[367,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[522,1,"38"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[97,1,"5c"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[78,1,"50"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[612,1,"21"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"flip","edits":[[693,1,"55"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[4,1,"05"]],"result":"ERR_UNSUPPORTED_VERSION","step":2}, + {"base":4,"kind":"flip","edits":[[92,1,"7a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[716,1,"30"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[11,1,"7b"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[117,1,"47"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[513,1,"25"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[19,1,"74"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[162,1,"76"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"flip","edits":[[458,1,"61"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[30,1,"05"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":4,"kind":"flip","edits":[[308,1,"29"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[207,1,"24"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"flip","edits":[[81,1,"b3"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[606,1,"36"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"flip","edits":[[35,1,"15"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[6,1,"08"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":4,"kind":"flip","edits":[[615,1,"4b"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[211,1,"73"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"flip","edits":[[85,1,"ea"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[780,1,"48"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[125,1,"63"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[5,1,"10"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":4,"kind":"flip","edits":[[306,1,"e4"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[590,1,"73"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"flip","edits":[[54,1,"11"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[404,1,"7a"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[261,1,"da"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[357,1,"65"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[156,1,"77"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[14,1,"09"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[362,1,"51"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[419,1,"51"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[115,1,"e9"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[604,1,"4a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"flip","edits":[[317,1,"5a"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[368,1,"b1"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[702,1,"2a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"flip","edits":[[681,1,"36"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[430,1,"0f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[376,1,"75"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[23,1,"4b"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[98,1,"5d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"flip","edits":[[30,1,"09"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":4,"kind":"flip","edits":[[593,1,"75"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"flip","edits":[[219,1,"21"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"flip","edits":[[175,1,"44"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"flip","edits":[[671,1,"57"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[32,1,"40"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[333,1,"af"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"flip","edits":[[11,1,"69"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[8,1,"02"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"flip","edits":[[590,1,"62"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"flip","edits":[[102,1,"d6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"flip","edits":[[782,1,"ab"]],"result":"ok"}, + {"base":4,"kind":"flip","edits":[[752,1,"91"]],"result":"ok"}, + {"base":4,"kind":"byte","edits":[[61,1,"7f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[143,1,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"byte","edits":[[77,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"byte","edits":[[341,1,"f6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"byte","edits":[[40,1,"60"]],"result":"ok"}, + {"base":4,"kind":"byte","edits":[[124,1,"7f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[683,1,"ff"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"byte","edits":[[104,1,"0a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[105,1,"40"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[100,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"byte","edits":[[4,1,"e8"]],"result":"ERR_UNSUPPORTED_VERSION","step":2}, + {"base":4,"kind":"byte","edits":[[9,1,"18"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"byte","edits":[[778,1,"18"]],"result":"ok"}, + {"base":4,"kind":"byte","edits":[[142,1,"80"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"byte","edits":[[54,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"byte","edits":[[767,1,"20"]],"result":"ok"}, + {"base":4,"kind":"byte","edits":[[669,1,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"byte","edits":[[322,1,"40"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"byte","edits":[[82,1,"18"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[58,1,"20"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[0,1,"0a"]],"result":"ERR_INVALID_MAGIC","step":1}, + {"base":4,"kind":"byte","edits":[[49,1,"85"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"byte","edits":[[67,1,"40"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"byte","edits":[[6,1,"80"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":4,"kind":"byte","edits":[[93,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"byte","edits":[[772,1,"00"]],"result":"ok"}, + {"base":4,"kind":"byte","edits":[[8,1,"80"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"byte","edits":[[187,1,"80"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"byte","edits":[[281,1,"f6"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"byte","edits":[[617,1,"2d"]],"result":"ok"}, + {"base":4,"kind":"truncate","edits":[[6,777,""]],"result":"ERR_INTEGRITY","step":1}, + {"base":4,"kind":"truncate","edits":[[703,80,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[89,694,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":4,"kind":"truncate","edits":[[215,568,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[299,484,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[628,155,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[669,114,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[226,557,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[696,87,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[604,179,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[136,647,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":4,"kind":"truncate","edits":[[572,211,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[551,232,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[530,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[497,286,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[479,304,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[214,569,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[695,88,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[589,194,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[749,34,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[70,713,""]],"result":"ERR_INTEGRITY","step":3}, + {"base":4,"kind":"truncate","edits":[[408,375,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[462,321,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"truncate","edits":[[721,62,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"truncate","edits":[[767,16,""]],"result":"ok"}, + {"base":4,"kind":"insert","edits":[[226,0,"ec12"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[697,0,"5a1e"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[15,0,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[8,0,"f739"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"insert","edits":[[34,0,"0a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[228,0,"2d4ec3"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[430,0,"21a341"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[93,0,"f81affc7"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[6,0,"e5fd6ad1"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":4,"kind":"insert","edits":[[98,0,"d9"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[579,0,"0c09"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[80,0,"c7126522"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[6,0,"c271ef"]],"result":"ERR_INVALID_FLAGS","step":2}, + {"base":4,"kind":"insert","edits":[[57,0,"11"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[713,0,"85"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[190,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[604,0,"9b"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[760,0,"00"]],"result":"ok"}, + {"base":4,"kind":"insert","edits":[[756,0,"20"]],"result":"ok"}, + {"base":4,"kind":"insert","edits":[[454,0,"ade4"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[656,0,"d1"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[176,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[4,0,"20"]],"result":"ERR_UNSUPPORTED_VERSION","step":2}, + {"base":4,"kind":"insert","edits":[[211,0,"db90"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[11,0,"20"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"insert","edits":[[163,0,"ce451752"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[343,0,"1f"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"insert","edits":[[709,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"insert","edits":[[73,0,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"insert","edits":[[97,0,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[555,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"delete","edits":[[645,2,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[771,1,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[619,2,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[768,1,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[287,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"delete","edits":[[8,2,""]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"delete","edits":[[538,3,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"delete","edits":[[120,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[273,4,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"delete","edits":[[149,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"delete","edits":[[614,1,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"delete","edits":[[680,3,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[782,1,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[530,4,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"delete","edits":[[14,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[73,2,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[17,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[61,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[81,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[665,3,""]],"result":"ok"}, + {"base":4,"kind":"delete","edits":[[385,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"delete","edits":[[75,3,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[386,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"delete","edits":[[9,3,""]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"delete","edits":[[147,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"delete","edits":[[82,4,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"delete","edits":[[223,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"delete","edits":[[600,1,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"delete","edits":[[110,1,""]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[15,1,"bf"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"length","edits":[[11,1,"77"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[15,1,"8e"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"length","edits":[[8,4,"f9a83804"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[10,6,"01be00000079"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[11,1,"78"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[11,5,"780edde307"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[12,4,"4096bc2e"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[11,2,"7702"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[11,1,"5e"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[11,5,"42000001bd"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[11,5,"9200000010"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[15,1,"c5"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"length","edits":[[11,1,"59"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[11,5,"78000001e2"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[8,4,"926213f4"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[12,4,"7ccde2e6"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[15,1,"bd"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"length","edits":[[8,4,"915e89d6"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[11,1,"7a"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[12,4,"d7bfeb65"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[10,6,"04793e2e0fe2"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[10,2,"0100"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"length","edits":[[8,4,"9e71f598"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"length","edits":[[11,5,"7879b194a8"]],"result":"ERR_INTEGRITY","step":2}, + {"base":4,"kind":"header","edits":[[11,1,"b1"],[18,11,"78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[133,1,"6e"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":4,"kind":"header","edits":[[11,1,"a1"],[16,121,"a7006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000581a2006d6f72672e6578616d706c652e6101010681a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040008f5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"83"],[16,120,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004001b0000000100000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"29"],[50,85,"64646b315f"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"25"],[50,85,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"81"],[136,0,"1b00000001000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[16,0,"c1"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7d"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300400085f40ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"6a"],[32,17,"418b"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"90"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000581a20070efbbbf6f72672e6578616d706c652e610101"]],"result":"ERR_EXTENSION_CRITICAL_UNKNOWN","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[30,0,"18"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[30,1,"18ff"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"78"],[32,17,"4fd40c9d194ffbc7e0da20c1c1bdd9cc"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"75"],[51,81,"4f646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":4,"kind":"header","edits":[[11,1,"23"],[16,119,"a4006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"8c"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000682a20063efbda10101a20064f09080800101"]],"result":"ok"}, + {"base":4,"kind":"header","edits":[[17,118,"037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583001010250ab10174561a9a19a6d9dc9ab1ef59c66006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[51,84,"54646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58303d"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[136,0,"1901"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"25"],[50,85,"80"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"27"],[50,85,"62c080"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[10,2,"0145"],[50,85,"79011e646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"header","edits":[[32,1,"5810"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[30,1,"6131"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"77"],[16,15,"a4006a646174656b6579636170"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7f"],[18,11,"70646174656b6579732d636f6e74726f6c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"81"],[30,1,"1b0000000100000000"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7d"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040019fffff6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[137,0,"00"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"6d"],[16,13,"a4"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[18,11,"60"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[18,11,"70646174656b6579732d636f6e74726f6c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"8a"],[32,17,"582014cc8034c4084035ad065ac428dde83ad1fa6ac52057a2af58a678cf640db6d8"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[30,1,"02"]],"result":"ERR_UNSUPPORTED_VERSION","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"81"],[136,1,"1b001fffffffffffff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"17"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[137,0,"a5006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300400"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"header","edits":[[11,1,"9f"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000682a2006d6f72672e6578616d706c652e620101a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"67"],[16,33,"a4006a646174656b65796361700101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"8a"],[32,17,"58205388550d14136e82226951a7a6050f39fff6a4b873f85306aa2a4e402b32410f"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"6f"],[18,11,"60"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[30,1,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[136,1,"1801"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"81"],[136,0,"1b00000000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"8a"],[32,17,"5820f67780fe76733ea14b561ef8daa34906da40c8ce62c6db3de6db9f269d4f43c6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"f5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[32,17,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[29,106,"037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300250ab10174561a9a19a6d9dc9ab1ef59c660101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[32,1,"5810"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[10,2,"057c"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300400069840a2006f6f72672e6578616d706c652e3030300101a2006f6f72672e6578616d706c652e3030310101a2006f6f72672e6578616d706c652e3030320101a2006f6f72672e6578616d706c652e3030330101a2006f6f72672e6578616d706c652e3030340101a2006f6f72672e6578616d706c652e3030350101a2006f6f72672e6578616d706c652e3030360101a2006f6f72672e6578616d706c652e3030370101a2006f6f72672e6578616d706c652e3030380101a2006f6f72672e6578616d706c652e3030390101a2006f6f72672e6578616d706c652e3031300101a2006f6f72672e6578616d706c652e3031310101a2006f6f72672e6578616d706c652e3031320101a2006f6f72672e6578616d706c652e3031330101a2006f6f72672e6578616d706c652e3031340101a2006f6f72672e6578616d706c652e3031350101a2006f6f72672e6578616d706c652e3031360101a2006f6f72672e6578616d706c652e3031370101a2006f6f72672e6578616d706c652e3031380101a2006f6f72672e6578616d706c652e3031390101a2006f6f72672e6578616d706c652e3032300101a2006f6f72672e6578616d706c652e3032310101a2006f6f72672e6578616d706c652e3032320101a2006f6f72672e6578616d706c652e3032330101a2006f6f72672e6578616d706c652e3032340101a2006f6f72672e6578616d706c652e3032350101a2006f6f72672e6578616d706c652e3032360101a2006f6f72672e6578616d706c652e3032370101a2006f6f72672e6578616d706c652e3032380101a2006f6f72672e6578616d706c652e3032390101a2006f6f72672e6578616d706c652e3033300101a2006f6f72672e6578616d706c652e3033310101a2006f6f72672e6578616d706c652e3033320101a2006f6f72672e6578616d706c652e3033330101a2006f6f72672e6578616d706c652e3033340101a2006f6f72672e6578616d706c652e3033350101a2006f6f72672e6578616d706c652e3033360101a2006f6f72672e6578616d706c652e3033370101a2006f6f72672e6578616d706c652e3033380101a2006f6f72672e6578616d706c652e3033390101a2006f6f72672e6578616d706c652e3034300101a2006f6f72672e6578616d706c652e3034310101a2006f6f72672e6578616d706c652e3034320101a2006f6f72672e6578616d706c652e3034330101a2006f6f72672e6578616d706c652e3034340101a2006f6f72672e6578616d706c652e3034350101a2006f6f72672e6578616d706c652e3034360101a2006f6f72672e6578616d706c652e3034370101a2006f6f72672e6578616d706c652e3034380101a2006f6f72672e6578616d706c652e3034390101a2006f6f72672e6578616d706c652e3035300101a2006f6f72672e6578616d706c652e3035310101a2006f6f72672e6578616d706c652e3035320101a2006f6f72672e6578616d706c652e3035330101a2006f6f72672e6578616d706c652e3035340101a2006f6f72672e6578616d706c652e3035350101a2006f6f72672e6578616d706c652e3035360101a2006f6f72672e6578616d706c652e3035370101a2006f6f72672e6578616d706c652e3035380101a2006f6f72672e6578616d706c652e3035390101a2006f6f72672e6578616d706c652e3036300101a2006f6f72672e6578616d706c652e3036310101a2006f6f72672e6578616d706c652e3036320101a2006f6f72672e6578616d706c652e3036330101"]],"result":"ok"}, + {"base":4,"kind":"header","edits":[[16,121,"bf006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300400ff"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[16,1,"b805"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7a"],[16,0,"81"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"02"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"8b"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000250ab10174561a9a19a6d9dc9ab1ef59c66"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7e"],[16,120,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040018fff93c"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000640"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[18,11,"78416161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d4441786651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5334776651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"9f"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000582a2006d6f72672e6578616d706c652e620101a2006d6f72672e6578616d706c652e610101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"20"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"77"],[16,121,"a4006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[136,1,"03"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[136,0,"1900"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"76"],[51,84,"50646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d365a585a74626d56304f6e597849697769636d3931626d51694f6a45774d444639"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"83"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004001b000000010000000040"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[136,1,"190101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"83"],[16,120,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58300400051b00200000000000"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[114,1,"49"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d5830040006f5"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"78"],[32,17,"4f4e44e6ad3649f29cfce1f9355d0403"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"70"],[18,11,"6178"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"6a"],[32,17,"4112"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7b"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004000101"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"header","edits":[[11,1,"7c"],[16,121,"a6006a646174656b657963617001010250ab10174561a9a19a6d9dc9ab1ef59c66037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d583004001818f6"]],"result":"ERR_NON_CANONICAL_CBOR","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"7c"],[51,84,"56646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a434936496a45774d4441696651"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"5a"],[51,84,"34646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"78"],[51,84,"52646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d57557a6651"]],"result":"ERR_DATEKEY_NON_CANONICAL","step":4}, + {"base":4,"kind":"datekey","edits":[[10,2,"01a5"],[50,85,"79017e646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[127,1,"2b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[10,2,"014e"],[50,85,"790127646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"3e"],[51,84,"18646b315f65794a325a584a7a61573975496a6f784c434a75"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[100,1,"2d"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"76"],[51,84,"50646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364c544639"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"82"],[51,84,"5c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f444d354d444d784e6a55344d544639"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":4,"kind":"datekey","edits":[[11,1,"31"],[50,85,"6c646b315f65794a325a584a7a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"7e"],[51,84,"58646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364e6a59344f4451794d544a39"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":4,"kind":"datekey","edits":[[52,2,"444b"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"40"],[51,84,"1a646b315f65794a325a584a7a61573975496a6f784c434a755a58"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[109,1,"30"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"4f"],[51,84,"29646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[99,1,"5a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"71"],[51,64,"4b646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a484a68626d513663585670593274755a5851"]],"result":"ERR_UNKNOWN_PROFILE","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"53"],[51,84,"2d646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"89"],[51,81,"63646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364f5441774e7a45354f5449314e4463304d446b35"]],"result":"ERR_DATEKEY_INVALID","step":7}, + {"base":4,"kind":"datekey","edits":[[11,1,"62"],[51,84,"3c646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[64,1,"7a"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[10,2,"0160"],[50,85,"790139646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d58304141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"32"],[50,85,"6d646b315f65794a325a584a7a61"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"datekey","edits":[[11,1,"67"],[51,84,"41646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c"]],"result":"ERR_DATEKEY_INVALID","step":4}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[302,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[368,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[608,6,"746c6f636b32"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[159,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[14,2,"02bb"],[413,0,"3e20746c6f636b203130303120353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6861734835575a6449504b4e474465764f596264686a4b5a7a7534613134712b612b6831667757504545697466724b503932414b482f4d6769757965347470740a41416e64322b2b7641424855456e7a47347a35496b682b767371424f656b2f6f7747585a46516e7156554364344342626c465a78786f677734424f71672b4f750a31484d526d757947714a59666d5230652f3751594231705467665a70534d346a61596e345a6d7641682f300a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"92"],[415,44,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[162,5,"544c4f434b"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"age","edits":[[658,0,"41"]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[158,0,"20"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[14,2,"024f"],[413,0,"3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444440a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[237,0,"41"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"age","edits":[[411,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[604,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bc"],[156,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[237,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"cf"],[413,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bd"],[236,1,""]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"age","edits":[[706,44,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[412,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[657,1,""]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[157,1,"32"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[614,44,""]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[158,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[191,1,"2b"]],"result":"ERR_PROFILE_MISMATCH","step":8}, + {"base":4,"kind":"age","edits":[[606,98,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[156,1,"56"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[702,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bd"],[301,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[14,2,"00c1"],[160,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[703,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[604,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"c3"],[237,0,"2031303030"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":4,"kind":"age","edits":[[14,2,"0220"],[413,0,"3e2058323535313920414141414141414141414141414141414141414141414141414141414141414141414141414141414141410a424242424242424242424242424242424242424242424242424242424242424242424242424242424242420a2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"ce"],[169,3,"38343436373434303733373039353531363136"]],"result":"ERR_ROUND_MISMATCH","step":8}, + {"base":4,"kind":"age","edits":[[14,2,"020e"],[413,0,"3e20736372797074206332467364484e686248527a595778306332467364412031380a434343434343434343434343434343434343434343434343434343434343434343434343434343434343430a2d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bd"],[414,1,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"7d"],[172,65,""]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":8}, + {"base":4,"kind":"age","edits":[[659,0,"0a"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[608,6,"74"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"age","edits":[[615,42,"4b542f58415348374e534f55564c4b39584649414833374a5a5351364b5758504b564b535a464c59474a"]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[750,0,"20"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[702,0,"41"]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[704,0,"3e206772656173652d78202140230a0a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[411,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[302,0,"41"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[608,6,"736372797074"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[162,5,"783235353139"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"age","edits":[[637,1,"2f"]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[160,253,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[658,0,"206578747261"]],"result":"ok"}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[238,0,"0a"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[302,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[602,2,""]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[459,0,"0d"]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[602,1,"56"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[156,2,""]],"result":"ERR_INTEGRITY","step":5}, + {"base":4,"kind":"age","edits":[[15,1,"bf"],[162,5,"583235353139"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":5}, + {"base":4,"kind":"age","edits":[[658,0,"0d"]],"result":"ERR_INTEGRITY","step":6}, + {"base":4,"kind":"age","edits":[[704,0,"3e20583235353139206b542f78415348374e534f55766c6b39586649416833374a7a5371366b5778504b566b537a666c79676a590a30757574746f7236346f656253535a64584a394d7656374a334a3645516c6369745154473130776b7167630a2d"]],"result":"ERR_POLICY_STRUCTURE_MISMATCH","step":6}, + {"base":4,"kind":"age","edits":[[605,0,"0a"]],"result":"ERR_INTEGRITY","step":6} + ] +} diff --git a/testdata/vectors/mutations.json b/testdata/vectors/mutations.json new file mode 100644 index 0000000..ff046e2 --- /dev/null +++ b/testdata/vectors/mutations.json @@ -0,0 +1,1109 @@ +{ + "spec": "0.8.2", + "description": "Mutation corpus of spec §64 and further cases of capsule.TestMutationCorpus, generated by the reference implementation: each case is a .dkc and what the reader is given, with the normative error and the step of spec §63 at which capsule.Open fails. See testdata/README.md.", + "cases": [ + { + "name": "PUBLIC_HEADER_A + SEALED_CONTROL_B", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001bea5006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a734c34384c747739622b5638494e4230387a67436743796f543063365334726651346a48564172494d764b717a556b2f507947394c622f787137737168386e790a4472745547474a3232784d7552396c7641397974457653355468425669596c3161626b7841304f61737a3775464c556237413531726a3936647a7766505870350a6541674162684b75476b7342327352693537376f35324b45506a46705556666a7a3179495541544d4d374d0a2d2d2d2066784c4e656832744651734e707a6f31782f59794d6e7635526f38416c654243516e667071693772446c380ab98ff74adc6c83dc1f8abdd5d8accd5e4b03c62c1157bbe9a881712164d94628aecf4e8d276d55ff090c783177b34f5f5fb8ad75cfe256008aea660ba04487968842d0dbf8f60525f94f9be3413dde0c360f1d2b72339d178605e9f05162cb5ffeafa1b2ffe65deee09b6f6c3025ac63525873293565a662c840a16167652d656e6372797074696f6e2e6f72672f76310a2d3e2058323535313920514f4d767377585969535368313430654e38545345486a6b513236496544586b2b636570506d4f2b53536b0a50466d4849322f446865496b3233314951546f7257635764656870706b6c6634505172764c6765764c6a510a2d2d2d2049726c735279574b72466e325876754841714f4c30324244547a664e6e30527436376945767a4d4335796f0a245dbacd7990d0847915e76f52faaaf447864a03f75c2514fee56fa7778b76486730ed0e7e7094"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_HEADER_BINDING", + "step": 15 + }, + { + "name": "SEALED_CONTROL_A + PAYLOAD_AGE_B", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001bea5006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a67492b4f36746b50507576754c6d3456314a4369713563794644554e463532634b662f49424f59532b50335557385053725068564c437337746d5a7634776c490a4564706c48647773384a5268715645484a686d65474f67583369712f445051684b574366584b564773396441437a654c69657352534c74796467582f6f416b380a62435948626e705136755561775854674a5342647748507232587a4e56733234454758492b3676375543770a2d2d2d204d696c6341336d6a3241486d6f2f54697257546e4930336354636c4d4f4c77382f534a6c6a686a7a5752450aacc6c2fbec0f13737228d95ea397df3a692a31594ca786e6c5666a76f652ad5f406f33660d664b94fc69a462763585489e3bc0b16f6f64995812014174cf818973841c6cc1ae4a449d14f58c7fa20aad0706451946bf4d093378491a71890c750bf31bbcd972d754d105ac97528422e621fb43815c3fd3280075776167652d656e6372797074696f6e2e6f72672f76310a2d3e2058323535313920514f4d767377585969535368313430654e38545345486a6b513236496544586b2b636570506d4f2b53536b0a50466d4849322f446865496b3233314951546f7257635764656870706b6c6634505172764c6765764c6a510a2d2d2d2049726c735279574b72466e325876754841714f4c30324244547a664e6e30527436376945767a4d4335796f0a245dbacd7990d0847915e76f52faaaf447864a03f75c2514fee56fa7778b76486730ed0e7e7094"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_INTEGRITY", + "step": 17 + }, + { + "name": "DateKey A + release of round B", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [] + }, + "release": { + "round": 1001, + "signature": "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_ROUND_MISMATCH", + "step": 10 + }, + { + "name": "chain hash changed", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [173, 64, "61626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162616261626162"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_PROFILE_MISMATCH", + "step": 8 + }, + { + "name": "version changed", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [4, 1, "02"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_UNSUPPORTED_VERSION", + "step": 2 + }, + { + "name": "flags != 0", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [5, 1, "80"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INVALID_FLAGS", + "step": 2 + }, + { + "name": "reserved != 0", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [7, 1, "01"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INVALID_FLAGS", + "step": 2 + }, + { + "name": "payload truncated", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [78798, 1, ""] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 17 + }, + { + "name": "payload age modified", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [78798, 1, "96"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 17 + }, + { + "name": "control modified", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [582, 1, "76"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 11 + }, + { + "name": "non-canonical dk1_ JSON", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 124, "7c000001bea5006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037856646b315f65794a325a584a7a61573975496a6f784c434169626d56306432397961794936496d5268644756725a586c7a4f6e463161574e72626d56304f6e597849697767496e4a766457356b496a6f784d4441776651"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_DATEKEY_NON_CANONICAL", + "step": 4 + }, + { + "name": "unknown profile", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 124, "76000001bea5006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037850646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d365a585a74626d56304f6e597849697769636d3931626d51694f6a45774d444239"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_UNKNOWN_PROFILE", + "step": 4 + }, + { + "name": "release of another round", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [] + }, + "release": { + "round": 1000, + "signature": "b33bf3667cbd5a82de3a24b4e0e9fe5513cc1a0e840368c6e31f5fcfa79bea03f73896b25883abf2853d10337fb8fa41" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_RELEASE_INVALID", + "step": 10 + }, + { + "name": "access_policy=time_only with time_and_key structure", + "spec": true, + "dkc": { + "base": "time_and_key_portable.dkc", + "edits": [ + [136, 1, "00"] + ] + }, + "dkk": "444b4b31010000000000008ca70073646174656b6579732d6163636573732d6b6579010102503955e944a3c60cfa1fd6485e9693c77d0350448e134a13457c319cab7fceaf7ffa1f04667832353531390558203d5e4d51f21236ecff40d89c0adcf9aa325a24b91b46fd9d1afa482f54b2d2c606a10058202e97878078bae6358037a9c264f379a3cbe839f767d69836b0343f35657b2972", + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 12 + }, + { + "name": "access_policy=time_and_key with time_only structure", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [136, 1, "01"] + ] + }, + "identities": [ + "AGE-SECRET-KEY-1G2PR0YP2Q6DHNQV9QPC7PFAC34AGUUU9CGJGJQCLJR3QLAUYPMGQ2LKA30" + ], + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 12 + }, + { + "name": "extra stanza in OUTER_TIME_AGE", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b4331010000000000007900000220a5006a646174656b657963617001010250cf1c8ae418eff0f668d7f12d583bf8cd037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a722b3546693932457845426a7378735a37412b7766387650356d326c343845426f306871384a4f614544556a497a5755736b746e302f2b334153727355694a430a46645a41492f465053786d676a45426a4d354276344b555978787a52356d6d5031334269493831554c69504932467647656d6339467a745030365a615a5442410a675163737531484c6770445a5244556e5473374f436c4a784e5254664d427330444a694f67675959616e550a2d3e20583235353139203251422b626e7750305347555653386848306e754362786f74442f4e6c73667949556a61596b63536e42630a38457241556e65542f594645634e6346464358437747547253556a755949557143632b6746424f377733730a2d2d2d2039534471755649444549384d45556271342f7a48764a4a503643334c75356c714849767a7a724267514a380a2048104484808179e97fdf12c12c589ffb81512f3c65b82683079fcbe64991a1306bd0243a848c5fdba78bc4ad90573e1b65cd334b175b95d67b7bcc94e517cb694c716023a49aafa0d318d8eea1753ab4812440af7daa663fdf3504f2a0cfe9924bb0e40b706600e471bc46c2132ed1973bc7719b9f26d19daa6e6167652d656e6372797074696f6e2e6f72672f76310a2d3e2058323535313920504934394a636c33556c6761666c532f7077565673565552326c684b5143566a525138656670524868544d0a776179557646495137594761735044597750774536317556454e762b58533235316a516f557458623151550a2d2d2d20504753645671536e4c6e6137776b556e66554a494f7055497133325a6f4a5a6452414e4b44503763634d490aafae0228c816da4648807696b39104d16b68ed2d505b7269ac69c76321d4ed43b1e44e92d69b9eb651b8a4280174e9f7ec"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 5 + }, + { + "name": "extra stanza in PAYLOAD_AGE", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001bea5006a646174656b657963617001010250e3a16b6e6f0336acd890d979fea4ecb3037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6c4d72326b35654d72564c4e44344576334a50347064597a6456574d4d496c4c6b517443704e2b7a727542392b775a774b6a726d34542b2b71456c374c79786d0a412f71486546512b412b785a704773687556514734574d32525252345054366e786f7a6e36573552593470536e5a58586c71416e763043413361444b416558620a4e745762674a39522b39645631796c4c4d584e7430444a67654251787450643135575563424f304e4370340a2d2d2d20557276696c5a38394865416474417a5474616d72473935724135573644713570616c3336755a6f755848550aacce4f981e3c57fa797ebe1a01613b5b9de05bbda109b7b83c54c6e2c63c33e81a0298e88d08e47184156670f5216f867c23e471b8b0229dcca8ee7e71649756e6a5feea270f56c0e0985416e9234023028114aa128e0b2bdf4f5c8e1cec4662eea2044cca845c6156dc127f9cf33a005aebef1a8a57c1f1515cb76167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392056707356532b37794a7463724976304756786748382f39526d4a434368513571706a5158677771324341490a734d4c39585a354a38523742624b74653135326a425a686a623078546665726a5677332f4e5047666f39590a2d3e20583235353139202b74566b4231753266553658784f666c474b354e4a306d6d686a71376a582b72475a7868696963465356450a78654e54413867786a6554363565722b4170704f3739695753326834457844565364786a463667796451410a2d2d2d20456c506a7a47303464654246344b50686d364378744153756a484f7474686c732b447a374574476c7a436f0a99892829c9f6c1191c249e4c91e536df4ea667166d7b369b2ec62153d4c1164e7b095dea99e31c7f73f6863910b5ffe096"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 6 + }, + { + "name": "non-X25519 stanza in INNER_ACCESS_AGE", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000002d6a5006a646174656b657963617001010250abd437cb5d8c8b56e96e2a163b11f560037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004016167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a743551754a6c384e3459536b616d59455a4a4943744645635661564d794b4e2b5646796f68504f37566e6c75325248306c4579614967376957315157542f48720a462b5a6752797656423438554543375865516d37416174712f6a53352f456d4232716d35416350745856616859666e786738612f7239435a344a5746614644730a4d5a6143434168634c477367306b65776e356a644c6877386545372f7572785a5470676d6244465542766b0a2d2d2d206b5741613768397368485141647a6e4f70666b6742447a4757476775366d38675441647973357a414146410a41e2ccbfbd78709e144ba877fcfbf975a857453dc4709fc2247ff57a356a4cdabe616e5c2431b04f7b720e800b5b9e91935e27035a4532bdb542a100ca254f812c4619dd5f7ffc744eaa3de875b5ddb21be1a4b0611bdc9e01eb1081c34e28a9f2d9887e891b475e06b369f633c95bc5f1c5fe961c286cb75cea3a7acd08422a9690744e5529b41965b5306ca65d729a2d1df678407e0e20d8fe819a8f0af46bb6301e5aa84558f6ab5a29766497478160344419170ca9003c1911f25eca48df8bf52bbe313b5630b0d0298bd91a624776cae3b7cfae8ee47e30bdc02016675b066db933ddda49b0fd76ac244011d090492caaebb4af136899377a9f681d6c21fbae8e3bd5cbc1f6056cd3ea5b0080314dbd6290addcade3ef8f42451181a060c767e79cd1a34a37a0b3594e402f9b5d5987b9c46dfac2d36f5f1581ad2e544ea1dd035e094562e621acbb22d97f2b90c6b1ba6d3e3685bd61082a68c3dbbe2bfb5e788a3aded25a1aef3fd2b68c1abde24c7ced78e83c26f4dbe40cc2ea587b99a2f1d7e0569dfb5c0714918bde9aef55c48d6167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392047695a49474f4d71386a4e5a3034633851675770694e7a704a5774733539744451325241346e5a4f5a33380a7333664b413376376f39427a6d347864782b616f7058476e705755475751436a326e7937532f52307256410a2d2d2d20305035624734416d453976553248674e495232486a6b7a4e6f74367844667942544c6d49442b6b6f4f59630a816a62bd612b6dee169cf465bf1519af7be6ec0255937c5752428cc5b7d969bddef5047f5ba1fb2f4c5ef1dd465e578b34"] + ] + }, + "identities": [ + "AGE-SECRET-KEY-1G2PR0YP2Q6DHNQV9QPC7PFAC34AGUUU9CGJGJQCLJR3QLAUYPMGQ2LKA30" + ], + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 12 + }, + { + "name": "tlock stanza round differs from DateKey.round", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001bea5006a646174656b657963617001010250e07930029f3f1c94936b910c293c3942037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303120353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a736664414f48784c4146475531796e714268444e6f7143302f33347359386b5664386e6a7a536952306276476b303158766e77514d7250575952364b6f7844320a425359584b5a4a594e3536454e346b436768334669437554496e356f4f346233486444636e467231686a43634b5442304f5362424a376847317345647a3945500a43394b6a466d365051325375706a69594b6d7a324c5259756867374c57366e47655a3241515665526a77380a2d2d2d20724279505962786f395071784c356f31553047556754386672476659754d4d6d4c30342f394833464352550abce15c9d03f838d7039650fdfbad0a3708b4ae795abedee03c3c5db9a178e46dd335c7776be7717f1ad69ec405632ef53614afe339bd2be071002cdb214e6fa3f927eee33fb639024be3206c428dfbd1924572eaed4d22de0d080846cd512b6ab20f0a2da4c923d496518ba79e18148f82d6d84fc39b0203ec76d96167652d656e6372797074696f6e2e6f72672f76310a2d3e2058323535313920496b4e77464f53765239516b366766554449694464562b6c4c5745334c71636f4c6e524d6c6e50537658730a6579795075416a4135345759556d5654336f615255724d486531724563753249634d716830426a656e66670a2d2d2d206135465a4e742b616951464d56474a426d797856765042474558725033457a6974766851472f372f3062770a7ec588991e7188748aa479f6244a93cbacdd822c3d794f6f7ce52c8f91fa6452e6fc4cbb79b7e94e9320c1f889cb5a2701"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_ROUND_MISMATCH", + "step": 8 + }, + { + "name": "tlock stanza chain hash differs from the pinned profile", + "spec": true, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001bea5006a646174656b6579636170010102502f016f62cddb637be4531196fd858abe037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020646264353036643665663736653566333836663431633635316463623830386335626362643735343731636334656166613366346466376164346534633439330a716757425a2f4c5979676e44744374753361632b336e4b6941426562797449455672624d714748363936786e6d705365676f4b734146563747787242477164340a4353756b3544636634356e5759542b556f7233346b7834547646706643635a37466168656168754574576e366f685a61666a4b3170394d52554a4345384546780a4a4f49316152336e55465170652b4c43793548527a4c57444270556e7a4355567a313757435966762b476b0a2d2d2d202b4e74654358434e2b6a6a464c67496f41727535764d4d44663931504e71794b52764378415531353675340a5c5ec56d687e72385d8e3c6f1fd80ef6051f155ae24c1888f94446835abcbbdf1b766b478bbac3f13669772680284dd8e0f59223b29689f93d9dbe3ed167a5f0925b34b62118d75ad82dee01f4ac593c15f5ab3f02c7e7b5a739c244d44a8047591fdc6e1e7f4652938cfee5449dec8c9c63c2036a46cc210f8bb96167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139206438785051576c787141506443346933443937375878483770565038472f4c644b426a74496e6b7a6a30550a446a4c4e4d6267655030746e534679685268467758562b384b7575345530542f34584a4e564a35446e52340a2d2d2d203762654579567638516170784c796c52347359356270776468645634676a4c374d764f546b6b4f775933550a931edca87d78ed596118b696d083f749058d1ef73f8c6b6b1024244998bcb44104be86579f168b0119eb058d3e10760e97"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_PROFILE_MISMATCH", + "step": 8 + }, + { + "name": "extension data of a type other than bstr", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 126, "9f000001bea6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a300716f72672e6578616d706c652e6c6162656c0101026c7075626c6963206c6162656c"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "empty extension data (h'')", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 126, "93000001bea6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a300716f72672e6578616d706c652e6c6162656c01010240"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "65 extensions in one array", + "spec": true, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [10, 127, "0590000001bea6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400069841a2006f6f72672e6578616d706c652e3030300101a2006f6f72672e6578616d706c652e3030310101a2006f6f72672e6578616d706c652e3030320101a2006f6f72672e6578616d706c652e3030330101a2006f6f72672e6578616d706c652e3030340101a2006f6f72672e6578616d706c652e3030350101a2006f6f72672e6578616d706c652e3030360101a2006f6f72672e6578616d706c652e3030370101a2006f6f72672e6578616d706c652e3030380101a2006f6f72672e6578616d706c652e3030390101a2006f6f72672e6578616d706c652e3031300101a2006f6f72672e6578616d706c652e3031310101a2006f6f72672e6578616d706c652e3031320101a2006f6f72672e6578616d706c652e3031330101a2006f6f72672e6578616d706c652e3031340101a2006f6f72672e6578616d706c652e3031350101a2006f6f72672e6578616d706c652e3031360101a2006f6f72672e6578616d706c652e3031370101a2006f6f72672e6578616d706c652e3031380101a2006f6f72672e6578616d706c652e3031390101a2006f6f72672e6578616d706c652e3032300101a2006f6f72672e6578616d706c652e3032310101a2006f6f72672e6578616d706c652e3032320101a2006f6f72672e6578616d706c652e3032330101a2006f6f72672e6578616d706c652e3032340101a2006f6f72672e6578616d706c652e3032350101a2006f6f72672e6578616d706c652e3032360101a2006f6f72672e6578616d706c652e3032370101a2006f6f72672e6578616d706c652e3032380101a2006f6f72672e6578616d706c652e3032390101a2006f6f72672e6578616d706c652e3033300101a2006f6f72672e6578616d706c652e3033310101a2006f6f72672e6578616d706c652e3033320101a2006f6f72672e6578616d706c652e3033330101a2006f6f72672e6578616d706c652e3033340101a2006f6f72672e6578616d706c652e3033350101a2006f6f72672e6578616d706c652e3033360101a2006f6f72672e6578616d706c652e3033370101a2006f6f72672e6578616d706c652e3033380101a2006f6f72672e6578616d706c652e3033390101a2006f6f72672e6578616d706c652e3034300101a2006f6f72672e6578616d706c652e3034310101a2006f6f72672e6578616d706c652e3034320101a2006f6f72672e6578616d706c652e3034330101a2006f6f72672e6578616d706c652e3034340101a2006f6f72672e6578616d706c652e3034350101a2006f6f72672e6578616d706c652e3034360101a2006f6f72672e6578616d706c652e3034370101a2006f6f72672e6578616d706c652e3034380101a2006f6f72672e6578616d706c652e3034390101a2006f6f72672e6578616d706c652e3035300101a2006f6f72672e6578616d706c652e3035310101a2006f6f72672e6578616d706c652e3035320101a2006f6f72672e6578616d706c652e3035330101a2006f6f72672e6578616d706c652e3035340101a2006f6f72672e6578616d706c652e3035350101a2006f6f72672e6578616d706c652e3035360101a2006f6f72672e6578616d706c652e3035370101a2006f6f72672e6578616d706c652e3035380101a2006f6f72672e6578616d706c652e3035390101a2006f6f72672e6578616d706c652e3036300101a2006f6f72672e6578616d706c652e3036310101a2006f6f72672e6578616d706c652e3036320101a2006f6f72672e6578616d706c652e3036330101a2006f6f72672e6578616d706c652e3036340101"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "magic", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [0, 1, "58"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INVALID_MAGIC", + "step": 1 + }, + { + "name": "a .dkk offered as a .dkc", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [2, 1, "4b"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INVALID_MAGIC", + "step": 1 + }, + { + "name": "empty file", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [0, 78799, ""] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INVALID_MAGIC", + "step": 1 + }, + { + "name": "truncated prelude", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [10, 78789, ""] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 1 + }, + { + "name": "PUBLIC_HEADER_LEN above the limit", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [9, 3, "100001"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 2 + }, + { + "name": "SEALED_CONTROL_LEN above the limit", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [12, 4, "04000001"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 2 + }, + { + "name": "truncated inside SEALED_CONTROL", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [147, 78652, ""] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 5 + }, + { + "name": "header schema version changed", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [30, 1, "02"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_UNSUPPORTED_VERSION", + "step": 4 + }, + { + "name": "unknown key in PUBLIC_HEADER", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 125, "7b000001bea6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830040007"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "undefined access_policy", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [136, 1, "02"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "access_policy 256 with a consistent header_binding", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b4331010000000000007b000001bea5006a646174656b6579636170010102504139c505614668ac638ccd277b8ac858037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830041901006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a716735774a69597a35414e6e3057443858326159465559593868684e654b4562747a6e38327649496871344b32366f79347865317537525233596c6d686879380a4367636a52516f4b4e413556674b65322f3138455139786573422f464953657a336d3458496a614e714166543075756f616a58665163716c565173514e61376f0a7032586f3255416c525955647477423961706152795975775364646741795737636237674b39656769736b0a2d2d2d2073516f5a69636875486738666947764361345a31764638495a4c4c41764c526a644232693749615344526b0a2984fc77430f02f662ca5b4bee9312746ef7de9fe4b16ffca613dc5112f3777108dfb9d3caafc478037a76e6bf8d5648799f867f5447ed7d08330edd5e6625dc65c121ab8b8f85f4037d721ad0d7f152e18f4c889319a313446fe8309de882cbef7fb82632ee7d61ac5c6d1d50fe517008e6ccc0a329f8651d21b66167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204c4b69506a484f566d7a4450773352536649753841676d5950327a52457875527a38572f6e4142553178550a59314d447658474e526b465966337367764f745469597577344c3769496a6474342b656772542f4d426f510a2d2d2d2043424934544a616e4c4168635564713248376d4b72577a7a4f6c37485a357770585068317a563646526d380a7cdfaa7c546b7b3d7369041837af39b5f37623bbb0aa8b52bb750a739e030fc1299a8735b07220723713ad1b1518544bce"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "access_policy 257 with a consistent header_binding", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b4331010000000000007b000001bea5006a646174656b6579636170010102502dc4f9e83148633f8f6caa8f2bbea7e5037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830041901016167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6b64483338556c314f684b35625a454d7879307a7a4c2f42504c335a6e4b6443683235736c634438736d6f425652665644686a6938746c5141685076456b38530a434b4e535a4967656f527558637a61617362344c4a454d704543334e483636722b49675338347850787651735a546f506c4a314e427170615a532f4d693669520a35307863754753737535575239694c4f714a4348506b7836706c62443434382b3042682b6f684b62485a4d0a2d2d2d20322b73524c3961787a4c68774652385542416f776d4c6c7044432f4f48594f53582b776639492f632b69450ad915d67c3c659115bf2e4ee1888216a31a5901a1bfb3610b9e37b69eeaaed3bc8233e8191bdd3fdc065d388d2c577100b49f6297261b425c41f4ee60f1986b45213ecba95be0c29b255221c32ff0fb0dd5cf77c149726f1e2c3da103a5ff90bdf3570d4e1c2fa20bdc8190fe7f6920969c07743999c41be3126db06167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139207936452f302b4b712b3747567775554d307941384f5336467a68724f6e6368744f5577663741376f757a590a7376387739314e47455a72575654336a6b30393238386d514670596553526b305655667346526c356356670a2d2d2d20587a79673667594274514f5832504775764368336b5253424a4c4a674b73444b55324852376c523072746f0a2c16b48c2582a61a3fa7b70582095d5b89562e0b37b0f40abe69d9bce4bb841fcb63552de5208549e2ff54135d25a57e72"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "unknown critical PUBLIC_HEADER extension", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b4331010000000000009c000001bea6006a646174656b657963617001010250923d1b8e0cbb78fbb8b891db77327959037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000581a200781b6f72672e6578616d706c652e6d7573742d756e6465727374616e6401016167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a736d484d6c3453434930437a666a702b442b54644c65755a51346c59675a417552544d4a364b46687a7a4153644453754f4646365149736e437349334f65386d0a466738707a6564627a4672774a4d38734f3941696e446344494d664d48495472777a4165556850612f385054384a6c4e37565445315a322b6665576f725549780a466f5136316f5165616a75727447706b304f4c344b5a4f6e4f49315967356b6b4a634a746764636c4147450a2d2d2d2030536268574f4656786c344555674363346a4a4178462b6e68374f495a4e3370516a6f723359422b6c50590acbbc28a6bbce6406e2decf3fa61a89952dc3ff3e82769ddcc62c5be78b5a506339601bbc2f8c699b39dc8af00267618bfa7566c172424d7f5cf7bac2d3cc600ca24d813e6b8c1cf572f428f60efde5987a7d20e38a6f3f0d55afa5abb41f8aafa65aff4b2cb4708385ed18a05ea4e034440fc0e2f74232ba3171656167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392037672f63454e626a7333575a54635675396b65584770597838346533326c427679344c746d704a524f52380a7556316a356e62364f354f4379652b4442536844686f4f556746396b4a5a53507461426b485333546538590a2d2d2d2039436a4275774f612b4f58656463552b6366377333793666742f4e54362f444b57597846674a37494e386f0af98e5d15848e6e2348798e9abf71ea85bd2850feb29a05d46bf6e386a9fa7ba492658cfe055c08d92c955a79f996cf1d09"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": false, + "frozen": true, + "error": "ERR_EXTENSION_CRITICAL_UNKNOWN", + "step": 4 + }, + { + "name": "unknown critical CONTROL_CBOR extension", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001e1a5006a646174656b657963617001010250fe4642a48817441a59752c6ddfcaf52a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6d47337473504c7759564a4a364e446d634a4546436b392b325a764d477947732f30505461324842774a6d32506a667064474b32387056324b3251755069542f0a45556969766c6e2f347a336671706c67356832544f2f6252557a644a38463146344a333234774562626655626a6b6f44344e5a4e4674513950714f6f67766a7a0a424161356532443042307a4b74766638364b375a7536524f3543462b47776f4373727230436c3339654d730a2d2d2d2062585351797153613168494973624b49564e4650624e41554672345663757a46417730595631746e6b50450ad04ae72d83d84ae257b1451461fdb72ec89de974b9c9dfdd7356e376608d056b0cd6a9c39feac40045c8e5541a0c3d30228d8d381020aa3c475497c492ea6f8ab37f32505c5b1f50625c910082116fe224e1f4860b872517e55041e2f9240cf2ff39d5ea104e1a1958d9497c5e241d70ee980e73af62f4fb8847cf2374bd61f5f0e3b68b6c6afe83fae7d74bef2df1b7a0484a9c8d2395ed8e486d5567e66167652d656e6372797074696f6e2e6f72672f76310a2d3e2058323535313920456c67706471496e532f63765842564c5258434f71786c707a4c30664e764e2b594b552b6a736656566a340a3263474d39754c79784a354f37477643753753584649446c68697471424459626154786f677a5231632b6b0a2d2d2d204e72615a483079326c774576715a493751785848776f50666f706d514b344a4d365a4978545852785834450aca028d443b8048915916bb338e96de3842e7765ed90bfb8ea125ace7bcb05e71fabc19d7bdc561210c88d46adcb3fd6e8b"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_EXTENSION_CRITICAL_UNKNOWN", + "step": 14 + }, + { + "name": "known critical PUBLIC_HEADER extension with invalid data", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b433101000000000000a0000001bea6006a646174656b657963617001010250abca02675b1fe7d19a66802ff3b6c2dd037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000581a300781b6f72672e6578616d706c652e6d7573742d756e6465727374616e64010102426b6f6167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a75502b416442592b7870786b6c6a525062326c674a424c4c4a2b4d386a316f2f502b31653349527956314a6d52394a4d56327136714b446f62717047703663700a42786467787a3059595967375862677a475741575972645a41706f473761727658717955656b4867445373644b504b4643667532654e425649452b432f412b680a2f76565359747a486c703661516a376f666663526d7542736e48513968687a54706c4363563345384963510a2d2d2d206c4a69696247715a34644442757a454e7a462f64476c41595a753544496f526c365179684145673461636b0a9cdb7fe6c5a2f869227dc1e388717d76d61393e86522cdc190bc743856be5c2b319855cd48bbda837728553b6adc74386b5919f1d5ac99f1c44b2f9952c4a28cf54b89317e82b6e6f53adade004fd9cd1c596fdf016128854b7c6d5598e12c85c254d4f7ce6bfe79a5b56751948c5bee687e7798997f4288a4cd236167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204d44636636346d4c7a47423032536231392f78706575637851394a3941385a6b6b396d453271536a6330590a553045684743597665394e5751544c47615176304c726243367a493845727672434566574c4749644433410a2d2d2d205875422f45574662656f794a7a356d413857364b35664b39795a79425368444546394137746b6e396543300a395c678a98a7dfd7aaa913e9b684a2f60419336e8a3a6a10e88db9276c7ebaab6b6e52a2294a3cc5e830d9b5aa99b50890"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "extensions": [ + { + "id": "org.example.must-understand", + "version": 1, + "valid_data": "6f6b" + } + ], + "network": false, + "frozen": true, + "error": "ERR_EXTENSION_DATA_INVALID", + "step": 4 + }, + { + "name": "known critical CONTROL_CBOR extension with invalid data", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001e5a5006a646174656b6579636170010102507c3c0bcb1c53370edeb09fc7a00df30d037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6739486953774e4c38342f686e544f415a746a53434138484e784c5762456d2f326f79495638416172367255736575426e54427a3246574b70454c536f3053540a4244415a33473352323254353647657a306b6f2f6b30675a626878554e76457455525670676f45317448777865465a4438614e3639366c54756d5048686f6d350a5045704c734b74444465677a645842326b765166536436753859476f495842747236645a5a4668306847590a2d2d2d203746435438376e697a7a326863773866745a4d4a35314e3248336a717378523470537377617a6e41704a670a53a3c590c9e1832a645f2ec5348a4efde9bd18bbb11d82efb96d258cb0c9a92e1333407e622403a971d68e04abd5d724583cc28b6e89548c11c0524f35b294c1d93ee68b21e3128e63c6af8ae9442aaa5c74436d8fb7ae2d6b48bd5b67f1b495a6658e0ef36f52f9f46d0e9cb0241e9457fb190dd747f0c81068d7c25b77d523e68bf4972ce3259f489c4f4ed30170c70fb3fb9e67eaee5eefd15cfce13e1fe3f93f6167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392059345355544337426a6c344239562f483043667a647a7478535145484979793048326d4b4c64413035426b0a3930457938764d56314e774333332f674b6157344e324d7874556f6c4c714d2b632f3162775a31397875770a2d2d2d206169624e576738766c6f57674c307a37656c4a3179475237494b6f6c2b41486272712f37345953615366380a116ff5faec36dc3ce211f2aec467b79fb39217da00ba25286cc220855bfc5429f95b06ea4f3ae396d7bf75b3faaa88f42c"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "extensions": [ + { + "id": "org.example.must-understand", + "version": 1, + "valid_data": "6f6b" + } + ], + "network": true, + "frozen": true, + "error": "ERR_EXTENSION_DATA_INVALID", + "step": 14 + }, + { + "name": "known critical .dkk extension with invalid data", + "spec": false, + "dkc": { + "base": "time_and_key_portable.dkc", + "edits": [] + }, + "dkk": "444b4b3101000000000000b3a80073646174656b6579732d6163636573732d6b6579010102503955e944a3c60cfa1fd6485e9693c77d0350448e134a13457c319cab7fceaf7ffa1f04667832353531390558203d5e4d51f21236ecff40d89c0adcf9aa325a24b91b46fd9d1afa482f54b2d2c606a10058202e97878078bae6358037a9c264f379a3cbe839f767d69836b0343f35657b29720781a300781b6f72672e6578616d706c652e6d7573742d756e6465727374616e64010102426b6f", + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "extensions": [ + { + "id": "org.example.must-understand", + "version": 1, + "valid_data": "6f6b" + } + ], + "network": false, + "frozen": false, + "error": "ERR_EXTENSION_DATA_INVALID", + "step": 9 + }, + { + "name": "extension_version above 2^32-1", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 125, "99000001bea6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a200716f72672e6578616d706c652e6c6162656c011b00000001000000"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "null extension data", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [11, 126, "93000001bea6006a646174656b657963617001010250ad4d676812b134ff8a3de263f77018b4037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a300716f72672e6578616d706c652e6c6162656c010102f6"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_NON_CANONICAL_CBOR", + "step": 4 + }, + { + "name": "time_and_key without credentials", + "spec": false, + "dkc": { + "base": "time_and_key_portable.dkc", + "edits": [] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_ACCESS_REQUIRED", + "step": 9 + }, + { + "name": ".dkk of another capsule", + "spec": false, + "dkc": { + "base": "time_and_key_portable.dkc", + "edits": [] + }, + "dkk": "444b4b31010000000000008ca70073646174656b6579732d6163636573732d6b657901010250b89292aedf6d05d584cec9a871ce87350350c75dfc8e9c576d1369910664df93693a046678323535313905582042d6d897097fd5af2772e058db17920afe1390e2856139bc2f800294564dd7ac06a100582069ac110380f5d768b5b6afaa157a50ed17d8ceccfbd4604ffa5b6da38539b635", + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_ACCESS_INVALID", + "step": 9 + }, + { + "name": "capsule_digest of the .dkk does not match", + "spec": false, + "dkc": { + "base": "time_and_key_portable.dkc", + "edits": [ + [1028, 1, "c1"] + ] + }, + "dkk": "444b4b31010000000000008ca70073646174656b6579732d6163636573732d6b6579010102503955e944a3c60cfa1fd6485e9693c77d0350448e134a13457c319cab7fceaf7ffa1f04667832353531390558203d5e4d51f21236ecff40d89c0adcf9aa325a24b91b46fd9d1afa482f54b2d2c606a10058202e97878078bae6358037a9c264f379a3cbe839f767d69836b0343f35657b2972", + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_ACCESS_INVALID", + "step": 9 + }, + { + "name": "identity that is not a recipient", + "spec": false, + "dkc": { + "base": "time_and_key_portable.dkc", + "edits": [] + }, + "identities": [ + "AGE-SECRET-KEY-1G2PR0YP2Q6DHNQV9QPC7PFAC34AGUUU9CGJGJQCLJR3QLAUYPMGQ2LKA30" + ], + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_ACCESS_INVALID", + "step": 13 + }, + { + "name": "round not reached yet", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:23.999999999Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_RELEASE_UNAVAILABLE", + "step": 9 + }, + { + "name": "release source unavailable", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [] + }, + "release": null, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_RELEASE_UNAVAILABLE", + "step": 9 + }, + { + "name": "trailing data after PAYLOAD_AGE", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [78799, 0, "00"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 17 + }, + { + "name": "payload stanza body modified", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [692, 1, "41"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_INTEGRITY", + "step": 17 + }, + { + "name": "tlock round edited by a third party", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [ + [171, 1, "31"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": false, + "frozen": false, + "error": "ERR_ROUND_MISMATCH", + "step": 8 + }, + { + "name": "empty registry", + "spec": false, + "dkc": { + "base": "time_only.dkc", + "edits": [] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "empty", + "network": false, + "frozen": false, + "error": "ERR_UNKNOWN_PROFILE", + "step": 4 + }, + { + "name": "time_only declared, time_and_key built by the creator", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b4331010000000000007900000286a5006a646174656b657963617001010250eba68e8138355246ac01d9911932042c037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004006167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a71444851786647764964397a4169354b76344e3735564d36302b5a64434e45446f5a68394e6a464f454d6a5a51625a6346536447664e653933777a374c376d2b0a416e5148624938317368384b4d4157782f2b333254736357637735584c526e72764447564e483042363254655049356434563157627971544463577849346f300a3830327442683663515a4537384a6933446e67656f4c65757459693263774a395966357078664e675462380a2d2d2d203330692f617771576866747a56564a3272445959303333374a754241724e7167316767554a3541737068770a58405e1215be567ddfea9fea50dc37a21bbe197d0bbd4196dc1043d9eb43320ca4e8b66a5b6620e1bb93f7d3a6bfb6de32b79b680895b91140e1db9484bc6f9aa023a88dedea23cf3bb871141903165e5e965921933658c0056bef6862e19bea2357c6236205b59be9b222841dd6d3fbc6ac8a0e72efbf39bc1ed6a197f1617ee005b8391c119631fec327df1239cd1401d959742af7ac7eda493d7689ae56ba82a4d1c6c0c2f64c92819f34bb35525c0a3ce122fc31cd8fd9dea81ca4871f6a068e8c9c79b3a6837bdaa9651217ada3d1cbf7d02eb7cf1631ec2688eea893f81439fcc11af68413a9c58d2c4a120dcc4ae999e7d0a993bb2a0c21ae7513515d53b35152cc5995a97650164c9eab0120b4be5f3645b061c1fed088839ed4691b997a214d95134c123db5b4f6d571e31647c518c97e5d9d11bed4a19e9e047b1907e1206167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392032674f2f784a506139626e7370346e706830563741783652385648434a63526e4e645134357961687852340a6133426143304e33326c45456958487374494c4e54735531673256427a36775a5a79536c465546573142630a2d2d2d2069712f58645a6a61772f4254485a6e7749663077322f6872524b496c4a4c4753682b7847524d57437457490a08845c17518f84c3c169c3ed5449984d5c815efbb55890d2d6870a598bd2a951d99668c7e3c61fcc3e11c3df1fd6128ca5"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 12 + }, + { + "name": "time_and_key declared, time_only built by the creator", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000001bea5006a646174656b65796361700101025057eacaff7bc9814a98046c4c68ca468d037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004016167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6c78796337346f6b4e3338796255486e796f7548345a585044626a365867474a4e69713968585838575851387a555855335349772b504c687a4c705a386a76730a443778382b3054764537584f38424e6b7365342f34476b72534d346a59724b377431494f6a627070754249696d3352394674692b2f61724b2b76486d51414d740a4b4873384a7a4d58744a53683773334e4a31344a3377726345564c564941303637305061594668652b61300a2d2d2d206b7454684f63646130563553374f5938644a767a746f30304d4b74786a7a724539612b69352b524a3578550a410f1bf2f34fa60a13c27607991777b928180c9cadca7d845f36a931eed847b56ebc12d1363493a794e5e7c1a6c552d30d0414900576c82578a0435aacf48b40ec10ed7f35e1efda3e210fafa365e78c1aa2917cc7dfba2846ff40ffabeaf0640a8910449409d77570178880e7f7e5563e1922e37aa3e0e46a9f626167652d656e6372797074696f6e2e6f72672f76310a2d3e2058323535313920594d444c6f705051466c73425a507466564f4a31374e38556e764656492b6d64564d32472b5563643847410a50533370574f3633304f6e526a7030682f614e564e492f4b4b5836436f3832626554753856366c377076300a2d2d2d20686658517378423864364c4d506b63456d3254754d75776d725042437248715555697270594e70666a6f6f0a4262ed452b397e38cb5f4f4280f9ceea7fff2bce2dfebe440ebb89f5e53a8469f22933a717e199942022ceb130766ce362"] + ] + }, + "identities": [ + "AGE-SECRET-KEY-1G2PR0YP2Q6DHNQV9QPC7PFAC34AGUUU9CGJGJQCLJR3QLAUYPMGQ2LKA30" + ], + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 12 + }, + { + "name": "two INNER_ACCESS_AGE stanzas for one recipient", + "spec": false, + "dkc": { + "edits": [ + [0, 0, "444b43310100000000000079000002e8a5006a646174656b65796361700101025065cb0d1fc1c72d136707c2285d34d602037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004016167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a696a34504775343173586c755a2b7943614c7743516f34357438517565687936694a384b527854703349324461486136626b6261585367675073776a687041610a416e756949674f5a6d6f36384249667a75347a6c412b6e57717a537745754d4242703636326d5339436a4f58663038483758656271464c3464367562524244320a797247517768417a484f42386d4a4f6d4f77596230466132726f7861512b2f66586a6d5944723053386a4d0a2d2d2d202b367a795958676b686a4a59484c454d746a4b70683571456c43486b716465346b62636d375639654458380aa9cd9c84e7cfac5bbd3d3b7894da6e579c56b720c7bd6de0c59e41e8cfdd0340d4045b285513107bc3247e6a5e2e54df7e1b96560de030f2af33d772d0ece5eae89681f26193bdfb066570af4d61708bb3461095cf57f5015a24dc21980bf0c0acc9bc3ea234ff9bf5b36ecdd78e78ac14528549d4a095063ee2b032fda952f48a4114e3b5313a8cb6f8150295ee1a275cd67897a57150a0c1c04c0ce56e5ee7ed5a4f4d0adfa203bf9adcecb8a1a94bd079d0a5d2080608a3181dedfe789c4c82001276066c849042a9cc7b286f2cbc2966fc196a43f13a3f8a5526f45e49d55189f831f1c5e1e14f78baa7eba6584ab6a0bde54bbc549541b6743d87a701a6b596940923a52861c4292fcd7e2ba081aa3a3277834df696aa80f012a08b535ccf185b3f38b2a889a0b67adf212af660f56e4444098ef3d9f0246566106f155f0b363a99c13af732d31707665cb70706b7c04ff8679f19db77683927443cb442cdeecb970775185e6f4d35e47e6adb764bc6d997f9c264133cf457b2b3abd01cb7cd0e4dcea0d71c7b24dab09611e8d59a8620c864af749e74b847306f3f55ce3a8d126f6e6167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139206d4a64704730666b3134764767337853556c445665645a7152644a497735694576693866484e466b5a52630a3065496e4f4f53792b30476d78515746506b335333344845685061734c696e4d4974456435456e6f5a336b0a2d2d2d206277344d34446a4459715879686553704f70314f746e6a344a4f363375574643657a3743315470635a47550a3ad4815c963d290c955dddc03d99ed4fda4a45acefe13c99efb5cc2dcc935641e7431274273aa210bcc8a44f0fa77c35fe"] + ] + }, + "identities": [ + "AGE-SECRET-KEY-1G2PR0YP2Q6DHNQV9QPC7PFAC34AGUUU9CGJGJQCLJR3QLAUYPMGQ2LKA30" + ], + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2024-08-23T15:09:27Z", + "registry": "default", + "network": true, + "frozen": true, + "error": "ERR_POLICY_STRUCTURE_MISMATCH", + "step": 13 + } + ] +}