diff --git a/src/lib/dkc/cms.test.ts b/src/lib/dkc/cms.test.ts index 11355bc..5a3ea8a 100644 --- a/src/lib/dkc/cms.test.ts +++ b/src/lib/dkc/cms.test.ts @@ -1,11 +1,14 @@ // Tests of cms.ts, the reader of the CMS signatures and the RFC 3161 tokens of -// spec v0.11 §29.10 and §29.11: the same cases as the tests of the Go package -// internal/cms, with signatures made by testing/cmsbuild.ts. +// spec v0.12 §29.10 and §29.11: the same cases as the tests of the Go package +// internal/cms at the draft v0.12 (cms_test.go, form_test.go, verify_test.go, +// cert_test.go, hostile_test.go), with signatures made by testing/cmsbuild.ts. import { describe, expect, it } from 'vitest'; import { sha256 } from '@noble/hashes/sha2.js'; import { + CertificateError, certHolder, + certIssuerHash, certIssuerName, certValidAt, checkSigner, @@ -17,32 +20,52 @@ import { parseToken, tokenImprintIsSHA256, } from './cms.ts'; -import { derContent, splitDer } from './der.ts'; -import { concatBytes, equalBytes, toHex } from './bytes.ts'; +import { compareBytes, concatBytes, equalBytes, toHex } from './bytes.ts'; +import { derContent } from './der.ts'; import * as b from './testing/cmsbuild.ts'; const from = new Date(Date.UTC(2025, 0, 1)); const to = new Date(Date.UTC(2030, 0, 1)); const now = new Date(Date.UTC(2026, 8, 30, 12)); -const nowInstant = { seconds: now.getTime() / 1000, nanos: 0 }; -const msg = new TextEncoder().encode('datekeys:dkc3:author-signature:v1\n00\n'); +const instant = (d: Date): { seconds: number; nanos: number } => ({ seconds: Math.floor(d.getTime() / 1000), nanos: (d.getTime() % 1000) * 1_000_000 }); +const te = new TextEncoder(); +const msg = te.encode('datekeys:dkc3:author-signature:v1\n00\n'); +const other = te.encode('other'); +const subject = te.encode('seal subject'); + +const ecKey = await b.newKey('P-256'); +const ecKey2 = await b.newKey('P-256'); +const rsaKey = await b.newKey('rsa', 2048); +const p384Key = await b.newKey('P-384'); +const p521Key = await b.newKey('P-521'); +const ana = b.newCert({ cn: 'Ana López', from, to }, ecKey); +const luis = b.newCert({ cn: 'Luis Gómez', from, to }, rsaKey); +const tsa = b.newCert({ cn: 'TSA de prueba', from, to }, ecKey2); +const tok = (sig: Uint8Array): Promise => b.token(sig, now, {}, tsa); + +// The result of the signature of the first SignerInfo of der over msg. +function resultOf(der: Uint8Array): string { + return checkSigner(parseSignature(der).signers[0]!, msg); +} + +// The path of the signerInfos of a signature or a token, and of its first SignerInfo. +const signerInfosPath = (der: Uint8Array): number[] => [...b.SIGNED_DATA, b.children(b.at(der, ...b.SIGNED_DATA)).length - 1]; +const firstSignerInfo = (der: Uint8Array): number[] => [...signerInfosPath(der), 0]; +const reversed = (x: Uint8Array): Uint8Array => b.tlv(x[0]!, ...b.children(x).reverse()); +const replace = (e: Uint8Array) => (): Uint8Array => e; describe('the signature algorithms of the table', () => { it('verifies RSA PKCS #1 and PSS with SHA-2, ECDSA on the three curves, and a signer named by subjectKeyIdentifier', async () => { - const rsa = await b.newRSA('Ana López', 2048, from, to); - const p256 = await b.newECDSA('Luis', 'P-256', from, to); - const p384 = await b.newECDSA('Eva', 'P-384', from, to); - const p521 = await b.newECDSA('Raúl', 'P-521', from, to); + const p384 = b.newCert({ cn: 'Eva', from, to }, p384Key); + const p521 = b.newCert({ cn: 'Raúl', from, to }, p521Key); const cases: [string, b.Options, b.Signer][] = [ - ['RSA PKCS1 SHA-256', {}, rsa], - ['RSA PKCS1 SHA-384', { hash: 'SHA-384' }, rsa], - ['RSA PKCS1 SHA-512', { hash: 'SHA-512' }, rsa], - ['RSA PSS SHA-256', { pss: true }, rsa], - ['RSA PSS SHA-384', { pss: true, hash: 'SHA-384' }, rsa], - ['RSA PSS SHA-512', { pss: true, hash: 'SHA-512' }, rsa], - ['RSA by subjectKeyIdentifier', { ski: true }, rsa], - ['ECDSA P-256', {}, p256], - ['ECDSA P-256 with SHA-384', { hash: 'SHA-384' }, p256], + ['RSA PKCS1 SHA-256', {}, luis], + ['RSA PKCS1 SHA-384', { hash: 'SHA-384' }, luis], + ['RSA PKCS1 SHA-512', { hash: 'SHA-512' }, luis], + ['RSA PSS SHA-256', { pss: true }, luis], + ['RSA PSS SHA-512', { pss: true, hash: 'SHA-512' }, luis], + ['RSA by subjectKeyIdentifier', { ski: true }, luis], + ['ECDSA P-256', {}, ana], ['ECDSA P-384 SHA-384', { hash: 'SHA-384' }, p384], ['ECDSA P-521 SHA-512', { hash: 'SHA-512' }, p521], ]; @@ -52,289 +75,880 @@ describe('the signature algorithms of the table', () => { const si = sd.signers[0]!; expect(equalBytes(si.cert.hash, sha256(signer.cert)), name).toBe(true); expect(checkSigner(si, msg), name).toBe('valid'); - expect(checkSigner(si, new TextEncoder().encode('another message')), name).toBe('invalid'); + expect(checkSigner(si, te.encode('another message')), name).toBe('invalid'); } }); - it('refuses what the table does not have: a key of 1024 bits, PSS written with its default, and a bit of the signature', async () => { - const small = await b.newRSA('Chica', 1024, from, to); - const sd = parseSignature(await b.signature(msg, {}, small)); - expect(checkSigner(sd.signers[0]!, msg)).toBe('not verifiable'); - - const rsa = await b.newRSA('Luis', 2048, from, to); - const trailer = parseSignature(await b.signature(msg, { pss: true, pssTrailer: true }, rsa)); - expect(checkSigner(trailer.signers[0]!, msg)).toBe('not verifiable'); + // Spec §29.10, "Algoritmos" and step 2 of "Verificación": the closed table of algorithms, and a key of another scheme + // than its algorithm, which is invalid and not outside the table (step 3). + it('gives each algorithm and each combination its result, a key of another scheme invalid', async () => { + const { algID, NULL, OID, tlv, seq, int } = b; + const h0 = tlv(0xa0, b.hashAlg('SHA-256')); + const m1 = tlv(0xa1, algID(OID.mgf1, b.hashAlg('SHA-256'))); + const s2 = tlv(0xa2, int(32)); + const pss = (...f: Uint8Array[]): Uint8Array => algID(OID.pss, seq(...f)); + const p384 = b.newCert({ cn: 'P-384', from, to }, p384Key); + const p521 = b.newCert({ cn: 'P-521', from, to }, p521Key); + const sha256Alg = (...params: Uint8Array[]): Uint8Array => algID(OID.sha['SHA-256'], ...params); + const cases: [string, b.Signer, b.Options, string][] = [ + ['SHA-1, ECDSA', ana, { digestAlg: b.hashAlg('SHA-1') }, 'not verifiable'], + ['SHA-1, RSA', luis, { digestAlg: b.hashAlg('SHA-1') }, 'not verifiable'], + ['SHA-1, and another message', ana, { digestAlg: b.hashAlg('SHA-1'), message: other }, 'not verifiable'], + ['SHA-256 with NULL', ana, { digestAlg: sha256Alg(NULL) }, 'valid'], + ['SHA-256 with an INTEGER', ana, { digestAlg: sha256Alg(int(0)) }, 'not verifiable'], + ['P-256 with SHA-384', ana, { hash: 'SHA-384' }, 'valid'], + ['P-256 with SHA-512', ana, { hash: 'SHA-512' }, 'valid'], + ['P-384 with SHA-384', p384, { hash: 'SHA-384' }, 'valid'], + ['P-521 with SHA-512', p521, { hash: 'SHA-512' }, 'valid'], + ['P-521 with SHA-256', p521, {}, 'valid'], + ['rsaEncryption', luis, {}, 'valid'], + ['rsaEncryption without parameters', luis, { sigAlg: algID(OID.rsa) }, 'valid'], + ['rsaEncryption with an INTEGER', luis, { sigAlg: algID(OID.rsa, int(0)) }, 'not verifiable'], + ['rsaEncryption with SHA-512', luis, { hash: 'SHA-512' }, 'valid'], + ['sha256WithRSAEncryption', luis, { sigAlg: algID(OID.sha256RSA, NULL) }, 'valid'], + ['sha256WithRSAEncryption without NULL', luis, { sigAlg: algID(OID.sha256RSA) }, 'valid'], + ['sha256WithRSAEncryption, INTEGER', luis, { sigAlg: algID(OID.sha256RSA, int(0)) }, 'not verifiable'], + ['sha256WithRSAEncryption, SHA-384', luis, { hash: 'SHA-384', sigAlg: algID(OID.sha256RSA, NULL) }, 'not verifiable'], + ['sha384WithRSAEncryption', luis, { hash: 'SHA-384', sigAlg: algID(OID.sha384RSA, NULL) }, 'valid'], + ['sha384WithRSAEncryption, SHA-256', luis, { sigAlg: algID(OID.sha384RSA, NULL) }, 'not verifiable'], + ['sha512WithRSAEncryption', luis, { hash: 'SHA-512', sigAlg: algID(OID.sha512RSA, NULL) }, 'valid'], + ['sha512WithRSAEncryption, SHA-256', luis, { sigAlg: algID(OID.sha512RSA, NULL) }, 'not verifiable'], + ['ecdsa-with-SHA256 with NULL', ana, { sigAlg: algID(OID.ecdsa['SHA-256'], NULL) }, 'not verifiable'], + ['ecdsa-with-SHA256, SHA-384', ana, { hash: 'SHA-384', sigAlg: algID(OID.ecdsa['SHA-256']) }, 'not verifiable'], + ['ecdsa-with-SHA384, SHA-256', ana, { sigAlg: algID(OID.ecdsa['SHA-384']) }, 'not verifiable'], + ['ecdsa-with-SHA512, SHA-256', ana, { sigAlg: algID(OID.ecdsa['SHA-512']) }, 'not verifiable'], + ['an algorithm outside the table', ana, { sigAlg: algID('1.3.101.112') }, 'not verifiable'], + ['an algorithm with an arc of 2^31', ana, { sigAlg: seq(tlv(0x06, b.hex('2a8648ce3d04038880808000'))) }, 'not verifiable'], + ['another algorithm, an RSA key', luis, { sigAlg: algID('1.3.101.112') }, 'not verifiable'], + ['another algorithm with PSS parameters', luis, { pss: true, sigAlg: algID('1.2.3.4', seq(h0, m1, s2)) }, 'not verifiable'], + ['PSS', luis, { pss: true }, 'valid'], + ['PSS with SHA-384', luis, { pss: true, hash: 'SHA-384' }, 'valid'], + ['PSS, its fields written again', luis, { pss: true, sigAlg: pss(h0, m1, s2) }, 'valid'], + ['PSS with NULL in its hashes', luis, { pss: true, sigAlg: pss(tlv(0xa0, sha256Alg(NULL)), tlv(0xa1, algID(OID.mgf1, sha256Alg(NULL))), s2) }, 'valid'], + ['PSS without parameters', luis, { pss: true, sigAlg: algID(OID.pss) }, 'not verifiable'], + ['PSS with NULL parameters', luis, { pss: true, sigAlg: algID(OID.pss, NULL) }, 'not verifiable'], + ['PSS parameters as a SET', luis, { pss: true, sigAlg: algID(OID.pss, tlv(0x31, h0, m1, s2)) }, 'not verifiable'], + ['PSS with [0] of two elements', luis, { pss: true, sigAlg: pss(tlv(0xa0, b.hashAlg('SHA-256'), NULL), m1, s2) }, 'not verifiable'], + ['PSS with [0] primitive', luis, { pss: true, sigAlg: pss(tlv(0x80, b.hashAlg('SHA-256')), m1, s2) }, 'not verifiable'], + ['PSS with [1] before [0]', luis, { pss: true, sigAlg: pss(m1, h0, s2) }, 'not verifiable'], + ['PSS with [0] twice', luis, { pss: true, sigAlg: pss(h0, h0, m1, s2) }, 'not verifiable'], + ['PSS of SHA-512 with SHA-256', luis, { pss: true, sigAlg: pss(tlv(0xa0, b.hashAlg('SHA-512')), m1, s2) }, 'not verifiable'], + ['PSS with a hash of an INTEGER', luis, { pss: true, sigAlg: pss(tlv(0xa0, sha256Alg(int(0))), m1, s2) }, 'not verifiable'], + ['PSS with a hash without an OID', luis, { pss: true, sigAlg: pss(tlv(0xa0, seq(int(0))), m1, s2) }, 'not verifiable'], + ['PSS with another mask', luis, { pss: true, sigAlg: pss(h0, tlv(0xa1, algID('1.2.840.113549.1.1.9', b.hashAlg('SHA-256'))), s2) }, 'not verifiable'], + ['PSS with MGF1 without its hash', luis, { pss: true, sigAlg: pss(h0, tlv(0xa1, algID(OID.mgf1)), s2) }, 'not verifiable'], + ['PSS with MGF1 not an algorithm', luis, { pss: true, sigAlg: pss(h0, tlv(0xa1, seq(int(1))), s2) }, 'not verifiable'], + ['PSS with MGF1 of SHA-512', luis, { pss: true, sigAlg: pss(h0, tlv(0xa1, algID(OID.mgf1, b.hashAlg('SHA-512'))), s2) }, 'not verifiable'], + ['PSS with MGF1 of a hash with INTEGER', luis, { pss: true, sigAlg: pss(h0, tlv(0xa1, algID(OID.mgf1, sha256Alg(int(0)))), s2) }, 'not verifiable'], + ['PSS with MGF1 of a hash without OID', luis, { pss: true, sigAlg: pss(h0, tlv(0xa1, algID(OID.mgf1, seq(int(0)))), s2) }, 'not verifiable'], + ['PSS with a salt of 20', luis, { pss: true, sigAlg: pss(h0, m1, tlv(0xa2, int(20))) }, 'not verifiable'], + ['PSS with a salt in OCTETS', luis, { pss: true, sigAlg: pss(h0, m1, tlv(0xa2, b.octets(Uint8Array.of(32)))) }, 'not verifiable'], + ['PSS with a salt of 2^64 + 32', luis, { pss: true, sigAlg: pss(h0, m1, tlv(0xa2, b.intBytes(b.hex('010000000000000020')))) }, 'not verifiable'], + ['PSS with a negative salt', luis, { pss: true, sigAlg: pss(h0, m1, tlv(0xa2, int(-224))) }, 'not verifiable'], + ['PSS with trailerField', luis, { pss: true, pssTrailer: true }, 'not verifiable'], + ['PSS with a field [4]', luis, { pss: true, sigAlg: pss(h0, m1, s2, tlv(0xa4, int(1))) }, 'not verifiable'], + ['PSS without [0]', luis, { pss: true, sigAlg: pss(m1, s2) }, 'not verifiable'], + ['PSS without [1]', luis, { pss: true, sigAlg: pss(h0, s2) }, 'not verifiable'], + ['PSS without [2]', luis, { pss: true, sigAlg: pss(h0, m1) }, 'not verifiable'], + ['step 3: an RSA key with ECDSA', luis, { sigAlg: algID(OID.ecdsa['SHA-256']) }, 'invalid'], + ['step 3: an EC key with PKCS #1', ana, { sigAlg: algID(OID.rsa, NULL) }, 'invalid'], + ['step 3: an EC key with PSS', ana, { sigAlg: pss(h0, m1, s2) }, 'invalid'], + ['step 3: PKCS #1, a bit flipped', luis, { corruptSignature: true }, 'invalid'], + ['step 3: PSS, a bit flipped', luis, { pss: true, corruptSignature: true }, 'invalid'], + ['step 3: ECDSA, a bit flipped', ana, { corruptSignature: true }, 'invalid'], + ['step 3: the digest of another message', ana, { message: other }, 'invalid'], + ]; + for (const [name, signer, o, want] of cases) expect(resultOf(await b.signature(msg, o, signer)), name).toBe(want); + }); - const good = parseSignature(await b.signature(msg, { pss: true }, rsa)).signers[0]!; - const flipped = { ...good, signature: good.signature.map((x, i) => (i === 10 ? x ^ 1 : x)) }; - expect(checkSigner(flipped, msg)).toBe('invalid'); - const short = { ...good, signature: good.signature.subarray(1) }; - expect(checkSigner(short, msg)).toBe('invalid'); - const pkcs1 = parseSignature(await b.signature(msg, {}, rsa)).signers[0]!; - expect(checkSigner({ ...pkcs1, signature: pkcs1.signature.map((x, i) => (i === 3 ? x ^ 1 : x)) }, msg)).toBe('invalid'); + it('refuses the value of a signature written in another way', async () => { + const pss = parseSignature(await b.signature(msg, { pss: true }, luis)).signers[0]!; + expect(checkSigner({ ...pss, signature: pss.signature.map((x, i) => (i === 10 ? x ^ 1 : x)) }, msg)).toBe('invalid'); + expect(checkSigner({ ...pss, signature: pss.signature.subarray(1) }, msg)).toBe('invalid'); + expect(checkSigner({ ...pss, signature: concatBytes(Uint8Array.of(0), pss.signature) }, msg)).toBe('invalid'); + expect(checkSigner({ ...pss, signature: new Uint8Array(pss.signature.length).fill(0xff) }, msg)).toBe('invalid'); + const pkcs1 = parseSignature(await b.signature(msg, {}, luis)).signers[0]!; expect(checkSigner({ ...pkcs1, signature: pkcs1.signature.subarray(1) }, msg)).toBe('invalid'); - - const ec = parseSignature(await b.signature(msg, {}, await b.newECDSA('Ana', 'P-256', from, to))).signers[0]!; - expect(checkSigner({ ...ec, signature: ec.signature.map((x, i) => (i === ec.signature.length - 3 ? x ^ 1 : x)) }, msg)).toBe('invalid'); + expect(checkSigner({ ...pkcs1, signature: new Uint8Array(pkcs1.signature.length).fill(0xff) }, msg)).toBe('invalid'); + const ec = parseSignature(await b.signature(msg, {}, ana)).signers[0]!; expect(checkSigner({ ...ec, signature: Uint8Array.of(1, 2, 3) }, msg)).toBe('invalid'); - }); - - it('reads a co-signature, with the holder and the issuer of each certificate and their validity', async () => { - const a = await b.newECDSA('Ana', 'P-256', from, to); - const l = await b.newRSA('Banco S.A.', 2048, from, to); - const sd = parseSignature(await b.signature(msg, {}, a, l)); - expect([sd.signers.length, sd.certs.length]).toEqual([2, 2]); - for (const s of sd.signers) expect(checkSigner(s, msg)).toBe('valid'); - const holders = sd.signers.map((s) => certHolder(s.cert)).sort(); - expect(holders).toEqual(['Ana', 'Banco S.A.']); - expect(certIssuerName(sd.signers[0]!.cert)).not.toBe(''); - expect(certValidAt(sd.certs[0]!, nowInstant)).toBe(true); - expect(certValidAt(sd.certs[0]!, { seconds: from.getTime() / 1000 - 1, nanos: 0 })).toBe(false); - expect(certValidAt(sd.certs[0]!, { seconds: to.getTime() / 1000 + 1, nanos: 0 })).toBe(false); - // The crls of a signature hold OCSP responses. - const withOCSP = parseSignature(await b.signature(msg, { ocsp: b.octets(Uint8Array.of(1, 2, 3)) }, a)); - expect(withOCSP.ocsp).toHaveLength(1); - }); - - it('names a certificate by its givenName and surname, or by the attributes of its issuer when it has no commonName', async () => { - const g = await b.newECDSA('Ana López', 'P-256', from, to, 'given-surname'); - const o = await b.newECDSA('Sin nombre', 'P-256', from, to, 'organization'); - const sd = parseSignature(await b.signature(msg, {}, g, o)); - const byName = new Map(sd.signers.map((s) => [certHolder(s.cert), s.cert])); - expect([...byName.keys()].sort()).toEqual(['', 'Ana López']); - expect(certIssuerName(byName.get('')!)).toBe('O=DateKeys test'); - expect(certIssuerName(byName.get('Ana López')!)).toBe('O=DateKeys test,GN=2.5.4.42=#0c03416e61'.length > 0 ? certIssuerName(byName.get('Ana López')!) : ''); + expect(checkSigner({ ...ec, signature: concatBytes(ec.signature, Uint8Array.of(0)) }, msg)).toBe('invalid'); }); }); -describe('a token over a signature', () => { - it('is read with its time, accuracy, authority and imprint, and seals the signature value and nothing else', async () => { - const a = await b.newECDSA('Ana', 'P-256', from, to); - const tsa = await b.newRSA('TSA de prueba', 2048, from, to); - const sd = parseSignature(await b.signature(msg, { token: (sig) => b.token(sig, now, { accuracySeconds: 2 }, tsa) }, a)); - expect(sd.signers[0]!.token).toBeDefined(); - const token = parseToken(sd.signers[0]!.token!); - expect([token.genTime, token.accuracy]).toEqual([nowInstant, { seconds: 2, nanos: 0 }]); - expect(certHolder(token.tsa)).toBe('TSA de prueba'); - expect(tokenImprintIsSHA256(token)).toBe(true); - expect(checkToken(token, sd.signers[0]!.signature)).toBe(true); - expect(checkToken(token, new TextEncoder().encode('other'))).toBe(false); - }); - - it('is not valid for another imprint or for a time outside the validity of the authority', async () => { - const tsa = await b.newECDSA('TSA', 'P-256', from, to); - const old = await b.newECDSA('TSA caducada', 'P-256', from, new Date(Date.UTC(2026, 0, 1))); - const subject = new TextEncoder().encode('seal subject'); - expect(checkToken(parseToken(await b.token(subject, now, {}, tsa)), subject)).toBe(true); - expect(checkToken(parseToken(await b.token(subject, now, { imprint: new Uint8Array(32).fill(1) }, tsa)), subject)).toBe(false); - expect(checkToken(parseToken(await b.token(subject, now, {}, old)), subject)).toBe(false); - }); - - it('refuses a token whose form breaks the profile (S2) or whose algorithms are outside the table (S1)', async () => { - const tsa = await b.newECDSA('TSA', 'P-256', from, to); - const subject = new TextEncoder().encode('seal subject'); - const good = b.genTimeOf(now); - const info = (g: Uint8Array, ...after: Uint8Array[]): Promise => b.tstInfo(subject, g, {}, ...after); - const form: [string, Uint8Array | Promise][] = [ - ['a TSTInfo of version 2', b.tstInfo(subject, good, { version: 2 })], - ['a negative accuracy', info(good, b.seq(b.int(-31536000)))], - ['an accuracy that overflows', info(good, b.seq(b.int(9223372037)))], - ['millis of 0', info(good, b.seq(b.tlv(0x80, Uint8Array.of(0))))], - ['millis of 5000', info(good, b.seq(b.tlv(0x80, Uint8Array.of(0x13, 0x88))))], - ['micros of 0', info(good, b.seq(b.tlv(0x81, Uint8Array.of(0))))], - ['a negative millis', info(good, b.seq(b.tlv(0x80, Uint8Array.of(0x80))))], - ['an accuracy with a field out of place', info(good, b.seq(b.tlv(0x81, Uint8Array.of(1)), b.tlv(0x80, Uint8Array.of(1))))], - ['genTime with an offset', info(b.generalizedTime('20260930130000+0100'))], - ['genTime with a trailing zero', info(b.generalizedTime('20260930120000.50Z'))], - ['genTime without seconds', info(b.generalizedTime('202609301200Z'))], - ['genTime that does not exist', info(b.generalizedTime('20261331120000Z'))], - // Go reads the bytes, and its genTime does not parse; a TextDecoder would drop the U+FEFF. - ['genTime after a byte order mark', info(b.generalizedTime('\u{feff}20260930120000Z'))], - ['ordering FALSE written', info(good, b.tlv(0x01, Uint8Array.of(0)))], - ['an extra INTEGER at the end', info(good, b.int(7), b.int(8), b.int(9))], - ['a field out of order', info(good, b.int(7), b.seq(b.int(1)))], - ['a reserved tag in the extensions', info(good, b.tlv(0xa1, b.tlv(0x0e, Uint8Array.of(0x41))))], - ['a TSTInfo that is not a SEQUENCE', b.int(1)], - ['a short TSTInfo', b.seq(b.int(1))], - ['a policy that is not an OID', b.seq(b.int(1), b.int(2), b.seq(), b.int(3), good)], - ['a messageImprint that is not two fields', b.seq(b.int(1), b.oid('1.2.3'), b.seq(b.int(1)), b.int(3), good)], - ['a messageImprint of the wrong length', b.tstInfo(subject, good, { imprint: new Uint8Array(31) })], +describe('the keys of the table', () => { + // RSA with NULL parameters, exactly a modulus and an exponent, the modulus odd of 2048 to 4096 bits and the exponent + // odd from 3 to 2^31 - 1; EC on P-256, P-384 or P-521, the point uncompressed and on the curve. Any other is not + // verifiable; a key of the table that does not verify the signature is invalid. + it('gives each key its result', async () => { + const { n, e } = b.rsaPublic(rsaKey); + const { algID, NULL, OID, seq, int, bitString, octets, spkiRSA, spkiEC, tlv } = b; + const two = (bits: number): bigint => (1n << BigInt(bits)) + 1n; + const key = (...fields: Uint8Array[]): Uint8Array => bitString(seq(...fields)); + const rsaAlg = algID(OID.rsa, NULL); + const ecAlg = algID(OID.ecPublicKey, b.oid(OID.p256)); + const point = b.uncompressed(ecKey); + const off = point.map((x, i) => (i === point.length - 1 ? x ^ 1 : x)); + let even = ecKey2; + while ((b.uncompressed(even).at(-1)! & 1) !== 0) even = await b.newKey('P-256'); + const cases: [string, Uint8Array, b.Key, string][] = [ + ['RSA of 2048 bits', spkiRSA(n, e), rsaKey, 'valid'], + ['RSA of 2047 bits', spkiRSA(two(2046), e), rsaKey, 'not verifiable'], + ['RSA of 4096 bits that is another', spkiRSA(two(4095), e), rsaKey, 'invalid'], + ['RSA of 4097 bits', spkiRSA(two(4096), e), rsaKey, 'not verifiable'], + ['an even modulus', spkiRSA(n + 1n, e), rsaKey, 'not verifiable'], + ['a negative modulus', spkiRSA(-n, e), rsaKey, 'not verifiable'], + ['an exponent of 1', spkiRSA(n, 1n), rsaKey, 'not verifiable'], + ['an exponent of 3', spkiRSA(n, 3n), rsaKey, 'invalid'], + ['an even exponent', spkiRSA(n, 65536n), rsaKey, 'not verifiable'], + ['an exponent of 2^31 - 1', spkiRSA(n, 2n ** 31n - 1n), rsaKey, 'invalid'], + ['an exponent of 2^31 + 1', spkiRSA(n, 2n ** 31n + 1n), rsaKey, 'not verifiable'], + ['an exponent of 2^64 + 65537', spkiRSA(n, 2n ** 64n + e), rsaKey, 'not verifiable'], + ['a negative exponent', spkiRSA(n, -1n), rsaKey, 'not verifiable'], + ['an RSAPublicKey with a byte more', seq(rsaAlg, bitString(concatBytes(seq(int(n), int(e)), Uint8Array.of(0)))), rsaKey, 'not verifiable'], + ['an RSAPublicKey as a SET', seq(rsaAlg, bitString(tlv(0x31, int(n), int(e)))), rsaKey, 'not verifiable'], + ['an RSAPublicKey of three INTEGERs', seq(rsaAlg, key(int(n), int(e), int(1))), rsaKey, 'not verifiable'], + ['an RSAPublicKey that is an INTEGER', seq(rsaAlg, bitString(int(n))), rsaKey, 'not verifiable'], + ['a modulus in OCTETS', seq(rsaAlg, key(octets(concatBytes(Uint8Array.of(0), b.bigBytes(n))), int(e))), rsaKey, 'not verifiable'], + ['an exponent in OCTETS', seq(rsaAlg, key(int(n), octets(b.bigBytes(e)))), rsaKey, 'not verifiable'], + ['rsaEncryption without NULL', seq(algID(OID.rsa), key(int(n), int(e))), rsaKey, 'not verifiable'], + ['an RSA key of id-RSASSA-PSS', seq(algID(OID.pss, NULL), key(int(n), int(e))), rsaKey, 'not verifiable'], + ['an SPKI of three elements', seq(rsaAlg, key(int(n), int(e)), NULL), rsaKey, 'not verifiable'], + ['an SPKI whose key is OCTETS', seq(rsaAlg, octets(concatBytes(Uint8Array.of(0), seq(int(n), int(e))))), rsaKey, 'not verifiable'], + ['an SPKI whose algorithm is a SET', seq(tlv(0x31, b.oid(OID.rsa), NULL), key(int(n), int(e))), rsaKey, 'not verifiable'], + ['an SPKI of no algorithm', seq(seq(int(1)), key(int(n), int(e))), rsaKey, 'not verifiable'], + ['P-256', spkiEC(b.oid(OID.p256), point), ecKey, 'valid'], + ['a compressed point', spkiEC(b.oid(OID.p256), b.compressed(ecKey)), ecKey, 'not verifiable'], + ['a point off the curve', spkiEC(b.oid(OID.p256), off), ecKey, 'not verifiable'], + ['a point of P-256 said P-384', spkiEC(b.oid(OID.p384), point), ecKey, 'not verifiable'], + ['brainpoolP256r1', spkiEC(b.oid(OID.brainpoolP256), point), ecKey, 'not verifiable'], + ['a point of P-521, another curve', spkiEC(b.oid(OID.brainpoolP256), b.uncompressed(p521Key)), p521Key, 'not verifiable'], + ['id-ecPublicKey without a curve', seq(algID(OID.ecPublicKey), bitString(point)), ecKey, 'not verifiable'], + ['id-ecPublicKey with NULL', spkiEC(NULL, point), ecKey, 'not verifiable'], + ['an EC key of id-ecDH', seq(algID('1.3.132.1.12', b.oid(OID.p256)), bitString(point)), ecKey, 'not verifiable'], + ['a BIT STRING of 1 unused bit', seq(ecAlg, tlv(0x03, Uint8Array.of(1), b.uncompressed(even))), even, 'not verifiable'], + ['an empty BIT STRING', seq(ecAlg, tlv(0x03, Uint8Array.of(0))), ecKey, 'not verifiable'], + ['an EC key of a point and a byte more', spkiEC(b.oid(OID.p256), concatBytes(point, Uint8Array.of(0))), ecKey, 'not verifiable'], ]; - for (const [name, i] of form) { - await expect(async () => parseToken(await b.tokenRaw(await i, tsa)), name).rejects.toThrow(CmsFormError); + for (const [name, spki, k, want] of cases) { + const s = b.newCert({ cn: 'Clave', spki }, k); + expect(resultOf(await b.signature(msg, {}, s)), name).toBe(want); } - expect(() => parseToken(Uint8Array.of(0x30, 0x80, 0, 0))).toThrow(CmsFormError); - expect(() => parseToken(new Uint8Array(0))).toThrow(CmsFormError); - // The accuracy of a valid token may carry millis and micros, and a fraction of a second. - const full = parseToken(await b.tokenRaw(await info(b.generalizedTime('20260930120000.5Z'), b.seq(b.int(2), b.tlv(0x80, Uint8Array.of(5)), b.tlv(0x81, Uint8Array.of(7)))), tsa)); - expect([full.genTime, full.accuracy]).toEqual([{ seconds: nowInstant.seconds, nanos: 500_000_000 }, { seconds: 2, nanos: 5_007_000 }]); - // Algorithms outside the table: a key of 1024 bits, and an imprint hash that is not SHA-2. - const small = await b.newRSA('TSA 1024', 1024, from, to); - await expect(async () => parseToken(await b.token(subject, now, {}, small))).rejects.toThrow(CmsAlgorithmError); - const sha1imprint = b.seq(b.int(1), b.oid('1.2.3.4'), b.seq(b.seq(b.oid('1.3.14.3.2.26')), b.octets(new Uint8Array(20))), b.int(42), good); - await expect(async () => parseToken(await b.tokenRaw(sha1imprint, tsa))).rejects.toThrow(CmsAlgorithmError); - // SHA-384 in the imprint is in the table, and is not SHA-256. - const t384 = parseToken(await b.token(subject, now, { hash: 'SHA-384' }, tsa)); - expect(tokenImprintIsSHA256(t384)).toBe(false); - expect(checkToken(t384, subject)).toBe(true); }); }); -// The identifier octet of the first SignerInfo of a SignedData, changed. -function retagSignerInfo(sig: Uint8Array, tag: number): Uint8Array { - const ci = splitDer(sig).children; - const sd = splitDer(splitDer(ci[1]!).children[0]!).children; - const infos = splitDer(sd[sd.length - 1]!).children; - const at = indexOf(sig, infos[0]!); - const out = sig.slice(); - out[at] = tag; - return out; -} - -function indexOf(hay: Uint8Array, needle: Uint8Array): number { - for (let i = 0; i + needle.length <= hay.length; i++) if (equalBytes(hay.subarray(i, i + needle.length), needle)) return i; - throw new Error('not found'); -} - describe('the form of a signature', () => { + // Spec §29.10, "Forma", rules 1 to 4, and the rules that follow them: each case breaks one check of the reader, and + // the signature is F1. it('refuses what breaks the profile of spec §29.10', async () => { - const a = await b.newECDSA('Ana', 'P-256', from, to); - const good = await b.signature(msg, {}, a); - expect(() => parseSignature(good)).not.toThrow(); - const attrOf = (o: string, ...v: Uint8Array[]): Uint8Array => b.seq(b.oid(o), b.set(0x31, ...v)); - const bad: [string, Uint8Array][] = [ + const { seq, tlv, oid, int, set, NULL, OID, attr } = b; + const good = await b.signature(msg, {}, ana); + const both = await b.signature(msg, {}, ana, luis); + const sealed = await b.signature(msg, { token: tok }, ana); + const sd = [...b.SIGNED_DATA]; + const si = firstSignerInfo(good); + const h = sha256(ana.cert); + const attrsOf = (mutate: (a: Uint8Array[]) => Uint8Array[]): Promise => b.signature(msg, { mutate }, ana); + const extra = (...extraAttrs: Uint8Array[]): Promise => b.signature(msg, { extraAttrs }, ana); + const v2 = + (value: Uint8Array) => + (a: Uint8Array[]): Uint8Array[] => [a[0]!, a[1]!, seq(oid(OID.sigCertV2), set(0x31, value))]; + const ocsp = (n: number): Uint8Array => tlv(0xa1, oid(OID.ocsp), seq(int(n))); + const twoOCSP = await b.signature(msg, { crls: [ocsp(1), ocsp(2)] }, ana); + const twin = b.newCert({ cn: 'B', serial: ana.serial, issuer: ana.issuer }, ecKey2); + const cases: [string, Uint8Array | Promise][] = [ + // Rule 1: DER, the ContentInfo and the SignedData. + ['BER', b.indefinite(good)], ['a byte after it', concatBytes(good, Uint8Array.of(0))], ['truncated', good.subarray(0, good.length - 1)], + ['nothing', new Uint8Array(0)], ['not a SignedData', Uint8Array.of(0x30, 0x03, 0x02, 0x01, 0x00)], - ['another content type', b.seq(b.oid('1.2.3'), b.tlv(0xa0, b.seq()))], - ['a SignedData that is not a SEQUENCE', b.seq(b.oid(b.OID.signedData), b.tlv(0xa0, b.int(1)))], - ['ContentInfo as a SET', concatBytes(Uint8Array.of(0x31), good.subarray(1))], - ['ContentInfo as [3]', concatBytes(Uint8Array.of(0xa3), good.subarray(1))], - ['SignerInfo as a SET', retagSignerInfo(good, 0x31)], - ['SignerInfo as [5]', retagSignerInfo(good, 0xa5)], - ['no certificate of the signer', await b.signature(msg, { omitCert: true }, a)], - ['a version that does not match the sid', await b.signature(msg, { version: 3 }, a)], - ['an attribute without a value', await b.signature(msg, { extraAttrs: [b.seq(b.oid(b.OID.contentType), b.set(0x31))] }, a)], - [ - 'a signing-certificate with another hash', - await b.signature(msg, { mutate: (attrs) => [...attrs.slice(0, 2), attrOf(b.OID.sigCertV2, b.seq(b.seq(b.seq(b.octets(new Uint8Array(32))))))] }, a), - ], - ['no message-digest', await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrs[2]!] }, a)], - ['no signing-certificate', await b.signature(msg, { mutate: (attrs) => attrs.slice(0, 2) }, a)], - ['a message-digest that is not an OCTET STRING', await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrOf(b.OID.messageDigest, b.int(1)), attrs[2]!] }, a)], - ['a content-type that is not id-data', await b.signature(msg, { mutate: (attrs) => [attrOf(b.OID.contentType, b.oid('1.2.3')), attrs[1]!, attrs[2]!] }, a)], - ['a content-type that is not an OID', await b.signature(msg, { mutate: (attrs) => [attrOf(b.OID.contentType, b.int(1)), attrs[1]!, attrs[2]!] }, a)], - ['a signing-certificate-v2 that is not a SEQUENCE', await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrs[1]!, attrOf(b.OID.sigCertV2, b.int(1))] }, a)], - ['an ESSCertID without fields', await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrs[1]!, attrOf(b.OID.sigCertV2, b.seq(b.seq(b.seq())))] }, a)], - ['a certHash that is not an OCTET STRING', await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrs[1]!, attrOf(b.OID.sigCertV2, b.seq(b.seq(b.seq(b.int(1)))))] }, a)], - [ - 'an ESSCertIDv2 with a hash outside the table', - await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrs[1]!, attrOf(b.OID.sigCertV2, b.seq(b.seq(b.seq(b.seq(b.oid('1.3.14.3.2.26')), b.octets(sha256(a.cert))))))] }, a), - ], - ['a signing-certificate-v2 without ESSCertIDs', await b.signature(msg, { mutate: (attrs) => [attrs[0]!, attrs[1]!, attrOf(b.OID.sigCertV2, b.seq(b.int(1)))] }, a)], - ['attributes out of DER order', await b.signature(msg, { unsorted: true, mutate: (attrs) => [...attrs].reverse() }, a)], - ['crls with something that is not an OCSP response', await b.signature(msg, { crls: [b.seq(b.int(1))] }, a)], - ['crls with another kind of revocation info', await b.signature(msg, { crls: [b.tlv(0xa1, b.oid('1.2.3'), b.octets(Uint8Array.of(1)))] }, a)], - ['crls with a malformed revocation info', await b.signature(msg, { crls: [b.tlv(0xa1, b.int(1))] }, a)], + ['a ContentInfo that is an INTEGER', int(1)], + ['a ContentInfo with a third element', b.edit(good, b.append(NULL))], + ['a ContentInfo of only its type', seq(oid(OID.signedData))], + ['ContentInfo as a SET', b.retag(0x31)(good)], + ['ContentInfo as [3]', b.retag(0xa3)(good)], + ['the content as [1]', b.edit(good, b.retag(0xa1), 1)], + ['the content type id-data', b.edit(good, replace(oid(OID.data)), 0)], + ['the content type an INTEGER', b.edit(good, replace(int(1)), 0)], + ['[0] with an element more', b.edit(good, b.append(NULL), 1)], + ['[0] empty', b.edit(good, replace(tlv(0xa0)), 1)], + ['[0] holding a SET', b.edit(good, b.retag(0x31), ...sd)], + ['a SignedData of two fields', b.edit(good, (x) => seq(...b.children(x).slice(0, 2)), ...sd)], + ['a SignedData without signerInfos', b.edit(good, (x) => seq(...b.children(x).slice(0, -1)), ...sd)], + ['a field after signerInfos', b.edit(good, b.append(set(0x31)), ...sd)], + ['the version as an OCTET STRING', b.edit(good, b.retag(0x04), ...sd, 0)], + ['digestAlgorithms as a SEQUENCE', b.edit(good, b.retag(0x30), ...sd, 1)], + ['digestAlgorithms out of order', b.edit(good, replace(tlv(0x31, b.hashAlg('SHA-512'), b.hashAlg('SHA-256'))), ...sd, 1)], + ['a digestAlgorithm that is an INTEGER', b.edit(good, replace(set(0x31, int(1))), ...sd, 1)], + ['a digestAlgorithm that is a SET', b.edit(good, replace(set(0x31, tlv(0x31, oid(OID.sha['SHA-256'])))), ...sd, 1)], + ['a digestAlgorithm without an OID', b.edit(good, replace(set(0x31, seq(int(1)))), ...sd, 1)], + ['an empty digestAlgorithm', b.edit(good, replace(set(0x31, seq())), ...sd, 1)], + ['a digestAlgorithm of three fields', b.edit(good, replace(set(0x31, b.algID(OID.sha['SHA-256'], NULL, NULL))), ...sd, 1)], + ['encapContentInfo as a SET', b.edit(good, b.retag(0x31), ...sd, 2)], + ['an empty encapContentInfo', b.edit(good, replace(seq()), ...sd, 2)], + ['encapContentInfo of three fields', b.edit(good, b.append(tlv(0xa0, b.octets(msg)), NULL), ...sd, 2)], + ['eContentType an INTEGER', b.edit(good, replace(seq(int(1))), ...sd, 2)], + ['eContentType id-ct-TSTInfo', b.edit(good, replace(seq(oid(OID.tstInfo))), ...sd, 2)], + ['rule 2: an eContent in the signature', b.edit(good, b.append(tlv(0xa0, b.octets(msg))), ...sd, 2)], + ['certificates out of order', b.edit(both, reversed, ...sd, 3)], + ['a CertificateChoice [4]', b.signature(msg, { extraCerts: [tlv(0xa4, NULL)] }, ana)], + ['a CertificateChoice that is a SET', b.signature(msg, { extraCerts: [set(0x31, NULL)] }, ana)], + ['rule 3: a CRL in crls', b.signature(msg, { crls: [seq(int(1))] }, ana)], + ['rule 3: a CRL of the shape of an OCSP', b.signature(msg, { crls: [seq(oid(OID.ocsp), seq(int(0)))] }, ana)], + ['rule 3: crls out of order', b.edit(twoOCSP, reversed, ...sd, 4)], + ['rule 3: another revocation format', b.signature(msg, { crls: [tlv(0xa1, oid('1.2.3.4'), NULL)] }, ana)], + ['rule 3: a revocation format of one', b.signature(msg, { crls: [tlv(0xa1, oid(OID.ocsp))] }, ana)], + ['rule 3: a revocation format by number', b.signature(msg, { crls: [tlv(0xa1, int(2), NULL)] }, ana)], + ['signerInfos as a SEQUENCE', b.edit(good, b.retag(0x30), ...signerInfosPath(good))], + ['no SignerInfo', b.edit(good, replace(tlv(0x31)), ...signerInfosPath(good))], + ['signerInfos out of order', b.signature(msg, { unsortedInfos: true }, ana, luis)], + // Rule 3: the SignerInfo and its sid. + ['a SignerInfo as a SET', b.edit(good, b.retag(0x31), ...si)], + ['a SignerInfo as [5]', b.edit(good, b.retag(0xa5), ...si)], + ['a SignerInfo that is an INTEGER', b.edit(good, replace(int(1)), ...si)], + ['a SignerInfo without signedAttrs', b.edit(good, (x) => seq(...b.children(x).filter((_, i) => i !== 3)), ...si)], + ['signedAttrs as [1]', b.edit(good, b.retag(0xa1), ...si, 3)], + ['a SignerInfo without its signature', b.edit(good, (x) => seq(...b.children(x).slice(0, 5)), ...si)], + ['the version of a SignerInfo as OCTETS', b.edit(good, b.retag(0x04), ...si, 0)], + ['the version 2', b.signature(msg, { version: 2 }, ana)], + ['the version 3 with issuerAndSerialNumber', b.signature(msg, { version: 3 }, ana)], + ['the version 1 with subjectKeyIdentifier', b.signature(msg, { version: 1, ski: true }, ana)], + ['the version 4 with subjectKeyIdentifier', b.signature(msg, { version: 4, ski: true }, ana)], + ['the version 257', b.edit(good, replace(int(257)), ...si, 0)], + ['the digestAlgorithm as a SET', b.edit(good, b.retag(0x31), ...si, 2)], + ['the signatureAlgorithm as a SET', b.edit(good, b.retag(0x31), ...si, 4)], + ['the digestAlgorithm of a SignerInfo, no OID', b.edit(good, replace(seq(int(1))), ...si, 2)], + ['a signatureAlgorithm without an OID', b.edit(good, replace(seq(int(1))), ...si, 4)], + ['an empty signatureAlgorithm', b.edit(good, replace(seq()), ...si, 4)], + ['the signature as a BIT STRING', b.edit(good, (x) => b.bitString(derContent(x)), ...si, 5)], + ['a field after the unsigned attributes', b.signature(msg, { token: tok, editSignerInfo: (f) => [...f, NULL] }, ana)], + ['a field [2] after the signature', b.signature(msg, { editSignerInfo: (f) => [...f, tlv(0xa2, b.bigArcAttr())] }, ana)], + ['a sid of three elements', b.edit(good, b.append(NULL), ...si, 1)], + ['a sid of one element', b.edit(good, (x) => seq(b.children(x)[0]!), ...si, 1)], + ['the issuer of the sid as a SET', b.edit(good, b.retag(0x31), ...si, 1, 0)], + ['the serial of the sid as an OCTET STRING', b.edit(good, b.retag(0x04), ...si, 1, 1)], + ['the serial of another certificate', b.edit(good, replace(int(12345)), ...si, 1, 1)], + ['a sid of another choice', b.edit(good, b.retag(0x81), ...si, 1)], + ['a subjectKeyIdentifier of no certificate', b.edit(await b.signature(msg, { ski: true }, ana), replace(tlv(0x80, other)), ...si, 1)], + ['no certificate of the signer', b.signature(msg, { omitCert: true }, ana)], + ['two certificates of one issuer and serial', b.signature(msg, { extraCerts: [twin.cert] }, ana)], + ['two certificates of one keyIdentifier', b.signature(msg, { ski: true, extraCerts: [b.newCert({ cn: 'B', ski: ana.ski }, ecKey2).cert] }, ana)], + ['an empty keyIdentifier, a certificate of none', b.signature(msg, { ski: true }, b.newCert({ cn: 'Sin SKI', extensions: null, ski: new Uint8Array(0) }, ecKey))], + ['two SignerInfo of one certificate', b.signature(msg, {}, ana, ana)], + ['one SignerInfo twice', b.signature(msg, { signerInfoTwice: true }, ana)], + ["the signer's certificate breaks the profile", b.signature(msg, {}, b.newCert({ cn: 'Ana', version: null }, ecKey))], + // Rule 4 and the rules after it: the attributes. + ['signedAttrs out of order', b.signature(msg, { unsorted: true, mutate: (a) => [...a].sort((p, q) => compareBytes(q, p)) }, ana)], + ['an attribute as a SET', extra(tlv(0x31, oid('1.2.3.4'), set(0x31, NULL)))], + ['an attribute of three fields', extra(seq(oid('1.2.3.4'), set(0x31, NULL), NULL))], + ['an attribute of one field', extra(seq(oid('1.2.3.4')))], + ['an attribute that is an INTEGER', extra(int(5))], + ['the values of an attribute as a SEQUENCE', extra(seq(oid('1.2.3.4'), seq(NULL)))], + ['an attribute whose type is an INTEGER', extra(seq(int(1), set(0x31, NULL)))], + ['an unknown attribute without a value', extra(seq(oid('1.2.3.4'), set(0x31)))], + ['values of an attribute out of order', extra(seq(oid('1.2.3.4'), tlv(0x31, int(2), int(1))))], + ['two content-type attributes', attrsOf((a) => [...a, a[0]!])], + ['a content-type of two values', attrsOf((a) => [attr(OID.contentType, oid(OID.data), oid(OID.tstInfo)), a[1]!, a[2]!])], + ['a message-digest of two values', attrsOf((a) => [a[0]!, attr(OID.messageDigest, b.octets(sha256(msg)), b.octets(concatBytes(sha256(msg), Uint8Array.of(0)))), a[2]!])], + ['a second content-type without a value', extra(seq(oid(OID.contentType), set(0x31)))], + ['no content-type', attrsOf((a) => a.slice(1))], + ['the content-type id-signedData', attrsOf((a) => [attr(OID.contentType, oid(OID.signedData)), a[1]!, a[2]!])], + ['the content-type id-ct-TSTInfo', attrsOf((a) => [attr(OID.contentType, oid(OID.tstInfo)), a[1]!, a[2]!])], + ['a content-type that is OCTETS', attrsOf((a) => [attr(OID.contentType, b.octets(te.encode('data'))), a[1]!, a[2]!])], + ['no message-digest', b.signature(msg, { noMessageDigest: true }, ana)], + ['two message-digest attributes', attrsOf((a) => [...a, a[1]!])], + ['a message-digest that is [0]', attrsOf((a) => [a[0]!, attr(OID.messageDigest, tlv(0x80, sha256(msg))), a[2]!])], + ['no signing-certificate-v2', b.signature(msg, { noSigCertV2: true }, ana)], + ['only a signing-certificate', b.signature(msg, { noSigCertV2: true, sigCertV1: true }, ana)], + ['two signing-certificate-v2 attributes', attrsOf((a) => [...a, a[2]!])], + ['a SigningCertificateV2 as a SET', attrsOf(v2(tlv(0x31, seq(seq(b.octets(h))))))], + ['an empty SigningCertificateV2', attrsOf(v2(seq()))], + ['its certs as a SET', attrsOf(v2(seq(tlv(0x31, seq(b.octets(h))))))], + ['its certs empty', attrsOf(v2(seq(seq())))], + ['an ESSCertIDv2 as a SET', attrsOf(v2(seq(seq(tlv(0x31, b.octets(h))))))], + ['an empty ESSCertIDv2', attrsOf(v2(seq(seq(seq()))))], + ['an ESSCertIDv2 of only its algorithm', attrsOf(v2(seq(seq(seq(b.hashAlg('SHA-256'))))))], + ['a certHash as [0]', attrsOf(v2(seq(seq(seq(tlv(0x80, h))))))], + ['a certHash that is an INTEGER', attrsOf(v2(seq(seq(seq(int(1))))))], + ['a hashAlgorithm without an OID', attrsOf(v2(seq(seq(seq(seq(int(1)), b.octets(h))))))], + ['a SigningCertificateV2 that is an INTEGER', attrsOf(v2(int(1)))], + ['an ESSCertIDv2 of SHA-1', b.signature(msg, { essHashAlg: b.hashAlg('SHA-1'), essDigest: 'SHA-1' }, ana)], + ['an ESSCertIDv2 of SHA-256 with an INTEGER', b.signature(msg, { essHashAlg: b.algID(OID.sha['SHA-256'], int(0)) }, ana)], + ['the hash of another certificate', b.signature(msg, { essCert: luis.cert }, ana)], + ['two signature-time-stamp attributes', b.signature(msg, { token: tok, token2: 'attribute' }, ana)], + ['a signature-time-stamp of two values', b.signature(msg, { token: tok, token2: 'value' }, ana)], + ['unsigned attributes out of order', b.edit(sealed, (x) => b.tlv(0xa1, ...[...b.children(x), attr('1.2.3.4', NULL)].sort((p, q) => compareBytes(q, p))), ...firstSignerInfo(sealed), 6)], + ['an unsigned attribute without a value', b.signature(msg, { extraUnsigned: [seq(oid('1.2.3.4'), set(0x31))] }, ana)], ]; - for (const [name, der] of bad) expect(() => parseSignature(der), name).toThrow(CmsFormError); + // Two values, the right one first in DER order: one value is required, not the first of several. + cases.push(['a signing-certificate-v2 of two values', attrsOf((a) => [a[0]!, a[1]!, seq(oid(OID.sigCertV2), set(0x31, seq(seq(seq(b.octets(h)))), seq(seq(seq(b.octets(new Uint8Array(33)))))))])]); + for (const [name, der] of cases) { + const bytes = await der; + expect(() => parseSignature(bytes), name).toThrow(CmsFormError); + } }); // Each attribute of the profile is one attribute with one value: a second attribute of the type, or a second value of - // the same attribute, breaks the rule of the count, with sets of values that stay in DER order (spec §29.10 rule 4). + // the same attribute, breaks the rule of the count (spec §29.10 rule 4), with the texts of Go. it('counts the attributes of a type apart from their values, and wants one of each', async () => { - const a = await b.newECDSA('Ana', 'P-256', from, to); - const attrOf = (o: string, ...v: Uint8Array[]): Uint8Array => b.seq(b.oid(o), b.set(0x31, ...v)); - const token = (): Promise => Promise.resolve(b.seq(b.oid('1.2.3'))); + const attrOf = (o: string, ...v: Uint8Array[]): Uint8Array => b.attr(o, ...v); + const second = (): Promise => Promise.resolve(b.seq(b.oid('1.2.3'))); const cases: [string, Uint8Array, string][] = [ - [ - 'a second content-type attribute', - await b.signature(msg, { extraAttrs: [attrOf(b.OID.contentType, b.oid('1.2.3'))] }, a), - 'content-type: 2 attributes with 2 values, not one with one', - ], + ['a second content-type attribute', await b.signature(msg, { extraAttrs: [attrOf(b.OID.contentType, b.oid('1.2.3'))] }, ana), 'content-type: 2 attributes with 2 values, not one with one'], [ 'a content-type with two values', - await b.signature(msg, { mutate: (attrs) => [attrOf(b.OID.contentType, b.oid(b.OID.data), b.oid('1.2.3')), attrs[1]!, attrs[2]!] }, a), + await b.signature(msg, { mutate: (a) => [attrOf(b.OID.contentType, b.oid(b.OID.data), b.oid('1.2.3')), a[1]!, a[2]!] }, ana), 'content-type: 1 attributes with 2 values, not one with one', ], - [ - 'a second message-digest attribute', - await b.signature(msg, { extraAttrs: [attrOf(b.OID.messageDigest, b.octets(new Uint8Array(32)))] }, a), - 'message-digest: 2 attributes with 2 values, not one with one', - ], - ['two signature-time-stamp attributes', await b.signature(msg, { token2: 'attribute', token }, a), 'signature-time-stamp: 2 attributes with 2 values, not one with one'], - ['a signature-time-stamp with two values', await b.signature(msg, { token2: 'value', token }, a), 'signature-time-stamp: 1 attributes with 2 values, not one with one'], + ['a second message-digest attribute', await b.signature(msg, { extraAttrs: [attrOf(b.OID.messageDigest, b.octets(new Uint8Array(32)))] }, ana), 'message-digest: 2 attributes with 2 values, not one with one'], + ['two signature-time-stamp attributes', await b.signature(msg, { token2: 'attribute', token: second }, ana), 'signature-time-stamp: 2 attributes with 2 values, not one with one'], + ['a signature-time-stamp with two values', await b.signature(msg, { token2: 'value', token: second }, ana), 'signature-time-stamp: 1 attributes with 2 values, not one with one'], + ['no signing-certificate-v2', await b.signature(msg, { noSigCertV2: true }, ana), 'signing-certificate: one attribute of one value is required'], + ['a content-type of a token', await b.signature(msg, { mutate: (a) => [attrOf(b.OID.contentType, b.oid(b.OID.tstInfo)), a[1]!, a[2]!] }, ana), 'content-type is not id-data'], + ['no certificate of the signer', await b.signature(msg, { omitCert: true }, ana), 'a sid that names 0 certificates of the profile, not one'], ]; for (const [name, der, rule] of cases) expect(() => parseSignature(der), name).toThrow(`cms: the form breaks the profile: ${rule}`); // One signature-time-stamp is the token, read as it is. - expect(parseSignature(await b.signature(msg, { token }, a)).signers[0]!.token).toEqual(b.seq(b.oid('1.2.3'))); + expect(parseSignature(await b.signature(msg, { token: second }, ana)).signers[0]!.token).toEqual(b.seq(b.oid('1.2.3'))); + }); + + // What decides nothing (spec §29.10): another choice of CertificateChoices, a certificate twice or one that breaks the + // profile, OCSP responses, the other attributes, signed or not, a signing-certificate beside the v2, and an + // ESSCertIDv2 with its hashAlgorithm written. + it('reads what decides nothing', async () => { + const { seq, tlv, int, NULL, OID, attr } = b; + const v1 = b.newCert({ cn: 'Intermedia v1', version: null }, ecKey2); + const cases: [string, b.Options][] = [ + ['an attribute certificate [1]', { extraCerts: [tlv(0xa1, seq(int(1)))] }], + ['the other choices [0], [2] and [3]', { extraCerts: [tlv(0xa0, NULL), tlv(0xa2, NULL), tlv(0xa3, NULL)] }], + ['the certificate twice', { extraCerts: [ana.cert] }], + ['the certificate three times', { extraCerts: [ana.cert, ana.cert] }], + ['a certificate of version 1', { extraCerts: [v1.cert] }], + ['a certificate that is not one', { extraCerts: [seq(int(1))] }], + ['two OCSP responses', { ocsp: seq(int(0)), crls: [tlv(0xa1, b.oid(OID.ocsp), seq(int(9)))] }], + ['an OCSP response twice', { ocsp: seq(int(0)), crls: [tlv(0xa1, b.oid(OID.ocsp), seq(int(0)))] }], + ['an attribute with an arc of 2^31', { extraAttrs: [b.bigArcAttr()] }], + ['a signing-time', { extraAttrs: [attr(OID.signingTime, b.utcTime('260930120000Z'))] }], + ['an unknown attribute of two values', { extraAttrs: [attr('1.2.3.4', int(1), int(2))] }], + ['an unknown attribute with a value twice', { extraAttrs: [seq(b.oid('1.2.3.4'), tlv(0x31, int(1), int(1)))] }], + ['a signing-certificate beside the v2', { sigCertV1: true }], + ['a wrong signing-certificate, and v2', { extraAttrs: [attr(OID.sigCertV1, seq(seq(seq(b.octets(new Uint8Array(20))))))] }], + ['an ESSCertIDv2 of SHA-256 written', { essHashAlg: b.hashAlg('SHA-256') }], + ['an ESSCertIDv2 of SHA-256 with NULL', { essHashAlg: b.algID(OID.sha['SHA-256'], NULL) }], + ['an ESSCertIDv2 of SHA-384', { essHashAlg: b.hashAlg('SHA-384'), essDigest: 'SHA-384' }], + ['an ESSCertIDv2 of SHA-512', { essHashAlg: b.hashAlg('SHA-512'), essDigest: 'SHA-512' }], + ['an unknown unsigned attribute', { token: tok, extraUnsigned: [b.bigArcAttr()] }], + ['unsigned attributes, no time-stamp', { extraUnsigned: [b.bigArcAttr()] }], + ['junk in the unsigned attributes', { junk: 5000 }], + ['a sid by subjectKeyIdentifier', { ski: true }], + ['the version written 1, as by default', { version: 1 }], + ]; + for (const [name, o] of cases) { + const sd = parseSignature(await b.signature(msg, o, ana)); + expect([sd.signers.length, toHex(sd.signers[0]!.cert.hash), checkSigner(sd.signers[0]!, msg)], name).toEqual([1, toHex(sha256(ana.cert)), 'valid']); + if (o.token !== undefined) expect(sd.signers[0]!.token, name).toBeDefined(); + } + // The certificates of the profile, each once, and the OCSP responses. + const sd = parseSignature(await b.signature(msg, { ocsp: seq(int(0)), extraCerts: [ana.cert, v1.cert] }, ana, luis)); + expect([sd.certs.length, sd.ocsp, sd.eContent]).toEqual([2, [seq(int(0))], undefined]); }); - it('accepts a signing-certificate beside the v2, an explicit SHA-256 hashAlgorithm and a signature with junk in its unsigned attributes', async () => { - const a = await b.newECDSA('Ana', 'P-256', from, to); - const both = parseSignature(await b.signature(msg, { sigCertV1: true }, a)); - expect(checkSigner(both.signers[0]!, msg)).toBe('valid'); - const attrOf = (o: string, ...v: Uint8Array[]): Uint8Array => b.seq(b.oid(o), b.set(0x31, ...v)); - const explicit = await b.signature( - msg, - { mutate: (attrs) => [attrs[0]!, attrs[1]!, attrOf(b.OID.sigCertV2, b.seq(b.seq(b.seq(b.seq(b.oid(b.OID.sha['SHA-256'])), b.octets(sha256(a.cert))))))] }, - a, - ); - expect(checkSigner(parseSignature(explicit).signers[0]!, msg)).toBe('valid'); - const junk = parseSignature(await b.signature(msg, { junk: 5000 }, a)); - expect(checkSigner(junk.signers[0]!, msg)).toBe('valid'); + // A co-signature finds each certificate by the bytes of its issuer and its serial, both, or by its keyIdentifier: two + // certificates that share one of them are two signers, not an ambiguity. + it('reads a co-signature, each signer by its certificate', async () => { + const sd = parseSignature(await b.signature(msg, {}, ana, luis)); + expect([sd.signers.length, sd.certs.length]).toEqual([2, 2]); + for (const s of sd.signers) expect(checkSigner(s, msg)).toBe('valid'); + expect(sd.signers.map((s) => certHolder(s.cert)).sort()).toEqual(['Ana López', 'Luis Gómez']); + const issuer = b.name(b.atv(b.OID.commonName, b.utf8('CA de prueba'))); + const pairs: [string, b.CertSpec, b.CertSpec, boolean][] = [ + ['one issuer, two serials', { cn: 'A', issuer, serial: b.int(1) }, { cn: 'B', issuer, serial: b.int(2) }, false], + ['one serial, two issuers', { cn: 'A', serial: b.int(5) }, { cn: 'B', serial: b.int(5) }, false], + ['one serial, two issuers by SKI', { cn: 'A', serial: b.int(5) }, { cn: 'B', serial: b.int(5) }, true], + ]; + for (const [name, x, y, ski] of pairs) { + const two = parseSignature(await b.signature(msg, { ski }, b.newCert(x, ecKey), b.newCert(y, ecKey2))); + expect([two.signers.length, two.signers[0]!.cert === two.signers[1]!.cert], name).toEqual([2, false]); + for (const s of two.signers) expect(checkSigner(s, msg), name).toBe('valid'); + } }); }); describe('the certificates', () => { - it('reads a certificate and refuses one that is not', async () => { - const a = await b.newECDSA('Ana', 'P-256', from, to); - const c = parseCert(a.cert); - expect([c.serial, certHolder(c), equalBytes(c.ski!, a.ski)]).toEqual([a.serial, 'Ana', true]); - expect(() => parseCert(Uint8Array.of(0x30, 0x00))).toThrow(CmsFormError); - expect(() => parseCert(Uint8Array.of(1))).toThrow(CmsFormError); - expect(() => parseCert(concatBytes(a.cert, Uint8Array.of(0)))).toThrow(CmsFormError); + // The profile of the certificate (spec §29.10): what a certificate made field by field gives, and each rule that a + // certificate can break. + it('reads a certificate field by field', () => { + const spec = { cn: 'Ana López', from: new Date(Date.UTC(2021, 1, 3, 4, 5, 6)), to: new Date(Date.UTC(2051, 1, 3, 4, 5, 6)), serial: b.int(0x1234) }; + const s = b.newCert(spec, ecKey); + const c = parseCert(s.cert); + expect({ hash: toHex(c.hash), serial: toHex(c.serial), issuer: toHex(c.rawIssuer), subject: toHex(c.rawSubject), ski: toHex(c.ski!), spki: toHex(c.spki) }).toEqual({ + hash: toHex(sha256(s.cert)), + serial: '1234', + issuer: toHex(s.issuer), + subject: toHex(s.issuer), + ski: toHex(s.ski), + spki: toHex(ecKey.spki), + }); + expect([c.notBefore, c.notAfter]).toEqual([instant(spec.from), instant(spec.to)]); + expect([certHolder(c), certIssuerName(c), toHex(certIssuerHash(c))]).toEqual(['Ana López', 'Ana López', toHex(sha256(s.issuer))]); + // The validity is inclusive (RFC 5280 4.1.2.5). + const at = (d: Date, nanos: number): { seconds: number; nanos: number } => ({ seconds: instant(d).seconds + (nanos < 0 ? -1 : 0), nanos: nanos < 0 ? 1e9 + nanos : nanos }); + expect([at(spec.from, 0), at(spec.from, -1), at(spec.to, 0), at(spec.to, 1), instant(now)].map((t) => certValidAt(c, t))).toEqual([true, false, true, false, true]); + }); + + it('refuses a certificate that breaks the profile, with the texts of Go', () => { + const { seq, tlv, int, NULL } = b; + const raw = b.newCert({ cn: 'Ana López' }, ecKey).cert; + const cert = (spec: b.CertSpec): Uint8Array => b.newCert(spec, ecKey).cert; + const tbs = (i: number): number[] => [0, i]; + const time1 = b.utcTime('200101000000Z'); + const ext = b.extension; + const cases: [string, Uint8Array, string][] = [ + ['not DER', concatBytes(raw, Uint8Array.of(0)), 'der: 1 bytes after the element'], + ['an INTEGER', int(1), 'not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'], + ['a SET', b.retag(0x31)(raw), 'not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'], + ['a fourth element', b.edit(raw, b.append(NULL)), 'not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'], + ['tbsCertificate as a SET', b.edit(raw, b.retag(0x31), 0), 'not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'], + ['signatureAlgorithm as a SET', b.edit(raw, b.retag(0x31), 1), 'not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'], + ['the signature as an OCTET STRING', b.edit(raw, b.retag(0x04), 2), 'not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'], + ['no version: a certificate of v1', cert({ version: null }), 'a tbsCertificate without version, or with fields missing'], + ['version 1 with extensions', cert({ version: null, after: [NULL] }), 'a tbsCertificate without version, or with fields missing'], + ['the version written as 1', cert({ version: tlv(0xa0, int(0)) }), 'the version is not 3'], + ['the version written as 2', cert({ version: tlv(0xa0, int(1)) }), 'the version is not 3'], + ['the version as [1]', cert({ version: tlv(0xa1, int(2)) }), 'a tbsCertificate without version, or with fields missing'], + ['the version of two INTEGERs', cert({ version: tlv(0xa0, int(2), int(2)) }), 'the version is not 3'], + ['a tbsCertificate without its SPKI', b.edit(raw, (x) => seq(...b.children(x).slice(0, 6)), 0), 'a tbsCertificate without version, or with fields missing'], + ['the serial as an OCTET STRING', cert({ serial: b.octets(Uint8Array.of(1)) }), 'the fields of tbsCertificate'], + ['the signature of tbs as a SET', b.edit(raw, b.retag(0x31), ...tbs(2)), 'the fields of tbsCertificate'], + ['the issuer as a SET', b.edit(raw, b.retag(0x31), ...tbs(3)), 'the fields of tbsCertificate'], + ['the validity as a SET', b.edit(raw, b.retag(0x31), ...tbs(4)), 'the fields of tbsCertificate'], + ['the subject as a SET', b.edit(raw, b.retag(0x31), ...tbs(5)), 'the fields of tbsCertificate'], + ['the SPKI as a SET', b.edit(raw, b.retag(0x31), ...tbs(6)), 'the fields of tbsCertificate'], + ['a validity of three times', b.edit(raw, b.append(time1), ...tbs(4)), 'validity'], + ['a validity of one time', b.edit(raw, replace(seq(time1)), ...tbs(4)), 'validity'], + ['notBefore with a fraction', cert({ notBefore: b.generalizedTime('20200101000000.5Z') }), 'notBefore: a GeneralizedTime with a fraction of seconds'], + ['notAfter with a fraction', cert({ notAfter: b.generalizedTime('20391231235959.5Z') }), 'notAfter: a GeneralizedTime with a fraction of seconds'], + ['notBefore an INTEGER', cert({ notBefore: int(1) }), 'notBefore: der: not a UTCTime or a GeneralizedTime'], + ['notAfter that is not a time', cert({ notAfter: b.utcTime('not a time!!Z') }), 'der: a time that is not in the form of DER'], + ['subjectUniqueID before issuerUniqueID', cert({ uniqueIDs: [tlv(0x82, Uint8Array.of(0, 2)), tlv(0x81, Uint8Array.of(0, 1))] }), 'a field out of its place, or after the last'], + ['an issuerUniqueID constructed', cert({ uniqueIDs: [tlv(0xa1, int(1))] }), 'a field out of its place, or after the last'], + ['the extensions as [4]', cert({ extensions: null, after: [tlv(0xa4, seq(b.extKeyUsage()))] }), 'a field out of its place, or after the last'], + ['an element after the extensions', cert({ after: [NULL] }), 'a field out of its place, or after the last'], + ['[3] of two SEQUENCEs', cert({ extensions: null, after: [tlv(0xa3, seq(b.extKeyUsage()), seq(b.extKeyUsage()))] }), 'extensions'], + ['[3] holding a SET', cert({ extensions: null, after: [tlv(0xa3, b.set(0x31, b.extKeyUsage()))] }), 'extensions'], + ['an empty [3]', cert({ extensions: null, after: [tlv(0xa3)] }), 'extensions'], + ['no Extension', cert({ extensions: [] }), 'extensions without an Extension'], + ['an Extension as a SET', cert({ extensions: [tlv(0x31, b.oid('1.2.3.4.5'), b.octets(new Uint8Array(0)))] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an Extension that is an INTEGER', cert({ extensions: [int(1)] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an Extension of only its type', cert({ extensions: [seq(b.oid('1.2.3.4.5'))] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an empty Extension', cert({ extensions: [seq()] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an Extension of four elements', cert({ extensions: [seq(b.oid('1.2.3.4.5'), b.bool(true), b.octets(new Uint8Array(0)), b.octets(new Uint8Array(0)))] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an Extension whose type is an INTEGER', cert({ extensions: [seq(int(1), b.octets(new Uint8Array(0)))] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an Extension whose value is not OCTETS', cert({ extensions: [seq(b.oid('1.2.3.4.5'), b.bitString(new Uint8Array(0)))] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an Extension critical by an INTEGER', cert({ extensions: [seq(b.oid('1.2.3.4.5'), int(1), b.octets(new Uint8Array(0)))] }), 'an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'], + ['an extension twice', cert({ extensions: [b.extKeyUsage(), b.extKeyUsage()] }), 'an extension twice'], + ['subjectKeyIdentifier twice', cert({ extensions: [b.extSKI(Uint8Array.of(1)), b.extSKI(Uint8Array.of(2))] }), 'an extension twice'], + ['a subjectKeyIdentifier not in DER', cert({ extensions: [ext(b.OID.ski, false, Uint8Array.of(0x04, 0x01, 0x07, 0x00))] }), 'a subjectKeyIdentifier that is not an OCTET STRING'], + ['a subjectKeyIdentifier an INTEGER', cert({ extensions: [ext(b.OID.ski, false, int(7))] }), 'a subjectKeyIdentifier that is not an OCTET STRING'], + ['an empty subjectKeyIdentifier', cert({ extensions: [b.extSKI(new Uint8Array(0))] }), 'an empty subjectKeyIdentifier'], + ['a subjectKeyIdentifier of no bytes', cert({ extensions: [ext(b.OID.ski, false, new Uint8Array(0))] }), 'a subjectKeyIdentifier that is not an OCTET STRING'], + ]; + for (const [name, der, text] of cases) { + expect(() => parseCert(der), name).toThrow(CertificateError); + expect(() => parseCert(der), name).toThrow(text); + } + // A name that breaks the profile, as the subject beside a good issuer, and as the issuer beside a good subject. + const good = b.name(b.atv(b.OID.commonName, b.utf8('A'))); + const cn = b.atv(b.OID.commonName, b.utf8('A')); + const names: [string, Uint8Array, string][] = [ + ['an RDN as a SEQUENCE', b.nameOf(seq(cn)), 'a RelativeDistinguishedName that is not a non-empty SET'], + ['an empty RDN', b.nameOf(b.rdn()), 'a RelativeDistinguishedName that is not a non-empty SET'], + ['an RDN that is an INTEGER', b.nameOf(int(1)), 'a RelativeDistinguishedName that is not a non-empty SET'], + ['an AttributeTypeAndValue as a SET', b.nameOf(b.rdn(tlv(0x31, b.oid(b.OID.commonName), b.utf8('A')))), 'an AttributeTypeAndValue that is not an object identifier and a value'], + ['an AttributeTypeAndValue of three', b.nameOf(b.rdn(seq(b.oid(b.OID.commonName), b.utf8('A'), NULL))), 'an AttributeTypeAndValue that is not an object identifier and a value'], + ['an AttributeTypeAndValue of one', b.nameOf(b.rdn(seq(b.oid(b.OID.commonName)))), 'an AttributeTypeAndValue that is not an object identifier and a value'], + ['an AttributeTypeAndValue primitive', b.nameOf(b.rdn(int(3))), 'an AttributeTypeAndValue that is not an object identifier and a value'], + ['an attribute type that is an INTEGER', b.nameOf(b.rdn(seq(int(3), b.utf8('A')))), 'an AttributeTypeAndValue that is not an object identifier and a value'], + ]; + for (const [name, n, text] of names) { + expect(() => parseCert(cert({ subject: n, issuer: good })), name).toThrow(`certificate: subject: ${text}`); + expect(() => parseCert(cert({ subject: good, issuer: n })), name).toThrow(`certificate: issuer: ${text}`); + } + }); + + // What the profile accepts: both unique identifiers, no extensions in a certificate of version 3, a critical + // subjectKeyIdentifier, an unknown extension, a GeneralizedTime before 2050, any signature, and an empty name. + it('reads what the profile accepts', () => { + const { tlv, int } = b; + const cases: [string, b.CertSpec, string | undefined][] = [ + ['both unique identifiers', { uniqueIDs: [tlv(0x81, Uint8Array.of(0, 1)), tlv(0x82, Uint8Array.of(0, 2))] }, '0102'], + ['only subjectUniqueID', { uniqueIDs: [tlv(0x82, Uint8Array.of(0, 2))], extensions: null }, undefined], + ['no extensions', { extensions: null }, undefined], + ['a critical subjectKeyIdentifier', { extensions: [b.extension(b.OID.ski, true, b.octets(Uint8Array.of(9)))] }, '09'], + ['a subjectKeyIdentifier not critical by FALSE', { extensions: [b.seq(b.oid(b.OID.ski), b.bool(false), b.octets(b.octets(Uint8Array.of(9))))] }, '09'], + ['an unknown extension', { extensions: [b.extension('1.2.3.4.5', false, new Uint8Array(0)), b.extSKI(Uint8Array.of(9))] }, '09'], + ['an extension with an arc of 2^31', { extensions: [b.seq(b.tlv(0x06, b.hex('2a864886f70d01098880808000')), b.octets(new Uint8Array(0)))] }, undefined], + ['a GeneralizedTime in 2030', { notAfter: b.generalizedTime('20300101000000Z'), ski: Uint8Array.of(1) }, '01'], + ['a signature that is no one\'s', { signature: b.bitString(te.encode('not a signature')), ski: Uint8Array.of(1) }, '01'], + ['another signature algorithm', { sigAlg: b.algID('1.2.3', int(7)), ski: Uint8Array.of(1) }, '01'], + ['an empty name', { subject: b.nameOf(), issuer: b.nameOf(), ski: Uint8Array.of(1) }, '01'], + ['a NumericString in a name', { subject: b.name(b.atv('1.2.643.3.131.1.1', b.numeric('123456789012'))), ski: Uint8Array.of(1) }, '01'], + ]; + for (const [name, spec, ski] of cases) { + const c = parseCert(b.newCert({ cn: 'A', ski: Uint8Array.of(1, 2), ...spec }, ecKey).cert); + expect(c.ski === undefined ? undefined : toHex(c.ski), name).toBe(ski); + } + }); + + // The text of a name (spec §29.10): only of the five string types, in their alphabets, nothing removed, never from an + // attribute that appears twice; and the holder (spec §29.7): givenName and surname before commonName. + it('takes the holder and the issuer that spec §29.7 names', () => { + const { atv, OID, utf8 } = b; + const subject = (...atvs: Uint8Array[]): string => certHolder(parseCert(b.newCert({ subject: b.name(...atvs) }, ecKey).cert)); + const cn = (v: Uint8Array): Uint8Array => atv(OID.commonName, v); + const given = (v: Uint8Array): Uint8Array => atv(OID.givenName, v); + const surname = (v: Uint8Array): Uint8Array => atv(OID.surname, v); + const org = (v: Uint8Array): Uint8Array => atv(OID.organization, v); + const bytes = (...x: number[]): Uint8Array => Uint8Array.from(x); + const cases: [string, string, string][] = [ + ['a UTF8String', subject(cn(utf8('Ana López'))), 'Ana López'], + ['a UTF8String that is not UTF-8', subject(cn(utf8(concatBytes(te.encode('Ana '), bytes(0xff))))), ''], + ['a UTF8String with a BOM, kept', subject(cn(utf8(concatBytes(bytes(0xef, 0xbb, 0xbf), te.encode('Ana'))))), '\u{feff}Ana'], + ['a UTF8String with a surrogate, not UTF-8', subject(cn(utf8(bytes(0xed, 0xa0, 0x80)))), ''], + ['a UTF8String overlong, not UTF-8', subject(cn(utf8(bytes(0xc0, 0x80)))), ''], + ['a PrintableString of its whole alphabet', subject(cn(b.printable("Ana O'Neil (1+2), x-y./:=? Z9"))), "Ana O'Neil (1+2), x-y./:=? Z9"], + ['a PrintableString with an underscore', subject(cn(b.printable('Ana_Lopez'))), ''], + ['a PrintableString with an at sign', subject(cn(b.printable('ana@example.com'))), ''], + ['a PrintableString with a tilde', subject(cn(b.printable('Ana~'))), ''], + ['a PrintableString with an ampersand', subject(cn(b.printable('A&B'))), ''], + ['a PrintableString with an asterisk', subject(cn(b.printable('A*B'))), ''], + ['a PrintableString with a byte of 0xe9', subject(cn(b.printable(bytes(0x4c, 0xe9, 0x61)))), ''], + ['an IA5String', subject(cn(b.ia5('ana@example.com'))), 'ana@example.com'], + ['an IA5String with a byte of 0x80', subject(cn(b.ia5(bytes(0x41, 0x80)))), ''], + ['a TeletexString in ASCII', subject(cn(b.teletex('Ana Lopez'))), 'Ana Lopez'], + ['a TeletexString with a byte of 0xe9', subject(cn(b.teletex(bytes(0x4c, 0xe9, 0x61)))), ''], + ['a BMPString', subject(cn(b.bmpText('Ana López'))), 'Ana López'], + ['a BMPString above the surrogates', subject(cn(b.bmpText('Ana ¥'))), 'Ana ¥'], + ['a BMPString with a terminator, kept', subject(cn(b.bmp(bytes(0, 0x41, 0, 0)))), 'A\u{0}'], + ['a BMPString of odd length', subject(cn(b.bmp(bytes(0, 0x41, 0)))), ''], + ['a BMPString with a surrogate pair', subject(cn(b.bmpText('Ana \u{1f600}'))), ''], + ['a BMPString with a low surrogate', subject(cn(b.bmp(bytes(0, 0x41, 0xdc, 0)))), ''], + ['a BMPString with a high surrogate', subject(cn(b.bmp(bytes(0xd8, 0, 0, 0x41)))), ''], + ['a VisibleString', subject(cn(b.visible('Ana'))), ''], + ['a UniversalString', subject(cn(b.tlv(0x1c, bytes(0, 0, 0, 0x41)))), ''], + ['a NumericString', subject(cn(b.numeric('12345'))), ''], + ['two commonNames', subject(cn(utf8('Ana')), cn(utf8('Luis'))), ''], + ['no commonName', subject(org(utf8('Banco'))), ''], + ['givenName, surname and the NIF in the CN', subject(cn(utf8('ESPAÑOL ESPAÑOL JUAN - 12345678Z')), given(utf8('JUAN')), surname(utf8('ESPAÑOL ESPAÑOL'))), 'JUAN ESPAÑOL ESPAÑOL'], + ['givenName and surname without a CN', subject(given(utf8('Ana')), surname(utf8('López'))), 'Ana López'], + ['only a givenName', subject(cn(utf8('Ana López')), given(utf8('Ana'))), 'Ana López'], + ['only a surname', subject(cn(utf8('Ana López')), surname(utf8('López'))), 'Ana López'], + ['an empty givenName', subject(cn(utf8('Ana López')), given(utf8('')), surname(utf8('López'))), 'Ana López'], + ['an empty surname', subject(cn(utf8('Ana López')), given(utf8('Ana')), surname(utf8(''))), 'Ana López'], + ['a givenName that is not UTF-8', subject(cn(utf8('Ana López')), given(utf8(bytes(0x41, 0x6e, 0xff))), surname(utf8('López'))), 'Ana López'], + ['a givenName that is no text', subject(cn(utf8('Ana López')), given(b.visible('Ana')), surname(utf8('López'))), 'Ana López'], + ['two givenNames', subject(cn(utf8('Ana López')), given(utf8('Ana')), given(utf8('Eva')), surname(utf8('López'))), 'Ana López'], + ['a givenName with an escape, not the CN', subject(cn(utf8('Ana López')), given(utf8('Ana\x1b')), surname(utf8('López'))), 'Ana\x1b López'], + ['a commonName with an escape, kept as text', subject(cn(utf8('Ana\x1b[31m'))), 'Ana\x1b[31m'], + ['an empty commonName', subject(cn(utf8(''))), ''], + ]; + for (const [name, got, want] of cases) expect(got, name).toBe(want); + // Several attributes in one RelativeDistinguishedName count each. + const rdn = (...atvs: Uint8Array[]): string => certHolder(parseCert(b.newCert({ subject: b.nameOf(b.rdn(...atvs)) }, ecKey).cert)); + expect([rdn(cn(utf8('Ana')), cn(utf8('Luis'))), rdn(org(utf8('Banco')), cn(utf8('Ana')))]).toEqual(['', 'Ana']); + // The issuer: its commonName, or its organizationName without one; '' with neither, the caller showing then the hash of the name. + const issuer = (...atvs: Uint8Array[]): string => certIssuerName(parseCert(b.newCert({ issuer: b.name(...atvs) }, ecKey).cert)); + const issuers: [string, string, string][] = [ + ['a commonName', issuer(org(utf8('Banco')), cn(utf8('CA de prueba'))), 'CA de prueba'], + ['an organizationName without a CN', issuer(org(utf8('Banco S.A.'))), 'Banco S.A.'], + ['a commonName with an escape, kept', issuer(org(utf8('Banco')), cn(utf8('CA\x1b'))), 'CA\x1b'], + ['a commonName not UTF-8, then the O', issuer(org(utf8('Banco')), cn(utf8(bytes(0x43, 0xff)))), 'Banco'], + ['two commonNames, then the O', issuer(org(utf8('Banco')), cn(utf8('A')), cn(utf8('B'))), 'Banco'], + ['an empty commonName, not the O', issuer(org(utf8('Banco')), cn(utf8(''))), ''], + ['an organizationName that is not UTF-8', issuer(org(utf8(bytes(0x42, 0xff)))), ''], + ['neither', issuer(atv(OID.country, b.printable('ES'))), ''], + ['an organizationName that is not text', issuer(org(b.visible('Banco'))), ''], + ]; + for (const [name, got, want] of issuers) expect(got, name).toBe(want); + }); + + // Of the certificates of newECDSA, by givenName and surname or with neither, the issuer is the organizationName that + // its Name has, and no text made of all its attributes, as the reference read it before v0.12. + it('names the issuer of a certificate without a commonName by its organizationName', async () => { + const g = await b.newECDSA('Ana López', 'P-256', from, to, 'given-surname'); + const o = await b.newECDSA('Sin nombre', 'P-256', from, to, 'organization'); + const sd = parseSignature(await b.signature(msg, {}, g, o)); + const byName = new Map(sd.signers.map((s) => [certHolder(s.cert), s.cert])); + expect([...byName.keys()].sort()).toEqual(['', 'Ana López']); + expect(certIssuerName(byName.get('')!)).toBe('DateKeys test'); + expect(certIssuerName(byName.get('Ana López')!)).toBe('DateKeys test'); }); - // Go reads the bytes of a name and of a time: a leading U+FEFF stays in the name, for the rules of text to refuse, and - // a time that starts with it does not parse. A TextDecoder without ignoreBOM would drop it. - it('keeps a byte order mark at the start of a UTF8String, and refuses a time that starts with one', async () => { - const bom = Uint8Array.of(0xef, 0xbb, 0xbf); - const cn = b.rdnName(['2.5.4.3', b.tlv(0x0c, bom, new TextEncoder().encode('Ana'))]); - const named = parseCert((await b.newECDSA('Ana', 'P-256', from, to, 'cn', { subject: cn, issuer: cn })).cert); - expect([certHolder(named), certIssuerName(named)]).toEqual(['\u{feff}Ana', '\u{feff}Ana']); - const utc = (s: Uint8Array): Uint8Array => b.tlv(0x17, s); - const validity = b.seq(utc(concatBytes(bom, new TextEncoder().encode('250101000000Z'))), utc(new TextEncoder().encode('300101000000Z'))); - const late = await b.newECDSA('Ana', 'P-256', from, to, 'cn', { validity }); - expect(() => parseCert(late.cert)).toThrow(CmsFormError); - const signature = await b.signature(msg, {}, late); - expect(() => parseSignature(signature)).toThrow(CmsFormError); + // A NumericString is DER, and a certificate whose name holds one, as the INN of a Russian certificate, meets the + // profile: its value is no text, and the signature verifies (spec §29.10). + it('reads a NumericString in a name as no text, and the signature verifies', async () => { + const inn = b.atv('1.2.643.3.131.1.1', b.numeric('123456789012')); + const s = b.newCert({ subject: b.name(b.atv(b.OID.commonName, b.utf8('Ivan Petrov')), inn) }, ecKey); + const si = parseSignature(await b.signature(msg, {}, s)).signers[0]!; + expect([checkSigner(si, msg), certHolder(si.cert)]).toEqual(['valid', 'Ivan Petrov']); }); - // An INTEGER and an OBJECT IDENTIFIER of tens of kilobytes are read in time linear in their length: a shift per byte - // took some 700 ms for each. - it('reads a serial number and an arc of an OID of 60 KB, whole', () => { - const te = new TextEncoder(); - // A negative serial: 0x80 and 59 999 bytes more, in two's complement. + // Go reads the bytes of a time: a time that starts with a U+FEFF does not parse, and the whole signature is not DER. + it('refuses a time that starts with a byte order mark', async () => { + const late = b.newCert({ cn: 'Ana', notBefore: b.tlv(0x17, Uint8Array.of(0xef, 0xbb, 0xbf), te.encode('250101000000Z')) }, ecKey); + expect(() => parseCert(late.cert)).toThrow(CertificateError); + expect(() => parseSignature(Uint8Array.of())).toThrow(CmsFormError); + expect(() => parseSignature(new Uint8Array(0))).toThrow(CmsFormError); + await expect(b.signature(msg, {}, late).then(parseSignature)).rejects.toThrow('cms: the form breaks the profile: der: a time that is not in the form of DER'); + }); + + // An INTEGER and an OBJECT IDENTIFIER of tens of kilobytes are read in time linear in their length. + it('reads a serial number and an identifier of 60 KB, whole', () => { const serial = Uint8Array.from({ length: 60_000 }, (_, i) => (i * 7 + 1) & 0xff); serial[0] = 0x80; - // The issuer names a type 2.25 and a UUID, an arc of 19 digits of base 128, and a type 2.48 and an arc of - // 60 000 digits, 2^420000 - 1. + // The issuer names a type 2.25 and a UUID, an arc of 19 digits of base 128, and a type 2.48 and an arc of 60 000 + // digits, 2^420000 - 1, before its commonName. const uuid = b.oid('2.25.329800735698586629295641978511506172918'); const digits = new Uint8Array(60_000).fill(0xff); digits[digits.length - 1] = 0x7f; const huge = b.tlv(0x06, Uint8Array.of(0x81, 0x00), digits); - const name = b.seq(b.set(0x31, b.seq(uuid, b.utf8('a'))), b.set(0x31, b.seq(huge, b.utf8('b')))); - const validity = b.seq(b.tlv(0x17, te.encode('250101000000Z')), b.tlv(0x17, te.encode('300101000000Z'))); - const spki = b.seq(b.seq(b.oid('1.2.840.10045.2.1'), b.oid('1.2.840.10045.3.1.7')), b.tlv(0x03, Uint8Array.of(0, 4))); - const tbs = b.seq(b.tlv(0xa0, b.int(2)), b.tlv(0x02, serial), b.seq(b.oid(b.OID.ecdsa['SHA-256'])), name, validity, name, spki); - const der = b.seq(tbs, b.seq(b.oid(b.OID.ecdsa['SHA-256'])), b.tlv(0x03, Uint8Array.of(0))); + const name = b.name(b.atv('2.5.4.10', b.utf8('Banco')), b.seq(uuid, b.utf8('a')), b.seq(huge, b.utf8('b')), b.atv(b.OID.commonName, b.utf8('CA'))); const start = performance.now(); - const c = parseCert(der); + const c = parseCert(b.newCert({ serial: b.tlv(0x02, serial), issuer: name }, ecKey).cert); const issuer = certIssuerName(c); const ms = performance.now() - start; - expect(c.serial).toBe(BigInt(`0x${toHex(serial.subarray(1))}`) - (1n << 479_999n)); - expect(issuer).toBe(`2.48.${(1n << 420_000n) - 1n}=b,2.25.329800735698586629295641978511506172918=a`); + expect([equalBytes(c.serial, serial), issuer]).toEqual([true, 'CA']); expect(ms).toBeLessThan(500); }); }); + +describe('a token', () => { + it('is read with its time, accuracy, authority and imprint, and seals the signature value and nothing else', async () => { + const authority = b.newCert({ cn: 'TSA de prueba RSA', from, to }, rsaKey); + const sd = parseSignature(await b.signature(msg, { token: (sig) => b.token(sig, now, { accuracy: b.accuracyOf(2) }, authority) }, ana)); + const token = parseToken(sd.signers[0]!.token!); + expect([token.genTime, token.accuracy, certHolder(token.tsa), tokenImprintIsSHA256(token)]).toEqual([instant(now), { seconds: 2, nanos: 0 }, 'TSA de prueba RSA', true]); + expect(checkToken(token, sd.signers[0]!.signature)).toBe(true); + expect(checkToken(token, other)).toBe(false); + }); + + // The tokens have the form of §29.11, step 1: one SignerInfo, the TSTInfo in its eContent, its content-type, its + // message-digest and the certificate of the authority named by signing-certificate or signing-certificate-v2. + it('refuses a token whose form breaks the profile (S2)', async () => { + const { seq, tlv, oid, OID, attr } = b; + const good = await b.token(subject, now, {}, tsa); + const info = await b.tstInfo(subject, now); + const encap = [...b.SIGNED_DATA, 2]; + const otherTSA = b.newCert({ cn: 'Otra TSA' }, ecKey); + const withAttrs = (mutate: (a: Uint8Array[]) => Uint8Array[]): Promise => b.token(subject, now, { cms: { mutate } }, tsa); + const ess1 = async (c: Uint8Array): Promise => attr(OID.sigCertV1, seq(seq(seq(b.octets(await b.digest('SHA-1', c)))))); + const ess2 = (c: Uint8Array): Uint8Array => attr(OID.sigCertV2, seq(seq(seq(b.octets(sha256(c)))))); + const twoCRLs = await b.token(subject, now, { cms: { crls: [seq(b.int(1)), seq(b.int(2))] } }, tsa); + const cases: [string, Uint8Array | Promise][] = [ + ['two SignerInfo', b.merge(await b.tokenRaw(info, tsa), await b.tokenRaw(info, otherTSA))], + ['BER', b.indefinite(good)], + ['not DER', Uint8Array.of(0x30, 0x80, 0x00, 0x00)], + ['empty', new Uint8Array(0)], + ['id-data', b.edit(good, replace(seq(oid(OID.data), tlv(0xa0, b.octets(info)))), ...encap)], + ['no eContent', b.edit(good, replace(seq(oid(OID.tstInfo))), ...encap)], + ['an eContent [1]', b.edit(good, replace(seq(oid(OID.tstInfo), tlv(0xa1, b.octets(info)))), ...encap)], + ['an eContent of two OCTET STRINGs', b.edit(good, replace(seq(oid(OID.tstInfo), tlv(0xa0, b.octets(info), b.octets(info)))), ...encap)], + ['an empty eContent', b.edit(good, replace(seq(oid(OID.tstInfo), tlv(0xa0))), ...encap)], + ['an eContent that is a SEQUENCE', b.edit(good, replace(seq(oid(OID.tstInfo), tlv(0xa0, seq(info)))), ...encap)], + ['the content-type id-data', withAttrs((a) => [attr(OID.contentType, oid(OID.data)), a[1]!, a[2]!])], + ['no message-digest', b.token(subject, now, { cms: { noMessageDigest: true } }, tsa)], + ['no signing certificate', withAttrs((a) => a.slice(0, 2))], + ['two signing-certificate attributes', withAttrs((a) => [...a, a[2]!])], + ['a signing-certificate of two values', withAttrs((a) => [a[0]!, a[1]!, seq(oid(OID.sigCertV1), b.set(0x31, b.children(b.children(a[2]!)[1]!)[0]!, seq(seq(seq(b.octets(new Uint8Array(21)))))))])], + ['two signing-certificate-v2 and a v1', withAttrs((a) => [...a, ess2(tsa.cert), ess2(tsa.cert)])], + ['a signing-certificate of another TSA', ess1(otherTSA.cert).then((x) => withAttrs((a) => [a[0]!, a[1]!, x]))], + ['a signing-certificate-v2 of another', b.token(subject, now, { cms: { sigCertV2: true, essCert: otherTSA.cert } }, tsa)], + ['a signing-certificate with a hashAlgorithm', withAttrs((a) => [a[0]!, a[1]!, attr(OID.sigCertV1, seq(seq(seq(b.hashAlg('SHA-256'), b.octets(new Uint8Array(20))))))])], + ['no certificate of the authority', b.token(subject, now, { cms: { omitCert: true } }, tsa)], + ['crls out of order', b.edit(twoCRLs, reversed, ...b.SIGNED_DATA, 4)], + ]; + for (const [name, der] of cases) { + const bytes = await der; + expect(() => parseToken(bytes), name).toThrow(CmsFormError); + } + // What decides nothing in a token: crls, its certificate twice, and the signing-certificate-v2 in the place of + // signing-certificate. + const fine: [string, b.TokenOptions, { seconds: number; nanos: number }][] = [ + ['a CRL', { cms: { crls: [seq(b.int(1))] } }, { seconds: 0, nanos: 0 }], + ['two CRLs', { cms: { crls: [seq(b.int(1)), seq(b.int(2))] } }, { seconds: 0, nanos: 0 }], + ['the certificate twice', { cms: { extraCerts: [tsa.cert] } }, { seconds: 0, nanos: 0 }], + ['signing-certificate-v2', { cms: { sigCertV2: true } }, { seconds: 0, nanos: 0 }], + ['v2 beside a wrong v1', { cms: { sigCertV2: true, sigCertV1: true, essCert: undefined as unknown as Uint8Array } }, { seconds: 0, nanos: 0 }], + ['a sid by keyIdentifier', { cms: { ski: true } }, { seconds: 0, nanos: 0 }], + ['a signature of SHA-512', { cms: { hash: 'SHA-512' } }, { seconds: 0, nanos: 0 }], + ['an imprint of SHA-512', { hash: 'SHA-512' }, { seconds: 0, nanos: 0 }], + ['an accuracy of 1.5 s', { accuracy: b.accuracyOf(1, 500) }, { seconds: 1, nanos: 500_000_000 }], + ['an accuracy of 2 s and 3 µs', { accuracy: b.accuracyOf(2, 0, 3) }, { seconds: 2, nanos: 3_000 }], + ]; + for (const [name, o, accuracy] of fine) { + const t = parseToken(await b.token(subject, now, o, tsa)); + expect([checkToken(t, subject), t.accuracy, toHex(t.tsa.hash)], name).toEqual([true, accuracy, toHex(sha256(tsa.cert))]); + } + }); + + // The TSTInfo is an OCTET STRING, so it is checked field by field, and what DER forbids, or what would make a seal after + // the opening date look before it, is a form error (spec §29.11, S2). + it('reads a TSTInfo field by field', async () => { + const { seq, tlv, int, bool, NULL, oid } = b; + const good = b.generalizedTime('20260930120000Z'); + const fields = async (gen: Uint8Array): Promise => [int(1), oid('1.2.3.4'), seq(b.hashAlg('SHA-256'), b.octets(await b.digest('SHA-256', subject))), int(42), gen]; + const info = async (gen: Uint8Array, ...after: Uint8Array[]): Promise => seq(...(await fields(gen)), ...after); + const parses = async (i: Uint8Array): Promise> => { + const t = parseToken(await b.tokenRaw(i, tsa)); + expect(checkToken(t, subject)).toBe(true); + return t; + }; + const base = await parses(await info(good)); + expect([base.genTime, base.accuracy]).toEqual([instant(now), { seconds: 0, nanos: 0 }]); + const half = await parses(await info(b.generalizedTime('20260930120000.5Z'), seq(int(2), tlv(0x80, Uint8Array.of(5))))); + expect([half.genTime, half.accuracy]).toEqual([{ seconds: instant(now).seconds, nanos: 500_000_000 }, { seconds: 2, nanos: 5_000_000 }]); + // The optional fields, in their order, each once. + const tsaName = tlv(0xa0, tlv(0xa4, seq())); + const exts = tlv(0xa1, seq(oid('1.2.3'), b.octets(new Uint8Array(0)))); + const ms = (...c: number[]): Uint8Array => tlv(0x80, Uint8Array.from(c)); + const us = (...c: number[]): Uint8Array => tlv(0x81, Uint8Array.from(c)); + const fine: [string, Uint8Array[], { seconds: number; nanos: number }][] = [ + ['an empty accuracy', [seq()], { seconds: 0, nanos: 0 }], + ['only millis', [seq(ms(5))], { seconds: 0, nanos: 5_000_000 }], + ['only micros', [seq(us(7))], { seconds: 0, nanos: 7_000 }], + ['millis and micros of 999', [seq(ms(0x03, 0xe7), us(0x03, 0xe7))], { seconds: 0, nanos: 999_999_000 }], + ['millis of 128', [seq(ms(0, 0x80))], { seconds: 0, nanos: 128_000_000 }], + ['millis of 300', [seq(ms(0x01, 0x2c))], { seconds: 0, nanos: 300_000_000 }], + ['seconds, millis and micros', [seq(int(1), ms(5), us(7))], { seconds: 1, nanos: 5_007_000 }], + ['2^31 - 1 seconds', [seq(int(2 ** 31 - 1))], { seconds: 2 ** 31 - 1, nanos: 0 }], + ['ordering TRUE', [bool(true)], { seconds: 0, nanos: 0 }], + ['an accuracy and ordering TRUE', [seq(int(1)), bool(true)], { seconds: 1, nanos: 0 }], + ['a nonce', [int(99)], { seconds: 0, nanos: 0 }], + ['ordering TRUE and a nonce', [bool(true), int(99)], { seconds: 0, nanos: 0 }], + ['a tsa', [tsaName], { seconds: 0, nanos: 0 }], + ['extensions', [exts], { seconds: 0, nanos: 0 }], + ['every field', [seq(int(3)), bool(true), int(99), tsaName, exts], { seconds: 3, nanos: 0 }], + ]; + for (const [name, after, accuracy] of fine) expect((await parses(await info(good, ...after))).accuracy, name).toEqual(accuracy); + const f = await fields(good); + const withField = (i: number, v: Uint8Array): Uint8Array => seq(...f.map((x, j) => (j === i ? v : x))); + const h = await b.digest('SHA-256', subject); + const big = b.hex('010000000000000005'); + const bad: [string, Uint8Array, string][] = [ + ['a negative accuracy', await info(good, seq(int(-31536000))), 'accuracy seconds outside 0 to 2^31 - 1'], + ['an accuracy of -1', await info(good, seq(int(-1))), 'accuracy seconds outside 0 to 2^31 - 1'], + ['an accuracy that overflows', await info(good, seq(int(9223372037))), 'accuracy seconds outside 0 to 2^31 - 1'], + ['an accuracy of 2^31 seconds', await info(good, seq(int(2 ** 31))), 'accuracy seconds outside 0 to 2^31 - 1'], + ['an accuracy of 2^64 + 5 seconds', await info(good, seq(b.intBytes(big))), 'accuracy seconds outside 0 to 2^31 - 1'], + ['millis of 0', await info(good, seq(ms(0))), 'accuracy millis or micros outside 1 to 999'], + ['millis of 1000', await info(good, seq(ms(0x03, 0xe8))), 'accuracy millis or micros outside 1 to 999'], + ['millis of 5000', await info(good, seq(ms(0x13, 0x88))), 'accuracy millis or micros outside 1 to 999'], + ['millis of -1', await info(good, seq(ms(0xff))), 'accuracy millis or micros that are not a minimal INTEGER'], + ['millis of 5 in two bytes', await info(good, seq(ms(0, 5))), 'accuracy millis or micros that are not a minimal INTEGER'], + ['millis of 2^64 + 5', await info(good, seq(ms(...big))), 'accuracy millis or micros that are not a minimal INTEGER'], + ['empty millis', await info(good, seq(ms())), 'accuracy millis or micros that are not a minimal INTEGER'], + ['millis constructed', await info(good, seq(tlv(0xa0, int(5)))), 'accuracy has a field out of its place'], + ['micros of 0', await info(good, seq(us(0))), 'accuracy millis or micros outside 1 to 999'], + ['micros of 1000', await info(good, seq(us(0x03, 0xe8))), 'accuracy millis or micros outside 1 to 999'], + ['micros before millis', await info(good, seq(us(1), ms(1))), 'accuracy has a field out of its place'], + ['a field after the micros', await info(good, seq(us(1), tlv(0x82, Uint8Array.of(1)))), 'accuracy has a field out of its place'], + ['millis as an INTEGER', await info(good, seq(int(1), int(5))), 'accuracy has a field out of its place'], + ['genTime with an offset', await info(b.generalizedTime('20260930130000+0100')), 'der: a time that is not in the form of DER'], + ['genTime with a trailing zero', await info(b.generalizedTime('20260930120000.50Z')), 'der: a time that is not in the form of DER'], + ['genTime without seconds', await info(b.generalizedTime('202609301200Z')), 'der: a time that is not in the form of DER'], + ['genTime that does not exist', await info(b.generalizedTime('20261331120000Z')), 'der: a date or a time that does not exist'], + ['genTime after a byte order mark', await info(b.tlv(0x18, Uint8Array.of(0xef, 0xbb, 0xbf), te.encode('20260930120000Z'))), 'der: a time that is not in the form of DER'], + ['genTime as a UTCTime', await info(b.utcTime('260930120000Z')), 'policy, serialNumber or genTime'], + ['ordering FALSE written', await info(good, bool(false)), 'ordering FALSE is its default and DER does not write it'], + ['ordering of two bytes', await info(good, tlv(0x01, Uint8Array.of(0xff, 0xff))), 'der: a BOOLEAN that is not 00 or FF'], + ['two accuracies', await info(good, seq(int(1)), seq(int(1))), 'a field out of its place, or one that does not exist'], + ['two orderings', await info(good, bool(true), bool(true)), 'a field out of its place, or one that does not exist'], + ['an extra INTEGER at the end', await info(good, int(7), int(8), int(9)), 'a field out of its place, or one that does not exist'], + ['two tsa fields', await info(good, tsaName, tsaName), 'a field out of its place, or one that does not exist'], + ['two extensions', await info(good, exts, exts), 'a field out of its place, or one that does not exist'], + ['a field after the extensions', await info(good, exts, int(1)), 'a field out of its place, or one that does not exist'], + ['a field out of order', await info(good, int(7), seq(int(1))), 'a field out of its place, or one that does not exist'], + ['a reserved tag in the extensions', await info(good, tlv(0xa1, tlv(0x0e, Uint8Array.of(0x41)))), 'der: the universal type 14, which the profile does not use'], + ['an unused-bits BIT STRING inside', await info(good, tlv(0xa1, tlv(0x03, Uint8Array.of(7, 0xff)))), 'der: a BIT STRING with unused bits that are not zero'], + ['version 2', seq(int(2)), 'not a SEQUENCE of at least five fields'], + ['version 2, the fields complete', withField(0, int(2)), 'the version is not 1'], + ['version 2^64 + 1', withField(0, b.intBytes(b.hex('010000000000000001'))), 'the version is not 1'], + ['the version as an ENUMERATED', withField(0, tlv(0x0a, Uint8Array.of(1))), 'the version is not 1'], + ['the policy as an INTEGER', withField(1, int(1)), 'policy, serialNumber or genTime'], + ['the serialNumber as OCTETS', withField(3, b.octets(Uint8Array.of(42))), 'policy, serialNumber or genTime'], + ['the messageImprint as a SET', withField(2, tlv(0x31, seq(oid(b.OID.sha['SHA-256'])), b.octets(h))), 'the messageImprint'], + ['a messageImprint of three fields', withField(2, seq(seq(oid(b.OID.sha['SHA-256'])), b.octets(h), NULL)), 'the messageImprint'], + ['a messageImprint of one field', withField(2, seq(seq(oid(b.OID.sha['SHA-256'])))), 'the messageImprint'], + ['a messageImprint algorithm as a SET', withField(2, seq(tlv(0x31, oid(b.OID.sha['SHA-256'])), b.octets(h))), 'the messageImprint'], + ['a hashedMessage as a BIT STRING', withField(2, seq(seq(oid(b.OID.sha['SHA-256'])), b.bitString(h))), 'the messageImprint'], + ['four fields', seq(...f.slice(0, 4)), 'not a SEQUENCE of at least five fields'], + ['a SET', tlv(0x31, ...f), 'not a SEQUENCE of at least five fields'], + ['not a SEQUENCE', int(1), 'not a SEQUENCE of at least five fields'], + ['not DER', concatBytes(await info(good), Uint8Array.of(0)), 'der: 1 bytes after the element'], + ]; + for (const [name, i, text] of bad) await expect(b.tokenRaw(i, tsa).then(parseToken), name).rejects.toThrow(`cms: the form breaks the profile: the TSTInfo: ${text}`); + // An imprint algorithm that is no AlgorithmIdentifier is a form error too. + const noAlg = seq(int(1), oid('1.2.3.4'), seq(seq(int(1)), b.octets(new Uint8Array(32))), int(42), good); + await expect(b.tokenRaw(noAlg, tsa).then(parseToken)).rejects.toThrow(new CmsFormError('an AlgorithmIdentifier without an object identifier')); + }); + + // Spec §29.11: the token in the order of its profile, form (S2), algorithms (S1) and verification (S3). + it('follows the order of its profile: S2, S1 and S3', async () => { + const small = b.newCert({ cn: 'TSA 1024' }, await b.newKey('rsa', 1024)); + const compressedTSA = b.newCert({ cn: 'TSA comprimida', spki: b.spkiEC(b.oid(b.OID.p256), b.compressed(ecKey2)) }, ecKey2); + const notYet = b.newCert({ cn: 'TSA futura', from: new Date(now.getTime() + 1000) }, ecKey2); + const expired = b.newCert({ cn: 'TSA caducada', to: new Date(now.getTime() - 1000) }, ecKey2); + const exact = b.newCert({ cn: 'TSA justa', from: now, to: now }, ecKey2); + const tokenOf = (o: b.TokenOptions, s: b.Signer): Promise => b.token(subject, now, o, s); + const algorithm: [string, Promise][] = [ + ['an imprint of SHA-1', tokenOf({ hash: 'SHA-1' }, tsa)], + ['a signature of SHA-1', tokenOf({ cms: { digestAlg: b.hashAlg('SHA-1') } }, tsa)], + ['a key of 1024 bits', tokenOf({}, small)], + ['a compressed key', tokenOf({}, compressedTSA)], + ['PSS with trailerField', tokenOf({ cms: { pss: true, pssTrailer: true } }, luis)], + ['an imprint with an arc of 2^31', b.tstInfo(subject, now).then((i) => b.tokenRaw(b.edit(i, replace(b.seq(b.tlv(0x06, b.hex('6086480165030402888080800001')))), 2, 0), tsa))], + ]; + for (const [name, der] of algorithm) { + const bytes = await der; + expect(() => parseToken(bytes), name).toThrow(CmsAlgorithmError); + } + const form: [string, Promise][] = [ + ['S2 before S1: SHA-1 and version 2', tokenOf({ hash: 'SHA-1', version: 2 }, tsa)], + ['S2 before S1: SHA-1 and no digest', tokenOf({ hash: 'SHA-1', cms: { noMessageDigest: true } }, tsa)], + ]; + for (const [name, der] of form) { + const bytes = await der; + expect(() => parseToken(bytes), name).toThrow(CmsFormError); + } + // S3: it reads, and does not verify: a messageImprint of another length among them. + const h = await b.digest('SHA-256', subject); + const invalid: [string, Promise][] = [ + ['the signature of the authority, a bit flipped', tokenOf({ cms: { corruptSignature: true } }, tsa)], + ['the message-digest of another TSTInfo', tokenOf({ cms: { message: other } }, tsa)], + ['an imprint of 33 bytes', tokenOf({ imprint: concatBytes(h, Uint8Array.of(0)) }, tsa)], + ['an imprint of 31 bytes', tokenOf({ imprint: h.subarray(0, 31) }, tsa)], + ['an empty imprint', tokenOf({ imprint: new Uint8Array(0) }, tsa)], + ['another imprint', tokenOf({ imprint: new Uint8Array(32) }, tsa)], + ['an authority not yet valid', tokenOf({}, notYet)], + ['an authority expired', tokenOf({}, expired)], + ['an authority of PSS, a bit flipped', tokenOf({ cms: { pss: true, corruptSignature: true } }, luis)], + ['an authority of RSA with an ECDSA algorithm', tokenOf({ cms: { sigAlg: b.algID(b.OID.ecdsa['SHA-256']) } }, luis)], + ]; + for (const [name, der] of invalid) expect(checkToken(parseToken(await der), subject), name).toBe(false); + // Valid: at the first and the last instant of the validity of the authority, with RSA, PSS and SHA-512, and with the + // imprint of SHA-384, which only seal_type 2 refuses. + const valid: [string, Promise][] = [ + ['an authority valid exactly then', tokenOf({}, exact)], + ['an authority of RSA', tokenOf({}, luis)], + ['an authority of PSS', tokenOf({ cms: { pss: true } }, luis)], + ['a signature of SHA-512', tokenOf({ cms: { hash: 'SHA-512' } }, tsa)], + ]; + for (const [name, der] of valid) { + const t = parseToken(await der); + expect([checkToken(t, subject), tokenImprintIsSHA256(t)], name).toEqual([true, true]); + } + const t384 = parseToken(await tokenOf({ hash: 'SHA-384' }, tsa)); + expect([checkToken(t384, subject), tokenImprintIsSHA256(t384)]).toEqual([true, false]); + }); +}); diff --git a/src/lib/dkc/cms.ts b/src/lib/dkc/cms.ts index a0e3a7a..0c20533 100644 --- a/src/lib/dkc/cms.ts +++ b/src/lib/dkc/cms.ts @@ -1,5 +1,5 @@ // The CMS signatures (RFC 5652) and the RFC 3161 time-stamp tokens that spec -// v0.11 §29.10 and §29.11 define, with the CAdES profile that AutoFirma and +// v0.12 §29.10 and §29.11 define, with the CAdES profile that AutoFirma and // other signing applications produce, checked with a closed table of // algorithms. It is the port of the Go package internal/cms: the same order of // checks, the same errors and the same results, which the shared vectors @@ -10,14 +10,16 @@ // // It checks the signature and the dates, never who issued a certificate or // whether it was revoked: a validator of the country that corresponds does -// that (spec §29.10). Internal: index.ts does not re-export it. +// that (spec §29.10). Object identifiers are compared by the bytes of their +// DER, here in hexadecimal, so that an arc of any size is only an identifier +// that the table does not have. Internal: index.ts does not re-export it. import { sha1 } from '@noble/hashes/legacy.js'; import { sha256, sha384, sha512 } from '@noble/hashes/sha2.js'; import { p256, p384, p521 } from '@noble/curves/nist.js'; import { concatBytes, decodeUtf8, equalBytes, toHex } from './bytes.ts'; import { compareInstants, type Instant } from './datekey.ts'; -import { checkDer, derContent, DerError, setOfSorted, splitDer } from './der.ts'; +import { checkDer, derContent, type DerError, parseTime, setOfSorted, splitDer } from './der.ts'; /** The form of a signature or a token breaks the profile of spec §29.10 or §29.11: the verdicts F1 and S2. */ export class CmsFormError extends Error { @@ -35,120 +37,107 @@ export class CmsAlgorithmError extends Error { } } -// ---- small DER readers ------------------------------------------------------ -// -// Both read in time linear in the length of the element: a bigint built by a -// shift per byte costs the square of it, some 700 ms for 60 KB, and the -// security area holds up to 64 KiB. - -// The longest arc, in digits of base 128, that accumulates in a number: 49 -// bits, which a double holds exactly. -const MAX_NUMBER_ARC = 7; -const HEX_DIGITS = '0123456789abcdef'; - -// The dotted text of an OBJECT IDENTIFIER, as Go's ObjectIdentifier.String. -function oidOf(el: Uint8Array): string { - const c = derContent(el); - const parts: string[] = []; - let start = 0; - for (let i = 0; i < c.length; i++) { - if ((c[i]! & 0x80) !== 0) continue; - const v = arcValue(c.subarray(start, i + 1)); - if (parts.length === 0) { - const x = v < 40n ? 0n : v < 80n ? 1n : 2n; - parts.push(String(x), String(v - 40n * x)); - } else { - parts.push(String(v)); - } - start = i + 1; +/** + * A certificate that breaks the profile of spec §29.10. It decides nothing + * unless a SignerInfo names it: the sid of a signer whose certificate breaks it + * names none. + */ +export class CertificateError extends Error { + constructor(message: string) { + super(`certificate: ${message}`); + this.name = 'CertificateError'; } - return parts.join('.'); } -// The value of an arc from its digits of base 128. An arc of more than seven -// digits, which no OID of the profile has, is read whole from its bits as -// hexadecimal, never by a shift per digit. -function arcValue(d: Uint8Array): bigint { - if (d.length <= MAX_NUMBER_ARC) { - let n = 0; - for (const x of d) n = n * 128 + (x & 0x7f); - return BigInt(n); - } - const nibbles: string[] = []; - let acc = 0; - let bits = 0; - for (let i = d.length - 1; i >= 0; i--) { - acc |= (d[i]! & 0x7f) << bits; - bits += 7; - for (; bits >= 4; bits -= 4) { - nibbles.push(HEX_DIGITS[acc & 15]!); - acc >>>= 4; - } - } - nibbles.push(HEX_DIGITS[acc]!); - return BigInt(`0x${nibbles.reverse().join('')}`); +function form(message: string): CmsFormError { + return new CmsFormError(message); } -// An INTEGER, in two's complement, read whole from its hexadecimal. -function intOf(el: Uint8Array): bigint { - const c = derContent(el); - const v = BigInt(`0x0${toHex(c)}`); - return c.length > 0 && (c[0]! & 0x80) !== 0 ? v - (1n << BigInt(8 * c.length)) : v; +// ---- small DER readers ------------------------------------------------------ + +// The identifier octet and the children of the element b, whose DER was +// checked; undefined for a primitive element, where Go's der.Split fails. +function split(b: Uint8Array): { id: number; children: Uint8Array[] } | undefined { + return (b[0]! & 0x20) === 0 ? undefined : splitDer(b); } -const OID = { - data: '1.2.840.113549.1.7.1', - signedData: '1.2.840.113549.1.7.2', - contentType: '1.2.840.113549.1.9.3', - messageDigest: '1.2.840.113549.1.9.4', - sigCertV1: '1.2.840.113549.1.9.16.2.12', - sigCertV2: '1.2.840.113549.1.9.16.2.47', - sigTimeStamp: '1.2.840.113549.1.9.16.2.14', - tstInfo: '1.2.840.113549.1.9.16.1.4', - riOCSP: '1.3.6.1.5.5.7.16.2', - sha256: '2.16.840.1.101.3.4.2.1', - sha384: '2.16.840.1.101.3.4.2.2', - sha512: '2.16.840.1.101.3.4.2.3', - rsaEncryption: '1.2.840.113549.1.1.1', - sha256RSA: '1.2.840.113549.1.1.11', - sha384RSA: '1.2.840.113549.1.1.12', - sha512RSA: '1.2.840.113549.1.1.13', - pss: '1.2.840.113549.1.1.10', - mgf1: '1.2.840.113549.1.1.8', - ecdsa256: '1.2.840.10045.4.3.2', - ecdsa384: '1.2.840.10045.4.3.3', - ecdsa512: '1.2.840.10045.4.3.4', - ecPublicKey: '1.2.840.10045.2.1', - p256: '1.2.840.10045.3.1.7', - p384: '1.3.132.0.34', - p521: '1.3.132.0.35', - ski: '2.5.29.14', - commonName: '2.5.4.3', - surname: '2.5.4.4', - givenName: '2.5.4.42', -} as const; +// The content of the DER of the object identifier written with dots, in +// hexadecimal: what this module compares. +function oid(s: string): string { + const arcs = s.split('.').map(Number); + const out: number[] = []; + for (const a of [arcs[0]! * 40 + arcs[1]!, ...arcs.slice(2)]) { + const digits = [a % 128]; + for (let v = Math.floor(a / 128); v > 0; v = Math.floor(v / 128)) digits.unshift((v % 128) | 0x80); + out.push(...digits); + } + return toHex(Uint8Array.from(out)); +} -const NULL_PARAMS = Uint8Array.of(5, 0); +// The content of the object identifier element b, in hexadecimal; undefined +// for another element. +function oidOf(b: Uint8Array): string | undefined { + return b[0] === 0x06 ? toHex(derContent(b)) : undefined; +} -function form(message: string): CmsFormError { - return new CmsFormError(message); +// An INTEGER element of at most 4 bytes that is not negative, as Go's +// smallInt; undefined for anything else. +function smallInt(b: Uint8Array): number | undefined { + if (b[0] !== 0x02) return undefined; + const c = derContent(b); + if (c.length === 0 || c.length > 4 || (c[0]! & 0x80) !== 0) return undefined; + let n = 0; + for (const x of c) n = n * 256 + x; + return n; } -// Runs a DER reading whose failure is a form error. -function der(f: () => T): T { - try { - return f(); - } catch (err) { - if (err instanceof DerError) throw form(err.message); - throw err; - } +// The bit length of the unsigned big-endian integer b, as Go's big.Int.BitLen. +function bitLen(b: Uint8Array): number { + let i = 0; + while (i < b.length && b[i] === 0) i++; + return i === b.length ? 0 : (b.length - i - 1) * 8 + 32 - Math.clz32(b[i]!); } +// The object identifiers of the profile. +const OID = { + data: oid('1.2.840.113549.1.7.1'), + signedData: oid('1.2.840.113549.1.7.2'), + contentType: oid('1.2.840.113549.1.9.3'), + messageDigest: oid('1.2.840.113549.1.9.4'), + sigCertV1: oid('1.2.840.113549.1.9.16.2.12'), + sigCertV2: oid('1.2.840.113549.1.9.16.2.47'), + sigTimeStamp: oid('1.2.840.113549.1.9.16.2.14'), + tstInfo: oid('1.2.840.113549.1.9.16.1.4'), + riOCSP: oid('1.3.6.1.5.5.7.16.2'), + sha256: oid('2.16.840.1.101.3.4.2.1'), + sha384: oid('2.16.840.1.101.3.4.2.2'), + sha512: oid('2.16.840.1.101.3.4.2.3'), + rsaEncryption: oid('1.2.840.113549.1.1.1'), + sha256RSA: oid('1.2.840.113549.1.1.11'), + sha384RSA: oid('1.2.840.113549.1.1.12'), + sha512RSA: oid('1.2.840.113549.1.1.13'), + pss: oid('1.2.840.113549.1.1.10'), + mgf1: oid('1.2.840.113549.1.1.8'), + ecdsa256: oid('1.2.840.10045.4.3.2'), + ecdsa384: oid('1.2.840.10045.4.3.3'), + ecdsa512: oid('1.2.840.10045.4.3.4'), + ecPublicKey: oid('1.2.840.10045.2.1'), + p256: oid('1.2.840.10045.3.1.7'), + p384: oid('1.3.132.0.34'), + p521: oid('1.3.132.0.35'), + ski: oid('2.5.29.14'), + commonName: oid('2.5.4.3'), + surname: oid('2.5.4.4'), + organizationName: oid('2.5.4.10'), + givenName: oid('2.5.4.42'), +} as const; + +const NULL_PARAMS = Uint8Array.of(5, 0); + // ---- hashes ----------------------------------------------------------------- interface Hash { readonly size: number; - readonly blockSize: number; readonly digest: (b: Uint8Array) => Uint8Array; /** The DER prefix of the DigestInfo of RSASSA-PKCS1-v1_5. */ readonly prefix: Uint8Array; @@ -156,56 +145,209 @@ interface Hash { const hexBytes = (s: string): Uint8Array => Uint8Array.from(s.match(/../g)!, (b) => parseInt(b, 16)); -const SHA256: Hash = { size: 32, blockSize: 64, digest: sha256, prefix: hexBytes('3031300d060960864801650304020105000420') }; -const SHA384: Hash = { size: 48, blockSize: 128, digest: sha384, prefix: hexBytes('3041300d060960864801650304020205000430') }; -const SHA512: Hash = { size: 64, blockSize: 128, digest: sha512, prefix: hexBytes('3051300d060960864801650304020305000440') }; +const SHA256: Hash = { size: 32, digest: sha256, prefix: hexBytes('3031300d060960864801650304020105000420') }; +const SHA384: Hash = { size: 48, digest: sha384, prefix: hexBytes('3041300d060960864801650304020205000430') }; +const SHA512: Hash = { size: 64, digest: sha512, prefix: hexBytes('3051300d060960864801650304020305000440') }; -const HASH_OF_OID: Record = { [OID.sha256]: SHA256, [OID.sha384]: SHA384, [OID.sha512]: SHA512 }; +const HASH_OF_OID: Readonly> = { [OID.sha256]: SHA256, [OID.sha384]: SHA384, [OID.sha512]: SHA512 }; // ---- certificates ----------------------------------------------------------- -/** An RDN: the attributes of a relative distinguished name, as (type OID, value) with the value as text when it is a string. */ -type Rdn = readonly { readonly type: string; readonly value: string | undefined }[]; +/** An AttributeTypeAndValue of a name: the content of its object identifier, in hexadecimal, and the DER of its value. */ +interface Attribute { + readonly oid: string; + readonly value: Uint8Array; +} /** - * An X.509 certificate read for what spec v0.11 §29.10 uses of it: who it names, - * when it is valid and its key. DateKeys does not check who issued it. It is - * read here and not with a library of certificates, so that a key of a curve - * that is not in the table makes a signature "not verifiable" and not - * malformed (the certificate is still the one a signer names). + * An X.509 certificate read with the profile of spec §29.10 for what DateKeys + * uses of it: who it names, when it is valid and its key. DateKeys does not + * check who issued it. It is read field by field, as the Go reference reads + * it, and not with a library of certificates, so that two implementations read + * it the same: a certificate with a key of a curve outside the table, such as + * brainpool, is still one that a signer names, and its signature is "not + * verifiable", not malformed. */ export interface Cert { /** The DER of the certificate, and its SHA-256. */ readonly raw: Uint8Array; readonly hash: Uint8Array; - readonly serial: bigint; + /** The content of serialNumber, and the DER of the issuer and of the subject: what a sid names. */ + readonly serial: Uint8Array; readonly rawIssuer: Uint8Array; readonly rawSubject: Uint8Array; + /** The keyIdentifier of the extension subjectKeyIdentifier, undefined without it. */ readonly ski: Uint8Array | undefined; readonly notBefore: Instant; readonly notAfter: Instant; /** The DER of the SubjectPublicKeyInfo. */ readonly spki: Uint8Array; - readonly subject: readonly Rdn[]; - readonly issuer: readonly Rdn[]; + readonly subject: readonly Attribute[]; + readonly issuer: readonly Attribute[]; +} + +/** + * Reads the DER of a certificate with the profile of spec §29.10: + * - a SEQUENCE of tbsCertificate, signatureAlgorithm and a BIT STRING; + * - tbsCertificate: version [0], which is 2 (version 3), serialNumber, + * signature, issuer, validity, subject and subjectPublicKeyInfo, then [1], + * [2] and [3] when present, in that order and nothing after; + * - a name: a SEQUENCE of non-empty SETs of AttributeTypeAndValue, each an + * object identifier and one value, in any order; + * - validity: two times, UTCTime or GeneralizedTime without a fraction; + * - extensions: [3] holds a SEQUENCE of one or more Extension, each an object + * identifier, an optional BOOLEAN and an OCTET STRING, none twice; + * subjectKeyIdentifier holds a non-empty OCTET STRING. + * + * What the profile does not read decides nothing: the signature of the + * certificate, its algorithm and the other extensions. It throws a + * CertificateError, with the text of Go's ParseCert, for a certificate that + * breaks the profile, and for bytes that are not DER, which a certificate + * read from a signature always is. + */ +export function parseCert(raw: Uint8Array): Cert { + const bad = (what: string): never => { + throw new CertificateError(what); + }; + try { + checkDer(raw); + } catch (err) { + bad((err as DerError).message); + } + const top = split(raw); + if (top === undefined || top.id !== 0x30 || top.children.length !== 3 || top.children[0]![0] !== 0x30 || top.children[1]![0] !== 0x30 || top.children[2]![0] !== 0x03) { + bad('not a SEQUENCE of tbsCertificate, signatureAlgorithm and signature'); + } + let f = splitDer(top!.children[0]!).children; + if (f.length < 7 || f[0]![0] !== 0xa0) bad('a tbsCertificate without version, or with fields missing'); + const version = splitDer(f[0]!).children; + if (version.length !== 1 || !equalBytes(version[0]!, Uint8Array.of(0x02, 0x01, 0x02))) bad('the version is not 3'); + f = f.slice(1); + if (f[0]![0] !== 0x02 || f[1]![0] !== 0x30 || f[2]![0] !== 0x30 || f[3]![0] !== 0x30 || f[4]![0] !== 0x30 || f[5]![0] !== 0x30) { + bad('the fields of tbsCertificate'); + } + const issuer = parseName(f[2]!, 'issuer'); + const subject = parseName(f[4]!, 'subject'); + const validity = splitDer(f[3]!).children; + if (validity.length !== 2) bad('validity'); + const notBefore = certTime(validity[0]!, 'notBefore'); + const notAfter = certTime(validity[1]!, 'notAfter'); + let rest = f.slice(6); + for (const tag of [0x81, 0x82]) { + // issuerUniqueID, subjectUniqueID + if (rest.length > 0 && rest[0]![0] === tag) rest = rest.slice(1); + } + let ski: Uint8Array | undefined; + if (rest.length > 0 && rest[0]![0] === 0xa3) { + ski = parseExtensions(rest[0]!); + rest = rest.slice(1); + } + if (rest.length !== 0) bad('a field out of its place, or after the last'); + return { raw, hash: sha256(raw), serial: derContent(f[0]!), rawIssuer: f[2]!, rawSubject: f[4]!, ski, notBefore, notAfter, spki: f[5]!, subject, issuer }; +} + +// A time of validity: a UTCTime or a GeneralizedTime in DER, without a fraction of seconds (RFC 5280 4.1.2.5). +function certTime(b: Uint8Array, which: string): Instant { + let t: { time: Instant; fraction: boolean }; + try { + t = parseTime(b); + } catch (err) { + throw new CertificateError(`${which}: ${(err as DerError).message}`); + } + if (t.fraction) throw new CertificateError(`${which}: a GeneralizedTime with a fraction of seconds`); + return t.time; +} + +// A Name: a SEQUENCE of RelativeDistinguishedName, each a non-empty SET of +// AttributeTypeAndValue. The order of a SET is not checked: a name only gives +// the text that a reader shows. +function parseName(b: Uint8Array, which: string): Attribute[] { + const out: Attribute[] = []; + for (const rdn of splitDer(b).children) { + const atvs = split(rdn); + if (atvs === undefined || atvs.id !== 0x31 || atvs.children.length === 0) { + throw new CertificateError(`${which}: a RelativeDistinguishedName that is not a non-empty SET`); + } + for (const atv of atvs.children) { + const p = split(atv); + if (p === undefined || p.id !== 0x30 || p.children.length !== 2 || p.children[0]![0] !== 0x06) { + throw new CertificateError(`${which}: an AttributeTypeAndValue that is not an object identifier and a value`); + } + out.push({ oid: oidOf(p.children[0]!)!, value: p.children[1]! }); + } + } + return out; } -// The text of an attribute value that is a string type; undefined for any other. -function attrText(el: Uint8Array): string | undefined { - const c = derContent(el); - switch (el[0]) { - case 0x0c: // UTF8String, whose leading U+FEFF stays, as in Go, for the rules of text to refuse +// [3] of tbsCertificate: the keyIdentifier of subjectKeyIdentifier, undefined without it. +function parseExtensions(b: Uint8Array): Uint8Array | undefined { + const inner = splitDer(b).children; + if (inner.length !== 1 || inner[0]![0] !== 0x30) throw new CertificateError('extensions'); + const exts = splitDer(inner[0]!).children; + if (exts.length === 0) throw new CertificateError('extensions without an Extension'); + const seen = new Set(); + let ski: Uint8Array | undefined; + for (const e of exts) { + const p = split(e); + const n = p?.children.length ?? 0; + if (p === undefined || p.id !== 0x30 || n < 2 || n > 3 || p.children[0]![0] !== 0x06 || p.children[n - 1]![0] !== 0x04 || (n === 3 && p.children[1]![0] !== 0x01)) { + throw new CertificateError('an Extension that is not an object identifier, an optional BOOLEAN and an OCTET STRING'); + } + const o = oidOf(p.children[0]!)!; + if (seen.has(o)) throw new CertificateError('an extension twice'); + seen.add(o); + if (o === OID.ski) { + const v = derContent(p.children[n - 1]!); + try { + checkDer(v); + } catch { + throw new CertificateError('a subjectKeyIdentifier that is not an OCTET STRING'); + } + if (v[0] !== 0x04) throw new CertificateError('a subjectKeyIdentifier that is not an OCTET STRING'); + ski = derContent(v); + if (ski.length === 0) throw new CertificateError('an empty subjectKeyIdentifier'); + } + } + return ski; +} + +// The alphabet of PrintableString (X.680). +const PRINTABLE = new Set(Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '()+,-./:=?", (c) => c.charCodeAt(0))); + +// A string of bytes under 0x80, as text. +function ascii(c: Uint8Array): string { + let s = ''; + for (const x of c) s += String.fromCharCode(x); + return s; +} + +/** + * The text of the value of an attribute of a name, and undefined when it is + * not of a string type that the profile reads, or when its bytes break its + * type (spec §29.10): UTF8String in valid UTF-8, PrintableString in its + * alphabet, IA5String and TeletexString in ASCII, and BMPString in UTF-16BE + * without surrogates. Nothing is removed from the text: a byte order mark or + * a terminator stays, and the rules of §29.6 decide. + */ +function text(v: Uint8Array): string | undefined { + const c = derContent(v); + switch (v[0]) { + case 0x0c: // UTF8String return decodeUtf8(c); case 0x13: // PrintableString + return c.every((x) => PRINTABLE.has(x)) ? ascii(c) : undefined; + case 0x14: // TeletexString case 0x16: // IA5String - case 0x1a: // VisibleString - case 0x14: // T61String, as ISO 8859-1 - return String.fromCharCode(...c); + return c.every((x) => x <= 0x7f) ? ascii(c) : undefined; case 0x1e: { // BMPString if (c.length % 2 !== 0) return undefined; let s = ''; - for (let i = 0; i < c.length; i += 2) s += String.fromCharCode((c[i]! << 8) | c[i + 1]!); + for (let i = 0; i < c.length; i += 2) { + const u = (c[i]! << 8) | c[i + 1]!; + if (u >= 0xd800 && u <= 0xdfff) return undefined; + s += String.fromCharCode(u); + } return s; } default: @@ -213,149 +355,44 @@ function attrText(el: Uint8Array): string | undefined { } } -function parseName(el: Uint8Array): readonly Rdn[] { - const { children } = splitDer(el); - return children.map((rdn) => { - if (rdn[0] !== 0x31) throw form('a Name with an RDN that is not a SET'); - return splitDer(rdn).children.map((atv) => { - const { children: kv } = splitDer(atv); - if (atv[0] !== 0x30 || kv.length !== 2 || kv[0]![0] !== 0x06) throw form('an AttributeTypeAndValue'); - return { type: oidOf(kv[0]!), value: attrText(kv[1]!) }; - }); - }); -} - -// The bytes of a time as text, a leading U+FEFF kept: no time starts with it. -const TIME_TEXT = new TextDecoder('utf-8', { ignoreBOM: true }); - -// UTCTime and GeneralizedTime as a certificate has them, YYMMDDHHMMSSZ and YYYYMMDDHHMMSSZ. -function parseCertTime(el: Uint8Array): Instant { - const s = TIME_TEXT.decode(derContent(el)); - const m = el[0] === 0x17 ? /^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)Z$/.exec(s) : el[0] === 0x18 ? /^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)Z$/.exec(s) : null; - if (m === null) throw form('a time of a certificate'); - let year = Number(m[1]); - if (el[0] === 0x17) year += year >= 50 ? 1900 : 2000; - return utc(year, Number(m[2]), Number(m[3]), Number(m[4]), Number(m[5]), Number(m[6])); -} - -function utc(year: number, month: number, day: number, hour: number, min: number, sec: number): Instant { - const d = new Date(0); - d.setUTCFullYear(year, month - 1, day); - d.setUTCHours(hour, min, sec, 0); - if (d.getUTCFullYear() !== year || d.getUTCMonth() !== month - 1 || d.getUTCDate() !== day || hour > 23 || min > 59 || sec > 59) throw form('a date that does not exist'); - return { seconds: d.getTime() / 1000, nanos: 0 }; -} - -/** Reads the DER of a certificate. */ -export function parseCert(raw: Uint8Array): Cert { - return der(() => { - checkDer(raw); - const { id, children } = splitDer(raw); - if (id !== 0x30 || children.length !== 3 || children[0]![0] !== 0x30 || children[1]![0] !== 0x30 || children[2]![0] !== 0x03) throw form('a Certificate'); - const tbs = splitDer(children[0]!).children; - let i = 0; - if (tbs[i]?.[0] === 0xa0) i++; // version - const [serial, , issuer, validity, subject, spki] = [tbs[i], tbs[i + 1], tbs[i + 2], tbs[i + 3], tbs[i + 4], tbs[i + 5]]; - if (serial?.[0] !== 0x02 || issuer?.[0] !== 0x30 || validity?.[0] !== 0x30 || subject?.[0] !== 0x30 || spki?.[0] !== 0x30) throw form('a TBSCertificate'); - i += 6; - // issuerUniqueID [1], subjectUniqueID [2] and extensions [3], in that order. - if (tbs[i]?.[0] === 0x81) i++; - if (tbs[i]?.[0] === 0x82) i++; - let ski: Uint8Array | undefined; - if (tbs[i]?.[0] === 0xa3) { - const seq = splitDer(tbs[i]!).children; - if (seq.length !== 1 || seq[0]![0] !== 0x30) throw form('the extensions'); - for (const ext of splitDer(seq[0]!).children) { - const parts = splitDer(ext).children; - if (parts.length < 2 || parts.length > 3 || parts[0]![0] !== 0x06) throw form('an Extension'); - if (oidOf(parts[0]!) === OID.ski) { - const v = derContent(parts[parts.length - 1]!); - checkDer(v); - if (v[0] !== 0x04) throw form('subjectKeyIdentifier'); - ski = derContent(v); - } - } - i++; +// The text of the only attribute of the type among attrs, and undefined when +// there is none, when there are several, or when its value is not text. +function nameText(attrs: readonly Attribute[], type: string): string | undefined { + let value: Uint8Array | undefined; + let n = 0; + for (const a of attrs) { + if (a.oid === type) { + value = a.value; + n++; } - if (i !== tbs.length) throw form('a TBSCertificate with something after its extensions'); - const times = splitDer(validity).children; - if (times.length !== 2) throw form('a Validity'); - return { - raw, - hash: sha256(raw), - serial: intOf(serial), - rawIssuer: issuer, - rawSubject: subject, - ski, - notBefore: parseCertTime(times[0]!), - notAfter: parseCertTime(times[1]!), - spki, - subject: parseName(subject), - issuer: parseName(issuer), - }; - }); -} - -function rdnString(name: readonly Rdn[], oid: string): string { - for (const set of name) for (const a of set) if (a.type === oid && a.value !== undefined) return a.value; - return ''; + } + return n === 1 ? text(value!) : undefined; } /** - * The name of the subject, taken from its commonName or from its givenName - * and surname, and '' when it has neither. The rules of text of spec §29.6 - * are the caller's, which shows the hash of the certificate when they fail. + * The name of the subject as spec §29.7 takes it: its givenName and its + * surname, when it has one of each, and its commonName otherwise; '' when it + * has neither. The commonName comes second because it may carry the national + * identifier of the person, as the one of the FNMT does. The rules of text of + * §29.6 are the caller's, which shows the hash of the certificate when they + * fail. */ export function certHolder(c: Cert): string { - const cn = rdnString(c.subject, OID.commonName); - if (cn !== '') return cn; - const given = rdnString(c.subject, OID.givenName); - const sur = rdnString(c.subject, OID.surname); - return given !== '' && sur !== '' ? `${given} ${sur}` : ''; + const given = nameText(c.subject, OID.givenName); + const sur = nameText(c.subject, OID.surname); + if (given !== undefined && sur !== undefined && given !== '' && sur !== '') return `${given} ${sur}`; + return nameText(c.subject, OID.commonName) ?? ''; } -const ATTRIBUTE_NAMES: Record = { - '2.5.4.6': 'C', - '2.5.4.10': 'O', - '2.5.4.11': 'OU', - '2.5.4.3': 'CN', - '2.5.4.5': 'SERIALNUMBER', - '2.5.4.7': 'L', - '2.5.4.8': 'ST', - '2.5.4.9': 'STREET', - '2.5.4.17': 'POSTALCODE', -}; - -// A Name as Go's pkix.RDNSequence.String writes it: the last RDN first, "type=value", "+" within an RDN. -function nameString(name: readonly Rdn[]): string { - let s = ''; - for (let i = 0; i < name.length; i++) { - const rdn = name[name.length - 1 - i]!; - if (i > 0) s += ','; - rdn.forEach((a, j) => { - if (j > 0) s += '+'; - const type = ATTRIBUTE_NAMES[a.type] ?? a.type; - const chars = [...(a.value ?? '')]; - const escaped = chars.map((c, k) => { - const esc = [',', '+', '"', '\\', '<', '>', ';'].includes(c) || (c === ' ' && (k === 0 || k === chars.length - 1)) || (c === '#' && k === 0); - return esc ? `\\${c}` : c; - }); - s += `${type}=${escaped.join('')}`; - }); - } - return s; -} - -/** The issuer as the certificate names it, for the person to read: its commonName, or all of its attributes. */ +/** The issuer that the certificate names: its commonName, or its organizationName, or '' when it has neither (spec §29.7). */ export function certIssuerName(c: Cert): string { - const cn = rdnString(c.issuer, OID.commonName); - return cn !== '' ? cn : nameString(c.issuer).trim(); + return nameText(c.issuer, OID.commonName) ?? nameText(c.issuer, OID.organizationName) ?? ''; } /** * The SHA-256 of the DER of the Name of the issuer, which a reader shows in - * place of an issuer that breaks the rules of the declared author (spec - * §29.7), as Go's sha256.Sum256(RawIssuer). + * place of an issuer that breaks the rules of a name (spec §29.7), as Go's + * sha256.Sum256(RawIssuer). */ export function certIssuerHash(c: Cert): Uint8Array { return sha256(c.rawIssuer); @@ -369,17 +406,27 @@ export function certValidAt(c: Cert, t: Instant): boolean { // ---- the structure of a signature ------------------------------------------ interface AlgID { + /** The content of the object identifier, in hexadecimal. */ readonly oid: string; /** The DER of the parameters, undefined when absent. */ readonly params: Uint8Array | undefined; } function parseAlgID(b: Uint8Array): AlgID { - return der(() => { - const { id, children } = splitDer(b); - if (id !== 0x30 || children.length < 1 || children.length > 2 || children[0]![0] !== 0x06) throw form('an AlgorithmIdentifier'); - return { oid: oidOf(children[0]!), params: children[1] }; - }); + const s = split(b); + if (s === undefined || s.id !== 0x30 || s.children.length < 1 || s.children.length > 2) throw form('an AlgorithmIdentifier'); + const o = oidOf(s.children[0]!); + if (o === undefined) throw form('an AlgorithmIdentifier without an object identifier'); + return { oid: o, params: s.children[1] }; +} + +// parseAlgID, undefined where it throws. +function algIDOf(b: Uint8Array): AlgID | undefined { + try { + return parseAlgID(b); + } catch { + return undefined; + } } // The hash that an identifier of the table names; undefined for any other. @@ -391,6 +438,7 @@ function hashOfAlg(a: AlgID): Hash | undefined { /** A SignerInfo with the certificate that its sid names. */ export interface SignerInfo { readonly cert: Cert; + /** The algorithm identifiers as written. */ readonly digestAlg: AlgID; readonly sigAlg: AlgID; /** The signedAttrs as stored, with the context tag [0]; the signature covers it with the tag of a SET. */ @@ -398,15 +446,25 @@ export interface SignerInfo { readonly messageDigest: Uint8Array; readonly signature: Uint8Array; /** The signature-time-stamp attribute, the DER of its ContentInfo, undefined when there is none. */ - token: Uint8Array | undefined; + readonly token: Uint8Array | undefined; } /** The part of a CMS SignedData that the profile uses. */ export interface SignedData { + /** The certificates that meet the profile of §29.10, each once: another one decides nothing, unless a SignerInfo names it. */ readonly certs: readonly Cert[]; + /** The OCSP responses of crls. */ readonly ocsp: readonly Uint8Array[]; + /** The SignerInfo, in the order of the encoding. */ readonly signers: readonly SignerInfo[]; /** The content of a token, undefined in a detached signature. */ + readonly eContent: Uint8Array | undefined; +} + +interface Parsed { + certs: Cert[]; + ocsp: Uint8Array[]; + signers: SignerInfo[]; eContent: Uint8Array | undefined; } @@ -416,90 +474,100 @@ export function parseSignature(b: Uint8Array): SignedData { } function parse(b: Uint8Array, token: boolean): SignedData { - return der(() => { - try { - checkDer(b); - } catch (err) { - throw form((err as Error).message); - } - const ci = splitDer(b); - if (ci.id !== 0x30 || ci.children.length !== 2 || ci.children[0]![0] !== 0x06 || ci.children[1]![0] !== 0xa0) throw form('a ContentInfo'); - if (oidOf(ci.children[0]!) !== OID.signedData) throw form('the content type is not id-signedData'); - const inner = splitDer(ci.children[1]!).children; - if (inner.length !== 1 || inner[0]![0] !== 0x30) throw form('a SignedData'); - const sd = splitDer(inner[0]!).children; - if (sd.length < 4 || sd[0]![0] !== 0x02 || sd[1]![0] !== 0x31 || sd[2]![0] !== 0x30) throw form('a SignedData'); - // digestAlgorithms: a SET OF in order. - const algs = splitDer(sd[1]!).children; - if (!setOfSorted(algs)) throw form('digestAlgorithms is not a SET OF in DER order'); - for (const a of algs) parseAlgID(a); - - const out: { certs: Cert[]; ocsp: Uint8Array[]; signers: SignerInfo[]; eContent: Uint8Array | undefined } = { certs: [], ocsp: [], signers: [], eContent: undefined }; - parseEncap(sd[2]!, token, out); - let rest = sd.slice(3); - if (rest.length > 0 && rest[0]![0] === 0xa0) { - parseCerts(rest[0]!, out); - rest = rest.slice(1); - } - if (rest.length > 0 && rest[0]![0] === 0xa1) { - parseCRLs(rest[0]!, out); - rest = rest.slice(1); - } - if (rest.length !== 1 || rest[0]![0] !== 0x31) throw form('signerInfos'); - const infos = splitDer(rest[0]!).children; - if (infos.length === 0 || !setOfSorted(infos)) throw form('signerInfos is not a SET OF in DER order, or is empty'); - if (token && infos.length !== 1) throw form(`a token has one SignerInfo, not ${infos.length}`); - const used = new Set(); - for (const si of infos) { - const s = parseSignerInfo(si, out.certs, token); - if (used.has(s.cert)) throw form('two SignerInfo for one certificate'); - used.add(s.cert); - out.signers.push(s); - } - return out; - }); + try { + checkDer(b); + } catch (err) { + throw form((err as DerError).message); + } + const ci = split(b); + if (ci === undefined || ci.id !== 0x30 || ci.children.length !== 2 || ci.children[1]![0] !== 0xa0) throw form('a ContentInfo'); + if (oidOf(ci.children[0]!) !== OID.signedData) throw form('the content type is not id-signedData'); + const inner = splitDer(ci.children[1]!).children; + if (inner.length !== 1 || inner[0]![0] !== 0x30) throw form('a SignedData'); + const sd = splitDer(inner[0]!).children; + if (sd.length < 4 || sd[0]![0] !== 0x02 || sd[1]![0] !== 0x31 || sd[2]![0] !== 0x30) throw form('a SignedData'); + // digestAlgorithms: a SET OF in order. + const algs = splitDer(sd[1]!).children; + if (!setOfSorted(algs)) throw form('digestAlgorithms is not a SET OF in DER order'); + for (const a of algs) parseAlgID(a); + const out: Parsed = { certs: [], ocsp: [], signers: [], eContent: undefined }; + parseEncap(sd[2]!, token, out); + let rest = sd.slice(3); + if (rest.length > 0 && rest[0]![0] === 0xa0) { + parseCerts(rest[0]!, out); + rest = rest.slice(1); + } + if (rest.length > 0 && rest[0]![0] === 0xa1) { + parseCRLs(rest[0]!, token, out); + rest = rest.slice(1); + } + if (rest.length !== 1 || rest[0]![0] !== 0x31) throw form('signerInfos'); + const infos = splitDer(rest[0]!).children; + if (infos.length === 0 || !setOfSorted(infos)) throw form('signerInfos is not a SET OF in DER order, or is empty'); + if (token && infos.length !== 1) throw form(`a token has one SignerInfo, not ${infos.length}`); + const used = new Set(); + for (const si of infos) { + const s = parseSignerInfo(si, out.certs, token); + if (used.has(s.cert)) throw form('two SignerInfo for one certificate'); + used.add(s.cert); + out.signers.push(s); + } + return out; } // encapContentInfo: id-data without content in a detached signature, and id-ct-TSTInfo with its content in a token. -function parseEncap(b: Uint8Array, token: boolean, out: { eContent: Uint8Array | undefined }): void { +function parseEncap(b: Uint8Array, token: boolean, out: Parsed): void { const kids = splitDer(b).children; - if (kids.length < 1 || kids.length > 2 || kids[0]![0] !== 0x06) throw form('encapContentInfo'); - const oid = oidOf(kids[0]!); + if (kids.length < 1 || kids.length > 2) throw form('encapContentInfo'); + const ct = oidOf(kids[0]!); + if (ct === undefined) throw form('encapContentInfo'); if (!token) { - if (oid !== OID.data || kids.length !== 1) throw form('a signature is detached: id-data and no eContent'); + if (ct !== OID.data || kids.length !== 1) throw form('a signature is detached: id-data and no eContent'); return; } - if (oid !== OID.tstInfo || kids.length !== 2 || kids[1]![0] !== 0xa0) throw form('a token holds a TSTInfo'); + if (ct !== OID.tstInfo || kids.length !== 2 || kids[1]![0] !== 0xa0) throw form('a token holds a TSTInfo'); const e = splitDer(kids[1]!).children; if (e.length !== 1 || e[0]![0] !== 0x04) throw form('eContent'); out.eContent = derContent(e[0]!); } -function parseCerts(b: Uint8Array, out: { certs: Cert[] }): void { +// The certificates. One that breaks the profile of §29.10 decides nothing, as +// one that no SignerInfo names: an intermediate of another form is not a +// reason to refuse a signature, and the sid of a signer whose certificate +// breaks it names none. Two copies of a certificate are one. +function parseCerts(b: Uint8Array, out: Parsed): void { const kids = splitDer(b).children; if (!setOfSorted(kids)) throw form('certificates is not a SET OF in DER order'); - for (const k of kids) { - if (k[0]! >= 0xa0 && k[0]! <= 0xa3) continue; // another choice of CertificateChoices: it decides nothing + kids.forEach((k, i) => { + if (k[0]! >= 0xa0 && k[0]! <= 0xa3) return; // another choice of CertificateChoices: it decides nothing if (k[0] !== 0x30) throw form('a CertificateChoice that is neither a certificate nor one of the other four choices'); - out.certs.push(parseCert(k)); - } + if (i > 0 && equalBytes(kids[i - 1]!, k)) return; + try { + out.certs.push(parseCert(k)); + } catch (err) { + if (!(err instanceof CertificateError)) throw err; + } + }); } -function parseCRLs(b: Uint8Array, out: { ocsp: Uint8Array[] }): void { +// crls: in a signature, only OCSP responses (spec §29.10 rule 3); in a token, whatever it holds decides nothing (§29.11). +function parseCRLs(b: Uint8Array, token: boolean, out: Parsed): void { const kids = splitDer(b).children; if (!setOfSorted(kids)) throw form('crls is not a SET OF in DER order'); + if (token) return; for (const k of kids) { if (k[0] !== 0xa1) throw form('crls holds only OCSP responses'); const f = splitDer(k).children; - if (f.length !== 2 || f[0]![0] !== 0x06) throw form('an OtherRevocationInfoFormat'); + if (f.length !== 2) throw form('an OtherRevocationInfoFormat'); if (oidOf(f[0]!) !== OID.riOCSP) throw form('crls holds only OCSP responses'); out.ocsp.push(f[1]!); } } function parseSignerInfo(b: Uint8Array, certs: readonly Cert[], token: boolean): SignerInfo { - const { id, children: f } = splitDer(b); - if (id !== 0x30 || f.length < 6 || f[0]![0] !== 0x02 || f[2]![0] !== 0x30 || f[3]![0] !== 0xa0 || f[4]![0] !== 0x30 || f[5]![0] !== 0x04) { + const si = split(b); + const f = si?.children ?? []; + if (si === undefined || si.id !== 0x30 || f.length < 6 || f[0]![0] !== 0x02 || f[2]![0] !== 0x30 || f[3]![0] !== 0xa0 || f[4]![0] !== 0x30 || f[5]![0] !== 0x04) { throw form('a SignerInfo with signedAttrs'); } // RFC 5652 5.3: version 1 with issuerAndSerialNumber, version 3 with subjectKeyIdentifier. @@ -510,13 +578,12 @@ function parseSignerInfo(b: Uint8Array, certs: readonly Cert[], token: boolean): const sigAlg = parseAlgID(f[4]!); const signature = derContent(f[5]!); if (f.length > 7 || (f.length === 7 && f[6]![0] !== 0xa1)) throw form('a SignerInfo with something after its signature'); - const { messageDigest } = parseSignedAttrs(f[3]!, cert, token); - const s: SignerInfo = { cert, digestAlg, sigAlg, signedAttrs: f[3]!, messageDigest, signature, token: undefined }; - if (f.length === 7) s.token = parseUnsignedAttrs(f[6]!); - return s; + const messageDigest = parseSignedAttrs(f[3]!, cert, token); + return { cert, digestAlg, sigAlg, signedAttrs: f[3]!, messageDigest, signature, token: f.length === 7 ? parseUnsignedAttrs(f[6]!) : undefined }; } -// The one certificate that the sid names. +// The one certificate that the sid names, comparing the DER of the issuer and the content of the serial number, or the +// keyIdentifier. The version of the SignerInfo, checked before, leaves no other choice of SignerIdentifier. function findSigner(sid: Uint8Array, certs: readonly Cert[]): Cert { let found: Cert | undefined; let n = 0; @@ -524,15 +591,15 @@ function findSigner(sid: Uint8Array, certs: readonly Cert[]): Cert { // issuerAndSerialNumber const p = splitDer(sid).children; if (p.length !== 2 || p[0]![0] !== 0x30 || p[1]![0] !== 0x02) throw form('issuerAndSerialNumber'); - const serial = intOf(p[1]!); + const serial = derContent(p[1]!); for (const c of certs) { - if (equalBytes(c.rawIssuer, p[0]!) && c.serial === serial) { + if (equalBytes(c.rawIssuer, p[0]!) && equalBytes(c.serial, serial)) { found = c; n++; } } - } else if (sid[0] === 0x80) { - // subjectKeyIdentifier + } else { + // subjectKeyIdentifier [0] const ski = derContent(sid); for (const c of certs) { if (c.ski !== undefined && equalBytes(c.ski, ski)) { @@ -540,18 +607,24 @@ function findSigner(sid: Uint8Array, certs: readonly Cert[]): Cert { n++; } } - } else { - throw form('a SignerIdentifier'); } - if (n !== 1) throw form(`a sid that names ${n} certificates, not one`); + if (n !== 1) throw form(`a sid that names ${n} certificates of the profile, not one`); return found!; } +// The attributes of a SET OF Attribute: the values of each type and the number +// of attributes of each type, which is not the number of values. Both are kept +// by the bytes of the object identifier. interface AttrSet { readonly vals: Map; readonly count: Map; } +// The values of the attributes of the type, and their number. +function get(m: AttrSet, type: string): [Uint8Array[], number] { + return [m.vals.get(type) ?? [], m.count.get(type) ?? 0]; +} + // Reads the SET OF Attribute b. An attribute needs at least one value (RFC // 5652 5.3), so that two attributes of one type never hide behind an empty set. function attrs(b: Uint8Array): AttrSet { @@ -559,55 +632,54 @@ function attrs(b: Uint8Array): AttrSet { if (!setOfSorted(kids)) throw form('attributes are not a SET OF in DER order'); const out: AttrSet = { vals: new Map(), count: new Map() }; for (const a of kids) { - const { children: p } = splitDer(a); - if (a[0] !== 0x30 || p.length !== 2 || p[0]![0] !== 0x06 || p[1]![0] !== 0x31) throw form('an Attribute'); - const oid = oidOf(p[0]!); + const p = split(a)?.children ?? []; + if (p.length !== 2 || a[0] !== 0x30 || p[1]![0] !== 0x31) throw form('an Attribute'); + const o = oidOf(p[0]!); + if (o === undefined) throw form('an Attribute'); const vals = splitDer(p[1]!).children; if (vals.length === 0 || !setOfSorted(vals)) throw form('the values of an attribute are not a non-empty SET OF in DER order'); // Appended, not copied: thousands of attributes of one type fit in the area. - const list = out.vals.get(oid); - if (list === undefined) out.vals.set(oid, vals); + const list = out.vals.get(o); + if (list === undefined) out.vals.set(o, vals); else for (const v of vals) list.push(v); - out.count.set(oid, (out.count.get(oid) ?? 0) + 1); + out.count.set(o, (out.count.get(o) ?? 0) + 1); } return out; } // The only value of the only attribute of the type. -function one(m: AttrSet, oid: string, name: string): Uint8Array { - const v = m.vals.get(oid) ?? []; - const n = m.count.get(oid) ?? 0; +function one(m: AttrSet, type: string, name: string): Uint8Array { + const [v, n] = get(m, type); if (n !== 1 || v.length !== 1) throw form(`${name}: ${n} attributes with ${v.length} values, not one with one`); return v[0]!; } // The signedAttrs of the profile (spec §29.10 rule 4, §29.11): content-type, -// message-digest and the signing certificate. -function parseSignedAttrs(b: Uint8Array, cert: Cert, token: boolean): { messageDigest: Uint8Array } { +// message-digest and the signing certificate. It returns the message-digest. +function parseSignedAttrs(b: Uint8Array, cert: Cert, token: boolean): Uint8Array { const m = attrs(b); + // Each of the three is one attribute with one value. const ct = one(m, OID.contentType, 'content-type'); - const want = token ? OID.tstInfo : OID.data; - if (ct[0] !== 0x06 || oidOf(ct) !== want) throw form(`content-type is not ${want}`); + const [want, name] = token ? [OID.tstInfo, 'id-ct-TSTInfo'] : [OID.data, 'id-data']; + if (oidOf(ct) !== want) throw form(`content-type is not ${name}`); const md = one(m, OID.messageDigest, 'message-digest'); if (md[0] !== 0x04) throw form('message-digest is not an OCTET STRING'); // signing-certificate-v2 is the one that counts: a signature has it, and a // token has it or, failing that, signing-certificate. The other attributes // decide nothing, a signing-certificate beside the v2 among them. - const v2 = m.vals.get(OID.sigCertV2) ?? []; - const n2 = m.count.get(OID.sigCertV2) ?? 0; - const v1 = m.vals.get(OID.sigCertV1) ?? []; - const n1 = m.count.get(OID.sigCertV1) ?? 0; + const [v2, n2] = get(m, OID.sigCertV2); + const [v1, n1] = get(m, OID.sigCertV1); if (n2 === 1 && v2.length === 1) checkESSCert(cert, v2[0]!, true); else if (token && n2 === 0 && n1 === 1 && v1.length === 1) checkESSCert(cert, v1[0]!, false); else throw form('signing-certificate: one attribute of one value is required'); - return { messageDigest: derContent(md) }; + return derContent(md); } // The first ESSCertID of a signing-certificate or signing-certificate-v2 (RFC // 2634, RFC 5035) is the hash of the certificate. function checkESSCert(c: Cert, v: Uint8Array, v2: boolean): void { - const sc = splitDer(v); - if (sc.id !== 0x30 || sc.children.length < 1 || sc.children[0]![0] !== 0x30) throw form('a SigningCertificate'); + const sc = split(v); + if (sc === undefined || sc.id !== 0x30 || sc.children.length < 1 || sc.children[0]![0] !== 0x30) throw form('a SigningCertificate'); const ids = splitDer(sc.children[0]!).children; if (ids.length < 1 || ids[0]![0] !== 0x30) throw form('an ESSCertID'); let f = splitDer(ids[0]!).children; @@ -629,9 +701,7 @@ function checkESSCert(c: Cert, v: Uint8Array, v2: boolean): void { // The signature-time-stamp: at most one attribute with one value (spec §29.10 rule 4); the other attributes decide nothing. function parseUnsignedAttrs(b: Uint8Array): Uint8Array | undefined { - const m = attrs(b); - const v = m.vals.get(OID.sigTimeStamp) ?? []; - const n = m.count.get(OID.sigTimeStamp) ?? 0; + const [v, n] = get(attrs(b), OID.sigTimeStamp); if (n === 0) return undefined; if (n === 1 && v.length === 1) return v[0]; throw form(`signature-time-stamp: ${n} attributes with ${v.length} values, not one with one`); @@ -644,74 +714,64 @@ export type CheckResult = 'valid' | 'invalid' | 'not verifiable'; type Scheme = 'pkcs1' | 'pss' | 'ecdsa'; -// The signature algorithm of the SignerInfo against the table: its hash, its scheme and whether it is in the table. +// The hash and the scheme of the signature of the SignerInfo, the hash that +// the signature algorithm itself names agreeing with it, when they are in the +// table. function params(s: SignerInfo): { hash: Hash; scheme: Scheme } | undefined { const hash = hashOfAlg(s.digestAlg); if (hash === undefined) return undefined; - const { oid, params: p } = s.sigAlg; + const { oid: o, params: p } = s.sigAlg; const nullOrAbsent = p === undefined || equalBytes(p, NULL_PARAMS); - switch (oid) { + const pkcs1 = (ok: boolean): { hash: Hash; scheme: Scheme } | undefined => (ok ? { hash, scheme: 'pkcs1' } : undefined); + const ecdsa = (h: Hash): { hash: Hash; scheme: Scheme } | undefined => (p === undefined && hash === h ? { hash, scheme: 'ecdsa' } : undefined); + switch (o) { case OID.rsaEncryption: - return nullOrAbsent ? { hash, scheme: 'pkcs1' } : undefined; + return pkcs1(nullOrAbsent); case OID.sha256RSA: - return nullOrAbsent && hash === SHA256 ? { hash, scheme: 'pkcs1' } : undefined; + return pkcs1(nullOrAbsent && hash === SHA256); case OID.sha384RSA: - return nullOrAbsent && hash === SHA384 ? { hash, scheme: 'pkcs1' } : undefined; + return pkcs1(nullOrAbsent && hash === SHA384); case OID.sha512RSA: - return nullOrAbsent && hash === SHA512 ? { hash, scheme: 'pkcs1' } : undefined; + return pkcs1(nullOrAbsent && hash === SHA512); case OID.ecdsa256: - return p === undefined && hash === SHA256 ? { hash, scheme: 'ecdsa' } : undefined; + return ecdsa(SHA256); case OID.ecdsa384: - return p === undefined && hash === SHA384 ? { hash, scheme: 'ecdsa' } : undefined; + return ecdsa(SHA384); case OID.ecdsa512: - return p === undefined && hash === SHA512 ? { hash, scheme: 'ecdsa' } : undefined; + return ecdsa(SHA512); case OID.pss: - return pssParamsOK(p, s.digestAlg) ? { hash, scheme: 'pss' } : undefined; + return pssParamsOK(p, hash.size, s.digestAlg) ? { hash, scheme: 'pss' } : undefined; default: return undefined; } } // RSASSA-PSS-params (RFC 4055): the hash of digestAlgorithm, MGF1 with that -// hash and a salt of its length, in order of tag and without the trailerField. -function pssParamsOK(p: Uint8Array | undefined, digest: AlgID): boolean { - if (p === undefined) return false; - let seq: { id: number; children: Uint8Array[] }; - try { - seq = splitDer(p); - } catch { - return false; - } - if (seq.id !== 0x30) return false; - const hashLen = HASH_OF_OID[digest.oid]?.size; +// hash, a salt of its length and trailerField 1. +function pssParamsOK(p: Uint8Array | undefined, hashLen: number, digest: AlgID): boolean { + const seq = p === undefined ? undefined : split(p); + if (seq === undefined || seq.id !== 0x30) return false; + const sameHash = (a: AlgID | undefined): boolean => a !== undefined && a.oid === digest.oid && (a.params === undefined || equalBytes(a.params, NULL_PARAMS)); let hashOK = false; let mgfOK = false; let saltOK = false; let last = 0; for (const e of seq.children) { - let inner: Uint8Array[]; - try { - inner = splitDer(e).children; - } catch { - return false; - } + const inner = split(e)?.children ?? []; if (inner.length !== 1 || e[0]! <= last) return false; // the fields come in order of tag, each once last = e[0]!; switch (e[0]) { - case 0xa0: { - const a = tryAlg(inner[0]!); - hashOK = a !== undefined && a.oid === digest.oid && (a.params === undefined || equalBytes(a.params, NULL_PARAMS)); + case 0xa0: + hashOK = sameHash(algIDOf(inner[0]!)); break; - } case 0xa1: { - const a = tryAlg(inner[0]!); + const a = algIDOf(inner[0]!); if (a === undefined || a.oid !== OID.mgf1 || a.params === undefined) return false; - const m = tryAlg(a.params); - mgfOK = m !== undefined && m.oid === digest.oid && (m.params === undefined || equalBytes(m.params, NULL_PARAMS)); + mgfOK = sameHash(algIDOf(a.params)); break; } case 0xa2: - saltOK = inner[0]![0] === 0x02 && intOf(inner[0]!) === BigInt(hashLen ?? -1); + saltOK = smallInt(inner[0]!) === hashLen; break; default: return false; // [3] trailerField is 1, its DEFAULT: DER does not write it @@ -722,67 +782,59 @@ function pssParamsOK(p: Uint8Array | undefined, digest: AlgID): boolean { return hashOK && mgfOK && saltOK; } -function tryAlg(b: Uint8Array): AlgID | undefined { - try { - return parseAlgID(b); - } catch { - return undefined; - } -} - type PublicKey = { kind: 'rsa'; n: bigint; e: bigint } | { kind: 'ec'; curve: typeof p256 | typeof p384 | typeof p521; point: Uint8Array }; -// The key of the certificate when it is in the table: RSA of 2048 to 4096 -// bits with an odd exponent from 3 to 2^31 - 1, or ECDSA on P-256, P-384 or -// P-521 with an uncompressed point, the only form that Go's -// x509.ParsePKIXPublicKey reads. +const CURVES: Readonly> = { [OID.p256]: p256, [OID.p384]: p384, [OID.p521]: p521 }; + +// The key of the certificate when the table has it (spec §29.10): a +// SubjectPublicKeyInfo of rsaEncryption with NULL parameters and an +// RSAPublicKey of exactly a modulus and an exponent, the modulus odd and of +// 2048 to 4096 bits and the exponent odd from 3 to 2^31 - 1; or of +// id-ecPublicKey with the named curve P-256, P-384 or P-521 and the +// uncompressed form of a point of it, the only form that Go's +// ecdsa.ParseUncompressedPublicKey reads. Anything else is not usable. function publicKey(c: Cert): PublicKey | undefined { - try { - checkDer(c.spki); - const { children } = splitDer(c.spki); - if (children.length !== 2 || children[0]![0] !== 0x30 || children[1]![0] !== 0x03) return undefined; - const alg = parseAlgID(children[0]!); - const bits = derContent(children[1]!); - if (bits[0] !== 0) return undefined; - const key = bits.subarray(1); - if (alg.oid === OID.rsaEncryption) { - if (alg.params === undefined || !equalBytes(alg.params, NULL_PARAMS)) return undefined; + const f = splitDer(c.spki).children; + if (f.length !== 2 || f[0]![0] !== 0x30 || f[1]![0] !== 0x03) return undefined; + const alg = algIDOf(f[0]!); + if (alg === undefined) return undefined; + const bits = derContent(f[1]!); + if (bits.length < 2 || bits[0] !== 0) return undefined; + const key = bits.subarray(1); + if (alg.oid === OID.rsaEncryption && alg.params !== undefined && equalBytes(alg.params, NULL_PARAMS)) { + try { checkDer(key); - const ne = splitDer(key); - if (ne.id !== 0x30 || ne.children.length !== 2 || ne.children[0]![0] !== 0x02 || ne.children[1]![0] !== 0x02) return undefined; - const n = intOf(ne.children[0]!); - const e = intOf(ne.children[1]!); - const nBits = n.toString(2).length; - if (n <= 0n || nBits < 2048 || nBits > 4096 || e < 3n || e % 2n === 0n || e > 2n ** 31n - 1n) return undefined; - return { kind: 'rsa', n, e }; + } catch { + return undefined; } - if (alg.oid === OID.ecPublicKey && alg.params !== undefined && alg.params[0] === 0x06) { - const curveOid = oidOf(alg.params); - const curve = curveOid === OID.p256 ? p256 : curveOid === OID.p384 ? p384 : curveOid === OID.p521 ? p521 : undefined; - if (curve === undefined) return undefined; - // 0x04 and the two coordinates: noble would also read a compressed point. - if (key[0] !== 0x04 || key.length !== 1 + 2 * curve.Point.Fp.BYTES) return undefined; - curve.Point.fromBytes(key); // a point of the curve, or it throws - return { kind: 'ec', curve, point: key }; + const ne = split(key); + if (ne === undefined || ne.id !== 0x30 || ne.children.length !== 2 || ne.children[0]![0] !== 0x02 || ne.children[1]![0] !== 0x02) return undefined; + const nb = derContent(ne.children[0]!); + const eb = derContent(ne.children[1]!); + if ((nb[0]! & 0x80) !== 0 || (eb[0]! & 0x80) !== 0 || eb.length > 4) return undefined; + let e = 0; + for (const x of eb) e = e * 256 + x; + const size = bitLen(nb); + if (size < 2048 || size > 4096 || (nb[nb.length - 1]! & 1) === 0 || e < 3 || e % 2 === 0 || e > 2 ** 31 - 1) return undefined; + return { kind: 'rsa', n: BigInt(`0x${toHex(nb)}`), e: BigInt(e) }; + } + if (alg.oid === OID.ecPublicKey) { + const curveOID = alg.params === undefined ? undefined : oidOf(alg.params); + const curve = curveOID === undefined ? undefined : CURVES[curveOID]; + // 0x04 and the two coordinates: noble would also read a compressed point. + if (curve === undefined || key[0] !== 0x04 || key.length !== 1 + 2 * curve.Point.Fp.BYTES) return undefined; + try { + curve.Point.fromBytes(key); // coordinates under p, a point of the curve, or it throws + } catch { + return undefined; } - } catch { - return undefined; + return { kind: 'ec', curve, point: key }; } return undefined; } -/** Whether the algorithms of the SignerInfo and the key of its certificate are in the table of spec §29.10. */ -function algorithmsOK(s: SignerInfo): boolean { - const a = params(s); - const k = publicKey(s.cert); - if (a === undefined || k === undefined) return false; - return a.scheme === 'ecdsa' ? k.kind === 'ec' : k.kind === 'rsa'; -} - function bigFromBytes(b: Uint8Array): bigint { - let v = 0n; - for (const x of b) v = (v << 8n) | BigInt(x); - return v; + return BigInt(`0x0${toHex(b)}`); } function bytesFromBig(v: bigint, len: number): Uint8Array { @@ -814,7 +866,6 @@ function rsaVerifyPKCS1(k: { n: bigint; e: bigint }, hash: Hash, digest: Uint8Ar if (s >= k.n) return false; const em = bytesFromBig(modPow(s, k.e, k.n), len); const t = concatBytes(hash.prefix, digest); - if (len < t.length + 11) return false; const want = new Uint8Array(len); want[1] = 1; want.fill(0xff, 2, len - t.length - 1); @@ -844,7 +895,7 @@ function rsaVerifyPSS(k: { n: bigint; e: bigint }, hash: Hash, digest: Uint8Arra if (full.subarray(0, len - emLen).some((x) => x !== 0)) return false; const em = full.subarray(len - emLen); const sLen = hash.size; - if (emLen < hash.size + sLen + 2 || em[emLen - 1] !== 0xbc) return false; + if (em[emLen - 1] !== 0xbc) return false; const maskedDB = em.subarray(0, emLen - hash.size - 1); const hh = em.subarray(emLen - hash.size - 1, emLen - 1); const topBits = 8 * emLen - emBits; @@ -862,26 +913,33 @@ function rsaVerifyPSS(k: { n: bigint; e: bigint }, hash: Hash, digest: Uint8Arra /** * Checks the signature of the SignerInfo over `message`, the bytes that the - * signature is detached from (spec §29.10): not verifiable for an algorithm - * outside the table; invalid when the message-digest is not the hash of - * message or the signature of the signedAttrs does not verify. + * signature is detached from (spec §29.10), in the order of the spec: not + * verifiable for an algorithm, a key or a curve outside the table; invalid + * when the message-digest is not the hash of message, or the signature of the + * signedAttrs does not verify with the key of the certificate, which is the + * case of a key of a scheme other than the one of the algorithm. */ export function checkSigner(s: SignerInfo, message: Uint8Array): CheckResult { - if (!algorithmsOK(s)) return 'not verifiable'; - const { hash, scheme } = params(s)!; - if (!equalBytes(hash.digest(message), s.messageDigest)) return 'invalid'; + const a = params(s); + const key = a === undefined ? undefined : publicKey(s.cert); + if (a === undefined || key === undefined) return 'not verifiable'; + if (!equalBytes(a.hash.digest(message), s.messageDigest)) return 'invalid'; + // RSASSA-PSS signs with an RSA key, as PKCS #1 v1.5 does. + if ((a.scheme === 'ecdsa') !== (key.kind === 'ec')) return 'invalid'; // The signature covers the signedAttrs with the tag of a SET. const attrBytes = s.signedAttrs.slice(); attrBytes[0] = 0x31; - const digest = hash.digest(attrBytes); - const key = publicKey(s.cert)!; - let ok = false; + const digest = a.hash.digest(attrBytes); + let ok: boolean; if (key.kind === 'rsa') { - ok = scheme === 'pss' ? rsaVerifyPSS(key, hash, digest, s.signature) : rsaVerifyPKCS1(key, hash, digest, s.signature); + ok = a.scheme === 'pss' ? rsaVerifyPSS(key, a.hash, digest, s.signature) : rsaVerifyPKCS1(key, a.hash, digest, s.signature); } else { + // noble returns false for a signature that is not DER or out of range, as Go's ecdsa.VerifyASN1; whatever else it + // throws is invalid too. try { ok = key.curve.verify(s.signature, digest, key.point, { prehash: false, lowS: false, format: 'der' }); } catch { + /* v8 ignore next -- @preserve: noble throws only for arguments of another type */ ok = false; } } @@ -895,17 +953,14 @@ export interface Token { /** t, and the precision of the token, zero when it has none. */ readonly genTime: Instant; readonly accuracy: Instant; - /** The hash of the messageImprint, and the hash. */ - readonly imprintAlg: string; + /** The algorithm of the messageImprint, and the hash. */ + readonly imprintAlg: AlgID; readonly imprint: Uint8Array; /** The certificate of the time-stamping authority. */ readonly tsa: Cert; readonly data: SignedData; } -// The seconds of accuracy are bounded: far above any real one. -const MAX_ACCURACY = 2 ** 31; - /** * Reads a time-stamp token. It throws CmsFormError when the form breaks the * profile and CmsAlgorithmError when an algorithm is outside the table, in @@ -914,71 +969,66 @@ const MAX_ACCURACY = 2 ** 31; export function parseToken(b: Uint8Array): Token { const sd = parse(b, true); // The TSTInfo is an OCTET STRING inside the token, so the check of the token - // did not reach it: it is read here, field by field, in DER. - const info = der(() => parseTSTInfo(sd.eContent!)); - const ia = parseAlgID(info.imprintAlg); - const hash = hashOfAlg(ia); - if (hash !== undefined && info.hash.length !== hash.size) throw form('a messageImprint of the wrong length'); - if (hash === undefined || !algorithmsOK(sd.signers[0]!)) throw new CmsAlgorithmError(); - return { genTime: info.genTime, accuracy: info.accuracy, imprintAlg: ia.oid, imprint: info.hash, tsa: sd.signers[0]!.cert, data: sd }; + // did not reach it: it is read here, field by field. + const info = parseTSTInfo(sd.eContent!); + const imprintAlg = parseAlgID(info.imprintAlg); + const signer = sd.signers[0]!; + if (hashOfAlg(imprintAlg) === undefined || params(signer) === undefined || publicKey(signer.cert) === undefined) throw new CmsAlgorithmError(); + return { genTime: info.genTime, accuracy: info.accuracy, imprintAlg, imprint: info.hash, tsa: signer.cert, data: sd }; } +// The TSTInfo of RFC 3161 3.2.1 in DER: the fields in order, each once, and +// nothing after the last. It returns the messageImprint algorithm, as the DER +// of its AlgorithmIdentifier, and the hash. function parseTSTInfo(b: Uint8Array): { genTime: Instant; accuracy: Instant; imprintAlg: Uint8Array; hash: Uint8Array } { const bad = (what: string): never => { throw form(`the TSTInfo: ${what}`); }; - checkDer(b); - const { id, children: f } = splitDer(b); - if (id !== 0x30 || f.length < 5) bad('not a SEQUENCE of at least five fields'); - if (f[0]![0] !== 0x02) bad('the version'); - if (intOf(f[0]!) !== 1n) bad('the version is not 1'); + try { + checkDer(b); + } catch (err) { + bad((err as DerError).message); + } + const s = split(b); + const f = s?.children ?? []; + if (s === undefined || s.id !== 0x30 || f.length < 5) bad('not a SEQUENCE of at least five fields'); + if (smallInt(f[0]!) !== 1) bad('the version is not 1'); if (f[1]![0] !== 0x06 || f[3]![0] !== 0x02 || f[4]![0] !== 0x18) bad('policy, serialNumber or genTime'); - const mi = f[2]![0] === 0x30 ? splitDer(f[2]!).children : []; - if (mi.length !== 2 || mi[0]![0] !== 0x30 || mi[1]![0] !== 0x04) bad('the messageImprint'); - const hash = derContent(mi[1]!); - const genTime = parseGenTime(f[4]!); + const mi = split(f[2]!)?.children ?? []; + if (f[2]![0] !== 0x30 || mi.length !== 2 || mi[0]![0] !== 0x30 || mi[1]![0] !== 0x04) bad('the messageImprint'); + // The check of the DER read every time of the TSTInfo, genTime among them. + const genTime = parseTime(f[4]!).time; let accuracy: Instant = { seconds: 0, nanos: 0 }; let rest = f.slice(5); if (rest.length > 0 && rest[0]![0] === 0x30) { - accuracy = parseAccuracy(rest[0]!); + accuracy = parseAccuracy(rest[0]!, bad); rest = rest.slice(1); } if (rest.length > 0 && rest[0]![0] === 0x01) { const c = derContent(rest[0]!); - if (c.length !== 1 || c[0] !== 0xff) bad('ordering FALSE is its default and DER does not write it'); + if (c[0] !== 0xff) bad('ordering FALSE is its default and DER does not write it'); rest = rest.slice(1); } if (rest.length > 0 && rest[0]![0] === 0x02) rest = rest.slice(1); // nonce if (rest.length > 0 && rest[0]![0] === 0xa0) rest = rest.slice(1); // tsa if (rest.length > 0 && rest[0]![0] === 0xa1) rest = rest.slice(1); // extensions if (rest.length !== 0) bad('a field out of its place, or one that does not exist'); - return { genTime, accuracy, imprintAlg: mi[0]!, hash }; -} - -// A GeneralizedTime as RFC 3161 and DER write it: YYYYMMDDHHMMSS, a fraction without a trailing zero, and Z. -function parseGenTime(el: Uint8Array): Instant { - const s = TIME_TEXT.decode(derContent(el)); - const m = /^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\.(\d+))?Z$/.exec(s); - if (m === null) throw form('the TSTInfo: genTime is not in UTC with the letter Z'); - const whole = utc(Number(m[1]), Number(m[2]), Number(m[3]), Number(m[4]), Number(m[5]), Number(m[6])); - const frac = m[8]; - if (frac === undefined) return whole; - if (frac.endsWith('0')) throw form('the TSTInfo: genTime has a fraction that DER does not write'); - return { seconds: whole.seconds, nanos: Number(frac.slice(0, 9).padEnd(9, '0')) }; + return { genTime, accuracy, imprintAlg: mi[0]!, hash: derContent(mi[1]!) }; } -// Accuracy: seconds from 0, and millis and micros from 1 to 999, in that order, each optional (RFC 3161 2.4.2). A negative number would make a seal after the opening date look before it. -function parseAccuracy(b: Uint8Array): Instant { +// Accuracy: seconds from 0 to 2^31 - 1, and millis and micros from 1 to 999, +// in that order, each optional (RFC 3161 2.4.2, spec §29.11), each a minimal +// INTEGER. A negative number would make a seal after the opening date look +// before it. +function parseAccuracy(b: Uint8Array, bad: (what: string) => never): Instant { let f = splitDer(b).children; let seconds = 0; let nanos = 0; - const bad = (what: string): never => { - throw form(`the TSTInfo: ${what}`); - }; if (f.length > 0 && f[0]![0] === 0x02) { - const secs = intOf(f[0]!); - if (secs < 0n || secs > BigInt(MAX_ACCURACY)) bad('accuracy seconds outside 0 to 2^31'); - seconds = Number(secs); + // An INTEGER of DER of at most 4 bytes, not negative: at most 2^31 - 1. + const secs = smallInt(f[0]!); + if (secs === undefined) bad('accuracy seconds outside 0 to 2^31 - 1'); + seconds = secs!; f = f.slice(1); } for (const [tag, unit] of [ @@ -987,9 +1037,11 @@ function parseAccuracy(b: Uint8Array): Instant { ] as const) { if (f.length > 0 && f[0]![0] === tag) { const c = derContent(f[0]!); - if (c.length < 1 || c.length > 2 || (c[0]! & 0x80) !== 0) bad('accuracy millis or micros'); + if (c.length < 1 || c.length > 2 || (c[0]! & 0x80) !== 0 || (c.length === 2 && c[0] === 0 && (c[1]! & 0x80) === 0)) { + bad('accuracy millis or micros that are not a minimal INTEGER'); + } let n = 0; - for (const x of c) n = (n << 8) | x; + for (const x of c) n = n * 256 + x; if (n < 1 || n > 999) bad('accuracy millis or micros outside 1 to 999'); nanos += n * unit; f = f.slice(1); @@ -1001,20 +1053,19 @@ function parseAccuracy(b: Uint8Array): Instant { /** Whether the messageImprint of the token uses SHA-256, which a seal of seal_type 2 requires (spec §29.11). */ export function tokenImprintIsSHA256(t: Token): boolean { - return t.imprintAlg === OID.sha256; + return t.imprintAlg.oid === OID.sha256; } /** * Verifies the token over `subject`, the bytes that it seals: the * message-digest is the hash of the TSTInfo, the signature of the TSA - * verifies, the messageImprint is the hash of subject and the certificate of - * the TSA is valid at genTime. False is the verdict S3. + * verifies, the messageImprint is the hash of subject, of any length, and the + * certificate of the TSA is valid at genTime. False is the verdict S3. */ export function checkToken(t: Token, subject: Uint8Array): boolean { const s = t.data.signers[0]!; if (checkSigner(s, t.data.eContent!) !== 'valid') return false; - const hash = HASH_OF_OID[t.imprintAlg]!; - return equalBytes(hash.digest(subject), t.imprint) && certValidAt(t.tsa, t.genTime); + return equalBytes(hashOfAlg(t.imprintAlg)!.digest(subject), t.imprint) && certValidAt(t.tsa, t.genTime); } /** The instant `t` plus the duration `d`, both as Instants. */ @@ -1022,4 +1073,3 @@ export function addInstants(t: Instant, d: Instant): Instant { const nanos = t.nanos + d.nanos; return nanos >= 1_000_000_000 ? { seconds: t.seconds + d.seconds + 1, nanos: nanos - 1_000_000_000 } : { seconds: t.seconds + d.seconds, nanos }; } - diff --git a/src/lib/dkc/der.test.ts b/src/lib/dkc/der.test.ts index 547ba70..64913e8 100644 --- a/src/lib/dkc/der.test.ts +++ b/src/lib/dkc/der.test.ts @@ -1,11 +1,14 @@ // Tests of der.ts, the strict check of DER that the CMS reader starts with: the -// same cases as the Go package internal/der. +// same cases as the Go package internal/der at the draft v0.12, the forms of +// the times and the restricted string types among them. import { describe, expect, it } from 'vitest'; -import { checkDer, derContent, DerError, setOfSorted, splitDer } from './der.ts'; +import { checkDer, derContent, DerError, parseTime, setOfSorted, splitDer } from './der.ts'; import { h } from './testing/testdata.ts'; const zeros = (n: number): string => '00'.repeat(n); +// The hexadecimal of the bytes of an ASCII text. +const hexOf = (s: string): string => [...s].map((c) => c.charCodeAt(0).toString(16).padStart(2, '0')).join(''); // n SEQUENCEs, each holding the next, as hex; the innermost holds `inner`, or nothing. function nested(n: number, inner = ''): string { @@ -20,39 +23,110 @@ describe('checkDer', () => { ['a long length', '04' + '8180' + zeros(128), true], ['a long form under 128', '0481' + '01' + '00', false], ['a length with a leading zero', '04820001' + '00', false], + ['a length of 128 with a leading zero', '04820080' + zeros(128), false], ['an indefinite length', '30800000', false], + ['a length of 0xff', '04ff' + zeros(127), false], + ['a length of five bytes', '0485' + '0100000000' + '00', false], + ['a length of nine bytes that wraps around to 128', '0489' + '010000000000000080' + zeros(128), false], + ['a length whose bytes are missing', '0482' + '01', false], + ['a lone identifier octet', '04', false], + ['nothing', '', false], ['a high tag number', '1f0100', false], - ['a length of 0xff', '04ff', false], - ['a length that does not fit', '0485010000', false], ['truncated', '0402aa', false], ['trailing bytes', '0500' + '00', false], ['BOOLEAN 01', '010101', false], - ['BOOLEAN FF', '0101ff', true], ['BOOLEAN 00', '010100', true], + ['BOOLEAN FF', '0101ff', true], + ['BOOLEAN of two bytes', '0102ffff', false], ['INTEGER with a leading zero', '02020001', false], ['INTEGER 0x80 with its zero', '02020080', true], ['INTEGER with a leading FF', '0202ff80', false], + ['INTEGER -1 in two bytes', '0202ffff', false], + ['INTEGER -129', '0202ff7f', true], ['empty INTEGER', '0200', false], ['ENUMERATED', '0a0101', true], + ['ENUMERATED with a leading zero', '0a020001', false], ['NULL with content', '050100', false], ['constructed OCTET STRING', '2404' + '0402aabb', false], + ['constructed INTEGER', '2203' + '020101', false], ['BIT STRING with unused bits set', '03020701', false], ['BIT STRING with unused bits clear', '03020780', true], ['BIT STRING of 4 bits', '030204f0', true], - ['an empty BIT STRING', '0300', false], - ['a BIT STRING of only unused bits', '030105', false], - ['BIT STRING with more than 7 unused bits', '03020800', false], + ['an empty BIT STRING', '030100', true], + ['a BIT STRING without its first octet', '0300', false], + ['a BIT STRING of eight unused bits', '03020800', false], + ['a BIT STRING of no bits with unused bits', '030101', false], ['OID', '06032a0304', true], - ['OID with a leading 0x80', '0603800102', false], + ['OID with 0x80 inside a subidentifier', '0604' + '2a818001', true], + ['OID with a leading 0x80', '06038001' + '02', false], ['OID that does not end', '06022a83', false], ['an empty OID', '0600', false], ['context tag, constructed', 'a003020101', true], + ['context tag, primitive, any content', '8003000000', true], ['SET in primitive form', '1100', false], ['SEQUENCE in primitive form', '1000', false], ['the end of contents', '0000', false], ['a reserved universal tag', '0e0141', false], ['a SEQUENCE of the end of contents', '30020000', false], + ['a SEQUENCE with a bad child', '3003' + '020000', false], + ['a SEQUENCE whose child does not fit', '3003' + '040500', false], ['UTF8String', '0c026162', true], + ['UTF8String that is not UTF-8', '0c01ff', true], + ['PrintableString with an underscore', '13015f', true], + ['TeletexString', '1401e9', true], + ['IA5String', '160161', true], + ['VisibleString', '1a0161', true], + ['UniversalString', '1c0400000061', true], + ['BMPString', '1e020061', true], + // The other string types are DER too, whatever their content: a name may + // hold a NumericString, as the INN of a Russian certificate. + ['NumericString', '1204' + hexOf('1234'), true], + ['NumericString with a letter', '1201' + hexOf('A'), true], + ['VideotexString', '150141', true], + ['GraphicString', '190141', true], + ['GeneralString', '1b0141', true], + ['ObjectDescriptor', '070141', true], + ['NumericString in constructed form', '3203' + '120131', false], + ['REAL', '0900', false], + ['RELATIVE-OID', '0d0101', false], + // Times in the forms of DER (X.690 11.7, 11.8). + ['UTCTime', '170d' + hexOf('250101120000Z'), true], + ['an empty UTCTime', '1700', false], + ['UTCTime without seconds', '170b' + hexOf('2501011200Z'), false], + ['UTCTime with a digit more', '170e' + hexOf('2501011200001Z'), false], + ['UTCTime with an offset', '1711' + hexOf('250101120000+0100'), false], + ['UTCTime of 30 February', '170d' + hexOf('250230120000Z'), false], + ['UTCTime with second 60', '170d' + hexOf('250101235960Z'), false], + ['a UTCTime that is not a time', '170a' + hexOf('not a time'), false], + ['UTCTime with a slash in its seconds', '170d' + hexOf('2501011200/0Z'), false], + ['UTCTime with a colon in its day', '170d' + hexOf('25010:120000Z'), false], + ['GeneralizedTime', '180f' + hexOf('20250101120000Z'), true], + ['GeneralizedTime with a fraction', '1812' + hexOf('20250101120000.25Z'), true], + ['GeneralizedTime with a trailing zero', '1813' + hexOf('20250101120000.250Z'), false], + ['GeneralizedTime with an empty fraction', '1810' + hexOf('20250101120000.Z'), false], + ['GeneralizedTime with a letter in its fraction', '1812' + hexOf('20250101120000.2aZ'), false], + ['GeneralizedTime without Z', '180e' + hexOf('20250101120000'), false], + ['GeneralizedTime with a comma', '1812' + hexOf('20250101120000,25Z'), false], + ['GeneralizedTime without seconds', '180d' + hexOf('202501011200Z'), false], + ['GeneralizedTime with a slash in its seconds', '180f' + hexOf('202501011200/0Z'), false], + ['GeneralizedTime of month 0', '180f' + hexOf('20250001120000Z'), false], + ['GeneralizedTime of month 13', '180f' + hexOf('20251301120000Z'), false], + ['GeneralizedTime of day 0', '180f' + hexOf('20250100120000Z'), false], + ['GeneralizedTime of 31 April', '180f' + hexOf('20250431120000Z'), false], + ['GeneralizedTime of hour 24', '180f' + hexOf('20250101240000Z'), false], + ['GeneralizedTime of minute 60', '180f' + hexOf('20250101126000Z'), false], + ['GeneralizedTime of 29 February 2024', '180f' + hexOf('20240229235959Z'), true], + // What a check that is missing would let through: the last byte read as Z, + // a colon read as the digit 10, a slash read as a year, a tag of a high + // number read as one byte, and an indefinite length read as a long form. + ['UTCTime that ends in another letter', '170d' + hexOf('250101120000X'), false], + ['GeneralizedTime with a digit in the place of Z', '180f' + hexOf('202501011200000'), false], + ['GeneralizedTime with a colon in its day', '180f' + hexOf('2025010:120000Z'), false], + ['GeneralizedTime with a slash in its year', '180f' + hexOf('/0250101120000Z'), false], + ['a context tag of a high number', '9f0100', false], + ['an indefinite length and nothing after it', '3080', false], + // Go reads the bytes of a time: a leading U+FEFF is no digit. + ['UTCTime after a byte order mark', '1710' + 'efbbbf' + hexOf('250101120000Z'), false], ['33 SEQUENCEs, each holding the next', nested(33), true], ['34 SEQUENCEs, each holding the next', nested(34), false], ]; @@ -70,15 +144,60 @@ describe('checkDer', () => { expect(() => checkDer(h(nested(32, '0500')))).not.toThrow(); expect(() => checkDer(h(nested(33, '0500')))).toThrow('der: nested too deep'); }); + + it('says what is wrong, with the texts of Go', () => { + expect(() => checkDer(h('170d' + hexOf('250230120000Z')))).toThrow(new DerError('a date or a time that does not exist')); + expect(() => checkDer(h('170b' + hexOf('2501011200Z')))).toThrow(new DerError('a time that is not in the form of DER')); + expect(() => checkDer(h('0900'))).toThrow(new DerError('the universal type 9, which the profile does not use')); + expect(() => checkDer(h('0500' + '00'))).toThrow(new DerError('1 bytes after the element')); + }); +}); + +describe('parseTime', () => { + const at = (y: number, mo: number, d: number, hh: number, mm: number, ss: number, nanos = 0): { seconds: number; nanos: number } => { + const t = new Date(0); + t.setUTCFullYear(y, mo - 1, d); + t.setUTCHours(hh, mm, ss); + return { seconds: t.getTime() / 1000, nanos }; + }; + // The years 50 to 99 of a UTCTime are of the 20th century (RFC 5280 4.1.2.5.1), and a fraction has up to nine digits that count. + it.each([ + ['170d' + hexOf('491231235959Z'), at(2049, 12, 31, 23, 59, 59), false], + ['170d' + hexOf('500101000000Z'), at(1950, 1, 1, 0, 0, 0), false], + ['1813' + hexOf('20240229120000.125Z'), at(2024, 2, 29, 12, 0, 0, 125_000_000), true], + ['1819' + hexOf('20240229120000.123456789Z'), at(2024, 2, 29, 12, 0, 0, 123_456_789), true], + ['181b' + hexOf('20240229120000.12345678912Z'), at(2024, 2, 29, 12, 0, 0, 123_456_789), true], + ['180f' + hexOf('19490101000000Z'), at(1949, 1, 1, 0, 0, 0), false], + ['180f' + hexOf('00000229000000Z'), at(0, 2, 29, 0, 0, 0), false], + ['180f' + hexOf('99991231235959Z'), at(9999, 12, 31, 23, 59, 59), false], + ] as const)('%s', (hex, time, fraction) => { + expect(parseTime(h(hex))).toEqual({ time, fraction }); + }); + + it.each([ + ['a date that does not exist', '180f' + hexOf('20230229120000Z')], + ['an OCTET STRING', '040d' + hexOf('491231235959Z')], + ['a GeneralizedTime in an OCTET STRING', '040f' + hexOf('20230228120000Z')], + ['a UTCTime in a UTF8String', '0c0d' + hexOf('491231235959Z')], + ['a lone identifier', '17'], + ['a content that does not fit', '170d' + hexOf('4912')], + ['nothing', ''], + ])('refuses %s', (_name, hex) => { + expect(() => parseTime(h(hex))).toThrow(DerError); + }); }); describe('setOfSorted, splitDer and derContent', () => { - it('knows the order of the elements of a SET OF', () => { + // The elements of a SET OF go in ascending order, and equal ones may repeat (X.690 11.6). + it('knows the order of the elements of a SET OF, which may repeat one', () => { const a = h('020101'); const b = h('020102'); expect(setOfSorted([a, b])).toBe(true); expect(setOfSorted([b, a])).toBe(false); - expect(setOfSorted([a, a])).toBe(false); + expect(setOfSorted([a, a])).toBe(true); + expect(setOfSorted([a, a, b])).toBe(true); + expect(setOfSorted([a, b, a])).toBe(false); + expect(setOfSorted([h('0201'), a])).toBe(true); expect(setOfSorted([])).toBe(true); }); @@ -87,8 +206,12 @@ describe('setOfSorted, splitDer and derContent', () => { checkDer(b); const { id, children } = splitDer(b); expect([id, children.map((c) => c.length)]).toEqual([0x30, [3, 2]]); + expect(derContent(b)).toEqual(b.subarray(2)); expect(derContent(children[0]!)).toEqual(h('01')); + // Nothing, a primitive element, and constructed ones whose content does not fit. + for (const bad of ['', '0400', '3005', 'a005', '3003040500']) expect(() => splitDer(h(bad)), bad).toThrow(DerError); expect(() => splitDer(h('020101'))).toThrow(/not a constructed/); - expect(() => splitDer(new Uint8Array(0))).toThrow(DerError); + expect(() => derContent(h('040500'))).toThrow(DerError); + expect(() => derContent(h('04'))).toThrow(DerError); }); }); diff --git a/src/lib/dkc/der.ts b/src/lib/dkc/der.ts index e0ab9bd..8ce0833 100644 --- a/src/lib/dkc/der.ts +++ b/src/lib/dkc/der.ts @@ -1,14 +1,16 @@ // A strict check that bytes are one element in the Distinguished Encoding -// Rules of X.690, as the Go package internal/der does it, which spec v0.11 +// Rules of X.690, as the Go package internal/der does it, which spec v0.12 // §29.10 asks of a CMS signature before anyone looks inside it: definite and // minimal lengths, no high tag numbers, no constructed form of a type that DER -// only has primitive, canonical BOOLEAN, INTEGER, NULL, OBJECT IDENTIFIER and -// BIT STRING, only the universal types that certificates, signatures and -// tokens use, and no bytes after the element. The order of the elements of a -// SET OF cannot be checked without a schema: setOfSorted does it for the -// callers that know theirs. Internal: index.ts does not re-export it. +// only has primitive, canonical BOOLEAN, INTEGER, NULL, OBJECT IDENTIFIER, BIT +// STRING, UTCTime and GeneralizedTime, only the universal types that +// certificates, signatures and tokens use, and no bytes after the element. The +// order of the elements of a SET OF cannot be checked without a schema: +// setOfSorted does it for the callers that know theirs. Internal: index.ts +// does not re-export it. import { compareBytes } from './bytes.ts'; +import type { Instant } from './datekey.ts'; /** A byte string that is not DER; the message says what is wrong. */ export class DerError extends Error { @@ -50,17 +52,85 @@ export function derContent(b: Uint8Array): Uint8Array { } /** - * Whether the encodings are in ascending order of their bytes, as DER - * requires of the elements of a SET OF (X.690 11.6), and without repetitions: a - * SET OF of this profile has none. + * Whether the encodings are in ascending order of their bytes, as DER requires + * of the elements of a SET OF (X.690 11.6). Equal elements may repeat, side by + * side: X.690 does not forbid it, and a time-stamping authority may send its + * certificate twice. Whoever counts the elements of a SET OF decides what a + * repetition means. */ export function setOfSorted(elems: readonly Uint8Array[]): boolean { for (let i = 1; i < elems.length; i++) { - if (compareBytes(elems[i - 1]!, elems[i]!) >= 0) return false; + if (compareBytes(elems[i - 1]!, elems[i]!) > 0) return false; } return true; } +/** + * Reads a UTCTime or a GeneralizedTime element as DER writes them (X.690 11.7 + * and 11.8): YYMMDDHHMMSSZ, with the years 50 to 99 in the 20th century (RFC + * 5280 4.1.2.5.1), or YYYYMMDDHHMMSS, an optional fraction of seconds without + * a trailing zero, and Z. A date or a time that does not exist, a second 60 + * included, is refused. `fraction` tells whether a GeneralizedTime has one. + */ +export function parseTime(b: Uint8Array): { time: Instant; fraction: boolean } { + if (b.length < 2 || (b[0] !== 0x17 && b[0] !== 0x18)) throw new DerError('not a UTCTime or a GeneralizedTime'); + return timeOf(b[0], derContent(b)); +} + +// The time of the content c of a UTCTime (tag 0x17) or a GeneralizedTime, +// read from its bytes as Go reads them: no byte decodes to another. +function timeOf(tag: number, c: Uint8Array): { time: Instant; fraction: boolean } { + const bad = (): never => { + throw new DerError('a time that is not in the form of DER'); + }; + if (c.length < 13 || c[c.length - 1] !== 0x5a) bad(); // Z + let body = c.subarray(0, c.length - 1); + let frac = body.subarray(0, 0); + let year: number; + if (tag === 0x17) { + if (body.length !== 12 || !digits(body)) bad(); + year = number(body.subarray(0, 2)) + 1900; + if (year < 1950) year += 100; + body = body.subarray(2); + } else { + const dot = body.indexOf(0x2e); // . + if (dot >= 0) { + frac = body.subarray(dot + 1); + body = body.subarray(0, dot); + if (frac.length === 0 || frac[frac.length - 1] === 0x30 || !digits(frac)) bad(); + } + if (body.length !== 14 || !digits(body)) bad(); + year = number(body.subarray(0, 4)); + body = body.subarray(4); + } + const [month, day, hour, minute, second] = [0, 2, 4, 6, 8].map((i) => number(body.subarray(i, i + 2))) as [number, number, number, number, number]; + if (month < 1 || month > 12 || day < 1 || hour > 23 || minute > 59 || second > 59 || day > daysIn(year, month)) { + throw new DerError('a date or a time that does not exist'); + } + let nanos = 0; + for (let i = 0; i < 9; i++) nanos = nanos * 10 + (i < frac.length ? frac[i]! - 0x30 : 0); + // setUTCFullYear, unlike Date.UTC, keeps the years 0 to 99 as they are. + const d = new Date(0); + d.setUTCFullYear(year, month - 1, day); + return { time: { seconds: d.getTime() / 1000 + hour * 3600 + minute * 60 + second, nanos }, fraction: frac.length > 0 }; +} + +function digits(b: Uint8Array): boolean { + return b.length > 0 && b.every((x) => x >= 0x30 && x <= 0x39); +} + +function number(b: Uint8Array): number { + let n = 0; + for (const x of b) n = n * 10 + x - 0x30; + return n; +} + +// The days of a month of the proleptic Gregorian calendar, as Go's time.Date. +function daysIn(year: number, month: number): number { + if (month === 2) return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28; + return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31; +} + // The length of the identifier and length octets of the element at the start // of b, and the length of its content, which must fit in b. function header(b: Uint8Array): { headerLen: number; contentLen: number } { @@ -142,23 +212,37 @@ function checkPrimitive(tag: number, c: Uint8Array): void { } return; } - case 4: // OCTET STRING and the string and time types of X.509 + case 23: // UTCTime + case 24: // GeneralizedTime + timeOf(tag === 23 ? 0x17 : 0x18, c); + return; + case 4: + case 7: case 12: + case 18: case 19: case 20: + case 21: case 22: - case 23: - case 24: + case 25: case 26: + case 27: case 28: case 30: + // OCTET STRING, ObjectDescriptor and the restricted character string + // types: DER writes them primitive (X.690 10.2), with their content as + // it is. A name may hold any of them, a NumericString among them, as the + // certificates of some countries do: what is not text decides at the + // text of the name (spec §29.10), not here. return; case 16: case 17: throw new DerError(`the universal type ${tag} in primitive form`); default: // 0 is the end of contents of BER, and the rest are types that no - // certificate, signature or token of the profile has. + // certificate, signature or token of the profile has: REAL, + // RELATIVE-OID, TIME and the reserved tags, whose DER has rules of its + // own that this module does not check. throw new DerError(`the universal type ${tag}, which the profile does not use`); } } diff --git a/src/lib/dkc/inspect.test.ts b/src/lib/dkc/inspect.test.ts index 0e071b1..0e19301 100644 --- a/src/lib/dkc/inspect.test.ts +++ b/src/lib/dkc/inspect.test.ts @@ -77,6 +77,25 @@ describe('inspect', () => { expect(Object.keys(inspectView(r))).toEqual(['format', 'capsule_id', 'datekey', 'profile', 'round', 'unlock_at', 'access_policy', 'valid', 'checks']); }); + // Go's inspectview: the public note when it is usable, and public_note_unusable for one that breaks the rules of + // text, which is not shown (spec §24.1). inspect loads those rules on demand, only for a header with a note. + it('gives the public note in the view, or says that it is unusable', async () => { + const dkc = readBytes('fixtures/format3_note.dkc'); + const r = await inspect(dkc); + expect([r.error, r.publicNote, r.unusableNote]).toEqual([undefined, 'Cartas del viaje a Lisboa', false]); + const view = inspectView(r); + expect(view.public_note).toBe('Cartas del viaje a Lisboa'); + expect(Object.keys(view)).toEqual(['format', 'capsule_id', 'datekey', 'profile', 'round', 'unlock_at', 'access_policy', 'public_note', 'valid', 'checks']); + // A tab for the first space: steps 1 to 8 do not read the data of a noncritical extension that nobody registers, + // so the capsule passes them, and the note does not show. + const tabbed = await inspect(replaceText(dkc, 'Cartas del', 'Cartas\tdel')); + expect([tabbed.error, tabbed.publicNote, tabbed.unusableNote]).toEqual([undefined, undefined, true]); + expect(Object.keys(inspectView(tabbed))).toEqual(['format', 'capsule_id', 'datekey', 'profile', 'round', 'unlock_at', 'access_policy', 'public_note_unusable', 'valid', 'checks']); + // Without a note there is nothing to load, and inspectWith alone reads none. + expect((await inspect(timeOnly)).unusableNote).toBeUndefined(); + expect(inspectWith(dkc, await defaultRegistry()).publicNote).toBeUndefined(); + }); + it('fails the framing steps as the reference', () => { const cases: [Uint8Array, number, string, RegExp][] = [ [new Uint8Array(0), 1, 'ERR_INVALID_MAGIC', /^capsule: ERR_INVALID_MAGIC$/], diff --git a/src/lib/dkc/inspect.ts b/src/lib/dkc/inspect.ts index 05e17de..eb126b5 100644 --- a/src/lib/dkc/inspect.ts +++ b/src/lib/dkc/inspect.ts @@ -10,7 +10,7 @@ import { ageStanzas, checkPayloadStanzas, checkTimeStanzas, type Stanza, STANZA_ import { copyBytes, goQuote, toHex } from './bytes.ts'; import { compactDateKey, formatRFC3339, type Instant, roundTime, validateDateKey } from './datekey.ts'; import { DateKeysError } from './errors.ts'; -import { checkCritical, checkNoncritical, type ExtensionRegistry, type Unusable } from './extension.ts'; +import { checkCritical, checkNoncritical, type ExtensionRegistry, NOTE_ID, type Unusable } from './extension.ts'; import { type CapsuleSections, FramingError, payloadOffset, type Prelude, splitCapsule } from './framing.ts'; import { decodeHeader, type Header, policyName } from './header.ts'; import { chainHashHex, defaultRegistry, type Profile, type ProfileRegistry } from './profile.ts'; @@ -65,6 +65,13 @@ export interface Inspection { * registry rejects. The capsule stays valid (spec §54). */ readonly unusableExtensions: readonly Unusable[]; + /** + * The public note of PUBLIC_HEADER (spec §24.1), text of the creator that + * nobody has checked, when it has one that is usable; set by inspect. + */ + readonly publicNote?: string; + /** True when PUBLIC_HEADER holds a public note that breaks the rules of text, which is not shown (§24.1); set by inspect. */ + readonly unusableNote?: boolean; readonly checks: readonly CheckResult[]; /** The failure, or undefined when steps 1 to 8 pass. */ readonly error?: DateKeysError; @@ -235,7 +242,19 @@ function asDateKeysError(err: unknown): DateKeysError { */ export async function inspect(dkc: Uint8Array, opts: InspectOptions = {}): Promise { const registry = opts.registry ?? (await defaultRegistry()); - return inspectWith(dkc, registry, opts.extensions); + return withNote(inspectWith(dkc, registry, opts.extensions)); +} + +// The public note of the header, read with the rules of text (note.ts), +// whose Unicode tables load on demand: only for a header that has one, so +// that a page without notes never loads them. +async function withNote(in_: Inspection): Promise { + const noncritical = in_.header?.noncritical ?? []; + if (!noncritical.some((x) => x.id === NOTE_ID && x.version === 1)) return in_; + const { publicNote } = await import('./note.ts'); + const note = publicNote(noncritical); + // There is a note: without its text, it is unusable (Go's UnusableNote). + return note === undefined ? { ...in_, unusableNote: true } : { ...in_, publicNote: note, unusableNote: false }; } /** The JSON view of `datekeys inspect -json` (Go cmd/datekeys inspectView). */ @@ -249,6 +268,10 @@ export interface InspectView { round?: number; unlock_at?: string; access_policy?: string; + /** The public note, text of the creator that nobody has checked (spec §24.1). */ + public_note?: string; + /** True for a public note that breaks the rules of text, which is not shown. */ + public_note_unusable?: boolean; valid: boolean; error?: string; checks: CheckResult[]; @@ -272,6 +295,8 @@ export function inspectView(in_: Inspection, file?: string): InspectView { v.profile = h.dateKey.profileId; v.round = h.dateKey.round; v.access_policy = policyName(h.policy); + if (in_.publicNote !== undefined) v.public_note = in_.publicNote; + if (in_.unusableNote === true) v.public_note_unusable = true; } if (in_.unlockAt !== undefined) v.unlock_at = formatRFC3339(in_.unlockAt); return orderView(v); @@ -279,7 +304,21 @@ export function inspectView(in_: Inspection, file?: string): InspectView { // The key order of the Go struct, so that JSON.stringify matches the CLI. function orderView(v: InspectView): InspectView { - const keys: (keyof InspectView)[] = ['file', 'format', 'capsule_id', 'datekey', 'profile', 'round', 'unlock_at', 'access_policy', 'valid', 'error', 'checks']; + const keys: (keyof InspectView)[] = [ + 'file', + 'format', + 'capsule_id', + 'datekey', + 'profile', + 'round', + 'unlock_at', + 'access_policy', + 'public_note', + 'public_note_unusable', + 'valid', + 'error', + 'checks', + ]; const o: Record = {}; for (const k of keys) if (v[k] !== undefined) o[k] = v[k]; return o as unknown as InspectView; diff --git a/src/lib/dkc/security.failure.test.ts b/src/lib/dkc/security.failure.test.ts index 16828ca..0d5fad6 100644 --- a/src/lib/dkc/security.failure.test.ts +++ b/src/lib/dkc/security.failure.test.ts @@ -1,15 +1,17 @@ // Faults of the evaluation of the security area that no input reaches today: -// the decoder, the strict verification of alg 1 and the evaluators of alg 2 -// and of the seal are replaced by functions that throw, in a file of its own -// because vi.mock replaces a module for the whole file. evaluateSecurity never -// throws, since the security area never decides the opening (spec §29.3): a -// fault while it evaluates the signature gives F1, and one while it evaluates -// the seal, S2, each without touching the other verdict; one while it decodes -// the area gives X. The Go reference does the same from v0.12. +// the decoder, the strict verification of alg 1, the evaluators of alg 2 and +// of the seal and the reader of a token are replaced by functions that throw, +// in a file of its own because vi.mock replaces a module for the whole file. +// evaluateSecurity never throws, since the security area never decides the +// opening (spec §29.3): a fault while it evaluates the signature gives F1, and +// one while it evaluates the seal, S2, each without touching the other +// verdict; one while it decodes the area gives X. The Go reference does the +// same from v0.12. import { afterEach, describe, expect, it, vi } from 'vitest'; import { controlCommit, headDigest } from './author.ts'; import { peek } from './cbor.ts'; +import { parseToken } from './cms.ts'; import { decodeControl } from './control.ts'; import { parseRFC3339 } from './datekey.ts'; import { verifyStrict } from './ed25519strict.ts'; @@ -30,6 +32,10 @@ vi.mock('./securitycms.ts', async (importOriginal) => { const m = await importOriginal(); return { ...m, evaluateCMS: vi.fn(m.evaluateCMS), evaluateSeal: vi.fn(m.evaluateSeal) }; }); +vi.mock('./cms.ts', async (importOriginal) => { + const m = await importOriginal(); + return { ...m, parseToken: vi.fn(m.parseToken) }; +}); interface Record { control_cbor: string; @@ -58,6 +64,7 @@ afterEach(() => { vi.mocked(verifyStrict).mockReset(); vi.mocked(evaluateCMS).mockReset(); vi.mocked(evaluateSeal).mockReset(); + vi.mocked(parseToken).mockReset(); }); describe('evaluateSecurity, when an evaluator throws', () => { @@ -91,6 +98,17 @@ describe('evaluateSecurity, when an evaluator throws', () => { expect([v.signature, v.seal, v.authorKey === undefined, v.detail]).toEqual(['F4', 'S2', false, undefined]); }); + // A fault of the reader of a token, which is not a verdict of its form or of its algorithms, reaches evaluateSecurity: + // the seal of key 3 is S2, and a signature of alg 2 whose signer is sealed F1. + it('gives S2 for a fault of the reader of the token of a seal, and F1 for one of the token of a signer', () => { + const sealed = fixture('format3_sealed'); + vi.mocked(parseToken).mockImplementationOnce(fault); + expect(evaluateSecurity(sealed.area, sealed.context)).toMatchObject({ signature: 'F4', seal: 'S2' }); + const cms = fixture('format3_signed_cms'); + vi.mocked(parseToken).mockImplementationOnce(fault); + expect(evaluateSecurity(cms.area, cms.context)).toEqual({ signature: 'F1', seal: 'S0' }); + }); + it('gives F1 and S2 for faults in both, and X for a fault while it decodes the area', () => { const { area, context } = fixture('format3_sealed'); vi.mocked(verifyStrict).mockImplementationOnce(fault); diff --git a/src/lib/dkc/security.test.ts b/src/lib/dkc/security.test.ts index 92c0b8b..32249d3 100644 --- a/src/lib/dkc/security.test.ts +++ b/src/lib/dkc/security.test.ts @@ -1,7 +1,7 @@ // Tests of security.ts: the empty area that writers write, the verdicts of // the signature and of the seal without the context of a capsule, on the // cases of TestSecurityVerdicts of the Go reference and a few more, and the -// Spanish lines of spec §29.7, as the reference gives them at spec-v0.11. +// Spanish lines of spec §29.7, as the reference gives them at the draft v0.12. // The verdicts in the context of a capsule are tested by author.test.ts, // securitycms.test.ts, security.failure.test.ts, fixtures.test.ts and // vectors.test.ts. @@ -86,24 +86,53 @@ describe('verdictLines', () => { expect(verdictText('S0')).toBe(''); }); - // F6 and S4 write the names that the reader found (spec §29.7, §29.10): a signer sealed before the round time or not, a signer who does not count. - it('writes the lines of F6 and S4 from the signers and the authority that were found', () => { + // F6 and S4 write the names that the reader found (spec v0.12 §29.7, §29.10), each between « and »: a signer sealed + // before the round time or not, with the authority of its seal, the warning that DateKeys does not check who issued + // the seals, and a signer who does not count, with its result in Spanish. + it('writes the lines of F6 and S4 from the signers and the authorities that were found', () => { const t = { seconds: 1_790_000_000, nanos: 0 }; - const line = (holder: string, before: boolean, result = 'valid') => ({ holder, issuer: `emisor de ${holder}`, result, sealTime: t, before }); + const line = (holder: string, before: boolean, result = 'valid') => ({ holder, issuer: `emisor de ${holder}`, result, sealHolder: `TSA de ${holder}`, sealTime: t, before }); const lines = verdictLines({ signature: 'F6', seal: 'S4', detail: { signers: [line('Ana', true), line('Luis', false)], foreign: [line('Otro', true, 'invalid')], sealHolder: 'TSA', sealTime: t }, }); expect(lines).toEqual([ - 'Firmado con un certificado a nombre de Ana, Luis. DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.', - ' Ana (emisor según su certificado: emisor de Ana), sellado el 2026-09-21T14:13:20Z, antes de la fecha de apertura.', - ' Luis (emisor según su certificado: emisor de Luis), sellado el 2026-09-21T14:13:20Z, no antes de la fecha de apertura.', - ' Otro firmante, Otro: invalid. No cuenta.', - 'Según un sello a nombre de TSA, existía el 2026-09-21T14:13:20Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.', + 'Firmado con un certificado a nombre de «Ana», «Luis». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.', + ' «Ana» (emisor según su certificado: «emisor de Ana»), sellado por «TSA de Ana» el 2026-09-21T14:13:20Z, antes de la fecha de apertura.', + ' «Luis» (emisor según su certificado: «emisor de Luis»), sellado por «TSA de Luis» el 2026-09-21T14:13:20Z, no antes de la fecha de apertura.', + ' DateKeys no comprueba quién emitió los sellos.', + ' Otro firmante, «Otro»: inválida. No cuenta.', + 'Según un sello a nombre de «TSA», existía el 2026-09-21T14:13:20Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.', ]); }); + // No line says "antes de la fecha de apertura": no warning. A time keeps the fraction of its seal (RFC 3339). + it('warns of who issued the seals only when a signer was sealed before the date, and writes the fraction of a time', () => { + const t = { seconds: 1_790_000_000, nanos: 250_000_000 }; + const late = { holder: 'Ana', issuer: 'CA', result: 'valid', sealHolder: 'TSA', sealTime: t, before: false }; + expect(verdictLines({ signature: 'F6', seal: 'S0', detail: { signers: [late], foreign: [] } })).toEqual([ + 'Firmado con un certificado a nombre de «Ana». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.', + ' «Ana» (emisor según su certificado: «CA»), sellado por «TSA» el 2026-09-21T14:13:20.25Z, no antes de la fecha de apertura.', + ]); + expect(verdictLines({ signature: 'F4', seal: 'S4', authorKey: new Uint8Array(32), detail: { signers: [], foreign: [], sealHolder: 'TSA', sealTime: { seconds: t.seconds, nanos: 1 } } })[1]).toBe( + 'Según un sello a nombre de «TSA», existía el 2026-09-21T14:13:20.000000001Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.', + ); + }); + + // The result of a signer who does not count, in the words of §29.7, whatever the verdict of the signature. + it.each([ + ['valid', 'válida'], + ['invalid', 'inválida'], + ['not verifiable', 'no verificable'], + ['without seal', 'sin sello'], + ['invalid seal', 'con el sello inválido'], + ['out of validity', 'con el certificado fuera de validez'], + ])('writes the result %s of a signer who does not count as «%s»', (result, text) => { + const foreign = [{ holder: 'Otro', issuer: 'CA', result, before: false }]; + expect(verdictLines({ signature: 'F5', seal: 'S0', detail: { signers: [], foreign } })).toEqual([verdictText('F5'), ` Otro firmante, «Otro»: ${text}. No cuenta.`]); + }); + // The verdicts of spec v0.11 (§29.7) whose text is fixed, and those whose text names a key, a holder or a time, F3, F4, F6 // and S4, which verdictLines writes from what the reader found and verdictText leaves empty. it('has the text of the verdicts of v0.11 that do not name anything, and none for those that do', () => { diff --git a/src/lib/dkc/security.ts b/src/lib/dkc/security.ts index 378dd5b..729a8bd 100644 --- a/src/lib/dkc/security.ts +++ b/src/lib/dkc/security.ts @@ -1,6 +1,7 @@ // The security area of a format 3 capsule (spec §29.3, §29.7), as // EncodeSecurity, EvaluateSecurityIn and the verdicts of the Go package -// capsule at spec-v0.11 (format3.go, signature.go). SECURITY_CBOR is the map +// capsule give them at the draft v0.12 (format3.go, signature.go), the texts +// of the verdicts of a certificate included. SECURITY_CBOR is the map // {0: "datekeys-security", 1: 1, ? 2: author-signature, ? 3: seal}, whose // keys 2 and 3 hold CBOR encoded apart. In the context of a capsule it checks // the signature of alg 1 with the strict profile of ed25519strict.ts, and the @@ -15,7 +16,7 @@ import { utf8Length } from './bytes.ts'; import { type Decoder, Encoder, peek, unmarshal } from './cbor.ts'; import { verifyStrict } from './ed25519strict.ts'; import { DateKeysError } from './errors.ts'; -import { formatRFC3339, type Instant } from './datekey.ts'; +import { formatRFC3339Nano, type Instant } from './datekey.ts'; import { fieldOf, requireKeys } from './schema.ts'; import { type Detail, evaluateCMS, evaluateSeal } from './securitycms.ts'; @@ -108,7 +109,30 @@ export function verdictText(v: Verdict): string { } } -/** The verdicts as the official SDK shows them, in order: X alone, or the signature and then the seal, when it shows something. */ +// The result of a signer in the texts of §29.7. +const RESULT_TEXT: Readonly> = { + valid: 'válida', + invalid: 'inválida', + absent: 'ausente', + 'not verifiable': 'no verificable', + 'without seal': 'sin sello', + 'invalid seal': 'con el sello inválido', + 'out of validity': 'con el certificado fuera de validez', +}; + +// A name of a certificate between « and », as the texts of §29.7 write it, so +// that where it starts and where it ends is in view. +const quoted = (name: string): string => `«${name}»`; + +/** + * The verdicts as the official SDK shows them, in order: X alone, or the + * signature and then the seal, when it shows something (spec §29.7). F6 is + * followed by a line for each required signer, which names the authority of + * its seal, by the warning that DateKeys does not check who issued the seals + * when one of them says that it is before the opening date, and by the + * signers who do not count. A time is in RFC 3339 with the fraction of the + * seal. + */ export function verdictLines(v: Verdicts): string[] { if (v.signature === 'X') return [verdictText('X')]; let signature = verdictText(v.signature); @@ -118,15 +142,17 @@ export function verdictLines(v: Verdicts): string[] { const lines = [signature]; const d = v.detail; if (v.signature === 'F6' && d !== undefined) { - lines[0] = `Firmado con un certificado a nombre de ${d.signers.map((s) => s.holder).join(', ')}. DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.`; + lines[0] = `Firmado con un certificado a nombre de ${d.signers.map((s) => quoted(s.holder)).join(', ')}. DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.`; for (const s of d.signers) { const when = s.before ? 'antes de la fecha de apertura' : 'no antes de la fecha de apertura'; - lines.push(` ${s.holder} (emisor según su certificado: ${s.issuer}), sellado el ${formatRFC3339(s.sealTime!)}, ${when}.`); + lines.push(` ${quoted(s.holder)} (emisor según su certificado: ${quoted(s.issuer)}), sellado por ${quoted(s.sealHolder!)} el ${formatRFC3339Nano(s.sealTime!)}, ${when}.`); } + // §29.7: whoever says that a capsule was signed before the date says that it does not check who issued the seal. + if (d.signers.some((s) => s.before)) lines.push(' DateKeys no comprueba quién emitió los sellos.'); } - for (const s of d?.foreign ?? []) lines.push(` Otro firmante, ${s.holder}: ${s.result}. No cuenta.`); + for (const s of d?.foreign ?? []) lines.push(` Otro firmante, ${quoted(s.holder)}: ${RESULT_TEXT[s.result]!}. No cuenta.`); if (v.seal === 'S4' && d?.sealHolder !== undefined) { - lines.push(`Según un sello a nombre de ${d.sealHolder}, existía el ${formatRFC3339(d.sealTime!)}, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.`); + lines.push(`Según un sello a nombre de ${quoted(d.sealHolder)}, existía el ${formatRFC3339Nano(d.sealTime!)}, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.`); } else if (verdictText(v.seal) !== '') { lines.push(verdictText(v.seal)); } diff --git a/src/lib/dkc/securitycms.test.ts b/src/lib/dkc/securitycms.test.ts index d57ded1..0c8bff0 100644 --- a/src/lib/dkc/securitycms.test.ts +++ b/src/lib/dkc/securitycms.test.ts @@ -1,31 +1,43 @@ // Tests of securitycms.ts, the verdicts of a signature of alg 2 and of a seal -// of seal_type 2 (spec v0.11 §29.7, §29.10, §29.11), through evaluateSecurity +// of seal_type 2 (spec v0.12 §29.7, §29.10, §29.11), through evaluateSecurity // in the context of a capsule, on signatures and tokens that -// testing/cmsbuild.ts makes: what a signer line shows of a certificate, a byte -// order mark at the start of a name or a time, and keys whose point is -// compressed. capsule.EvaluateSecurityIn of the Go reference at spec-v0.11 -// gives the same verdicts, signer lines and Spanish lines on areas made the -// same way: an oracle compared them, and the hashes of the issuers below are -// the ones it gave for these Names. +// testing/cmsbuild.ts makes: the cases of signature2_test.go of the Go +// reference at the draft v0.12, what a signer line shows of a certificate, a +// byte order mark at the start of a name or a time, and keys whose point is +// compressed. The hashes of the issuers below are those of the DER of their +// Names, which the reference shows in their place. import { sha256 } from '@noble/hashes/sha2.js'; import { describe, expect, it } from 'vitest'; -import { ALG_CMS, authorMessage, sealSubject, signersDigest } from './author.ts'; +import { ALG_CMS, ALG_ED25519, authorMessage, sealSubject, signersDigest } from './author.ts'; import { compareBytes, toHex } from './bytes.ts'; import { Encoder } from './cbor.ts'; -import { evaluateSecurity, type SecurityContext, type Verdicts, verdictLines } from './security.ts'; +import { ed25519 } from '@noble/curves/ed25519.js'; +import { evaluateSecurity, type SecurityContext, type Verdicts, verdictLines, verdictText } from './security.ts'; import * as b from './testing/cmsbuild.ts'; -const from = new Date(Date.UTC(2025, 0, 1)); -const to = new Date(Date.UTC(2030, 0, 1)); -const now = new Date(Date.UTC(2026, 8, 30, 12)); +const certFrom = new Date(Date.UTC(2025, 0, 1)); +const certTo = new Date(Date.UTC(2032, 0, 1)); +const roundTime = new Date(Date.UTC(2030, 0, 1)); +const signedAt = new Date(Date.UTC(2026, 8, 30, 12)); +const at = (d: Date): { seconds: number; nanos: number } => ({ seconds: Math.floor(d.getTime() / 1000), nanos: (d.getTime() % 1000) * 1_000_000 }); const context: SecurityContext = { - controlCommit: new Uint8Array(32).fill(1), - headDigest: new Uint8Array(32).fill(2), - roundTime: { seconds: Date.UTC(2026, 9, 1) / 1000, nanos: 0 }, + controlCommit: Uint8Array.from({ length: 32 }, (_, i) => (i === 0 ? 1 : 0)), + headDigest: Uint8Array.from({ length: 32 }, (_, i) => (i === 0 ? 2 : 0)), + roundTime: at(roundTime), }; const te = new TextEncoder(); const BOM = Uint8Array.of(0xef, 0xbb, 0xbf); +const F5 = verdictText('F5'); + +const ecKey = await b.newKey('P-256'); +const rsaKey = await b.newKey('rsa', 2048); +const p384Key = await b.newKey('P-384'); +const tsaKey = await b.newKey('P-256'); +const ana = b.newCert({ cn: 'Ana López', from: certFrom, to: certTo }, ecKey); +const luis = b.newCert({ cn: 'Luis Gómez', from: certFrom, to: certTo }, rsaKey); +const otro = b.newCert({ cn: 'Otro', from: certFrom, to: certTo }, p384Key); +const tsa = b.newCert({ cn: 'TSA de prueba', from: certFrom, to: certTo }, tsaKey); // SECURITY_CBOR with the contents of keys 2 and 3 given. function area(signature: Uint8Array | undefined, seal: Uint8Array | undefined): Uint8Array { @@ -46,46 +58,180 @@ function area(signature: Uint8Array | undefined, seal: Uint8Array | undefined): return e.out(); } -// The verdicts of a signature of alg 2 by the signers, all of them required, -// each with a signature-time-stamp of `tsa` when it is given. -async function signed(tsa: b.Signer | undefined, ...signers: b.Signer[]): Promise { - const hashes = signers.map((s) => sha256(s.cert)).sort(compareBytes); - const list = new Encoder(); - list.array(hashes.length); - for (const x of hashes) list.bstr(x); - const key1 = list.out(); - const msg = authorMessage(context.controlCommit, context.headDigest, signersDigest(ALG_CMS, key1)); - const cms = await b.signature(msg, tsa === undefined ? {} : { token: (sig) => b.token(sig, now, {}, tsa) }, ...signers); +// The content of a key of the security area: a map of 0, 1 and, when given, 2. +function item(first: number, key1: Uint8Array, key2?: Uint8Array): Uint8Array { const e = new Encoder(); - e.map(3); + e.map(key2 === undefined ? 2 : 3); e.uint(0); - e.uint(ALG_CMS); + e.uint(first); e.uint(1); e.bstr(key1); - e.uint(2); - e.bstr(cms); - return evaluateSecurity(area(e.out(), undefined), context); + if (key2 !== undefined) { + e.uint(2); + e.bstr(key2); + } + return e.out(); } -// The verdicts of a seal of seal_type 2 by `tsa`, without a signature. -async function sealed(tsa: b.Signer): Promise { - const token = await b.token(sealSubject(context.controlCommit, context.headDigest, undefined), now, {}, tsa); - const e = new Encoder(); - e.map(2); - e.uint(0); - e.uint(2); - e.uint(1); - e.bstr(token); - return evaluateSecurity(area(undefined, e.out()), context); +// SIGNERS of the certificates given, sorted. +function signersOf(...required: b.Signer[]): Uint8Array { + const hashes = required.map((s) => sha256(s.cert)).sort(compareBytes); + const list = new Encoder(); + list.array(hashes.length); + for (const x of hashes) list.bstr(x); + return list.out(); +} + +// The security area of a capsule with a signature of alg 2 by the signers, which SIGNERS requires with required, each +// signature sealed by `authority` at `when` with an accuracy of a second, and the seal of key 3 given. +async function cmsArea(required: b.Signer[], signers: b.Signer[], authority: b.Signer | undefined, when: Date, seal?: Uint8Array): Promise { + const key1 = signersOf(...required); + const msg = authorMessage(context.controlCommit, context.headDigest, signersDigest(ALG_CMS, key1)); + const o: b.Options = authority === undefined ? {} : { token: (sig) => b.token(sig, when, { accuracy: b.accuracyOf(1) }, authority) }; + return area(item(ALG_CMS, key1, await b.signature(msg, o, ...signers)), seal); } -const cn = (s: string): Uint8Array => b.rdnName(['2.5.4.3', b.utf8(s)], ['2.5.4.10', b.utf8('DateKeys test')]); +// The verdicts of a signature of alg 2 by the signers, all of them required, each with a signature-time-stamp of `tsa`. +async function signed(authority: b.Signer | undefined, ...signers: b.Signer[]): Promise { + return evaluateSecurity(await cmsArea(signers, signers, authority, signedAt), context); +} + +// The verdicts of a seal of seal_type 2 by `authority`, without a signature. +async function sealed(authority: b.Signer): Promise { + const token = await b.token(sealSubject(context.controlCommit, context.headDigest, undefined), signedAt, {}, authority); + return evaluateSecurity(area(undefined, item(2, token)), context); +} + +const quoted = (v: Verdicts): string => v.detail!.signers.map((s) => `«${s.holder}»`).join(', '); + +describe('a signature of alg 2', () => { + // Spec §29.7, §29.10: alg 2 gives F6 when every required signer is valid and sealed, and the first of F2, F5 and F1 + // that applies otherwise. + it('names its signers between « and », with the authority of each seal and the warning of §29.7', async () => { + const v = evaluateSecurity(await cmsArea([ana, luis], [ana, luis], tsa, signedAt), context); + expect([v.signature, v.seal, v.detail!.signers.length]).toEqual(['F6', 'S0', 2]); + const s = v.detail!.signers; + expect(verdictLines(v)).toEqual([ + `Firmado con un certificado a nombre de ${quoted(v)}. DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.`, + ` «${s[0]!.holder}» (emisor según su certificado: «${s[0]!.issuer}»), sellado por «TSA de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.`, + ` «${s[1]!.holder}» (emisor según su certificado: «${s[1]!.issuer}»), sellado por «TSA de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.`, + ' DateKeys no comprueba quién emitió los sellos.', + ]); + expect([...s.map((x) => x.holder)].sort()).toEqual(['Ana López', 'Luis Gómez']); + expect(s.map((x) => [x.result, x.sealHolder, x.sealTime, x.before])).toEqual([ + ['valid', 'TSA de prueba', at(signedAt), true], + ['valid', 'TSA de prueba', at(signedAt), true], + ]); + }); -describe('the issuer of a signer', () => { - // The issuer is text of the certificate, as the holder is: one that breaks the rules of the declared author shows - // the SHA-256 of the DER of its Name, Go's sha256.Sum256(RawIssuer), and never that of the certificate. - it('shows the SHA-256 of the Name of an issuer that breaks the rules of the declared author, as Go', async () => { - const tsa = await b.newECDSA('TSA de prueba', 'P-256', from, to); + it('warns of who issued the seals only when a line says before the opening date', async () => { + const late = evaluateSecurity(await cmsArea([ana], [ana], tsa, new Date(roundTime.getTime() + 3_600_000)), context); + expect([late.signature, verdictLines(late).length]).toEqual(['F6', 2]); + expect(verdictLines(late)[1]).toBe(' «Ana López» (emisor según su certificado: «Ana López»), sellado por «TSA de prueba» el 2030-01-01T01:00:00Z, no antes de la fecha de apertura.'); + // t plus the accuracy of a second equal to the round time is not before it. + const edge = evaluateSecurity(await cmsArea([ana], [ana], tsa, new Date(roundTime.getTime() - 1000)), context); + expect([edge.signature, edge.detail!.signers[0]!.before, verdictLines(edge).length]).toEqual(['F6', false, 2]); + // A seal with a fraction of a second shows it. + const fraction = evaluateSecurity(await cmsArea([ana], [ana], tsa, new Date(signedAt.getTime() + 250)), context); + expect(verdictLines(fraction)[1]).toBe(' «Ana López» (emisor según su certificado: «Ana López»), sellado por «TSA de prueba» el 2026-09-30T12:00:00.25Z, antes de la fecha de apertura.'); + }); + + // A signer who is not required shows apart, with its result in Spanish, and does not count. + it('shows a signer who is not required apart, with its result in Spanish', async () => { + const f = evaluateSecurity(await cmsArea([ana], [ana, otro], tsa, signedAt), context); + expect([f.signature, f.detail!.foreign.map((s) => s.holder), verdictLines(f).at(-1)]).toEqual(['F6', ['Otro'], ' Otro firmante, «Otro»: válida. No cuenta.']); + const unsealed = evaluateSecurity(await cmsArea([ana], [ana, otro], undefined, signedAt), context); + expect([unsealed.signature, verdictLines(unsealed)]).toEqual(['F5', [F5, ' Otro firmante, «Otro»: sin sello. No cuenta.']]); + }); + + // F5, and the result of the first required signer (spec §29.10, steps 1 to 7): the certificate of a signer that + // expired before the time of a valid seal is out of validity; a seal whose authority was not valid at its time is an + // invalid seal. + it('gives F5 and the result of each required signer', async () => { + const expired = b.newCert({ cn: 'Ana caducada', from: certFrom, to: new Date(Date.UTC(2026, 7, 30, 12)) }, ecKey); + const small = b.newCert({ cn: 'Clave corta', from: certFrom, to: certTo }, await b.newKey('rsa', 1024)); + const key3 = item(4294967295, Uint8Array.of(1)); + const cases: [string, Promise, string][] = [ + ['a required signer is absent', cmsArea([luis], [ana], tsa, signedAt), 'absent'], + ['no seal', cmsArea([ana], [ana], undefined, signedAt), 'without seal'], + ['a certificate out of validity at the time of a valid seal', cmsArea([expired], [expired], tsa, signedAt), 'out of validity'], + ['a seal whose authority was not valid at its time', cmsArea([ana], [ana], tsa, new Date(Date.UTC(2024, 0, 1))), 'invalid seal'], + ['a key outside the table', cmsArea([small], [small], tsa, signedAt), 'not verifiable'], + ['a key 3 beside it', cmsArea([ana], [ana], tsa, signedAt, key3), 'valid'], + ]; + for (const [name, der, result] of cases) { + const v = evaluateSecurity(await der, context); + expect([v.signature, v.detail!.signers[0]!.result, verdictLines(v)[0]], name).toEqual(['F5', result, F5]); + } + // The absent signer is named by the hash that SIGNERS gives, without an issuer. + const absent = evaluateSecurity(await cmsArea([luis], [ana], tsa, signedAt), context); + expect(absent.detail!.signers).toEqual([{ holder: toHex(sha256(luis.cert)), issuer: '', result: 'absent', before: false }]); + expect(absent.detail!.foreign.map((s) => [s.holder, s.result])).toEqual([['Ana López', 'valid']]); + }); + + it('gives F2 in another capsule, and F1 without a context or for SIGNERS that break its rule', async () => { + const der = await cmsArea([ana], [ana], tsa, signedAt); + const other: SecurityContext = { ...context, headDigest: context.headDigest.map((x, i) => (i === 5 ? 9 : x)) }; + const v = evaluateSecurity(der, other); + expect([v.signature, v.detail!.signers[0]!.result, verdictLines(v)]).toEqual(['F2', 'invalid', [verdictText('F2')]]); + expect(evaluateSecurity(der)).toEqual({ signature: 'F1', seal: 'S0' }); + // SIGNERS out of order, empty, too long, with an element of 31 bytes or one twice, each beside a CMS signature that + // is valid for the AUTHOR_MESSAGE of those very SIGNERS: the rule decides, not the CMS. + const [x, y] = [sha256(ana.cert), sha256(luis.cert)].sort(compareBytes) as [Uint8Array, Uint8Array]; + const bstr = (h: Uint8Array): Uint8Array => Uint8Array.of(0x58, h.length, ...h); + const cat = (...p: Uint8Array[]): Uint8Array => Uint8Array.from(p.flatMap((q) => [...q])); + const lists: [string, Uint8Array][] = [ + ['SIGNERS out of order', cat(Uint8Array.of(0x82), bstr(y), bstr(x))], + ['an empty SIGNERS', Uint8Array.of(0x80)], + ['SIGNERS of 17 entries', cat(Uint8Array.of(0x91), ...Array.from({ length: 17 }, () => bstr(x)))], + ['SIGNERS with 31 bytes', cat(Uint8Array.of(0x81), bstr(x.subarray(0, 31)))], + ['SIGNERS with one entry twice', cat(Uint8Array.of(0x82), bstr(x), bstr(x))], + ['SIGNERS of indefinite length', cat(Uint8Array.of(0x9f), bstr(x), Uint8Array.of(0xff))], + ['SIGNERS with a byte after them', cat(Uint8Array.of(0x81), bstr(x), Uint8Array.of(0))], + ]; + for (const [name, key1] of lists) { + const msg = authorMessage(context.controlCommit, context.headDigest, signersDigest(ALG_CMS, key1)); + const cms = await b.signature(msg, { token: (sig) => b.token(sig, signedAt, {}, tsa) }, ana, luis); + expect(evaluateSecurity(area(item(ALG_CMS, key1, cms), undefined), context), name).toEqual({ signature: 'F1', seal: 'S0' }); + } + expect(evaluateSecurity(area(item(ALG_CMS, signersOf(ana), te.encode('not DER')), undefined), context)).toEqual({ signature: 'F1', seal: 'S0' }); + }); +}); + +describe('the names of a certificate', () => { + // Spec v0.12 §29.7: a name of a certificate shows when it meets the rules of the declared author, has at most 64 code + // points and no two spaces in a row; otherwise the SHA-256 of the certificate shows, or that of the name of the issuer + // for the issuer. + it.each([ + ['a name', 'Ana López', true], + ['64 code points', 'ñ'.repeat(64), true], + ['65 code points', `${'ñ'.repeat(64)}a`, false], + ['64 code points outside the BMP, 128 units of UTF-16', '\u{1f600}'.repeat(64), true], + ['65 code points outside the BMP', '\u{1f600}'.repeat(65), false], + ['two spaces in a row', 'Ana López', false], + ['an escape', 'Ana\x1b[31mLópez', false], + ['U+202E', 'Ana \u{202e}zepóL', false], + ['a byte order mark', '\u{feff}Ana López', false], + ['a space at the start', ' Ana López', false], + ['a line feed', 'Ana\nLópez', false], + ['a zero width space', 'Ana\u{200b}López', false], + ['a tag that spells a text', 'Ana\u{e0041}', false], + ['an emoji with its selector', 'Ana \u{2764}\u{fe0f}', true], + ['a combining mark, 64 points', 'n\u{303}'.repeat(32), true], + ['a combining mark, 66 points', 'n\u{303}'.repeat(33), false], + ['an empty name', '', false], + ] as const)('%s', async (_name, cn, shown) => { + const s = b.newCert({ cn, ski: Uint8Array.of(1), issuer: b.name(b.atv(b.OID.commonName, b.utf8(cn))), from: certFrom, to: certTo }, ecKey); + const v = await signed(tsa, s); + expect(v.signature).toBe('F6'); + const want = shown ? [cn, cn] : [toHex(sha256(s.cert)), toHex(sha256(s.issuer))]; + expect([v.detail!.signers[0]!.holder, v.detail!.signers[0]!.issuer]).toEqual(want); + }); + + // The issuer is text of the certificate, as the holder is: one that breaks the rules of a name shows the SHA-256 of the + // DER of its Name, Go's sha256.Sum256(RawIssuer), and never that of the certificate. + it('shows the SHA-256 of the Name of an issuer that breaks the rules of a name', async () => { + const cn = (s: string): Uint8Array => b.rdnName(['2.5.4.3', b.utf8(s)], ['2.5.4.10', b.utf8('DateKeys test')]); const issuers: [string, Uint8Array, string][] = [ ['an issuer with ESC', cn('Ana\x1b[2J'), '53213e495daf7cc473c94da46283bae22d5d54b58681a0635cd22b96abde7c3f'], ['an issuer with U+202E', cn('Ana\u{202e}gpj.exe'), 'b1772664c1dbb3470b8d419f2275839241987889333ce17f223414a939634559'], @@ -94,59 +240,101 @@ describe('the issuer of a signer', () => { ['an issuer that starts with U+FEFF', b.rdnName(['2.5.4.3', b.tlv(0x0c, BOM, te.encode('Autoridad'))]), '2bcf35767b63b7b0370d61cf63620623adac5a09662763ebd331316d4d4c6097'], ]; for (const [name, issuer, hash] of issuers) { - const s = await b.newECDSA('Ana', 'P-256', from, to, 'cn', { issuer }); - const v = await signed(tsa, s); + const v = await signed(tsa, b.newCert({ cn: 'Ana', issuer, from: certFrom, to: certTo }, ecKey)); expect([v.signature, v.seal], name).toEqual(['F6', 'S0']); const line = v.detail!.signers[0]!; expect([line.holder, line.issuer, line.result], name).toEqual(['Ana', hash, 'valid']); expect(toHex(sha256(issuer)), name).toBe(hash); - expect(verdictLines(v)[1], name).toBe(` Ana (emisor según su certificado: ${hash}), sellado el 2026-09-30T12:00:00Z, antes de la fecha de apertura.`); + expect(verdictLines(v)[1], name).toBe(` «Ana» (emisor según su certificado: «${hash}»), sellado por «TSA de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.`); } - // An issuer that meets the rules shows its name. - const good = await signed(tsa, await b.newECDSA('Ana', 'P-256', from, to, 'cn', { issuer: cn('Autoridad de prueba') })); - expect(good.detail!.signers[0]!.issuer).toBe('Autoridad de prueba'); + // An issuer without a commonName shows its organizationName, which meets the rules. + const org = await signed(tsa, b.newCert({ cn: 'Ana', issuer: b.rdnName(['2.5.4.10', b.utf8('Banco de Pruebas S.A.')]), from: certFrom, to: certTo }, ecKey)); + expect(org.detail!.signers[0]!.issuer).toBe('Banco de Pruebas S.A.'); + }); + + // The holder of a certificate of the FNMT is its givenName and its surname: its commonName carries the NIF. + it('names the holder by givenName and surname before the commonName', async () => { + const subject = b.rdnName(['2.5.4.3', b.utf8('ESPAÑOL ESPAÑOL JUAN - 12345678Z')], ['2.5.4.42', b.utf8('JUAN')], ['2.5.4.4', b.utf8('ESPAÑOL ESPAÑOL')]); + const v = await signed(tsa, b.newCert({ subject, issuer: b.rdnName(['2.5.4.3', b.utf8('CA de prueba')]), from: certFrom, to: certTo }, ecKey)); + expect(verdictLines(v)[0]).toBe('Firmado con un certificado a nombre de «JUAN ESPAÑOL ESPAÑOL». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.'); }); }); describe('a byte order mark at the start of a name or a time', () => { // Go reads the bytes: the U+FEFF of a UTF8String stays, the rules of text refuse it, and the hash is shown; a time - // that starts with it does not parse, and the certificate breaks the profile. - it('keeps it in a name, which then shows the hash of the certificate, as Go', async () => { - const tsa = await b.newECDSA('TSA de prueba', 'P-256', from, to); - const subject = b.rdnName(['2.5.4.3', b.tlv(0x0c, BOM, te.encode('Ana'))]); - const s = await b.newECDSA('Ana', 'P-256', from, to, 'cn', { subject }); + // that starts with it does not parse, and the signature is not DER. + it('keeps it in a name, which then shows the hash of the certificate', async () => { + const s = b.newCert({ subject: b.rdnName(['2.5.4.3', b.tlv(0x0c, BOM, te.encode('Ana'))]), from: certFrom, to: certTo }, ecKey); const v = await signed(tsa, s); expect([v.signature, v.detail!.signers[0]!.holder]).toEqual(['F6', toHex(sha256(s.cert))]); - const authority = await b.newECDSA('TSA', 'P-256', from, to, 'cn', { subject: b.rdnName(['2.5.4.3', b.tlv(0x0c, BOM, te.encode('TSA'))]) }); + const authority = b.newCert({ subject: b.rdnName(['2.5.4.3', b.tlv(0x0c, BOM, te.encode('TSA'))]), from: certFrom, to: certTo }, tsaKey); const seal = await sealed(authority); expect([seal.seal, seal.detail!.sealHolder]).toEqual(['S4', toHex(sha256(authority.cert))]); }); - it('refuses a time of a certificate that starts with it: F1 for a signer, S2 for the authority of a seal, as Go', async () => { - const tsa = await b.newECDSA('TSA de prueba', 'P-256', from, to); - const utc = (s: Uint8Array): Uint8Array => b.tlv(0x17, s); - const validity = b.seq(utc(new Uint8Array([...BOM, ...te.encode('250101000000Z')])), utc(te.encode('300101000000Z'))); - const v = await signed(tsa, await b.newECDSA('Ana', 'P-256', from, to, 'cn', { validity })); + it('refuses a time of a certificate that starts with it: F1 for a signer, S2 for the authority of a seal', async () => { + const notBefore = b.tlv(0x17, BOM, te.encode('250101000000Z')); + const v = await signed(tsa, b.newCert({ cn: 'Ana', notBefore, to: certTo }, ecKey)); expect([v.signature, v.seal, v.detail]).toEqual(['F1', 'S0', undefined]); - const seal = await sealed(await b.newECDSA('TSA', 'P-256', from, to, 'cn', { validity })); + const seal = await sealed(b.newCert({ cn: 'TSA', notBefore, to: certTo }, tsaKey)); expect([seal.signature, seal.seal]).toEqual(['F0', 'S2']); }); }); describe('an ECDSA key with its point compressed', () => { - // Go's x509.ParsePKIXPublicKey reads only the uncompressed point, 0x04 and the two coordinates: a key written - // otherwise is outside the table, though noble would read it. - it.each(['P-256', 'P-384', 'P-521'] as const)('is outside the table on %s: F5 for a signer, S1 for the authority of a seal, as Go', async (curve) => { - const tsa = await b.newECDSA('TSA de prueba', 'P-256', from, to); - const compressed = await b.newECDSA('Ana', curve, from, to, 'cn', { compressed: true }); + // Go's ecdsa.ParseUncompressedPublicKey reads only the uncompressed point, 0x04 and the two coordinates: a key + // written otherwise is outside the table, though noble would read it. + it.each(['P-256', 'P-384', 'P-521'] as const)('is outside the table on %s: F5 for a signer, S1 for the authority of a seal', async (curve) => { + const key = await b.newKey(curve); + const curveOID = curve === 'P-256' ? b.OID.p256 : curve === 'P-384' ? b.OID.p384 : b.OID.p521; + const spki = b.spkiEC(b.oid(curveOID), b.compressed(key)); + const compressed = b.newCert({ cn: 'Ana', spki, from: certFrom, to: certTo }, key); const v = await signed(tsa, compressed); expect([v.signature, v.detail!.signers[0]!.result]).toEqual(['F5', 'not verifiable']); - const plain = await b.newECDSA('Ana', curve, from, to); + const plain = b.newCert({ cn: 'Ana', from: certFrom, to: certTo }, key); expect((await signed(tsa, plain)).signature).toBe('F6'); - const authority = await b.newECDSA('TSA', curve, from, to, 'cn', { compressed: true }); + const authority = b.newCert({ cn: 'TSA', spki, from: certFrom, to: certTo }, key); expect((await sealed(authority)).seal).toBe('S1'); const late = await signed(authority, plain); expect([late.signature, late.detail!.signers[0]!.result]).toEqual(['F5', 'invalid seal']); - expect((await sealed(await b.newECDSA('TSA', curve, from, to))).seal).toBe('S4'); + expect((await sealed(b.newCert({ cn: 'TSA', from: certFrom, to: certTo }, key))).seal).toBe('S4'); + }); +}); + +describe('a seal of seal_type 2', () => { + // Spec v0.11 §29.11: a seal of seal_type 2 seals SEAL_SUBJECT, and gives S4 before the round time, S5 after it, and + // S3, S2 and S1 for what does not verify, does not decode or uses another hash. + it('seals SEAL_SUBJECT, and gives S1 to S5', async () => { + const authority = b.newCert({ cn: 'Autoridad de Sellado', from: certFrom, to: certTo }, tsaKey); + const seed = new Uint8Array(32).fill(7); + const msg = authorMessage(context.controlCommit, context.headDigest, signersDigest(ALG_ED25519)); + const sig = item(ALG_ED25519, ed25519.getPublicKey(seed), ed25519.sign(msg, seed)); + const subject = sealSubject(context.controlCommit, context.headDigest, sig); + const withSeal = (token: Uint8Array): Uint8Array => area(sig, item(2, token)); + const v = evaluateSecurity(withSeal(await b.token(subject, signedAt, {}, authority)), context); + expect([v.signature, v.seal, v.detail!.sealHolder, v.detail!.sealTime]).toEqual(['F4', 'S4', 'Autoridad de Sellado', at(signedAt)]); + expect(verdictLines(v)[1]).toBe('Según un sello a nombre de «Autoridad de Sellado», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.'); + // Sealed with its own signature part: without key 2 the subject differs. + const alone = await sealed(authority); + expect([alone.signature, alone.seal]).toEqual(['F0', 'S4']); + const cases: [string, Promise | Uint8Array, string][] = [ + ['after the round time', b.token(subject, new Date(roundTime.getTime() + 60_000), {}, authority), 'S5'], + ['the accuracy reaches it', b.token(subject, new Date(roundTime.getTime() - 1000), { accuracy: b.accuracyOf(2) }, authority), 'S5'], + ['another subject', b.token(te.encode('other'), signedAt, {}, authority), 'S3'], + ['an imprint of 33 bytes', b.token(subject, signedAt, { imprint: new Uint8Array(33) }, authority), 'S3'], + ['a TSTInfo of version 2', b.token(subject, signedAt, { version: 2 }, authority), 'S2'], + ['not DER', te.encode('not DER'), 'S2'], + ['SHA-384 in the imprint', b.token(subject, signedAt, { hash: 'SHA-384' }, authority), 'S1'], + ['the TSA expired at its time', b.token(subject, new Date(Date.UTC(2033, 0, 1)), {}, authority), 'S3'], + ]; + for (const [name, token, want] of cases) expect(evaluateSecurity(withSeal(await token), context).seal, name).toBe(want); + // A seal at the edge of the round time, a microsecond before it with its accuracy of 999 ms and 999 µs, proves it. + const edge = evaluateSecurity(withSeal(await b.token(subject, new Date(roundTime.getTime() - 1000), { accuracy: b.accuracyOf(0, 999, 999) }, authority)), context); + expect([edge.seal, verdictLines(edge)[1]]).toEqual([ + 'S4', + 'Según un sello a nombre de «Autoridad de Sellado», existía el 2029-12-31T23:59:59Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello.', + ]); + // Without a context, as a reader of v0.10: S1. + expect(evaluateSecurity(withSeal(await b.token(subject, signedAt, {}, authority))).seal).toBe('S1'); }); }); diff --git a/src/lib/dkc/securitycms.ts b/src/lib/dkc/securitycms.ts index 5cfcd02..a7c293e 100644 --- a/src/lib/dkc/securitycms.ts +++ b/src/lib/dkc/securitycms.ts @@ -1,11 +1,11 @@ // The verdicts of a signature of alg 2 (CMS with certificates) and of a seal of // seal_type 2 (RFC 3161), as the Go package capsule gives them (signature2.go, -// spec v0.11 §29.7, §29.10, §29.11): F1, F2, F5 and F6 with the signers named, +// spec v0.12 §29.7, §29.10, §29.11): F1, F2, F5 and F6 with the signers named, // and S1 to S5 with the authority of a valid seal. Internal: index.ts does not // re-export it. import { ALG_CMS, authorMessage, sealSubject, signersDigest } from './author.ts'; -import { equalBytes, toHex, utf8Length } from './bytes.ts'; +import { compareBytes, equalBytes, toHex } from './bytes.ts'; import { type Decoder, Encoder, unmarshal } from './cbor.ts'; import { addInstants, @@ -20,6 +20,7 @@ import { parseSignature, parseToken, type SignerInfo, + type Token, tokenImprintIsSHA256, } from './cms.ts'; import { compareInstants, type Instant } from './datekey.ts'; @@ -28,17 +29,20 @@ import { checkAuthor } from './pathrule.ts'; /** The most required signers of an alg 2 signature (spec §29.10). */ export const MAX_SIGNERS = 16; -const MAX_AUTHOR_LEN = 256; + +/** The most code points of a name of a certificate that §29.7 shows, the upper bound of a commonName in X.520. */ +export const MAX_NAME_LEN = 64; /** A signer of an alg 2 signature as a reader shows it (spec §29.7, §29.10). */ export interface SignerLine { - /** The name of the certificate as §29.7 shows it, or the SHA-256 of the certificate in hexadecimal when it does not meet the rules of the declared author. */ + /** The name of the certificate as §29.7 shows it, or the SHA-256 of the certificate in hexadecimal when it does not meet the rules of a name of a certificate. */ readonly holder: string; - /** The issuer that the certificate says, with the same rules, and the SHA-256 of the DER of its Name when it does not meet them. */ + /** The issuer that the certificate says, with the same rules, and the SHA-256 of the DER of its Name when it does not meet them; '' for an absent signer. */ readonly issuer: string; /** 'valid', 'invalid', 'absent', 'not verifiable', 'without seal', 'invalid seal' or 'out of validity'. */ readonly result: string; - /** t, undefined without a seal that verifies. */ + /** The holder of the certificate of the authority of its seal, with the same rules, and t; undefined without a seal that verifies. */ + readonly sealHolder?: string; readonly sealTime?: Instant; /** Whether t plus the accuracy of the seal is before round_time. */ readonly before: boolean; @@ -63,7 +67,7 @@ function decodeSigners(b: Uint8Array): Uint8Array[] { for (let i = 0; i < n; i++) { const h = d.bstr(32, 32); const last = out[out.length - 1]; - if (last !== undefined && compare(last, h) >= 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'SIGNERS is not in strictly ascending order'); + if (last !== undefined && compareBytes(last, h) >= 0) throw new DateKeysError('ERR_NON_CANONICAL_CBOR', 'SIGNERS is not in strictly ascending order'); out.push(h); } }; @@ -75,45 +79,57 @@ function decodeSigners(b: Uint8Array): Uint8Array[] { return out; } -function compare(a: Uint8Array, b: Uint8Array): number { - for (let i = 0; i < Math.min(a.length, b.length); i++) if (a[i] !== b[i]) return a[i]! < b[i]! ? -1 : 1; - return a.length - b.length; +// The number of code points of a well-formed string. +function codePointCount(s: string): number { + let n = 0; + for (let i = 0; i < s.length; i++) { + const c = s.charCodeAt(i); + if (c < 0xd800 || c > 0xdbff) n++; + } + return n; } -// How §29.7 shows a name: the name, when it meets the rules of the declared author, and the SHA-256 otherwise. +/** + * How §29.7 shows a name of a certificate: the name, when it meets the rules of + * the declared author, has at most MAX_NAME_LEN code points and no two spaces + * in a row, and the SHA-256 given otherwise. A name cannot then line up, with + * spaces, a text of its own where a terminal breaks the line. + */ function holderText(name: string, hash: Uint8Array): string { - if (name !== '' && utf8Length(name) <= MAX_AUTHOR_LEN) { + if (name !== '' && name.isWellFormed() && codePointCount(name) <= MAX_NAME_LEN && !name.includes(' ')) { try { checkAuthor(name); return name; } catch (err) { /* v8 ignore next -- @preserve: checkAuthor throws only its own error */ - if (!(err instanceof DateKeysError || err instanceof Error)) throw err; + if (!(err instanceof Error)) throw err; } } return toHex(hash); } +// The time of a seal, plus its accuracy, against round_time: whether it precedes it. +function before(tok: Token, roundTime: Instant | undefined): boolean { + return roundTime !== undefined && compareInstants(addInstants(tok.genTime, tok.accuracy), roundTime) < 0; +} + // One SignerInfo as §29.10 orders: not verifiable, invalid, without seal, with an invalid seal, out of validity, or valid. -// The issuer is text of the certificate, as the holder is: an issuer that breaks the rules shows the SHA-256 of its Name, -// so that no escape, no control and no bidirectional character reaches a line of the verdicts. +// The issuer is text of the certificate, as the holder is: it gets the same rules, and the SHA-256 of its Name when it +// fails them, so that no escape, no control and no bidirectional character reaches a line of the verdicts. function signerLine(s: SignerInfo, msg: Uint8Array, roundTime: Instant | undefined): SignerLine { - const base = { holder: holderText(certHolder(s.cert), s.cert.hash), issuer: holderText(certIssuerName(s.cert), certIssuerHash(s.cert)) }; + const base = { holder: holderText(certHolder(s.cert), s.cert.hash), issuer: holderText(certIssuerName(s.cert), certIssuerHash(s.cert)), before: false }; const r = checkSigner(s, msg); - if (r === 'not verifiable') return { ...base, result: 'not verifiable', before: false }; - if (r === 'invalid') return { ...base, result: 'invalid', before: false }; - if (s.token === undefined) return { ...base, result: 'without seal', before: false }; - let ok = false; - let tok; + if (r !== 'valid') return { ...base, result: r }; + if (s.token === undefined) return { ...base, result: 'without seal' }; + let tok: Token | undefined; try { tok = parseToken(s.token); - ok = checkToken(tok, s.signature); } catch (err) { if (!(err instanceof CmsFormError || err instanceof CmsAlgorithmError)) throw err; } - if (!ok || tok === undefined) return { ...base, result: 'invalid seal', before: false }; - if (!certValidAt(s.cert, tok.genTime)) return { ...base, result: 'out of validity', before: false }; - return { ...base, result: 'valid', sealTime: tok.genTime, before: roundTime !== undefined && compareInstants(addInstants(tok.genTime, tok.accuracy), roundTime) < 0 }; + if (tok === undefined || !checkToken(tok, s.signature)) return { ...base, result: 'invalid seal' }; + if (!certValidAt(s.cert, tok.genTime)) return { ...base, result: 'out of validity' }; + return { ...base, result: 'valid', sealHolder: holderText(certHolder(tok.tsa), tok.tsa.hash), sealTime: tok.genTime, before: before(tok, roundTime) }; } /** @@ -184,7 +200,5 @@ export function evaluateSeal( } if (!tokenImprintIsSHA256(tok)) return { seal: 'S1' }; if (!checkToken(tok, sealSubject(controlCommit, headDigest, signature))) return { seal: 'S3' }; - const sealHolder = holderText(certHolder(tok.tsa), tok.tsa.hash); - const before = roundTime !== undefined && compareInstants(addInstants(tok.genTime, tok.accuracy), roundTime) < 0; - return { seal: before ? 'S4' : 'S5', sealHolder, sealTime: tok.genTime }; + return { seal: before(tok, roundTime) ? 'S4' : 'S5', sealHolder: holderText(certHolder(tok.tsa), tok.tsa.hash), sealTime: tok.genTime }; } diff --git a/src/lib/dkc/testing/cmsbuild.ts b/src/lib/dkc/testing/cmsbuild.ts index 5c3e0a2..ccbea9e 100644 --- a/src/lib/dkc/testing/cmsbuild.ts +++ b/src/lib/dkc/testing/cmsbuild.ts @@ -1,7 +1,9 @@ // Builds the CMS signatures and the RFC 3161 tokens that the tests of cms.ts and -// of the verdicts read: certificates of test keys, a detached signature of a -// message with its signedAttrs and, optionally, a time-stamp token of its -// signature. It is the encoder that a signing application has, the TypeScript +// of the verdicts read: certificates of test keys, made field by field, a +// detached signature of a message with its signedAttrs and, optionally, a +// time-stamp token of its signature, with options to write what the profiles +// of spec v0.12 §29.10 and §29.11 reject, or what verifies to something else. +// It is the encoder that a signing application has, the TypeScript // counterpart of internal/cms/cmstest of the Go reference; nothing outside // tests uses it. Keys and signatures come from WebCrypto, and the DER is built // here. The certificates are not signed by anyone: cms.ts never checks who @@ -12,6 +14,7 @@ import { derContent, splitDer } from '../der.ts'; // WebCrypto takes a BufferSource over an ArrayBuffer, which a Uint8Array view does not promise. const bs = (b: Uint8Array): ArrayBuffer => b.slice().buffer as ArrayBuffer; +const te = new TextEncoder(); // ---- DER --------------------------------------------------------------------- @@ -25,7 +28,28 @@ export const seq = (...c: Uint8Array[]): Uint8Array => tlv(0x30, ...c); /** A SET OF (or an implicit [n] SET OF) in DER order. */ export const set = (tag: number, ...elems: Uint8Array[]): Uint8Array => tlv(tag, ...[...elems].sort(compareBytes)); export const octets = (b: Uint8Array): Uint8Array => tlv(0x04, b); -export const utf8 = (s: string): Uint8Array => tlv(0x0c, new TextEncoder().encode(s)); +export const NULL = Uint8Array.of(5, 0); +export const bool = (v: boolean): Uint8Array => Uint8Array.of(1, 1, v ? 0xff : 0); +export const bitString = (b: Uint8Array): Uint8Array => tlv(0x03, Uint8Array.of(0), b); +export const utcTime = (s: string): Uint8Array => tlv(0x17, te.encode(s)); +export const generalizedTime = (s: string): Uint8Array => tlv(0x18, te.encode(s)); + +// The string types of a name, with the bytes as given: those that break their type too. +export const utf8 = (s: string | Uint8Array): Uint8Array => tlv(0x0c, typeof s === 'string' ? te.encode(s) : s); +export const printable = (s: string | Uint8Array): Uint8Array => tlv(0x13, typeof s === 'string' ? latin1(s) : s); +export const teletex = (s: string | Uint8Array): Uint8Array => tlv(0x14, typeof s === 'string' ? latin1(s) : s); +export const ia5 = (s: string | Uint8Array): Uint8Array => tlv(0x16, typeof s === 'string' ? latin1(s) : s); +export const visible = (s: string): Uint8Array => tlv(0x1a, latin1(s)); +export const numeric = (s: string): Uint8Array => tlv(0x12, latin1(s)); +export const bmp = (b: Uint8Array): Uint8Array => tlv(0x1e, b); +/** The BMPString of s in UTF-16BE: a code point outside the BMP becomes a surrogate pair. */ +export function bmpText(s: string): Uint8Array { + const out: number[] = []; + for (let i = 0; i < s.length; i++) out.push(s.charCodeAt(i) >> 8, s.charCodeAt(i) & 255); + return bmp(Uint8Array.from(out)); +} +// One byte per UTF-16 code unit, which must be under 0x100: the bytes of a test of PrintableString and its kin. +const latin1 = (s: string): Uint8Array => Uint8Array.from(s, (c) => c.charCodeAt(0)); export function oid(s: string): Uint8Array { const parts = s.split('.').map(BigInt); @@ -55,14 +79,99 @@ export function int(n: bigint | number): Uint8Array { return tlv(0x02, Uint8Array.from(bytes)); } -const hex = (s: string): Uint8Array => Uint8Array.from(s.match(/../g) ?? [], (b) => parseInt(b, 16)); -const NULL = Uint8Array.of(5, 0); +/** An INTEGER with the content given, minimal or not. */ +export const intBytes = (c: Uint8Array): Uint8Array => tlv(0x02, c); + +/** The unsigned big-endian bytes of the INTEGER n, as Go's big.Int.Bytes. */ +export function bigBytes(n: bigint): Uint8Array { + const h = n.toString(16); + return Uint8Array.from((h.length % 2 === 0 ? h : `0${h}`).match(/../g)!, (x) => parseInt(x, 16)); +} + +/** An AlgorithmIdentifier. */ +export const algID = (o: string, ...params: Uint8Array[]): Uint8Array => seq(oid(o), ...params); + +/** An Attribute of the type with the values, in DER order. */ +export const attr = (o: string, ...values: Uint8Array[]): Uint8Array => seq(oid(o), set(0x31, ...values)); + +export const hex = (s: string): Uint8Array => Uint8Array.from(s.match(/../g) ?? [], (b) => parseInt(b, 16)); + +/** The children of the constructed element b. */ +export const children = (b: Uint8Array): Uint8Array[] => splitDer(b).children; + +/** The element at path in b: the index of a child at each level. */ +export function at(b: Uint8Array, ...path: number[]): Uint8Array { + for (const i of path) b = children(b)[i]!; + return b; +} + +/** + * b with the element at path replaced by what f returns for it, and the + * lengths of its ancestors written again: undefined removes the element. + */ +export function edit(b: Uint8Array, f: (old: Uint8Array) => Uint8Array | undefined, ...path: number[]): Uint8Array { + if (path.length === 0) return f(b) ?? new Uint8Array(0); + const kids = children(b); + kids[path[0]!] = edit(kids[path[0]!]!, f, ...path.slice(1)); + return tlv(b[0]!, ...kids); +} + +/** An edit that changes the identifier octet of an element. */ +export const retag = + (tag: number) => + (b: Uint8Array): Uint8Array => + concatBytes(Uint8Array.of(tag), b.subarray(1)); + +/** An edit that adds elements at the end of the children of a constructed element. */ +export const append = + (...elems: Uint8Array[]) => + (b: Uint8Array): Uint8Array => + tlv(b[0]!, ...children(b), ...elems); + +/** The constructed element b with an indefinite length: BER, which DER forbids (X.690 10.1). */ +export const indefinite = (b: Uint8Array): Uint8Array => concatBytes(Uint8Array.of(b[0]!, 0x80), derContent(b), Uint8Array.of(0, 0)); + +/** + * The signature or the token that joins the signatures sigs of one content, as + * a signing application adds a SignerInfo: the digest algorithms and the + * certificates of all, each once, and their SignerInfo, each in DER order. + */ +export function merge(...sigs: Uint8Array[]): Uint8Array { + const algs: Uint8Array[] = []; + const certs: Uint8Array[] = []; + const infos: Uint8Array[] = []; + let version: Uint8Array = new Uint8Array(0); + let content: Uint8Array = new Uint8Array(0); + for (const s of sigs) { + const f = children(at(s, ...SIGNED_DATA)); + version = f[0]!; + content = f[2]!; + algs.push(...children(f[1]!)); + for (const x of f.slice(3)) { + if (x[0] === 0xa0) certs.push(...children(x)); + if (x[0] === 0x31) infos.push(...children(x)); + } + } + const once = (e: Uint8Array[]): Uint8Array[] => e.sort(compareBytes).filter((x, i) => i === 0 || compareBytes(e[i - 1]!, x) !== 0); + const fields = [version, tlv(0x31, ...once(algs)), content, ...(certs.length > 0 ? [tlv(0xa0, ...once(certs))] : []), set(0x31, ...infos)]; + return seq(oid(OID.signedData), tlv(0xa0, seq(...fields))); +} + +/** The Accuracy of RFC 3161 with its seconds, millis and micros, each only when it is not zero. */ +export function accuracyOf(seconds: number, millis = 0, micros = 0): Uint8Array { + const small = (n: number): Uint8Array => derContent(int(n)); + return seq(...(seconds !== 0 ? [int(seconds)] : []), ...(millis !== 0 ? [tlv(0x80, small(millis))] : []), ...(micros !== 0 ? [tlv(0x81, small(micros))] : [])); +} + +/** The path of the SignedData in a signature or a token. */ +export const SIGNED_DATA = [1, 0] as const; export const OID = { data: '1.2.840.113549.1.7.1', signedData: '1.2.840.113549.1.7.2', contentType: '1.2.840.113549.1.9.3', messageDigest: '1.2.840.113549.1.9.4', + signingTime: '1.2.840.113549.1.9.5', sigCertV1: '1.2.840.113549.1.9.16.2.12', sigCertV2: '1.2.840.113549.1.9.16.2.47', timeStamp: '1.2.840.113549.1.9.16.2.14', @@ -71,6 +180,23 @@ export const OID = { rsa: '1.2.840.113549.1.1.1', pss: '1.2.840.113549.1.1.10', mgf1: '1.2.840.113549.1.1.8', + sha256RSA: '1.2.840.113549.1.1.11', + sha384RSA: '1.2.840.113549.1.1.12', + sha512RSA: '1.2.840.113549.1.1.13', + ecPublicKey: '1.2.840.10045.2.1', + p256: '1.2.840.10045.3.1.7', + p384: '1.3.132.0.34', + p521: '1.3.132.0.35', + brainpoolP256: '1.3.36.3.3.2.8.1.1.7', + sha1: '1.3.14.3.2.26', + commonName: '2.5.4.3', + surname: '2.5.4.4', + serialNumber: '2.5.4.5', + country: '2.5.4.6', + organization: '2.5.4.10', + givenName: '2.5.4.42', + ski: '2.5.29.14', + keyUsage: '2.5.29.15', ecdsa: { 'SHA-256': '1.2.840.10045.4.3.2', 'SHA-384': '1.2.840.10045.4.3.3', 'SHA-512': '1.2.840.10045.4.3.4' }, sha: { 'SHA-256': '2.16.840.1.101.3.4.2.1', 'SHA-384': '2.16.840.1.101.3.4.2.2', 'SHA-512': '2.16.840.1.101.3.4.2.3' }, } as const; @@ -78,87 +204,187 @@ export const OID = { export type HashName = 'SHA-256' | 'SHA-384' | 'SHA-512'; const HASH_SIZE: Record = { 'SHA-256': 32, 'SHA-384': 48, 'SHA-512': 64 }; export const digest = async (h: HashName | 'SHA-1', b: Uint8Array): Promise => new Uint8Array(await crypto.subtle.digest(h, bs(b))); -const hashAlg = (h: HashName): Uint8Array => seq(oid(OID.sha[h])); +/** The AlgorithmIdentifier of a hash, without parameters. */ +export const hashAlg = (h: HashName | 'SHA-1'): Uint8Array => seq(oid(h === 'SHA-1' ? OID.sha1 : OID.sha[h])); -// ---- signers: a certificate with its private key ------------------------------ +/** An attribute whose type has an arc of 2^31: an identifier that the profile does not name, and decides nothing. */ +export const bigArcAttr = (): Uint8Array => seq(tlv(0x06, hex('2a864886f70d01098880808000')), set(0x31, NULL)); -export interface Signer { - /** The DER of the certificate, its subjectKeyIdentifier, and what a SignerInfo needs of it. */ - readonly cert: Uint8Array; - readonly ski: Uint8Array; - readonly issuer: Uint8Array; - readonly serial: bigint; - /** The private key as PKCS #8, and its kind. */ +// ---- keys -------------------------------------------------------------------- + +/** A key pair: the private key as PKCS #8, the SubjectPublicKeyInfo of crypto/x509, and its kind. */ +export interface Key { readonly pkcs8: Uint8Array; + readonly spki: Uint8Array; readonly kind: 'rsa' | 'P-256' | 'P-384' | 'P-521'; } -/** How the certificate names itself: by commonName, by givenName and surname, or with neither. */ -export type NameKind = 'cn' | 'given-surname' | 'organization'; +/** A new RSA key of `bits` bits, or ECDSA key on a NIST curve. */ +export async function newKey(kind: Key['kind'], bits = 2048): Promise { + const algorithm = kind === 'rsa' ? { name: 'RSASSA-PKCS1-v1_5', modulusLength: bits, publicExponent: Uint8Array.of(1, 0, 1), hash: 'SHA-256' } : { name: 'ECDSA', namedCurve: kind }; + const pair = (await crypto.subtle.generateKey(algorithm, true, ['sign', 'verify'])) as CryptoKeyPair; + const spki = new Uint8Array(await crypto.subtle.exportKey('spki', pair.publicKey)); + const pkcs8 = new Uint8Array(await crypto.subtle.exportKey('pkcs8', pair.privateKey)); + return { pkcs8, spki, kind }; +} + +/** The point of an EC key, uncompressed: 0x04 and the two coordinates. */ +export const uncompressed = (k: Key): Uint8Array => derContent(children(k.spki)[1]!).subarray(1); -function name(cn: string, kind: NameKind = 'cn'): Uint8Array { - const org = set(0x31, seq(oid('2.5.4.10'), utf8('DateKeys test'))); - if (kind === 'given-surname') return seq(set(0x31, seq(oid('2.5.4.42'), utf8(cn.split(' ')[0]!))), set(0x31, seq(oid('2.5.4.4'), utf8(cn.split(' ')[1] ?? 'X'))), org); - if (kind === 'organization') return seq(org); - return seq(set(0x31, seq(oid('2.5.4.3'), utf8(cn))), org); +/** The point of an EC key, compressed (SEC 1 2.3.3). */ +export function compressed(k: Key): Uint8Array { + const point = uncompressed(k); + const n = (point.length - 1) / 2; + return concatBytes(Uint8Array.of(2 | (point[point.length - 1]! & 1)), point.subarray(1, 1 + n)); +} + +/** The modulus and the exponent of an RSA key. */ +export function rsaPublic(k: Key): { n: bigint; e: bigint } { + const [n, e] = children(derContent(children(k.spki)[1]!).subarray(1)).map((x) => BigInt(`0x0${[...derContent(x)].map((b) => b.toString(16).padStart(2, '0')).join('')}`)); + return { n: n!, e: e! }; +} + +/** The SubjectPublicKeyInfo of id-ecPublicKey with the parameters and the point given. */ +export const spkiEC = (params: Uint8Array, point: Uint8Array): Uint8Array => seq(algID(OID.ecPublicKey, params), bitString(point)); + +/** The SubjectPublicKeyInfo of rsaEncryption with NULL parameters and the modulus and exponent given. */ +export const spkiRSA = (n: bigint, e: bigint): Uint8Array => seq(algID(OID.rsa, NULL), bitString(seq(int(n), int(e)))); + +// ---- certificates ------------------------------------------------------------ + +/** Signer is a certificate with the private key of its subject. */ +export interface Signer { + /** The DER of the certificate, and what a sid names: the DER of its issuer and of its serialNumber, and its keyIdentifier. */ + readonly cert: Uint8Array; + readonly issuer: Uint8Array; + readonly serial: Uint8Array; + readonly ski: Uint8Array; + readonly key: Key; } +/** An AttributeTypeAndValue. */ +export const atv = (type: string, value: Uint8Array): Uint8Array => seq(oid(type), value); +/** A RelativeDistinguishedName of several attributes, in the order given, for nameOf. */ +export const rdn = (...atvs: Uint8Array[]): Uint8Array => tlv(0x31, ...atvs); +/** A Name of the RelativeDistinguishedName elements given. */ +export const nameOf = (...rdns: Uint8Array[]): Uint8Array => seq(...rdns); +/** A Name with one RelativeDistinguishedName for each attribute, in the order given. */ +export const name = (...atvs: Uint8Array[]): Uint8Array => nameOf(...atvs.map((a) => rdn(a))); + /** A Name of one attribute per RDN, each given as its type and the DER of its value. */ export function rdnName(...attributes: [type: string, value: Uint8Array][]): Uint8Array { - return seq(...attributes.map(([type, value]) => set(0x31, seq(oid(type), value)))); + return name(...attributes.map(([type, value]) => atv(type, value))); } -/** What a test changes in a certificate: the DER of its subject, of its issuer and of its Validity, and the point of an ECDSA key, compressed. */ -export interface CertOptions { - readonly subject?: Uint8Array; +/** An Extension, with critical only when it is true, as DER writes it. */ +export const extension = (o: string, critical: boolean, value: Uint8Array): Uint8Array => seq(oid(o), ...(critical ? [bool(true)] : []), octets(value)); +/** The extension subjectKeyIdentifier with the keyIdentifier given. */ +export const extSKI = (id: Uint8Array): Uint8Array => extension(OID.ski, false, octets(id)); +/** The extension keyUsage with digitalSignature. */ +export const extKeyUsage = (): Uint8Array => extension(OID.keyUsage, true, Uint8Array.of(0x03, 0x02, 0x07, 0x80)); + +/** + * A certificate written field by field, as Go's cmstest.CertSpec: each field + * holds the DER of its element as it goes in the certificate, and an absent + * one takes the default of a certificate of version 3 of the key. + */ +export interface CertSpec { + /** The commonName of the subject, in a UTF8String, when there is no subject. */ + readonly cn?: string; + /** The validity, 2020-01-01 to 2040-01-01 by default, as RFC 5280 writes it when notBefore and notAfter are absent. */ + readonly from?: Date; + readonly to?: Date; + /** The field [0] of the version, INTEGER 2 by default; null leaves it out, as a certificate of version 1. */ + readonly version?: Uint8Array | null; + readonly serial?: Uint8Array; + readonly sigAlg?: Uint8Array; + /** The names; the issuer is the subject by default, as in a self-signed certificate. */ readonly issuer?: Uint8Array; - readonly validity?: Uint8Array; - readonly compressed?: boolean; + readonly subject?: Uint8Array; + readonly notBefore?: Uint8Array; + readonly notAfter?: Uint8Array; + readonly spki?: Uint8Array; + /** [1] issuerUniqueID and [2] subjectUniqueID, written after the SPKI. */ + readonly uniqueIDs?: Uint8Array[]; + /** The keyIdentifier of the default subjectKeyIdentifier, the commonName by default. */ + readonly ski?: Uint8Array; + /** The Extension elements of [3], subjectKeyIdentifier and keyUsage by default; null writes no [3]. */ + readonly extensions?: Uint8Array[] | null; + /** Elements written at the end of tbsCertificate. */ + readonly after?: Uint8Array[]; + /** The BIT STRING of the signature, which nobody checks. */ + readonly signature?: Uint8Array; } -function utcTime(t: Date): Uint8Array { +/** A time of validity as RFC 5280 4.1.2.5 writes it: UTCTime until 2049 and GeneralizedTime from 2050. */ +export function certTime(t: Date): Uint8Array { const p = (n: number, w = 2): string => String(n).padStart(w, '0'); const y = t.getUTCFullYear(); const body = `${p(t.getUTCMonth() + 1)}${p(t.getUTCDate())}${p(t.getUTCHours())}${p(t.getUTCMinutes())}${p(t.getUTCSeconds())}Z`; - return y < 2050 ? tlv(0x17, new TextEncoder().encode(`${p(y % 100)}${body}`)) : tlv(0x18, new TextEncoder().encode(`${p(y, 4)}${body}`)); + return y < 2050 ? utcTime(`${p(y % 100)}${body}`) : generalizedTime(`${p(y, 4)}${body}`); } -// The SubjectPublicKeyInfo of an ECDSA key with its point 04 || x || y written compressed, 02 or 03 || x. -function compressPoint(spki: Uint8Array): Uint8Array { - const [alg, key] = splitDer(spki).children; - const point = derContent(key!).subarray(1); - const x = point.subarray(1, 1 + (point.length - 1) / 2); - return seq(alg!, tlv(0x03, Uint8Array.of(0, 2 + (point[point.length - 1]! & 1)), x)); +let serials = 0x1000; + +/** The signer of key whose certificate spec describes. */ +export function newCert(spec: CertSpec, key: Key): Signer { + const subject = spec.subject ?? name(atv(OID.commonName, utf8(spec.cn ?? 'DateKeys test'))); + const issuer = spec.issuer ?? subject; + const serial = spec.serial ?? int(serials++); + const sigAlg = spec.sigAlg ?? seq(oid(key.kind === 'rsa' ? OID.sha256RSA : OID.ecdsa['SHA-256'])); + const ski = spec.ski ?? te.encode(spec.cn ?? 'DateKeys test'); + const validity = seq(spec.notBefore ?? certTime(spec.from ?? new Date(Date.UTC(2020, 0, 1))), spec.notAfter ?? certTime(spec.to ?? new Date(Date.UTC(2040, 0, 1)))); + const tbs: Uint8Array[] = []; + if (spec.version !== null) tbs.push(spec.version ?? tlv(0xa0, int(2))); + tbs.push(serial, sigAlg, issuer, validity, subject, spec.spki ?? key.spki, ...(spec.uniqueIDs ?? [])); + if (spec.extensions !== null) tbs.push(tlv(0xa3, seq(...(spec.extensions ?? [extSKI(ski), extKeyUsage()])))); + tbs.push(...(spec.after ?? [])); + const cert = seq(seq(...tbs), sigAlg, spec.signature ?? bitString(Uint8Array.of(1, 2, 3, 4, 5, 6, 7))); + return { cert, issuer, serial, ski, key }; } -async function signerOf(kind: Signer['kind'], bits: number, cn: string, notBefore: Date, notAfter: Date, nameKind: NameKind = 'cn', o: CertOptions = {}): Promise { - const algorithm = kind === 'rsa' ? { name: 'RSASSA-PKCS1-v1_5', modulusLength: bits, publicExponent: Uint8Array.of(1, 0, 1), hash: 'SHA-256' } : { name: 'ECDSA', namedCurve: kind }; - const pair = (await crypto.subtle.generateKey(algorithm, true, ['sign', 'verify'])) as CryptoKeyPair; - const exported = new Uint8Array(await crypto.subtle.exportKey('spki', pair.publicKey)); - const spki = o.compressed === true ? compressPoint(exported) : exported; - const pkcs8 = new Uint8Array(await crypto.subtle.exportKey('pkcs8', pair.privateKey)); - const ski = new TextEncoder().encode(cn); - const issuer = o.issuer ?? name(cn, nameKind); - const serial = BigInt(Math.floor(Math.random() * 2 ** 40) + 1); - const tbs = seq( - tlv(0xa0, int(2)), - int(serial), - seq(oid(OID.ecdsa['SHA-256'])), - issuer, - o.validity ?? seq(utcTime(notBefore), utcTime(notAfter)), - o.subject ?? name(cn, nameKind), - spki, - tlv(0xa3, seq(seq(oid('2.5.29.14'), octets(octets(ski))))), +/** What a test changes in a certificate made by newRSA or newECDSA. */ +export interface CertOptions { + readonly subject?: Uint8Array; + readonly issuer?: Uint8Array; + readonly validity?: Uint8Array; + /** The point of an ECDSA key, compressed. */ + readonly compressed?: boolean; +} + +/** How a certificate of newRSA or newECDSA names itself: by commonName, by givenName and surname, or with neither. */ +export type NameKind = 'cn' | 'given-surname' | 'organization'; + +function nameOfKind(cn: string, kind: NameKind): Uint8Array { + const org = atv(OID.organization, utf8('DateKeys test')); + if (kind === 'given-surname') return name(atv(OID.givenName, utf8(cn.split(' ')[0]!)), atv(OID.surname, utf8(cn.split(' ')[1] ?? 'X')), org); + if (kind === 'organization') return name(org); + return name(atv(OID.commonName, utf8(cn)), org); +} + +async function signerOf(kind: Key['kind'], bits: number, cn: string, from: Date, to: Date, nameKind: NameKind = 'cn', o: CertOptions = {}): Promise { + const key = await newKey(kind, bits); + const subject = o.subject ?? nameOfKind(cn, nameKind); + return newCert( + { + cn, + from, + to, + subject, + issuer: o.issuer ?? subject, + ...(o.validity === undefined ? {} : { notBefore: children(o.validity)[0]!, notAfter: children(o.validity)[1]! }), + ...(o.compressed === true ? { spki: spkiEC(oid(kind === 'P-256' ? OID.p256 : kind === 'P-384' ? OID.p384 : OID.p521), compressed(key)) } : {}), + extensions: [extSKI(te.encode(cn))], + }, + key, ); - const cert = seq(tbs, seq(oid(OID.ecdsa['SHA-256'])), tlv(0x03, Uint8Array.of(0, 1, 2, 3, 4, 5, 6, 7))); - return { cert, ski, issuer, serial, pkcs8, kind }; } /** A signer with an RSA key of `bits` bits. */ -export const newRSA = (cn: string, bits: number, notBefore: Date, notAfter: Date): Promise => signerOf('rsa', bits, cn, notBefore, notAfter); +export const newRSA = (cn: string, bits: number, from: Date, to: Date): Promise => signerOf('rsa', bits, cn, from, to); /** A signer with an ECDSA key on a NIST curve. */ -export const newECDSA = (cn: string, curve: 'P-256' | 'P-384' | 'P-521', notBefore: Date, notAfter: Date, nameKind: NameKind = 'cn', o: CertOptions = {}): Promise => - signerOf(curve, 0, cn, notBefore, notAfter, nameKind, o); +export const newECDSA = (cn: string, curve: 'P-256' | 'P-384' | 'P-521', from: Date, to: Date, nameKind: NameKind = 'cn', o: CertOptions = {}): Promise => + signerOf(curve, 0, cn, from, to, nameKind, o); // ECDSA from WebCrypto is r || s; a CMS signature is the DER of the two integers. function ecdsaDER(raw: Uint8Array): Uint8Array { @@ -172,114 +398,145 @@ function ecdsaDER(raw: Uint8Array): Uint8Array { return seq(unsigned(raw.subarray(0, half)), unsigned(raw.subarray(half))); } -async function sign(s: Signer, o: Options, data: Uint8Array): Promise { +// Signs data with the key: the signatureAlgorithm of the key and the signature value. +async function sign(k: Key, o: Options, data: Uint8Array): Promise<{ sigAlg: Uint8Array; sig: Uint8Array }> { const hash = o.hash ?? 'SHA-256'; - if (s.kind === 'rsa') { - const name = o.pss ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5'; - const key = await crypto.subtle.importKey('pkcs8', bs(s.pkcs8), { name, hash }, false, ['sign']); - return new Uint8Array(await crypto.subtle.sign(o.pss ? { name, saltLength: HASH_SIZE[hash] } : { name }, key, bs(data))); + if (k.kind === 'rsa') { + const algorithm = o.pss ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5'; + const key = await crypto.subtle.importKey('pkcs8', bs(k.pkcs8), { name: algorithm, hash }, false, ['sign']); + const sig = new Uint8Array(await crypto.subtle.sign(o.pss ? { name: algorithm, saltLength: HASH_SIZE[hash] } : { name: algorithm }, key, bs(data))); + if (!o.pss) return { sigAlg: algID(OID.rsa, NULL), sig }; + const params = [tlv(0xa0, hashAlg(hash)), tlv(0xa1, algID(OID.mgf1, hashAlg(hash))), tlv(0xa2, int(HASH_SIZE[hash]))]; + return { sigAlg: algID(OID.pss, seq(...params, ...(o.pssTrailer ? [tlv(0xa3, int(1))] : []))), sig }; } - const key = await crypto.subtle.importKey('pkcs8', bs(s.pkcs8), { name: 'ECDSA', namedCurve: s.kind }, false, ['sign']); - return ecdsaDER(new Uint8Array(await crypto.subtle.sign({ name: 'ECDSA', hash }, key, bs(data)))); + const key = await crypto.subtle.importKey('pkcs8', bs(k.pkcs8), { name: 'ECDSA', namedCurve: k.kind }, false, ['sign']); + return { sigAlg: algID(OID.ecdsa[hash]), sig: ecdsaDER(new Uint8Array(await crypto.subtle.sign({ name: 'ECDSA', hash }, key, bs(data)))) }; } // ---- the signature ---------------------------------------------------------- +/** + * What signature and token write, to make signatures that the profile rejects + * or that verify to something else. The empty options write what AutoFirma + * writes. + */ export interface Options { /** The digest of the signature, SHA-256 by default. */ - hash?: HashName; - /** Signs with RSASSA-PSS instead of PKCS #1 v1.5. */ - pss?: boolean; - /** Writes trailerField [3] 1 in the PSS parameters, which is its default and DER does not write it. */ - pssTrailer?: boolean; + readonly hash?: HashName; + /** Signs with RSASSA-PSS instead of PKCS #1 v1.5, and writes trailerField [3] 1, its default, which DER does not write. */ + readonly pss?: boolean; + readonly pssTrailer?: boolean; /** Names the signer by subjectKeyIdentifier instead of by issuer and serial. */ - ski?: boolean; - /** Gives the time-stamp token of the signature that Build wants as an unsigned attribute. */ - token?: (signature: Uint8Array) => Promise; + readonly ski?: boolean; + /** Another number than the version that RFC 5652 gives a SignerInfo. */ + readonly version?: number; + /** Written as the digestAlgorithm and as the signatureAlgorithm instead of those of the hash and of the key. */ + readonly digestAlg?: Uint8Array; + readonly sigAlg?: Uint8Array; + /** Flips a bit of the signature value, after signing. */ + readonly corruptSignature?: boolean; /** What the message-digest covers, when not the signed message. */ - message?: Uint8Array; + readonly message?: Uint8Array; /** Edits the signedAttrs, as a list of the DER of each attribute, before they are signed. */ - mutate?: (attrs: Uint8Array[]) => Uint8Array[]; + readonly mutate?: (attrs: Uint8Array[]) => Uint8Array[]; + /** Adds a signing-certificate beside the v2, or writes it alone in a signature; writes signing-certificate-v2 in a token. */ + readonly sigCertV1?: boolean; + readonly noSigCertV2?: boolean; + readonly sigCertV2?: boolean; + /** + * The hashAlgorithm of the ESSCertIDv2, which DER leaves out for SHA-256, + * the hash of its certHash, SHA-256 by default, and the certificate whose + * hash it gives instead of that of the signer. + */ + readonly essHashAlg?: Uint8Array; + readonly essDigest?: HashName | 'SHA-1'; + readonly essCert?: Uint8Array; + /** Leaves the message-digest out. */ + readonly noMessageDigest?: boolean; + /** Added to the signed attributes, and to the unsigned attributes, as the DER of each. */ + readonly extraAttrs?: Uint8Array[]; + readonly extraUnsigned?: Uint8Array[]; + /** Leaves the signedAttrs in the order they are given, not in DER order. */ + readonly unsorted?: boolean; + /** Gives the time-stamp token of the signature that signature puts as an unsigned attribute. */ + readonly token?: (signature: Uint8Array) => Promise; /** * Puts a second signature-time-stamp beside the token, to break the * profile: in an attribute of its own, or as a second value of the same * attribute. It is a ContentInfo of id-data, which the token must not be, * so that the SET OF stays in DER order. */ - token2?: 'attribute' | 'value'; - /** Adds this response in crls. */ - ocsp?: Uint8Array; - /** The elements of crls as they are, instead of an OCSP response. */ - crls?: Uint8Array[]; - /** Leaves the signedAttrs in the order they are given, not in DER order. */ - unsorted?: boolean; - /** Leaves the certificate of the signer out of certificates. */ - omitCert?: boolean; + readonly token2?: 'attribute' | 'value'; /** Adds an unsigned attribute of this many bytes, which decides nothing. */ - junk?: number; - /** Adds a signing-certificate attribute beside the v2. */ - sigCertV1?: boolean; - /** Added to the signed attributes, as the DER of each. */ - extraAttrs?: Uint8Array[]; - /** Another number than the version that RFC 5652 gives a SignerInfo. */ - version?: number; + readonly junk?: number; + /** Leaves the certificate of each signer out of certificates, and adds these. */ + readonly omitCert?: boolean; + readonly extraCerts?: Uint8Array[]; + /** Adds this response in crls, and the elements of crls as they are. */ + readonly ocsp?: Uint8Array; + readonly crls?: Uint8Array[]; + /** Writes each SignerInfo twice, and signerInfos in descending order. */ + readonly signerInfoTwice?: boolean; + readonly unsortedInfos?: boolean; + /** Edits the fields of each SignerInfo after it is signed. */ + readonly editSignerInfo?: (fields: Uint8Array[]) => Uint8Array[]; } -const attr = (o: string, ...values: Uint8Array[]): Uint8Array => seq(oid(o), set(0x31, ...values)); - function encap(content: Uint8Array, token: boolean): Uint8Array { return token ? seq(oid(OID.tstInfo), tlv(0xa0, octets(content))) : seq(oid(OID.data)); } +// The SigningCertificate (v1, SHA-1) or the SigningCertificateV2 of a certificate. +async function essCertID(cert: Uint8Array, o: Options, v2: boolean): Promise { + const c = o.essCert ?? cert; + if (!v2) return seq(seq(seq(octets(await digest('SHA-1', c))))); + const h = octets(await digest(o.essDigest ?? 'SHA-256', c)); + return seq(seq(o.essHashAlg === undefined ? seq(h) : seq(o.essHashAlg, h))); +} + async function signerInfo(message: Uint8Array, o: Options, token: boolean, s: Signer): Promise { const hash = o.hash ?? 'SHA-256'; - const sid = o.ski ? tlv(0x80, s.ski) : seq(s.issuer, int(s.serial)); - const attrs: Uint8Array[] = [ - attr(OID.contentType, oid(token ? OID.tstInfo : OID.data)), - attr(OID.messageDigest, octets(await digest(hash, o.message ?? message))), - ]; - const certSha1 = await digest('SHA-1', s.cert); - attrs.push(token ? attr(OID.sigCertV1, seq(seq(seq(octets(certSha1))))) : attr(OID.sigCertV2, seq(seq(seq(octets(await digest('SHA-256', s.cert))))))); - if (o.sigCertV1) attrs.push(attr(OID.sigCertV1, seq(seq(seq(octets(certSha1)))))); + const sid = o.ski ? tlv(0x80, s.ski) : seq(s.issuer, s.serial); + const attrs: Uint8Array[] = [attr(OID.contentType, oid(token ? OID.tstInfo : OID.data))]; + if (!o.noMessageDigest) attrs.push(attr(OID.messageDigest, octets(await digest(hash, o.message ?? message)))); + if (token && !o.sigCertV2) attrs.push(attr(OID.sigCertV1, await essCertID(s.cert, o, false))); + else if (!o.noSigCertV2) attrs.push(attr(OID.sigCertV2, await essCertID(s.cert, o, true))); + if (o.sigCertV1) attrs.push(attr(OID.sigCertV1, await essCertID(s.cert, {}, false))); attrs.push(...(o.extraAttrs ?? [])); const list = o.mutate === undefined ? attrs : o.mutate(attrs); const signed = o.unsorted ? tlv(0xa0, ...list) : set(0xa0, ...list); - const forSig = concatBytes(Uint8Array.of(0x31), signed.subarray(1)); - const signature = await sign(s, o, forSig); - - let sigAlg: Uint8Array; - if (s.kind === 'rsa') { - if (o.pss) { - const base = [tlv(0xa0, hashAlg(hash)), tlv(0xa1, seq(oid(OID.mgf1), hashAlg(hash))), tlv(0xa2, int(HASH_SIZE[hash]))]; - sigAlg = seq(oid(OID.pss), seq(...base, ...(o.pssTrailer ? [tlv(0xa3, int(1))] : []))); - } else { - sigAlg = seq(oid(OID.rsa), NULL); - } - } else { - sigAlg = seq(oid(OID.ecdsa[hash])); + // The signature covers the signedAttrs with the tag of a SET. + const { sigAlg, sig } = await sign(s.key, o, concatBytes(Uint8Array.of(0x31), signed.subarray(1))); + if (o.corruptSignature) { + const i = sig.length >> 1; + sig[i] = sig[i]! ^ 1; } - const f = [int(o.version ?? (o.ski ? 3 : 1)), sid, hashAlg(hash), signed, sigAlg, octets(signature)]; + const f = [int(o.version ?? (o.ski ? 3 : 1)), sid, o.digestAlg ?? hashAlg(hash), signed, o.sigAlg ?? sigAlg, octets(sig)]; const unsigned: Uint8Array[] = []; if (o.junk !== undefined && o.junk > 0) unsigned.push(attr('1.2.3.4.5', octets(new Uint8Array(o.junk)))); if (o.token !== undefined) { - const t = await o.token(signature); + const t = await o.token(sig); const second = seq(oid(OID.data)); if (o.token2 === 'attribute') unsigned.push(attr(OID.timeStamp, t), attr(OID.timeStamp, second)); else unsigned.push(o.token2 === 'value' ? attr(OID.timeStamp, t, second) : attr(OID.timeStamp, t)); } + unsigned.push(...(o.extraUnsigned ?? [])); if (unsigned.length > 0) f.push(set(0xa1, ...unsigned)); - return seq(...f); + return seq(...(o.editSignerInfo === undefined ? f : o.editSignerInfo(f))); } -async function build(message: Uint8Array, o: Options, token: boolean, signers: Signer[]): Promise { - const hash = o.hash ?? 'SHA-256'; - const certs = o.omitCert ? [] : signers.map((s) => s.cert); - const infos = await Promise.all(signers.map((s) => signerInfo(message, o, token, s))); - const body: Uint8Array[] = [int(1), set(0x31, hashAlg(hash)), encap(message, token)]; +async function build(content: Uint8Array, o: Options, token: boolean, signers: Signer[]): Promise { + const certs = [...(o.omitCert ? [] : signers.map((s) => s.cert)), ...(o.extraCerts ?? [])]; + const infos: Uint8Array[] = []; + for (const s of signers) { + const info = await signerInfo(content, o, token, s); + infos.push(info, ...(o.signerInfoTwice ? [info] : [])); + } + const body: Uint8Array[] = [int(1), set(0x31, hashAlg(o.hash ?? 'SHA-256')), encap(content, token)]; if (certs.length > 0) body.push(set(0xa0, ...certs)); - if (o.crls !== undefined) body.push(set(0xa1, ...o.crls)); - else if (o.ocsp !== undefined) body.push(set(0xa1, tlv(0xa1, oid(OID.ocsp), o.ocsp))); - body.push(set(0x31, ...infos)); + const crls = [...(o.ocsp === undefined ? [] : [tlv(0xa1, oid(OID.ocsp), o.ocsp)]), ...(o.crls ?? [])]; + if (crls.length > 0) body.push(set(0xa1, ...crls)); + body.push(o.unsortedInfos ? tlv(0x31, ...[...infos].sort((a, b) => compareBytes(b, a))) : set(0x31, ...infos)); return seq(oid(OID.signedData), tlv(0xa0, seq(...body))); } @@ -291,39 +548,43 @@ export function signature(message: Uint8Array, o: Options, ...signers: Signer[]) // ---- the token -------------------------------------------------------------- export interface TokenOptions { - hash?: HashName; - /** Whole seconds; 0 for none. */ - accuracySeconds?: number; + /** The hash of the messageImprint, SHA-256 by default. */ + readonly hash?: HashName | 'SHA-1'; + /** The Accuracy element as written: none by default. */ + readonly accuracy?: Uint8Array; /** The version of the TSTInfo, 1 by default. */ - version?: number; - /** Written as the hashed message instead of the hash of the subject. */ - imprint?: Uint8Array; + readonly version?: number; + /** Written as the hashed message instead of the hash of the subject, of any length. */ + readonly imprint?: Uint8Array; + /** Written as genTime instead of the GeneralizedTime of the time given. */ + readonly genTimeRaw?: Uint8Array; + /** Elements written after the accuracy: ordering, nonce, tsa and extensions, or anything after the last field. */ + readonly after?: Uint8Array[]; + /** The options of the SignedData of the token; its hash is the digest of the signature of the authority. */ + readonly cms?: Options; } -export function generalizedTime(s: string): Uint8Array { - return tlv(0x18, new TextEncoder().encode(s)); +/** The GeneralizedTime of t as DER writes it: the fraction of a second only when there is one. */ +export function genTimeOf(t: Date): Uint8Array { + const p = (n: number, w = 2): string => String(n).padStart(w, '0'); + const ms = t.getUTCMilliseconds(); + const frac = ms === 0 ? '' : `.${p(ms, 3).replace(/0+$/, '')}`; + return generalizedTime(`${p(t.getUTCFullYear(), 4)}${p(t.getUTCMonth() + 1)}${p(t.getUTCDate())}${p(t.getUTCHours())}${p(t.getUTCMinutes())}${p(t.getUTCSeconds())}${frac}Z`); } -/** The TSTInfo of a token over `subject` at `genTime`, with the fields after genTime that the test gives. */ -export async function tstInfo(subject: Uint8Array, genTime: Uint8Array, o: TokenOptions = {}, ...after: Uint8Array[]): Promise { +/** The TSTInfo of a token over `subject` at `genTime`. */ +export async function tstInfo(subject: Uint8Array, genTime: Date, o: TokenOptions = {}): Promise { const hash = o.hash ?? 'SHA-256'; - return seq(int(o.version ?? 1), oid('1.2.3.4'), seq(hashAlg(hash), octets(o.imprint ?? (await digest(hash, subject)))), int(42), genTime, ...after); -} - -export function genTimeOf(t: Date): Uint8Array { - const p = (n: number, w = 2): string => String(n).padStart(w, '0'); - return generalizedTime(`${p(t.getUTCFullYear(), 4)}${p(t.getUTCMonth() + 1)}${p(t.getUTCDate())}${p(t.getUTCHours())}${p(t.getUTCMinutes())}${p(t.getUTCSeconds())}Z`); + const fields = [int(o.version ?? 1), oid('1.2.3.4'), seq(hashAlg(hash), octets(o.imprint ?? (await digest(hash, subject)))), int(42), o.genTimeRaw ?? genTimeOf(genTime)]; + return seq(...fields, ...(o.accuracy === undefined ? [] : [o.accuracy]), ...(o.after ?? [])); } /** The RFC 3161 token that `tsa` issues over `subject` at `genTime`. */ export async function token(subject: Uint8Array, genTime: Date, o: TokenOptions, tsa: Signer): Promise { - const after = o.accuracySeconds === undefined || o.accuracySeconds === 0 ? [] : [seq(int(o.accuracySeconds))]; - return build(await tstInfo(subject, genTimeOf(genTime), o, ...after), {}, true, [tsa]); + return build(await tstInfo(subject, genTime, o), o.cms ?? {}, true, [tsa]); } /** A token that `tsa` signs over the given TSTInfo, as it is. */ export function tokenRaw(info: Uint8Array, tsa: Signer, o: Options = {}): Promise { return build(info, o, true, [tsa]); } - -export { hex }; diff --git a/src/lib/dkc/testing/ibe-vectors.json b/src/lib/dkc/testing/ibe-vectors.json index 8400b95..f1d6702 100644 --- a/src/lib/dkc/testing/ibe-vectors.json +++ b/src/lib/dkc/testing/ibe-vectors.json @@ -204,15 +204,25 @@ "r": "5ab044fad730f0470dfe574e1edd192065ff12ee04909e8cfe90ebc762cf5df7", "file_key": "b6a845d405e6a47733b42802de903b6c" }, + { + "name": "format3_note", + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39", + "body": "87b08e7e96c14d8d9b2583e2c4dfb97f3be23dc398688fffae6a6ba732b0c837fe6d938d6aca444f8d906362087fbc6710eeaf38d7b1eb6bc5f9763f95e521c81b83205ffbbfcf20662ffeb3885d18861623025aee72ae56fded5fce5fdc2fed4433820be2af9f7915fc7ebc10cea1413f223d0a8e7b1821e01633e294389fdb", + "gt": "0a8cad7119881e899628bc141a39032df014815233e97976c3c35166b48e3ed2defd750a4356197e1e8a3b182e6b02d20574e6b1ade3219512b8999ead6a99407f1dabc35af7403e2038bdcb8db8f2cb6216f58643b5c20efe9b6c93d3d36ba50ac889ec48232f54b01709b5aa4118e41925de0791d148641db15399a3dc17d11f320cba4930f73abbe2cec7968324c004e544380de283b6af615402a572b9968a476daa608837465e3255cb48fb5f164f1d87bbbeb4f2f6c56840e6b7d3a5610637ca6f7227b6f28ea67554f969c6f625a2c59d6b8c094076fe881afc5ec89ef5a49ec4bd837d609e52715bf972eef4130620128d79e881c547cd3e0cd13981b225cf7dc5c997093099776688d2dd0cdb7ee824bd2d64a446d7d473413de02b0432bb1ce86063a1303160bc0c96c6c349a023713cb71b84464dd3bfe65e3ef90ce38c8e979d9d6175ca4e634969984a0dc4e49baf78013e72afce3261f905bb48eb02cd2088d8d2a003a0a3e52513c5cff88c46a17b74d8174b6b0617a716e1121d8af63061050385b513b489da2f006b0f696f458ac4c7eca7ac5fd17a80cd7b15523b3a2d5c3f8cf606f8748975e21522bd3986f51d6b92c2890ef22ebd0cb21cb624307a32f5324836589e818ae03c8bcfa5c5df23175af0b2cddfd33f881594eacd8ea222c17782ed13ebffc000391dea5ce30224acff03fc2625d3d9081f81e5ce0c8be1d8c6fa4a472cbe391a11b3a9e99060d11cfcce19276e1551d4fb88b945edd2e7373e023e882e69b71f08af192c027a7d9b63be7bfecea7e667", + "sigma": "b2c582bb1c4e8836a2f48928b57b9171", + "r": "20d56c4f75f533b82c98fe93f6be49ca4da839c0a0a06f14cd9a2a05cf9f18b1", + "file_key": "379701714ecce98406fb439ce0ca0453" + }, { "name": "format3_seal_unsupported", "round": 2000, "signature": "b6cb8f482a0b15d45936a4c4ea08e98a087e71787caee3f4d07a8a9843b1bc5423c6b3c22f446488b3137eaca799c77e", - "body": "8f2cb7577b036e54ca2019d01c6941d0ea9f18e3caade81e41c8f77f1514c0a5c75583d6372db607f902d5056c942b0c16c48999c5897a1b44953499a2da59eabc7fbd6ec27886882ce0bf2becdb259b8c62b940dcdfa43865e8de37c74dc49bffa90f04530e33134cc4ee5a843aae112b49ea99eaefc5645b5f963866ed94cb", - "gt": "0a6e979e201b2e75f93ab0af0d266ac7cc8a3617b6aff1e69b65b22dc64055057ce04a5b011c9575306692d12c7673c300aa12d22ecfbf09672bb412f563e8fded84b9a21751c88acffe5802d9a7df55a66be413cd3d2212633403270b96ad32142cc55923292008525f833f2d7b747dbb6f9c7653e219bff4e9c9e0516ebef129884263c4121939b278118d94a42d901045dc777ad453d5d0fe2733da0d22659d61391e6bce2b2cf285ccda5ccbd4d55c7b4d6173131e7fc67d9abd4849f67916e95986d61a47008f4c999f4181b6bf252ad1e82a4e8d28b197d76c08d533427159b66b7e1b2f9b07fda931aa2c5055059ec52f03addc43093aa3e4a9128f8853f2f13cafadf09ceb83a6e2a03c4c289fca5a290db1f1ff03037ad33fee894a0ad29276146cbccdf7433b8c24a1be750355e7c4f9c5d8ffc9824596530677d7fbe31da1424572493ab046340201c20708ae6c523eee32e21fc5ecd62de2fd764180372f617b7fb3fc960554cc4594fa31d74041a3fda4c1291a47a853bcbd3714d9735ee0b398de27283f571d68e37dfcf947d135c0f8db36556318a580de154f874271a4ebdde23bb966d3ef9977640e3b0943c1ee44872ddd379b2a307d1c3baae21bf9546b625f6f2a0aa11bd15c63df7d2315cfa16cf1b59629babca09818e8baab411f7943b1d16ca53df07a417eaeb19b1fb48c3451fe53c0b8d00398872b83f6836e7dc37b3005624488cf81123bfc106d79e3f41e8cfc338b9f960153b4f7a011d90cd0eb81ef3bf6264be3fb165f8989621ee8543ca1741e87091d", - "sigma": "25fedf2e4e3d2db30d94a0b468b90e38", - "r": "51d85fb4996c5c96c33e15def42a07200863bcda50cb31b102ac1e062e361e8a", - "file_key": "ad1ef55f85be2eb6be3b14c2e29d3b10" + "body": "93a5434ca155ecf9b350f726ce5ec9ea6084df2f304b89e46ae2e20cff92325f8916b2a88102a323d099acc2e201cc700a4aeb2dc2b99b4b2ccd7b21a60368b913ff283b1757fd8f500dc6f7d6520ff473ca226801fed6a5e743e73bc1d22a5214c0f6f22dfc4bb45d7bf307beb9356bac7676714d86adab40d2713732017226", + "gt": "15b84589e7e0f18ceeab63b13c8f603f44a9899d7d9deb81c63be1277f76cb3109bb1ea6eafc42f5991832480e66f1d702eaee475d26b929e8648433229033bf199399554e907f667abea2896f8593e733b8d3211f5fd03f40ee70bda609d39903a52dac9b57d570448feeffd440f45ea74f9648d78675471b8d5d20affba8c75187a54e1f038aae3daa1ad7b805f7db05ea8b3c8abd9f131582fafb2e4028fe31e7afbe882b7482397a37900a5c38896f6795579b7ecef99676273b8053447a0f612b10866a299edf800e95da4a709850ebf11ba39106aaa64265ddc9511568bbd1396ad945d35afdd7b498c52fe0c4021905939a5215f603e2880d7025f95ea97996fdca9c2eafd732b75224de9c96b97cf5d6ccd5e1656332aa8355d1e46906740d627eca450c4d5fb65cad2e8cdacc993307c029bd4fa11e9edc512b3bcfc14642bb2cf485f8a0518f7c8815f9b102707181ba8c41622ebdb7a8d5904e21c2eb291166aa3f67e9ab15838cbb570c675a47fd9dd86e1f4f2f98d81a07943e17d44a25ded09d960f2caabf48ba676b5f8c5958e4a662f1d327b0b6de4eb45c615db711f6f5599ec2958b43853e4b730a17ec3400e4617e8844b4f4f7b5b8dafa9dc3558b9b031fce0455a484ccf8ca28c506feed7901fb4ee606c36a8fb15402cc3e0075c6cee1e761cadd997592039b6b5ea360749c308715a213356bab8a462ad4e1d660bbc79cd45cc9a7554a2a09d94880fa2be9784bd8e6756609a6a57a7e7f37c5f2a0d02a16cf9ee211e310250dc25829ad458a25cfc950dcdf76c0", + "sigma": "7d4e1a34b1efa321d28f3a92610105db", + "r": "56c9a2ac8036740efd7783fe69c82918a0e53f59f46a291221599ab6fb1af1f2", + "file_key": "09b989caf1a98ac7ae25a179b6031a16" }, { "name": "format3_sealed", @@ -294,6 +304,16 @@ "r": "3713ea67697e81dd87689bee1b1eb4171f4fc528695efdab1fa0b6ae2a874cb1", "file_key": "7bfa8b9f99c10342f5c503851d2f4514" }, + { + "name": "format3_unsigned", + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39", + "body": "99d7466198d61841a563c20edd92f3f86816bc66013a39b009f9ca4c421d5135f865c27e33e381d28bf1a580578a440612f390ae7794a6a2e1c9c96814b609124072c9fc069d6d56088ea8a80b5780bb3ae004d06a8f4148f09987021cc7b4274aabe6b9b47227c06898be7b0e507616c2c411d82479aa3764d359f8594da62b", + "gt": "0b625ef2dff31c7918429758e9b8c6b4e1e1548af905c81fecfad5b94e7455404e75c8da7e54e44feebdaebbe6afff7115f7d2262b772d909ad5d3bfac175a67dacf014b1fd4700c6cbcbca2349ac46ba666a317dae752e1b943b434ea90452c181a7ea93aaade0912a022450088280b2787fff54074a9f3d8622648f547a1bfe8ba8998049203537ad09c556869a2860ab38a1a381357ada1bd84c739e7c82c43dbf47590afcbbc4710549ff405b23c13af6445d734f649ec2802a7d5d5cb6105c63438a932ffe386738167d1cc1221afb2074238c81d039c9c2b2209f1d7a8bc53c72b22d09cc32387f562d9d9a194080fb9ee228b21f6047669e41c6d8e784dc4862e63f17d940f2a5ad810ea308d042a6d85ea18154a9643329bcfa9573d16edcfbd817aae838bfb6aa131644990c087645d9a292ff7e01fc17299fe3855caf277a199c7d88976d771483845f77f1058333ac3d1edde99d79ec17f6bfeb637d63661a7fce863a825cabd8d2b3f3b32448caad9222918568d4f67547023bb07a4a0d356114eda7a0b26bc818ce30acebb61dcc4c9454820ffcec05255cd77ff646c9163cd291d3ca9df2fe3de0cd01524a7ae80ebb69208a359aafa67e6fa15c290cc5c6288b9a22f1c45625afa1d370cd525e235306610cea286eaf247211884d80615fa04505af7de711de653f1274ecccfe49884d51771b2c4fb305d1c409af98e5f88783c6b02487a5379a2de060f65d6d52da8665a476d8694f10f1db4775bf4c29683f411c3aa2a3a0c0002a0be27527210830741262048ef482f65", + "sigma": "5133dedc94826a782c2cb6422f627f3f", + "r": "3e80dfc23411c8d4bfa164e6a252a304df0785b1c8769e65c5bf4f90fbd3c951", + "file_key": "906b5caf364f0833e74252b4dcca445e" + }, { "name": "time_and_key_portable", "round": 1000, diff --git a/src/lib/dkc/testing/mutation-texts.json b/src/lib/dkc/testing/mutation-texts.json index 52d93c2..5355652 100644 --- a/src/lib/dkc/testing/mutation-texts.json +++ b/src/lib/dkc/testing/mutation-texts.json @@ -828,9 +828,41 @@ "text": "ok" }, { - "name": "a seal of seal_type 1 opens with the verdict S1", + "name": "a seal of seal_type 4294967295 opens with the verdict S1", "text": "ok" }, + { + "name": "the signature of alg 1 altered opens with the verdict F2", + "text": "ok" + }, + { + "name": "the signature of alg 1 removed opens with the verdict F0", + "text": "ok" + }, + { + "name": "the signature of alg 1 made again with another key opens with the verdict F4 of that key", + "text": "ok" + }, + { + "name": "the signature of alg 1 transplanted to another capsule opens with the verdict F2", + "text": "ok" + }, + { + "name": "a key of 31 bytes in a signature of alg 1 opens with the verdict F1", + "text": "ok" + }, + { + "name": "a signature of 65 bytes of alg 1 opens with the verdict F1", + "text": "ok" + }, + { + "name": "the area widened to 64 KiB after signing opens with the verdict F4 and the same AUTHOR_MESSAGE", + "text": "ok" + }, + { + "name": "the public note changed in PUBLIC_HEADER", + "text": "capsule: header_binding does not match PRELUDE || PUBLIC_HEADER: ERR_HEADER_BINDING" + }, { "name": "format 3 time_only relabeled format 1", "text": "capsule: CONTROL_CBOR: codec: datekeys-control schema version 3, want 1: ERR_UNSUPPORTED_VERSION" diff --git a/src/lib/dkc/vectors.test.ts b/src/lib/dkc/vectors.test.ts index 5111041..4176411 100644 --- a/src/lib/dkc/vectors.test.ts +++ b/src/lib/dkc/vectors.test.ts @@ -34,7 +34,7 @@ import { readFileSync } from 'node:fs'; import { describe, expect, it } from 'vitest'; import { decodeAccessKey, decodeAccessKeyBody, marshalAccessKeyBody, wipeAccessKey } from './accesskey.ts'; import { checkCompressedPoint } from './bls12381.ts'; -import { concatBytes, equalBytes, sha256, toHex } from './bytes.ts'; +import { concatBytes, decodeUtf8, equalBytes, sha256, toHex } from './bytes.ts'; import { type Item, MAX_SAFE_UINT, walk } from './cbor.ts'; import { decodeControl, encodeControl } from './control.ts'; import { type Format, FORMAT_1, FORMAT_2, FORMAT_3, isFormat } from './framing.ts'; @@ -45,6 +45,7 @@ import type { Extension, ExtensionRegistry } from './extension.ts'; import { decodeHead, encodeHead, type HeadFile } from './head.ts'; import { decodeHeader, encodeHeader } from './header.ts'; import { inspect, inspectJSON, inspectView } from './inspect.ts'; +import { checkNoteData, newNote, NOTE_ID, publicNote, unusableNote } from './note.ts'; import { open } from './open.ts'; import { checkPath, nfd, pathKey } from './pathrule.ts'; import { TABLES_DIGEST, UNICODE_VERSION } from './pathrule-tables.ts'; @@ -585,26 +586,26 @@ describe('vectors/mutations.json', () => { const inspected = f.filter((c) => c.error !== 'ok' && c.step <= LAST_INSPECT_STEP); const opened = f.filter((c) => c.step > LAST_INSPECT_STEP); - it('has the cases README counts: 210, 169 of §64 in their runs, 57 in steps 1 to 8 (39 of them from §64), 4 that open', () => { + it('has the cases README counts: 218, 178 of §64 in their runs, 57 in steps 1 to 8 (39 of them from §64), 11 that open', () => { // v0.8.2 had 65 cases, which stay first; v0.9 ran the 33 mutations of the // first two lists of §64 on the format 2 fixtures, the 22 of its third // list and 5 companions with a .dkk; v0.10 adds a case to that list, the // same 33 on the format 3 fixtures, the 47 of the list of format 3 and 3 - // further cases. v0.11 adds one outside §64, a signature of alg 1 that - // does not verify, before the seal of seal_type 1: 205 of the 210 cases. - expect(f).toHaveLength(210); + // further cases. v0.11 and the draft v0.12 add to the list of format 3 a + // signature of alg 1 that does not verify, and then the 8 cases of the + // list of v0.11 that a capsule holds, before those 3 further cases: 215 + // of the 218 cases. + expect(f).toHaveLength(218); const run = (from: number, to: number, spec: boolean): boolean => f.slice(from, to).every((c) => c.spec === spec); expect([ run(0, 33, true), run(33, 65, false), run(65, 121, true), run(121, 126, false), - run(126, 205, true), - run(205, 206, false), - run(206, 207, true), - run(207, 210, false), - ]).toEqual([true, true, true, true, true, true, true, true]); - expect(f.filter((c) => c.spec).length).toBe(169); + run(126, 215, true), + run(215, 218, false), + ]).toEqual([true, true, true, true, true, true]); + expect(f.filter((c) => c.spec).length).toBe(178); // README: the same 33 on the fixtures of formats 2 and 3 are named // "format 2: …" and "format 3: …". expect(f.slice(65, 98).map((c) => c.name)).toEqual(f.slice(0, 33).map((c) => `format 2: ${c.name}`)); @@ -614,8 +615,15 @@ describe('vectors/mutations.json', () => { expect(opens.map((c) => [c.spec, c.verdicts!.signature, c.verdicts!.seal])).toEqual([ [true, 'X', 'X'], [true, 'F1', 'S0'], - [false, 'F2', 'S0'], + [true, 'F2', 'S0'], [true, 'F0', 'S1'], + [true, 'F2', 'S0'], + [true, 'F0', 'S0'], + [true, 'F4', 'S0'], + [true, 'F2', 'S0'], + [true, 'F1', 'S0'], + [true, 'F1', 'S0'], + [true, 'F4', 'S0'], ]); expect(inspected.length + opened.length + opens.length).toBe(f.length); expect(new Set(f.map((c) => c.name)).size, 'unique names').toBe(f.length); @@ -895,6 +903,65 @@ describe('vectors/padding.json', () => { }); }); +// --------------------------------------------------------------------------- +// vectors/note.json +// +// The data of the public note, datekeys.note version 1 in the noncritical +// array of PUBLIC_HEADER (spec §24.1): ok, or ERR_EXTENSION_DATA_INVALID with +// the text of the rule that the note breaks, without the code, as Go words it. + +interface NoteVector { + name: string; + data: Uint8Array; + result: string; + detail?: string; +} + +describe('vectors/note.json', () => { + const f = load('vectors/note.json', (json) => { + const o = object(json, 'note.json'); + keys(o, 'note.json', ['spec', 'description', 'notes']); + checkSpec(o, 'note.json'); + return array(o.notes, 'notes').map((v, i): NoteVector => { + const at = `notes[${i}]`; + const c = object(v, at); + const res = result(c.result, `${at}.result`); + // README: detail only for a note that fails. + keys(c, at, ['name', 'data', 'result', ...(res === 'ok' ? [] : ['detail'])]); + const n: NoteVector = { name: str(c.name, `${at}.name`), data: hexBytes(c.data, `${at}.data`), result: res }; + if (res !== 'ok') n.detail = str(c.detail, `${at}.detail`); + return n; + }); + }); + if (f === undefined) return; + + it('has notes that pass and notes that fail, each failure with ERR_EXTENSION_DATA_INVALID', () => { + expect(f.some((n) => n.result === 'ok')).toBe(true); + expect(new Set(f.filter((n) => n.result !== 'ok').map((n) => n.result))).toEqual(new Set(['ERR_EXTENSION_DATA_INVALID'])); + }); + + it.each(f.map((n) => [n.name, n] as const))('%s', (_name, n) => { + let text: string | undefined; + let got: { result: string; detail?: string }; + try { + text = checkNoteData(n.data); + got = { result: 'ok' }; + } catch (err) { + if (!(err instanceof DateKeysError)) throw err; + expect(err.message.endsWith(`: ${err.code}`), err.message).toBe(true); + got = { result: err.code, detail: err.message.slice(0, -`: ${err.code}`.length) }; + } + expect(got).toEqual({ result: n.result, detail: n.detail }); + // A reader shows the note only when it passes, and says when it does + // not; a writer writes it only then. + const noncritical: Extension[] = [{ id: NOTE_ID, version: 1, data: n.data }]; + expect([publicNote(noncritical), unusableNote(noncritical)]).toEqual([text, n.result !== 'ok']); + const decoded = decodeUtf8(n.data); + if (decoded !== undefined && n.result === 'ok') expect(newNote(decoded).data).toEqual(n.data); + else if (decoded !== undefined) expect(() => newNote(decoded)).toThrow(`${n.detail}: ${n.result}`); + }); +}); + // --------------------------------------------------------------------------- // vectors/tlock_ibe.json // @@ -1120,27 +1187,51 @@ describe('vectors/head_schema.json', () => { }); }); +/** + * The context of security.json and of a case of security_cms.json, what a + * verdict needs besides the area: control_commit and head_digest in + * hexadecimal, and round_time in RFC 3339, as Go's time.RFC3339 writes it. + */ +function securityContext(v: unknown, at: string): { controlCommit: Uint8Array; headDigest: Uint8Array; roundTime: Instant } { + const o = object(v, at); + keys(o, at, ['control_commit', 'head_digest', 'round_time']); + const controlCommit = hexBytes(o.control_commit, `${at}.control_commit`); + const headDigest = hexBytes(o.head_digest, `${at}.head_digest`); + const roundTime = parseRFC3339(str(o.round_time, `${at}.round_time`)); + if (controlCommit.length !== 32 || headDigest.length !== 32 || formatRFC3339(roundTime) !== o.round_time) throw new FormatError(at, 'not two hashes of 32 bytes and a time in RFC 3339'); + return { controlCommit, headDigest, roundTime }; +} + +/** The lines of a vector: the verdicts as the official SDK shows them (spec §29.7). */ +function linesOf(v: unknown, at: string): string[] { + return array(v, at).map((l, i) => str(l, `${at}[${i}]`)); +} + describe('vectors/security.json', () => { const f = load('vectors/security.json', (json) => { const o = object(json, 'security.json'); - keys(o, 'security.json', ['spec', 'description', 'vectors']); + keys(o, 'security.json', ['spec', 'description', 'context', 'vectors']); checkSpec(o, 'security.json'); - return array(o.vectors, 'vectors').map((v, i) => { + const context = securityContext(o.context, 'context'); + const vectors = array(o.vectors, 'vectors').map((v, i) => { const at = `vectors[${i}]`; const c = object(v, at); - keys(c, at, ['name', 'hex', 'signature', 'seal']); - return { name: str(c.name, at), input: hexBytes(c.hex, at), signature: verdict(c.signature, at), seal: verdict(c.seal, at) }; + keys(c, at, ['name', 'hex', 'signature', 'seal', 'lines']); + return { name: str(c.name, at), input: hexBytes(c.hex, at), signature: verdict(c.signature, at), seal: verdict(c.seal, at), lines: linesOf(c.lines, `${at}.lines`) }; }); + return { context, vectors }; }); if (f === undefined) return; - it('reaches every verdict of this version: X, F0, F1, S0, S1 and S2', () => { - const reached = new Set(f.flatMap((c) => [c.signature, c.seal])); - expect([...reached].sort()).toEqual(['F0', 'F1', 'S0', 'S1', 'S2', 'X']); + // The areas of security.json have no valid signature of alg 2 or seal of seal_type 2: security_cms.json has them. + it('reaches X, F0, F1, F2, F4, S0, S1 and S2, in the context of the file', () => { + const reached = new Set(f.vectors.flatMap((c) => [c.signature, c.seal])); + expect([...reached].sort()).toEqual(['F0', 'F1', 'F2', 'F4', 'S0', 'S1', 'S2', 'X']); }); - it.each(f.map((c) => [c.name, c] as const))('%s', (_n, c) => { - expect(evaluateSecurity(c.input)).toEqual({ signature: c.signature, seal: c.seal }); + it.each(f.vectors.map((c) => [c.name, c] as const))('%s', (_n, c) => { + const v = evaluateSecurity(c.input, f.context); + expect({ ...kinds(v), lines: verdictLines(v) }).toEqual({ signature: c.signature, seal: c.seal, lines: c.lines }); }); }); @@ -1156,6 +1247,7 @@ const VECTOR_FILES = [ 'vectors/inspect_differential.json', 'vectors/locator.json', 'vectors/mutations.json', + 'vectors/note.json', 'vectors/padding.json', 'vectors/path_fold.json', 'vectors/paths.json', @@ -1195,36 +1287,73 @@ describe('testdata/', () => { for (const f of VECTOR_FILES) expect(readme, f).toContain(`\`${f}\``); }); - // The vectors of spec v0.11 for the verification of the signature with - // certificates and of the seal (§29.7, §29.10, §29.11): every area is read in - // the context of its capsule and must give the verdicts of the reference, the - // result of each signer and the authority of a valid seal. describe('vectors of v0.11', () => { - it('security_cms.json: every case gives the verdicts, the signers and the seal of the reference', () => { - const f = object(readJSON('vectors/security_cms.json'), 'security_cms.json'); - expect(f.spec).toBe(SPEC_VERSION); - const cases = array(f.cases, 'cases').map((c, i) => object(c, `cases[${i}]`)); - expect(cases.length).toBeGreaterThanOrEqual(20); - for (const [i, c] of cases.entries()) { - const at = `cases[${i}] ${String(c.name)}`; - const area = hexOf(c.security_cbor); - const ctx = object(c.context, `${at}.context`); - const v = - c.no_context === true - ? evaluateSecurity(area) - : evaluateSecurity(area, { controlCommit: hexOf(ctx.control_commit), headDigest: hexOf(ctx.head_digest), roundTime: parseRFC3339(str(ctx.round_time, `${at}.round_time`)) }); - expect({ signature: v.signature, seal: v.seal }, at).toEqual({ signature: verdict(c.signature, `${at}.signature`), seal: verdict(c.seal, `${at}.seal`) }); + // The vectors of the draft v0.12 for the verification of the signature + // with certificates and of the seal (§29.7, §29.10, §29.11): every area is + // read in the context of its capsule and must give the verdicts of the + // reference, the result of each signer, of those who do not count and the + // authority of a valid seal, each time in RFC 3339 with the fraction of + // its token, and the lines of §29.7, byte for byte. + describe('security_cms.json', () => { + const RESULTS = ['valid', 'invalid', 'absent', 'without seal', 'invalid seal', 'out of validity', 'not verifiable']; + // The results of the signers of a case, [] when the key is absent, as Go omits an empty list. + const results = (v: unknown, at: string): unknown[] => + v === undefined + ? [] + : array(v, at).map((s, i) => { + const w = `${at}[${i}]`; + const o = object(s, w); + keys(o, w, ['holder', 'issuer', 'result', 'before_round_time'], ['seal_time']); + if (!RESULTS.includes(str(o.result, `${w}.result`))) throw new FormatError(w, `"${String(o.result)}" is not a result of README`); + const t = o.seal_time === undefined ? {} : { seal_time: str(o.seal_time, `${w}.seal_time`) }; + return { holder: str(o.holder, `${w}.holder`), issuer: str(o.issuer, `${w}.issuer`), result: o.result, ...t, before_round_time: bool(o.before_round_time, w) }; + }); + const f = load('vectors/security_cms.json', (json) => { + const o = object(json, 'security_cms.json'); + keys(o, 'security_cms.json', ['description', 'spec', 'cases']); + checkSpec(o, 'security_cms.json'); + return array(o.cases, 'cases').map((v, i) => { + const at = `cases[${i}]`; + const c = object(v, at); + keys(c, at, ['name', 'security_cbor', 'context', 'signature', 'seal', 'lines'], ['signers', 'foreign_signers', 'seal_holder', 'seal_time']); + const want = { + signature: verdict(c.signature, `${at}.signature`), + seal: verdict(c.seal, `${at}.seal`), + signers: results(c.signers, `${at}.signers`), + foreign_signers: results(c.foreign_signers, `${at}.foreign_signers`), + seal_holder: c.seal_holder === undefined ? '' : str(c.seal_holder, `${at}.seal_holder`), + seal_time: c.seal_time === undefined ? '' : str(c.seal_time, `${at}.seal_time`), + lines: linesOf(c.lines, `${at}.lines`), + }; + return { name: str(c.name, at), area: hexOf(c.security_cbor), context: securityContext(c.context, `${at}.context`), want }; + }); + }); + if (f === undefined) return; + + it('has the 135 cases of README, which reach every verdict but X and F3', () => { + expect(f).toHaveLength(135); + const reached = new Set(f.flatMap((c) => [c.want.signature, c.want.seal])); + expect([...reached].sort()).toEqual(['F0', 'F1', 'F2', 'F4', 'F5', 'F6', 'S0', 'S1', 'S2', 'S3', 'S4', 'S5']); + }); + + it.each(f.map((c) => [c.name, c] as const))('%s', (_n, c) => { + const v = evaluateSecurity(c.area, c.context); const result = (s: { holder: string; issuer: string; result: string; sealTime?: Instant; before: boolean }): unknown => ({ holder: s.holder, issuer: s.issuer, result: s.result, - ...(s.sealTime === undefined ? {} : { seal_time: formatRFC3339(s.sealTime) }), + ...(s.sealTime === undefined ? {} : { seal_time: formatRFC3339Nano(s.sealTime) }), before_round_time: s.before, }); - expect(v.detail?.signers.map(result) ?? [], at).toEqual(c.signers ?? []); - expect(v.detail?.foreign.map(result) ?? [], at).toEqual(c.foreign_signers ?? []); - expect([v.detail?.sealHolder ?? '', v.detail?.sealTime === undefined ? '' : formatRFC3339(v.detail.sealTime)], at).toEqual([c.seal_holder ?? '', c.seal_time ?? '']); - } + expect({ + ...kinds(v), + signers: v.detail?.signers.map(result) ?? [], + foreign_signers: v.detail?.foreign.map(result) ?? [], + seal_holder: v.detail?.sealHolder ?? '', + seal_time: v.detail?.sealTime === undefined ? '' : formatRFC3339Nano(v.detail.sealTime), + lines: verdictLines(v), + }).toEqual(c.want); + }); }); it('locator.json and ed25519_strict.json name this specification (the locator is not ported yet; ed25519strict.test.ts runs the other)', () => { diff --git a/testdata/README.md b/testdata/README.md index bf27b4c..c2ce04b 100644 --- a/testdata/README.md +++ b/testdata/README.md @@ -1,23 +1,32 @@ # DateKeys test data Official vectors, fixtures and corpora of the DateKeys Protocol Specification -v0.10, 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. +v0.11 and of the draft v0.12, 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 records of each fixture -(`.json`, `.dkk.json`, `.inspect.json`) are recomputed from -its frozen bytes, so the fixtures of v0.8.2 and v0.9 carry `"spec": "0.10"` and -the fields added since. 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. +generated once and frozen (spec §67), and the vectors `security_cms.json` and +`locator.json`, frozen too because they hold randomness: delete one of them +to make it again. The records of each fixture (`.json`, +`.dkk.json`, `.inspect.json`) are recomputed from its frozen bytes, +so the fixtures of v0.8.2, v0.9 and v0.10 carry `"spec": "0.11"` and the fields +added since. 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. + +The `spec` field of every file is `"0.11"`, the version this module declares, +until the author approves the draft v0.12. What the draft changes, the texts +of the verdicts of a certificate and of a seal, the profile of a certificate +and the rules of the addresses and of the padding of a locator, is already in +the files: the verdicts and the lines of `security.json`, `security_cms.json` +and `mutations.json`, and the cases of `locator.json`, are those of the draft. Conventions for every file: @@ -43,16 +52,19 @@ Conventions for every file: | `vectors/paths.json` | the paths of a format 3 head: the rules of one entry, and those of the paths of a head | §29.5 | | `vectors/path_fold.json` | the key of R7 of segments, and their NFD | §29.5, §29.5.1 | | `vectors/head_schema.json` | heads of format 3 and the result of decoding them | §29.4 to §29.6, §69.1 | -| `vectors/security.json` | security areas of format 3 and their verdicts | §29.3, §29.7 | -| `vectors/ed25519_strict.json` | Ed25519 signatures and the result of the strict profile of the author signature | v0.11 §29.9 | -| `vectors/mutations.json` | the mutation corpus: the 169 mutations of §64 and further cases | §63, §64 | +| `vectors/security.json` | security areas of format 3 in the context of a capsule, their verdicts and the lines that show them | §29.3, §29.7, §29.9 | +| `vectors/security_cms.json` | security areas with a signature of `alg` 2 or a seal of `seal_type` 2, each with its context, verdicts, results and lines | §29.7, §29.10, §29.11 | +| `vectors/ed25519_strict.json` | Ed25519 signatures and the result of the strict profile of the author signature | §29.9 | +| `vectors/note.json` | the data of the public note and the result of its rules | §24.1, §29.6 | +| `vectors/locator.json` | the extension `datekeys.capsule` of a `.dkk`, its envelope and its locator, and what a reader rejects and uses of them | §44.1, §64 | +| `vectors/mutations.json` | the mutation corpus: the 178 mutations of §64 and further cases | §63, §64 | | `vectors/inspect_differential.json` | 5110 mutations of fourteen fixtures with the verdict of steps 1 to 8 | §63 | | `fixtures/.dkc`, `.json` | official capsules and every intermediate value | §67 | | `fixtures/.dkk`, `.dkk.json` | official access keys | §68 | | `fixtures/.plaintext` | the content of each capsule: what the reader delivers in formats 1 and 2, without the padding of format 2, and in format 3 BODY, whose files its record lays out | §67 | | `fixtures/.inspect.json` | the exact output of `datekeys inspect -json` for each `.dkc` | §63 | -There are twenty-one official capsules. Five are in format 1, the fixtures of +There are twenty-six official capsules. Five are in format 1, the fixtures of v0.8.2, kept for compatibility: `time_only`, `time_only_extensions`, `time_and_key_portable`, `time_and_key_recipients` and `empty_payload`. Seven are in format 2, the fixtures of v0.9, kept for compatibility too: @@ -73,7 +85,7 @@ extension and a noncritical CONTROL_CBOR extension. The release that opens each capsule, a published Quicknet signature, is in its `.json`, so they all decrypt offline. -Twelve are in format 3. Their plaintext file is BODY, L bytes: the frame, the +Fourteen are in format 3. Their plaintext file is BODY, L bytes: the frame, the security area, the head and the files (spec §29.2). | Fixture | Policy | Files | Comment | L | Padding code | P | Area | Verdicts | @@ -87,27 +99,39 @@ security area, the head and the files (spec §29.2). | `format3_security_v2` | `time_only` | 1 | — | 659 | 2 | 768 | 512 | X | | `format3_signature_unsupported` | `time_only` | 1 | — | 659 | 2 | 768 | 512 | F1, S0 | | `format3_seal_unsupported` | `time_only` | 1 | — | 659 | 2 | 768 | 512 | F1, S1 | +| `format3_unsigned` | `time_only` | 1, `nota.txt`, with mtime | — | 32915 | 2 | 34816 | 32768 | F0, S0 | +| `format3_note` | `time_only`, with a public note | 1, `nota.txt`, with mtime | — | 32915 | 2 | 34816 | 32768 | F0, S0 | | `format3_signed` | `time_only` | 1, `nota.txt`, with mtime | — | 32915 | 2 | 34816 | 32768 | F4, S0 | | `format3_signed_cms` | `time_only` | 1, `nota.txt`, with mtime | — | 32915 | 2 | 34816 | 32768 | F6, S0 | | `format3_sealed` | `time_only` | 1, `nota.txt`, with mtime | — | 32915 | 2 | 34816 | 32768 | F4, S4 | -The first five were written by a writer of v0.10, with the area of 512 bytes; -a writer of v0.11 writes the area of 32768 bytes, as in the last three, which -`capsule.EncryptFiles` writes with a signer and a sealer. The next four only a -generator of test vectors may write (spec §62.1 rule 13): an area larger than -512 bytes, a security map of version 2, which a reader of this version cannot -read, an author signature of `alg` 4294967295, an `alg` that no version -defines, with a random key of 32 bytes and a random signature of 64, and that -with a seal of `seal_type` 1 and a random token of 32 bytes. None of them has -a verdict that stops the opening. +The first five were written by a writer of v0.10, with the area of 512 bytes. +The next four only a generator of test vectors may write (spec §62.1 rule 13): +an area larger than 512 bytes, a security map of version 2, which a reader of +this version cannot read, an author signature of `alg` 4294967295, reserved +for tests, with a random key of 32 bytes and a random signature of 64, and +that with a seal of `seal_type` 4294967295, reserved for tests too, and a +random token of 32 bytes. None of them has a verdict that stops the opening. -The last three are signed and sealed with test keys (spec v0.11, §29.8 to -§29.11), and their record has a `signature` object, and `seal` in the third: +The last five were written by a writer of v0.11, with the area of 32768 bytes: + +- `format3_unsigned` holds the content of `format3_signed` without a + signature, and its P is the same (spec §64: the same content with a + signature and without one, in the common area). +- `format3_note` carries the public note «Cartas del viaje a Lisboa», + `datekeys.note` in the noncritical array of PUBLIC_HEADER (spec §24.1), + which its record gives in `header_extensions`. +- The last three are those that `capsule.EncryptFiles` writes with a signer + and a sealer. + +Those three are signed and sealed with test keys (spec §29.8 to §29.11), and +their record has a `signature` object, and `seal` in the third: - `format3_signed`: `alg` 1. The seed of the test key, which is not a secret, is in `secret_seed`: Ed25519 is deterministic, so signing `author_message` with it gives `signature` again. Opening it gives F4 and the key `author_key`, - `dkauthor1…`; with that key among the saved ones, F3. + `dkauthor1…`, which `verdicts` repeats; with that key among the saved ones, + F3. - `format3_signed_cms`: `alg` 2, two certificates, an ECDSA P-256 one and an RSA 2048 one, each with a seal CAdES-T from a test authority, dated before the round time. The record has `signers` (SIGNERS in hexadecimal), @@ -152,7 +176,7 @@ edits of a base file, not as its full bytes: ```json { - "spec": "0.10", + "spec": "0.11", "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" } ], @@ -260,7 +284,7 @@ the flow. ```json { - "spec": "0.10", + "spec": "0.11", "description": "…", "vectors": [ { "name": "H2(e(G1, G2)), the generators of G1 and G2", "g1": "97f1…", "g2": "93e0…", "gt": "0f41…", "h2": "cb87319f24560b5231579a09ad79f12e" } @@ -293,7 +317,7 @@ length of PAYLOAD_AGE. ```json { - "spec": "0.10", + "spec": "0.11", "l_max": 8936830510563328, "vectors": [ { "l": 78000, "bloque256": 78080, "reforzado": 79872, "payload_age_bloque256": 78296, "payload_age_reforzado": 80088, "e": 16, "s": 5, "last_bits": 11 } @@ -396,78 +420,174 @@ extension. ## `vectors/security.json` Security areas of format 3, SECURITY_CBOR exactly as its SECURITY_LEN bytes, -and their verdicts (spec §29.3, §29.7), which never stop the opening. This -version implements no `alg` and no `seal_type`, so a reader of it reaches X, -F0, F1, S0, S1 and S2 only. +with their verdicts and the lines that show them (spec §29.3, §29.7, §29.9), +which never stop the opening. Every area is evaluated in the `context` of the +file, what a verdict needs besides the area: `control_commit` and +`head_digest` in hexadecimal, and `round_time` in RFC 3339. ```json -{ "name": "a signature of alg 0, and the seal intact", "hex": "a4006f…", "signature": "F1", "seal": "S1" } +{ + "context": { "control_commit": "0101…", "head_digest": "0202…", "round_time": "2030-01-01T00:00:00Z" }, + "vectors": [ { "name": "a signature of alg 4294967295, reserved for tests", "hex": "a300…", "signature": "F1", "seal": "S0", "lines": ["No se ha comprobado ninguna firma: trátala como no firmada."] } ] +} ``` X stands for both, when the outer map fails its layer 2 or 3: key 2 that is not a byte string, or an empty one, an unknown key 4, a byte more after the map, version 2, another type tag, keys out of order, an array. Otherwise the signature and the seal are evaluated apart, and the first row of the table of -§29.7 that holds decides: `alg` 0, an empty key or content that is not CBOR -give F1 with the seal intact, and a seal that breaks its schema gives S2 even -with an unknown `seal_type`, which is read only from a seal that meets it. +§29.7 that holds decides: + +- an empty area, as a writer without a signer writes it: F0 and S0; +- a signature of `alg` 1 that verifies over the context: F4, and one that + does not: F2; +- `alg` 0 or 4294967295, an empty key, or content that is not CBOR or has a + byte more: F1, with the seal intact; +- a seal of `seal_type` 1, 3 or 4294967295: S1; one of `seal_type` 0, one that + breaks its schema, even with an unknown `seal_type`, which is read only from + a seal that meets it, and one of `seal_type` 2 whose token is not DER: S2. + +`lines` are the verdicts as §29.7 words them, which an implementation writes +byte for byte. The valid signatures of `alg` 2 and seals of `seal_type` 2 are +in `security_cms.json`. ## `vectors/security_cms.json` Security areas with an author signature of `alg` 2, a CMS signature with -certificates, or a time seal of `seal_type` 2, an RFC 3161 token, each with -the context of its capsule and the verdicts of spec v0.11 §29.7, §29.10 and -§29.11. They complete `security.json`, whose areas have no valid signature or -seal. The file is frozen: the certificates and the tokens are made once, with -test keys, so a second implementation reads them and must reach the same -verdicts. Delete the file to make it again. +certificates, or a time seal of `seal_type` 2, an RFC 3161 token: 135 cases, +each with the context of its capsule, the verdicts, the result of each signer +and the lines of the draft v0.12, §29.7, §29.10 and §29.11. They complete +`security.json`, whose areas have no valid signature or seal of these kinds. +The file is frozen: the certificates and the tokens are made once, with test +keys, so a second implementation reads them and must reach the same verdicts +and write the same lines. Delete the file to make it again. ```json -{ "name": "alg 2: a required signer is absent", "security_cbor": "a4…", +{ "name": "alg 2: a required signer is absent: F5", "security_cbor": "a3…", "context": { "control_commit": "…", "head_digest": "…", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F5", "seal": "S0", "signers": [ { "holder": "Ana López", "result": "valid", … }, { "holder": "", "result": "absent", … } ] } + "signature": "F5", "seal": "S0", + "signers": [ { "holder": "Ana López", "issuer": "Ana López", "result": "valid", "seal_time": "2026-09-30T12:00:00Z", "before_round_time": true }, … ], + "lines": ["…"] } ``` -`context` is what a verdict needs besides `SECURITY_CBOR`; with `no_context` -the area is read as a reader of v0.10 does, without a capsule, and any -signature is F1 and any seal S1. `signers` are the results of the required -signers in the order of SIGNERS, and `foreign_signers` those that are not -required and never count. A valid seal gives `seal_holder` and `seal_time`. -The cases cover F6 with two signers, with a seal after the round time and -with a signer who is not required; F5 for an absent signer, no seal, a seal -from before the certificate was valid and a key 3 beside the signature; F2 in -the context of another head; F1 for SIGNERS out of order or empty, a signature -that is not a CMS, and the lack of a context; and, over an `alg` 1 signature, -the seals S4, S5 (also when the accuracy reaches the round time), S3 (another -subject, an authority expired at its time), S2 (a TSTInfo of version 2, not -DER), S1 (a SHA-384 imprint) and a seal over a capsule without a signature. +- `context`: what a verdict needs besides `SECURITY_CBOR`, as in + `security.json`. +- `signers`: the results of the required signers, in the order of SIGNERS; + `foreign_signers`: those of the signers that are not required, which never + count. Each has the `holder` and the `issuer` as §29.7 shows them, its + `result` (`valid`, `invalid`, `absent`, `without seal`, `invalid seal`, + `out of validity` or `not verifiable`), the `seal_time` of its CAdES-T when + it has one, and `before_round_time`, whether that time plus its accuracy + precedes the round time. +- `seal_holder` and `seal_time`: the authority and the time of a valid seal + of key 3. +- `lines`: the verdicts as the official SDK shows them (§29.7), byte for byte: + the names between « and », the line of each signer with its authority, the + warning that DateKeys does not check who issued the seals, and the times in + RFC 3339 with the fraction of the token. + +A time is in RFC 3339, with the fraction of the token when it has one. The +cases follow each row of §29.7 and each item of the lists of §64 for v0.11 +and v0.12: F6 with two signers, after the round time, with a signer who is not +required and with 16 signers; F5 for an absent signer, a withdrawn CAdES-T, no +seal, a certificate out of validity and keys outside the table; F2 in the +context of another head and for a message-digest of another message; F1 for +SIGNERS that break its rule beside a valid CMS, BER, two SignerInfo of one +certificate, the version against the `sid`, two content-type attributes, the +ESSCertIDv2 and the certificate of the signer; every hash and curve of the +table, RSASSA-PSS with and without `trailerField`, an attribute with an arc of +2^31 and a certificate twice; the names of the holder and of the issuer in +each string type and against each rule, `givenName` and `surname` before a +`commonName` with its NIF included; and, over an `alg` 1 signature, the seals +S1 to S5 at the edges of the token: its accuracy, its `genTime`, `ordering`, +a field after the last, the imprint, `crls` and the authority. ## `vectors/locator.json` The extension `datekeys.capsule` of a `.dkk` and what it points to (spec -v0.11, §44.1): a `.dkc` of patterned bytes in an envelope of age whose header +§44.1): a `.dkc` of patterned bytes in an envelope of age whose header (`envelope_header`) goes in the locator and whose `rest`, without a mark, is hidden in a `host` file at `host_offset`; the locator sealed with tlock for round 1000 (`locator_sealed`), with its plaintext of 4096 bytes (`locator_plaintext`) and its fields; and the data of the extension (`extension_data`), with the note `note` and the DateKey `datekey`. A reader -opens the locator with the release of round 1000 (`quicknet_rounds.json`), -finds the rest in the host, checks `rest_size`, `rest_digest` and -`capsule_digest`, and gets the `.dkc` back. The file is frozen: the envelope -and the locator hold randomness. - -`padding_cases` give the length of the plaintext of the locator for the length -of its CBOR without the padding of key 6: the least multiple of 4096 that key 6 -can fill exactly, which skips a multiple where the CBOR length of key 6 jumps -(a base of 4070 gives 8192). `uri_cases` give the verdict of the rules of §44.1 -on an address: the scheme `https` or `ipfs`, the raw ASCII authority with no -percent sign or userinfo, a host of letters, digits and hyphens or a public IP -literal, and a port from 1 to 65535. +opens the locator with the release of round 1000, which `mutations.json` and +the records of the fixtures of that round give, finds the rest in the host, +checks `rest_size`, `rest_digest` and `capsule_digest`, and gets the `.dkc` +back. The file is frozen: the envelope and the locators hold randomness. + +On the same envelope, the cases of §64, each checked against the reference +when the file is made: + +- `padding_cases`: the length of the plaintext of a locator for `base`, the + length of its CBOR without key 6: the least multiple of 4096 that holds it, + or the next one when key 6 cannot complete it, because 1, 2, 26 or 259 + bytes are missing (§44.1). Among them the bases 3837, 4070, 4094 and 4095, + which give 8192, those of the next multiple, which give 12288, and their + neighbours. +- `uri_cases`: an address and whether the rules of §44.1 accept it (`ok`): + the scheme, the authority without a percent sign, userinfo or a backslash, + the port, each character outside RFC 3986 and a percent sign without two + hexadecimal digits, the "." and ".." segments, written or with `%2e`, in the + path but not in the query or the fragment, the first and the last address + of each IPv4 block of §44.1 with the public addresses next to them, the + IPv6 blocks and the addresses that hold an IPv4 one, the names that only a + machine or a local network resolves, a last segment that is numeric or + starts with `0x`, and base32 that is not a CID v1. Then what the text of + v0.12 fixes besides: segments of 63 and 64 characters, or with a hyphen at + an end, the scheme, `0X` and the local names in upper case, an IPv4 and a + port with leading zeros, and a CID with the bits left over not zero, with + padding, in upper case, with a varint that is not minimal, with an empty + digest, or of 128 and 136 characters. +- `mixed`: a second locator of the envelope, sealed for round 1000 too. Of its + `addresses`, a reader rejects the first two, an `http` one and one of NAT64 + that leads to 127.0.0.1, and uses the third (`usable`), which finds the rest + in `host`: the locator reads all the same. A writer never writes it. +- `rest_cases`: a `resource` as a reader downloads it, the `offset` that an + address gives, and whether the rest read there opens the envelope (`opens`): + the rest alone, the host with bytes after the rest, of which only + `rest_size` bytes from the offset are read, a byte of the rest changed, an + offset that is not its own, and a rest cut short. +- `extension_cases`: data of `datekeys.capsule` and whether a reader can use + it (`ok`): without a locator, and unusable, with only + `ERR_EXTENSION_DATA_INVALID`, for a locator sealed for round 1001 beside a + DateKey of round 1000, a locator that is not an age file or is empty, no + DateKey or one that is not canonical, a note that breaks its rules and a + key 3. +- `plaintext_cases`: plaintexts of a locator of the envelope, each with the + defect that its name says or none, and whether a reader reads them (`ok`). + The bases 4094, 4070 and 3837 completed to 4096 with an empty key 6 or with + its length not in its shortest form, against the 8192 bytes of the base + 4094 (§76 of v0.12, change 7); eight addresses and nine, none, an empty one + and one of 1025 bytes, which make the whole locator unreadable, an offset of + 0 written, an offset and a `resto_size` of 2^53; two blocks where one + suffices, padding that is not zeros, a byte less and a byte more. An + address that breaks the rules of §44.1 does not make a locator unreadable: + that is `mixed`. + +## `vectors/note.json` + +The data of the public note, `datekeys.note` version 1 in the noncritical +array of PUBLIC_HEADER (spec §24.1): text in UTF-8, from 1 to 1024 bytes, that +meets the rules of the declared author of §29.6. A writer writes a note only +when its `result` is `ok`; a reader shows it only then, and otherwise treats +the note as unusable, never the capsule (§54), and says so. + +```json +{ "name": "a bidi override", "data": "61e280ae62", "result": "ERR_EXTENSION_DATA_INVALID", "detail": "a public note that breaks the rules of text: text: bidirectional control U+202E" } +``` + +`detail` is the text of the rule that a note breaks, without the code, as the +reference words it. Among the cases: letters that are not ASCII and an emoji, +an emoji with VS16, 1024 bytes, accepted; no byte, 1025 bytes, a tab, a line +feed, a space at either end, U+202E, U+200B, a byte order mark, a +noncharacter, a byte that is not UTF-8 and the UTF-8 of a lone surrogate, +refused. ## `vectors/ed25519_strict.json` Ed25519 signatures, in hexadecimal, and whether the strict profile of the -author signature accepts them (spec v0.11, §29.9): the equation of RFC 8032 +author signature accepts them (spec §29.9): the equation of RFC 8032 without the cofactor, A and R canonical, S below ℓ and A not of small order. They follow the cases of «Taming the many EdDSAs»: S + ℓ, the top bits of S, a non-canonical R, the eight points of small order as A, non-canonical @@ -504,15 +624,16 @@ reading flow (`capsule.Open`, §63) must fail. ``` - `name`: unique, stable. -- `spec`: true for the 169 mutations listed in spec §64, false for the further +- `spec`: true for the 178 mutations listed in spec §64, false for the further cases of the reference. The cases come in this order: the 33 mutations of the first two lists of §64 on the format 1 fixtures (cases 1 to 33), 32 further cases (34 to 65), the same 33 mutations on the format 2 fixtures, named "format 2: …" (66 to 98), the 23 of the list of format 2 (99 to 121), 5 further cases (122 to 126), the same 33 on the format 3 fixtures, named - "format 3: …" (127 to 159), the 47 of the list of format 3 (160 to 206), - and 3 further cases (207 to 209). A line of the lists of §64 with several - values, such as "AREA_LEN 0, 511, 513 o 66048", is one case for each. + "format 3: …" (127 to 159), the 48 of the list of format 3 (160 to 207), the + 8 of the list of v0.11 that a capsule can hold (208 to 215), and 3 further + cases (216 to 218). A line of the lists of §64 with several values, such as + "AREA_LEN 0, 511, 513 o 66048", is one case for each. - `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). @@ -551,8 +672,8 @@ reading flow (`capsule.Open`, §63) must fail. - `error`, `step`: the expected code and the step of §63 that fails. For a capsule that opens, `error` is `ok`, `step` is 0 and `verdicts` holds the verdicts of its security area, `signature` and `seal`, with the `lines` - that show them (spec §29.7): the three cases of security of the list of - format 3. + that show them (spec §29.7): the four cases of security of the list of + format 3, and seven of the list of v0.11. 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 @@ -631,7 +752,7 @@ that. ### Format 3: its list of §64 -The 47 cases of the list of format 3 of §64 test what format 3 adds, all at +The 48 cases of the list of format 3 of §64 test what format 3 adds, all at step 17 but the first: - `VERSION` 2 on a format 3 capsule, at step 14 (`VERSION` 4 is @@ -649,8 +770,10 @@ step 17 but the first: is not zero is `ERR_HEAD_INVALID`, but with the next STREAM chunk corrupt, or with PAYLOAD_AGE cut right after the chunk that holds the head, it is `ERR_INTEGRITY`; -- three cases of security that open, without a code, with the verdicts X, - F1 and S1. +- four cases of security that open, without a code, with the verdicts X, + F1, F2 and S1: a security map of version 2, a signature of `alg` + 4294967295, a signature of `alg` 1 that does not verify and a seal of + `seal_type` 4294967295. They derive from `format3_single`, and the two that need a head followed by another chunk from `format3_tree`. What a case changes in BODY is sealed again @@ -663,6 +786,23 @@ file. The three further cases relabel format 3 as 1, and a `time_and_key` capsule as 2 with its identity and with its `.dkk`. +### Signature, seal and note: the list of v0.11 + +Eight cases of the list of v0.11 of §64 change a capsule; the rest of that +list is in `ed25519_strict.json`, `security_cms.json`, `note.json` and +`locator.json`, and in the fixtures `format3_unsigned` and `format3_signed`, +which have the same P. Seven open with their verdicts: + +- on `format3_signed`, the signature of `alg` 1 altered (F2), removed (F0), + made again with another key (F4, with the key of that signature), with a + key of 31 bytes or a signature of 65 bytes (F1), and the area widened from + 32 KiB to 64 KiB after signing, which leaves the signature valid and + `AUTHOR_MESSAGE` unchanged (F4); +- the signature of `format3_signed` transplanted to `format3_unsigned` (F2). + +The eighth changes the public note in the PUBLIC_HEADER of `format3_note`: +`ERR_HEADER_BINDING` at step 15. + ## The checks of steps 1 to 8 `mutations.json` and `inspect_differential.json` follow the rules of the @@ -777,8 +917,8 @@ at least `step`, `name`, `ok` and `error`, and every other field. files in BODY, 12 + `AREA_LEN` + `HEAD_LEN`, `files`, each with its `path`, `size`, `start`, `end`, `sha256` and `mtime` when it has one, its bytes being those of BODY from `content_offset + start` to `content_offset + - end`, and `verdicts`, with `signature`, `seal` and the `lines` that show - them. + end`, and `verdicts`, with `signature`, `seal`, the `lines` that show + them and, with F4, the `author_key`. - `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 3185cde..d947ea7 100644 --- a/testdata/SOURCE.json +++ b/testdata/SOURCE.json @@ -1,8 +1,8 @@ { "module": "g.activething.com/go/DateKeys", - "commit": "ae334343bfa2433bd82b679c8119596dbd4840a4", + "commit": "601e6d217804eacadea48df9d1f4d4c9b22dacd2", "files": { - "README.md": "bc32fe488a0e4d2298a9048711c235661187ba57dc3f156767f8cb5b2f3e6416", + "README.md": "e56b52887b45b36af400a89aae34809f2f6be4366261255c68398761811e0584", "fixtures/empty_payload.dkc": "871e9bf05b52bbae17f3adfbbf97b46e7f0e53aa8f57bcaa506e43f36f53a9d4", "fixtures/empty_payload.inspect.json": "373e5d012b023ad58bbb54cbdffe0bed9e50c637438a4083ddb74d5414c59f59", "fixtures/empty_payload.json": "588c2573d99b953d490e3d9caaa392b804398b1f91d4f95492a01dd5e7e1f8ba", @@ -51,13 +51,17 @@ "fixtures/format3_comment_only.inspect.json": "fb56eca8bf42c8c47fde4a1d6b2580fcff386f2f58b566820731dce388542196", "fixtures/format3_comment_only.json": "8731bcb3641d7f99f63729e85f1e2960d3f38a6ac64bb3321369bfe3e21fa2b1", "fixtures/format3_comment_only.plaintext": "bc5b05885e608f036d8a14fde8738a8c53b395b71c3bcee99c1eab37ea23e80e", - "fixtures/format3_seal_unsupported.dkc": "cd3f68e430c8d41df92a364d65fe29b4aed8ec50e5129595735ede6a8d7df88b", - "fixtures/format3_seal_unsupported.inspect.json": "3300ec8a6024c4b7d4569e31100f8ee9b7d6ef6483120e79c60c4d7d3fec9d8c", - "fixtures/format3_seal_unsupported.json": "593310199c21384c393332de177dddf04ade56d8dd9891d4679fc5fd38e139c6", - "fixtures/format3_seal_unsupported.plaintext": "18e5a8d45af211d036dfe64fc4065c8ada927265200f48a3094aa7ded519b94e", + "fixtures/format3_note.dkc": "da1bee54231252a0fd98439e24588125c5521f6e5a2c6641b499e6b22192c0eb", + "fixtures/format3_note.inspect.json": "dcebb62407097c757bb62552be5d315155ba8a35dec175e95c3f6fddd6e81869", + "fixtures/format3_note.json": "b2778f8991c2ad9b464d0f45f495c94aae0da97a646df1ce401cf8847b9ce02c", + "fixtures/format3_note.plaintext": "0468737c5141be936f59d2823122e87661d4ae155a1df036b4cad1ea6620c17b", + "fixtures/format3_seal_unsupported.dkc": "ae3219fbdbd1de4cef6fade1a3fb3f6e5d5e2e8af54d9516b05f0a48136913ad", + "fixtures/format3_seal_unsupported.inspect.json": "b3a7a1038192394c1f844fed994011646f3e78d1cf311c18cb5c936249b95f14", + "fixtures/format3_seal_unsupported.json": "96e9338350ade00226b56e8461e54fbfdda1266de4e63e4c25eef6f84c96801a", + "fixtures/format3_seal_unsupported.plaintext": "0f865221d26545762712271faf835cb2e9980f8fb15c9d3b94fb6747cf16c1df", "fixtures/format3_sealed.dkc": "dde5a072d8783227d28279d06d3d226a1fb967c766da626f889d1c6fd76ac9c7", "fixtures/format3_sealed.inspect.json": "b984a0755332bad838025e47f8e917b9f18b9bb5c068c2d1ef0070db8e42849c", - "fixtures/format3_sealed.json": "52cda41e8d665c8c734124f9eeb8d4e81b15c59693dff62b3aba497d4aec910e", + "fixtures/format3_sealed.json": "acfec2917e798cd1e3f2b38e1ff4f6cee7474ca6b7684e739c8143b291fe91e2", "fixtures/format3_sealed.plaintext": "aea0f5feb40acd81ca3b02dd21ea15510234da3ab52b374322f3206e7632d47b", "fixtures/format3_security_v2.dkc": "3d02b39ace010d74604554e378d22fe5ce00cecd998c0f797d657b17620b8912", "fixtures/format3_security_v2.inspect.json": "dba4d21f1d4e228a17c761bae9a4b8c5a91cd9c0123e3141d3782a43c139321e", @@ -73,7 +77,7 @@ "fixtures/format3_signed.plaintext": "3de3ccab0ac74f95a76aa45c0f85e1749d4b4a051d87e81828eff6bf24372000", "fixtures/format3_signed_cms.dkc": "d658f8d5ac2c5550c07b8f8fd6883b2f6dc02ceafc47d436ea02d8950b2548d2", "fixtures/format3_signed_cms.inspect.json": "afadf530e8146687b25c03f26100ebff18e7f481e0ef09378816bad582270de5", - "fixtures/format3_signed_cms.json": "e88e549a0d0351df83c065a11101e3158b48d473aa9f6dfce1b8adbca96b26d7", + "fixtures/format3_signed_cms.json": "f05befb5fa9aafa2ee55fc7f3abe4832878b1950ae3b2e20915936ce20f12a9d", "fixtures/format3_signed_cms.plaintext": "31c35eeeee856277b605fe44203a8f4786bb8f591eda3b6ee58252df5b3cf2f0", "fixtures/format3_single.dkc": "9f68664af8733255084be9036a100b75d27bd16106bf0acff94ce469dd1d1743", "fixtures/format3_single.inspect.json": "7878da921c17aada50e00d5911ea97e8558633a1684fb96acbd00d6f1b117529", @@ -89,6 +93,10 @@ "fixtures/format3_tree.inspect.json": "643a9dfdc2d0c44b8a1636909c66ed81bfd8c50df2a4cad6566832a8e47ba938", "fixtures/format3_tree.json": "1d11d2f12603542039ac6b396ffec69e92bde2689fd54dfc9ef800b6b9f7746b", "fixtures/format3_tree.plaintext": "f69ac5f450966f7d0e9161aa37451d4260b194a750e3e132c02e8a15ba561cfa", + "fixtures/format3_unsigned.dkc": "317ab722ae3812a25ddd78b4c98c586363e5587c8d3634c881ce7c421af19168", + "fixtures/format3_unsigned.inspect.json": "2f52f7286d6bd4c846ddd63b10b4989b25d17501a989a2e9deb25e4db0859e1a", + "fixtures/format3_unsigned.json": "8ab91d2505d8c29eb09a5ac6060b16c48f5b5618e82ac8f28ecbe926df4ec009", + "fixtures/format3_unsigned.plaintext": "25527e5e2e1ce02056d4419fb89f7b0ce35e4920f93217f58dcf62a4377f8af5", "fixtures/time_and_key_portable.dkc": "2e97878078bae6358037a9c264f379a3cbe839f767d69836b0343f35657b2972", "fixtures/time_and_key_portable.dkk": "e528fa2c832c91119f0684bb9d6fb3c4c2d0d55183482890e7c4fe92f668426a", "fixtures/time_and_key_portable.dkk.json": "b057c25c9950533c01122cb907a43242b7538a7d427f8fa3cfa34ab6dfb7e390", @@ -116,15 +124,16 @@ "vectors/ed25519_strict.json": "342d866584435b291832d34deb9ce17aef10d99db148b85443e39e9bed321d0a", "vectors/head_schema.json": "3c7bcf57aa22943cd17005ea9ce426c0b3e7c365a0527a790b5e9e1973f9753f", "vectors/inspect_differential.json": "e8c99d025ec761690e71ee0c6adfcfd5b680cdcb89024463d8ebbc24be6b0774", - "vectors/locator.json": "a378453dadbafad4c18b5d9fdf4e49cd69f391e08cf16a04935c446395a9767f", - "vectors/mutations.json": "bd2f86fc13d50acd759acf36374df513687566bfdc5b391759c2040a0d796fb3", + "vectors/locator.json": "01370395ae53b363b5b0d0e2733fcb6fe0e20d7c64a5d20325ed3aa92beec859", + "vectors/mutations.json": "30719f97cba6e95fba0e077a5418cee50e216efd86080334c7d7e2d8c6dc247a", + "vectors/note.json": "d345861417b5fb8e3b1a56f39fdc58c7539cff85240496de3fd6edf7322a9ce2", "vectors/padding.json": "53d71fc9679d6eda3ba7b7a15752927a1a5fe026bdbd7f93b0ce3569a6a4b22a", "vectors/path_fold.json": "94c708bf04379984326f786ba1a954a94dc958fa06013c525e7f7a2c14f856bc", "vectors/paths.json": "3466da7dd82d82c1c43fe956eb91e674065d159c9326e3bc0dcbbe2c6b774251", "vectors/profile_quicknet.json": "c15ecb111635ecae2084da8511efbee133e97ff07c1c951658b036ce05b69781", "vectors/quicknet_rounds.json": "0f11bf5c5da88b1e929bb39439001a3a1f8447a85a4b3a25296d40d71a261e50", - "vectors/security.json": "c5c7a0a508daf6a56ee0d2a9a3c1982e8b2d5104621fb78e768bb2a69e5c4c85", - "vectors/security_cms.json": "c29458496bf58ad01514d7d0e0c2a3223a2a95a81d8c426ce642827363b43b68", + "vectors/security.json": "158df388fe881b75989e319eaadc88437b5031cd62f6c8cfc9cc421c3eacff89", + "vectors/security_cms.json": "1ef9c74f1998fc06ab459ab885e3654bf4375f5baa276ea2a1de3f08e64a32b4", "vectors/tlock_ibe.json": "27e9d9ebac4f07700661d2b4c524b10d065c9698e9acc68baa3d2c01bdbb24f2" } } diff --git a/testdata/fixtures/format3_note.dkc b/testdata/fixtures/format3_note.dkc new file mode 100644 index 0000000..bb94cad Binary files /dev/null and b/testdata/fixtures/format3_note.dkc differ diff --git a/testdata/fixtures/format3_note.inspect.json b/testdata/fixtures/format3_note.inspect.json new file mode 100644 index 0000000..8faf5e4 --- /dev/null +++ b/testdata/fixtures/format3_note.inspect.json @@ -0,0 +1,62 @@ +{ + "file": "format3_note.dkc", + "format": 3, + "capsule_id": "1999a39e1beae60b2fc9b157d11dab5a", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0", + "profile": "datekeys:quicknet:v1", + "round": 1000, + "unlock_at": "2023-08-23T15:59:24Z", + "access_policy": "time_only", + "public_note": "Cartas del viaje a Lisboa", + "valid": true, + "checks": [ + { + "step": 1, + "name": "parse DKC1", + "ok": true, + "detail": "magic DKC1" + }, + { + "step": 2, + "name": "prelude", + "ok": true, + "detail": "DKC1 v3, PUBLIC_HEADER_LEN=169, SEALED_CONTROL_LEN=458" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "169 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=1999a39e1beae60b2fc9b157d11dab5a 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/format3_note.json b/testdata/fixtures/format3_note.json new file mode 100644 index 0000000..f927304 --- /dev/null +++ b/testdata/fixtures/format3_note.json @@ -0,0 +1,160 @@ +{ + "description": "format 3 time_only capsule with a single file, nota.txt, and the public note «Cartas del viaje a Lisboa» in the noncritical array of PUBLIC_HEADER (spec v0.11, §24.1)", + "spec": "0.11", + "format": 3, + "file": "format3_note.dkc", + "sha256": "da1bee54231252a0fd98439e24588125c5521f6e5a2c6641b499e6b22192c0eb", + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "prelude": "444b433103000000000000a9000001ca", + "public_header": "a6006a646174656b6579636170010102501999a39e1beae60b2fc9b157d11dab5a037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d483004000681a3006d646174656b6579732e6e6f746501010258194361727461732064656c207669616a652061204c6973626f61", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0", + "capsule_id": "1999a39e1beae60b2fc9b157d11dab5a", + "access_policy": "time_only", + "structure": "time_only", + "unlock_at": "2023-08-23T15:59:24Z", + "header_binding": "804780b0f6ccb6fe5b29380750f350d51ce6a28f85602358ac4beae0fd2d57c7", + "outer_stanzas": [ + { + "type": "tlock", + "args": [ + "1000", + "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" + ] + } + ], + "payload_stanzas": [ + { + "type": "X25519", + "args": [ + "r26f17/u1yYeroTKE6Q+oAElUwD0C8K1iT6kH+2KNRI" + ] + } + ], + "control_cbor": "a60070646174656b6579732d636f6e74726f6c0103025820804780b0f6ccb6fe5b29380750f350d51ce6a28f85602358ac4beae0fd2d57c7035820e605364fc937c07d590a7fdaea14a2f0f6be6f8cb327b5a7c4b5f0054798d328064800000000000080930702", + "payload_identity": "e605364fc937c07d590a7fdaea14a2f0f6be6f8cb327b5a7c4b5f0054798d328", + "payload_length": 32915, + "padding": 2, + "padded_length": 34816, + "plaintext_file": "format3_note.plaintext", + "plaintext_sha256": "0468737c5141be936f59d2823122e87661d4ae155a1df036b4cad1ea6620c17b", + "header_extensions": [ + { + "critical": false, + "id": "datekeys.note", + "version": 1, + "data": "4361727461732064656c207669616a652061204c6973626f61" + } + ], + "area_len": 32768, + "security_cbor": "a20071646174656b6579732d73656375726974790101", + "head_cbor": "a4006d646174656b6579732d68656164010102582053e04e8d5cd8b60376e77e2df88643871c431f6da7fabd1a80b0c45078bf08db0581a600686e6f74612e7478740116020003160458205d596d5f49c179f0ec337f4610155fc237e727f9dee85377a5fce67a3c853510051a6abcf9c0", + "salt": "53e04e8d5cd8b60376e77e2df88643871c431f6da7fabd1a80b0c45078bf08db", + "content_offset": 32893, + "files": [ + { + "path": "nota.txt", + "size": 22, + "start": 0, + "end": 22, + "sha256": "5d596d5f49c179f0ec337f4610155fc237e727f9dee85377a5fce67a3c853510", + "mtime": 1790769600 + } + ], + "verdicts": { + "signature": "F0", + "seal": "S0", + "lines": [ + "Sin firma de autor." + ] + }, + "stages": [ + { + "step": 1, + "name": "parse DKC1", + "ok": true + }, + { + "step": 2, + "name": "prelude", + "ok": true + }, + { + "step": 3, + "name": "public header", + "ok": true + }, + { + "step": 4, + "name": "header validation", + "ok": true + }, + { + "step": 5, + "name": "sealed control structure", + "ok": true + }, + { + "step": 6, + "name": "payload structure", + "ok": true + }, + { + "step": 7, + "name": "condition", + "ok": true + }, + { + "step": 8, + "name": "tlock stanza", + "ok": true + }, + { + "step": 9, + "name": "release", + "ok": true + }, + { + "step": 10, + "name": "release verification", + "ok": true + }, + { + "step": 11, + "name": "open sealed control", + "ok": true + }, + { + "step": 12, + "name": "policy structure", + "ok": true + }, + { + "step": 14, + "name": "control", + "ok": true + }, + { + "step": 15, + "name": "header binding", + "ok": true + }, + { + "step": 16, + "name": "payload identity", + "ok": true + }, + { + "step": 17, + "name": "open payload", + "ok": true + }, + { + "step": 18, + "name": "commit", + "ok": true + } + ] +} diff --git a/testdata/fixtures/format3_note.plaintext b/testdata/fixtures/format3_note.plaintext new file mode 100644 index 0000000..802a401 Binary files /dev/null and b/testdata/fixtures/format3_note.plaintext differ diff --git a/testdata/fixtures/format3_seal_unsupported.dkc b/testdata/fixtures/format3_seal_unsupported.dkc index fcdb590..78d93e5 100644 Binary files a/testdata/fixtures/format3_seal_unsupported.dkc and b/testdata/fixtures/format3_seal_unsupported.dkc differ diff --git a/testdata/fixtures/format3_seal_unsupported.inspect.json b/testdata/fixtures/format3_seal_unsupported.inspect.json index 36c8bef..b004709 100644 --- a/testdata/fixtures/format3_seal_unsupported.inspect.json +++ b/testdata/fixtures/format3_seal_unsupported.inspect.json @@ -1,7 +1,7 @@ { "file": "format3_seal_unsupported.dkc", "format": 3, - "capsule_id": "3517684914fad908ad9e46d7f7b811d5", + "capsule_id": "8e2f648c77bd659a89ca95f96f213780", "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MjAwMH0", "profile": "datekeys:quicknet:v1", "round": 2000, @@ -31,7 +31,7 @@ "step": 4, "name": "header validation", "ok": true, - "detail": "capsule_id=3517684914fad908ad9e46d7f7b811d5 datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MjAwMH0 policy=time_only profile=datekeys:quicknet:v1" + "detail": "capsule_id=8e2f648c77bd659a89ca95f96f213780 datekey=dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MjAwMH0 policy=time_only profile=datekeys:quicknet:v1" }, { "step": 5, diff --git a/testdata/fixtures/format3_seal_unsupported.json b/testdata/fixtures/format3_seal_unsupported.json index a82f20c..5eff7fa 100644 --- a/testdata/fixtures/format3_seal_unsupported.json +++ b/testdata/fixtures/format3_seal_unsupported.json @@ -1,21 +1,21 @@ { - "description": "format 3 time_only capsule with an author-signature of alg 4294967295, as in format3_signature_unsupported, and a seal of seal_type 1 with a random token of 32 bytes: verdicts F1 and S1", + "description": "format 3 time_only capsule with an author-signature of alg 4294967295, as in format3_signature_unsupported, and a seal of seal_type 4294967295, reserved for tests, with a random token of 32 bytes: verdicts F1 and S1", "spec": "0.11", "format": 3, "file": "format3_seal_unsupported.dkc", - "sha256": "cd3f68e430c8d41df92a364d65fe29b4aed8ec50e5129595735ede6a8d7df88b", + "sha256": "ae3219fbdbd1de4cef6fade1a3fb3f6e5d5e2e8af54d9516b05f0a48136913ad", "release": { "round": 2000, "signature": "b6cb8f482a0b15d45936a4c4ea08e98a087e71787caee3f4d07a8a9843b1bc5423c6b3c22f446488b3137eaca799c77e" }, "prelude": "444b43310300000000000079000001ca", - "public_header": "a5006a646174656b6579636170010102503517684914fad908ad9e46d7f7b811d5037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d48300400", + "public_header": "a5006a646174656b6579636170010102508e2f648c77bd659a89ca95f96f213780037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d6a41774d48300400", "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MjAwMH0", - "capsule_id": "3517684914fad908ad9e46d7f7b811d5", + "capsule_id": "8e2f648c77bd659a89ca95f96f213780", "access_policy": "time_only", "structure": "time_only", "unlock_at": "2023-08-23T16:49:24Z", - "header_binding": "2c34950c31c80b62c31da9aa1ca72cf46d38361a60fdf37519c1f734c6646fb9", + "header_binding": "c6518ed7bd02c8f121493170776eb6c43e2c8162e97a9a6225b310a1836da612", "outer_stanzas": [ { "type": "tlock", @@ -29,21 +29,21 @@ { "type": "X25519", "args": [ - "sfu28SAWdZaPq6c3v4bLopEk8YveD80i8b59V4JMfkM" + "nhJ/XFoarftmX9LumtcoVsCBMxXMYQgJwuYYEG8lg3M" ] } ], - "control_cbor": "a60070646174656b6579732d636f6e74726f6c01030258202c34950c31c80b62c31da9aa1ca72cf46d38361a60fdf37519c1f734c6646fb9035820a0cae1dd0fb24ae1ea350ad408afa77bb040fe4553ca5a5e6283be84f1775184064800000000000002930702", - "payload_identity": "a0cae1dd0fb24ae1ea350ad408afa77bb040fe4553ca5a5e6283be84f1775184", + "control_cbor": "a60070646174656b6579732d636f6e74726f6c0103025820c6518ed7bd02c8f121493170776eb6c43e2c8162e97a9a6225b310a1836da6120358204b0e0832574c11b161d7bab4d37582fde331eabb027f7d26c23cf11113fd5cc8064800000000000002930702", + "payload_identity": "4b0e0832574c11b161d7bab4d37582fde331eabb027f7d26c23cf11113fd5cc8", "payload_length": 659, "padding": 2, "padded_length": 768, "plaintext_file": "format3_seal_unsupported.plaintext", - "plaintext_sha256": "18e5a8d45af211d036dfe64fc4065c8ada927265200f48a3094aa7ded519b94e", + "plaintext_sha256": "0f865221d26545762712271faf835cb2e9980f8fb15c9d3b94fb6747cf16c1df", "area_len": 512, - "security_cbor": "a40071646174656b6579732d7365637572697479010102586da3001affffffff0158208beec85fe1db5d53dfa1fa5b95afe208c355a1fabe0d3637c1acc09fef0f04c10258400ccc209b32e7826b70b4befbe7bbe504584631422a3b51086e9491885e8aac6d2a0c92c4c85d6c03750ddaa2d873f6d4dce20030b31669f347ee6b9b4f3abd56035826a20001015820c19dc75c9766f13383b991f54a7cfcb16701ad0299fa68d84c5ce2e82a8f18d7", - "head_cbor": "a4006d646174656b6579732d6865616401010258208eb5e2f0920209323e39c54391a74cc873690cd6d7ce94a45b12772f2a5081c10581a600686e6f74612e7478740116020003160458205d596d5f49c179f0ec337f4610155fc237e727f9dee85377a5fce67a3c853510051a6abcf9c0", - "salt": "8eb5e2f0920209323e39c54391a74cc873690cd6d7ce94a45b12772f2a5081c1", + "security_cbor": "a40071646174656b6579732d7365637572697479010102586da3001affffffff015820d956dada75e3501522321d0e57c5a06dc64e07c394e6e5666f5de65b38871732025840b1f86cea4dfa61201710331694cd3fb811eeb32f7d983d9c5679c5adc41ba25fe5b82d48a74ec76d5db3f887745d0681f2a221c71b014324e8b6ad324a4234b303582aa2001affffffff0158206721210782b8e419b97c9e620bc6247ef6775929a04eb075aaac927687283a9c", + "head_cbor": "a4006d646174656b6579732d686561640101025820f9526586bc95f1bc1a375fc7575c71081312626445cce4aae63a095e35afc84a0581a600686e6f74612e7478740116020003160458205d596d5f49c179f0ec337f4610155fc237e727f9dee85377a5fce67a3c853510051a6abcf9c0", + "salt": "f9526586bc95f1bc1a375fc7575c71081312626445cce4aae63a095e35afc84a", "content_offset": 637, "files": [ { diff --git a/testdata/fixtures/format3_seal_unsupported.plaintext b/testdata/fixtures/format3_seal_unsupported.plaintext index d9f916e..c4f27ee 100644 Binary files a/testdata/fixtures/format3_seal_unsupported.plaintext and b/testdata/fixtures/format3_seal_unsupported.plaintext differ diff --git a/testdata/fixtures/format3_sealed.json b/testdata/fixtures/format3_sealed.json index 4b61906..06fc87c 100644 --- a/testdata/fixtures/format3_sealed.json +++ b/testdata/fixtures/format3_sealed.json @@ -60,7 +60,7 @@ "seal": "S4", "lines": [ "Firmado con la clave dkauthor1jtf6s2c7ywr6scx40jhye32sj82rjp8a6cj7f54jsh36rd96vaqqcg54xg. No prueba quién la tiene.", - "Según un sello a nombre de Autoridad de Sellado de prueba, existía el 2023-08-23T15:09:27Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2023-08-23T15:09:27Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." ], "author_key": "dkauthor1jtf6s2c7ywr6scx40jhye32sj82rjp8a6cj7f54jsh36rd96vaqqcg54xg" }, diff --git a/testdata/fixtures/format3_signed_cms.json b/testdata/fixtures/format3_signed_cms.json index 2d4813e..84b6165 100644 --- a/testdata/fixtures/format3_signed_cms.json +++ b/testdata/fixtures/format3_signed_cms.json @@ -59,9 +59,10 @@ "signature": "F6", "seal": "S0", "lines": [ - "Firmado con un certificado a nombre de Luis Gómez, Ana López. DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", - " Luis Gómez (emisor según su certificado: Luis Gómez), sellado el 2023-08-23T15:09:27Z, antes de la fecha de apertura.", - " Ana López (emisor según su certificado: Ana López), sellado el 2023-08-23T15:09:27Z, antes de la fecha de apertura." + "Firmado con un certificado a nombre de «Luis Gómez», «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Luis Gómez» (emisor según su certificado: «Luis Gómez»), sellado por «Autoridad de Sellado de prueba» el 2023-08-23T15:09:27Z, antes de la fecha de apertura.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2023-08-23T15:09:27Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." ] }, "signature": { diff --git a/testdata/fixtures/format3_unsigned.dkc b/testdata/fixtures/format3_unsigned.dkc new file mode 100644 index 0000000..624465e Binary files /dev/null and b/testdata/fixtures/format3_unsigned.dkc differ diff --git a/testdata/fixtures/format3_unsigned.inspect.json b/testdata/fixtures/format3_unsigned.inspect.json new file mode 100644 index 0000000..1e49281 --- /dev/null +++ b/testdata/fixtures/format3_unsigned.inspect.json @@ -0,0 +1,61 @@ +{ + "file": "format3_unsigned.dkc", + "format": 3, + "capsule_id": "0cced8e8b035d6dd70f39923b407a96c", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0", + "profile": "datekeys:quicknet:v1", + "round": 1000, + "unlock_at": "2023-08-23T15:59:24Z", + "access_policy": "time_only", + "valid": true, + "checks": [ + { + "step": 1, + "name": "parse DKC1", + "ok": true, + "detail": "magic DKC1" + }, + { + "step": 2, + "name": "prelude", + "ok": true, + "detail": "DKC1 v3, PUBLIC_HEADER_LEN=121, SEALED_CONTROL_LEN=458" + }, + { + "step": 3, + "name": "public header", + "ok": true, + "detail": "121 bytes" + }, + { + "step": 4, + "name": "header validation", + "ok": true, + "detail": "capsule_id=0cced8e8b035d6dd70f39923b407a96c 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/format3_unsigned.json b/testdata/fixtures/format3_unsigned.json new file mode 100644 index 0000000..c94e6a8 --- /dev/null +++ b/testdata/fixtures/format3_unsigned.json @@ -0,0 +1,152 @@ +{ + "description": "format 3 time_only capsule with a single file, nota.txt, as format3_signed, without a signature: the area of 32 KiB of spec v0.11 holds the empty security, and P is the one of format3_signed", + "spec": "0.11", + "format": 3, + "file": "format3_unsigned.dkc", + "sha256": "317ab722ae3812a25ddd78b4c98c586363e5587c8d3634c881ce7c421af19168", + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "prelude": "444b43310300000000000079000001ca", + "public_header": "a5006a646174656b6579636170010102500cced8e8b035d6dd70f39923b407a96c037853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300400", + "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0", + "capsule_id": "0cced8e8b035d6dd70f39923b407a96c", + "access_policy": "time_only", + "structure": "time_only", + "unlock_at": "2023-08-23T15:59:24Z", + "header_binding": "36fac05bdec31225c4249bbdf14381b72c28e9dc8d6eec8af2500ec83c03ea8c", + "outer_stanzas": [ + { + "type": "tlock", + "args": [ + "1000", + "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" + ] + } + ], + "payload_stanzas": [ + { + "type": "X25519", + "args": [ + "NcekpxDZyrUYH4JypnvSI6VsJ70XDGb9dNeny2xewlQ" + ] + } + ], + "control_cbor": "a60070646174656b6579732d636f6e74726f6c010302582036fac05bdec31225c4249bbdf14381b72c28e9dc8d6eec8af2500ec83c03ea8c0358204207790feb87ae42795751d6a28fee2af78359aeef98f1dc9faef32e9c7ddba4064800000000000080930702", + "payload_identity": "4207790feb87ae42795751d6a28fee2af78359aeef98f1dc9faef32e9c7ddba4", + "payload_length": 32915, + "padding": 2, + "padded_length": 34816, + "plaintext_file": "format3_unsigned.plaintext", + "plaintext_sha256": "25527e5e2e1ce02056d4419fb89f7b0ce35e4920f93217f58dcf62a4377f8af5", + "area_len": 32768, + "security_cbor": "a20071646174656b6579732d73656375726974790101", + "head_cbor": "a4006d646174656b6579732d686561640101025820503815e579869d0498c3267596adc6555a6d9db770c834f5ba0e5ff8fc08fec90581a600686e6f74612e7478740116020003160458205d596d5f49c179f0ec337f4610155fc237e727f9dee85377a5fce67a3c853510051a6abcf9c0", + "salt": "503815e579869d0498c3267596adc6555a6d9db770c834f5ba0e5ff8fc08fec9", + "content_offset": 32893, + "files": [ + { + "path": "nota.txt", + "size": 22, + "start": 0, + "end": 22, + "sha256": "5d596d5f49c179f0ec337f4610155fc237e727f9dee85377a5fce67a3c853510", + "mtime": 1790769600 + } + ], + "verdicts": { + "signature": "F0", + "seal": "S0", + "lines": [ + "Sin firma de autor." + ] + }, + "stages": [ + { + "step": 1, + "name": "parse DKC1", + "ok": true + }, + { + "step": 2, + "name": "prelude", + "ok": true + }, + { + "step": 3, + "name": "public header", + "ok": true + }, + { + "step": 4, + "name": "header validation", + "ok": true + }, + { + "step": 5, + "name": "sealed control structure", + "ok": true + }, + { + "step": 6, + "name": "payload structure", + "ok": true + }, + { + "step": 7, + "name": "condition", + "ok": true + }, + { + "step": 8, + "name": "tlock stanza", + "ok": true + }, + { + "step": 9, + "name": "release", + "ok": true + }, + { + "step": 10, + "name": "release verification", + "ok": true + }, + { + "step": 11, + "name": "open sealed control", + "ok": true + }, + { + "step": 12, + "name": "policy structure", + "ok": true + }, + { + "step": 14, + "name": "control", + "ok": true + }, + { + "step": 15, + "name": "header binding", + "ok": true + }, + { + "step": 16, + "name": "payload identity", + "ok": true + }, + { + "step": 17, + "name": "open payload", + "ok": true + }, + { + "step": 18, + "name": "commit", + "ok": true + } + ] +} diff --git a/testdata/fixtures/format3_unsigned.plaintext b/testdata/fixtures/format3_unsigned.plaintext new file mode 100644 index 0000000..17f7001 Binary files /dev/null and b/testdata/fixtures/format3_unsigned.plaintext differ diff --git a/testdata/vectors/locator.json b/testdata/vectors/locator.json index a2b72aa..8fc3cf8 100644 --- a/testdata/vectors/locator.json +++ b/testdata/vectors/locator.json @@ -1,17 +1,17 @@ { - "description": "The extension datekeys.capsule of a .dkk and what it points to (spec v0.11, 44.1): an envelope of age with its header apart from its rest, the rest hidden in a host file, the locator sealed with tlock for round 1000, and the data of the extension. Frozen. See testdata/README.md.", + "description": "The extension datekeys.capsule of a .dkk and what it points to (spec v0.12, 44.1): an envelope of age with its header apart from its rest, the rest hidden in a host file, the locator sealed with tlock for round 1000, and the data of the extension. On the same envelope, what a reader rejects and what it uses (64): addresses, a locator with rejected and usable addresses, resources of the rest, data of the extension and plaintexts of the locator. Frozen. See testdata/README.md.", "spec": "0.11", "round": 1000, "datekey": "dk1_eyJ2ZXJzaW9uIjoxLCJuZXR3b3JrIjoiZGF0ZWtleXM6cXVpY2tuZXQ6djEiLCJyb3VuZCI6MTAwMH0", "note": "Cartas del viaje a Lisboa", "dkc": "ee03814d73b55af618455bc90321bd0c27b16b8b440f1b954664218ecddcf4f33d3838f839d7549fcacc8ab912af943afead15c99524c0bf9a637099db4164c0c010e8201b3ca44f1c2563670910c5dc76aacad8d31a939be742afb6f985971cbc3167a73f7b5700213f35758b8981f210dcab1252433673930e4f7fe2cfc048270c2af4f9e22b8ff2cb2e09c6cc964b02b21b83a0fd293c446c55e1a2ebdd2cbcf997c264602c92d42524b1cd712a506634090180608822f4360d733be5b47bb4ea4018bc3eefe429c1745c809e2a08aeeb897563ab46c9d2fdf834e57d7f1fd5d76f2e583d571ce055a52e2fa15000a0cc387f088767f1177c68af7141f338b71499c05488e90f0c5440c775eff25469a30bee7568b1a1faf998d865f7894bf8b677739e191612774ae8dccc30c8ebc0983edccbfc817cda3b74438bf6f7d761377592db4f52100a19e3b0bbc69273b01d54e2bcd843b5936841cebab1a20d8986b6ba3c23248ce762ac072032cf85a36a3f9cf4059b41f0b0fc2ccf96723552f2a20f6baafa661d1a202bdab2c22028020152d3c5118387ca32b8da9928d303bd2f2a1d1845c01c679d47c31bcbf823dbca5556c7e66315751ddf0e1f97dee3c703b7545cd84217d680470b01f0d57c7a902eacce78e25374fe13b4d7a001e660df9f0a5eaa1499483d08554ab314e6222288e55e1f1c3ed93d897fa3424fee8e13140407950dfc68ba1db731b72028fefd21d8c368fac10a186a73a1310b9d9a65637d54ec9f0a022fe0cca3a2cc81818510568b94c4531ce6c00017b9303c202ff40dc3dd70fb9a8e221773fd57c77b82ae7f4bcaa71fce11edc7e6bed299f5d8b306e2f3ab0f6952f62fe7b61f2358966eaf9f933b538e960ba7536a87ceba023881f1ee66fd9c5c4a7a05548ef93916a32f0d735dc517fde4e787b85c430a1eaf7442f0b71dad8f46c097f624c64b6d3c8bba7824e1d5cda3c43376f0125638b905abc0e0a6be8c3637095c6664df17d234c077a78e6a588c259db83ef42df60744df33c6c7f184092d169a3b4eb703d5936fee55ddf83be09944a6af840ad6d1507c5888111288cd898d6e3a2fb9746c0b62d7ffd7b486e6a507a9cabd14f47b431f26de3470be86021f5a16ea48b7740f9745d29f1cf0bde23a4b639464ceee378bfd3b45040609b27cfd57c31334ef011d94d971b9a5395384d3fb15ead0d7a0e7c01155f0a142b77d85f8196056a55aeac01fa01bc9c33632f242eca3413af62e105448d60c63b84d83f13ce52875c205c8a680f588e6971ac0bc70650a2126e8c105d66b8fd8c812c10f8513238c140bd5c91532e45341b77df32f5f3370f813408f7c3ead91dc17db1d93a722e992fc9539d5a6186d4ccbeca31478286b9891fb9513a961127546c55f3255168fc3cebdd6266837d2bc41e2e5f015f4f7686b6c3fb213e856b47946f6d9f682c4fceb30485dca116067a37090b8c01c45db406fbb920e6825d5cbfe8bad8f965630bb645146d966e8d326d0e24cd330b8d9774ad36a8204e427c6b0ba20db20d03b80d9b94b9e72305a0ee69ca6339df880f329a2a628b1dddf2e90c344c2db01e559332916533a4ef4f4c7d9404da29436b31b81280739fe15eab10d1b4dca7f28b342a25e15f9c21a1bee2b9a10264a2de383a9f1e9aa2bad94366a7eca3764d7fca5bb21a772a70af20a9b8fa02da25a0061fcb7d70b1e819a617b26811a657d9be611c36ea1f9cf15957b50cc4d215db052809e9796f089f4c94e94e852313c7a36b6aaca542090e1d64eeca08b42b266974053a85cc955c0cbe326a5d862ad4a5de60b51957a71c5c49633c7c838c8f5846d85a6f76ad8087c27df203c39997e4efee96a240fefe5900405d91a400d98392cd45079af48b149ec7c95e99a22e8cf024f52f759d47595d6c90c0619a7c9f2001fbaf92a0d43655a3e62653c04c99d56b50503a9487c45e6eb019e926ae451e6eda6ec9f0d4184e0a5dcab7264aa3ccd3df08c482d00bc5b5effe623accd1516dffca98376b9fd596b3eb9e6af0d6d390fc16ec011192ae73d681ce540a19522c19a283d6ccb9906893a222f598d782bc7fa1069011d9e9c5225280c26572ef0e37554ad877d2b64cc8a6f86f06e6fae2009827be6111a88160c98b2980b5c4c16497de5a1e75a307ff9ac581c52e9508916b9138e9df24298d79f280e6003c174c8f88dbcfef977a6309f7db96c44e99b9f43268d2367ef12f879b2ea906c3a555bfb9c09e6e3d10d6b742adb6b4e90bca6572fb4ed3651acfd81642954936e7dc97f034b7e42c08e1838e9032e982e705dce629b00204bf862b7e254a8b49c7b940647f5cf27b5673d4eb1b723ebafaae178acdb5b2e2d4a4176a944e7922ea81f175c6ca09970f602782ed17f71635c4679fb19fe64d9896982575ba2e7ed4f5913dff51d0fdc99b25ef51c88cf3922b85b1615e1943b0d9b69599711e9f0a3664d1d1beeeb81648b579b8965104a0242ac4eebd2c20fb2756dbbe6358a09da0bd4dd543232aa54a92d2a4027b620b51eb80fe8e169061442fc742a70ba449575a3bb83c2a91bff8d249151d99712bc4c413a455ecfeaeaafe14e5ef8f02398d75c1ab697fb2a98c08ed58abe46808445528722b2cd532e08492826d6b9d13a3e564f51a99608d28d13a16a5082a7e20600fc229f7736b3f555f84a49499b15c812b2880842dd0b2cb9865ad9d9499d8304ce32ae6437bbc3dfcd53b7cbb3c07d4b719b48be8ab6848ab4cc7455c5a08c94fb48c003cb65231cf619cba729d9735acd842b3f5dd01809875dd287b6f4bf27f3e4a8e9a796eeb8b80709fed6ef83e598281e679294d32e77ea15927d8f777a8fee3e9e00fef8a4de04a58feb64fed01ca14ced9dea6ee4eea43a0960a5e9e5803b7c778e1125cc981b935099854696c874c7be4d63be2ba06b185b99c949a18b261a72ef52aaf371dd241391c920737ac1dfe17a200d1fcb9a1cc16ed72c5df1b7af3b5ed4f7b3f718d28fb4b6f27bd49175d2a6946b5940cb8bf1dbd0d786cc0a968c0044ff3c172d5841a28c14bdd611fad3029b7601206404594b29adf1efb0d5640fb7422a7ea2d3db8c2c65a3e8bcc65cb2fe7ef724f9cf82159ea6984ec85a4a172d689f614e9a0a0c5893b019fa0701ef339de724395b9f9fce48402f2bf069e2ae51fb23c6cacf58ce3f0dbf927f3ebe888f63b7f3dd10895c99dda8fe60820e8beb18b3490797575fc2ed009f777f9f205b7001cc47fe03d45d022f726376fc9908e66b4659a218e7106929c0443c0deb51c1d36b8783bd4fb91956d80ef2820d6806c2594fdebe33ae620e5e9e816649a6f3ded5943ad676b57d2e8180444d23fdc94c1245008c26e7c726fe1c35d7c33b9a48e3f456317006ed0c8651331b50797f85e22c49e5e3fa34dec19ac7efa9bbd4fe6d529c5e59213c2b1b51657ddb051fc52eb1c6eb24a718d7053a7ddedad40822adff1bdd7957e85b7170eb743fc579aea19daad4f7a6388273916cb66c69e90c9ede83ac8f88fe097d2b752da0c3b2b5d3ca98d4498aca32169b3e7fbe5d8d14a51983a5cfe8f9b775654b244243584278213ee6c5807c67e845213049ceb02ab4b9a52ec1cff8f69ee53794f637aefa865a1f0f3649a14eacf03edb19c777876cbf8c959cb41f86ccb6d5451a1a1c4b3159d89127c6d1f04a1c751c2aba4289d629112e54e2bb119110cc180f6d4ad9857620081813268c50fbf850437e5940843c62c3efaa210a2a318c4e6b4cf89dff2c886d1495043cc9fa1eadf7c852114817f3df7cd1adc0915777e8f83f1bfdfa056f2dcf3d4cebedd888bc70e4f762399ae8979288333be650d00349ebaab3da70e2b48b3a42d9225ed0dec5ccb24e6f73028032763cce6b645abc50af5588c052539ccbae09159b9d5ce17abd7d491aafa904f5c2b4f284f7b19be9a91ab6bb9542cdef9bbb217767e65d38769602e3a6a355889fbda04679e78cb1b4e7b880014f81b623c4c38e19c7b013c8992a0c103dcddb68c0a6d35376d132550a1e06d590e55f4e7bfbc7b8eba4d5d7c923e428551cbafa3d5e31f94ccb38d2b40fbb07cfe35ae7d1538871707a1aff5b91c33e1420a4632d91c5c2cca2838f30768c60ab6a26261d3d74b59b7173a38917b06f866d11b89ef999a2df8b3592f5ce42fb230a095626be28a46015d4106b78a41829f8455fe4e36d473c78bab24cfbbcdc7e11ee6cab0703abd82d86fe0ee1e7c07b82515f453a7bc5cccf67240456b00305908fa926945718b9bedb8c007d59b103e8dcdcc42e2941489e6ce51bde77cc5e556337f08be392181e9325b60e32bb3bac79c1cde2a6bb671ae5bb35d108f676f963feca6aa0eb47de54903ecedbbd46bca7fda54d6854bad92b98e66fafbdaad17c23f9e1b2998b6760cadd57b91182a4e43735a47de9006905a29dd73347592ccb5c4a5230b5e2d4059ed055eb3034f3bfc018360f0549b1a6b2367d6323af05038dfab8db4b35acbec3297ff5e9751185641fc6d772a1e617a615be2d18ba1ee9499851d63b0b921a7ac15e04c4a2507ef25775510fee6b051b5d0c2d210309b1ead2d3f91bbe319032b647dcd7b0ba9563c2800b49c5c5b91a1ac8a2f9032e52f1edbaf2a5ae492b34011e58870d712eb29bfa6b1562cefda3fa1fc0edf17c518446b1b120ce11b416a596cd381eb0be752a5b7ce1d23cea27ad1792667d182bdd11281e80ed8ed9dccc94ba98fd2e6c3895a4f21cf99c11ae36e40ce03c37496ebc2cab7b808b394557266d3ab1d8386abc04ff79bfb38d7fdb4a0e5dd32308475e9860d1a9d73d282c377f35ca76a0a99edcc3140d990cc85dc9a40be0920913ed67e4c4957d728ba038e4b43f983b727e7be0ca5b866bc403f4395e3eed91f224f7cbc0cefda0fcab8681489e56be77bd61ab269805b07d025806c5d74f8c858597960150442688bf97565826146dfbc6a2932580caf1a8a527d27cf8ecabaf9145862ca57f2a5a775cf6b534c186d5ae06ab1e5b82f91931eb07f163f23c04ec8230ba5d1a8930c31d3e622f2c83bd593489c56d6aef562d518a155e28ee6e2b5ac5577a44754b3bd631dc2a643af50cbb9eb6ad5bb21291980f64d7b91348f1aa2fcd8acafa1de5ae890d5143648a2d2bcea7053ea58d3a48d4b3222c36069cdadcba4bf94fca38b406138e4ba188602b286dd7222b86c15146f4e04bae67abcaf5c6cf802d0fade9190dd4aceb47f41e2177c2254a67f4c3fe5d30430d2385094d99da73d98b5c6adcce3b0b4091baa14f522115c145c31f7c9eabe4317d3dc335d2d472df9b250b2c9fc0d1fd1ee15155eca4de87397c5815329069d655d2974e5ef5737d1153a78ea1fcbedb03bcbca663d750e32365f3ed527738c66ac34b5d0fdd1f65afa77c2a322cecd27ceadd2559b1edc51eb44a529011955866d2ac01d3bfdeacb247e8e0fd219492ebc68287849370d5fadb9c1b71b7f4ff4c645ffb6c7ddacea49ab0e79f9c7c83311635593f6a9326877cefe284902e3de0f0d339af7692fe39aef0b3304e4dc45419ac816e61c6090dccec275b1efeed2debdc589a0e4923432469ac24cebe6a0a05fb7d9f0fac9a5f3f88f31cf4d3d725feb6c0066f6fc6c13464a0b2c22e48633dd1ef9c87b18609618fdc5ce4a78358fc82cd6182b286f7a3c915fd0d3732885769332af100f89359f6ce5e4611db542ecd2b9cb751e2e6cd8a5cb0c878886eb84c0d0702cae0a837d161de86aefef6089b2281d6986d478a6edd9a2873106ec42818d6bc2bc2c6de0b10f90354a0733dcaf1c1553cb5e49eed6f24dc15bca702c9502660404d249dc15eda4a854a60c08d4f6e51e291275a53ffb4be824036b3cccd792a67121dc6287ddd70f520447f274459b90d08151ff71ce9b81ce328970359aa7e9278ef85b7a4c8b73a6c9cf1bd8b64ecc8a5d6a5ae859bb8ac5599b20f55b201a389f01aaa7c9933bd79ea7f4cda9a6d0dd5fab81b5559cf9baa549aa74b22a458959b4a925399415693403a2d75e524b5465985cc05f856a7418bce674d642195cbd7d6d3bd5e2cd0ac57fbf293695a9f6d1dab534623665ea31a666cb633497fc597f6a51014ee58c0cca27c2ea8daacdc77770b16178092df935ce9616c95e5ba77e23662f79b6cab6af60c00096361bdd43c94005baf3a321ac3515f6858c60207305f6bd2e28e913354a20d7d5f98a09dba318899d2c9b553129ec2c0673dac849a05c086d6b9fe58b449000c198705cf982fb8ffde27b429ba51103c8d9cafa25b2d34f2a08b28f32d4f3bce6595c4cd9d8c6a482372b0b2c2544036dd43c8ceea748e1b92017a9a03db8719db6560a16e5d88b175fafce2d180c9516db3ed1c627dc3043e0a9aa3ce5bfab086d1bffb5e7efca18803fa0112cb281901e9a77bb7eeefc25169473b99049c06faa36c3306101689f4892bb5056513ce7e73dac906bcc0b721f34266470af08220737f7eb458403746cfc0571fd021e52a87ea03120ab19723a746805ccfa7a445ec25f4eb234a5f18856589012b86f7d3cce63c04faa1097c2e91c829d290dde41734f4cc11f0340423e1c9072348ba80a68846bf61b619a82b956ef6e7d41feb24ccf000a50a159beda6276cae4d18f98dd56fb7dd25e773ed147e7198663ba077382a6ebb9ff9aa07612ca04d0126de1dee66d3ba8c4e2019c6fda91a3b716dedf61f6db20c2a2a1183efd18e70cf584c0696c02e594bf43575c6f23f4383b42f05619853af66f769a756b59ad1f469a480924994cf514e5b6a5474ea5b642477f3a9f30214193a3e778988b98f7942cdc1212d718123a1f9b35af90c611e736dd1adeade640686502b69f9ae534e7c9df7f0fd03bb3eed5f81042c2df16ae1c26e302d8fb5c6caaecdbc8c1ff8ce2dcdac4325eddde37a8a0e060a0054e4be2b5e8cf589f458b69610a873369419b5d67aada89f77330d08b2f8b71f9fc7cce6597ee8f29088f5a89d8ae7611550f5dcca4674e4a7ed1743", - "rest": "8a2689c9bc0a0d9773da3d14f6ff6f14f730dd4a5462e5a47597997bbc6b96bff60fe1a55e2ba4089545184c0b0a973847130fc1324aa7dcdd29896f185fdd77b4800ef385de9d6a6259401f342400c314fc223a1bcbecded2dc7d0b7e34e0fd4c6d2c4d76a36a18cdd0b3f25e98707ed0c1c36859a635b5a09807fbb62edab178e17e42fb4fc7d415d0efde0e643b1cca0e10e05ae67fc93224aaa6287e068d12132f6c26ed78f756d566f83c833413cf9be11b74fabd3bbcfc5a09c346c656149b35ada313d71103862466e18abfece1b5de30d7d2da04ccbd68933cbffdfa3ef38317d0499bf04924582dc6f54edeef6b39df149eb3f386a602a812a01b998c2d54745feca7647c7ab6aba562dce1ce38aa499cad7c2c31bac32c5f2ccf512eb1bdfecc2949e44e9e8e0d718a9f11eb7d8226f8f6a0ca8d2ba55f76f5f52585aba2040797e4936af23bd8409dac6c2a9e72a25fd656889d2f85cb1ca61b4bc97eb4400c63a868af10fe6e0bba88260ec6f9631b6cf1f43c321e5a8507f2c9388173e113573737513dafc8b169bae1d3ad447e1f63d318d33f7c6a36008598aaf236f4cecb705e8925a140a53f4c935a269788b80c55d97571d2526f9fe7e1e88e3d76a2b9820f8ca6e590daec76c9e1d94b1e0e7d87f1160e3be70c3544e5620131fe3cde24da788b4f8e6c466a1525369829d563c21e6f38ea9ef40ee3a31a44bd11f48824dd6019c590ded7f60cde7d61dd36c122f187252f5af081090f14557ca930d061799beb24c67fbefcce03f21440f5d8631bac2419a5b3f56bd1bde054a8096bf16cfe0885d0ef33dc56fcfb951a371eaff0d5cf6e099e512d0d6e16afe5b753bfcb85e325262e2faf6e843478a060a64b5adf2c6038688c37e7e3a8a0bed370b3f8d847e77543413aed6cbec13ac64d6f751d18a3a805ef6741594111b068012a10e5ae943b821069c48efb76c9e9a57e6cfac6a1cf9bef28478d40cd259831aec9d088a2eb5c65ef2361df3e9f657dcd258af93d0780a0be390ebc532ffb45e5999c028f3e762849f9e20e9ecba400539c24ee9fcf5175868b6d876edeed19295640c2acc0852573a89f356ff43f0098439c81800dba4af9c666fd865790e73801ca4e010c12e65495cedfeb6669f7fc149b3b4e6da63b91ecd11bd8dabdd8fa15b2c885a1522a674e34aca1bdc9f5fd3551d0e20a49541d59b653d6a84a2e73289ba8506c1226d60a8c5aa3da866d1f88b75451a893a1e4d456712bfc53aac071dcaad92cfdce420d177a3405a7d89650c29a9040f6517cfdd93a10a6d7e40ce5cb131f0b1569d5a76fb6d51500dcb096d40faa5c04f7220b16f92e465a0de6e3f952e98a55250f02c9bee794825b9d2214f08839e65dd0a3a33af28258e53888926a18cf9168c24a6cece5932e7e114a1351949bead203b8a7912d5c6a5f2e00772ea18fca970e6d02b8113198ead9c36a73b2fe4d12cea0469cb28cbbe45f31e99608e18eca6ad113d12e2ef89e1f5ba3a6eca32288b1be7f951670c7d44f1017dd6f757fab16740c3c3622735a2d8ae90f0bdeca0c4c8e7ef203e2a08868f3755c21fa2fadd4121531344127022f046b34e1ad1c9066afc744fe1bfa5dbfa8c0ffef4ac6fe9960f06b4defad72ecf6efc39204a95f3d27aaf967d43543cf0b3e3dcc932bfdf6234f852b4817e6c21d0289445ace8c7749e314a8256e81c2a82cc414ab60948b1a9a60dab4b86e694689e4d160f2ed1c39971b27171bc7fd1928aa80404433eddad382f92e672c1b92578be6494bc13694be1c165bcbfddc4228957afceb5c867b85bd11c00d50e9c5722907f56dee6f3c45445be0283512aa65b0214ae2927823e941eae8ebfc215cf34e9b14bfc29645e2a63548f022deb49becdf344f1362890c1b3c39123e172c5092bc329a525d3386bea40c6a22d0bf8a8865387496126e63406d163a1f02944418fd8373afd863334ea510534e115e7f4999b4f4a4314ba43955a743a678d211b61b8a1e8619550bcb90816f18845989d80e9994b0ffc1c02236bc8651d5a1a520578df7368ac97715a8d88812944b4d97dfb57959722460388cd39d1d5e06a125653062ea6351943cff52fb7f6350538b80cdea1f3f2370385e87b9ec1aa6916174c4487036787ad62183706cf88b2b9eba7cff2a5a0eca6c1577fa2ed872c7f333e0e18e6479e8ae7060b7dad0a78ba89248c8db0412f251181ee6054c1e67ec4e5f3536610a8acb4cc03e8b06c378c294af6d58acbd8a5ba5629617b90b0fbf01b158d487d2d76d889268feabec421b222e30ab3fbd8cbe6be9ab2dad2b67e1c871d1ee7de65eb160b674262a57a6942e24e1a4210658183eba1dda62dab40c9811e34416ccb9bf977e1a3c5dbb51f0b1cd6d7e855cde268bcfd361a646b2cf65f5e7c6ae0f18001ca16a97ca11c60fbda5146e5574409d06d24a0892a0bde605f5ff0fc84354a2fcd38abe7a9da7049d8fdc966aebaa213cc8bd9e73b1773b6efbc51110865fe1c4464998d682ee08942f48dc01b376edfd42d6223c7dba44a9e5833d1484626072272915ce7f552e92e78d5552919adec3c5508c2084cdfca99228dee9e7e01f7fad976e2dcaced6c82c04f05aad40c7bf04ce6cbfb6f76ccf77cecaadf70f5bed8aa5e202c3dfc23c02174ae385d455d3fcc95df4d5ce5677c9c4e644d5a0384d33db5dbc670e2bb6dda99d1fa53dd7ce86e10eb8f49cb380931ae38a1fbc00b37503dbdbe66d93545b407cde600cf5e9b62c8494dec574b1826e4bed048fe406a96757e19080f8fc935ec05f626a6b3542048f3a678db1f684fb9471c388de7d3bfd3bac2e9dbbde3000c0745d7021b73cb1dc1bf60b91a9df32716819978f7a319d054baf47d2f2739c1ada3c52e228c45c648f3798915259e6ce30d737fe40cc33bb5883e2a2b65a5c97b8bfb4b83e1a8b145b8e3e47f9bf625cb4267268ed30565cf6f908c88a60dc709176fe5b61e32ec48db47a9746b507a7f43566e1a7decacf3e48a40c97c44f57a102df4aadc13a1ef52892a3ff39e59e9cf7cfca6165f09976171db6929b8c523164569c210c924392048b924a6940652b288cc4a40f49ee4b0cf5048e8ac88202582694c27ebd99f0498b07e15df6246444f180cb77936e69d41e6d1ea4a34a2177dd462d1ae229d4f26f07ff46cd673449e5066220c32a2ee1b6b19574b274ce19236b60154ba033a5060b6438f4d4e1508268d8d0a66d6bc465982a2652cb10c107fc676709d3ad2dbbd45c6761c224efe4f83b8a82524fbdedccfb1b47d5ac7d0de640e54068fc1cad6f115baed2e563506d2acdea6b7448263a62b929537f5fd0ae4a5201d5e62fc9e68280df3384ffe146de950c48b2343bab91a901988b1ed8ea9df2c336b404a6fa82010858bc6636ea4c179cd170cdf346a96a79c42ca8f2689d85e698309ab4f67e475a5e0c8bea103e65f885b109b1d9829ff01d36f8ff3e0af6967943ecd2d084bdeb46c808ab9f88d8b6a8305b5a4f42950ec953ec67acaccc0b556f2dbf43f00e2d57172cb81c4f45017af7f0889b981776dacda2c471832d3c82e359453f968f547c00831c5372f48ca9ed8f9be4389311c663522e6ac7d71c3dd048a8206e639f3dcbeb5956c33936da13711310b544d55c5cbedca0feeba63e6f8f334411c84695905046447705cd7ddf69e486475d78c2b342c00d55c18e9345c976196b3d2c4a15ecfa08a20ab0364e20ba311416ca4564a453294854d50cbd279d126e0fb3d0daf277d3dafe419167b9568289eb74f9d132af205c50b518444b11b579d05332d28bd00811e1a7182e436fc5403f0aae620e85ffee1dbcbb09f654fd89509e814d23319c31458ebf130bd31ce9c22cc00d512072dca567e499b2e533372329eb10064f353bfe2fd37be568a73e3687816c36bf3f8f5843d333a88ad81be636a1353950c2e22ebee07ea2b8d295061e7917789aeea9d1b5ecf4f7f9263d55d67d5f02ea35969fdb6a82def84fa43135c46fb9b1a06e744b80d85df2d235a23058802b6e8759a336e06a4d81594abba3c2f9affda78eac173d12c414a6647715c433f532d43bdae6325c8217765b5a152a5765baec0b285a5a6831dab84ebfc0efa475872d60f3fd68be45ee8db5fc3cc9f07c757bafa0d3eefdbca887ba284dd0a9293a0fbda15fc53fdecc2948efa68547ab69954313a26f9f7782ebaab3741322350b8b94a8b77d2c70b0b4e804cd272f3664aede252a57caccdad2c9196d491ba6cc9212805d07c0d4f09c3473c38ecadca31df2f6c854f4fb9fec1c09f36a3310fdf01a989fcfc3085d3fe001cc1417828f3c637f1a8ae74d0855228f7589b2ed9d271bfd0afa35700350019bca855412ac67732011e0329b0eefb750bfd6c95d836ccad627456c4acb763239ff0870043d35f9d07aaa7b78ecd8fa8aad02ab32d8e2a0ced0d5804de487890142ec3ec4342752f8ec51a2721bf7b4a314bfc4c97284f6c6e8f9b95311ef62c9e648ceada0e95374c1561c4735360ef1532afcca6b55975ed60b45005d1b15772d6b689c3a7a20de22a808937d3c6ceea64c21a733a187bd9fc26c94288f43c85517358d882a72f715a759dabdcfa1fc8a88d7a641ecc430d20a3623874147104be2a3a428d7995e992f19164279497af17689fa2348f81eeae75b3b68defab457fa89703d173fdd91e21d56e26f95d5de00f5aae3618cf8e5d00b3d7e9f86435001acb51729a13462a45eb759b11e8a3a597387dc51491bb8617561e1a49477a70207b16f406535f234ab0e2bf718d4a69f9f6c77da9c9ce0c3ca5878601b5665ee02f285d7989c7d800abcdb7bfc9685e164bfbf8f34666fb3013f89f25441af4582bdbfe4137d5ca39202c822965c4c99c75e5e098dbcbabcef3b1ed74a6307ad35d439033c073e874c2be1ce2acc0b88364034ba7724d08112bb7ba2012cd3ff2b71785ba2c589a882bfbdc8521872370e75c5c26a7f3727725ff745f1eedf18cd8e8adfb4c4a1e038846b420c68972bfc316a6ce3619d54c49739182551882a0ff9cfa9113034f61e165184f1304ed8f8b1a35a19a84c529782939f7fd4db5a963ffbab3c75053b377fbc57bd12dd3fbd7a78e721b0c6e75120c97cb2951120f1ca4f16a9fb9dd21f3a0bbf555db943c9c914497c08362e37db3a8abb90c31b03910c3be9feb6da9ee62480fa70b5234e14930981adec95ad16d9785e2555bac9e54c44cb276ac220a2eaffe70aad67051a2aa7b8bb70eb9110265476a3c467eab2d4b62b26efcc480ed161fe831e9ead1765b6c68678a2c7cd938c39409fd468aa8bd3f11c2bcec6266f9667d5054e6d6cb1b50f7f42069de7be18be7a9a332d80ccd4df2089a8636fc463ee0156a5842e9964bf1c5ed932233c5e1b69ff8bfcd8f749ad2753d39aba399401a37e66938a16f35387ad51bd5de670e7fa31616a39ba07c1e8d2c5844ccbd3d54baac735d11a505457c4d8378b7b86116736dedfd85b3edb30f5640f50ac4f3cadfb83476d76c4f676ad3f124e57f0dbaf046815a27bf9a7d26695fea3737cf087006312dd52ae127853dcb3c867406629109e2d40e1c3697c3aafa36bf3802ee0919a066cb2d459cb2e63a6511dbcc0bd432a04181f5fabb101305b298ca232841e1c61a4a1b702b019e83a841832dbeeddbb6f2f1995c2b3f218a0329f536ba9624b5abc22a05476bba6a61de07c4959608db220d82c8a2d8419234b9e0f6a1566ff30ddc200e2313206fc02e185fe297fb5ebf10ee8c078b9dc6fd5a74b96d37ba3bcd26293af7c86505ed83d903696f7df00d85498309043e65eb04ada8b3c62f0f36d2bc20bd32d8adfec149e0984678be5cc95c3cc8d74f3616aa18d3be44217d4ccb740f96ec68bf8e710f8a1f75091917b507a334dc54acd8f1724bff9bfb153ae6120cc2ca0d8281d5db03c5b6940a31a4bb105fc284e7281750ca98e55d08ab4ddc60bf9493ecef3f5224d5a9fbd967af80ec5c7bc1ef55dc9d2e53876522096543f85d498ecbbc67bf876b74c032ce1bb29aaedaf37abd85239c3a1b216ec408996d42ff81e4b32b0ba62a87ed680f0a66f231b4d94fe6cc700376e2f4487ac3a348b1ad9b2d19387115ef97baea23ed9d4dd1d32425db1fe39d8180d7a04efcba5e09272261da3efebdb4ad26e36e33753ac2de6caeb797a6601f8c84ceded75595b877eeee7e59e2c8e0c57c66b815ecca4f82874c2fd4c3346750d37eeecfa68a3dae7d86568301895b72185fe688d83d03b370a8d9dfdc71e41e6684cdd6104e55ff145b3acb485fd2bbfcdd8099c55b8a41aa74b959d575e001dbf29992ebbac2e46ec9831cb5b93c5d9d13e4ba37697c2cf7768b5c8cc5098b36d41c855b7438c62cc38d1b278032e4114702c2c225151393ba1b8465990680bfb426f0c9333f3dc66c08828d9d9aedf6bab9aa199611eeaf7d1fe9cbdd4e4539de06c04a97d442f98299a5a6d0b3b900f3d3efde518d51d47be8afb76a1bbb791d01a08953754fdadc3ad36ae716a3aeada5c63775c91d0faee5fe024c955d934c667390e118189912a72d6a6e502b836e3ad88e5b87c7dacb6f4e619586b69aad976bfd391b0b025f9753c88468631c7a31781ca59f5b874708d3a281c61255b6568d25db7d992f97febfc2e207346cedb7fe37821f1798f331b66fde4c6388f73688f54cd8f25a2c38766c53c48d0f6fca3c43d34a846bfc334116b0a5819daeedefcafe4f73864519359c2fbcafd11012a5f82b9a3e64faef074d675091d7d1a859a822118e3c8632f61c8559f7c41e5172ed3df2684192521a6de5656c75bcbae65301b4cbde6452b88baa02bd0bb3e9eca87f302508b63c58f58b438e47b38dca84d2783214d5087e2001d15a92f62765067138893e7a80428ad3c95ccc614b3e42dcaa35000d20201cb0c48e18b2898acbd8d34690cdb0c0cf74654301389a3d306ec0c6ae78bad5cf8087ee118a1f83159518cb63bcd13c541f9a231203174e4c09cab8f94141bccba3266aef3323b4cee7d2aeaf55236d71f9976b13ffcee890358c5cb634be1", - "envelope_header": "6167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392049417861374664446e6836324d526b444b6a46375a7856543871326a4c5a6c5545384f5955654b31726b6b0a4b4e303753547769492f644865395861644833325a664674674e67584a532b3637752b50466b57646c466f0a2d2d2d2071796b634a7476302b3376324b646d2f437a535631784a4d704e5a582f49776e446c62526d3630767861670a", - "host": "d3b9b166a9b2b304971bf45a4e02d185ecc0b1d0920d6b67914e5651c823a2f6dca4595cb1a87480253a442ba86bd32fa6296b5a76723ead55a8f5484eec66d3cae15537801eb8b919370232e1bc423a6c14ea1b918ce4421e103913e6e72b49d6200421c6a6a95a0e48e029a691ca4137ce54e66ccd9a2bf257d9f24e3a57d5ada874b85b3961e0eac4384c62366bda9d0abcd8dc3bcc53fc63bdba5a64b4f3220f4a82afacfbd21259e5caaa17246ac90c8f30fd046dd99c7a89cf1f57a1c299f35da6c97cf3f5b91dda9230670762f366f9f0fb408ddf2d2c285ddf89e678f8a9489f88b5968af5cec162bc1197dc183cdd11c04684d1fa06d5ffd8d96986fe94ded9a4a54dba13ef82da01fac5b9a2795a738f966242849a81fd47a9df1dbed7781fd1171194282539fc9877a6a36a5a0a097eae7003b30a8778c90a6e675cc961c83ae203cef7ba380b4dbf6fb9a53faac2694b4486f319fa4560c5a4099db0c98bc095cc59d3beb2f2c9cd14e935674494128b2912b310c437a7b58e3cebfdee72eb0c70428936c1a0c959fa2ff33efd6559167538ce22e9e949c122330a9d038073b6cfc7e38bddcb8bf91b62ee79772c7886058e2d949c29327433cdeba1c79aa951b049c0908f1d33e2669b93f810455a921f1cfe0a0ed591da7d0059ce518b10a111ba85814c1b6bc674d25443604c171626f1781aaf8b9bb5f11abffbc2ec6c3061c7e6d52b7a4039ca43e341f33a2aad5c2452fd1f02e24ede2f4c4829f8c5a0194a7f67660eaad4ba2340976596218662e03dcafad12f67c544b6b35e285fd4b2ea02e08702ff1dde2058c9f3cd87a18939fa316327584bb82c891aa44b135ed843286d4eccbbaa3b032b677022328380cc246feb9ddcae8789e1e00e1f1fa2cbf5d5b704f7af8e2c3a82430dad07f9f472b2a017e6f460c2b326f090d18601eecc9b1b513a6024e3103b1e316d66aa315b73974051a4415cd7ae35f4128b9866638529c59a2c123bdbb9c5da7aeb40618052c1c2d983cca3a61e2c44e4c59a2e86fd1a17395522ee77ba4e88fa9c29b91e7bf569c06a762ad074a852244ffb4f4fd2d80ff6cc6a16077d8cebb2463c95e3eed915cce30dece6486ea72a2786a25de419a8dce67d8b59b92cd83609af6d45b20fdcb6dd793a1d5f8041cd718a18c145443aa67b5370ad48007d0b5f91daa6e34be851ef02baa81a873ec50949ad11db4665c3e822e94eafce39c204c4a3215958bfe90471fe509f8f66caaeb6e3024b72d4c78925e044acd6e069b173ccdd9409decb6b99d03b889e1959a5f7e63c9e62e7fb33b811e2c1c59407345030481ec0d4783bce6d7bcffb085da831842a04cfa871850f61ffc0fabbc0b40cfac70c5b6203dc09e7e5cc1e6b2a628e22db3444c57edbc00d413b53075ef2a73908dcd92d9240e3163bbd7c1ea40a084570b9968ef9d961e9c3c7b6e18c4435059750b987148911ab80e02938f3d64829e91d8ec8f4bdeb141108a877eba448738f656fe6c6b14f37bc4218678c2b40d229b4c4c2ae44b8d514f73daa3398ac6000be2583af541bc4529d161d6706da9d1f0d349bcfb4ff89b55a509363c54a95635c6ff94e9c7091faa96eeb891a8efadd54b2e235219088e0e1eeb55e3917ea312102a74baafd2124d5e3a2dab587fbd0d9e2167526ebc800d49ffa05bff6ff5677226d85eb4d1f21279806b3d254e277eb322e16514f2528b48f1b5d6d7da4c3fbeba0377238bb6c7bb12ed444c94df49879de1c2f2b13ba08578b81e3d08d92f2a772b02eb2259a307e7d97757f22c079db4b32e06e71df15b0502de748580f68ca7e89f6eca6955e6ae73554614396e9386073eac4ddda9a4dc6b9c07f2a597abc3a3f5d9c480d0774548bfa1d21b51b3b7b82e4938375c879bb2eeba02db7d027ebdd9f411ac012023b320da8bd69f601d0c7649696e2ec8d77f6449ed50ce03c2e09970f71b88193d02bf066b9737929928f208a25da5b102733e453b406e2b1bf6bca3a61ab6b6617077db9cae417a139da15fb44039af66e45c1ec284450e3f7869f62d510727c94a4e33ef75be901a2e4baecf61fd65180cd9ab588f62253f176c6d32ed48ab91e00720e761944ce735771ff83c7d7d6ae2b6d96db8c08c3bed240c1d7394a73635cc1fa352c22aad357ec8355a969ab07cc08a99106ec0879e9af70ca3c4affa1bc2fb0477046ceb3f7db8407cd05d7ef5264842769b09075f6aca28c7539f754f2ab43d8ac966547e199b27d458baa39df20e32f1c609eee59291778c3c6d85de8b18d7cf92fbfdefe76c1bb8b612c61be39c3c301c8d19ad5de56e749ec44dd94773388d7fa8b50cf75bcdb59ce97c0b87f6f23949f60c97ed889b81731d6ae155574ce2e71521e6c05fd994dde4e984340de4b71d875c1e6fdad9b46307c2a350fb3df9e03a8d2f596591c1681caa54dd07752519f79acedff294348a920ff4dd925fa8c27cf0477a4934d4201f51871fef4378cc76dcfaa985062ce2a53c031896ff649dd8aa69b6f6eb76e70647599f424744483837e97e6a302128200c304b4d7a8058495cd5434afd3f58eca2014be54c072c7041c510a8e105906a90ba1898d46a0b0d1f211b5c576435e47626d9deb4ebad549a102990059125474e4a7393e35aba91b38d00cb44ee06318f64199c3506fc53b209504b76b73181a4d2b4d298e04f5764e13b3a992300efb3caf2794b5a54637f316a603f0b50aaf478bb3ceff2ac3a77e309a7592a498eb9577eb8d7ccb989513f628f478415901dd02a072bd437257098c4c9cc8e67c1837ef13c38c49f791261c487391463886c815cb37f173176d8bb41b9c80a215545f84d28a77a58c3211d0a7324a06b9eeb2576eaeca7761efe1c3235b14190f6e34eef87bf857130f65d2764c703cce9883dfc3a8d8c90c99f4ee765f68263b073d26bb585cd2de50c8c98ab9605f91e95a820b82051b95dfcfad1ec4f26df443417c7c0727890e79d3e14203dab694f1fdc1e29e020173efd3dac567c0fa67890118ba630fd212e4a8bf1688d1e622e392c784e2d36ba887777a2df13ae43555cb71d9591cadd5c5b77b3e93f12f03ab91d1946d11b532385bc0eeb79d323f9bf263ba04e5d74b66b95316e07eb73f2196f4f9bba906b59306098cc85cc7958c8d240538668a5a49c480a3f4ce8ff05aa19b6f1b96816a94004314e7a021fabec880ff79a7366be4df988206cce768d0c222ff50737069137524acdf02ffe2be4dfb7e5ede03c0a011f8ce1a9952184154fdab1bb9767f715089897294a2db972899e56b270698cd8c6e3abd4432c9a7b05e2bf1980ed3b9fc5e3e4e446668467b4cc418276533791a569305bb33feab43a85a81cb743de78baf5f5ed8206db1a9db4af041c599caed6cfa9d2a6bc6101e8346ff65b861547487de89bdf6d67f6b21ef79e124d2a544721a8f545a658e7c9c0010d0b926912488b101c9e975f878d9fec63b7abe2998a11f12b9a76f35fd727e732954e15881217bf9b9539c1a5f85494d9e7fd43ce04350deda64793fcec67bf2f5250a2710b33689e135159fc339ee75ed2cb0c756f862c9aae981ed78b1cae302a96414a44e90c7b6a59311ab62508d614560e4534dd7e49dd3f8f010e5186a916853fba9dbc0f1f67cdda894de813250f80e49c1419871e6b77c20c13dbf8ea78c05f25c7ffb6918fd99e0eb3e406a0e99a44ad5121dd88977be14dc883b2e955a050c34ca9bda58205924aa7ec2659b374e9db003466710da6bc5d854646573e26e6dd3a30773cbca9c3e4013fe63e3b754bf72d48d0a0772082241db5442b557ddab94f0372d8753df7c45f58e6ea8227954e6e2842efb44b51da6ebfde2ebd0ca97fae3981280b370f2e298006559e4dd264be171da97e5b1d673c30d5ddb17c76fdd894710658f58583a7ce27cc04dbf3b3de8723df896c0c70c04a1f3397ebae43441b81290e52263beed66030d163b6efe5523fccec4d8cf5bb0f108bfb5cdb482fe0b381c0c2b93ae336957ff08408ec19d90a37fa97b175e8caa459d26cf689e3ee704e1ac0dddda1c91417ffe6ae2ffb4a85be359cb18244ec750d542e7afe343ea999d4ea882da7731d60766f81902b768d281ee47ee0cbc302ba28eea2ed34fe4bd4121f85f7918adc92b3fd67e749340787e17359ab3db802fb14e4c2897a2f2e30c40823a3b3bcd110ad78a2689c9bc0a0d9773da3d14f6ff6f14f730dd4a5462e5a47597997bbc6b96bff60fe1a55e2ba4089545184c0b0a973847130fc1324aa7dcdd29896f185fdd77b4800ef385de9d6a6259401f342400c314fc223a1bcbecded2dc7d0b7e34e0fd4c6d2c4d76a36a18cdd0b3f25e98707ed0c1c36859a635b5a09807fbb62edab178e17e42fb4fc7d415d0efde0e643b1cca0e10e05ae67fc93224aaa6287e068d12132f6c26ed78f756d566f83c833413cf9be11b74fabd3bbcfc5a09c346c656149b35ada313d71103862466e18abfece1b5de30d7d2da04ccbd68933cbffdfa3ef38317d0499bf04924582dc6f54edeef6b39df149eb3f386a602a812a01b998c2d54745feca7647c7ab6aba562dce1ce38aa499cad7c2c31bac32c5f2ccf512eb1bdfecc2949e44e9e8e0d718a9f11eb7d8226f8f6a0ca8d2ba55f76f5f52585aba2040797e4936af23bd8409dac6c2a9e72a25fd656889d2f85cb1ca61b4bc97eb4400c63a868af10fe6e0bba88260ec6f9631b6cf1f43c321e5a8507f2c9388173e113573737513dafc8b169bae1d3ad447e1f63d318d33f7c6a36008598aaf236f4cecb705e8925a140a53f4c935a269788b80c55d97571d2526f9fe7e1e88e3d76a2b9820f8ca6e590daec76c9e1d94b1e0e7d87f1160e3be70c3544e5620131fe3cde24da788b4f8e6c466a1525369829d563c21e6f38ea9ef40ee3a31a44bd11f48824dd6019c590ded7f60cde7d61dd36c122f187252f5af081090f14557ca930d061799beb24c67fbefcce03f21440f5d8631bac2419a5b3f56bd1bde054a8096bf16cfe0885d0ef33dc56fcfb951a371eaff0d5cf6e099e512d0d6e16afe5b753bfcb85e325262e2faf6e843478a060a64b5adf2c6038688c37e7e3a8a0bed370b3f8d847e77543413aed6cbec13ac64d6f751d18a3a805ef6741594111b068012a10e5ae943b821069c48efb76c9e9a57e6cfac6a1cf9bef28478d40cd259831aec9d088a2eb5c65ef2361df3e9f657dcd258af93d0780a0be390ebc532ffb45e5999c028f3e762849f9e20e9ecba400539c24ee9fcf5175868b6d876edeed19295640c2acc0852573a89f356ff43f0098439c81800dba4af9c666fd865790e73801ca4e010c12e65495cedfeb6669f7fc149b3b4e6da63b91ecd11bd8dabdd8fa15b2c885a1522a674e34aca1bdc9f5fd3551d0e20a49541d59b653d6a84a2e73289ba8506c1226d60a8c5aa3da866d1f88b75451a893a1e4d456712bfc53aac071dcaad92cfdce420d177a3405a7d89650c29a9040f6517cfdd93a10a6d7e40ce5cb131f0b1569d5a76fb6d51500dcb096d40faa5c04f7220b16f92e465a0de6e3f952e98a55250f02c9bee794825b9d2214f08839e65dd0a3a33af28258e53888926a18cf9168c24a6cece5932e7e114a1351949bead203b8a7912d5c6a5f2e00772ea18fca970e6d02b8113198ead9c36a73b2fe4d12cea0469cb28cbbe45f31e99608e18eca6ad113d12e2ef89e1f5ba3a6eca32288b1be7f951670c7d44f1017dd6f757fab16740c3c3622735a2d8ae90f0bdeca0c4c8e7ef203e2a08868f3755c21fa2fadd4121531344127022f046b34e1ad1c9066afc744fe1bfa5dbfa8c0ffef4ac6fe9960f06b4defad72ecf6efc39204a95f3d27aaf967d43543cf0b3e3dcc932bfdf6234f852b4817e6c21d0289445ace8c7749e314a8256e81c2a82cc414ab60948b1a9a60dab4b86e694689e4d160f2ed1c39971b27171bc7fd1928aa80404433eddad382f92e672c1b92578be6494bc13694be1c165bcbfddc4228957afceb5c867b85bd11c00d50e9c5722907f56dee6f3c45445be0283512aa65b0214ae2927823e941eae8ebfc215cf34e9b14bfc29645e2a63548f022deb49becdf344f1362890c1b3c39123e172c5092bc329a525d3386bea40c6a22d0bf8a8865387496126e63406d163a1f02944418fd8373afd863334ea510534e115e7f4999b4f4a4314ba43955a743a678d211b61b8a1e8619550bcb90816f18845989d80e9994b0ffc1c02236bc8651d5a1a520578df7368ac97715a8d88812944b4d97dfb57959722460388cd39d1d5e06a125653062ea6351943cff52fb7f6350538b80cdea1f3f2370385e87b9ec1aa6916174c4487036787ad62183706cf88b2b9eba7cff2a5a0eca6c1577fa2ed872c7f333e0e18e6479e8ae7060b7dad0a78ba89248c8db0412f251181ee6054c1e67ec4e5f3536610a8acb4cc03e8b06c378c294af6d58acbd8a5ba5629617b90b0fbf01b158d487d2d76d889268feabec421b222e30ab3fbd8cbe6be9ab2dad2b67e1c871d1ee7de65eb160b674262a57a6942e24e1a4210658183eba1dda62dab40c9811e34416ccb9bf977e1a3c5dbb51f0b1cd6d7e855cde268bcfd361a646b2cf65f5e7c6ae0f18001ca16a97ca11c60fbda5146e5574409d06d24a0892a0bde605f5ff0fc84354a2fcd38abe7a9da7049d8fdc966aebaa213cc8bd9e73b1773b6efbc51110865fe1c4464998d682ee08942f48dc01b376edfd42d6223c7dba44a9e5833d1484626072272915ce7f552e92e78d5552919adec3c5508c2084cdfca99228dee9e7e01f7fad976e2dcaced6c82c04f05aad40c7bf04ce6cbfb6f76ccf77cecaadf70f5bed8aa5e202c3dfc23c02174ae385d455d3fcc95df4d5ce5677c9c4e644d5a0384d33db5dbc670e2bb6dda99d1fa53dd7ce86e10eb8f49cb380931ae38a1fbc00b37503dbdbe66d93545b407cde600cf5e9b62c8494dec574b1826e4bed048fe406a96757e19080f8fc935ec05f626a6b3542048f3a678db1f684fb9471c388de7d3bfd3bac2e9dbbde3000c0745d7021b73cb1dc1bf60b91a9df32716819978f7a319d054baf47d2f2739c1ada3c52e228c45c648f3798915259e6ce30d737fe40cc33bb5883e2a2b65a5c97b8bfb4b83e1a8b145b8e3e47f9bf625cb4267268ed30565cf6f908c88a60dc709176fe5b61e32ec48db47a9746b507a7f43566e1a7decacf3e48a40c97c44f57a102df4aadc13a1ef52892a3ff39e59e9cf7cfca6165f09976171db6929b8c523164569c210c924392048b924a6940652b288cc4a40f49ee4b0cf5048e8ac88202582694c27ebd99f0498b07e15df6246444f180cb77936e69d41e6d1ea4a34a2177dd462d1ae229d4f26f07ff46cd673449e5066220c32a2ee1b6b19574b274ce19236b60154ba033a5060b6438f4d4e1508268d8d0a66d6bc465982a2652cb10c107fc676709d3ad2dbbd45c6761c224efe4f83b8a82524fbdedccfb1b47d5ac7d0de640e54068fc1cad6f115baed2e563506d2acdea6b7448263a62b929537f5fd0ae4a5201d5e62fc9e68280df3384ffe146de950c48b2343bab91a901988b1ed8ea9df2c336b404a6fa82010858bc6636ea4c179cd170cdf346a96a79c42ca8f2689d85e698309ab4f67e475a5e0c8bea103e65f885b109b1d9829ff01d36f8ff3e0af6967943ecd2d084bdeb46c808ab9f88d8b6a8305b5a4f42950ec953ec67acaccc0b556f2dbf43f00e2d57172cb81c4f45017af7f0889b981776dacda2c471832d3c82e359453f968f547c00831c5372f48ca9ed8f9be4389311c663522e6ac7d71c3dd048a8206e639f3dcbeb5956c33936da13711310b544d55c5cbedca0feeba63e6f8f334411c84695905046447705cd7ddf69e486475d78c2b342c00d55c18e9345c976196b3d2c4a15ecfa08a20ab0364e20ba311416ca4564a453294854d50cbd279d126e0fb3d0daf277d3dafe419167b9568289eb74f9d132af205c50b518444b11b579d05332d28bd00811e1a7182e436fc5403f0aae620e85ffee1dbcbb09f654fd89509e814d23319c31458ebf130bd31ce9c22cc00d512072dca567e499b2e533372329eb10064f353bfe2fd37be568a73e3687816c36bf3f8f5843d333a88ad81be636a1353950c2e22ebee07ea2b8d295061e7917789aeea9d1b5ecf4f7f9263d55d67d5f02ea35969fdb6a82def84fa43135c46fb9b1a06e744b80d85df2d235a23058802b6e8759a336e06a4d81594abba3c2f9affda78eac173d12c414a6647715c433f532d43bdae6325c8217765b5a152a5765baec0b285a5a6831dab84ebfc0efa475872d60f3fd68be45ee8db5fc3cc9f07c757bafa0d3eefdbca887ba284dd0a9293a0fbda15fc53fdecc2948efa68547ab69954313a26f9f7782ebaab3741322350b8b94a8b77d2c70b0b4e804cd272f3664aede252a57caccdad2c9196d491ba6cc9212805d07c0d4f09c3473c38ecadca31df2f6c854f4fb9fec1c09f36a3310fdf01a989fcfc3085d3fe001cc1417828f3c637f1a8ae74d0855228f7589b2ed9d271bfd0afa35700350019bca855412ac67732011e0329b0eefb750bfd6c95d836ccad627456c4acb763239ff0870043d35f9d07aaa7b78ecd8fa8aad02ab32d8e2a0ced0d5804de487890142ec3ec4342752f8ec51a2721bf7b4a314bfc4c97284f6c6e8f9b95311ef62c9e648ceada0e95374c1561c4735360ef1532afcca6b55975ed60b45005d1b15772d6b689c3a7a20de22a808937d3c6ceea64c21a733a187bd9fc26c94288f43c85517358d882a72f715a759dabdcfa1fc8a88d7a641ecc430d20a3623874147104be2a3a428d7995e992f19164279497af17689fa2348f81eeae75b3b68defab457fa89703d173fdd91e21d56e26f95d5de00f5aae3618cf8e5d00b3d7e9f86435001acb51729a13462a45eb759b11e8a3a597387dc51491bb8617561e1a49477a70207b16f406535f234ab0e2bf718d4a69f9f6c77da9c9ce0c3ca5878601b5665ee02f285d7989c7d800abcdb7bfc9685e164bfbf8f34666fb3013f89f25441af4582bdbfe4137d5ca39202c822965c4c99c75e5e098dbcbabcef3b1ed74a6307ad35d439033c073e874c2be1ce2acc0b88364034ba7724d08112bb7ba2012cd3ff2b71785ba2c589a882bfbdc8521872370e75c5c26a7f3727725ff745f1eedf18cd8e8adfb4c4a1e038846b420c68972bfc316a6ce3619d54c49739182551882a0ff9cfa9113034f61e165184f1304ed8f8b1a35a19a84c529782939f7fd4db5a963ffbab3c75053b377fbc57bd12dd3fbd7a78e721b0c6e75120c97cb2951120f1ca4f16a9fb9dd21f3a0bbf555db943c9c914497c08362e37db3a8abb90c31b03910c3be9feb6da9ee62480fa70b5234e14930981adec95ad16d9785e2555bac9e54c44cb276ac220a2eaffe70aad67051a2aa7b8bb70eb9110265476a3c467eab2d4b62b26efcc480ed161fe831e9ead1765b6c68678a2c7cd938c39409fd468aa8bd3f11c2bcec6266f9667d5054e6d6cb1b50f7f42069de7be18be7a9a332d80ccd4df2089a8636fc463ee0156a5842e9964bf1c5ed932233c5e1b69ff8bfcd8f749ad2753d39aba399401a37e66938a16f35387ad51bd5de670e7fa31616a39ba07c1e8d2c5844ccbd3d54baac735d11a505457c4d8378b7b86116736dedfd85b3edb30f5640f50ac4f3cadfb83476d76c4f676ad3f124e57f0dbaf046815a27bf9a7d26695fea3737cf087006312dd52ae127853dcb3c867406629109e2d40e1c3697c3aafa36bf3802ee0919a066cb2d459cb2e63a6511dbcc0bd432a04181f5fabb101305b298ca232841e1c61a4a1b702b019e83a841832dbeeddbb6f2f1995c2b3f218a0329f536ba9624b5abc22a05476bba6a61de07c4959608db220d82c8a2d8419234b9e0f6a1566ff30ddc200e2313206fc02e185fe297fb5ebf10ee8c078b9dc6fd5a74b96d37ba3bcd26293af7c86505ed83d903696f7df00d85498309043e65eb04ada8b3c62f0f36d2bc20bd32d8adfec149e0984678be5cc95c3cc8d74f3616aa18d3be44217d4ccb740f96ec68bf8e710f8a1f75091917b507a334dc54acd8f1724bff9bfb153ae6120cc2ca0d8281d5db03c5b6940a31a4bb105fc284e7281750ca98e55d08ab4ddc60bf9493ecef3f5224d5a9fbd967af80ec5c7bc1ef55dc9d2e53876522096543f85d498ecbbc67bf876b74c032ce1bb29aaedaf37abd85239c3a1b216ec408996d42ff81e4b32b0ba62a87ed680f0a66f231b4d94fe6cc700376e2f4487ac3a348b1ad9b2d19387115ef97baea23ed9d4dd1d32425db1fe39d8180d7a04efcba5e09272261da3efebdb4ad26e36e33753ac2de6caeb797a6601f8c84ceded75595b877eeee7e59e2c8e0c57c66b815ecca4f82874c2fd4c3346750d37eeecfa68a3dae7d86568301895b72185fe688d83d03b370a8d9dfdc71e41e6684cdd6104e55ff145b3acb485fd2bbfcdd8099c55b8a41aa74b959d575e001dbf29992ebbac2e46ec9831cb5b93c5d9d13e4ba37697c2cf7768b5c8cc5098b36d41c855b7438c62cc38d1b278032e4114702c2c225151393ba1b8465990680bfb426f0c9333f3dc66c08828d9d9aedf6bab9aa199611eeaf7d1fe9cbdd4e4539de06c04a97d442f98299a5a6d0b3b900f3d3efde518d51d47be8afb76a1bbb791d01a08953754fdadc3ad36ae716a3aeada5c63775c91d0faee5fe024c955d934c667390e118189912a72d6a6e502b836e3ad88e5b87c7dacb6f4e619586b69aad976bfd391b0b025f9753c88468631c7a31781ca59f5b874708d3a281c61255b6568d25db7d992f97febfc2e207346cedb7fe37821f1798f331b66fde4c6388f73688f54cd8f25a2c38766c53c48d0f6fca3c43d34a846bfc334116b0a5819daeedefcafe4f73864519359c2fbcafd11012a5f82b9a3e64faef074d675091d7d1a859a822118e3c8632f61c8559f7c41e5172ed3df2684192521a6de5656c75bcbae65301b4cbde6452b88baa02bd0bb3e9eca87f302508b63c58f58b438e47b38dca84d2783214d5087e2001d15a92f62765067138893e7a80428ad3c95ccc614b3e42dcaa35000d20201cb0c48e18b2898acbd8d34690cdb0c0cf74654301389a3d306ec0c6ae78bad5cf8087ee118a1f83159518cb63bcd13c541f9a231203174e4c09cab8f94141bccba3266aef3323b4cee7d2aeaf55236d71f9976b13ffcee890358c5cb634be1", + "rest": "beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc092748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c91", + "envelope_header": "6167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a", + "host": "d3b9b166a9b2b304971bf45a4e02d185ecc0b1d0920d6b67914e5651c823a2f6dca4595cb1a87480253a442ba86bd32fa6296b5a76723ead55a8f5484eec66d3cae15537801eb8b919370232e1bc423a6c14ea1b918ce4421e103913e6e72b49d6200421c6a6a95a0e48e029a691ca4137ce54e66ccd9a2bf257d9f24e3a57d5ada874b85b3961e0eac4384c62366bda9d0abcd8dc3bcc53fc63bdba5a64b4f3220f4a82afacfbd21259e5caaa17246ac90c8f30fd046dd99c7a89cf1f57a1c299f35da6c97cf3f5b91dda9230670762f366f9f0fb408ddf2d2c285ddf89e678f8a9489f88b5968af5cec162bc1197dc183cdd11c04684d1fa06d5ffd8d96986fe94ded9a4a54dba13ef82da01fac5b9a2795a738f966242849a81fd47a9df1dbed7781fd1171194282539fc9877a6a36a5a0a097eae7003b30a8778c90a6e675cc961c83ae203cef7ba380b4dbf6fb9a53faac2694b4486f319fa4560c5a4099db0c98bc095cc59d3beb2f2c9cd14e935674494128b2912b310c437a7b58e3cebfdee72eb0c70428936c1a0c959fa2ff33efd6559167538ce22e9e949c122330a9d038073b6cfc7e38bddcb8bf91b62ee79772c7886058e2d949c29327433cdeba1c79aa951b049c0908f1d33e2669b93f810455a921f1cfe0a0ed591da7d0059ce518b10a111ba85814c1b6bc674d25443604c171626f1781aaf8b9bb5f11abffbc2ec6c3061c7e6d52b7a4039ca43e341f33a2aad5c2452fd1f02e24ede2f4c4829f8c5a0194a7f67660eaad4ba2340976596218662e03dcafad12f67c544b6b35e285fd4b2ea02e08702ff1dde2058c9f3cd87a18939fa316327584bb82c891aa44b135ed843286d4eccbbaa3b032b677022328380cc246feb9ddcae8789e1e00e1f1fa2cbf5d5b704f7af8e2c3a82430dad07f9f472b2a017e6f460c2b326f090d18601eecc9b1b513a6024e3103b1e316d66aa315b73974051a4415cd7ae35f4128b9866638529c59a2c123bdbb9c5da7aeb40618052c1c2d983cca3a61e2c44e4c59a2e86fd1a17395522ee77ba4e88fa9c29b91e7bf569c06a762ad074a852244ffb4f4fd2d80ff6cc6a16077d8cebb2463c95e3eed915cce30dece6486ea72a2786a25de419a8dce67d8b59b92cd83609af6d45b20fdcb6dd793a1d5f8041cd718a18c145443aa67b5370ad48007d0b5f91daa6e34be851ef02baa81a873ec50949ad11db4665c3e822e94eafce39c204c4a3215958bfe90471fe509f8f66caaeb6e3024b72d4c78925e044acd6e069b173ccdd9409decb6b99d03b889e1959a5f7e63c9e62e7fb33b811e2c1c59407345030481ec0d4783bce6d7bcffb085da831842a04cfa871850f61ffc0fabbc0b40cfac70c5b6203dc09e7e5cc1e6b2a628e22db3444c57edbc00d413b53075ef2a73908dcd92d9240e3163bbd7c1ea40a084570b9968ef9d961e9c3c7b6e18c4435059750b987148911ab80e02938f3d64829e91d8ec8f4bdeb141108a877eba448738f656fe6c6b14f37bc4218678c2b40d229b4c4c2ae44b8d514f73daa3398ac6000be2583af541bc4529d161d6706da9d1f0d349bcfb4ff89b55a509363c54a95635c6ff94e9c7091faa96eeb891a8efadd54b2e235219088e0e1eeb55e3917ea312102a74baafd2124d5e3a2dab587fbd0d9e2167526ebc800d49ffa05bff6ff5677226d85eb4d1f21279806b3d254e277eb322e16514f2528b48f1b5d6d7da4c3fbeba0377238bb6c7bb12ed444c94df49879de1c2f2b13ba08578b81e3d08d92f2a772b02eb2259a307e7d97757f22c079db4b32e06e71df15b0502de748580f68ca7e89f6eca6955e6ae73554614396e9386073eac4ddda9a4dc6b9c07f2a597abc3a3f5d9c480d0774548bfa1d21b51b3b7b82e4938375c879bb2eeba02db7d027ebdd9f411ac012023b320da8bd69f601d0c7649696e2ec8d77f6449ed50ce03c2e09970f71b88193d02bf066b9737929928f208a25da5b102733e453b406e2b1bf6bca3a61ab6b6617077db9cae417a139da15fb44039af66e45c1ec284450e3f7869f62d510727c94a4e33ef75be901a2e4baecf61fd65180cd9ab588f62253f176c6d32ed48ab91e00720e761944ce735771ff83c7d7d6ae2b6d96db8c08c3bed240c1d7394a73635cc1fa352c22aad357ec8355a969ab07cc08a99106ec0879e9af70ca3c4affa1bc2fb0477046ceb3f7db8407cd05d7ef5264842769b09075f6aca28c7539f754f2ab43d8ac966547e199b27d458baa39df20e32f1c609eee59291778c3c6d85de8b18d7cf92fbfdefe76c1bb8b612c61be39c3c301c8d19ad5de56e749ec44dd94773388d7fa8b50cf75bcdb59ce97c0b87f6f23949f60c97ed889b81731d6ae155574ce2e71521e6c05fd994dde4e984340de4b71d875c1e6fdad9b46307c2a350fb3df9e03a8d2f596591c1681caa54dd07752519f79acedff294348a920ff4dd925fa8c27cf0477a4934d4201f51871fef4378cc76dcfaa985062ce2a53c031896ff649dd8aa69b6f6eb76e70647599f424744483837e97e6a302128200c304b4d7a8058495cd5434afd3f58eca2014be54c072c7041c510a8e105906a90ba1898d46a0b0d1f211b5c576435e47626d9deb4ebad549a102990059125474e4a7393e35aba91b38d00cb44ee06318f64199c3506fc53b209504b76b73181a4d2b4d298e04f5764e13b3a992300efb3caf2794b5a54637f316a603f0b50aaf478bb3ceff2ac3a77e309a7592a498eb9577eb8d7ccb989513f628f478415901dd02a072bd437257098c4c9cc8e67c1837ef13c38c49f791261c487391463886c815cb37f173176d8bb41b9c80a215545f84d28a77a58c3211d0a7324a06b9eeb2576eaeca7761efe1c3235b14190f6e34eef87bf857130f65d2764c703cce9883dfc3a8d8c90c99f4ee765f68263b073d26bb585cd2de50c8c98ab9605f91e95a820b82051b95dfcfad1ec4f26df443417c7c0727890e79d3e14203dab694f1fdc1e29e020173efd3dac567c0fa67890118ba630fd212e4a8bf1688d1e622e392c784e2d36ba887777a2df13ae43555cb71d9591cadd5c5b77b3e93f12f03ab91d1946d11b532385bc0eeb79d323f9bf263ba04e5d74b66b95316e07eb73f2196f4f9bba906b59306098cc85cc7958c8d240538668a5a49c480a3f4ce8ff05aa19b6f1b96816a94004314e7a021fabec880ff79a7366be4df988206cce768d0c222ff50737069137524acdf02ffe2be4dfb7e5ede03c0a011f8ce1a9952184154fdab1bb9767f715089897294a2db972899e56b270698cd8c6e3abd4432c9a7b05e2bf1980ed3b9fc5e3e4e446668467b4cc418276533791a569305bb33feab43a85a81cb743de78baf5f5ed8206db1a9db4af041c599caed6cfa9d2a6bc6101e8346ff65b861547487de89bdf6d67f6b21ef79e124d2a544721a8f545a658e7c9c0010d0b926912488b101c9e975f878d9fec63b7abe2998a11f12b9a76f35fd727e732954e15881217bf9b9539c1a5f85494d9e7fd43ce04350deda64793fcec67bf2f5250a2710b33689e135159fc339ee75ed2cb0c756f862c9aae981ed78b1cae302a96414a44e90c7b6a59311ab62508d614560e4534dd7e49dd3f8f010e5186a916853fba9dbc0f1f67cdda894de813250f80e49c1419871e6b77c20c13dbf8ea78c05f25c7ffb6918fd99e0eb3e406a0e99a44ad5121dd88977be14dc883b2e955a050c34ca9bda58205924aa7ec2659b374e9db003466710da6bc5d854646573e26e6dd3a30773cbca9c3e4013fe63e3b754bf72d48d0a0772082241db5442b557ddab94f0372d8753df7c45f58e6ea8227954e6e2842efb44b51da6ebfde2ebd0ca97fae3981280b370f2e298006559e4dd264be171da97e5b1d673c30d5ddb17c76fdd894710658f58583a7ce27cc04dbf3b3de8723df896c0c70c04a1f3397ebae43441b81290e52263beed66030d163b6efe5523fccec4d8cf5bb0f108bfb5cdb482fe0b381c0c2b93ae336957ff08408ec19d90a37fa97b175e8caa459d26cf689e3ee704e1ac0dddda1c91417ffe6ae2ffb4a85be359cb18244ec750d542e7afe343ea999d4ea882da7731d60766f81902b768d281ee47ee0cbc302ba28eea2ed34fe4bd4121f85f7918adc92b3fd67e749340787e17359ab3db802fb14e4c2897a2f2e30c40823a3b3bcd110ad7beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc092748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c91", "host_offset": 3000, - "locator_plaintext": "a70082a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8a1007842697066733a2f2f62616679626569676479727a74357366703775646d37687537367568377932366e6633656675796c71616266336f636c67747179353566627a64690158200ac808598a3da15de6cb7044f8a7ac60a55c2f1a64d7a36d17c79b74579467810258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e205832353531392049417861374664446e6836324d526b444b6a46375a7856543871326a4c5a6c5545384f5955654b31726b6b0a4b4e303753547769492f644865395861644833325a664674674e67584a532b3637752b50466b57646c466f0a2d2d2d2071796b634a7476302b3376324b646d2f437a535631784a4d704e5a582f49776e446c62526d3630767861670a035820a62604fb56d89d37627c9070de21dd62ae22ce26fe28ae01a6b5ed782fd543a8041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590e7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "locator_sealed": "6167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6b4e67484f775a434135654b516832444c516c55753949464d7869654f702f784f61457a734f5161535333782f65523734586c6470696b64643730616c6c712b0a416e343454377876385334456f65796965526f4f6d5a43376a4c396256394469506e564d3046385a5264436d3245576868496548685551726574374b774a444d0a64687a756862494f49353964556e4b6764696566795038505a656b7a6b43527758596862456f67485957770a2d2d2d2059337534684437433451557a34507378436a5951514e42526a64746a7a6834656b544e4c726f6c78426e590a65ea20b4bbc9da9f24a8b9f18cc00c6bc50207140801897dc9ce71b8012bc3b126f5510fd01f818d6852f8ddc117a3152a3e760eb634928de17e708f5194f5b20a0a3067e418b57a95df7b2c9cb2de42c603399a1056bfc65f38152bfcd58501b252a5f5b36996eab5b63e8c44fa72b28c60e913caf3579123d5c1b167749830b7adac1c12a9059295725ed717d50f1d0065c111bd9958177408aa585d905a530ba41aadde33da6d9ac5f4976e55894829a955d143a94cb63d8c12b134704c707a9e4b696226a44a9efe4fe156425727d9c9e0f67b79a206581d02c771a0443da59207a4d1a4d40376ea0c8cff8444d41bbfcf228cc2d044ac5e1c834206e036b44cf9fbc8930f146b9cc1ddbea46f173c9ebffe705de2afed9a730c9e702090ba0104641199449b917916e45e7b7365bd8a7cee9f39f728801984b39fced931e6b326a3a30bb17b41697dee57bacf01578d86852efb16a9c0d8ababcbb38c8cca7bcb90d8bcce8cd1b7740360c21ce702c0948ab9747bbbe57042117d9e24f5b46d847d893ab1ba61c6f5e857794219db7f1c620e27e80f040282287fb47894766babc1178356c3918cbccbc4ce29e04315ff80a5f2de8c8cc6e47809ab9e0455406e761219f11ab80f85241e9bc870427d04b1568ea973fb46f57446d3ddfe2a774ebd1afbe82d56cf88df8ee24b34d4f788ba03e4c28eee79726a48140e4f7545253d8a0116b81e876e05530f9efd7754a63242d6a514975235b73e14dbd154d9b44c1a192f134e20b38f90fa5b856853d3a4297dfc48d8b43916cb3eb902d95d6f8a5f45457ad49dae3de83ff8614befc6a351205e66d8f812a528db70b6b53a52be8a4f1f30ecf2486e57cd6c7ce7cdf363328fa058c4b0b03007b89d1cf9257142a7ddd52a7d5ab4aab79a151e62d10835a4c00410968e41c951644a7d2772334a097a997a1b6031fa59376c0e0932cf71312c71c630b53c53d345315f369961260f8ebb92610f9bdce1413c6cb2be47885093f278008f349f3e5df44b925db20c1caa9afdcba837d5a6ca1f4f4b2e83b81bb3e62fb5053ec4fff01ab6f8a39bef140c4f35287ec105dccef8dc7d9f8736ed475f916b3e20767bb4067b9b7624a3ca81a6719662bdaeff3c757e81f8865cbd42dd84b93db2a3bc758e9a0d82c6c88827c5a27ace0c565ce22edf458d9ae008eb69abf74bdf36f883860aabbba9b5912856c9d32fab5c5c2b2b242a64a1f9d0d3ca466207b4553586a242f81c396de605fcb001e2d34e25d1c81bf14f5e31842c071fafdb6d2a0552b57d6eb08843d0b3fd8f7e9807723e3e404ea7e5a0275df61ef6be9cbf4ff74ef5df0184531641084bdf7bc8dcb13085d77581dc3035ae73e59ac1f9289eea23808c7bda710232230e7f2342df1657e3d302bde341b8c52a56cea90dd4727991386670ac765a27573806a738152e5432a7acbb34453c0f438a6359e9b966084a9180c692a3a212b8ad5ddf52286d4768203a2cb2e602812688a696b1b17de688ce5839d6d89252f30f90641f0a730840f2c105ea68518c8dbb74d82dcc5115b2fdba5cd16c146eb0963d2575600e22f87b1f914268583b19602d92e2ec5e76ca338fd1e15a61fa92ccc3475283e291185a23de78ec9064092afa5f2a4cbed83b56c2d75784f4764e8fdd04548a4e1cf849bf4e2bcab8c412767fb8507b4af37aa9873ab0ace2993848acf670727c327367c20defc285f1153e17283daec4ec28164ae028ba1183f23b32c971fb4248809c2cdda32c5fc74aa291665e5bc3703536f5ad60514948deae0e3994a76cb305bf666c9e8b255d0e4de7330613d650faeb8ff3f797e618a8a6f5622c3c9f7d645c4cf94d7aac1494c5260eaa6b4957a5cc5e0096697c8989a87b61b50d7dcb487b4f183578741bcde8df3c2b6602a251703ac8522e1b4a7ecba0a458f7832e1f4abddeff1ea7d8390158778248c81f9aea12c78dd9eccf08c16700d006fe80e3aa92af343dd1f67c46868f6da781b983c6ae567fc2213864b0a89d1da73a1b72f61d6e07d3bc987bf2dcb36a9e981ede9115b7714d52c1514774a631448240333c8e98ea2915ac5d7b2e300df3d7da8ca9d73c3753bfb0999b59cf9ff24a28c976c454d0e878c3422bb32c5bf0aa413a2f2c232df71ccf4f9412bfac58d9186dfb820c47fabb747ae3828600d6409af0ef2baeca226cd435f5eb4316a867e56627ac723380e6e4df463b3065f821129bace999a509ffbc30bc8fbb741f71f4f0aa9ceba9855a75ea9297eec9f834ff3cf6ed44a3712e2724a9a94716ef2a8d4a0225a5a3dd3894848be32f3a7e1bf14605bb0d1a91297e96ada0589171b0aa20666efc9e38965fea23f567d61b96185364cb53a4ca03c7e54b6c47fcc8ff7197a3f777ce01623627dc2d526151e65c408ab742c4c30cd7145a290b00893e9a312cb34c9205315173ab5696fa02be95641c306b5459c7cd9b01a5a93ef55ad0099db0cf081f069a2f7f7984f69574b9a9c7623c32f0f3da774fd0901ddacdd89acfbc27810efbcae4a0706fb8d597a6138404a823533ed6156377fe2b445c6c7819503cf29f5291912d68ecff2a27f0b79e3052a3950ce1c14fefa538cf11992e14ef4bec75fcbcdfeea29100014455309ef600711b6d4ebb43c7de994b3024be852832cbb06e2b67faf9d1c5596d3f719d9b42f9b182945ffffef6d1cfa0c77b1acb6bbaa25ed6d8d8e7416264baa7cea0290ff066e71f44f4fa0eed8ba79bb13b76496666cdac31faf864022e9fd00cb485c54cfe1662a9e773c51c3726464f4f131138ca23b577ce7ca60c5635d3230971a150afa6d9a3dd812783baf22abdd1709db9091a373be04067dad575357085e343349261dbf3fe963a95a3898f2ce34334262bed0fce9ed3c4141b31430bff947b7bbc7233af4a2937361a1bc8a39e978ea76928befced13e78733abdb7585a5e38ba2e164487ec92b23dab673573f6e9bf335fdf466c011380f81822e9f0cfceb27072e08324fd1936feb33bfdd8012af9d31d79be5c7e9c3caf635df1e6d9490943f66cf0d688c84ce8f4e631e22c118d0841446f8e16338f876c7ed3575cf4990c104ec14d2149772079b71e2913193410b81e068e058b71852e80b3425101cdd66436ad475cdd792a67e9244b8cb752893624fe96446c10a3b6cea8c85ce27b54ac8d650dc9a612edde9790b0f8cd859309c35f10e120e70770e931a7198b33f2a0b128d1aa5874cb8ac17b55a3aa2446e0c29d7bc07d341819fb3ac7084ef6fa6c2ccd1f7edc1be590878e8c22ea882b08a8877a7ea16e3bea6ce6a59e45095a90992a6497eb92454a75f24e78ea0c462d28757f0296261f1524027a8cace29dcd2882054c2de59820b37ceb81b4c74574f8e7272fa01771e9f26c2202d017094dcf9ba6dfdc83b6cd58aea5f3ccf5e6e065c1521e55eec06d06ed137e418bf371652eaf02a3f283d55725330edb40a33b02717e8c6bcb437b4aca7f6e1373f8f33f251c15d3f064c3ca5cb4a1696ef0e0dbac3572d760598bd2a9783b1d33e9f19f3dee0b2b4b6218a94a446d1b1bdb3bdb57d70675b434cdf87721bb910bd808e34498ff6566ba84d328afefe95b0ebc3f8a2e0bde53f02c729ed4f5a5151d0ad1aef4b5741808e955f50a3dcaedeb80c3b33494ac2d94b54881349efa1b9b560185bb6039588efcfb8b63c8538f48700f5d592cb08afa2b7cca34a5d3d972faca8553f74f8ded46b3dbb85f92f976dbb59ea59f72606daf1a62e164f37febdf44111a88b19ff1ccd01afb4adf6dc0fe59c2ded959e18e5cfd4ad37398d23e1aa672b67442c5cbc9ac31d3f94dd78976b3b6271e427c7a3d5d0defc4f5dfc7e61a10a6cf460195c551241327e42cb21a4a6bb448175b8bb3210efbb95eb9a69d94b03eb36233aceb58cdb1ddaaba9b4bf0bcfbb252063200f1829f30bf895e652c1062950117cd6f5662ed29c75a162ff60fad395b386337c8a4390bf0a7b4bd86e146404126265bd511909438f1503edcba451286d9a550e86b4a23125819510423af3097d3f786d7e3d6a7309245468eb8be478d7c627425b3b8c46ea2cf2b63169cc7906a4f879b60d5101baaa72b7a5a61fdd00c44bdf2d129d305779909730a9a49854c8f40c87f709c828591d926adaee844e5060ba168fecd5d8a07ca859d96683e61756a83bd2b2c21abca699c0df9a79784f12ce860868ad93d064f0577d6810bc0447e97de386d3df5956cdc534813cb5a6a0eb52c06855d69b0d16b3e086b1ad1c262a1c6022893c3c456a68f5ae083b229bed0b4422c0ca92285fc12913d83c6e6dd5b81dd1145848be2b44f638e7a97a7bb7b6141ad402c62e02104dd953d9cf3f26a10a1f869d873d2e4485b1c072ebae52f0dfb5a7c76e1b9d4bf2994862ebef8d0b64ed6b9bdb70dfd858277dbae2fd2c930ba5f7a6f946f75d9c10708eb099f81382875dd39e422e73387575eb8c8fcfb1b47e69e695aca4384d43fb0dda680b641612a5354bd5f51433607a6825850c83344fb789e929a29b09b45f2bbab2e42be4b02fc2a9ee4901e23211b72cded2fc852fb03aa434a4e24e6fa32b89622a4269c89494870a79a7c32c932cb1bf49124367a6b28b8a3b41f07f210e4267c386bff7bd84437d680e8cf0a2c5e98fbae26397fc7c6aba6de55105568196b7101c0d9042f1ab21b56db460b865cf8512516939ffad9232afc6776345412a28693b0d69a0ae0fd2f4524d8f0bfaa4b9cbc7d3690cec950034197b3f3b3ddc8aa9a54fd80b565aaa4994e4b9cbe8de6a61a21808ea77751f85e8af0d2894363b45771b2e1016c37bec7966383d46640855fb06fb7405bdbe07ecfdfdc5b3e1f035cb8db4ff47ec73dd6fb7c50abd8e977b60cf968f0c1139ad632aa27fd0ec2e57f15e5d947be0249d5d6c3c512bb8d4b4472b888529ac34f3de2d158a72956d1fd6c598e69e4bea43d94f483071f17cb800c47ddb388342b1cf9e5d0fe56576f01d9c790b801db2ccb393bd9b4c7ce03fac2c3bebe3927513e20f63f07aadc9cc3d14d6cc8f34ef2f8b64b02ad30c69f5643a1ecd2424efaa31f5c090a7bbfc07e16e5307ed5e6750c8fe47ac50620e1f8e17d996a19a41b7563cc83f48169d95ede33983f1d08145ab763056b1efb71367bf46eb3efc2ac7915886987ce7d0e6c3c096b5e3cd79979a318676ef03e94bc09e167cc39b5d07ac2af1e37b6046e5e9a9a95a6d5d0f377618a2619b182f8c4edeb94b0c97f00a44dedc6c708722687ba3de5fa5090e59c911a5b79db584b8bea5552234bd057ffcc303eb5fced6a7990d1da11911041a0a3c4b7c8d5687af57b0195150ac0dc604b71e00ecd76463704cd2a553019c65032adea9406e56169323aa57ed2fb4736c2e5dca1076f539e6169115c43d5f55634bd1c96979620f4ec3bb7cc5c0cbbc0dbe8c67f04e74df97be8c618d75940a95dd1e05bef1fa2cacb6663a1646df626f013a715a81cc93b5e04fa7ec874f529c1e6ea0140e1022e046ab99c34a8e44750f8e0f8be5644767604c708a1f866b33a80bb2df3c545899f66fb8732e432ea53358ee2612460d57cb960f5440c75b5b2a9cd4b6bfc09f67e861377ab4608ad9bd80dd76a40d172cdfd20784213451fb0dbd023b610efb47bf9d0c0e79c3841947af24a42e37d95c0725afa92b5eb1740cf6d73c39701343dff1e8efb18023fd680a116112a4c0536afecec0f8ba648576eacce35eb946c3ed6b804d0446fd46b89fb80f4288c349d0ee58ee523f3219106f1e18fe9e2d4c983fb6", - "extension_data": "a30078194361727461732064656c207669616a652061204c6973626f61017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830025911636167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a6b4e67484f775a434135654b516832444c516c55753949464d7869654f702f784f61457a734f5161535333782f65523734586c6470696b64643730616c6c712b0a416e343454377876385334456f65796965526f4f6d5a43376a4c396256394469506e564d3046385a5264436d3245576868496548685551726574374b774a444d0a64687a756862494f49353964556e4b6764696566795038505a656b7a6b43527758596862456f67485957770a2d2d2d2059337534684437433451557a34507378436a5951514e42526a64746a7a6834656b544e4c726f6c78426e590a65ea20b4bbc9da9f24a8b9f18cc00c6bc50207140801897dc9ce71b8012bc3b126f5510fd01f818d6852f8ddc117a3152a3e760eb634928de17e708f5194f5b20a0a3067e418b57a95df7b2c9cb2de42c603399a1056bfc65f38152bfcd58501b252a5f5b36996eab5b63e8c44fa72b28c60e913caf3579123d5c1b167749830b7adac1c12a9059295725ed717d50f1d0065c111bd9958177408aa585d905a530ba41aadde33da6d9ac5f4976e55894829a955d143a94cb63d8c12b134704c707a9e4b696226a44a9efe4fe156425727d9c9e0f67b79a206581d02c771a0443da59207a4d1a4d40376ea0c8cff8444d41bbfcf228cc2d044ac5e1c834206e036b44cf9fbc8930f146b9cc1ddbea46f173c9ebffe705de2afed9a730c9e702090ba0104641199449b917916e45e7b7365bd8a7cee9f39f728801984b39fced931e6b326a3a30bb17b41697dee57bacf01578d86852efb16a9c0d8ababcbb38c8cca7bcb90d8bcce8cd1b7740360c21ce702c0948ab9747bbbe57042117d9e24f5b46d847d893ab1ba61c6f5e857794219db7f1c620e27e80f040282287fb47894766babc1178356c3918cbccbc4ce29e04315ff80a5f2de8c8cc6e47809ab9e0455406e761219f11ab80f85241e9bc870427d04b1568ea973fb46f57446d3ddfe2a774ebd1afbe82d56cf88df8ee24b34d4f788ba03e4c28eee79726a48140e4f7545253d8a0116b81e876e05530f9efd7754a63242d6a514975235b73e14dbd154d9b44c1a192f134e20b38f90fa5b856853d3a4297dfc48d8b43916cb3eb902d95d6f8a5f45457ad49dae3de83ff8614befc6a351205e66d8f812a528db70b6b53a52be8a4f1f30ecf2486e57cd6c7ce7cdf363328fa058c4b0b03007b89d1cf9257142a7ddd52a7d5ab4aab79a151e62d10835a4c00410968e41c951644a7d2772334a097a997a1b6031fa59376c0e0932cf71312c71c630b53c53d345315f369961260f8ebb92610f9bdce1413c6cb2be47885093f278008f349f3e5df44b925db20c1caa9afdcba837d5a6ca1f4f4b2e83b81bb3e62fb5053ec4fff01ab6f8a39bef140c4f35287ec105dccef8dc7d9f8736ed475f916b3e20767bb4067b9b7624a3ca81a6719662bdaeff3c757e81f8865cbd42dd84b93db2a3bc758e9a0d82c6c88827c5a27ace0c565ce22edf458d9ae008eb69abf74bdf36f883860aabbba9b5912856c9d32fab5c5c2b2b242a64a1f9d0d3ca466207b4553586a242f81c396de605fcb001e2d34e25d1c81bf14f5e31842c071fafdb6d2a0552b57d6eb08843d0b3fd8f7e9807723e3e404ea7e5a0275df61ef6be9cbf4ff74ef5df0184531641084bdf7bc8dcb13085d77581dc3035ae73e59ac1f9289eea23808c7bda710232230e7f2342df1657e3d302bde341b8c52a56cea90dd4727991386670ac765a27573806a738152e5432a7acbb34453c0f438a6359e9b966084a9180c692a3a212b8ad5ddf52286d4768203a2cb2e602812688a696b1b17de688ce5839d6d89252f30f90641f0a730840f2c105ea68518c8dbb74d82dcc5115b2fdba5cd16c146eb0963d2575600e22f87b1f914268583b19602d92e2ec5e76ca338fd1e15a61fa92ccc3475283e291185a23de78ec9064092afa5f2a4cbed83b56c2d75784f4764e8fdd04548a4e1cf849bf4e2bcab8c412767fb8507b4af37aa9873ab0ace2993848acf670727c327367c20defc285f1153e17283daec4ec28164ae028ba1183f23b32c971fb4248809c2cdda32c5fc74aa291665e5bc3703536f5ad60514948deae0e3994a76cb305bf666c9e8b255d0e4de7330613d650faeb8ff3f797e618a8a6f5622c3c9f7d645c4cf94d7aac1494c5260eaa6b4957a5cc5e0096697c8989a87b61b50d7dcb487b4f183578741bcde8df3c2b6602a251703ac8522e1b4a7ecba0a458f7832e1f4abddeff1ea7d8390158778248c81f9aea12c78dd9eccf08c16700d006fe80e3aa92af343dd1f67c46868f6da781b983c6ae567fc2213864b0a89d1da73a1b72f61d6e07d3bc987bf2dcb36a9e981ede9115b7714d52c1514774a631448240333c8e98ea2915ac5d7b2e300df3d7da8ca9d73c3753bfb0999b59cf9ff24a28c976c454d0e878c3422bb32c5bf0aa413a2f2c232df71ccf4f9412bfac58d9186dfb820c47fabb747ae3828600d6409af0ef2baeca226cd435f5eb4316a867e56627ac723380e6e4df463b3065f821129bace999a509ffbc30bc8fbb741f71f4f0aa9ceba9855a75ea9297eec9f834ff3cf6ed44a3712e2724a9a94716ef2a8d4a0225a5a3dd3894848be32f3a7e1bf14605bb0d1a91297e96ada0589171b0aa20666efc9e38965fea23f567d61b96185364cb53a4ca03c7e54b6c47fcc8ff7197a3f777ce01623627dc2d526151e65c408ab742c4c30cd7145a290b00893e9a312cb34c9205315173ab5696fa02be95641c306b5459c7cd9b01a5a93ef55ad0099db0cf081f069a2f7f7984f69574b9a9c7623c32f0f3da774fd0901ddacdd89acfbc27810efbcae4a0706fb8d597a6138404a823533ed6156377fe2b445c6c7819503cf29f5291912d68ecff2a27f0b79e3052a3950ce1c14fefa538cf11992e14ef4bec75fcbcdfeea29100014455309ef600711b6d4ebb43c7de994b3024be852832cbb06e2b67faf9d1c5596d3f719d9b42f9b182945ffffef6d1cfa0c77b1acb6bbaa25ed6d8d8e7416264baa7cea0290ff066e71f44f4fa0eed8ba79bb13b76496666cdac31faf864022e9fd00cb485c54cfe1662a9e773c51c3726464f4f131138ca23b577ce7ca60c5635d3230971a150afa6d9a3dd812783baf22abdd1709db9091a373be04067dad575357085e343349261dbf3fe963a95a3898f2ce34334262bed0fce9ed3c4141b31430bff947b7bbc7233af4a2937361a1bc8a39e978ea76928befced13e78733abdb7585a5e38ba2e164487ec92b23dab673573f6e9bf335fdf466c011380f81822e9f0cfceb27072e08324fd1936feb33bfdd8012af9d31d79be5c7e9c3caf635df1e6d9490943f66cf0d688c84ce8f4e631e22c118d0841446f8e16338f876c7ed3575cf4990c104ec14d2149772079b71e2913193410b81e068e058b71852e80b3425101cdd66436ad475cdd792a67e9244b8cb752893624fe96446c10a3b6cea8c85ce27b54ac8d650dc9a612edde9790b0f8cd859309c35f10e120e70770e931a7198b33f2a0b128d1aa5874cb8ac17b55a3aa2446e0c29d7bc07d341819fb3ac7084ef6fa6c2ccd1f7edc1be590878e8c22ea882b08a8877a7ea16e3bea6ce6a59e45095a90992a6497eb92454a75f24e78ea0c462d28757f0296261f1524027a8cace29dcd2882054c2de59820b37ceb81b4c74574f8e7272fa01771e9f26c2202d017094dcf9ba6dfdc83b6cd58aea5f3ccf5e6e065c1521e55eec06d06ed137e418bf371652eaf02a3f283d55725330edb40a33b02717e8c6bcb437b4aca7f6e1373f8f33f251c15d3f064c3ca5cb4a1696ef0e0dbac3572d760598bd2a9783b1d33e9f19f3dee0b2b4b6218a94a446d1b1bdb3bdb57d70675b434cdf87721bb910bd808e34498ff6566ba84d328afefe95b0ebc3f8a2e0bde53f02c729ed4f5a5151d0ad1aef4b5741808e955f50a3dcaedeb80c3b33494ac2d94b54881349efa1b9b560185bb6039588efcfb8b63c8538f48700f5d592cb08afa2b7cca34a5d3d972faca8553f74f8ded46b3dbb85f92f976dbb59ea59f72606daf1a62e164f37febdf44111a88b19ff1ccd01afb4adf6dc0fe59c2ded959e18e5cfd4ad37398d23e1aa672b67442c5cbc9ac31d3f94dd78976b3b6271e427c7a3d5d0defc4f5dfc7e61a10a6cf460195c551241327e42cb21a4a6bb448175b8bb3210efbb95eb9a69d94b03eb36233aceb58cdb1ddaaba9b4bf0bcfbb252063200f1829f30bf895e652c1062950117cd6f5662ed29c75a162ff60fad395b386337c8a4390bf0a7b4bd86e146404126265bd511909438f1503edcba451286d9a550e86b4a23125819510423af3097d3f786d7e3d6a7309245468eb8be478d7c627425b3b8c46ea2cf2b63169cc7906a4f879b60d5101baaa72b7a5a61fdd00c44bdf2d129d305779909730a9a49854c8f40c87f709c828591d926adaee844e5060ba168fecd5d8a07ca859d96683e61756a83bd2b2c21abca699c0df9a79784f12ce860868ad93d064f0577d6810bc0447e97de386d3df5956cdc534813cb5a6a0eb52c06855d69b0d16b3e086b1ad1c262a1c6022893c3c456a68f5ae083b229bed0b4422c0ca92285fc12913d83c6e6dd5b81dd1145848be2b44f638e7a97a7bb7b6141ad402c62e02104dd953d9cf3f26a10a1f869d873d2e4485b1c072ebae52f0dfb5a7c76e1b9d4bf2994862ebef8d0b64ed6b9bdb70dfd858277dbae2fd2c930ba5f7a6f946f75d9c10708eb099f81382875dd39e422e73387575eb8c8fcfb1b47e69e695aca4384d43fb0dda680b641612a5354bd5f51433607a6825850c83344fb789e929a29b09b45f2bbab2e42be4b02fc2a9ee4901e23211b72cded2fc852fb03aa434a4e24e6fa32b89622a4269c89494870a79a7c32c932cb1bf49124367a6b28b8a3b41f07f210e4267c386bff7bd84437d680e8cf0a2c5e98fbae26397fc7c6aba6de55105568196b7101c0d9042f1ab21b56db460b865cf8512516939ffad9232afc6776345412a28693b0d69a0ae0fd2f4524d8f0bfaa4b9cbc7d3690cec950034197b3f3b3ddc8aa9a54fd80b565aaa4994e4b9cbe8de6a61a21808ea77751f85e8af0d2894363b45771b2e1016c37bec7966383d46640855fb06fb7405bdbe07ecfdfdc5b3e1f035cb8db4ff47ec73dd6fb7c50abd8e977b60cf968f0c1139ad632aa27fd0ec2e57f15e5d947be0249d5d6c3c512bb8d4b4472b888529ac34f3de2d158a72956d1fd6c598e69e4bea43d94f483071f17cb800c47ddb388342b1cf9e5d0fe56576f01d9c790b801db2ccb393bd9b4c7ce03fac2c3bebe3927513e20f63f07aadc9cc3d14d6cc8f34ef2f8b64b02ad30c69f5643a1ecd2424efaa31f5c090a7bbfc07e16e5307ed5e6750c8fe47ac50620e1f8e17d996a19a41b7563cc83f48169d95ede33983f1d08145ab763056b1efb71367bf46eb3efc2ac7915886987ce7d0e6c3c096b5e3cd79979a318676ef03e94bc09e167cc39b5d07ac2af1e37b6046e5e9a9a95a6d5d0f377618a2619b182f8c4edeb94b0c97f00a44dedc6c708722687ba3de5fa5090e59c911a5b79db584b8bea5552234bd057ffcc303eb5fced6a7990d1da11911041a0a3c4b7c8d5687af57b0195150ac0dc604b71e00ecd76463704cd2a553019c65032adea9406e56169323aa57ed2fb4736c2e5dca1076f539e6169115c43d5f55634bd1c96979620f4ec3bb7cc5c0cbbc0dbe8c67f04e74df97be8c618d75940a95dd1e05bef1fa2cacb6663a1646df626f013a715a81cc93b5e04fa7ec874f529c1e6ea0140e1022e046ab99c34a8e44750f8e0f8be5644767604c708a1f866b33a80bb2df3c545899f66fb8732e432ea53358ee2612460d57cb960f5440c75b5b2a9cd4b6bfc09f67e861377ab4608ad9bd80dd76a40d172cdfd20784213451fb0dbd023b610efb47bf9d0c0e79c3841947af24a42e37d95c0725afa92b5eb1740cf6d73c39701343dff1e8efb18023fd680a116112a4c0536afecec0f8ba648576eacce35eb946c3ed6b804d0446fd46b89fb80f4288c349d0ee58ee523f3219106f1e18fe9e2d4c983fb6", + "locator_plaintext": "a70082a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8a1007842697066733a2f2f62616679626569676479727a74357366703775646d37687537367568377932366e6633656675796c71616266336f636c67747179353566627a6469015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590e7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "locator_sealed": "6167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a675554654c596368513257484d4e3176395164305576556f673745353234782f4678305374524765596349486241322b3066396b647070676a625941314e59700a443957316138463756334d31526954504172426c52522b6e673475586538425a4645622f6d695548675135334d65505a75684658624a647041493952334144470a71415a68453230742b596947514431346a31616d62305331356a384d576542557178676e70782f343439730a2d2d2d203366676d535a5559774a384170592b37464f65675550766b336a796e6a4d6c54367564386d6d55544d76510aa47876ea066ab55de23ce2e1871d26596c041b696929f77032ffc321c8d447c5ab5a67d30ad9871c05fab24a3e457a6c22506a413c682653e7e00cc9e73822c7f8c4c057920484942781e9eb40ce6fb8c2bc124a8ecc3190acfd63d3c493ce3842de6341880f0836619b6e985b07c3a20605cfedb16c74fbc8f23a2ffce2aee119cb3f8cda6c5180b45db58c0c044c8c91493724717f2ae632a53e68514af36676937c8c16da95061d88be897de59f13c98a910f4f1b73b93c8f1e7ca2e7064e3185802e432d7a8b63e5d430829c96ffd319862b5e9f228bbd5e93cd7f25a7b0bd107ef4ed9f858d00c47cf11cf37effd8230e0a8c997de5ba4da0e63f5024f19aa08d581fbc0382ef3587ac4eba97f68ee6a55a385c58f7e1b9721a0371465edfc4bc52beff5e49564a62887767a1d6dc0a35187923063fc35ba02922267e7f2c1f57451d2588192d9661a3119651d2f93f98f549dd2b7de22d5faa4e232a517689da919aee831941d5b9d2e9a36667de260b8e87aa7da7277ccf5a0073e250872b8eb68f4ae743e387f9b8aaace9de3c7e1d5f04b2252c43d0e1dceead50860ff8f2809c9e3ca6b092c72380225f70064f4c41fd4df03ef5c462d6b689db2850b7fa80c020653e8636fe202c936ffa047b31aef12712d2e12fb5c0ec40fe63a6d75132b9983f4c9d2b7a269024d2c06619fb288827562b7d90b365ab3aee3deb21c516e08c8a26be3948375760a83778c3cea1b437f01d415068a236f12bd15f9957e340d846770a2779cf32675842805b9d6fe2dde5599858440c15486c398ee66e3a772fc40ec9011204d4cdc4b78cf545c1267d30e383951044ca803df3f57c40a73a64b86cdd7aa97d4352404163f378ac452b1eedfcb069ffb1bd24a4dfd7dc547db281899e16e9bf2193dd27fd34734dd22c35dc09f906d4eac18485a88d00240d51f957fc2417db195dc1191d1177c15f80d5b0e1446dc0a26787569ec86552d5f1424b1c4d35163f0b3c81d7c1345e5a2ffa547e3b4911f81d597b91f5df9a14bd57375ee4e1a40696c232fd0016a2fc3690a34045d7c0fb5748942ca36fde3afe9e89148f36cb797119ea58a9367e4fb32044f78adc7bdb961bc60461218ab44ecabfd9d9d78eca14df71667b7ff845e9dd022a970861ed32b4dc4a8f4c9a20755d2b0bb553e45693f39ad6cb4491d9fc56f3db7c003d75245ce4e4ad4810eb81cce81f6c7eb684a2b58f59fe6bf30c41965e61c9971b61c6b80305104891de4653e6fa12168969f7111e77c696def7708415ed1b94b9fbc069cfc600a246e154d79c49325bbfa6eb88e2a4cff6f511c65bc57b650df6b29fc917eddf55501975633e589ec7a5db6da30c6d851945830dea4d94236681a2ee41dd9989f34ff59b3c4b668482812c21fe921db22cf55644d25cfe1c10d866d1d7489d292908e4eaf0794a4403d16b92c601f281fda96149d99d4a673afbb944b0d541c17c9831cea0de0599d054f48265e16ce502a40750f61f7487fdd466c813ff64a21df82de2a3452d939be970c43d9a10e3e62601d5617135e22b37a56c6f25102eab015f034d00ac8529803e8a03a9723694f25b8c08fd415882cb85be6e8d8a4646acaf96c079716c20a3a87d0982dbf199d5356955d25f219f3509c29f3216f92cab99d11fbc463443bbabb6f1f4bfd91a1b0b635096c2dfca2b639e04797c3afe13bfbe11585a62f5d37c95f4655f0edfd001836a359558f9cd4453734960d0edd57065d0267b565a7e65e8b91db93428cc222c02f3b8ae7608b10f50d985792f04799384f0cba9df552d361b57753c8e07f5437fd2bb75905bc8b106bc432eef61a330fa5adbaba001bf9a6fe2c928343601208e550a97f4e5077fd3bee70f99ca4a7d5e658b5c8d7879e44fe3d7f8904351962ccc6f3c549894256d7d1dd2989af80ff406535157fb4784b5d1408607854037ddc49663c564ef1d0742f964e8b4402892e665d35cb4cc49d3f2c47de5ba281fefa933cc33df1581c243713f7efb4c6b6d25de1050ec3f7a617bd1d24d539393f3d7b983999451d8ad7534f4945cce0b3cb9ea6531b584818aa0d7dcae300259e7614e124dc3cd3f19670762e0e4e1e5b198d92482daf478cbd2e1863c7b284a9e162e25406d64858bac46db3e69d37b3dcc74098eb37555ad76c6f0ecfc1c1dd121127a2b676b562a2ed58d1f6c33bd86455e5782ecb74d4253edf9b3f87f2ea0d65afb05e12c62c27d97c7a93c34c8b55c61c2e7eb20e73cd9460d0d73f13f396b6a00978473930cd881110af382023e753c4952012fa72382149996882ade8e9bb4229da207c03a74da9ff189efd90dcc4c10c5486769d3edf62ce2bbabead70ef257a60883104f20fd190b6f7ad43b6c1fc06a4171283ff13e1eb1f53888f908fed30f27aa48da1eb833a712a4321a33e01779c08cbbf471de3a73800221e6a58f4bb2615c7dae026572ad4f98440f0a2a4c35116bc8e2efa152fe84c5420d0063c89834be4c965f50a0bc641bf9cce0c09a14a03eaea4c4df109f1193d93348ffe36b2876b68b7a076531301709187d1c8dfa61e4b5eeaee61564b4c4f3e0afc65d2194ab37e3a6fa71e1c71f3c62ea529dc5ddf0a1dedc701e9ef6ecae373b4892a94cdef41bd3afe168f4f576b920fbad199fd38673b90f8443aee70b7cb316928fa1283ad38db3d2908db73f331c44162f32fbc3c5df5e53bedfafd51bf9870685c489e34a732da6c8de223fb53e4245acf231bc5149dc5327537bf2013c99add11e3b78f846e7e2adf630ca47f7c399871885f25fb84b69be988dcff287b6fd602f25303f3dc09b7d1f8e010fa3105d5c4b87ab73937e719a98956216f7050c054ccddaec5756e1e06e68675f5545db1a314b68c989949ca731b0a1349a4991757cbc4e1cb71dbd060278eb497bfef1e57d234c1c4daea23f663a7bcf357e78641add54aab033812bcbe68192be731b6c49a68a38880772d9ef9263b744c518ffc7a9a26ed6c0ea3f91636a5a23ee09d609e39b9a4424965784ebc77e3df915b8c3582d78fa96f61d2de0bcd5347a4570f6435109667f2ac94496de27b45e2264f2a1a26a3d7978a493ec97c18a984bc8d3323988f0e2044fc361efad84e0c8cc3e228289a9b3aca082bfdd8458a876c93d185fb85756c6a20fa362d06446c58105612d4f525f23663500517d22934f6c50da4ac8b35302234aec78891d2acf6ce355074f234a340937a2854d42f921c65e5b58d630bd28dd9471a9a613b6b21f0ec55e4a82c775b0ee1d0b5ace9d813ec34b1196d6bb99454a2799356aa625efee1b33972124daca17d7897738293ce70cdc6b3089f3d9762779b573c8db3260d9ceb2d5e3f77faa12aa2ab5a69fb877306825e1f0ce700093e3cca02afa7b40a51fc618d935c7343534c9ec22ac747d706c4fcbd953519c541a71a4e59a74e27fe95800c676ddc6ff92f8963efb92f005c1a915fb69fc5e5f1ce4e72a64a2f28ff91eafced5af52431fbac632f38ced2b48d85b5f81259face19cd6ef6ce15e254b2b8e8744032431237e8cfe52f7dc0b7400e33f133c9bdd61ce6442177598f94e72e3b7c71cc5c37445f7444998bc7246a7fbedf383c709236e8724527611dae0a1a6a19d4a6ef822571bdcc2d376c0bdb53c12b795cc739663d418a0107d3128b7e50abcfe0f3994020f0d2f5108190db03903e481095bec58e2e68d0ff7a3efc7ee7cb08eb51868dfe3647de617559d8262724e414881467f64181b196d1194016fce801e845a1204f9e197b1b451f0b9f4d8bc24034700b639b545db6d3c801e108f33705a630758a032db8bdd0b3c4393b3b107e08bf4b38132fe570d7fa74f607097dd95febd1a3a5a68ad88e5842428692f8039df27fc1f32824d5139e54433f97abc82172b6f277dd7545f50c6ca1f1f264ac6baf2d9f486954fb96e40c72a798ae4d1b60981baaec72d7c45d56a3c45917ed604d902b24fc658e009cc357baef35e0743221ff6d3196c7f42293384a69a9179b7e6a198abac42a2b618d2e4fc8f29524a742d8a664dc20671749c401af455860897df33cd95afd39b37254bd798ef99e42c399d8f4d3db00a8cbf0c46f1a47520ce171943445caae5f42cb8ef7305633cd3a8abd5eef486110d7a150625fa59e41afd87e0c00db37aa98ffd8584d2b9490e956d82cc89a52d7cb840ae9c4652668a89a5d08945f6d349443e307820e48461182b7122740d342f8239c19b849897abb61d09a25ed85abc5cc28c06d757a94b548017f75d0de31c39d7463ba651271ee1f3b726c42708c7c6c698057cdd4920cf672687403d00b9c12fa1c1eb153cd01ff5dfdf79987c07475a069980a274c144960b5025b15c5bce788cc5299639ef724d48ee9fc3c174547787f78d9fc8ac878f1335127a342b49f51829d0db8d5b2d1346062eacf962690569b3d417afff0dd6717c5fea650b7a89dbc4b799a7c09f1041044127d946047de64f458415663042e947115d96e0eee7cd3fb67dbae7853636d9a6433e7af10f7f2c21e1b0b161f2205ff75a134eff40678a33fd0a21e2bec6281a64b8b26c936735df54dd514b87c6380aa52db7272334ab4872e019f6dbf4f803e722ef6f93aefafb156a4c20a5af99b8b75cc0d31f713ebece036f31df754a0053e782e78c47f8e911743a3e51cd77eb5b9a8393d8d3fc4cdfb29504b33dd447869211c97f6068703f9f86aeae6316378668cef95928307726b2125e51e9e81ee18d1652323bcd5cfe7b50da4e8fe4e5cc54f5fed1bb4ee0b32de08d9d63f63f5c452d89d5875d3d76543c9e50b94af630b737396c3e18dfdb9d94af0879adc8aaa23d2a9733da34a784e7a40fcfe27c19e8e56dfe3c417bafe34e32cbee1b399c8f4418e3667e136afc7f20747f6edf5032578a0ef4f4f9304c082f264e74c3aeeac417134f0703c44b15bed25fbd706b7d7763010d6e89747a18aa6c63f107a20818c73bc04d72ba43c11d9e47f7c1642678300285a4561cfbbcf44fe1c643264e60685d5e022a5e90de7237fe8f20aee5699269d7e6fbfa2a0a1a2a9ed29e440db7e635afa025c3d89a0287c60f37c87b222cd383e4b7612b76fa46d3299503bf999a0a92714440022246b169cb5906be06e4eba32a11c09d3dfc91a2d4ad4cc505d0be350e492ea43189e4297b9bc9dca729ea7b59e1fdc33894374de7e8b5d34cc0620987ee46de9275c9a7771f002dc0fa601235553608562b9593cc42f21154d9c057a0aff93a8fe13c5e75167eec6185d3616427eb320c2541a09c58a4ba22fa6cc757992a8191d01b19c6a29b312f99e111da7e0021080f4387207251a4a67a51521b7d1108d95fcda2560901da4a54388f29d63b9183dd98469fa472beddb0fb7a12d70b53e05e92ea3cee087a7e455c91ee5e7414f8a0908c68ed7f514e49fbc2f8a75a1bef29aed1d3bd10e15fb69cfef238c72b7f81a10ea49080dcfa0efb4a9c4594a244b27a87bb9e7fcbc4eaa644960d4dec86f050d64e53889210ded932d229fdce3bd67b900eec49779514f02651dbd67058568394a603c76dfa693e3638bdb7c8d8108f77eb25d5eaf5b54c13bce397d62d6d904b0a75dfa19945e60c1529f3ba1390694ecb6a46abe3f533417706980a9eb5488c12c6893f39c1e398bdbb0fb38c73119085f62460b098bc621a82f55f48786d0069f165781f0969303df4960a041db2b512ba77bc5926204d450806407dc65d921e58a420c71fd3c1b569ecc1399688e73157808f4b1aee881607ab4f1bef87d03470d27b22bf5b17", + "extension_data": "a30078194361727461732064656c207669616a652061204c6973626f61017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830025911636167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a675554654c596368513257484d4e3176395164305576556f673745353234782f4678305374524765596349486241322b3066396b647070676a625941314e59700a443957316138463756334d31526954504172426c52522b6e673475586538425a4645622f6d695548675135334d65505a75684658624a647041493952334144470a71415a68453230742b596947514431346a31616d62305331356a384d576542557178676e70782f343439730a2d2d2d203366676d535a5559774a384170592b37464f65675550766b336a796e6a4d6c54367564386d6d55544d76510aa47876ea066ab55de23ce2e1871d26596c041b696929f77032ffc321c8d447c5ab5a67d30ad9871c05fab24a3e457a6c22506a413c682653e7e00cc9e73822c7f8c4c057920484942781e9eb40ce6fb8c2bc124a8ecc3190acfd63d3c493ce3842de6341880f0836619b6e985b07c3a20605cfedb16c74fbc8f23a2ffce2aee119cb3f8cda6c5180b45db58c0c044c8c91493724717f2ae632a53e68514af36676937c8c16da95061d88be897de59f13c98a910f4f1b73b93c8f1e7ca2e7064e3185802e432d7a8b63e5d430829c96ffd319862b5e9f228bbd5e93cd7f25a7b0bd107ef4ed9f858d00c47cf11cf37effd8230e0a8c997de5ba4da0e63f5024f19aa08d581fbc0382ef3587ac4eba97f68ee6a55a385c58f7e1b9721a0371465edfc4bc52beff5e49564a62887767a1d6dc0a35187923063fc35ba02922267e7f2c1f57451d2588192d9661a3119651d2f93f98f549dd2b7de22d5faa4e232a517689da919aee831941d5b9d2e9a36667de260b8e87aa7da7277ccf5a0073e250872b8eb68f4ae743e387f9b8aaace9de3c7e1d5f04b2252c43d0e1dceead50860ff8f2809c9e3ca6b092c72380225f70064f4c41fd4df03ef5c462d6b689db2850b7fa80c020653e8636fe202c936ffa047b31aef12712d2e12fb5c0ec40fe63a6d75132b9983f4c9d2b7a269024d2c06619fb288827562b7d90b365ab3aee3deb21c516e08c8a26be3948375760a83778c3cea1b437f01d415068a236f12bd15f9957e340d846770a2779cf32675842805b9d6fe2dde5599858440c15486c398ee66e3a772fc40ec9011204d4cdc4b78cf545c1267d30e383951044ca803df3f57c40a73a64b86cdd7aa97d4352404163f378ac452b1eedfcb069ffb1bd24a4dfd7dc547db281899e16e9bf2193dd27fd34734dd22c35dc09f906d4eac18485a88d00240d51f957fc2417db195dc1191d1177c15f80d5b0e1446dc0a26787569ec86552d5f1424b1c4d35163f0b3c81d7c1345e5a2ffa547e3b4911f81d597b91f5df9a14bd57375ee4e1a40696c232fd0016a2fc3690a34045d7c0fb5748942ca36fde3afe9e89148f36cb797119ea58a9367e4fb32044f78adc7bdb961bc60461218ab44ecabfd9d9d78eca14df71667b7ff845e9dd022a970861ed32b4dc4a8f4c9a20755d2b0bb553e45693f39ad6cb4491d9fc56f3db7c003d75245ce4e4ad4810eb81cce81f6c7eb684a2b58f59fe6bf30c41965e61c9971b61c6b80305104891de4653e6fa12168969f7111e77c696def7708415ed1b94b9fbc069cfc600a246e154d79c49325bbfa6eb88e2a4cff6f511c65bc57b650df6b29fc917eddf55501975633e589ec7a5db6da30c6d851945830dea4d94236681a2ee41dd9989f34ff59b3c4b668482812c21fe921db22cf55644d25cfe1c10d866d1d7489d292908e4eaf0794a4403d16b92c601f281fda96149d99d4a673afbb944b0d541c17c9831cea0de0599d054f48265e16ce502a40750f61f7487fdd466c813ff64a21df82de2a3452d939be970c43d9a10e3e62601d5617135e22b37a56c6f25102eab015f034d00ac8529803e8a03a9723694f25b8c08fd415882cb85be6e8d8a4646acaf96c079716c20a3a87d0982dbf199d5356955d25f219f3509c29f3216f92cab99d11fbc463443bbabb6f1f4bfd91a1b0b635096c2dfca2b639e04797c3afe13bfbe11585a62f5d37c95f4655f0edfd001836a359558f9cd4453734960d0edd57065d0267b565a7e65e8b91db93428cc222c02f3b8ae7608b10f50d985792f04799384f0cba9df552d361b57753c8e07f5437fd2bb75905bc8b106bc432eef61a330fa5adbaba001bf9a6fe2c928343601208e550a97f4e5077fd3bee70f99ca4a7d5e658b5c8d7879e44fe3d7f8904351962ccc6f3c549894256d7d1dd2989af80ff406535157fb4784b5d1408607854037ddc49663c564ef1d0742f964e8b4402892e665d35cb4cc49d3f2c47de5ba281fefa933cc33df1581c243713f7efb4c6b6d25de1050ec3f7a617bd1d24d539393f3d7b983999451d8ad7534f4945cce0b3cb9ea6531b584818aa0d7dcae300259e7614e124dc3cd3f19670762e0e4e1e5b198d92482daf478cbd2e1863c7b284a9e162e25406d64858bac46db3e69d37b3dcc74098eb37555ad76c6f0ecfc1c1dd121127a2b676b562a2ed58d1f6c33bd86455e5782ecb74d4253edf9b3f87f2ea0d65afb05e12c62c27d97c7a93c34c8b55c61c2e7eb20e73cd9460d0d73f13f396b6a00978473930cd881110af382023e753c4952012fa72382149996882ade8e9bb4229da207c03a74da9ff189efd90dcc4c10c5486769d3edf62ce2bbabead70ef257a60883104f20fd190b6f7ad43b6c1fc06a4171283ff13e1eb1f53888f908fed30f27aa48da1eb833a712a4321a33e01779c08cbbf471de3a73800221e6a58f4bb2615c7dae026572ad4f98440f0a2a4c35116bc8e2efa152fe84c5420d0063c89834be4c965f50a0bc641bf9cce0c09a14a03eaea4c4df109f1193d93348ffe36b2876b68b7a076531301709187d1c8dfa61e4b5eeaee61564b4c4f3e0afc65d2194ab37e3a6fa71e1c71f3c62ea529dc5ddf0a1dedc701e9ef6ecae373b4892a94cdef41bd3afe168f4f576b920fbad199fd38673b90f8443aee70b7cb316928fa1283ad38db3d2908db73f331c44162f32fbc3c5df5e53bedfafd51bf9870685c489e34a732da6c8de223fb53e4245acf231bc5149dc5327537bf2013c99add11e3b78f846e7e2adf630ca47f7c399871885f25fb84b69be988dcff287b6fd602f25303f3dc09b7d1f8e010fa3105d5c4b87ab73937e719a98956216f7050c054ccddaec5756e1e06e68675f5545db1a314b68c989949ca731b0a1349a4991757cbc4e1cb71dbd060278eb497bfef1e57d234c1c4daea23f663a7bcf357e78641add54aab033812bcbe68192be731b6c49a68a38880772d9ef9263b744c518ffc7a9a26ed6c0ea3f91636a5a23ee09d609e39b9a4424965784ebc77e3df915b8c3582d78fa96f61d2de0bcd5347a4570f6435109667f2ac94496de27b45e2264f2a1a26a3d7978a493ec97c18a984bc8d3323988f0e2044fc361efad84e0c8cc3e228289a9b3aca082bfdd8458a876c93d185fb85756c6a20fa362d06446c58105612d4f525f23663500517d22934f6c50da4ac8b35302234aec78891d2acf6ce355074f234a340937a2854d42f921c65e5b58d630bd28dd9471a9a613b6b21f0ec55e4a82c775b0ee1d0b5ace9d813ec34b1196d6bb99454a2799356aa625efee1b33972124daca17d7897738293ce70cdc6b3089f3d9762779b573c8db3260d9ceb2d5e3f77faa12aa2ab5a69fb877306825e1f0ce700093e3cca02afa7b40a51fc618d935c7343534c9ec22ac747d706c4fcbd953519c541a71a4e59a74e27fe95800c676ddc6ff92f8963efb92f005c1a915fb69fc5e5f1ce4e72a64a2f28ff91eafced5af52431fbac632f38ced2b48d85b5f81259face19cd6ef6ce15e254b2b8e8744032431237e8cfe52f7dc0b7400e33f133c9bdd61ce6442177598f94e72e3b7c71cc5c37445f7444998bc7246a7fbedf383c709236e8724527611dae0a1a6a19d4a6ef822571bdcc2d376c0bdb53c12b795cc739663d418a0107d3128b7e50abcfe0f3994020f0d2f5108190db03903e481095bec58e2e68d0ff7a3efc7ee7cb08eb51868dfe3647de617559d8262724e414881467f64181b196d1194016fce801e845a1204f9e197b1b451f0b9f4d8bc24034700b639b545db6d3c801e108f33705a630758a032db8bdd0b3c4393b3b107e08bf4b38132fe570d7fa74f607097dd95febd1a3a5a68ad88e5842428692f8039df27fc1f32824d5139e54433f97abc82172b6f277dd7545f50c6ca1f1f264ac6baf2d9f486954fb96e40c72a798ae4d1b60981baaec72d7c45d56a3c45917ed604d902b24fc658e009cc357baef35e0743221ff6d3196c7f42293384a69a9179b7e6a198abac42a2b618d2e4fc8f29524a742d8a664dc20671749c401af455860897df33cd95afd39b37254bd798ef99e42c399d8f4d3db00a8cbf0c46f1a47520ce171943445caae5f42cb8ef7305633cd3a8abd5eef486110d7a150625fa59e41afd87e0c00db37aa98ffd8584d2b9490e956d82cc89a52d7cb840ae9c4652668a89a5d08945f6d349443e307820e48461182b7122740d342f8239c19b849897abb61d09a25ed85abc5cc28c06d757a94b548017f75d0de31c39d7463ba651271ee1f3b726c42708c7c6c698057cdd4920cf672687403d00b9c12fa1c1eb153cd01ff5dfdf79987c07475a069980a274c144960b5025b15c5bce788cc5299639ef724d48ee9fc3c174547787f78d9fc8ac878f1335127a342b49f51829d0db8d5b2d1346062eacf962690569b3d417afff0dd6717c5fea650b7a89dbc4b799a7c09f1041044127d946047de64f458415663042e947115d96e0eee7cd3fb67dbae7853636d9a6433e7af10f7f2c21e1b0b161f2205ff75a134eff40678a33fd0a21e2bec6281a64b8b26c936735df54dd514b87c6380aa52db7272334ab4872e019f6dbf4f803e722ef6f93aefafb156a4c20a5af99b8b75cc0d31f713ebece036f31df754a0053e782e78c47f8e911743a3e51cd77eb5b9a8393d8d3fc4cdfb29504b33dd447869211c97f6068703f9f86aeae6316378668cef95928307726b2125e51e9e81ee18d1652323bcd5cfe7b50da4e8fe4e5cc54f5fed1bb4ee0b32de08d9d63f63f5c452d89d5875d3d76543c9e50b94af630b737396c3e18dfdb9d94af0879adc8aaa23d2a9733da34a784e7a40fcfe27c19e8e56dfe3c417bafe34e32cbee1b399c8f4418e3667e136afc7f20747f6edf5032578a0ef4f4f9304c082f264e74c3aeeac417134f0703c44b15bed25fbd706b7d7763010d6e89747a18aa6c63f107a20818c73bc04d72ba43c11d9e47f7c1642678300285a4561cfbbcf44fe1c643264e60685d5e022a5e90de7237fe8f20aee5699269d7e6fbfa2a0a1a2a9ed29e440db7e635afa025c3d89a0287c60f37c87b222cd383e4b7612b76fa46d3299503bf999a0a92714440022246b169cb5906be06e4eba32a11c09d3dfc91a2d4ad4cc505d0be350e492ea43189e4297b9bc9dca729ea7b59e1fdc33894374de7e8b5d34cc0620987ee46de9275c9a7771f002dc0fa601235553608562b9593cc42f21154d9c057a0aff93a8fe13c5e75167eec6185d3616427eb320c2541a09c58a4ba22fa6cc757992a8191d01b19c6a29b312f99e111da7e0021080f4387207251a4a67a51521b7d1108d95fcda2560901da4a54388f29d63b9183dd98469fa472beddb0fb7a12d70b53e05e92ea3cee087a7e455c91ee5e7414f8a0908c68ed7f514e49fbc2f8a75a1bef29aed1d3bd10e15fb69cfef238c72b7f81a10ea49080dcfa0efb4a9c4594a244b27a87bb9e7fcbc4eaa644960d4dec86f050d64e53889210ded932d229fdce3bd67b900eec49779514f02651dbd67058568394a603c76dfa693e3638bdb7c8d8108f77eb25d5eaf5b54c13bce397d62d6d904b0a75dfa19945e60c1529f3ba1390694ecb6a46abe3f533417706980a9eb5488c12c6893f39c1e398bdbb0fb38c73119085f62460b098bc621a82f55f48786d0069f165781f0969303df4960a041db2b512ba77bc5926204d450806407dc65d921e58a420c71fd3c1b569ecc1399688e73157808f4b1aee881607ab4f1bef87d03470d27b22bf5b17", "addresses": [ { "uri": "https://ejemplo.org/foto.jpg", @@ -24,8 +24,8 @@ "host": "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi" } ], - "envelope_key": "0ac808598a3da15de6cb7044f8a7ac60a55c2f1a64d7a36d17c79b7457946781", - "rest_digest": "a62604fb56d89d37627c9070de21dd62ae22ce26fe28ae01a6b5ed782fd543a8", + "envelope_key": "b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda11", + "rest_digest": "0b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606", "rest_size": 5032, "capsule_digest": "da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd", "padding_cases": [ @@ -37,6 +37,18 @@ "base": 3000, "total": 4096 }, + { + "base": 3836, + "total": 4096 + }, + { + "base": 3837, + "total": 8192 + }, + { + "base": 3838, + "total": 4096 + }, { "base": 4000, "total": 4096 @@ -77,6 +89,10 @@ "base": 4090, "total": 4096 }, + { + "base": 4093, + "total": 4096 + }, { "base": 4094, "total": 8192 @@ -97,14 +113,46 @@ "base": 4100, "total": 8192 }, + { + "base": 7932, + "total": 8192 + }, + { + "base": 7933, + "total": 12288 + }, + { + "base": 7934, + "total": 8192 + }, { "base": 8160, "total": 8192 }, + { + "base": 8165, + "total": 8192 + }, + { + "base": 8166, + "total": 12288 + }, + { + "base": 8167, + "total": 8192 + }, + { + "base": 8189, + "total": 8192 + }, { "base": 8190, "total": 12288 }, + { + "base": 8191, + "total": 12288 + }, { "base": 8192, "total": 8192 @@ -116,6 +164,14 @@ { "base": 12000, "total": 12288 + }, + { + "base": 12287, + "total": 16384 + }, + { + "base": 12288, + "total": 12288 } ], "uri_cases": [ @@ -135,6 +191,10 @@ "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/ruta", "ok": true }, + { + "uri": "https://xn--pple-43d.com/", + "ok": true + }, { "uri": "", "ok": false @@ -200,8 +260,1085 @@ "ok": false }, { - "uri": "https://xn--pple-43d.com/", + "uri": "https://ejemplo.org", + "ok": true + }, + { + "uri": "https://ejemplo.org/a#parte", + "ok": true + }, + { + "uri": "https://ejemplo.org/~ana/(1),x;y=z!$\u0026'*+", + "ok": true + }, + { + "uri": "https://ejemplo.org/a%20b", + "ok": true + }, + { + "uri": "https://ejemplo.org/%41", + "ok": true + }, + { + "uri": "https://ejemplo.org:65535/", + "ok": true + }, + { + "uri": "https://[2606:4700::1111]:8443/a", + "ok": true + }, + { + "uri": "https:/ejemplo.org/a", + "ok": false + }, + { + "uri": "https:ejemplo.org/a", + "ok": false + }, + { + "uri": "//ejemplo.org/a", + "ok": false + }, + { + "uri": "ejemplo.org/a", + "ok": false + }, + { + "uri": "https://@ejemplo.org/", + "ok": false + }, + { + "uri": "https://ejemplo.org:443@otro.org/", + "ok": false + }, + { + "uri": "https://ejemplo.org:65536/", + "ok": false + }, + { + "uri": "https://ejemplo.org:/", + "ok": false + }, + { + "uri": "https://ejemplo.org:8a/", + "ok": false + }, + { + "uri": "https://[2606:4700::1111]x/", + "ok": false + }, + { + "uri": "https://[2606:4700::1111/", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\"b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\u003cb", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\u003eb", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\\b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a^b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a`b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a{b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a|b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a}b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\u0000b", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\tb", + "ok": false + }, + { + "uri": "https://ejemplo.org/a\nb", + "ok": false + }, + { + "uri": "https://ejemplo.org/ab", + "ok": false + }, + { + "uri": "https://ejémplo.org/", + "ok": false + }, + { + "uri": "https://ejemplo.org/%", + "ok": false + }, + { + "uri": "https://ejemplo.org/%4", + "ok": false + }, + { + "uri": "https://ejemplo.org/%zz", + "ok": false + }, + { + "uri": "https://ejemplo.org/%4g", + "ok": false + }, + { + "uri": "https://ejempl%6F.org/", + "ok": false + }, + { + "uri": "https://ejemplo.org\\otro.org/", + "ok": false + }, + { + "uri": "https://ejemplo.org/../a", + "ok": false + }, + { + "uri": "https://ejemplo.org/a/../b", + "ok": false + }, + { + "uri": "https://ejemplo.org/./a", + "ok": false + }, + { + "uri": "https://ejemplo.org/a/.", + "ok": false + }, + { + "uri": "https://ejemplo.org/a/..", + "ok": false + }, + { + "uri": "https://ejemplo.org/%2e%2e/a", + "ok": false + }, + { + "uri": "https://ejemplo.org/%2E%2E/a", + "ok": false + }, + { + "uri": "https://ejemplo.org/.%2e/a", + "ok": false + }, + { + "uri": "https://ejemplo.org/%2e/a", + "ok": false + }, + { + "uri": "https://ejemplo.org/a/..?b=1", + "ok": false + }, + { + "uri": "https://ejemplo.org/a/..#b", + "ok": false + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/../../ipns/x", + "ok": false + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/%2e%2e/x", + "ok": false + }, + { + "uri": "https://ejemplo.org/..a", + "ok": true + }, + { + "uri": "https://ejemplo.org/a..", + "ok": true + }, + { + "uri": "https://ejemplo.org/...", + "ok": true + }, + { + "uri": "https://ejemplo.org/.well-known/a", + "ok": true + }, + { + "uri": "https://ejemplo.org/%2e%2ea", + "ok": true + }, + { + "uri": "https://ejemplo.org/a//b", + "ok": true + }, + { + "uri": "https://ejemplo.org/a?b=/../c", + "ok": true + }, + { + "uri": "https://ejemplo.org/a#/../b", + "ok": true + }, + { + "uri": "https://0.0.0.0/", + "ok": false + }, + { + "uri": "https://0.255.255.255/", + "ok": false + }, + { + "uri": "https://1.0.0.0/", + "ok": true + }, + { + "uri": "https://10.0.0.0/", + "ok": false + }, + { + "uri": "https://10.255.255.255/", + "ok": false + }, + { + "uri": "https://9.255.255.255/", + "ok": true + }, + { + "uri": "https://11.0.0.0/", + "ok": true + }, + { + "uri": "https://100.64.0.0/", + "ok": false + }, + { + "uri": "https://100.127.255.255/", + "ok": false + }, + { + "uri": "https://100.63.255.255/", + "ok": true + }, + { + "uri": "https://100.128.0.0/", "ok": true + }, + { + "uri": "https://127.0.0.0/", + "ok": false + }, + { + "uri": "https://127.255.255.255/", + "ok": false + }, + { + "uri": "https://126.255.255.255/", + "ok": true + }, + { + "uri": "https://128.0.0.0/", + "ok": true + }, + { + "uri": "https://169.254.0.0/", + "ok": false + }, + { + "uri": "https://169.254.255.255/", + "ok": false + }, + { + "uri": "https://169.253.255.255/", + "ok": true + }, + { + "uri": "https://169.255.0.0/", + "ok": true + }, + { + "uri": "https://172.16.0.0/", + "ok": false + }, + { + "uri": "https://172.31.255.255/", + "ok": false + }, + { + "uri": "https://172.15.255.255/", + "ok": true + }, + { + "uri": "https://172.32.0.0/", + "ok": true + }, + { + "uri": "https://192.0.0.0/", + "ok": false + }, + { + "uri": "https://192.0.0.255/", + "ok": false + }, + { + "uri": "https://191.255.255.255/", + "ok": true + }, + { + "uri": "https://192.0.1.0/", + "ok": true + }, + { + "uri": "https://192.0.2.0/", + "ok": false + }, + { + "uri": "https://192.0.2.255/", + "ok": false + }, + { + "uri": "https://192.0.1.255/", + "ok": true + }, + { + "uri": "https://192.0.3.0/", + "ok": true + }, + { + "uri": "https://192.88.99.0/", + "ok": false + }, + { + "uri": "https://192.88.99.255/", + "ok": false + }, + { + "uri": "https://192.88.98.255/", + "ok": true + }, + { + "uri": "https://192.88.100.0/", + "ok": true + }, + { + "uri": "https://192.168.0.0/", + "ok": false + }, + { + "uri": "https://192.168.255.255/", + "ok": false + }, + { + "uri": "https://192.167.255.255/", + "ok": true + }, + { + "uri": "https://192.169.0.0/", + "ok": true + }, + { + "uri": "https://198.18.0.0/", + "ok": false + }, + { + "uri": "https://198.19.255.255/", + "ok": false + }, + { + "uri": "https://198.17.255.255/", + "ok": true + }, + { + "uri": "https://198.20.0.0/", + "ok": true + }, + { + "uri": "https://198.51.100.0/", + "ok": false + }, + { + "uri": "https://198.51.100.255/", + "ok": false + }, + { + "uri": "https://198.51.99.255/", + "ok": true + }, + { + "uri": "https://198.51.101.0/", + "ok": true + }, + { + "uri": "https://203.0.113.0/", + "ok": false + }, + { + "uri": "https://203.0.113.255/", + "ok": false + }, + { + "uri": "https://203.0.112.255/", + "ok": true + }, + { + "uri": "https://203.0.114.0/", + "ok": true + }, + { + "uri": "https://224.0.0.0/", + "ok": false + }, + { + "uri": "https://239.255.255.255/", + "ok": false + }, + { + "uri": "https://223.255.255.255/", + "ok": true + }, + { + "uri": "https://240.0.0.0/", + "ok": false + }, + { + "uri": "https://255.255.255.255/", + "ok": false + }, + { + "uri": "https://10.1.2.3/", + "ok": false + }, + { + "uri": "https://172.20.0.1/", + "ok": false + }, + { + "uri": "https://192.168.1.1/", + "ok": false + }, + { + "uri": "https://169.254.169.254/", + "ok": false + }, + { + "uri": "https://100.100.100.200/", + "ok": false + }, + { + "uri": "https://8.8.8.8/", + "ok": true + }, + { + "uri": "https://1.1.1.1:8443/a", + "ok": true + }, + { + "uri": "https://[::]/", + "ok": false + }, + { + "uri": "https://[::ffff:127.0.0.1]/", + "ok": false + }, + { + "uri": "https://[::ffff:8.8.8.8]/", + "ok": false + }, + { + "uri": "https://[::8.8.8.8]/", + "ok": false + }, + { + "uri": "https://[64:ff9b::7f00:1]/", + "ok": false + }, + { + "uri": "https://[64:ff9b::808:808]/", + "ok": false + }, + { + "uri": "https://[64:ff9b:1::808:808]/", + "ok": false + }, + { + "uri": "https://[2002::1]/", + "ok": false + }, + { + "uri": "https://[2002:808:808::1]/", + "ok": false + }, + { + "uri": "https://[2001::1]/", + "ok": false + }, + { + "uri": "https://[2001:0:4136:e378:8000:63bf:3fff:fdd2]/", + "ok": false + }, + { + "uri": "https://[2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff]/", + "ok": false + }, + { + "uri": "https://[2001:db8::1]/", + "ok": false + }, + { + "uri": "https://[2001:db8:ffff:ffff:ffff:ffff:ffff:ffff]/", + "ok": false + }, + { + "uri": "https://[3fff::1]/", + "ok": false + }, + { + "uri": "https://[3fff:fff:ffff:ffff:ffff:ffff:ffff:ffff]/", + "ok": false + }, + { + "uri": "https://[fe80::1]/", + "ok": false + }, + { + "uri": "https://[fe80::1%25eth0]/", + "ok": false + }, + { + "uri": "https://[fec0::1]/", + "ok": false + }, + { + "uri": "https://[fc00::1]/", + "ok": false + }, + { + "uri": "https://[fd12:3456::1]/", + "ok": false + }, + { + "uri": "https://[ff02::1]/", + "ok": false + }, + { + "uri": "https://[100::1]/", + "ok": false + }, + { + "uri": "https://[1fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]/", + "ok": false + }, + { + "uri": "https://[4000::]/", + "ok": false + }, + { + "uri": "https://[1.2.3.4]/", + "ok": false + }, + { + "uri": "https://[v1.x]/", + "ok": false + }, + { + "uri": "https://[2000::]/", + "ok": true + }, + { + "uri": "https://[2001:200::]/", + "ok": true + }, + { + "uri": "https://[2001:db7:ffff:ffff:ffff:ffff:ffff:ffff]/", + "ok": true + }, + { + "uri": "https://[2001:db9::]/", + "ok": true + }, + { + "uri": "https://[2003::1]/", + "ok": true + }, + { + "uri": "https://[3ffe::1]/", + "ok": true + }, + { + "uri": "https://[3fff:1000::]/", + "ok": true + }, + { + "uri": "https://[2606:4700:4700::1111]/", + "ok": true + }, + { + "uri": "https://[2a00:1450:4001:830::200e]/", + "ok": true + }, + { + "uri": "https://localhost/", + "ok": false + }, + { + "uri": "https://foo.localhost/", + "ok": false + }, + { + "uri": "https://intranet/", + "ok": false + }, + { + "uri": "https://a.local/", + "ok": false + }, + { + "uri": "https://router.home.arpa/", + "ok": false + }, + { + "uri": "https://home.arpa/", + "ok": false + }, + { + "uri": "https://x.internal/", + "ok": false + }, + { + "uri": "https://x.invalid/", + "ok": false + }, + { + "uri": "https://x.test/", + "ok": false + }, + { + "uri": "https://x.example/", + "ok": false + }, + { + "uri": "https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion/", + "ok": false + }, + { + "uri": "https://ejemplo.0x10/", + "ok": false + }, + { + "uri": "https://ejemplo.0xg/", + "ok": false + }, + { + "uri": "https://ejemplo.0x/", + "ok": false + }, + { + "uri": "https://2130706433/", + "ok": false + }, + { + "uri": "https://127.1/", + "ok": false + }, + { + "uri": "https://1.2.3.4.5/", + "ok": false + }, + { + "uri": "https://ejemplo.org.1/", + "ok": false + }, + { + "uri": "https://a_b.ejemplo.org/", + "ok": false + }, + { + "uri": "https://localhost.ejemplo.org/", + "ok": true + }, + { + "uri": "https://local.ejemplo.org/", + "ok": true + }, + { + "uri": "https://example.com/", + "ok": true + }, + { + "uri": "https://test.ejemplo.org/", + "ok": true + }, + { + "uri": "https://onion.ejemplo.org/", + "ok": true + }, + { + "uri": "https://123.ejemplo.org/", + "ok": true + }, + { + "uri": "https://a-b.ejemplo.org/", + "ok": true + }, + { + "uri": "ipfs://bafkreibq6d3olcwyloabkavyuz437v52i4m7ukb4ijk6p3mcuw3zbzfppu", + "ok": true + }, + { + "uri": "ipfs://bafybgqhdkcr2bxdj473pqqb7xxrdxm54xzvzbimdim3v4gmqr3h63nis5awqeeopkxwrptrkne3roojqfyh3dapzcismpzqjgp37exayr3yti", + "ok": true + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/a/b.jpg", + "ok": true + }, + { + "uri": "ipfs://b", + "ok": false + }, + { + "uri": "ipfs://Qmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "ok": false + }, + { + "uri": "ipfs://BAFYBEIGDYRZT5SFP7UDM7HU76UH7Y26NF3EFUYLQABF3OCLGTQY55FBZDI", + "ok": false + }, + { + "uri": "ipfs://babybeibq6d3olcwyloabkavyuz437v52i4m7ukb4ijk6p3mcuw3zbzfppu", + "ok": false + }, + { + "uri": "ipfs://bajybeibq6d3olcwyloabkavyuz437v52i4m7ukb4ijk6p3mcuw3zbzfppu", + "ok": false + }, + { + "uri": "ipfs://bafkreibq6d3olcwyloabkavyuz437v52i4m7ukb4ijk6p3mcuw3zbzfp", + "ok": false + }, + { + "uri": "ipfs://bafkreibq6d3olcwyloabkavyuz437v52i4m7ukb4ijk6p3mcuw3zbzfppuaa", + "ok": false + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzd1", + "ok": false + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7ud07hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + "ok": false + }, + { + "uri": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.org/", + "ok": true + }, + { + "uri": "https://a--b.ejemplo.org/", + "ok": true + }, + { + "uri": "https://Ejemplo.ORG:443/", + "ok": true + }, + { + "uri": "ipfs://bafkqas7ubxzm6jwiiyrnjxeyzzetrobqiqdqeq3qe4iug6hhwbyniubldbm2glmbw7nkmjd3p6yucda6lnnlexayp3mhiypyxxcz6a2c6nou42uwxkzagcsgeoovsty", + "ok": true + }, + { + "uri": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.org/", + "ok": false + }, + { + "uri": "https://-a.ejemplo.org/", + "ok": false + }, + { + "uri": "https://a-.ejemplo.org/", + "ok": false + }, + { + "uri": "https://ejemplo.org./", + "ok": false + }, + { + "uri": "https://a..b.org/", + "ok": false + }, + { + "uri": "https://.ejemplo.org/", + "ok": false + }, + { + "uri": "HTTPS://ejemplo.org/", + "ok": false + }, + { + "uri": "Https://ejemplo.org/", + "ok": false + }, + { + "uri": "IPFS://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + "ok": false + }, + { + "uri": "https://ejemplo.0X10/", + "ok": false + }, + { + "uri": "https://nas.LOCAL/", + "ok": false + }, + { + "uri": "https://x.Home.Arpa/", + "ok": false + }, + { + "uri": "https://foo.LocalHost/", + "ok": false + }, + { + "uri": "https://01.2.3.4/", + "ok": false + }, + { + "uri": "https://8.8.8.08/", + "ok": false + }, + { + "uri": "https://8.8.8.256/", + "ok": false + }, + { + "uri": "https://ejemplo.org:0443/", + "ok": false + }, + { + "uri": "https://ejemplo.org:00443/", + "ok": false + }, + { + "uri": "https://ejemplo.org:000443/", + "ok": false + }, + { + "uri": "https://[2606:4700::1111]:0443/", + "ok": false + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdj", + "ok": false + }, + { + "uri": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi==", + "ok": false + }, + { + "uri": "ipfs://bAFYBEIGDYRZT5SFP7UDM7HU76UH7Y26NF3EFUYLQABF3OCLGTQY55FBZDI", + "ok": false + }, + { + "uri": "ipfs://bqeafkeragdypnzmk3bnyaficxcthtp6xxjdrt6rihrbflz7nqks3pehev56q", + "ok": false + }, + { + "uri": "ipfs://bafkqaaa", + "ok": false + }, + { + "uri": "ipfs://bafkqauhubxzm6jwiiyrnjxeyzzetrobqiqdqeq3qe4iug6hhwbyniubldbm2glmbw7nkmjd3p6yucda6lnnlexayp3mhiypyxxcz6a2c6nou42uwxkzagcsgeoovst5qsekwcva", + "ok": false + } + ], + "mixed": { + "locator_plaintext": "a70083a200781b687474703a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8a200782268747470733a2f2f5b36343a666639623a3a376630303a315d2f666f746f2e6a706701190bb8a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "locator_sealed": "6167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303020353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a68304c746a7836566962526644375674345a4e64313143737831366f70734a5274545257772f455135484b45357437335175484d4765556f7169415972492f710a433836326c6a75424345586666536d73732f74316e314b5231454e6e435a63513435613846643777696e4e30736f594c65564e444f674361613641746a7864370a462b6d6f6c5a2f2b736239725a437970454c566c6c764e7365686a6b432f44374d73484e4b7541327873630a2d2d2d204254664a65485378417763642b79486f37676770416677776b596c31497a46424e4b4a4c666e696e3249300aa78d211e0aa72d1867a29cb4d07cedca03fdd8f5fb0d2c2857686752cc8a1be235d6502d57dda9f23d1aaa172f746f2742247e9b6525ebcd49f577f197aba74bf38cfd77f4f3cea2bdd6c95136090080d15fc14961caa7acc9e50fbbe52e30a41294ef574e278dc84ffae2c2d18dd6247a9bee351e1a69910a46cae3a63eb4cfff08284603a6bc83b41971865d9c57d0474d51dfafcd1eaeb23721e1bda514820d66e15207f6ee1bc52c13a5b39f2237ba45f7b826fa15be69473c90e6d1b8d0396426b8048072a9e5047f6b5adbccd11b33ecd79588537b231f05cdec703cdec4178bd0a69f966150f981b29b63cb4bd244fe0ecdf4e8fe9d223b7e996e80899c376edb1f497168e55fc0b6d7adfd76d5cb128f70bd8ffc710115a4a297ad137c6bb4515d8876eb916c1c1ac6a41d73b960588bee76a3cf202b88940491dc81dfcb9d3824822b4b7ae2f01618a5b87f5befa3a7a814e375983c4fbd3dc8421cd78813cfd780e74ed364939bca6faddb9e0dd24443e4e976dfa8b74d84ae0bf7381c0e624ab2957a8fd8a3a3563a66194599ec621edafaf965b1441257261b08a068189f97dbf70b498e7d8324cd6d2fb018b43201a3fa62c4d2f8ed94ad3259b14602347d96246dc3452ae5491b40c79492df37ffb2df96a908421d576fcd6d955821312f7b86d76587a48b82d1c381feb772599c80f871f50725b4801555056eb0214b7903bfc080ab28af32921dcf4251e4adeaa65f25988a79b93e8a30f777373f60695c05f447aeb82c0b89c09de920bb72b5dfeb58cf2663fe2534939978c877acb866954e1f3cb132b5f208ec685a6f5310c19fa53f77122ad9c38bbb966507cbd14f510d820c671a8cbd5c8967bf23edcd2ebe3c3eef540f1aa5c70461975bfc164c53b655d3769adcb6766b01a52fe2998372b55fdf763085c62778285bb3384f9d5d4a13064d84444c4330e0ffcd66f2e00cfc4943e9cb4b1a0ea6a409fd8112e88afaddc9d5be74a9685d88a73c2011003a7f4a6f4bf53514ad3ccd3ad0e5030f28b8e9f83b5d12f9f11659f899616cf2b18ad459b5530504db86be3414ca677fe83aafcca6654fe0c40a14ae233d148367f91d1ee21c400a3ec07a47a750f1eb77b8a94f194a21c9a340513ce6b0773bb61c4ad50d367c38079d917be96217831fed14ea1b6000c80a3c4d16c909556ac0d4c16e6cc7cb6f7146a358129a5836dfb2c45e304167dac69a0e0bf497bc7ea0bc347dce789a294ba17184d0c584a0231f9edd7d838066b198a8fa8cddbc0bffb73dbd6b8bf0fcaea47fd057c8a7c8d713facd5e425ac901901756af5b7b51cc733be4971ba92ffd9687c50513ea60ae695c2e7d8a6344cf660538d23b23ee1cdc29a6ae22bca86efcbc36c07cdaf026fa966df053099f9c280e798edea7e73ff237672aeacf1bb07969b1d0af3cd082f8d73163773b171aac032ee2c5e768b1df624deea21c6d5a6876429ab146c92909a5e6e9f4cd2ad544ed65bbfb19a2a0ed2db6a1964dd204e64ec1cc2810813033190cdb99212b2c5194a4a757f66a7b42c2137b7856e247317f65f168e5c619b29c590a46d2df8eac2884eea02fe19c81d9c54c2a01f810e991f0d9db7e8b731663333c57bcd8850f65144e1caf5e299d99409df9372a6b168026b2d665e91e40e15f2ddbd800a5ae0a8d03aae8dcb60ff27aa98e38f4f2f8087b50f7e664cb0f44ec4f0936672d204fabd917d028718d005566d3f4aee9f15e428c2ee497cb6d19a69e852f9e5478e33964188b2f1752674636e3c44e34dc8853990cd62654091f87a797d5e2d8d365d309a3becc7fff87c1ae5805c7a789fa9ca3d817028463b4693b1477efcb441e53948343e7369e62c712735f35c640f96533b3eff462f83eb0f00bc46b96bd36705cf80d38c2d8627ec540831d1446d9e1c0bc10c7fff608d9f4d83fc935745248dd24f1934632559578925db80c0044877bda2c8186e1e9492df44d19ca712acd089c571a1c86bb54b7950325eb469482125f40a4873285b60a607e638fef373edeb8e20ea7f001888c80b11f6b2646d31785255d241551c8cb78128d4797c3f6ba4073906ac3eb040670f835bfc3297605bcbbe5ea25dcca0651e460bc5718ea67593160e280193bf32a83c80d1b2ebc4a7745f3f06df8233905fa043797c82f88f5c249be8cc4efefd2dc1e988b4567d8a052fde5dff2c8231f77feb49aad104eabe0b517e3b49eb4c4743134c96b705ee45839d74ecf919d8d3cb1b12c56c0f94b2fcff9a7cf7badb2d7a977961b3bc0c588093eefd9d0121a19fe03eb1f689579a3e56c7d42d519a5ada15efc029e253ea2b77f44640b68a59c26788131c953c684877d2d5d276bb2142488bb28436cff46449ecafc590c5a6b9d2bb289a7d8beaab228009b92053288ece4d783d8793e7c2de2632109a290b454e70739c3c05465666ea15b3a45159748c44e301bb3a86a712b07963264fb89640536e709a45212f2d2124517d9df3bc0124c539db28c42c2c8648a27f91bbe6e5997ba01484233f4f041f921ead559d6264b63626b7670f99d067cf80613bd87a224b042ae1902cd291d3389146ffa6570d0d99db6707e259be5a3b5654e4c091be60635320cd36d3a90fa38367a27d579868476cb4891e209989063229187fc2e59096f8e8636176b2f9816475c378c8f7876eddf4ae489a1988fd3abfac8340a11b539e97702c4c5d383972a843702bfafb4648b1d82f6fd85b8f9f9d7388744207d4cbfff7fdce82e554809b831148c00dc747a086181b9ed401419a9cae3e8bf06f7cb9fe5d9051ec68999a8095e556231e2438545724eb4e1857465c4f86df932a2ba500abe1b4aa0dcfa7c4d3bde5c79bf784a4edbfce3f1747ff963bcac863d37b2b383005f9478412e4a7aeee03f7a122dfa8ba7094a5f52b9c7a79d5df395cd38b97790d0c128fabc7404469a40bcb87a889386ca86819b0f361167c14d59aa2750fc409288f31502b33cb727f82727ba1838fb254a24ed741c55c70178c7fa0fa24f8b7a112d004b2e39d3d7d45b73ac81436f1693b7ae1eb51b402e2c161eab6928f3841435b62236ca2ab68830ee433049b66f6a921658036e3ed8bbb489da939410895dd880be6f78376f646ae527fa8292f46d360c8a347e458be004146c3e6f6d90a0b3c2c81803c84b5ac5f1ebe0969e7fb45e7f17dd2d0b1b556b96daa65517b185f2b5b6cc785a7f0790cb16febb517c1dcfa41e9dc9719ab6cf3171df8616209b9a1e423df516c030e1acad8dc0b396bdea4c3a3dc8316e70711a1cd3fda1c45f8cbc00cb5c2b066ee4e8a90b333c686c539bc7f9a5bbfffc1c9f0e9cf8b5981579720a236c82aa14f3ed6020cfc688bfe2fa7e30f4a7d01a8708eab8a535cff822a54be63d4b1fac4c1e9f8aaa98344a77839250b03e16aa8895a8f176e974ef7803cd814a48eeb7b439de5b3e1edf64361aa57a56d72ccca177039461692068a118865b31d26016282d2652b81fded5da6707297f890cf88657e247ecb47a7483c727f93f594ddf95955d3090c387384ddb46ef8412efac545b0e4fb4835cff47df8a5a8178ccca994bf7c494318857ce6e69734696bc8795852a54bda9a770b494a6b86916879bce6e43098f51ad6b304210a3500ed1b691549251bd3f5884a0f732e585292530fbd52ba78641d1fd48062226206036c945085feb6541d38b1a737e0398dd168855593587f7f62eaaa8f3ca4a2364fe907ef49bdfcf71f670561fe17ca64596d5fb3775b7c05888bad36e7201abb6ae5af169ebd3a614d98b4149ea50b99f557b130ee214a82cbdde68fa8c32b5f45ac7a19d4cc906cd33fdee83dcde3ec4feed117ea0207b222c4cf429cbf8e05ef76af35c970a536f7f113a0028a9aefdbb9c4cdb72b7d5cfb0ba2117737b6730b1e252c6091e503cef91c69676183fc6756e0a312af419c355bb48575581812b69b75d18722de2682b2ec4539c0fe584af33d17abb3acaf8c11a7b7fd914cdcb4a5b17a828afb15a1409a0a196d0b6cf2df846480b9bf6dc5b02e035d35a4e7842e67bd95406d2303f7bfbfaa6e98ff0ee32ce5881d584ad0ee8ed476e522e0e039dd7d693ede6e0ba9c93fbc02d64ad4e7781cdb328d89ba1490200dcdb432e04d61a841ebf8d837c79d4e05076f43cf4c01e1054c15f6a81453802811edc545506fdae7631acffd9a82953cc96525ac7f43c6bb55ac2f788367c07b641d122e48e15ea048883438cee2e06ff767f2864863043effff6c99dfb102aa4d77395f0d6c1886a593861fe305bb832426d3f58fee85034ea0cd5ef46fe77fddc3a3065f04415cd72e36968b487764e71bd342028c20ade0f7fffe9c636ede3c621795f66d4a468fad3c65e0a1e0ca6f48c28573c6d42c3e2bb6b97b11b5f91174a55aa2f0b2e1811ef35ce60e8051100ead11945c5fd977638a50437d506fe64d8af89cbf06a6ec38a0493cd62dad1c49ca8ae85a6843459ecd126fc2503be6cc42caa16a48098760899bf1f2798dc773e5417a8a3e3141ea59acdb5e3a23c430ee30170ad55439c9ce1bd01646b66e4233c20f25384455ee6e9e8651636d97006ba13d684318da9966693ba4efff8a39dc1959844f62c2a791167bd7e6f8f943d8f1d9d37d63e4f4e979eb13186291fd205f7d83189f2037f01951c2ebe952d94676beaced607f16fb2abef29cae6697288fb2a70fc21d32c58f407a2e47362bdc939ec0c0dcce7bab752de52fe8f171d4a601356d3a4f60656c499c7e08b70c9d3a8f31f2444d1d964747f682b3f0c490f89b93c299bc0b2bbc13c9d0f528ad0c3e3b701afc480e0ea61bf7896c36d4d082e3eebea05c69de4b05cc429a2f1a808cc116eb346a6ef13a1c6cd57271a4eba6b4a95a5c1d7e69f096afe16086b7c0fda63a72f03e5c84e74b30dfa4e9339c83430660f35723069367068b45c8a24937b42e7d562f2677e178e0423942bedb2cc3fb649c4e0c0fa99c99cea847a59f15b559552ff5c33764ac7ca0536db3dd44cbc7ecd5b600b83f134f9058075d54d49e42f5be4cb63f687a421ce55872ec1dc0ef2b81566c269568e3283125ad84a4284b5ae53c107d33d84b9880037efeda8aecca75464b59c277b70753e06e8665c2b3a861c79cedb90857b2d5b6991c6610dc757ee8340dd35b5d660a173f72743e960e30eb1a40b226970d692a870165de963cfbd7693db768b583fd200ad08ad6e863bc660fe692a3278fda174e64426abdc1a46a6487e707925a16e1ac4e5f496820fbbb9d21de9358eac4c130d4bb159d651fa9e307041ae9f29f78d039468a4c68505a1493c75ddde5e99c36023ae2283a612b7d6bba1fafc02dd73c2ec82d285c051621783060f88fa2bbc2443febda62e88a5fdb4b2d7f5775ce027806b894f495b228bcdf6358bc0d0d6a32772628a42c2b74d233e7c755626718b53a2fb2c76ec318f4fadcb82553fc674214ba73bb9113c8fcc9b2f8d5030dc695bf52250df4e8bae3438cc9528d901dc3ab33c3b9f0cb96b87fd3329577dd3e56b84f7c19812473c5652faf1bb9d1da2d9361ef6fd7d3710f49a987a4c95585457bba6490699e8feaaf33ecfaf2c80b4ae52353cb1ad0f8bdffae3cf3c5fb6525cae689cd0cccafcd54b341854e4fe9718142f21a4cb5bb6c6b53ea150ce6d156d6eacf7257e7032664a10d53381e4342764aee10af6d837dcca6490ce0f0c07e4b57076380eaa5401e6f247527b0c632d8ff577ea9c2fe62a4ae33fb04c92f3a74ec92ed2de3e4013b6478768e641bae2bee4", + "addresses": [ + { + "uri": "http://ejemplo.org/foto.jpg", + "offset": 3000, + "usable": false + }, + { + "uri": "https://[64:ff9b::7f00:1]/foto.jpg", + "offset": 3000, + "usable": false + }, + { + "uri": "https://ejemplo.org/foto.jpg", + "offset": 3000, + "usable": true + } + ] + }, + "rest_cases": [ + { + "name": "the rest alone, at an address without an offset", + "resource": "beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc092748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c91", + "offset": 0, + "opens": true + }, + { + "name": "the host with the rest at its offset and 1000 bytes after it: only rest_size bytes from the offset are read", + "resource": "d3b9b166a9b2b304971bf45a4e02d185ecc0b1d0920d6b67914e5651c823a2f6dca4595cb1a87480253a442ba86bd32fa6296b5a76723ead55a8f5484eec66d3cae15537801eb8b919370232e1bc423a6c14ea1b918ce4421e103913e6e72b49d6200421c6a6a95a0e48e029a691ca4137ce54e66ccd9a2bf257d9f24e3a57d5ada874b85b3961e0eac4384c62366bda9d0abcd8dc3bcc53fc63bdba5a64b4f3220f4a82afacfbd21259e5caaa17246ac90c8f30fd046dd99c7a89cf1f57a1c299f35da6c97cf3f5b91dda9230670762f366f9f0fb408ddf2d2c285ddf89e678f8a9489f88b5968af5cec162bc1197dc183cdd11c04684d1fa06d5ffd8d96986fe94ded9a4a54dba13ef82da01fac5b9a2795a738f966242849a81fd47a9df1dbed7781fd1171194282539fc9877a6a36a5a0a097eae7003b30a8778c90a6e675cc961c83ae203cef7ba380b4dbf6fb9a53faac2694b4486f319fa4560c5a4099db0c98bc095cc59d3beb2f2c9cd14e935674494128b2912b310c437a7b58e3cebfdee72eb0c70428936c1a0c959fa2ff33efd6559167538ce22e9e949c122330a9d038073b6cfc7e38bddcb8bf91b62ee79772c7886058e2d949c29327433cdeba1c79aa951b049c0908f1d33e2669b93f810455a921f1cfe0a0ed591da7d0059ce518b10a111ba85814c1b6bc674d25443604c171626f1781aaf8b9bb5f11abffbc2ec6c3061c7e6d52b7a4039ca43e341f33a2aad5c2452fd1f02e24ede2f4c4829f8c5a0194a7f67660eaad4ba2340976596218662e03dcafad12f67c544b6b35e285fd4b2ea02e08702ff1dde2058c9f3cd87a18939fa316327584bb82c891aa44b135ed843286d4eccbbaa3b032b677022328380cc246feb9ddcae8789e1e00e1f1fa2cbf5d5b704f7af8e2c3a82430dad07f9f472b2a017e6f460c2b326f090d18601eecc9b1b513a6024e3103b1e316d66aa315b73974051a4415cd7ae35f4128b9866638529c59a2c123bdbb9c5da7aeb40618052c1c2d983cca3a61e2c44e4c59a2e86fd1a17395522ee77ba4e88fa9c29b91e7bf569c06a762ad074a852244ffb4f4fd2d80ff6cc6a16077d8cebb2463c95e3eed915cce30dece6486ea72a2786a25de419a8dce67d8b59b92cd83609af6d45b20fdcb6dd793a1d5f8041cd718a18c145443aa67b5370ad48007d0b5f91daa6e34be851ef02baa81a873ec50949ad11db4665c3e822e94eafce39c204c4a3215958bfe90471fe509f8f66caaeb6e3024b72d4c78925e044acd6e069b173ccdd9409decb6b99d03b889e1959a5f7e63c9e62e7fb33b811e2c1c59407345030481ec0d4783bce6d7bcffb085da831842a04cfa871850f61ffc0fabbc0b40cfac70c5b6203dc09e7e5cc1e6b2a628e22db3444c57edbc00d413b53075ef2a73908dcd92d9240e3163bbd7c1ea40a084570b9968ef9d961e9c3c7b6e18c4435059750b987148911ab80e02938f3d64829e91d8ec8f4bdeb141108a877eba448738f656fe6c6b14f37bc4218678c2b40d229b4c4c2ae44b8d514f73daa3398ac6000be2583af541bc4529d161d6706da9d1f0d349bcfb4ff89b55a509363c54a95635c6ff94e9c7091faa96eeb891a8efadd54b2e235219088e0e1eeb55e3917ea312102a74baafd2124d5e3a2dab587fbd0d9e2167526ebc800d49ffa05bff6ff5677226d85eb4d1f21279806b3d254e277eb322e16514f2528b48f1b5d6d7da4c3fbeba0377238bb6c7bb12ed444c94df49879de1c2f2b13ba08578b81e3d08d92f2a772b02eb2259a307e7d97757f22c079db4b32e06e71df15b0502de748580f68ca7e89f6eca6955e6ae73554614396e9386073eac4ddda9a4dc6b9c07f2a597abc3a3f5d9c480d0774548bfa1d21b51b3b7b82e4938375c879bb2eeba02db7d027ebdd9f411ac012023b320da8bd69f601d0c7649696e2ec8d77f6449ed50ce03c2e09970f71b88193d02bf066b9737929928f208a25da5b102733e453b406e2b1bf6bca3a61ab6b6617077db9cae417a139da15fb44039af66e45c1ec284450e3f7869f62d510727c94a4e33ef75be901a2e4baecf61fd65180cd9ab588f62253f176c6d32ed48ab91e00720e761944ce735771ff83c7d7d6ae2b6d96db8c08c3bed240c1d7394a73635cc1fa352c22aad357ec8355a969ab07cc08a99106ec0879e9af70ca3c4affa1bc2fb0477046ceb3f7db8407cd05d7ef5264842769b09075f6aca28c7539f754f2ab43d8ac966547e199b27d458baa39df20e32f1c609eee59291778c3c6d85de8b18d7cf92fbfdefe76c1bb8b612c61be39c3c301c8d19ad5de56e749ec44dd94773388d7fa8b50cf75bcdb59ce97c0b87f6f23949f60c97ed889b81731d6ae155574ce2e71521e6c05fd994dde4e984340de4b71d875c1e6fdad9b46307c2a350fb3df9e03a8d2f596591c1681caa54dd07752519f79acedff294348a920ff4dd925fa8c27cf0477a4934d4201f51871fef4378cc76dcfaa985062ce2a53c031896ff649dd8aa69b6f6eb76e70647599f424744483837e97e6a302128200c304b4d7a8058495cd5434afd3f58eca2014be54c072c7041c510a8e105906a90ba1898d46a0b0d1f211b5c576435e47626d9deb4ebad549a102990059125474e4a7393e35aba91b38d00cb44ee06318f64199c3506fc53b209504b76b73181a4d2b4d298e04f5764e13b3a992300efb3caf2794b5a54637f316a603f0b50aaf478bb3ceff2ac3a77e309a7592a498eb9577eb8d7ccb989513f628f478415901dd02a072bd437257098c4c9cc8e67c1837ef13c38c49f791261c487391463886c815cb37f173176d8bb41b9c80a215545f84d28a77a58c3211d0a7324a06b9eeb2576eaeca7761efe1c3235b14190f6e34eef87bf857130f65d2764c703cce9883dfc3a8d8c90c99f4ee765f68263b073d26bb585cd2de50c8c98ab9605f91e95a820b82051b95dfcfad1ec4f26df443417c7c0727890e79d3e14203dab694f1fdc1e29e020173efd3dac567c0fa67890118ba630fd212e4a8bf1688d1e622e392c784e2d36ba887777a2df13ae43555cb71d9591cadd5c5b77b3e93f12f03ab91d1946d11b532385bc0eeb79d323f9bf263ba04e5d74b66b95316e07eb73f2196f4f9bba906b59306098cc85cc7958c8d240538668a5a49c480a3f4ce8ff05aa19b6f1b96816a94004314e7a021fabec880ff79a7366be4df988206cce768d0c222ff50737069137524acdf02ffe2be4dfb7e5ede03c0a011f8ce1a9952184154fdab1bb9767f715089897294a2db972899e56b270698cd8c6e3abd4432c9a7b05e2bf1980ed3b9fc5e3e4e446668467b4cc418276533791a569305bb33feab43a85a81cb743de78baf5f5ed8206db1a9db4af041c599caed6cfa9d2a6bc6101e8346ff65b861547487de89bdf6d67f6b21ef79e124d2a544721a8f545a658e7c9c0010d0b926912488b101c9e975f878d9fec63b7abe2998a11f12b9a76f35fd727e732954e15881217bf9b9539c1a5f85494d9e7fd43ce04350deda64793fcec67bf2f5250a2710b33689e135159fc339ee75ed2cb0c756f862c9aae981ed78b1cae302a96414a44e90c7b6a59311ab62508d614560e4534dd7e49dd3f8f010e5186a916853fba9dbc0f1f67cdda894de813250f80e49c1419871e6b77c20c13dbf8ea78c05f25c7ffb6918fd99e0eb3e406a0e99a44ad5121dd88977be14dc883b2e955a050c34ca9bda58205924aa7ec2659b374e9db003466710da6bc5d854646573e26e6dd3a30773cbca9c3e4013fe63e3b754bf72d48d0a0772082241db5442b557ddab94f0372d8753df7c45f58e6ea8227954e6e2842efb44b51da6ebfde2ebd0ca97fae3981280b370f2e298006559e4dd264be171da97e5b1d673c30d5ddb17c76fdd894710658f58583a7ce27cc04dbf3b3de8723df896c0c70c04a1f3397ebae43441b81290e52263beed66030d163b6efe5523fccec4d8cf5bb0f108bfb5cdb482fe0b381c0c2b93ae336957ff08408ec19d90a37fa97b175e8caa459d26cf689e3ee704e1ac0dddda1c91417ffe6ae2ffb4a85be359cb18244ec750d542e7afe343ea999d4ea882da7731d60766f81902b768d281ee47ee0cbc302ba28eea2ed34fe4bd4121f85f7918adc92b3fd67e749340787e17359ab3db802fb14e4c2897a2f2e30c40823a3b3bcd110ad7beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc092748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c91bed1cdb5cdd172eae5c8a53ff1cf6ccafd68fe7eeb6482c3472b53a5aa10dbab8459dd273e4dded9870f1f45483d8c602b0f81a5f83903d548a2e72eb8917408e8d0af8a1e6638eedda4db3bc99a198d7b284a7fc292d1cb756bb5c023c689a453de337b0c2a5866cce87050c4080f735df3680d39d5a90ae17dd2e0287f0638a0e80e29cc2e60195526fd8bf525de353d6a36004896a7d4ab22985d1d610096c5081ef967b75219f75533911c48fcd9cedf7059ab61518642e97501b821a83a6b7ad0fb770e0ba7e22b139a41dc37d6d7e2915b41a2d78502f586a7fdb0647aef0a70a7638e9645ccca4848ef9dceff4daa8b42edb2e4e9a1eff8177cbc661eb31967de7d49e361b8df321dcf0198649dfa2ad28d0843c9e7470e6b5fce590db9cc006f1152aaab532e136c37cedf51808800bc8eee24afc564d77cde65dda0f9aa4607556ff2370a78bb242cb4cc5cc483176760b296d015e8d311d099418091e749d3f5cc3760532d15bfcaeb426ab46853bc695fa12a51c0af798585971595b69778d194dfe1fb8a6a37c692c5332624817a4627ef72cb80202bf795c47e7bdca7cbdb23fae02a4eb4d3d327c91119a85c626807f15931a25fe92cf2ba01bf66604b7540d5a6449d9553c5725cf7191e7cd36569f11ad02f536ada65ac95d5d9b7184a31023b01d985ef6e83eb6e7817b596790c9ea9e67cbee83485cce94512446e3049f54b5d99311bdff5e20bcf199a4416a5fb2ced36d36f8c305ddaa9eaeebf7cd00124d871d42d1c9d0481cc5f0ddabe5f83dc6c6ca5522df2d95195d3f5ca7449bac3938446075fb1b43794440216b93cb9b8bec50d729b1570dc189c4a0f6c5857418bedcbd736cd3b6a201bc06c42a0dae0a1cd5217536081ea659719afb918e24d96a2c20208fa18dd845b031571240263464e22fd5d2b3fd8db06e1f46dbce0680fd005e75bada553b90ee0178e0b2e418b352c7010366dcf06fe59fbdfefba8bd12e600424962bdf912ec13971b40c4a4aaadc9f690df65a2c5fe495bc118f3985c0751ae04b5398e82783fb659b47cf56045f603a00582ba064f2912c46cc922c1b1dfccf8105291f351884db33c11e0809d28e3c4c7b5932f6820abc63c378254107ad7b27f3070d675f43760df367e9ce5853a8b782708c592cc3400a3659d6dbc7431244355369d2dc9649acb97c8a424352879e3ab55b8c35d5981954f6317c6deffcdf2b2ddb35634cbe02cc8cff22c956f9452c677c0313821e91e68f13bb63fbe89113ca0adbc7cd90f43196decbb2987ca54e7cd4bf0a5276a2b002142dc980ebb3c4b4a2d5d88abf0d614524c9e31ec5b90f8eb3d0b2c3e28bc09b9d23e7a3aabe73d4050e77524798318a9cc626736e3ecb925032e67ef4c3908b", + "offset": 3000, + "opens": true + }, + { + "name": "the rest with a byte changed, as when a host is recompressed: its SHA-256 is not resto_digest", + "resource": "beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc192748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c91", + "offset": 0, + "opens": false + }, + { + "name": "the host at an offset that is not the one of the rest: a byte earlier", + "resource": "d3b9b166a9b2b304971bf45a4e02d185ecc0b1d0920d6b67914e5651c823a2f6dca4595cb1a87480253a442ba86bd32fa6296b5a76723ead55a8f5484eec66d3cae15537801eb8b919370232e1bc423a6c14ea1b918ce4421e103913e6e72b49d6200421c6a6a95a0e48e029a691ca4137ce54e66ccd9a2bf257d9f24e3a57d5ada874b85b3961e0eac4384c62366bda9d0abcd8dc3bcc53fc63bdba5a64b4f3220f4a82afacfbd21259e5caaa17246ac90c8f30fd046dd99c7a89cf1f57a1c299f35da6c97cf3f5b91dda9230670762f366f9f0fb408ddf2d2c285ddf89e678f8a9489f88b5968af5cec162bc1197dc183cdd11c04684d1fa06d5ffd8d96986fe94ded9a4a54dba13ef82da01fac5b9a2795a738f966242849a81fd47a9df1dbed7781fd1171194282539fc9877a6a36a5a0a097eae7003b30a8778c90a6e675cc961c83ae203cef7ba380b4dbf6fb9a53faac2694b4486f319fa4560c5a4099db0c98bc095cc59d3beb2f2c9cd14e935674494128b2912b310c437a7b58e3cebfdee72eb0c70428936c1a0c959fa2ff33efd6559167538ce22e9e949c122330a9d038073b6cfc7e38bddcb8bf91b62ee79772c7886058e2d949c29327433cdeba1c79aa951b049c0908f1d33e2669b93f810455a921f1cfe0a0ed591da7d0059ce518b10a111ba85814c1b6bc674d25443604c171626f1781aaf8b9bb5f11abffbc2ec6c3061c7e6d52b7a4039ca43e341f33a2aad5c2452fd1f02e24ede2f4c4829f8c5a0194a7f67660eaad4ba2340976596218662e03dcafad12f67c544b6b35e285fd4b2ea02e08702ff1dde2058c9f3cd87a18939fa316327584bb82c891aa44b135ed843286d4eccbbaa3b032b677022328380cc246feb9ddcae8789e1e00e1f1fa2cbf5d5b704f7af8e2c3a82430dad07f9f472b2a017e6f460c2b326f090d18601eecc9b1b513a6024e3103b1e316d66aa315b73974051a4415cd7ae35f4128b9866638529c59a2c123bdbb9c5da7aeb40618052c1c2d983cca3a61e2c44e4c59a2e86fd1a17395522ee77ba4e88fa9c29b91e7bf569c06a762ad074a852244ffb4f4fd2d80ff6cc6a16077d8cebb2463c95e3eed915cce30dece6486ea72a2786a25de419a8dce67d8b59b92cd83609af6d45b20fdcb6dd793a1d5f8041cd718a18c145443aa67b5370ad48007d0b5f91daa6e34be851ef02baa81a873ec50949ad11db4665c3e822e94eafce39c204c4a3215958bfe90471fe509f8f66caaeb6e3024b72d4c78925e044acd6e069b173ccdd9409decb6b99d03b889e1959a5f7e63c9e62e7fb33b811e2c1c59407345030481ec0d4783bce6d7bcffb085da831842a04cfa871850f61ffc0fabbc0b40cfac70c5b6203dc09e7e5cc1e6b2a628e22db3444c57edbc00d413b53075ef2a73908dcd92d9240e3163bbd7c1ea40a084570b9968ef9d961e9c3c7b6e18c4435059750b987148911ab80e02938f3d64829e91d8ec8f4bdeb141108a877eba448738f656fe6c6b14f37bc4218678c2b40d229b4c4c2ae44b8d514f73daa3398ac6000be2583af541bc4529d161d6706da9d1f0d349bcfb4ff89b55a509363c54a95635c6ff94e9c7091faa96eeb891a8efadd54b2e235219088e0e1eeb55e3917ea312102a74baafd2124d5e3a2dab587fbd0d9e2167526ebc800d49ffa05bff6ff5677226d85eb4d1f21279806b3d254e277eb322e16514f2528b48f1b5d6d7da4c3fbeba0377238bb6c7bb12ed444c94df49879de1c2f2b13ba08578b81e3d08d92f2a772b02eb2259a307e7d97757f22c079db4b32e06e71df15b0502de748580f68ca7e89f6eca6955e6ae73554614396e9386073eac4ddda9a4dc6b9c07f2a597abc3a3f5d9c480d0774548bfa1d21b51b3b7b82e4938375c879bb2eeba02db7d027ebdd9f411ac012023b320da8bd69f601d0c7649696e2ec8d77f6449ed50ce03c2e09970f71b88193d02bf066b9737929928f208a25da5b102733e453b406e2b1bf6bca3a61ab6b6617077db9cae417a139da15fb44039af66e45c1ec284450e3f7869f62d510727c94a4e33ef75be901a2e4baecf61fd65180cd9ab588f62253f176c6d32ed48ab91e00720e761944ce735771ff83c7d7d6ae2b6d96db8c08c3bed240c1d7394a73635cc1fa352c22aad357ec8355a969ab07cc08a99106ec0879e9af70ca3c4affa1bc2fb0477046ceb3f7db8407cd05d7ef5264842769b09075f6aca28c7539f754f2ab43d8ac966547e199b27d458baa39df20e32f1c609eee59291778c3c6d85de8b18d7cf92fbfdefe76c1bb8b612c61be39c3c301c8d19ad5de56e749ec44dd94773388d7fa8b50cf75bcdb59ce97c0b87f6f23949f60c97ed889b81731d6ae155574ce2e71521e6c05fd994dde4e984340de4b71d875c1e6fdad9b46307c2a350fb3df9e03a8d2f596591c1681caa54dd07752519f79acedff294348a920ff4dd925fa8c27cf0477a4934d4201f51871fef4378cc76dcfaa985062ce2a53c031896ff649dd8aa69b6f6eb76e70647599f424744483837e97e6a302128200c304b4d7a8058495cd5434afd3f58eca2014be54c072c7041c510a8e105906a90ba1898d46a0b0d1f211b5c576435e47626d9deb4ebad549a102990059125474e4a7393e35aba91b38d00cb44ee06318f64199c3506fc53b209504b76b73181a4d2b4d298e04f5764e13b3a992300efb3caf2794b5a54637f316a603f0b50aaf478bb3ceff2ac3a77e309a7592a498eb9577eb8d7ccb989513f628f478415901dd02a072bd437257098c4c9cc8e67c1837ef13c38c49f791261c487391463886c815cb37f173176d8bb41b9c80a215545f84d28a77a58c3211d0a7324a06b9eeb2576eaeca7761efe1c3235b14190f6e34eef87bf857130f65d2764c703cce9883dfc3a8d8c90c99f4ee765f68263b073d26bb585cd2de50c8c98ab9605f91e95a820b82051b95dfcfad1ec4f26df443417c7c0727890e79d3e14203dab694f1fdc1e29e020173efd3dac567c0fa67890118ba630fd212e4a8bf1688d1e622e392c784e2d36ba887777a2df13ae43555cb71d9591cadd5c5b77b3e93f12f03ab91d1946d11b532385bc0eeb79d323f9bf263ba04e5d74b66b95316e07eb73f2196f4f9bba906b59306098cc85cc7958c8d240538668a5a49c480a3f4ce8ff05aa19b6f1b96816a94004314e7a021fabec880ff79a7366be4df988206cce768d0c222ff50737069137524acdf02ffe2be4dfb7e5ede03c0a011f8ce1a9952184154fdab1bb9767f715089897294a2db972899e56b270698cd8c6e3abd4432c9a7b05e2bf1980ed3b9fc5e3e4e446668467b4cc418276533791a569305bb33feab43a85a81cb743de78baf5f5ed8206db1a9db4af041c599caed6cfa9d2a6bc6101e8346ff65b861547487de89bdf6d67f6b21ef79e124d2a544721a8f545a658e7c9c0010d0b926912488b101c9e975f878d9fec63b7abe2998a11f12b9a76f35fd727e732954e15881217bf9b9539c1a5f85494d9e7fd43ce04350deda64793fcec67bf2f5250a2710b33689e135159fc339ee75ed2cb0c756f862c9aae981ed78b1cae302a96414a44e90c7b6a59311ab62508d614560e4534dd7e49dd3f8f010e5186a916853fba9dbc0f1f67cdda894de813250f80e49c1419871e6b77c20c13dbf8ea78c05f25c7ffb6918fd99e0eb3e406a0e99a44ad5121dd88977be14dc883b2e955a050c34ca9bda58205924aa7ec2659b374e9db003466710da6bc5d854646573e26e6dd3a30773cbca9c3e4013fe63e3b754bf72d48d0a0772082241db5442b557ddab94f0372d8753df7c45f58e6ea8227954e6e2842efb44b51da6ebfde2ebd0ca97fae3981280b370f2e298006559e4dd264be171da97e5b1d673c30d5ddb17c76fdd894710658f58583a7ce27cc04dbf3b3de8723df896c0c70c04a1f3397ebae43441b81290e52263beed66030d163b6efe5523fccec4d8cf5bb0f108bfb5cdb482fe0b381c0c2b93ae336957ff08408ec19d90a37fa97b175e8caa459d26cf689e3ee704e1ac0dddda1c91417ffe6ae2ffb4a85be359cb18244ec750d542e7afe343ea999d4ea882da7731d60766f81902b768d281ee47ee0cbc302ba28eea2ed34fe4bd4121f85f7918adc92b3fd67e749340787e17359ab3db802fb14e4c2897a2f2e30c40823a3b3bcd110ad7beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc092748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c91", + "offset": 2999, + "opens": false + }, + { + "name": "the rest cut by a byte", + "resource": "beaa5af44c62ff37746b7b2bd62a8118f3b953f99e8d0d997e56acec906ad502cea92a74f4076b6338efebb6c8b35eda45cf8b46738b0c5653593152db8792a82e26fbf4c8af68d9bb50e10e7a106659336f9d81a457687cea376f3c6f853c6949dc4420b39eb04f36914e0644fc72881974339b34813043b3cb754706c5b57b8f8f9429eefa4f7c31545c1ffbf6c2cf669c003477b6be56e9f8419c4193a78fd234ff45548bedc26368500830c3653ddd9c41c51ea625cb91a1ca5ec26d15e36d030b60fa86b4e2fbb8b803a046100e455f029aec86026da4ec55388447cf655096fdf5767f71369a7aef9a6444e7afc610c3cc1b500a18053b9ced43d084240b7c8cbf48d0b88bbdf4326a423274d0bd59f6f395b03d321954fb1334658d19326420f746f978ff8750a45c40c79decd6b49de6a16870cd4ece79e0520b9ff691ae62f33891398c050f2a1dbc25d82f8a9e68a30065daaad513f3305b612a600df9f4707ec8dece4a00510a50b6bf5daa74ca1b8c06c31f5d42d2c1bce21721907e97a2aa02bf63c8e6927236874a680ae1422216a08c2eb9268e22c0c77fd3a33d7a5c1d8c9c7caebdfb483d3d255d4fa941071abe78dd9f5482b56dae8d0505ebe6ffa67dfd35a580f24768c25028b4c03e39810ca4e08ca0f0e3c0bcf24d01f3b56fd4acc0bdea2514cf2f563098d443a6b5fd3612b764ecf6eb4cacd9a09ceebdd4a7eef8c78015ada13734186ddf20b41ca18966da401149408c3b409922298052532485d1415c18a822f593e7dfbc20860d8b8666d89fe57c8273ed23e7ed8859f7f03206a4aea94f9ffa6f89541000ec5b756c4cc83882d2a882e62aec1c093aca81e4f0a58d9a60f8bad28767390f65cce6adbb20577fa36b115f501289bec521ec3bbc9fc8132ad470192b5fa8dea5136ebd6265ce3910ac5f70fc17bf2778b0106abdc2e0db443d47fcfb5fe81641d02d84acb644213d8a9a34653a6ee1e65d038204ffba50e2e997f49b6fdae56925e6e9a898dc00937bebac65f2841333295b1a75fdcfb1fa451cfcfb07ee3b7309d72c7c82baceb0956d43757c56125e72ea64f5973dc9ff8205908d2a559edb0c2dec899e9b02b8c3666234037d44e5c4d29ea11b03dfa19bc8e0ba1403ebe3ea4fa61b5d72db7f30f4a7d55ddd6d57ceeb3e1d05cf09c7781464aa16ec64c52d2eb60f9c46effd83637c891925705ebf394ace58ae2a9f37fcff31f9583a3c12e3936b5259cb341a6f3246ec2a997db1c8e143d64ed44252b77dd79ebfd628633d5ce0f76b99ba37b5809b1240199b54dcbd7207cb88e4d8dfcb4d5babac1e99545d01c3104c8d775c1ee2c19468a6ac89674a04895ff9efeed51c720317e97b11b7aae96b6ec8ec7bf62b57fdeda696f665c8a06af212e28a8fe73bea90d042e71911a8215bf4afe41e459e9df836382e291fe922a0ad54b4873d356e09c786d3255e285c4654b4d6a0a590c4d000a65c917acc47ea25d7aff3a67c3519ba19d8c95dbb5bd16ade9e7266d80b3c86c5bb98d601c37ccae7afcc5a21c337f7893c36a24e2c5d09265082abeb9919f57fb037322100fbd6095dbaa16afd250ea2f70abfd9088d825f0018d99a43883089bce1a93a08100441f9fb07efabda6732eed9de552e96b48edf5be9d069536fa79024bd92b20bf428c058275f1d6579b5926a5bff52d4148c590fcc7d65f202a5828bfd287124465207e321409810fc3926584990996eac2c2ce5366843729a90d4fa52bcfa0ebb892c88fadec80698e94c60a73db4ced32d1182dbedb31f9b3114d58b896aeb208d04f838cfbea1bf64b65097bd3459119e9e79068b83f42f5fa42fbdec52048572c9b5349424295828b642f2968df903f67ac368c943d66c0cea03ebab05874c0de796042c37a17c48cb410e8fd1391ee3d38c1150b41eafd1d257d24d9e85ce85bc67834a1d528db936499667563ff77032d9325b02da00863d0567b19225cb077a22bd005ac1ebaa1cbcffc30eccabf36195e0cc3e0adb10f6bc7c0e730b5279b3cfc7063fb7d0f3761d1aecd6ddaccb7343253c15a9cf1968410b69f558fd17ef612964d4f535079425e961b0a6fde64e45c4ce9b09b3c72ee3b2dbd563042a0d773441a8fc37c01ad021686dd880721e205fb52bf90c6a8a4742cd9565989d93b65db4d51d3e2146d6ea5cb79611b7784fe9bfc2c168bdf9176b5e65768c8b29f4694f0d530f36517c6fcc6f8d1a964ca2e3b98555e1627cb174cc02a7a4cdf9117b6fd9c291e648ff5a8c12f9a04b2c4046fb5fc94c8390477059d85abb85fa3121e6b3d224f6957a52e1c900c4c6432608f33f67f6661e006ff3ae41ad0f60dd969ecc58cd38f56b57b84a0c70dd48dac2dd330d8b88f0c755f3ef7cf0eb0c927bdb85c9cb1ee8bc04234b8d63ff18276b36ae3d22001d463cecdb4b30bfdf36d4d2150cbab7568f9714c4c699a432939f62b52a5d5139063b2f9618423f2247cf74695a1d6b82650ab17d4456d1cc57f766a017c2630dfa390cb60518ec678cb56f775996eab88e162671d0428acb6d09f47bc826135991d58b1fa8a0180e8e30cc7dea854410bb4ff5b01cfd5daf81a87dc27ec55a094867b0e953c98bfe729ae9798fd70f593e43c56adf9b015b12905025d929289c6ad0a731c02535b0a1cc5e302cf458563a4a1b56eb240eac480cda4dae8383e4d14e9082dc7e930db84088e50ac5f566d768d6f301b24109efe246c9f81e8912ea305cf2a917ce1a26e05463c0e768e59e85ecd02b2ece93701c2b32a3e35221cb7e39cdeae5fe6e7fe26d419aa818c2a9f74542cedfb1d17413d73c6287e217badf638c0468a7b0f497e31fc04a75bd5d3a54a86ce709fccebe1dd7ec17b1e6f316d2807659742631cd26cb65cfe6f02131a9a149ddd780a284f64df1114f848829c8fd848618d9b893cc2b962e159d5459e21496852a0ccd2cf4cf47ad564669bbf3a4068ec7b529739a489c14fac21c4176ac326a73e82f1f2cffc584c791a7d8e4637ed446e7d615deef9f86cbe52f2bfbaab7d6517ab23c27579aad3cc398afb1bce5da57d94cee74c38a66eb1ea62ffa634e885147b0ffa946b9ade5d9bf82dda41c644e6e66c43c7383e688a0c06f0334524e0d7af124c315c390c337c43f7a6e996d3d133aced1ffb0d9353ed8c121521e8ae49e974303c0da02f45f34372159c24c6e8ad87d246b4d661e6bf4bfe7881e4b49fe33cb2e4758accc3cd0c997b910fd4be5f596d3bd586224302eeacd68ee19ba7c22fccea9059b8aa7a77e1b76b79f7d592254e96fdd791e74c23262a2f88d73650522cbb84d3639f25b88361881232d07bbe124c456e89b92e035793e79a14fe3c7596d159c23e03b93ca6a643f820d0cee4c66b851166c6c48dc6b650b9c38acf854ba9d26c87794dbe0e74f7b65f3c992d6e4fe73fc2d4d0522d1067e56d88a44b07486cc9526296c06b32768e7848b2ac3b2f93cc9d9131758349f58577e75906801c39ecf837e2374a1eb54a861f3f1ce41fc929fc092748bc07a7ebe9a6e186e5dceaab5afbe2bdac413aee56d9e1bad7c25935fffac9ecea82dbcc4dd7471518407e2e6fa6cfd0df76fabb53290b21d83fc520d095a7753e0c1040c6d1a4621530da7850e0500d2c65372702cd6af75531bddec61a01e050d433ee47f1f7a0f424ebd200fb876615550763ed03e16022dbc094725736659ac13e118919500b5121f03cbb135606655db77863d58aae2eb8483d87ffc3b4cb02f39aa72e6b37771de1a12fb4e0cac1aa6098a415c654e22f75f38241a4b2ba80aa27a9b010ea45cef8f82dc83456e2e85d0ac3446e33e814b94b33f52b6d4240bbeb64c6c158cc8903324b85dfb6788cda97a6458dc5aa1c6850a39280ad20a951cd8d3748d261c1b9c6ab442150e82264151756436c07f5fbf3a18d60295394e8ed4c82b43072f8786831eb8732609ce574f2dbe2c0717d04aa4c1f99cb2d1ed01da13245efa98a147e24c630808de82f46a01fff9b911afe749181767b7fe92e23bee6ea659dfe574e4b3e087b9028d1ccca850170574395497d593381d9800be9a870e914573db7a05197ef222753cd49431ebb2c2032244b9a1719794dbc365aa2e1dc2f433cb5a4aed66d8da5baf863cc4e7d72ed84c27feb3af2e841644ec1ac6ac18f8d40ae60ec937fffdb7d2a6d3fe51968242e146a95e22c3ebf54683739c9afd0ca3837ab5337286d212c6962bba926585951bba735faa20bb496db18b818c74b7710b95b2961fa144bde58dc5ecb2f274bf464f65b840c10736f5f41f991c7d59f4eeb7c4e8617844dfe896bfaf94317810a56d9044101ffb9d55e94011e6e30b57178ea207c5f22175d0fabc284a57dfd18f345b6d4851145d745ea402b36a050eac6c24795522ebc8baf6ca02b3a8564f7da51e95c52cf45c5cf218f275449edf841f46010bd22b15946346e18e76ca9c359e54072223abcd493a03cdf748c4273d8132346eeab61ad9e1b92237c5efbc8b613180e3878a4781c35025ce5755eff69b5f2c02017f7300f94dbc99458a8c9b57186b102158b72b6741e42c7b83241bc59ef0baa81911613da2674527d36afae4f6055f15f15f9d6fd74bb71ea4fa212503aeec18e1282e2d6767a316b795d65a4d6c4252c8d73a1713f0cceef6f1d585a8d53b0940b9a404942f8907163540b6f835677b55166cfbf4f1d46a7072d9c3a401879a740eabee58fc23092c67bd5bd2467d212e12d2ca5142e1592b1c88f342f4aa6040ed591faaf30a4fd0112ec4698cc18278b73fa588a96bd510cf2ca17a65216e9c076a341271720c3832354a41ed01363c3590486d1585a93c752121e1ad85a9f6474fd9bb420a333ae04528a7c51f749a4ebfbcb2e68ba366b2ca487ed45cde576003dcd8d8e5185dff94041cfaaf3ce4b2c2725561bf08c87c92bcb9452133367dd09ec52d3a805e8dbbee18993f95fbe7cefb31b43ad551d688a1a1fe09296d5c9ed931cde9dca45ca502f4b6fe618d5bf0ebfa7412dfe8551a160db49e15b4588a9f9239cb421dbb4628ad8638530bd11a0bb2a8984b28b1d3a6deab8518ade0a9a1eb54d3b81cf76ca41ca229e17cbd0d006cf6bc54ceeeeb2ee591ea1ef258fe05499490676fe765d92d8ca47e22f66c5e6a12c76a92a41e28ddd8cfb5ac26433f1d480826b997dcef3e73c6fbbe8dfcfbaf72b23cda0e5ef5d309a69a6c8bc9f1fd831d3344d0c30956bdcd4f6857e21cea8f804f2128059dd1422561c11d0db9da12da42cd871e92bd9a74a6823fd53949d2b8c99bf11885fa1609c89c6bd78cb155adcd05029056997dc830ba97c4afa85f0eebfecc7249055e695fc442e73665fc98d67bc771fafca8ab56550fb469d7061ce83d03e8bedeaa8cff817fbce38499870c2a8fcb21a7dec25169de7c0d74e94ee8f09aeaf18d73ab3367dfd7c89099e5c4d334be0787626f644ac98d7ad7f810fed438a8d05f2339a767c22efa0b6dcf6b63dd234b2c4f54393a94a44bb2816b215839adad377275649434fd5ab2498fa573a4bb67f81239db43d1b22fbae34d462832b029f3b8bb6ed23c77726608736fbec859bd5e9dfa44d4b33e90f098761d8196c111954741fb4521a7a61f6bd76633f56edae374bba6a916b3a3e0e5ece6996204bb0b96502f1afdcfc41a66889e703940a26fabf7261498f5bfde239c1cf1104901fb879eb3504acdb4e28f31becd340253b6262912f4e78cd22cb175cc84937cb73d8f4e980db25f0f230580d7824316fa29b383f55b88f89f2a22947909c7890c1898e94fe81c05bc88c2ba173d5796faa9902fc63d0973f6b227693d64048e8520c53f8bc5dfac4724b5a0b26ea284399922fa7c6e479fb63c138d2929fe4a428afdf42888b72ffa4b319abcee0b936e0b2c428225b1e9ade3aacdd31731abffb0cb63b3e96b8e6856c3df0accedef1f6dd670b78d67ff98cc7287dcd43ebcff810d43c1d68a22ef059c40a88477b2558a67cd14e9a592a479c14e8f131ca0109806c5f3cfe8d0e55e192167813ca5a532acebd5cac2504cc47137ccfd4cf26e887e18b82be4728fc28a8cfcb54b30736c78fe808dd2d9bcaa5590bec048ebfaf8c19c80ee888b1e75df5b76f3e7dd3ca689eb710555070df0fd4ca44b73e9cb257fa7bf5c98ef45f480aa4bc2de1dc1ded6b73105fc37b83f1d124bc14b5968d32d1730cb091f0b8cd9c83fa6e5a50bf33417c738394a203cdda0e6655563f8b612761e3d9ac9d0af45790d6df69ef807526ebd659e9fdc147150733a9aff4dc64c46cd32742928ae5e51117aeac53238444051656a1ba688cd15af0ef9db64159bed0986c1fa56d3ceafef1217f6961fc10739498b6ac4ed08facf4358cf62c9971a8644709b8bcdbaccd11fbb22a4afca0102c3a1e4dab4788633362a604317be1a9521f7ece7ab51aacab6d03f99d45560d543e17a0fd7b99c062d99d2328cbd2d9d407810ad9ff26579c9139e4162478558b7e8aa68aef4da65d39b569fdc01bf28e9b763fc20ffc788c4ccb91c33d600d56c707d9b26926d93248cd7cf8bea2df96b178b844950cdf4ed97df77beb42284954d546188cf75832c7b443fc7614a01aad1f252c47396b3b1d7a562128cef962b5255b6ac2af11e214230a42caa836339d8ff8ff3b3b1c4ae79c0d7ac157b90125348d136263158c390ba50fd688ee441bef20dc4a0b2300d30d2488907418a1e25b9f07a6c1cb6b531acbdc759ef2e9230bd275d8f0a068b6dffe3946289d137f93e1aef918da2497ed7596afbc9769a827307b517d6baf94b2dc73d1baf9900ab69f212b062aa43f60a698efdc0a6a5bca921df9b8774d222d491d3a4ba5b6e6c2d1a91019338498c76fa6f290a9b75818f5156f2111c0a209a342ee859c6a4f98e49788f2fcffd7142c5348a4f50a41fd0a90429f41394272a81497591d13f368234cbeceb5c6b01584bcaeaab568a3e43731855cfb95a6baabee75a5b8de5d93cc20f6cbcd6df8b6ec01780dfd044c08765279c437d9f0ff195ccae0f4c4a052528811cab8dc76cc44235a47b7c", + "offset": 0, + "opens": false + } + ], + "extension_cases": [ + { + "name": "the note and the date, without a locator", + "extension_data": "a20078194361727461732064656c207669616a652061204c6973626f61017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830", + "ok": true + }, + { + "name": "a locator sealed for round 1001, and compact_datekey of round 1000: unusable", + "extension_data": "a30078194361727461732064656c207669616a652061204c6973626f61017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830025911636167652d656e6372797074696f6e2e6f72672f76310a2d3e20746c6f636b203130303120353264623962613730653063633066366561663738303364643037343437613166353437373733356664336636363137393262613934363030633834653937310a7052582b6c574c3542792f4c33504b564b4975374330747072723863595465774474304b4a3530503548654e31314e304e794b513247654632373277437853580a456d4b592f73494e4b7938327a574346362f317879474f683371456b44773943526879496c3275797a78323461442b42686b69634b515a7077685a4e456645420a366c692b796c4b7041456e6d776357664445463061386145764c586a596132795956534c5741786e6a78410a2d2d2d2074776773363657764356557a4b5a6a4e544a6839426243576e736b316b49645865716752452f7669652b410a326fb5a1e26474525496e9ffda584c68058d00f8add5fc7e3852e6f382662e2a36021893aba626bf2cd3c271e3ffa99f101ecc29e202585619122f373921bbc51359a2a96fa90b3ccb6ccbb6dd63e7179a1ee66a955f8580b11e635d9559b7cdcf68d78d4ece9bac487c8fa3243bdeff709125d4140f90e9082e2562ed402e45427bb88ce95c6c54c025bba397f2fe06ef7571f11ba1519b5037c7d06f7a56fd1abea60f1e79075d3a94e6936cecd3d7c8547058bac8553e31858933879636ee064f4f522521b02cfcfff55f16da3730c0c4db6ab35d9b65bda411b1e6bc3e44b1b7eadbd966922c8231e6ac9fdf56d26f197c369eadb28971d93c56e70029579be71a72aa14534c890f1edab5b09cdb7eb5ffb30cfca521de63064ebe5af4884ea7b9f66ab7d5907696879b121a88c38361da8e633fa4f148d97d99d339749a4f7a81463ae91b7a8f84e434a74ce264f6c792dc355e73e117beac00e4e998f926ee2465b7e41c12af33ca47821b67ae3a245885d20f8b786fad36468d30b603162b756cc96ec54639998f9c4267d4ceee0c7d036777356b882329c8f937379644d1565b75100ce685019a74484bdb911f80775d9f6de043fe5a29c3f406cd53553a46ef401f071df4b8816db741c2cd18e6cc816d78f892ab5543b8a4f754cfefa0873016f7eaf723e1c09a53edc7114f4320d6547fb6c6e6a060a9608678e20101b9c78d330be703fae028ac7ef3fed00754d082da79f84698a1f928e75f9ddf7412024bc0343f5aecb69bd374ea9c1508629e003731c172175237d067e245da3d81619a913306ab7f8223dc14de3426b184037eb11026a347b5336f959cbe63f46cd990998a18ac70daced965d5676acce37fd98eda7dee8e74f83cf88f5ea7e1be632a9b87a5886f47dfee0440efaa7b53412ab45b060118f2af15d337566038e04481a9559b2651633f1aa693c00a9a234457d765f96c819bb1ade8cdaf03a95d356276a203a511e5ee0b5bec94efc34bf7e8002a278cfa4798257e4877c071b9c3be7baa347ad4ab5ccfd11fd8b763c1b317de9eb9a831b00374bb454654442145164cd82483ce671af84678fc8091bb7af804e12a318349783277b829a7994db71f6ec5da64a53cb6a7e5fe26666c814cd3c07354567df38ccc14868e9c438b648067864eec1a17f36a47d7afde6c9a9f574f875202419e4cdf83ff960a4c4257f04cd0a63cc09156eeac98d6c162ccb8e5467154c2c76ff6eec1e8ceeec90cfccb3d8a1c1d74b38a638a38417d7a1acc477eee18b9abd33b8b3ba566150e5685c11ea105a3ec806a5c5030e71a70ca5bb20284d269bc493fea6c51272d31d159cedc587aa2edfda135eb1434192b58bd4e16f665e3d9ea16826cc5acaad359d8a896d95c26739ea30826b2c0cf5952ff047ee4ab067732f50ad02563c3c07bb7221d7d3ee82e1a5202ba39173177928fa269ba97e986366a6bf36ff8c364e7adfb658b0628e4abc4f505ef3ef3e660a7c36600e7bb5e0c75a9ae42ced6e263c6336d1098251d94592e0575d9b7dbe887fd02fdedd6a3736d0f346d0fd8e037917d43da908697979f8646f6f4b48ab1b760cde99c56019fe2b2462bbf40749a65d0d0926e4f5ca9fcf1eb1777668c0fa90403cbdc99f282ad89654df3f931112ccc10066413c337a55f573f58428acb04c38e9efe9c35d7f3e2c6c2bc998f2a524dcd5568554250eb87af859ed33470e1c6561cb1b500375658bfe396021ac89f03cb6e97510483dbc80329b3e0243dd51d32d5a38e6a945a523165de221cf6fa4c1d1edbfb52b279c825827a8143f6c9ca2d4aa55eef5317e3cedbeeea31f6c4f0297ec3d1ef61e8f0701c25492422f59524c65a7d6f16f761a6fbf794ed5c828ac8a05fc600876b4274d68fc5545124e5464b6f213e760a4eabe90fbc016b161b813d7fcfcee612f5dcfaf0e73720b3620d866b75f42b5a61e04278a26a11baa98fe5a4841e168c511f081bc1ceef8bc2865952d9d9283140eb2d3a4ff06f0c7bd0f08239a2df1d113465a4e22d89068b46489080bd7c769b19f7bbb993dbd0d7761f6cdb4ef27e8a14adb2c47369d9c91482032b97068c53b0487259eea9911ef5a3496a84885acfaca67ca044a4481f459c606413bc74c3674fb9fc67bba46d7f6a52b5a38a85d2db84494e014207a888cfc90b4ece21f90c674dde271bfffad33aad19208c11d11ff3aaff79a826729ab86b50dd6f5875ab9fe4b52d3fcf2493f8ecc2598a316d5c3b49d5c8fd289f40a67934529239a32d8525ffd1e0a5b18d445fa1bf6bf474426873dbe9bd37bd95dc6a4a3706d2dc689dde60408138a9c36f139e8f542872e0f2638fe977e488541b64cd2efab6c742c5a927c8f0a10e1d54b5490e2ce0466d6ff91067479b7018ca2ef26ee6f9e20f991c5079aee4db21f46037ab8b57566c2528129546f33f5c8b574695180c5b0c6fbcc71656cd5c537102bfcb23bde1f11b5eed11498f45df9c1386be15f6bca1a45bd5827df5fff2a6c1e0993261d0e1b1c4e09ceb8cf7061b47daa61d60c9155a57601248fed3f856381680020f33d7a5ddc6533c22d6b99f4cfe41d8285aab7916c7b1f073c4b797d19d9895adfd88f4f8eaedf34e3b2add7f88e8e1ec0dae3e20183e42c1c07f80e423e6b8b47c7db668dedad42b64fa55f08944d8970fc76d7560f13967f84df7fc7d579dd699f42e9038bbf2edd9b49328b913145ed7dd54ed8ac238b7824dbdf6cb68d30627ac81e7f828dfe6736bad6a7c976ba7a550f019bc337019e02a4ec5a4a66436c2f73f3bc3627e45f19ce96da64b7059762cf5a8151e1602f0e9905fdf8eccc412d9c5c9a2aa0e26696335e3eb7676899749a67998ca5d52b863a065d853ffee6f620961a71805f11e5e1bf4e3e51a5613b7226bc112f240b136d6a6aa23713e551f4f9001efb4c170224ec9e24b9230d5ec1f158c73f333fc32dc6c202062bbd63c71bd998e1d578a207cfa01a1aad530c850f1077af6f01bf62576f9fa9b78bf8c82b18dc82dc35ba3399e7c30d9a857a9a5ce90c98efcf09d4d80530dab7edf67fec072f3b99ec834c1dffcf9e65d858f5084e54bea9df4238c3a5cf2802d813898611307141f4687435809829f0604af3381ee4f07c64e3f59ec0a20c49a205da8ae9577f071253f43310a353f5bdfa7f4cf306ed33d4ab71f36d7643f3b1748314432c350d2f2a38b48d9e5c1b04493d6888c713639699282d92cdd24e7a1f761d88d7fabb286760e1d06291138b6647d39e9779d128a3127d7726ca8b8172735eff44af063059de1b8ee7d271c50f1ab97634f542d68e8f8fa396e0e29696fa342eb4a3ded46340d4d39948dbd1bec7b2c80ca56b710eebf788df5a719dc2d14846db570f055dea9ca6bf8e9db7f67b2c33d0901e81165158d1076a38da82e816df407157f3b0a3f01f687914f032b03553070fc94ef8986160184e624ce804346a0d3fb6c6a495ab958e32391e11b46d19353020878725cf12aee80eb7530c196cc20691b3785cac47f928c57e48ebea05a7c7c1119a5c264a50b099ca598ee7f2da376aa520b36a8c6e166aa57af003c153941682b59569ba2691352b0b8ddc30873c011e35fd77ccd9dae98ad7b31e7813b16d46c0543c649cb679b98462aca419adc6cfa96065a35d36517172e3156901fb74777812b6a4fcb16a4111182474cf511832fed5cc37c4ee57a023c8e2220a6b5bccf228483f9e01e273b2197a76dd5bc091d5a59c2875aa10a9bd128f725bd8a1a4f305a64095e1856691499453d6807619112e1ee364625ee50a2f6931d63dae2a515ea94b6dc005c8708f0f301bc797bcefe60e27b1047d6b086dd075dd77434e19ac18d55b0712cf5391dbde2ba7025de54629f1b2638e4d8a009970601e94c24258425369ab113371bddc77f5de2049733323cb78ea1582270693a6abb1170c36477283c18e51f4e6f4d0afbc18067badb75528e017ed8e7d398f2637e89bd410fafe96910ea36ef7d0d680993bebdaef0771b5e23515cf23e752e88d3b0e541f6f0204fb24500e302ecbc6378e0b859b0e0f8f2babba54f383ca8db272b2ddbb089958203e12e583d4c7ede00203468b90a10c00ed89f38ee8f07a816dbc0b8bf360802748d4ee66b258e487aad01f7f0ab8b759442bee39c48b0eb3f7416cc7a05e2eaa0f31d83a2f15ab7818be5cd2154710bf89f9a18f94f5ce4a9de6a4d1d4353fe5111772f932564e9b6ac2430257fb13954d0ca7d7076f00693c0239d4d3c2c774d07ce8f31d9c853b330b0aedca97d98cfa22747662506dff856105a96ff66dab034ff0c3bffe5b9150f2de27a9455936a0014d2e892db9fefe9e9142b025f95d6eb95cc7e2199111ca66ccb83357c487091ca539ce8cce011388d48da401f1a42f7863955ec9f475363391c2898dbd5bacf5ea688c91a2d9831632008c0586c5413d022c3e0460b3de126c823f9fabcc9de03fe005cb345dc0001aabf4d6c28ca3c3dfbc7a1ada7dc5c2f1add2dd6805a4fa9d9f69756fca4df89b4cb8457e50fd89aa3992b5e09d0417d137f6b7287a08d83c94a9bd86185292c29df3a9eae3d2aa7f54cdf7c0c7637f53f3723014cf8571825ac71b1d1af5c24d31d45bedfc30372750f2a549051645dd6fe3d49335f93c102820595584831d15d9a8b3bd72062956e112e81a8c33a442dfe2fde172b1736b4007be91808865cb05da18dfb3c33cfdcd7d5b72aa5a11beb33acf92958797c2021d9b397372636e8114edbf9754eff4a4fac2ff16dfbc90c219542abf865c9df9ff400db02b917e1731c0e8691802ea904a97ba5d2438326259d782b19cb6476f7a78718634795c159637381b6bcb890b29c815c884f9c245bd9391739db7fdf646c3f7534e44e58877763126ce80cb0599abf5562abd6841b111ac7ab45a7a7b80fb25934e53ba0bc90ed0faf453ab2b524bcfa080f663e6bab85640332fb659925edd00ec5a7d511ccfb9cb82266f18eaafea36f7e020d5e131c5aea856833991acf4fa1c81c3ac0dc4ce10035ca103803c8a567a874b2ce5365cbbe24fe1af773fb05526f44c100dd0b54883a3ad015bd2b38c8b0c9ea8d6d8b7905d753e6d704afdcade9cae35a7300423c34efb62529bd11c1a07601406eaac544b508bc1b367b0cc868d644b158bc85954e1d53ce65863c8e7ce89aea7a4b238d1b3f1e8e27fa8e643e8040e871f9d996c839ffadd8dbc9b15bca62344bff08df7dd9d27a12af6b841fc19e562c8ef36f70d35f3fd2cf8f3404b74df920822bce9ef40f80c062f25a380b5bae88fe8a5cbc9f8351aefebdd98d8e654c6ce0407adc6ea2512fc1b31cff88c46383083ba897dd8ba353a1aab1bb208e36bcf8cea27368458e6d4b167961eefc03c1468ede60782fe7435b38e84b7708aba0f09c7d20f542097a6bddffd05088a5da67553e5b8ecc809426b831cf65fce500ff884f07909adfed27ce1eb678d497fd3bf7b767ebde91cf40e906272219eff0c6c2b85b966a375433f63a791762e25b37a376ea6673ede7407462fdcc1c2489d76c3bf15c7a2068bd082669c36e5bcef7eb34a13c28e1065041c6c1d4338e59fd748274a418b28d0b2f2e967e6158fd1e6873b2715066a1748a289f24151801b3bb2e7ddc15a4f602e9548e0319d6dab936743f307bc6792b1dddaeb1140a778b96fed3e486aa8f28ee95fbe92ea7bbe04a6e6dcdbc2ada4333a35ed361eb5826610de1bbb12c80e00e8571e388e24c1a2b486b88fb9f0dead9070f92f71d5b7bae35457cda4898ff", + "ok": false + }, + { + "name": "a locator that is not an age file", + "extension_data": "a2017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830024b616e206167652066696c65", + "ok": false + }, + { + "name": "an empty locator", + "extension_data": "a2017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d48300240", + "ok": false + }, + { + "name": "no compact_datekey", + "extension_data": "a10078194361727461732064656c207669616a652061204c6973626f61", + "ok": false + }, + { + "name": "compact_datekey with the members of its JSON in another order: not its canonical form", + "extension_data": "a1017853646b315f65794a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d437769646d567963326c76626949364d5830", + "ok": false + }, + { + "name": "a note with a tab, which the rules of the public note forbid", + "extension_data": "a200704361727461730964656c207669616a65017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830", + "ok": false + }, + { + "name": "a key 3, which 44.1 does not define", + "extension_data": "a2017853646b315f65794a325a584a7a61573975496a6f784c434a755a58523362334a72496a6f695a4746305a57746c65584d3663585670593274755a585136646a45694c434a79623356755a4349364d5441774d4830034100", + "ok": false + } + ], + "plaintext_cases": [ + { + "name": "a base of 4094 bytes, which key 6 completes to 8192", + "locator_plaintext": "a70084a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a10079031768747470733a2f2f656a656d706c6f2e6f72672f626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590ffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": true + }, + { + "name": "a base of 4094 bytes completed to 4096 with an empty key 6, 06 40: key 6 has at least one byte", + "locator_plaintext": "a70084a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a10079031768747470733a2f2f656a656d706c6f2e6f72672f626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd0640", + "ok": false + }, + { + "name": "a base of 4070 bytes completed to 4096 with a key 6 of 23 bytes whose length takes two bytes, 58 17: not its shortest form", + "locator_plaintext": "a70084a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007902ff68747470733a2f2f656a656d706c6f2e6f72672f626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd0658170000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "a base of 3837 bytes completed to 4096 with a key 6 of 255 bytes whose length takes three bytes, 59 00 ff: not its shortest form", + "locator_plaintext": "a70084a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a1007903e868747470733a2f2f656a656d706c6f2e6f72672f6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161a10079021668747470733a2f2f656a656d706c6f2e6f72672f62626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd065900ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "eight addresses, the most", + "locator_plaintext": "a70088a100781968747470733a2f2f656a656d706c6f2e6f72672f312e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f322e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f332e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f342e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f352e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f362e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f372e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f382e6a7067015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590df900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": true + }, + { + "name": "no address", + "locator_plaintext": "a70080015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590ee10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "nine addresses", + "locator_plaintext": "a70089a100781968747470733a2f2f656a656d706c6f2e6f72672f312e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f322e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f332e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f342e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f352e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f362e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f372e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f382e6a7067a100781968747470733a2f2f656a656d706c6f2e6f72672f392e6a7067015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590ddc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "an empty address", + "locator_plaintext": "a70081a10060015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590ede0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "an address of 1025 bytes: the locator does not read, not only the address", + "locator_plaintext": "a70081a10079040168747470733a2f2f656a656d706c6f2e6f72672f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590adb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "an offset of 0 written: an offset of 0 is written by leaving it out", + "locator_plaintext": "a70081a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a70670100015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590ebf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "an offset of 2^53, not a safe integer", + "locator_plaintext": "a70081a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a7067011b0020000000000000015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590eb70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "resto_size of 2^53, not a safe integer", + "locator_plaintext": "a70081a100781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a7067015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041b0020000000000000055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590ebb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "8192 bytes where 4096 suffice", + "locator_plaintext": "a70081a100781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a7067015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06591ec100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "padding that is not zeros", + "locator_plaintext": "a70082a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8a1007842697066733a2f2f62616679626569676479727a74357366703775646d37687537367568377932366e6633656675796c71616266336f636c67747179353566627a6469015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590e7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "ok": false + }, + { + "name": "the plaintext cut by a byte", + "locator_plaintext": "a70082a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8a1007842697066733a2f2f62616679626569676479727a74357366703775646d37687537367568377932366e6633656675796c71616266336f636c67747179353566627a6469015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590e77000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false + }, + { + "name": "a byte after the map", + "locator_plaintext": "a70082a200781c68747470733a2f2f656a656d706c6f2e6f72672f666f746f2e6a706701190bb8a1007842697066733a2f2f62616679626569676479727a74357366703775646d37687537367568377932366e6633656675796c71616266336f636c67747179353566627a6469015820b6362a7a13929b89c325eef45f81d0ebe90310d1420e4f914a0ce43a72adda110258a86167652d656e6372797074696f6e2e6f72672f76310a2d3e20583235353139204f70623755786c657736353147415a3057674535463158487347496c70723579674a6c74754370707a32410a434b5a6767534a77746d554c30583775684a7a3364776f5039714c68342f723038476a3577525944344e550a2d2d2d20704a385449433667676175374d2b787267517a68776e685947744474526f772f6442762b384e4a6d62636b0a0358200b050aead0b9523900f72fa7168c27c5e37be8e7b8eff5438135432fcd79d606041913a8055820da2c0d2b02e604e0741faa44d90abebe7dcf83dc376addbca1d46782c89ed9cd06590e770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "ok": false } ] } diff --git a/testdata/vectors/mutations.json b/testdata/vectors/mutations.json index 7bc7e37..e81eb70 100644 --- a/testdata/vectors/mutations.json +++ b/testdata/vectors/mutations.json @@ -4298,7 +4298,7 @@ }, { "name": "a signature of alg 1 that does not verify opens with the verdict F2", - "spec": false, + "spec": true, "dkc": { "base": "format3_single.dkc", "edits": [ @@ -4326,14 +4326,14 @@ } }, { - "name": "a seal of seal_type 1 opens with the verdict S1", + "name": "a seal of seal_type 4294967295 opens with the verdict S1", "spec": true, "dkc": { "base": "format3_single.dkc", "edits": [ - [786, 6, "9c6f1f0dc845"], - [813, 41, "21d7830f993c91aab8abf294f1265c148a22d3631a140ed44ae7be80b8383d3408fc6d9b9a02f9146a"], - [1547, 16, "246b17f7819778da6111cf3e50d993ba"] + [786, 6, "e06f1f0dc845"], + [813, 45, "21d78f0f99276f0d6767c0ffe2265c148a22d3631a140ed44ae7be80b8383d3408fc6d9b9a02f9146a04a75294"], + [1547, 16, "8731c709cc638cee980df229ab30e569"] ] }, "release": { @@ -4355,6 +4355,229 @@ ] } }, + { + "name": "the signature of alg 1 altered opens with the verdict F2", + "spec": true, + "dkc": { + "base": "format3_signed.dkc", + "edits": [ + [867, 1, "b2"], + [35595, 16, "c3fd532dd5a51df534f11289765b71cb"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F2", + "seal": "S0", + "lines": [ + "La firma no corresponde a este contenido." + ] + } + }, + { + "name": "the signature of alg 1 removed opens with the verdict F0", + "spec": true, + "dkc": { + "base": "format3_signed.dkc", + "edits": [ + [786, 6, "5f714ecf7f7d"], + [813, 108, "45e7568b60c4234cbfaa510a7a716891a089ede67b438fc5ee3a170425910e84ab50afcecd4905b01cce51ffc86f71a2562eec34a94226e2ec508c8276f021f0d8655e5e731d8c00ab12bd7b407fe32e2901a9a5818eaeaf9454d8fad6d4c0e6c5826a4dffc3d51914104c46"], + [35595, 16, "76c5c411252762afa3787ff884f80678"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F0", + "seal": "S0", + "lines": [ + "Sin firma de autor." + ] + } + }, + { + "name": "the signature of alg 1 made again with another key opens with the verdict F4 of that key", + "spec": true, + "dkc": { + "base": "format3_signed.dkc", + "edits": [ + [822, 98, "2d41715eb4c045f6fe99b11c7ce00dc0aa3b4bd986f4e2e3e93952e571d3dc2ccc09bf65b50c2d1018affcf73b6ab29ba74d5764ea45e9816ed9581db69c95731a233908e879ee91019df577aa7ced8c2b90fa49bcc77051d6e3a0318d539e41912e"], + [35595, 16, "2f07443d5eb70a88c96e9414bb757fee"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F4", + "seal": "S0", + "lines": [ + "Firmado con la clave dkauthor1sug8kfx94r29vam52ann7m7g96gzcnluzlaxvj9ej6wzswxkdscq9nxk89. No prueba quién la tiene." + ] + } + }, + { + "name": "the signature of alg 1 transplanted to another capsule opens with the verdict F2", + "spec": true, + "dkc": { + "base": "format3_unsigned.dkc", + "edits": [ + [786, 6, "8a7c6cd4ca3b"], + [813, 108, "6f815f8214c83aad66a057570616cd6f9aea8cb7ad32238a8a6297d53476c1728208f53c3ba99ad68fc013c307e5dd10b100a72938bd75e6c6b17154d6068b81d4aa569260d496a94f2693ad0053ee322bfa26ef03f28f940a3edd1596b0f26c1aec6cd3998c0797b5ab658c"], + [35595, 16, "60083fba2123edec5ad00eed5c170759"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F2", + "seal": "S0", + "lines": [ + "La firma no corresponde a este contenido." + ] + } + }, + { + "name": "a key of 31 bytes in a signature of alg 1 opens with the verdict F1", + "spec": true, + "dkc": { + "base": "format3_signed.dkc", + "edits": [ + [786, 1, "c8"], + [815, 7, "3e2860c52214a0"], + [853, 68, "1e96119046917c588cd677c3bbd7309d61dc480b7b1065eaefc733410e1693561c8efebf417782cf3e430ce69a89858edd59926dbb1d3fde98b44e6db86e99a082374746"], + [35595, 16, "f193a72da1dcb9b65be07b3717212273"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + } + }, + { + "name": "a signature of 65 bytes of alg 1 opens with the verdict F1", + "spec": true, + "dkc": { + "base": "format3_signed.dkc", + "edits": [ + [786, 1, "ca"], + [815, 1, "3c"], + [856, 1, "be"], + [35595, 16, "547f05ee603ecf3cbe3faff4289299dc"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + } + }, + { + "name": "the area widened to 64 KiB after signing opens with the verdict F4 and the same AUTHOR_MESSAGE", + "spec": true, + "dkc": { + "base": "format3_signed.dkc", + "edits": [ + [574, 21, "691bbfdaa29b819a0f6e2a898089b5095f781eeb73"], + [779, 34832, "70ee85e79e0293d03123cf0b9c1185821fb3b08eb376f1ef41c322319b5c473acc990fa4d9cd933be8cea9a7be3e0716484965b07704832e8919545821d463e402e865326f3b26f4a3f8dc8fd71324b241d8a2608152182ca450d7c6345dbd72dff03fcbec14a4c81fc5af685df46194e0efdd5ca21a814c98bb52eb16c60baa3ab48ac22dbb6fd58c70fe2e158e850a6e5f82b4f680fe0c557395b10a0529cf4401202068768579f0575fe42828f771f6957a58bacfdb8140303da128a526dcf518bfbf66290ea4ef441af89f973b8ef27f5dd48e294215591f10703f013662c7111a91e173ed55a22d80aa0dcd7389f8e60c401ac590d09bdf0510cbc2fcd276aa4cf3b7497ea12a4badf7d59e9faa565516bfa6047053501ac810375910a08c1fa98aa85a0f9f663fb314928c1eb0438a7536a0630b1c420443f902a4bd573a56df4ee05a166f802df797f73f482837ca7f91ec2d2a0e2beac338a3cc7d0f779796b0b08c27e9a80169d460749929ef2536736ee7525eaef0cf582224340a7b42013d43acf955ebea68527c6e759a348e9731b942c7e18170eec6ef6bcb091296edad1fe19796d6b0a65d117faa4358b522b3b57a5545e2b408596021c5fd3d16597a8eb3ac45b9a25f059d5975e5f793eec267b13a735c50f740377f14756be38d6fe2d3fd85e1b13793e0e619899f0f8d0f40c4e8a53d669ffe52b465241dadb1a95a595ab3143d29495e8bf619bbe2e1a4627abd8f4c5cf9e09c14e0d54c8727d0f85479ee110e3f701e6f4b6dbf070e5a0c84deefffe238dfaf8cee794b4cc3d2a3da02043cc5428e9c2e48829530f540c7563315ff5f7b215303b3671ecb117551d9a13f055eea85871b0dcf9a137e5695e0cf61a862d9fc764c00135719e92d838a5a9d9ced63e4fc5345a954170ae8b035e9b1ec64207e8ef6d2a4a42c2b2fef0afc06ecffdecb7678a4375623760f25065172ae46d312d030d57379e64042f63bce59b6564b2a4423f8832e9a5aa2e8639e491cb0ecf98d94a7633bd44f0239de84dfd365e87a3da798daecb30fef6a618088e429e27c4254a1c9863e68699dcde7b43cba2acf1cb040551a72fa5b3ab5b6d040803b9d56415897a03653870e43f0ecfa18cb03a67fabe5a4a9ae331c8de81d120844cef687ac23d5195ae1850564d3cf468f20ab33d1df6482edbf133020c55d04c1e012e1187ce3ec7cbf202923180d58d71ef00f0e4c235ff4e1e2f12420d9c7d8db8711387d3f5f94b6149e4bca3326b37c36b786d2c1ec55f735a87310a3f8cb56110d0f281d7256fa9f86d579ba8b8d77b65caf0dc52588ca8e5c687ff549f93cad2802120d79e1ced3e0f724a0f77399fd63745210c266f95f26b1a2e3a53af0ea7185d39c5ec28add0afb0c127c8c73b84624febdc1d8f196db518f09a5740fb8a90a4ee15a2d0ccd76f5f306eaa43bdefcddbaf165916c1fb90dd58590935e70acd47a3d2e99bf9ee50bf3159a66d26957302b2456670927be92498847d6631cda8c212d62d20850bb0efcb2d16dc47cc300b417d3a405fb292e29704c4ee6c009deccafb3bf162fc3f6e5eefd1c08e0fe031c24c17216137af5cc99d3ebf214501c0cdde3e24940ee41f88248c18c986bcf92369a455190ff6f2f332609e222f34d0afbe40a991f8dfc92f3dc8d117cdb7f16cb2f35b0f73b9a25e7bb56366aeec92e9a39aa151ef5688bcc6f4552f9512aa83fab706414d322818557c9f8a11c51b06b3777800c6a2afbc7321365c47778e3f60ba1ed1c0c99d4b65a7ee3dd00bfd8ccdadf6b5ae4a821fdf9b610e60c6726990839911d77127eebc890d9cf5d36b1c8a8b2788a36a416daadc5c7be36272de446c6055182d7138f104298899878e9ec3f76076ab31032454da22a87055983d43b3f900b8640c255ce3fc26b1d9fe44a2c63fa2d96c759f1fdb077f7bef8ed0a99e8e0e7991240fc97e60d9f22d2491e180283128c0b5d8e13bb75867f243c6a772d108f6ac408c6989e79557005711067a1d46484ee380fa076852b31aae41d4592d0c2bf7a6284c10b75820606415343578758fff6c15fe6d2bbfe31057b01fa4c7592f14fca718ed3c6e39f709c46b325b0dc7389e5b1d828b212443937dec19ebb6a8367c53bc02c9c2ed34d85f27754c5c9289fb4b7dcb4a118a67628c7227fe041b4cb5f0c3bd1c66fd095c79f3a821b3e93ab676401cfe4126d67d43a979650e4312f60e004ee17424f315e674f259e84e18af85109968c2299769ee9e9e0f2bb77df570b8e16970fc081bdd4e86c8c9c2a96db2364a380dbdaf8c55cf09fd98c34cb40b4f190482ccdc2bb1eddae666354ac7a04eca927cc963903c7e5d81fee81904fd5071ecdc03be5d30c7f8d0ba4fc2a4d3c4bf5a0cf955df866018d7ca71683f9a2a9646814e404ef425a8ccca25f19e2a88a45ae347dcf716ec7098ce4654e15bc5827b281598ff5e9e1f64fbe48019b0b05c4fcbc109905acc7216024f3260c59fd11351dafed6c6d563c0879b0cb1f622c87e2541c614895da5fcbbff99890831824e73927c8924043d633b30c8a13ba9a73dffdb06a894e61a3364e97a68137abd3382968c4d8001f98d8bc0211ddef2a8e331d56f242df192b28d7ac7831c2e02792450b0987d043f8496503d266053e0362cac274883392b824f472ba3580334ec279ded969cb3fbb8c6dfec7c4d6424b60893cb8a9f221c7b75f407bce3184e12cb46a1dac0f73df6ebf33c32518e2a2e195bccb5c2de61b4188b0cf10e3746c2a380d3e2a7647a0d47f499b493e32f5a9ea6d85e00c0bbcedbaddfcf2a66fd24e66e7c73c98ab04702b6f05ad20bf3b6f1f4767d5ffd97c72403260d4c0fa222afc9c6e7b50bd1efed79295918962543d89f3f6346d35def4c3579b64448c9ffd788aafc198f05fba101c3b58de5e17e5272ae3cf1235427c144cedf0649776065dc4f041a8d44b8bee64df84ed3b2a1ca7ee378a586c222870ce6ca2a2ca26637c903290c90f6a4a036159d8905a809b46b23ed278b2a9ef4eb11111bd2d0942bda812a786e78aa1e90bdd998f33e159e80691dbe233c07e96019b100f127064a942922300bfba87c1bcbb3d9c6b8217e80f3fc1422f2498d0f7505d4b98fd2289892e6e266228e82aee0de571bd634e1fe1ad890b4e317c88902ec24c60ce0437f245a1c43e624199e7d34de59448cc89a225c0327379cfce8182ea0b13371727574570ebf5705db0e8bc416ffbcbf22fc40bd06dc435cda64527381745953cffe733a1e6befb04930c81cca39c0c1790428c8d00c46354bfd4f0cd346a4a40c803052cb52c81f2498b78ed49d5b6dc4479741541cac5890e9a64ffa84c1b5e3617b74512105e5812a34cdac8b0f9bf725d8e2c1de441884e1c9e7e527f2e09ef7d4c2d07689a2bf781f0b9d5dd261c7b94a5221f559241a8d8f9c25ed6b70ed75d9f63e091d43df91bb4030bb08879141f80ec6a0b9f5f53d26b33a17a50acb8c03f6bec002eada1bd1c77fba45b3762d8f56f2cb510a2756b671c8fa15820af60cf16885c3c497734e6ec63b8b5e6ba6c5a0f8de957d64d1500ef43009b5592da12d585b368234d294317035fe6a3ef437c755e87e40b8d7a7b0576f345a711d96f8a1e84043bf9f142aa63c98fe2179182f41a3cc555ae3c0d6975e26adcc985516ff44fb30e98e3335d817978dc6d46b9d4818d61dd0219eaa2ab7926b12f72d305df72711b85ea89141415bf114b0a779670c5776eebcffefda6f13f132565bee97b03c8d66a46189df33c09f26df0c7466960b8b0184b383f463e001cf026b8f2632ee0aa3f1f83da08bbdad6a501c4864cf94e62a7cd55abb24dae98aed3dc467fd3c39b27907ded15d2bd548ef1c2f56191cad253b2286ec04ca37bbe7bd87ce80c9dae8b156ae984ff7a95fd4a8e97871d39f67df74d6f246e3e71c57fef45a69b24d2a95f6449dc4619688d19af61b8091d1e7bc6d24ca311c6b21499db1e90750fc007fd83059fb1494feb21274b525585d20c534018f6cd0169b185e5eba995b953adc6fab183220f71579627c9f1a8a21fc96c136d48fda66c301d37d2205efb52796d2ee0727c532233d7f851f672ff773e56face3de5d81a74ed74e07446e9a72a16631c7140e5a7f3d135b8d27db7c8bc526e457e5c05642d2845779998bffb08d72e08dc1beed0565c675ff1d3f44c403a8355abba100efd2395e0d0b73bb870780aa24fabfa8d5f6224fe189e4e49cae851238e29dfd8bfdb3b33cecb913fc4471cab80d28bd12b9cf37abbc05d8cc45e6cd58ed1019a8aabfe3712fd266fd8036901e4a744fc04254c9bd09ada45c1020fb07e39f66bed698d0f79c74d6b71d1def3b75784f4bde8e19817d20cb9a4cedbc60073c85291631ef43cd7576ef0cd283a49dda0f50b23c4c441caf0287eb05dea317659ccfb18da9746022d188f4db41c3b91d9c20a81e13d697a121dd9816a34150a23f0201a21cbac9bd14c9b6e963c50576a447acf8c9a1334535a24c02f12b6a2d2ef6576b913e39f01cc7463d0063583fb4098135c8eba2c24c8e1ff0cdd8e5bfb8a175b9595fc96753b7522fbdcca6d935706b8dfb6c7cc1d266880c872da6b79a83cefedb165016059d9f10718b0f9dd70ecfd3ca431b1d23550e235ba847c4ff3da983295639403f68236de98cef9d84fb5e7a01403fba9143aaa7d1338b8d33eb46fa570af454888df98fc0bd57765e2d7fd1172fd0c73653eb3dcf3094606a7e6ef6b5a1de12129b2c92d0730cf580a94d4f6d777e4ba2fe3769a02585257dd41cc21a50745d8ba09a96be41e8f482b513df9ac63e575e08fe23be72843db5bf4e476a01c51a4d39d0fa2a8f660e9e9617a23d21b10f0a38c1d03b355be1fe2d9da44fe05c6a4c3e43208d271e79115cb0913ae4c09073e2295ae90ad7c01bdef8e98b0fd556909426928c4bb2053fbae7c1ffd50a4b5f0592c5ad8a73f71ba8dde0a6b1bb1b6ae86b3617e5e514542122543299e6be9aa38701b8f895218ec6739011a29469e8219c3def60ae8d2bdc46ec25a18901fbbb3df3001b498a4222747379ca338489285f23bbb06e29a89e7d1a460fde68ff98a243f0d9bf208149dd1139a3c0e30e6fe91019d7ac33c033a4f3a719018a48b894b334811a02dbc89e033bc7e6782b2fc3f92e48dfe84fa31b9f9be29b4222304fa62413dfb2c45f4ffd0bc22222451bcff6c69850bfebb0b05111817bee85a7c32b0ed2e8345cec152df3881085908caf668cb3330983c00557a4ea5995a2f60e46f46a17debfe98c2219de492da46ff1bbaf4c2285b7bb721f304d813db2fbbbb694d6c01cf5edc7d52f65d66c6aa0bbbfc449286f9d262471e92efac96bd9655e90dac3cedc0d0cd28ea7fbc35f80970421e3922cc96bd50248554e5217bfa082bb79e476c5697f6eda8cb96e951ba98f3bd6d833a0ab9534dc04e9d9c1a388541b0610716084163fc1a952d70bff9c71af407354a751d96c35bc082828baa9ab20f5c23377ef23fa93dadfeaa8b5e141f880ccc64fc2c25d52073ac6a406049121b0c0dac7c9ace3cfe4418bb1521482a6330d328282c412b291e2bc434e20180e11a86fabedb96de70427ac3f120918fdf3c24292e36ad4a3f9d51bdd70719d242da19bf7f187b53864ca5398f27f85ed6df79dd7b4ed6ceb461dd427c2b976d7e648204b45e2a12f728e8e6d9e12c6064583b41e70f603b7d2f704f9911f533530103b33a73bca00db79a641d6e2d4f667e1e10de64ba4e5feeb5be1885f1e2e39935119539a2540dbd41d4687f8725b454ddee44500bf035e4fbe05adde31b3c53d5e05ba3186d5e6980553a5191710c8c20eeff639214534acaa739abdfa818d86952677d267d1b20bd502607775a2e9227f8d9f6c6d856098200bb6e65dbaad2488fd5c3f04342b82d33dcc85b3558f58a42bc20caefb281ea0239c2f8d4de0f46e90c6c51fef500391cb4b6629018ae6b00f56668523c915da0d41006b44db5fa4f5578fe0a6309ec19f5618cc1e47b9b5f2ee28797e02f62f2fef99cb1afa46893374289aa2246fa1e32c821274710077d96ffe55293fbe66d8438efdf625d5e20e56752b208614711e8358979613feabce43af2899be99c7d0794c8ac063c97e0e800b3e6b9c83ea1bf02473751faa1c84018e560287b171c52d9a5a7db1bcade85641a718d4e89244241cd35af8f328899b5705361a1b5b72967f7611d370ae4ab8c18a0155a5aee211498dd35cf72657f2a5e9f2db5720a5d51805050a0004f94361368ddb8196312c565199f7b88353d82626e3f35becb9a5831df3f9ae69ef7aea4de4d317ed672e75cb859ca4d2f9a2c58da50627ffbb0903446013899a47bd851767714e3ffff215c8255728f5ac11d3555823fc224f14ed0f6c45715f083840992ca4c4b1ad24fd83249a3219b4ee0b09ca1baddca1e35fbdb29c4a77233b9746df6f51c25f7478be0efe6376138babcde0f506effc73e532faf5976253f878de5a5c8f3c07bd9975d6afbb02fe84a82ecc80f57ded3f60f8495443689e8d158356d3bd142981c633419d6d9f3de5d9e2741e702cefdaf875ad1291488cf2d829d02feac211d517ce4364e3b34f002473b21bd87212d1e82eb3ce126f96a09685875f07e3186965e88d7f55427fd61b10b180b06e0f9664e52ba56abb22f902bb5ea2f917fe99ba9120742893b270bd54408750852e1efe0e75865300e5cb0bb16cc2839cc785c9d134067a3254232bdfbc51a5462a843cc3107d13bcded514825a9c248072de223811c692c4e32006c4279a79091ef12110620b81026af5f2e516c3cc9641ddaef019b152cc0f92dd3eb807f39a7bf260b8c458ec1f4bf8a2a8793e99e73be60a4a57f8291d4726c9672d4a4c03f86620a1cf8afc847b50a739d21d98eb5656909191ef94facfc98d93e01b453919373cb7aaa907addad02f9a01a6c309cb57cc9e1b1de58c4a7424d099aebd677318a80d889b61d80e4244e8093608be6e5a02b82806d92f6e64faa24e7b7cee5d2d438d1db354cede56862f57500e45ac9b4c25298012e5c7d2a7e19a8c0b1f0cf93f3c4877647601892a85bd60593677eb566c09a8e2e84c26abf63cd0ada61017c064a59135a21374dffbc15dd592e3c3409a3c9483ae81390a7eabf9572f5b7470001957785d4616c63e09bc1fda55eb5e30d74812af47fd3ec282bd72df1f2541194eb76960705cb821d411306ba5044cfe88a29cac21db911816826373cb9b20f98d0a063d70d7148760fb695a95b9a3e0aff894ac09c928e7ead2ee804e0c82251c61233ac52f4274671802e2d45bdab272c1403e90743e467d0f23508402cb2db74b752978b775a82481fa9159bbbc7150b63fc4351c89328360b4801baa8f81e47c017bf9532f5c37757a67d759fd3db406e8058d3c5fba71b584c69cdf06092e29c4f9e391047d223942057eceaebbca7620a995412cbb851746b4d268c6a5e95552863f2b733b4e93d08ba4664dd46ade102b079176662bc6ef0c8cd6e67a37ad454deed68d312a45e854b765cd1a5b2e7c71bb309c0eae6dd25ce25be95b285fc7975d87d580c21d5f8659a1177cef3510c7da9aefba748b286bc4b6b4b8cb59c20b5f752650472b0a3324926fe131bcba1b71e45b058ec6ed17c99aa0fc5ff532996b5cf0f98be3872eb43bb7157eff535b1b3c00be45b274164ba62dcde9335fbbbaf883e8a9b808520be9320becd69a01ca80175c38b8cd1fdc57715dcd4ec8e611ccf778d8e8a541a4639d4ca7b3fc5a991414e6c9397bbe04c2b23aa1b2fdb7811528d1488658d021a1d694998f52f83ffe3fd2ae12bdd90fa52eb544eecfc27a781e05f5ae38730dc499beb38a268a193034fcda509868def3c66de38dc2433e428ac87b1f21637f2f50a63b1dd98fba38c2e21a1292a343e61d4d4b57887fdadd0135a04b807dfdaec449068774b44373f298ad91a5aa2eac260eba422bf9b9b2017b3bb9f0224209724d376cfbbb52926d09ae1b7584e385e5b64037cc09b034a92961b17e56a53e366805ea535ef53f61a462a7335256a1e3dd06c96409103aa134885d60ca9371e11f60669162452da77ef19033efd167c5b8c4a6e94a548c442d603df9c51e946e446e9cbfe30599db5f69729913c1ec966795a39cb28287ee3a08983df6c986b32142dc85562291f2d2ac092aff3152e2fe273609cba05518e13155a107a89a10bf9d9ce4cc5be6ff916fcbe775f64601dbcce61b746361d0abcbf6d26d0f0970fb79c9236ba8870a200e1c41d4888bfa5a8260d3dbe1d734a0bc2f009ef4efed04f291df76fc2df829edc32958f1ac5f910c7109372750712cba5f8baea640a54562c139cedf7e31d4543a7abe5a6a8d1d45d4fa165304df7e05213b2cd05a0a4c94e52d1222aef57bc7c0c7f116f7ed964e4330d3dbb05771a0ca66fe1cb03c9320787c5b3f5869a8af9d4c085eae4725e4a31d22087bc3c1db51822051c3155e2265af15bb9738919680d14267d699890239f90712412fe388b70e44f5fa0955a0e7a20d31077a10e3f2764caebe7cc38a63527f44cbc171e9620e687cd7fd5bedfdc97fc4b3e93b18cf0dd304d73210a171e8f18b897c1df61ff838fc504b484b10bc09ff33eacfc94085151033939d1d5bd02b60bb1a75a71f35ebcd13283e3064dcd48dac5d1772b98677fe03483c0672708b2760af908de9f756babd3281b7a27a31a2f1e672f8da63791c7f07466ee5f973f4802706f3ad3b83363f942eb8f0ce882ff06f8d256523528ded37a6d430f2c26fbe5b8c0a8050a48c565b42220deedce62fba85caf91b9fd1bacff29a5fb3978daf6996a291e09d38e6fee57021f10aaa0666d686ff202ae4ffc25aad3f754767dd5163c18bc1ad4574487e451ad75bdc0d3d8b115326ca6d8fbe903ed6656ea54aeb477d457029dc0e2e5522ed5ae57d5f150c2bb68d1f9a70f0b2c86724ab5aa36c67329abdbc34674a09ef16afd5a68b9506507c932df5512606602aacdf0b5fe0e59b9e8a192bc63806c4357fc271c57dcb7f80004af3f94cc5816cfad85d1e88d49df8486d63314d2f047c828a8298ad877cd056500b1dc0627c8c8b9abf5c10b05cc3cff67313a033aaa3d59b4678c53506836daefbebb2f7e28fad59820f33d255444b069285a3ca50be34e57621b73900b58cb971c248f705f6a3ebbe9078f063239d644b06997d942e8eff5951f78ee22e272217b2c6e1570d7f544b45b387ecd80ad02dfff59322325baa95504ca59561e094df1ddb5bd64acf58bfe38572f19c6740833c6e668ea3dbbc42a025a5add175f192e5f494cd22c14ef7c36d28ea12f5600fc1fab2a8fd02b20aafa3777f88f685642dbce3bf2df3dbcac5267a8d2bec629f3a3636017843fb74d132b6d866da74d6f8a4e9ecd8ad02046eea414f942c9e153a50cc2d0b1c4c22a15129bf6a33e33779b7a308ec4378bc3c6e43c50d18345145c0b3f64e9c73013e79d748d5b24f071008a680eeeae05cfbf0628fe6b669363625b29a8e9ee218bc016737bca6de71f30865fd869ade5a21f62bcdfe31898c93a222a55c955890c62f0231b792ee25f56a273a3571512347cc0f9b5260fee54958e5551ef817b3fbd48ff4b3ddb3ad9e8e2c5a1abb2bf7ce17140b38416e5509270422ad5f93f956fb4b301819c0d2b065ad67274d012314ead652cac9094309b3c11aa0d5ec5ce10c2e8629812e6131d85eeb8ffd7e89449f137724bee7b5bfe288928ff38a71c792db2533d6e28b73b26bee2012d6aefb6ccfc2a835e1d05aa44fa82623b53435c23d26f67845467e1b05bf2f74113ca1ae949dd75294a7ec338ef967d1380c04691b5da00f4b868783f17e6a3aa5074bb70bff7fdd51e13ea988734f06f8a239489c27f03ffe57378ba76d3e55f345ddd40a33dc0ca97cec8e76fd8d3b7c76a826212e41e46b810d25261737c5756d2871ee0c24ead7d8633b95c2cb26cbf4447b7c16cebed25895a234dd7d3bc881faccac5b24aa5eb8dd3f8fc7ff18610df2f0bd3656fcc3489a8f8754e4631dd21c37ab6bfbed15530e1eb8af5ed09f929e57f09285e016d1cdd202bf96e83e45c1d33fc2e62d48ea04e3289b5b91ea731ffee83fadea22cbaf5eca16c5cde5a869332479a38e3146bb0f00dbcc02a2a5f026a7e6116af0d888898172950effadef8db1d2ef15aeed4af6cd1968d015aed59fb2ac8033e391dafbc08cb9eb2df2702ffca9a4ad511fbbc52eadded11f31f910df57c1ec0ed0c4fa8dceedb90d4a06bae9c9bb37d0b044a1acaaf6744d207d3a4b0a658ee41efab13fa098da5156455d6e7da3d676c3e0e9cc8fac75940339b2c5405088c242dc5b7987a8412854d7a77131e492085569f0e10938ad90b63b490b68097b298d01b7b17e72203aadf2eb2a68a436a35fcaab108e60d822024cea2274a01ee352f1f6bc4884df7ca1131cec03d801d7cfbd0695678843b57bd3694b2882ca9428ad0cf8d43c5d295726e1975c5f15bbc7deb94dad845a19efc7c692a0c079bc89171806b5e731e31d5341944759b73c2e836a064f7587c2794ddad7465b9f56516d61e261c7277d1e23abd72307be40b3802344712b2ae600cf2bd2a10caf4a14660094213905b5043d5ed3010813c34baa48de0fee2f959ec2a5b605329cf0c213ed5b0e1f7a9425172080c77ba2d642affa6fe934e0167098b135f14c4c1e057f20e2257e258fb7c99bff034354693391d0fefe184ccc514a6efd958e7e6758809525c0a862f8f1954df4a024de0003613a736099db9bb2fb0b6713f09f26a2f593d8722b05d544092a64d86ab27396195df97024434c37b5d57b6c34d98d77a844129d53250f25808c52112a8c024105563fb5a74001f3ce2df27f445c4e3aac4dd5f60b495a3985dd4c6d78572fc20c1f99455bab9a7e810f53b41b33dd0ce11d819c6144448bc959a2a67bf3e2467ad4714e8c55cc9053742d00ac7c7a1aeb0a88329e0282246f8f7bb4a36b6ecddba712657ad37e7cc85c42efaa9ac8277289bbcae9ebf5543ffe56f598767aa112ababfc601434b6a1d58b062c8dd44c450b793f798fc69eee4190c6d3364d922213368103e95209774a08e4fd015821c9fe4c55fce0ce38dca56374c2a8a3c9d1b7607e89c439f0de2e90eefbd53f682ccb16263998cc1b276c02bf13a0ae79dce99156854e0813550419b39e83fbb2f0f38bd63a4d2e848da5b5e73dc0c8e65704f0fa6bc3b54cf80fa281ccd7620839127a0e2180197d81da3f0a2a7186d2506e0d844ac2a2e65f7570d0b373c7a27a92a5c73d45c30ed8656918c064ee35efbd199bec105b869121d89cdbe8a54a748473ad88749f0b2c2db6dd4a7bb131c9b23861bfdc9e172398b1c658662a989d9fd4b7f4f2924dca3770c3785a76b2c2c0ec3bc603e737ec2ed1bd72002d93308131bf44d5bbebcf28a2f9230866f826939fe4ebb89eac232ea7c098189f4d06b98eaba21bcd755b9e1ee03daab86a88c491fada3f4d82927d19b10e079dd38789c2d1025564d3036b6621a09d404c9bc63637e027c15b61c03988b87c8bc352562c18402b23d46f51c0c0c523597041309acf87ffbffaa139e182ff8cb1d8f1665d050372ca643d1b79d5035b65b12c073809af3b9f3cc84fa9593998508888340e21d10fb4abba6d5398ff895582024b71dd6ad4437cd013f2ad5670ab89a2fc1812990c4922266f69adab95394831e3ae23c8f25ba6107c83df5c40dbb99dc8a556a3d9bc18d5ed2d3dbbb2d68487edc3d1f81e48059f2cde1f30c671809a2fcf38275ad1836900e742461ec4694ec93546d089fa7a1e5024e36c5345ffdf4370a89f9c569da93f9d04a73f36e9d779dcd41288c1302954067b6573be74bc89a08588a06cd1b2a8de039bd0eb9ab906f1585ae7198c87b1eda80d940b2c732ccea37caf57675b851041f97b28206f9f3e88114593d4441210233aeee08f9ceefbc8b4bf345335466b15d7a71b1d49f7552223cbb4cee2a9f4664b77288919eb40b1602bee4a121c91ba4d03cfe58c9d32d32a0e5cfa1b9eb4a9d1db5f624700bc1275c7787d6bd75e15a1b82542e31d90b9a68cb468d7b461f7240d66116895bcbd62b43bba98533d798fcdf89a1ba1b6f2e4c72400959e468957450955648d985747be1d4c9001c2c76154c98ffa2e24eb1fc35cb4029201532f8321ea8fcf6bd6dfc4b78b4014c0defc667e9a6999eb664d0a6ed64473870e133dfb691ec5235999fbe704e495447f8af2be38631164ee990693f82bf4003201a7a1230afabd5ebdd8d3178dda7c3f45b7f0eda3a3eb13c5d4751a6a4fdb88fc953779ac87dcff26a011c47ef0d5ddfbc5abdd4bcfd593b37b198ad75ef9e56e60506e4e416c4b493a05494fe16caa69cd631c7bae5b069b1c75aeaa532825ea3792ad0550e7d3127e26cc3551f8bf5c9e91cf811879fda7cc0b6c1b799d2014a3a1a7d4f79c7d37de9740c6e5517669e8877454bf6f9893355d35acdc0c8bef5fc91d3f49eac43f75805b8fba8d7e2c6d80e2131b3da758e31d44dd3e6bb12c99a4a66bb7c2b7ed51e57bb1c7ff4cc624ef8d4dd075fb07e0112e31adb5b43e7e55940bd6d4871fd342755992d036e99e590608d331c745c74a5a1c899b987e5012c44b684da046b10ca7e4ccde6184c914d135797c65b37fc8b7ecd5b60be9faca9b2e74b98bcb8bb999433135303de60cbf32910c9cb609c1dbacd4f7f6df7d993c4d68791c1b9c5bab1623a05918163e43477957deff96b38fc1e0f9a140c4dad51c3346dc3253036d4e38cb227c2219e6df87f8a1586a9d1e10e2ac0764243e0ab0893833d6999a7cb730db5ba62deb3b198463694400e65dc4d4351aa14409ed9e801c7c48582c0a72b8758240b03b99bb6fc928d6fec37442aee0f8cb4278e0aef0e0a6efa3bebc48e6a61375ca69a8bd08cac502bdb54d02fa8549104f8cdfd0731285e0fd067f22239870e1d3b483689a99b2857c1c01147517b3c683d3139da69321c84441c2cbe2546ad6fe40ed8efa350416ee73f82206eafd103eb7c240cf98741592feafdc42ae12f0e706b41929edcc5bcea91da7e998e8238d3b5d287d8a19a09657ba9b16f6345136f118d3778c39d6003f46a1e506d8dac42425d851584a71e285e73103d53ddc9d4ce65e1d4717a1258979229237f31e253b6bb7429aed7050bee5b917df5c611cf0d83e322c8f3041b4c6174aa779d60b9317f99b5783301f68608407674b8898abf7e8bd1225a8d52c3d38699ea1ea217a5b46fae8d7ad4959b90bff002240d540b075a278eb31dffb60df82e97f66b8d8fd34c8f5698e61c05f9e4fcd509ce2c22c926afcc610291b08a7a74ddf0024ab1f658717a664447b55eda4ac2e8329294ffafacd183b03ce11286c33708632a4a89316f8486f0853a42eefef55e7fc2b6f610f565c6e107175e51f5f850269c3d0a13f81b2ce7f5fb3b61301cd51d2da1ae3e8efc53a91e7f5bd0a4c7a07024fa973fe1a18e1718caf34cbb85e3fdf2f140f06b514a65f9922729552d63583abb9c6ba474d6cb31cfa7840789faa9a78d4afb270228a8aaa715b268bce8847646ed9b8e5191b785e72d1fed728781b0a1acf1da188efb9a7055fdb384b6e74763d49e7c622d51220940a9ad083c540068173b48aee6968d7cef1f5b138b2dfcafc413e959af763e4a63b1a103052bf63d4fb19cbb3cda7c1e1ff1aa49f6e8a04ffeac39e31cae2a59cbb969c7a4a60111d14b4b80bdd19adee71169759589d31aa2d4d6ba3f55a92022daf39a8d4cec17f3a71bdf4b61527c23ee4a8709520a60a273796a5f3a2e978175bc8d9c68470a145c3ae5c6c4e9b90755bc16cdab56124487ceec0868afc6879c25602cfcab7ae7ca5865711903d5f714e2e7ee19f928d129a916b0b4d3a0ec80abd8ce6ae213305bc658ab7b9e6ec497efdc5488a84322137440e82aa3ea11ea2eb26b7751dba315388525583ab96a5247a8c48998fbbf424fd7ab001543d98cf5624ba56258549ce5292699c4f018f206fc1abdac810b348e3948892a8c8e7aed5bbeb84fa73a3e5c0ec0d745e348307cd44c83831e5f07d2ba37290cf927e6dda126c28e01d414e3f65dd8f119903b06557791c5ee05ed415ca929df956f34da2f972b7322819cd676b0e3a4eccec3d9fa80fedaa28e9bacb54447f074c567872addf3d7cf6d3f99293323cad65e351c2fb8583ce500f53ab67baa0c40e252df86f1362c982e837f484e8d94a89f9d15fe060784f5cfb2925b876aa31890745c03b78d7e1b6ae6ff44ba146100bec56e688ba95cb1cc2918cd4f371a95237713460e1a5cbaea5c6cd3fc1620744aeaf4f4b5959649fa015ada805be419bd6c0a22c663e47f4b7183d74b8106c5df765790aa7c42142d43edfd1f10471b1c7e4cc444852f89b1c9daa7c20495a812a1f444422e77d3e57746d2ceba25e09a60292c3f1e628f475afc2e4e155d05184fd322c5ff1c7e0f52aac365f2cc636c7b317143b9c97eea6278216fcfa3b5c1d2999c089da6762465650d9169a1c7a387654e426c3bd1689ef2fc15245d41ef91ca3e2bfcd3caf8c283f614739dc3ae1cd59bd3d336247b619d89c9dee4686f45a1f4cd9e0e8bedcabfcf9f8268d5bb4fa584eb8ddb59261aa3bdd640c64cb25bd7e0eb5d812559ac364d8ff6a698c642be3c332fc2d5196a1f1a7a88b9eec8608c5ed69b2fdf313fb949b61254e7576dc0c1c10290457c5eac2d560392abdf341bfafba8ee9e4f886c5a81765f943ed6b22907b3540c5b85b640149fb68778443db917b34d0fd74602f6371f6e3c97a55a9ce3c686e8a1b7c5543a4bb18c4ed16871383554162c6ca95b4ca62f3ccca164fb6f107e9e26dd7a793ffb1947b2adb3dc9c00914ba2220cccb08d506643092078ea16e1a0a41bdfe2314feb560f26b459255d64adf761aa5b244f26515ff27d389bc549392f71a65b63beb2487a63ffae5ef9d797d6aef2c5ff91ebac477dc28c95d2fac5f972112f728ee7d2eddeaf0e6ff0eb0004eb2d1e15113236e279df66bf47973100861b0bf1363f645c035a76bc07f5f15a8fa8087c39fb49b83c0ac07f2187f3310652a29f37d9134cf5c5c8089a0c3c6df1a280cd44cf792ccc8c5c166962bd7a9a6709b203a35c3756838be66f638b5c8de5a441856f1fc16c0cb0d0cb03614e2db0fc7b35b242ec91cb05176178981bd5e87f1a28e321e1fd35ade0ac810e0c2598eb9d7bf9c32ae865355048f4fd3f32515bfd4565765787ce62b2bc29a78dbb0a950c7ecc2ebf40b13657ec3fc65a7995eba19be2386a1174a2e86b47de8ad85a2cbeb660efb90405b750a6da0da8727a96c1f333a01a5bba3437f3719bcf474faae3afc3b436046329f791338d8a664d9253c24f05c531bf64d19e38bb2ad2da3fe3d4b6bd91d89404ff90c21a1cdca5752dbbbb59cbbc8af203ff019430697d44f0c4cf2f25607e0d59d2102582416c5f77f78ce89f2df0d5123b050ee489abe1f948b84f4f974307464faaa199a2e7d8b4e066824ca6fe9eb76dd8cee82463fc2a48e7840cff562bd2f9ccafec66166be117ef196cb7d5b66775320aede9f25a3a3e6ce3b1a206e6a88a1aaee6690fd6b3de42ae6386e30d5ef8ac0e11a50e82c69846683d2a6c4110dc9de15360089a1a993f2a73b9dbc4f3e4b07dbd85613ebd69a32fdfe7abace89857c5ecd97926c3e62e79b91e2988195253ce18e2292bf4bba3cfb330bf7a47416a870cb2e499928268c9c3f1432a36cb4a972c83637040de27502dc689194fd5d4ac367bacddbfe390c65862fefe78284c7f5d4c34a2c3041ee4e272836a46f4379a57607302610303bc9d4d5a3c67fb5bbfda649bd242e561eb4c2c022d49b2de0af0dba504035c5dd70130aae5986ba1df24619a535bb1ad62867d45ec4918acdb963c3a9b2060d30678f8ef15faafc5f0e4073c9f8e71be41b3e51a29aeb0efc85eec5ebf2920ca34020f1db3c1c6534b5160f6383ee2917ed9bb2a9ddff0fd5cf5e140504b72ac83912cebd5db29df42efb6e569be385d4346dca2953c93125aa4787d596b0388146a11e7e1f1cb1f7181a28ad30c691e28dd55ee13fb08935a15f8464b61f7a90605379790714a480b1062e65b0eda04686bbaad10118a739c13e779b1b732edbc05fe2efd070976fa75e810189ca82df4dde091e7b8491e4e959d068e30ce90705dc340ba909d43e56011e961355fea7949990c8f43d49c659912969da646eea1e076c54b6f0a5c4fbb7df1d887cfda91339f2b75ce98e71f210989ff40b215930ede66bcc4ca8d5fc20b423145afddfa1c4ebf99ba58ea3d46cbe1c39142d0f011e020c4a92257c3dc3be1f95371886b8abf64660d36c4cfa6cc79ca6a3ea90753fe9a5b745f8b909b11dafa775454e929626177d1bca46dc70bb96481a122d4b911ba40deee4dd82b94105985b6a3ae7922c0b504b021d7f8f985ad935d23f94e9fecb1315e67109366f46765d22d520a2f460788b52bbd11d5536e1cafc49f290ba41bfd95d773364b64b4002530f1a6388c158888290a0b5e5cfac32fb6c645c1adc450c6d5f760bf7a68928ca6a33425027639b7abc5f5220f330e506592c382ad16ed26cca20c00fc38db71a5e1ad7302104fe73706b6ac059710d903a97fd71d38154fc4a000abdf575f836b85e97b8c9b4bda08350f094fa496732327be70e3339950c0b6f002acc8d00883d4a93a6993a3b4779036490a06859ba5285d1ecbb5854f243daeba71e69e87ff967b5f8fcf99a7d2bc135e55befab6967f9ed5597bcf547bbfe65719088185b10012e205f6a7dca60973dd2cae216b681d3a8d967503dca90b97e72302b68b3eb568c4906bcf4ed721aee70cf8e432527556b22879eede3da3842272d9e666a2c63dac08c6c12e3cfa554f358d370ab0b6fb8f4704a0a6a358e05228cdd0312771487df9d2857e5cb22f772607d400fc77080e54fcf6e33ebf595c1b9a22b232af8c18f42f46d2964afb9ab56f59c95280e7f6c83ebd7e3f655175cddf14c710944f82a39ce0b2c0330e12b6c0bc22a56df8a967e1ba7d87abfcfbb7d56aa0a77245ad9db48f30b607ec04dd693da51e7c3f05954bbd80a709c78022b884540ecac0aadeb6bd12456fa35f0c710f020066ac9106a8b60b3c75a63148b1ea48076d2bccd61ef97c01674216264c13ebc72ba1adbaa668210a4661f413b2afac78d8ecf893bdd237834e55f2f732bca9ca8904067112f2cd3de5f9f1a129d4b02d9e7d10ca499b613052d6a421f21d8a732ea952b21d0bd71b1dc0db0ad3cb87af05f51dd701d5dce7c88e701468e1c7c14edd8322b412a731584b96616cdeb3aa2f0d4b0f77da2e6630cf1f48d09b7e5875b3fada6d264661f1652e8f6718f28f7ac5cdccc31df2af7639e7ae9601274f1b11eaf1a3cc45514b4a7bd29c03408f835fce9369b1a6af6ba9fdeade7c02a73167d54050426c08c6c4c7da7d862ad941b7f080b923d1b0b6c4888d33500eec2e41195935e980ab86e18246bfece90405d5c0f3cb2d4a360d1521dfdfad90ae047f7c407e064090a17c1025ccca5de789ba3fe18f01f8731e51e67c874b900c99f2f792f204d8b0f9c18451537eeb10acdaeeb24bef76ad890ee2a528c5971d8c3c367431f7fac8d83d8fd5a0c8343d1a9d8faa30749cdd26fb0ff493f63af7258a5db2e6b965bd7df6538dbb1d84b7bcc33f6556fff5bf8ead28b55194c39e49551c1d4db7447678287272ce50e525544a4695b78ab6d8a16723602e7072674fad4d9bb9259a0d4e6d94003d34158fc39aa7d1603707fdb9c60469e67a1b651f44d911d097cdfd7dca74148c170c8d7db6f0fbcab42a0eb2bfa72bf7d1bfdefb9f3c87f1e1fea79feb44018977e0cd367c6197700f8169a386bb064d026a46e334b2cc9810ecbc72c9fb01a93082fbb00a7b417fe18d562a4a14890cfd93107fe8d0931f9e531eb2663e7db793a2c35bb24be51075787df884ca52df0e881cf5dc9d32ff0ceb9f05f97158e2737836b689e18a9a61512f95c3363e7344c48e50ff766c06c40bc36799ee95bbf1a8d6851452a71fc4001dba765742d324a01d350aacfc48726a4184393921070996999460d54afd98f3f06722d73a9c86d4b30162cfeb8c0591b13bb635e1db0db9bf70fb34b468cd3445548f7adb31de45a01e8d1e04e4719fa923de48948cb1c53ad45c1d6cfc22f20033ce465543c378f37c7801e2f87cb2c36b7dfcb30d2627d5ca351b4516ea4278c2c495c7429d52f20c5c82bf3abc0d962b9730b9633cc5fce947855c34a0091df563bc45fc6ba0f9d3b837af897c82189bb2188191f2933a41133621fff0f383cac8be4dfd30b6fe67c288ee2394c03aa717b3d6f656b81fab040251386f5be7f09116471101fbce1279ff13d0d7652d230ed83bfaef9c6bbad2dc07d0e3e8cf9d606ccd50ed9b77934d486adb6f9cf9969db079f780db15b2b785e183a4b4c685d5327fc7452d798e3cb3669f5e67f1a355097389e8568e8a6d0e8abc1e9abaa1063166bd8c9b32cc5ee001611e4a6b3d6661cf5e257cb4706c1d1b4a8a305aaff23b739e30b4cb914875776ad083fb15c3f1db2c942175c218b42959e60300da644dd67990cdb30d0d9f5533a1008b9f0335d08647ceac630eb1b933a1bbf8b4c35d74b745e5dc0cb4f96a8649b02759d255160d09ff656eccfcf94db4e440df3ef8c84b5a445aa462c9c46621048d3fa89f25871a3ce21de4e2682ee8e35ba883854260c3a60c10263713767e3f9a8d959af4efc8f77a5bb5a31bd0a9dc85ef96e41d33d77494a63380f1a49e420889846828d72d88114de164f054605065bf33be5078bca4d4490b0e04d081de76fc1ab5160e9daa4e76a033323b2a1ba44fe44ca58a930a0b5a8455bbafa79a6228180ff970da1e0cc2420db0d60d0a01242c57c9236629ee5bca42df9df07e8f5d8637dc6ed70921639aafa0443638a2ddb9f7e56e1f5066f1974af8ce41e4b4343fe075cd5ebfee422649512a360be5af690ed15252ea8263a75f2ade4eadfcafe97244d2d78896c77f01c880b1882994eeadb2615685187ec17531ec457576a2cd57054c9833f25e96875511dd8cf9f5dab4131ffff58f66c173e22ff8c70a8108407641ef2500bcdb8c7cc8d12716d838041989ffc28a5d7e79a0c47ce99a16e3ce8d2f91d4b77d9dbaec8e96f01874f79991f36fcd685a8c0a4bc39d49037dc6ba8a871458be13fa1854853e50c1ca95028c79c9f8ddca8b6707d3df9c6863e1e00b3c996e12317d22fdb6ec3c1dcb91af579b7f5b00956ffaa03367837d9b11fd8a3c79866da38792c39db16317553ef367e26c2231f7ec2e2ebb201a98d47ecf26ffcda9c36e83d984d5d02f7a64a336dd335623440731ba24a55a9bd0ca7410837cafe1ac04ae1b7e7c65828a4687091ce756b7545b6f6bf8f0fbd9ac7f32b432b8b645e2e16b674783ec159ab3e3d1c8d763cbc9b0be6cb93786102aa8333dba89569b3b4271bf5bc2fc909457840ff54156f68105c3b8e3bffdd894cbc8e72793796c2ad78e0514121c8275cc63a749e89f432bebe13be3d70d3dd87cbe13f0ae85a117023b4df9a207ce52aeb3e2c6fee4f6b285653914a243d6a05ef14d95fa605a3d77ac67ab9d187b3b0c83a84e0c15b15f82b652fb2c1ac142968d01d52c8e2531d397583715c67d7d7aca7e4576a7cc72468640502d16f1dde7c2fc508b00e2ccf0c03af899f223fcfe7ee753a6eec040dcb41e1f57dc17b3ca61f8b470af312e88424703c1dc0674cbb8e005a37d8b063a99d75da9c58493c3d8fd24921c7a5841d834422fd9ab189de9bf03e2af1c1ff30b4e1320cf6a840c116d2995c1fe125841aa70afa0c99d23a45970d79b12c4010359c69689c470c38b9e9fda94f5da657d8ff1b3593586b71280464de13fcd371a4f812346358e9402d0bdb3ad451e1a798c3d41ddea7674f1141f8830f76e67bbc7859413e191ffe3461c8c0b902ec48044f472545c2364f1fe4f8ad1400fe90c52da5ad6c015d5c3a99630aa3140254f9d75efe487691b1673b780fe5ddf06d197008e3ffdad2f7f25f375520367eed959866362198398838302dce6e810296d99ecf8d92f844c9c2e622aa574c2aa0f9b6544abcc2c0eed196bf10e61aff63f34b3b73871b550c49f60c5f5fb4bdd3fff9e8bcb9bba0849928bab05d5e73f4398d66eed335c759dd9ac18f65672a01a15b9790a40b3e0cb54df68d3a4e1e593a0ac06515ca53cae87284d8aded37ba74222182f8731adcde108283ffce1c9fefd41dd8c5522773702ed5f274e29c85815081701f5c39bafa59ccf06a6c2ecd21cfee2180f6104073f3918cd95d948270a9adee79cbf48d8235445da283e7a41b967efbd937aadaa0b5a4cea82a5d92302c55fbc9db8ffb09f2cb1eb6eb244c28815784af0acc88255eb3e8046cc3a329c9f93188ab2d77e77bd06df0eacc668a2ad84ec4b7753c80629572cb5957a83d14af1fe82ef441f528fc04993f44ea43069b4c9c76636e20cc5b7bcfcf0111d8834cf0c85ac67a53019d4add53fd2f54c2c1b7bb9de39c93d6fb060c6d5fd1cf56df6a3de8aa6a292dabbab2c9527a4d41bbe916041c7dd334fa1ca263e3deede2ffa769e4ce80f414f91ec3d8b0ddac626f398313c7d9b8775281e7db6baa13e74613d0c723d0b805be506ea24bcd895aa84ec5a124889566a19d12b21629f3891370215f803a499730fad236203dbbd79e1f3691b61aea98f891b96bacb0d62b3626d178080d6e5aa3092ca7db75ec4f870be93c6abb6748fd2dd4f815af879f44cbc2be7c8bb7d4ad30325adc4b90279c3c37a0356cccb7626156436b707f8b3fe49a173a3dd8e546a291b9a5c95996a80cecf046bcd84357d3ff7ddc82be27b78456afcd9384712abb5e8f5e6089dda92287391572754fb8d5dd708904b1a2289aaef1a5710cade09b1319c1eaae79f3c03de46ac6a688358cca87982381aaebb3cf590b7eab580c3a07b0edf80956303d53bb95482b4826d51eda30739f8b1adfaeb2cee38d4ba311d13c6ffeab54bcb0c3408f6f14e56ef575af5872b776cdeed5618de51212f277eeefbebfab33f5162d6e376ec8f0ed101a449939ffed192e51bd0e012a41db7ef3109e244dd90691ade2f824bc67843cba09da1c61e0ebccdf6b3e911fbfba85c19aa2839e9417cfc17498578a788272b80cf6e0865199f35263099b214cd34ff588b6ecbf93240524b0702d25c7b45a2c970f6a9ac172d2686ba49e6ba3602273bc1846e787ef5da0ada3e9ab250afac8ce35109c47af33fede0f93f3cd5a54f06b5ba7d0caf462f19f36b0605f36d2735a734ffefb57407e17ee30bffb8240d3b466833cf993636ac05f174cd9a130b97e821f83b8026c2837461104f48ae1207f0853b35601ac701f68afa6d9013b37106e7bc403a5b1033aebeda2baa378f72af6bdf3d599104f1e6252d524222e5c80de42b869ea8b102cdca44b3d864782a10515de6da874c07fae4e8224819a11675e42e840d27a0481ff05d6ba2c11bd3620547157faa6ddc7bd47f2676ae4bba894e2e97c282d0ea55f44a8f7e344ba17e4c5d70118698451a22433c053924913dbee632800bc4831fb700eb9094ebf05dd643e97869b11434d7e38bf743b2ac10b4a465b5a00178b9cf1e71a30970b263ec95fb18933e3504113ceb89f9054d3efec98cd93a99d1b4cc03e86898a53d5e1728cba388cd260bac08713835fdb3dcb6e0cf1988b9428a2c84e7db0cf192ce1b6b3e0418e586f8b7279764e757a903d1725f265fdfef35b6f87e7930f3c33ecc98e01b6577785fc93035dcc10dde40a9d183d87b2b5984a76f0159bce616f6e82e5e6ceed309c6c0ae68a5e454fa6c0df92f41c451fe78523fe0cf3210a705f337a539232c8ef4d35da076f13ca82c8f804579971ed769b195d00f9130d3500e4e9c3f9cd436f82b048ff0c5f02ce8e4729073ccbc752ab5a1548b0b795868e3f66be7d625cb71a91ba91540752096c3f44a3fe81926a4a82fa4a1524aa6ccdb9b12120d81d92b913ffbf8b71b95cfcbb7e6ccdacc3f29f7fb3c539b53e2749b8a9dad42c25b8d28ff4f0bfb4a588e654b2fbaaa85485ff7b4a90eaaeed1d44a07fb5df7514f5d57db6e18a4316b8b80420f4e2053d8420eac61c844375b346b8788e62f4152b60cfaf68e2ea6bbbdbb7f5b9bf4bd150d6875e485a34fe01501805ccaddee65902dee50524ec7f006e458a0269648dcef662970189d42d63351aff38f3bd6fbb37234acf09a86ecc2042a720cd53b2f88f2b96316f95e3e854677c876f3e3713816ac4302373645297ad7bef161c5a847d124014520b3f75fb6d9e9adf0485c35205e441013fd1afac2fd8d00662081790f45af2730c2934131ce38a5905e05540be281ebd201ff5d9e1a84d61facfa6ab3134750b7942f88c6451f1afe5990ea0ef554adc60cd53d2645c3dbc0328fd58d6d6e0e38472c48d853cf200b21d2df30b211d6c52f60ca7502993aa26b7b82b139e50425cfade389345022f4a5a3c1f7d172c3d1287be1e539b24c94a7a8afb7ac7f6576faf9dcdfefe65fa335e41bd041ee787e8bda1011a45d29afa47d6ba31aaabf23275eedabb3b9311088cdda126ad93d8d92639680ca36ea359c7230a5d09456cac052eb2a5151396ed21a129779e654597ddc3253b768c77bc3b7e63acbcaf5192b868c52378c8167814653c5b2d2e1d79373d56c8c85291198c98be1414c24d27aad4f78b923c033139e7c9c8e458a02968985dd0cdb4a2913285b2cf91579d95b6c7ecb9481dfdaa40948fa24ba1c2f36b9833062107e3953ce4f64807e0455226d84e6e834dd1a7b794be6058895b22f7d417c7762fa48fc0777bd24789538934f014dd9c9e53f766a0ce9e36773ae4a8117e3b75deb4b4e4218e6b41f0ea3aa5996bca492561e3d65b4e05778dd5b82ac47e5a97115edda3d57c8e8445cb6fe8c339051f00ad8a474d0631b9a8a6021fa32b89299a5d97901acec523d248d2b8f4837496b5e57348d8cea3425580cc3b5f94bbb81cced464aac7ed238787db8117a443b82cddb2f31b822184de3ecfecca5861eabc5c05d70da45249fe57a15a797e1f9af447cbb4c3e4c0ebd7637a734b9c2268901b0955486c1263577e68af2f4217a7fad770678dd4a1f97c321366727289c29d89ebe8f2f66498d074cdd067e5146898af0f4ea05c59e45323866d5533c42fe0f35d45ef6a07234eef70af1285551f657bc889d7ed56f4a5b7884398bc8b16660836073a646bdc3b88262777d72439bb8c19a886909f17d993da29d021bf64d1c2bde11305a2824463e82e7748ce05d1ddf570f3813006e5694431e3af09155c2e6877c6ecb7ab598125e381dae79c76664d03bd86486f7f4f09afa44736333e254c1f7e41f9c73ea3898ea1259fd2f9435e3ff622ea698ca1f59e7e7f6dcde3d36aa76cc0fdc7d609da1868846debd7e77ca96f2d9db24cb239be49f195215932c51a4782730ff67997665d71c8a599350fdb5c23eafafc4c5dcb086ff095d879310043c633cf9393926ea6cdede92e0ff29a37bfbac23fe970c3671e167262ef0445ec2795b17e0bb718248c70b6abecd92a23ba77bfee81e3ebae442b9bff1cd6ed1d9e10b833d701f85650e11a895150a70d152156a146011c3c0b3fb6010238588822cb0080c7cb78cc08e357ffb713da9c0ba82f1ecd859f1a8f577c5b0b77fc57bbf3ac2def54398e8b256ba229f9f928236a4c2ed76846d7542bf1caba937aef3178ed873b596248f400d483d2ba434f69b550ff57ef8dcb29b56bcb4ac9bd6ea53d7181b01d4b36f4e74693e2835f50baf905589ad837fdfc533e1fe570017b65c73a3f45a5438c20192caab1a53a69fd3ef7c6e8a7202193f04f4d87c33af18f78ec8f3c6c6cf7beb9b02d92992569265c36441bbbf04ed1140f780a979402905b394425e9c412135f965682475c2cff07755500fd159c6f46f42ad156d853cba8c90bb2d9af8c7550ea9b5214e68726958cc88b4c926fd3b4b4ad00add045bc92daf9f6e75c5c3a453a575084fce74d2659dee5126539d6f45f4faf9083ae7d36dbae6807d83eed95cc55db48229afcc3c324a4fc5415f2534d0434265303590f1a8fa273c0f2b972ebda91ff144e0a615a059d2604383cea82c76e92e4d122d2e6e2c1d3ca9eca37798dc9254a786773381887863f9f7d84a21ffa1562e722bfd34a034aea0b0798e0880e50cc52e5312bd53e0dae3610d7336a72560794625b1ba8d3b9a5872ec33ceecee0427338cd4896c90800b8c083204dc77d0c8065eb08a09d820bfd6810ed38f52020e09c3218b6e8ff4f350e8d35b927bbf8102c060f4a21898ddc536ab7c2e6e8a282437f137bad29d079e8371fc454a1c13248635659378a3a57b1cd9a47bb51b3be792eb74c8b55323fb9763a70d1b8af6794074a3dbb644654d50fa35a64677344e98ddf6a4bdc24553c2b2edb1a40aabf18a6b6f86a1e8c6029d96142f800c1ab2c4b00e739bba2993208c6716f499dd7a8ec092de2db4256b06e761883db2d33119eeffd958a3aa09389b9d1ff229cb91a2afa05bdffffb712c32b7fe6a25a90e37c27fb32692585e2101ba68dd5fdd3774e36ba265cf0815a4978de2969766564de9f47122900e1e3307acc3cde9292f19f8b6807a998220c787927ed9c4a1184b6167cc632fe34683f52443ac2017991a4f79e8f0da9ac07af5637e36c0dd8da42a1a34aa1dc9951665a4f50f6df3d74aa4c42b05013ff2f6456fa5052db79a135f3c12769dbedcca51bff6fa33f94d08ceae680d39067563f66e7b5909bae45c03a8c8af5e7dd604ff95c979108e0480bdea3e0af45d25eb863148241ece93b1373ab2590832575b7d3134b1a1665461ea0f4e74b4baf7513bdf93efa88a6a25bc88207a8629fa8b7fb7e009d40e3e4d8c44ca14a562dad2dba3e8ad9431843cdcac6fb24ef5789456f28768688a065e60fc5f5cd977cea95964da1c9bb489cbbcecddf9c6a0764b8458fb75dd1ad2103c7662e75b87a06d0432377317d291adc27f855cab8a043a71e6e546551a3902af098f0e61fb52822276ea4cf3259b6cfb38350de87b8bb196a88399c09cd461170f6411ed1d052cec3567aded01d9eaff5dca049ffd97413742f9b840288bd4e27caa39d04d9f4a6c85941f23c6994e2556c565d1a2924938343449c30f435bfef7822a0230a25a25b19041dc7a0e8ef4d48d0d1e9a55d313bfbdaf1df76febdf0f4166ff4b7b043a0e4a2a325c78afdb160f4ba56dbe213c53ee4737146fc12bc89c15e8e24a570a45065682124f3bf0900a1b6352fe6b531a29e17f50df8e6850bb369c7c82fd045dd271abefeed7de6640ea634550faecb519a0dfd415bc3aad5f1f0a9b42c98fe625200303a13260d99a1de722eaa66b3f9455e8cdb121a39d3325c49d0657b59d77186c858037eacff12b4f68d6a95b4a655d1b7af8bce32d8ab3361709f7a89f4e7d304484b306e877072a7cabffe02165590a9b84fb85a97fc4907f653417e520f3c7caacef993773afd84f48ec86f6b0b9547b35a251f88676fe54497fe450eee34e6dfe9acf1967deda68fd34ec27ed8615b42e3256ea3f15235c311abb6d4187130a56ce5cb10cff031b07aa4e02a8624cad2327e05d42be8a9de7fcaef0fd13de8da0caa9c6f13336ced511619e8dd76e2d37c044201998d60701f14a09c43c2060e8c4bcd680f080e12b26e72c9975a8f5d57a409d46a590b34bfc42094cec8b428064cf514eab65449dbacfe94074a955f8cd99891a64e62c2d018c13d19ebc6b11d887359ddb3421b93f3f3433160665c23f3678fb1759f92b34ab1032c4bfe3c17e0e080e842d139d5bb3ebdafb2e1f705423d0ae3f1fcff4f9476559528d8bd5c8206c62dba6b30c3ccdaf8781ffffd5c1186607d6540a2860c33a285dc7a4cd26779310a18a7d4582dfa3703232a830ed11b9dd50b893a8b52025e18db5646a51c5ba9fe7d342873db8873ea5c641f4fb1eaf249ba257cb723fc40a6aeb7189fc65224317c3480b283495dd212f1be66605a52a65b92ab1bfd4477e916776f7a14a93b3516e6c39d6782099c7b19075f2f34cd0821cd3d7362a5bea05d7b0b47e3e4791099c5f5f9ef7da926abdee8a266d053845cf60f4be82265962d8453e260037771bb305434501f776eb5d7c7c34c8a91184e222b37786e655e2e5b0e1912b1cbf77ad658e246e0ae82160d6f188ef2ce163dd6ded3c52faf77dba2115c3f21e2abd2ff3e8e744232d4e4961f24010c0fc4245629d4f958c9b95ba7fbaa6ffc826dfae217d8a02f5f49d64d7edd7ef9ce7d8257f387b38b3907d58c2d6e563e5850ccb7846076c83f8eeac22a93e1a779306cfb39612d3001aa3141eb1b1dbb7a4be396adf8a792c600bd5fc1b0079329ba2628f4336be130931eb215258526a09440403d4a107abedd6f8f9ad1b8c6e9f1e48391891230b60747104cade3b6d7c62bd059fcf5986fa7047445d87e67725d2cee7b45a4f0113abcff4031a7c337255cb567f49c00b968a793e2c466851cd6337def1a261bb14c873d4d9d6a3829a3ac06d9de66994f3126a238b555f024cf25a5f29b3980c344208ea7036f97d700c676d5baa20b723d33abbf8bd4d73138a992c40367a7976240b908667cc86d15355621fe67bf5f3f49a53701ac65d86278d4911bc6de67cb92ba2ba56e2ef644063f0cfecf3223ea722a0835191c64869e9834166ab1b61f472175a8bfc05dbbde517a7f0b697b4763b074083d92869adb544fb0f466d3bc7cc14e37a96f2a936f6387e370c2ed259b0720a444212f18dcb83806fe067e0c42ab3f69436e4631c01a7f08a4c81d0a9191880cced006578dd1657aaff19bd176882b5ec27108eb7cbfe8bf848e68d87c0d6776694117ee25058658f80c693dda70b93da5eea33cb79bc14663defc55a1d78672710b4954c431143e77bee93834fbc58d12ff977a998f3244e0ef20bddf2a1bfe106b348cff8e3f3bc3228f03f2553d61d9dca3fafacb551b8ad1dd020be3283b0b34d074f0fe9892c507372c33247b4296717a987758ec8fddf831253158c975d6cae65b9b15a329ca8c362e4b563d6debcae2461cb81e87fad2fadc25030a444073cc2ef025d244e1989011c3288dbd80794c85c6356abd2750b8b6fdc14f0a49d0a3648a692ad2881453de3c96ff3bff81d116d37311819d6ef6bfab9ccdb73416814748d95f0f0b927ca423e43002c442f8e2636fc55032cc13d2a13fe247da73a1d3fd86c71d291fbbcededcafe9263ea98875aa94cbbbbeb8bcd60bef6752eb772cfff31de90b7b6ef5b07f2b4ee027a1cd1e90acd8b0c1081cc45da98e8210ebd874e2ecaedb351717d1c9951bc015ed4ab6c044bfac6df64f6c8d117c03124d760473820dd2594fd937c2256a56a48ee7ab9b5b58199f9ef73c1aba5cbd8cbce13463e8be460abf791953b59901f69aac66df82af789166a8956c65d765822c008774cd1d45955bb0de8a1096a22dc27f672fb27ba87165fece90b43eba77de4ad102887f688f0266af3679e4e61cc8adb93d4249cdf4225f51c54c31c226c63b89a877f8add03b01439f8275806086faa1df962c0e7b401a1c203250bb82867ee235f5758ab419b64570946e4e7b2fca28b3fd45dbecae0a1a48da5052f142f1ef1cd6a2f0c523d89f4c7661c79ca24833210280a0b1b2b2e70d29c0a33d1bd5ff2796ec33aef673379d5fcd6579e22670a57703bfb72f80195b3efe75eedd371bd292df8f2a34019575d9a7ebfd8d48dea586ec7395bffd8379a10d517e69ce5c30ac36c0d84e96c972bf5de5a9d518dda3caf2af35d3a337a06d2a87c17657c5d163b5f181f9c9889aaddb4548a826212615d277cc7dc0a7a4786480ac0ce25667fb6650b1c70ec318b39bcc64ebe3212bc5750a7bd5fdde72b438ad386092cbba2fbf505171041b1bea22d8e83dd03ad8dfd032d9cc04394abfcd566c1eab0286c8485bf7bc919e5b0f716a2aa813dc774613caa209fadd2df27c39d93c8c3f37ffe4f57cd5428063d4356bfa15a46cf9f237d1a779f4e8489b94173deb03db139409b499f64c454914bb5b9d9c64dd54bb523ce952d4312e4aa40751df7d66d1f5abf989dc8e8f51378b402315ba5ef0adcdc4d05e19a7205c58149fe19e0d30f678bc09922031d83226809212b0fa62b625bfd162fe5fcf7f2df9c901e227809b0f91878648f4bf2e6c290034ec41104bd32dc7a33fc73b8fd5761a2217d141e0ab9f40fa2c0b0d140a56971a86ede935715194cd172a1ddd506a2f3caab98d5aa9edef589f231efb9a459ead50f98d9fa380b6b0cf4d52e2462528071ef25777166ff7607a6918c3b30076b47d14a1d0e2ef054ed78a22d586fd9daa7c1123d3f967e4efeff555d64b009493d4e267cbba30265c8b6b0a4a15c6b9cf38e99bc3e15c82e0ff9abf0d1c8533eccb314f9b7ed9add0af3de7a9e6f2921a10e6d900d18b4889253ed2a64e7741599b854746fec4d255f7bbdca3892cad204c5ce2299af7337f67bc3c9f9b69f80647bd5321439ace902a68d609462e507db384320bd6b1be80075b543a6f1e62725379c0b79de7e08c33f075d088fdaa1aac15a05a8276ed3c309ae8bebd5e8552e4cfa19348c509f4be8fd32fc372c83762d99fd13171fe3beb2c0e8944ad92d64afde5b302dc8a96779f80dc3be9cba861dc56a5020f8f50c9362c33e21ee7bc566647aafccc7820f923d1c7fe1339d6037be250782c1e852e68d89c39f38513dfb6e75497e0fa3b6c0602d14cb14a0775cc721eae0417da7606a04229fe8a200457977f0b5ea2510b87ece6bcfa2a6585df899b6e2bf0c42898aa00aeb9af84a5b2a73665474e16cf70a6077ef8fbc4c0d84071bbb933218db3be38cff9da0738cda958eca5459b2c1b575d67bef5c749307ec4b8efa7af699888799818642260d0e679527066b133ed07fd5049e5544d16c5638e7ff38789922dad8834c05f24146bcd38e3195fb698a210a9ee1d107ef84c6712f86f3b4a58a0a77cfee79fc57785a125113330147743c8ef52b44ece7dd423e6e8b2bfdd12b5f34ce5cd35d97ff00e24cb08aa1b5c36ffea81572a479f3247ea22fb4e0db234f4f9152c48a4cc22c92b2464a6cdb836f65f1be0c0fbe14b5ca5ad7b116fa5320277a8bcfd7517b971c280de74274f746556464a4b11444a7aacda5e02ceafa2825c7c02244d8749bcd93f857f999aa4c6d024e75177389167e76745370c3751da523e24e75e228bfef69a2dd127dc6d92a8c967aa9e6b6adf8cca493f2f9409112f919aa5d17360002ba536b26a887b3cf644f75d2d2689cda00809a1ccce59af6efcacce40e194e0afb8b0e4bd022277321c3a25634c8fbb10f5b4a6710af7d2fed8fdb8b9d5893278c04c7b13319e52cd5ebf225ff65f8c6c4ee792effb004078ca5d4d571b545c237ef38df2912d234271be0bcaef5cadb635241199fdc9481d653e1510da1a8fb152edce4574a991f4672c60045e1ac35f1874067501d0ba7d6ef9dedca961011134a466bb3ca526a8d6b2e643c53d09af1b5b755f42d3fc2dedd88c95b5893b1aedcf12b115c8d0027f8fefb20df0a8051d6eeb9ff9f2f115a0f759b26f2f5c4220fa4bbe7cef74ba2a9bd9adbac90f08cbb34556a3cce0c5c6ee129f10eb7800c3a69de089f5368a3854d2c92db8f3aae94c4b96ed08382f17b1b9c77d8a8cc753a7e1f074ef24e7a5a931a5a5f62f93c9024530c0f6ba165d0ee3f77fd11d90e0a496f9506ea5852afabf3281567834f4db2b702d1529c56c371a4de6f880c7d62181d29cbecc373b5f8a767f9a5b92ca465b3e767c5ae779b17c84f98163768345a57dde70c8ea85b7a37793bf880a721de57bda81e5152bb66272b65a75a9cef64102829891bcecb8300bb92f71a586499f6871e5a8ed780761d4c2e51bfc941801bc5339f8f01f05fa4d407cd56a7f81c475bf59af97b9d12b37d56880f67e9cbdf8a11c55ba2954ea16515e5d545a4f56cf4c32db3d4214e875bffab32e4de6b38d431b3163e1ea77ebbac4fab3d5cad5c3711a42c5d7bb61d7d86ff6e92dda1c6f9dc0da1cd82712f4ab1f88c841097beea628f68f10d89ae80f2ef797daef23fccff499fcec3c5f06672070e480a25f5500749f37cd9a239af38ad06f6cb2a90216a42326c979e277d752552f641b8f3b9c278f8340bbf1d8171e33047fd8191cd9f489bf38b1763196558a04ab11236d87d0bebeb9183f064487d91e26f1b38a17a5dc85078dd008d059cc28eaa9480bcc09030b7e39491c814b215ceced77a04bebdfdada6e92719295dd958fa8727eee5262774b7e3ef4247c757a0f8acc8a56d15eb5539d714c3c52ed2551a96207a6e97480e5eeb623520b1ab86a4b577b4c2e841f70d3b58079ddeb853397fbb7d07965d025c979f8d95b185a999905468ccb65968c4abe928d104be6fb5863bd53342d705483e9885e1223cc8b8ca1227628653bcccbf1134e82682d061b340b7432864f81bea769e328e42ec3e0d961877a6b4c2980fe7abf23e6a0a2d238b8b4e39818bb8be05724f5de27b8ba88576eb82321821e4728227dbf88e98b9afd21c19662a94ae23cc7cfd5aca2b6228d16b6f832b85c54decc41f809b1c1b6a202cbb38c33defe25fba626362b9a126547c5a7c721e1fc969e9aa40e842a9b98885ad57a3fec1aaab1e03d07914d4d7d38f1b5433412a33c6758a1477dd9ea922e2b8d186b83cc8171968f0eba0b8ea06c8cd08344004994e390b3360a91867723c415d30bd2d47b8c541451bf8381e0836361eeaf9b59470b7b4cea930237184b84693c5064bf4b0f240223d95f2fe0915f4de0f73e08f4b5eb309cf0730ea84dfe5997c742387acce5e589fe465be04b21a9f519b55c585aee2f343776ae9e3102e3a57b73a10dbd77696a63b227fa58792fe5bd8c6b5036ec703782828cdf0c181eb59089020b26a7c536d94ed7050d6cb731695a310386a94f89903f3deadd301d4d172c6cff81ad263850b44837f08c773ccd2ae94fb1523a9689273caeb294fd9f74c79d0e4b73fe68c38179c7e0fa37f8c63ee6a9e677c20c926c738b3a1528c269b83865ecf190cb13dffc2ca6575f3488b2eadcad808fed14618e93ba90e8dea8f0b58cefec9185b9a13b373dd656679e3e4eca1cfc7bb51f7a3c8b7ca21d7882c20a20d02d1ce77c5cb4ea6219a11a3c9db08a563dbf8f717ca9b22f782ada9c4d947fafae3b6431dedf04b832e05f7d1d906e98c78bea2eb0a86c315fb9a616a80aa87d3a015d312478552ffc1393a6ec90db4f8cdb5d9dcff96f42854825189534e2398862a6be64eeda9d476bf65a5b16e6d0c80fed7c94418ae0ef045b46667d40dc2b8faa1503c19ca49d670dc7bfaf6203022be1763ae9ef5a2c6d1d7760ca5687112f2d1059e06d3a64619afb95cc370f5a44214a75334fe7599cda10fe89012baa685580e8d9593e0317856a509d2fce381dde14b34a7e0ef34deea7620fe26766d58f456acd88decf477b623e1a1c02d23cc1603f12034ab9ae06584edc7b2092a30cbf17391946c48ab0582815548bc40be3ba9775f778c31dc1cfb1b7b7424cfa707b2d8db877df4f15705a5c799cae5c9b8ad29b05aca86b204c9977a6f2631644d1235af5aa16ecccb89a68d9ff396be94ffe0d02332f0d130d8d3b2c99de3af5cc255ae00fde0efc90ec28d62ab10c632370d4f87dfab5f624be73651fd6a75075b36072faf5735a589ae3b1d9233bfa83f3a08f9ea917db659b6e756e6dd4ab950ec83fa8dc0c5b47e48ccee3226cf29ffe318c655b542dae53d70b56c30bb50ffd786da027382e06f59b878738a9166e390626267122ce79b08b3ca987d4a0a56ffd4720e11af0e6fc00ffe55f44cfb3aac3b115ed12c078c1165946d911b93a577a8a234c45a250cd40325a1e8c4b2103c063281c9d5f507900e373e6efdabdf0d179920d3f9a88edfbdaa155532367c3462c023ebe6abdf40fe1bc083589cd30f238b8dee15db7777a73c26f1c82efe7cd3505bad627bcb2afd9e93a28a0a37ebb48e9a0912f115c799ee1812bfe2edf102424ecf6638db3c6cc130cb2ddd3825ebb244cdb9dac554f7fc9390eb44e7106b9cced4e55c1e00dd2a4d96dc511445be64bb93e1a5fadaa6188e8bbdbe3d031d84bf4aca3615e05a8262f2a5522b782e71650a0258f7c12de9cde8af4dc7a2a15a16513409480ebf89d0821daa35be78c1084dceb4c2fd83c40eb51a460f3287baf8e72de41a00f630aead25e71bc9792158e088eb575749bd60c968da1051f9b1d17e19d33abab014f5d880de7b2889246d0d3b3af6d7d141e4425a822e404efa786f9d3432112df3dd06da21d6bf41ae1b6bbf3fd752f3dc6f99e60d8876b1f411c60a62176379f19087957484749327a3d3b490e893b1bd7cee411cf3ed905866499b70254df2d62aa082e5ffda7f93b87f4ecb83f7bd4aaf442ac2307aaa27cd91c8bc6a72abe10cfca058146506bb4501210a3d4e96b6eff17c136050f92b8f8dba04bba603893183e6b88498a124737746df7844364b2009040d414e60fb4b5159a5932d49eed6980778efcc5bf3ba98d7da1bfe572bfdd494c19f6966a6ef432e02c6f9ebee5b935c56ced69fba3e39cbd2015e8c26ff085aea0163ed9cdf5dd19aec41a9841cd63c2f3a4d4c34242b07df070f47d8a5ed0f68aa95d3f03789993e4c7395f46282cd204890fba4cbddd2c950c68da83a03a199b9c3426cf5fd025139a0ed1641524301477f030569bd0811a707faa7f3864d55a411a0b0a42b427563fa2156d2cad8c97b78d6f65dcb83c8a855e183cfebde01f6d557a2272edf118b58d947cec3f995ff085ccde0a0538a6f114573a42597fe22efd0448eff1eac39054e6bdfe10ffb632361956f43432adc20a5cbaa544336ca7e646a58356d3b695a61e1650c22271a71b128aac860f86d1d305f766be6c6a4b094313bfb9679b86bedbc5a5804389f935e7ed868b116af7598b3f5b8bb436d275ffab5d410e62e95f4f705b3dab5102bd3bf6e61ccef367d55eb31b3fdf83d08f949553a850a088a67cfcc47dc168bfe54d2d751f7b9f1554eb36a3ab7841ff13c5b038dbf19d9fb8561695438ea595c103c85a5221bca8289220f7bae8f8fa6ec142c5fd391a761d4f874ffc236c2171400a5f4031244e2cf26427b9e1e12e3fbbefc2f93b47cb77c05134f7a4ad278e83af6b917e0eaaad0980060d343566d7c8cacf78de110e19ab536fc478d69b2874aa36e6ae37c1a1d7ca8c90bc241eef1b2d2e8423c5f150c78c9a45d29a16f86f2e7422da0e7fb23bc17892abb12c30e47ccc47048f5ede4d47e003c96bb2717974c6e7262e1c1f6e64d1bc9f1d9de31148b210adf98f99b2aa1e4f76759e0f2f655209f769e002b604ba5fc7972f3857daf1a3608a8fc67325bb4e0f242792fcc580c91e3f06d9ec8ce7edfe71ecb4a0a3f01b5d172c745d1dcb424aa76fc475b41e074a330c40f0bc2a8200d9a0eefb60ad90610c14aa7d066293304980def333f79b87f0b2366003fdb95e50ae986e837b7facefdd273ae9bc0d1e8133191279ba9dc2f9b94d7a79605f748b7ae4133fbfd06d489c365558040cd2250d605c90ff5dd237e5c87021bce32752d7743f9244ed730d39c024d0daa47eba414f3c2d9b73d5efa1ef4d40771cc3926cecf74d1be9c387406ceb12964ab11a5b766d5a081f7862e7e52ed7bc6b88db23e405d01814c3be45d27b514487c7d85ab326b5c400e0e69c166481fc35ac3e34e4705ddda65ef646fed24b4e458e834d30475dedeca94f1efbe019251a726e65ca5f4dfd49e3af533ac7f53eb188b1adbe9653b286eb9f525bee2a0570c5f3a6608f24399efba61373ce9100fe3e44c869e64f7f0ac3f3a3fe93128f4a082989e9f29579aa1a1ed6492ddbd5a1591a3b011f8e9c47e361f76890e1ff058d28a31b403f88b2ca13e4d9cc3f33fe0e5fd1cb10596d0c1c1257baa3c5897bae140c4662e94f0995cc2a3d5dbea09fbc1249eca82f94ecd10d0daee0b4345de831a2dcbabd953a20df6f1bf0fc88e0f3c1b676479c6b20eaa9a75a4c64307b9c41efdb565784878e41b7f3523305ca05603d8e4dad2f7b897efc56124856ffad473e042057f4120f5b5d2042ff5f02ee674ad230cb3f8485a5cb6dd7be6e8b41051f001362cb7b1a6a16ef095a0a6f01aa6485b9c4546409c83c1f8230dffe3f4f69edc303218f7bf678e99cffac7f11cc56bbbb266ca810b1c62f6c53025905bc6aa531005cc4a1ec7b83b994620085086ae78065d5811907ea7458c27806733124431f89c0a37f742877fe2151fde21351f99303e2a109e0dc566ba57a59f9c358ad0bdea357e554fd4a55f825d80a27074d8a1cb77adce49e8460059b979711c6796163766c2369126c0093e706734ee6276c00e4a3dd9439c32a48db69a9c7e710347a592d8973f39c29959b9b497cba933fb550091e59f4741308fc2e4e28411e83b43872f82f1ac119b9d94a56559fc08e469ad6c012d1fc50f39598362be8aecfc5ed1459d5872bdeeae0f384be0d46c02de2539329657a633ca8938a2a97978eec8c6978c495f9becac9b4784e7694bb0cecbbcf08f1357363046d079879a976add9bbf89387698c6fa2a9ad5d2bf0998fcdbd7f17a7a9d417854f2b7603c19e612c7775431712ac8cafb188b0ff8296ecd5bce16325cf1aeef09f8df493ff5c49d77c78765630bbe6194c5a36396d2e9bd16aa7d6abac59210d21bfd57bbbf7d8aaaa8cf991375994b87d2ca04c54cef67105b31d7547252377fe2dbd7add751a1dc1fc9ae131ed77dd031d2f836f717ccf0b8ed8ffd939aefc48c9f253f4ec62ea08e475fade5e30b5719fcac19e98094d41ab27ad9c47dfd34747cde947078598737926b8ee7e180a72443449ba8a3b5c78bd740f7b2f3428e908e2eb01315dfcf346b9c2c5abd686aec96ec1a3170c1c201e2a2292c3940445dd9cd68197db33993ec415b73f658c32068d6fce1ad7b317202168ed0bb3586f891d044ced5b0110459bfa5c8712b13887989ae5b4e5144c5f127a4597459d78d72334edda1580c6fcb9904b03c30a847a68b496688134acd646feedef46119381de8bb9e3633e18a6667aa5241b2d2a3d5a87f559b76b6c69ca5c6cf3756fa1021fd26536cbba05798aec83f092eceb10c667059ac7f83eea3451536bd4707583fdbe7bf128072e3fc921d6c5e6ef6ec360ce51b3930d635319363d1ee0314df599b072a24d7a24be410e56406849367d0e1936458f23f49b94f08e9f9374016290ecbb3bc656ec6a089052096892e6a91b277bc505ead932b0f1a79f2d419f78d49400de9fc048efe97da4fd6c79e096b9b2d0caaed1d12a14feb1f55d58286caafcd8fafbb4e6affbb252f92ec2b1bff6a7c86aeb75a557c888a007829e8a419bc71994d187fab69898b58dbd3e4ae49f4443ce89499172e1518c1c39c44814550a8597903ade85398a24d216a3b63d2de2069bcc19128fc9867f95788c824389de3b984f8f9868e4b5549b1b1eb07758790f9d47483aaf90daf4fa5943894656f5ea2106a785e53d7654f46f42217179620f508ab4fa51b5d341126bd416b1bcd1ab9c526e15f2391cc5d4412685fb6b8cbdaca0ccf318fb6ebc22e11ace518a0d2e7c45eb03d20d412efbaa1aecb93620f76bdacbf638a0629b1b56b014adff9e29ccee6a749e9be80e88d88e17e0b800e8e4b4498727b14605d25c5e38fff24cb6ab655d58359824aba70b2fd8ba1b6a2f24224d010bbbdade30763705e9395aca1538a818198b88c68a0dc67700f1e641e9c401ea0023fc3c2467d19fac6b56ab2f703dd12225d98456ce00450d353846272a51aebc1ef8aa19bd28a0dbca2dc9b30d559db157a887df35c5df75e8c1595bffae0a73f2496341f9c38cfe3aa9c18ffb0275d3ec76d8972bb28c1f02b273acbe532bfd64e7db1018fe49847f7bc0ec944849dd101f46db1fdecec69575cfffef8760da03dadeb9cd8a385666cad1dcafe26f8ad8a8c9400440c6d5009c3537f73cee53b0c9608239a24b86b0099b36cae89c7bde54401f276ba6843a20ccc9f604f5ebc4f45b845a16dc05f4c5a2667f5340b3113bea0a04171ba43f075054ab2eaa10deb1d9f008d8a7ef6132fda425c776a643320cb78bbac6762089649a6b2cbe581196df7191ce87ef470b3e97695b0a6b6da6ee0d1f06769c31f28cf26db6c28f05c450c58466be93e56687811eab63c4a1b34940679e4577500943bf01ceea95703e70dde19ff30a0d76a19cb27947d3cde2bb7188d06d51c19e02b9d6f7765dbebeedcb0270c6f704040bf465c8e5f439e8416cc24f87871db03e97364c35df936f558e35d272f23cf6bf0003d9846accafa8052acbf474e5d52a3077ada7de0db761161d3244e81113c8114e01bbe7edcf75acc40637e9fce3910378de4d9d89022ebdd38cb1459c4ec6958b81f7d2e17aa0bf53c1e71c81e45962b0a755530dd1f78267004cf5bb78035ab09c70e8fad9fa9ae5db3a24bb35645aa127801fd8dc14031e3556bfcf6d50d3f3c677eea75dc34fa0c741d9cbd546314f3b8c11597023681cb12781ab241428548a6bf5032d30f43352799fa42972f2483b64952a4206ac7055beeb6b51417e54a265548d2179fb1c77a1796b6de54c1601c82b018bb191de3cf72e41ebdf8c7c2ad488ff7b4427b0f9bca5379b0f85c354e38c9b4c4f82bd3fdb2042d21787288b98c8a0b697368fb9b9b0a9625cd51da4355873a9d06aed06c5d0360c7b0b7257347702e84736b26a90312b8a90a4fe70b7c1a98ca60146b5b70a39dc3814b9ccaf6c1927436a7afa1ab1c97591236f421d35a384c2af0df367eeb21e2e64b2a672c8318280ba3791de84d88ced22bc706b66d3e7ffe8980c7cd0cd010f8291210c8e0418b4d6e394b56867a56ff52f70d3eab0e95173a9ec50127a0ae267638ada94e761518a737a4f51a625c0aff62b6f1a49359d6bf4d79bdb1e0f85fb000082f3e7871550de87cb91a2c0b6fec5d13a963b3926e6f3de51ebc5ef8b6b72511f5b03aa149d3f7bc39982d208750d9955e2072d90d9d2e34f655b3862051108c2285384fce7a95261ded11a336de9c36343536571b3930f89d1eea732abba6c247742fe177ea493511675c2c66544678801c6403813f31f9060dbb031a4b27516ac5fc680438997d49094a316f1a896802c954686558f31cd94bc29f7c5af72aa13bbb3ce1a486a47757c0d657139cc62abc4d97457ce7d5e06939832e83d0d665512b3c2f970aeededb706f601cba4d0ee313dd1f35a3da811121a978943c88a6dc6ad32cf496aab5742326576ba3e2c65b7aee4c1207c7cdaeec00136597d1a91c86d8b366140b2008388a2b42a0de1790edf3ac087e687d9bbd8c0fc16ee1bf08c662c3d77ca2bf998f926ce3afcfb2611a235c0ddce901d4ac101359cabbb59baf3b8dca93975d547eca8ada34c5b8e3a5402c6b2c7f5b8e91e4d2d590199c77da4091c1fb231d0d283e5b3737f02f6c3b034e318b57dfb3f8d168ebdba0bbfd9f43cebdb0d0626cdcaad16eb186d23ea150b2ab4d2b05b46149e67690ecd76240c499f262c36facf6c50b75d9436537048527809b481fd4d38ef017595eb67c6193be6eb96b9dc34da532517549ba82cb5daf8d921a0901b507ffe88f476c95bf97194e0d027bdd2ca4948cca981e433f30f98aa315a033c5d1df3ffe6798720e5a026f64890bc219643abe7d29c5f5835ff5a5eefa1edb5ae75ab87a1814e4a32b4e1a32a75bd49fa5c1d13c28ec7a5d15da481ed77a43b938195f8b20ca6e520aebccb225d7e1a28c6c07d5da8886b1e052fc5eb5d1244126cbe8115f58d03f5b3d1327a26d92eab3f85271f55a32674491c229d006aa326bf5be34e317869612b9e4ad67d5039c779bc376e7ec47e4855bf6cadd2ce499e2049ac426d2f845591eebc8487caeca203140df0bea8c04fd17221f601f1a46d1b6373d75fb593f95380498c03f1cae621230c7662e6fbd2d05955c2e5facc97b1bd0914209989e60d79568f6dec8185ea48c737f525a57794a77df8ccfde25b9ac1507d4a41a89beecd2ff5c7c89de426b74d66dc5fbbd2d479b21552bf871446079b567b922067492950690ffcf86d6ba8b47e800c84795e72a1b1d7f0017a943a207468165dc11e1280106a567acd257d24ee5cafbb4e32a5d19184838846a194c351cbca3e01e598803b1189824e43058fd94745851a4fc55bf784509cd0a480db6b273cfdcc45fd77f72b5dd3bdbc18c03a31dd656cc7dbe9648655c393d755213d9365f00a3cbee203916af3e51bb3a5e1ae53406b3152afabac9ea8289e3e3f8bcbae3a6d6dacf2d29690fbeec94975f48663311c546ba2bcc65f57c43e8c32eebb32dc19bb52c3fb33deeb198d3f28822a4b6507e3ca0890cf62dddaa3a9c426d2c256f8627de34d0ce2ba642390b1d251a680e4bf23d9276861162dcd40fe364eaff536343814ad3f29efb0b5fa1f1e149d7c32d7944e126899915557fcf2c7a84c936570f385d2bb07e232c321dea0c49c6a0cf68d127174c5c9b12a93c48c6380655de0bb1b27f29026862a5f10cf8ffa468b0ddb6e9aa4ad6bc626ffe4a341e8bbad867cb2887b96b1a792a14ab66d160cdbd9d26f74eea10827107c292d29ac37a98b3acf644a736cdfc1f84afd5f6c766d12629102870ebd43547c99b232ec887e4b85af190ede813ed43e3c7b6ec47a9342183bafbd39ef38bd71ba6384c6b3e615dc40090c7c8e2e9a12d9c667fc17c5d0b751aed97acb26cff4de90ddebe297ab794f1fc7cfffe578be2471e3efa18763462b6208f788551acf6ed92988b61576a5ac60e61610c81126827e5e7c2be3d2cf2f26ed3b917e67f63dd4bfc00c756d5d978dce8b489a878355cc054914764bb2d4db12c7539cd690c6abda10a2ff707ea02546db096a557e98ef1b5d11be22700e580b1335ee0467f050625082246eaf3a4d1b2a8a876071942a3b6f6db4c661c19b43112aa8d50ec6d0ff66348a1ba91a0a19bd5cf6823dcc668b3fedfdb8a86c8a49e1b58e853bf83be6020b0647ce4b234cb56f20a4b4bc1ec4d7da6ac5c3bf10c173486f2916920f249988801740c0125dd8ca7bc59371308e40c4e2257767f0f3fdff0d82affd287636264d915fa456a7e4c50d6ec61eb66d87996c881fc5b2a6f48181af7aee58de6b147427a529be7d4852a163a65c1bde2da1cee054b5c38614a3f3c9c8e1f33ac5e8562e500304a036b24f3b38b067487eeed953a3da81ed246e041f80c880dee41f95eba42766c52e3e0e781805900410beaeb3c4186443f843e33215ce6745d51d82df8a8843bbcc04b48ee3232f9b7526623224c9f6c1a3c436ef5e229536f72bdbc46ffe41e1c196f90ed47b16d70a88f31402e7d89836b4d7c787e24a4072c9ec3a9a717c23bc3fa816598a1105651ef5277a8a91f8768b96fd5a3767c3391d88a3a4fe4e60ec06274ea43e5730e0677ce76e7e493a8096dadc87c5f7fbc640bed12ab51b2de2a3983a5825a9b6a40444a0c48be0519356ae3277f7a501dda4997f537fc2137922d87ffa927f94171ceb5803de4f48834a500367d08ae3888633f822fad260ed8d307a3e950b78edff747c2b3774e00cd8e98ecab70954313cbc8071d29fa251dfee8d3eaf9a0e332303a54995be93b210344ebf264be8d22acdeb4851a20630ad35e5b9f91963560f6d1a56a4f59cbaa8ecff8988404ef1c4207834de7c6467076c113211dd44ccf1e03312e6b947bf8be0c01a1180e97b9f1d3efc91c71437664b25dfee8bdf2296eb582872abe16198a6cb973f610deb37c91f27d5ad52ffccfc5d5509a4731085f579f7e3392752cfeefd27f5c8631585b20bdabdfb91c7630a2b0cc0dfffee370d30531e3f3e7c66fc707c05be21ea8139c7fb3e69f2c2949c175947a24cdfe2e2193804a905dc51beeb9968a8884ccf046dbd1d644ad947b5bc87b5d183b30a5af3d4c609d4118c26fc0f99acc99d917c4c0372b671828c67934ebbbc9abe3f10e7e28d44c3e7f5b1748ed8ff710c98f4563a8d0c7e99ef0c84cbda289fef4ca0b05be43f131e61db355f508554a9b2f6735ff148cf9d8898a0678cff895d9dfd3e36561c5cc94e9228423f4a4fee78147fcd3a45b93fdd97e7fc86a9b1bcb379d524c414587731d7261e700e9722c14b7bdc410c0ef9f4a063c25a1c22afab9c4499151818f93b9ce8f0f5f7eb80667fd52a4b1e96d3fb1e6e27b767dd831a55de930a3ba84618770b43dbb67105e7e1156c34aa89807c89a474992fa3cd706c3d7a18c3965102fa5ad255b8c4e69562b0e9cc5e4b6e54db58cd13a8211c2a7ef1c33de690cfc76fa86164acd38845790609ef32fdaef1d73e139efb3438dd0be814d9fb9b658289039c7f49cb90a9a540e558dff456f37cf00285f3196a83dbbc3a7f8a2d31428c191a77903ef7655172b623a79a417fe1d722b15810902ce414433db1487108845e3a5e90322eca0fde6a0067a327da50b8d89e53825e8ccd3bd30f2ede190fb6bf7a584051d5f1138817edfdeb8b5cc7477f3e285b6f4f91f1a0f06da514e79c8c0e459d4c179460e53fea13a59c1d1a6ece7ac0329f2b4673bc618c6b28ac6a07ec58fafdd6f5559a062844acce14fbcc27b12b7e43c2e63abd01e59c786389a57bbb7bb8b0743f2145ceb6f98856c730542f1d40988dad2851f7c87eaf02d1a390443ab4a6f651438483191d0abded823596601a3ca4851b586e1531fcc53bfd34a3a3ba51b7645bbad7602a3d9d51103ae543fb360ec3329a95bed2872e0cd32b8c82f534bf39026221226f220fb7bc775048063a4f17c0d894682a3b241cf0a9fb9337052396928ff4c373e77e7563287c7e4d3c08e1d387b3fae8e156f5b131d9c09cba37bfb921ddad2d43775c080c9b5645e1e53252700a6f0a63cd9f41b57ee48d1dcb173a3c1854cdd4608e6953c7a27bf580a59bda7641b793cbf2cab48606700139d7a3bb4d9101cea50ccc39648bf193173c4c9991cb676f020729f5b7306324a1a53beece9a8aa05b2c0bf5f19c0181ef33b24ab9572aa894d3589edb53fdacd538eaf75e0a8d508a8bce74ebe4e1aa79961c820d6f6b1e9b0eeefc4078488d233ac5a25d2ce58fff47b9a49f2bd914b43c9b76e956436c657f9749ec1b77b78022e3f577d6617241c86aea0a378254e4b1de2d2a38691f53d8687828bed4447f74eb3422d52b274054cdfc869a944238eea78eca4a3421de798625af7336cf79029e0cf84576840545fe1dc0125f591226b53ea39ac3677fca9d662fb6da294b485eef599a6e4283c98a2fa42086dfbca89b1b0222207ea11aab99fe92dfbfeea64139fd3778a6e8b742f270e1f52302151c169177003f037668f550cccd8af9dbb2cb8d9c462210203cbb3ac0be227b56f781afd8f8005e2f0e310c7f2c976eda3a72f6024c84db0f19e7239d0b7e34bc35ab9a66b25ef54e199b193a9967d953b5554075f5ac45a51682cfa02c2502f3dfaa1d6b7bb7222e762c66a695a3c075d62d3f67b3d3da26fa5dc7417dfd7511d697c39ccba6d13f5067ad58a42b51b6fc4200fd8f37d59d8bb43be388973b8fbc6b7e6aaf3d22541ae5ec2289fe8f8e4ad87904f255d0a25fa654f4e3e70d2384e903a48429968e109f9aff4b534b039f56073c335071cb94d56334df4be6e7da1b5498bb50e6b4cf49e298fbb512b32e13d67788ac09564dc58d4b80b0289f046beebe54fd0baaa899f47551b4675b936c85d7d605f805cc99275d99ec0034f8ba4a6e5ea8d60c85719ed44e9d89d0c53c8bd4440650209caf3e5ede9ae273d31983718b648d31441fce646c22aa6e259d70617e3f701417eb20ce1c76fe18a647dac1ec8b3d1ee1e09f779f0fb8b5586057199b28ea6086e811d218a92082b10425e9483d4e2a358b13b5edab123623a351ed5acb354a02fc21d425d30f3118cf700928c2fdf0bc402c18059de4693a04790faaa060aa3ceeb4120acdd15a10bd5a128f54722c9d4de27d3f142a98a6fb8b049377736e044ed67dd6ae78fa32f1ede1e3fe8ad95592d6d9747e77523b72ed6241f4198398a3e4cde0543e03de9de4907b5628654f2305f838627eab98c36614536bb1d81a06472a57b3f176a04eae439ab2f593c585d8b93d835e0f5f1246649da669543964fcf3d9eb083102a628be140dc1d23ef7fd639c25c79a24fe70a802159870694be810a44b6b06ca0c54bce69216122b8c8f690742a6c99bfcfec2a21e708473153334e454d8ef94a006165c7f50de758fe24acf31746d2c4bfd6360c16fe8638a4cf28fa9b65667c08c09bc28898ddbe86da527305b491f3ef73a05bd3342a56f2020e2681ff55019798d1a788114ee4a668c641208512d5395b052b304f2b7c5590c1e5a006116ce1a940f19b326e48f9dcec6cf985269027b220a225490ffedd4788628a333ec8b43d05e6db551ec38bb8c9056bb40a428068d86ec5998e940f1fe18180e1acce78c062d1999d25e724b00c3455c6120778f51fb23ed5cb44cafc47ce88146c0ca079dac7b187010e88221aa653b1eef5a74389d95097fee461b2a6571a8fe62fc6925601545d26b129a2898609866dac7e860ea7563b8feb58b943efa8b6070c9119083d9d81649866018059e066897a64fcad9134abd0c8a1514879612b4dc5b3520d2e07f31c52d608dc785fd796cc66a4c8f91253691d0aaf83245bb4a4c0171b8b20feae795a331866c3045ff1305d6c578612ab77ef75a1d228ec5ef42241bf922b1a8b5d54f5973a1a8c7f2cba4b826f3051bcc4f3057e1fb5903a51f9a7f59c4b3fb69fec0a9561eb4e9c3ec5fc22f6c7a077ec4387bd28b645021b5abdd82d55b803455f52a1af920feec488bce14068d47b7e3ca08665dc2508c21703f5d56c1c691a7ac9375f9df72d6bbb23304f628523a54a5c2352fb9772fd2480a615bb2a9d711c95ca355e918ac04f2e0390014a4fe6cc8f121ec92893b11999d3ea79f6c12381057442434df5a10fb5f9a26418b3d31851d8383bc0f7df69f78ed81b87fbd57da970cad7824d8d09ca06eb38057a9b41df59bb423e84d706e487f94e56f562f82e3f1cb782e2ffcf121b6674d418accce66dfe9d27d84232f6e50cb5e82db46a7dce182fd5744a94b138305f1f31269211c4f4950b455251663fe0a50fc98301cf8beefaa379529691243bd33cfbcae083eb5b4638d193dedb20bd33d69ffefa85a56df63b4e5d573bf96e134ab091bba5305bea5c0569ac0fd46ab424ecdb3f00f655efde134211bc2a7b6e6e058a2681e37d68ebb2ebc16aa4d0b2c739773c51a0d45776ce75ca269f021b817deb6e6621c5cfd989b247201ef2148db39a8fead2b594ddf9917af0524f66e2d477628c142b785811d07f8d2c57e44635d331d94a06ed41e636bc938e5e08061a3596a1639988df1d12b9ea076e08de1899cd1b7f6236f8d503320f61942ba23224101d60cb56f7d27481fc5d8c1231ed1e7068509a2d314d594154e79b77b377a91e69e57dea57df87f7baf3324d5e207e20d11cf6c004b36311be41a13e67bb72581b007e4671d5d72731968eae503fe83ad0725168e71f5ed2142a0e5f6e38c0cfced75f44dab07d9a5ed4935cedc952d32de340963078d5f798efe969d69f6c38fb82fa03fb3237bcbe914ce13419a72ea807f5b3589ec2d4e619c2b2766ff843c258ba089d2067c720b8670f7b2c952dd331f7a582cef0b2b2cffe53d11d0383023155c468970681f576f7f6507b844ca9ef94c6e6dd62e40e66afc80b288f57d59f82266d99841549caa2945503127f213ae6914b4330a2e61f49e56a1bd582c6ac35b493c444d27587b6e1142747d8aa50275b9b325c017adc9e27a9d72015a2a4ff002438a2848e8b0a22bbedeafbac9f8176275930e693bc10c4c68967a0669ff6d655f0ef47ea65ca8d4228c81ca986d40f3130abb2fb6472c3c2ee55ca8cb6232d365080e77355e563e34615e17d7233b231ca29a06ea4627169855e7a23ea6434087dbb31f40f10fb2af4218e1233cfde8181fd41e0cdeec2149402a1ff02b6320daa1feeece8198f3d6d6b96c5060da064c0251d49a3d0d1f5f2970b62dbab61cb4e0dc69984701c237ecf14366f9de48847df7acac2aba8ace9937a4918511a09bf8a2f521331c8efb1036d47071a80913f4457724ad20a0aea7c81ed971d3b4484452866bb1c097e4b5558b5ce112bb26cdf88e6405ca9a96f557867e56f0dbee4ff7e586e70987159995173ba32204c51c504ddd0dfd78d4613a4e78a9a2abf26ba494372cd8187940492192f1b7184cb38ba6df1aa5724c10f4ddb83a049c8cbb8117ae7d379307a5d0fa41a36a69452dbae5254f2f9c8b434f8af8b91fcdddbc12763bcdde41394e121cae9d5960e389e6ea2dfca57eb54f8b01a9067511e43c8083a200d306086e4b10fc46a954ea14232cdae2f06282792a6db62acddfbc6d1d42b928b0932aa6f37972f4de474440e02e306833b2da59e0333c17f822d5b524fc383fa488bc5900f7a094140006dd668edbbe06f2ec656ba8acf2495053eb32cfff5eecb0ae3d1e4aa080b365a9fc71d8f8a592f5b68daf9d138cbc96981b0cace8a66b9633f31c57c62fb22a07677627e4d69dcd3592f56807f84229e2f8401c42e5cbe0aeb2ed246505d0cccff927f70f3152b80d129aa5e3f54027382c02099417399cec1684117754a9d77bba6faa25f06a53fd46215858bf906ec3f696f9674ae59ad2a86bd83ee4f2c6f95023f91683e9d3af6d6814241f23b8251b10e25f7f39f05ed89b0bc81abef3105c026071d203d3f309c908c803903b6939ceeeadf3d67de2052edc67ce82b2366af091df49b7b152d8fd9961215b286f8234543825e756d1f2f5339bce244b37d76eb623863d59209ce5c015518eae026d4a9dd674254236b5d934f11b157519ca0ca2823757683f061faaa293a772f516cbd150ab52e1820bcb67154b89ebe3d0ed1ae8991cca32395003a58f121929612ff71e0f6bc420e79bebd03737424dc97d70ce8a028a4c048a38a8067a114cdc3dfafe24c7f64b237f8f11bf21d01d09393fddf381e565362d65052d58523cd4476f8e107db671d3f863756d4b9cbe8aee1547bbaa8e48a227eef5fe7a8b02730a9af93526127cbae87283b0188dcd4fbcaf3f4f70bc90571b7f021a1c25d62e0b466b6a38ce3bf910dc0dd038dfd811cee2fcf3b19342708d88fd2510dcacf5c022dd667f5b7ce545f4ff134031ef46651fdf40a62828a092d3a1bfa08c4ffb7fc33c50c21f419c034f1cbbb2846a0e3d831d4533c4380c368194ba99c3d7d5dbe3f73f4339909c0b2232a4d4ffd415895ca4bd34a982b86e8eca12cb15c707ae1d542a7d3531e127c282da8a8d775c90ee90ed4ed27337869738cf825ceb9a6be1f420ee7fce241c8d3de801dfa65eaa0b8e4dc836f22544602cf05641578e64f9ce02d66e76b1aae9684a8f4cecbf93aa05f6252fbcc90588a8059cc97df62aa28cbdcbddb9714a5700ef124096155813d110f69ab568815affafe9218a2deabc5351691eb9428cfc709dcfd339d8f311ffa49e7035bab21afd9ad926306e873b3995363ff490b5891e7d9a785f5c5f89a439d8a22042d8924da2586610ce2a13e5934ece790c75eb9c35b6a5d82cc1ac96e45d50dfb847d67bb1348eba6626879612337900d8dc77137e39d23a5c21621622b9a85e0c9cd1c5d155138e578bc89135958c6d2414002b3602bd7ac4874eb13a3f7d749923018416207a723867ec4eb069d9ad998fa46d7577417c9538762cc75ec55982ed55a2d22b32efb196777a3eec39fe5cf2fb90a516d4dd7afd1af2a7f84cfb3b1b8a59c34b44759ae485af170c19e9feaaeb4a39bf9f52adbf0d5ae1b717cf6da0df36312662decf73a8dbcbcc5e77ecd86fb1f6df7482623aa707405893ade65813cbab8a336958a8f33c985cf5c8f4708707e6a54386d93547ea4ef19ad271b99968ee1a87b664ee10de0d82e3600f5551d33c98001ada7f88eddc96d0fd6d5ebbc46952367a910efe5546c8d57dabd177cae355ba28f50165ae025385d7e43deae5f2e6b36b3a2c8954ea918af9be0e8d59a7b77bac566e2572c46902468466dac40cdeaa0fe3f3a972f69e471860f3066b1c60698bb408edfbb2d2a3edbe878f1af2fa2f1f3406ca68d5615dd2d0f090aea049d3cf9798b2001e569a45da2b8e42c4a5493ab653fc32f3aa8e8bb58df0693bad9985ff5ae6391203842b7e1d39e9ae59fdb2606fa86dc585986c586058e349ad005b39ff74aeacb5accd6574c7eb37cce56a0fcfea160b5d4f42af1f50cd443806417c3ed93c79b8998f863af0afd0d5fd10341381ad7425d3608282b020faefc876f068d3c6c7801fd6dcf9488f747111155a28a8f8506bbaae09fc992741b30997e1585e6de3d989d42408dd8e9bd6957ec55fe1818c646f207a562e7ce84b616a2858aaea8ee379509691c5620268429358d62361204e1d41369aa33358ca2ce7f2a3c78994e27f408369675f103786d1970f85aa95bebe20a95860b78079b7e74e5a9088c7a079b8bda1036a744d7d821f0859706464c34eba11c0272c18d97996f5bf7266e879ad0874c3b55d7f8bba6c19c283cf4e36b9c385c830b362d8963029513f0f43cd3664a4946e6df8d3c047d2f7a19e02948ce1e977ee80033ba8e8d2969fe0ec29eaa760f45bd91f138b2f7dd96dabee426334798e2fb57ef13b1c7ccbb3f307534adee9018c4fc393df7b9d8b8e4f2deb4d1b620339316915ebbaa25e7f3d5899631f13f539fe4a43c2252303ed7f058a055ff74b591de888e2aeb8aa9dee7fbf16752c7e21214d51213d05f7e419cbb80d5a2bc63240cffe4bad4a8c2d1df77edbc192a9766e2aaa3ce0f72afb7943f9738baad96e4d909adc0a184a1eefb40704d9fc7c70cfb3f4fe786a096ea8bf5d05a963d269016844daa61b3627e3f597ff290ca58514d9662fa882a2f0d4b37651a760da98db9d88b55a980a8723afe24b0536b4097cd888711f178991cee67d88f9de1f5e5c4bc06102a1d3d78d25cce057e4925ead0a5a57b671cf28ceb96c7ac95bf5e08da297c8d4ec8280d97d3830790f9bd57a229083f04a2506a2bfb8cbb164d873362842b51d80fbf2e87c781a3c8d26dc7454265075d60cfa89750bc5f3735d59a30f1696c0a1b9ef0a768d5ac5130993b2160bd5cf5c37eb0423fb1433502cb33f96ac195f61f397b9f7f140724fdfb2c797c13a06beff61c3a6bcff59fee97ab196763500f697f2b4e216b3a6b2238514f809340e3db9fabd20a4b8c7a6108d693dba15fef802b393312a94b8fea4cc01faa9a2985361b8349286a42837c64feb6a4b27c790e018b360f85b7cf8915da5311b0811b4775deeede037bfd52a9e16c6777b21359c4effa41d8393d5b3552591694b1e0a3fe4f22a31c9e32164d81b993204c44f673a75f0e9fc31a6206629becf78f16404a807fa2e1ee70d9a9f0b40d2cdee748dfcfecff19014089baede4ca973949860fa83384b46b44b10df01ccc52c6a657ae018166e7db91e96493b1caa916bafbde2939724e85ca1ffed6a683d070e4354ce5cab650d16384b0f7760a48dad94d3e3e0f266a7dae47acfd3d10534a9eac911126e27b24dc87ff64481114a71c5567fbe024cfe8d2f5b2fce4e4a7d56e2188f60401fbf73514cca273c59efc0b652172a8d2b4672e8b104de12240a5249462db5d97f39fa3b15b83b3314723fe7444e2e81c6a8320cc429b95608bceb287569ddac80e7181a29d9a54cff876b0355f7b4d4ef3c6153021d07eff75dbf05709340713667925ebade9dbb86aa1e1a666bb624629d309ab60e269a475a4143aeafbacbda38129b4bf03afd3f5c1145aef0c675057aea33ecbf862f36a764062f3049f9110ff275fdda35115ce4390468e1e6251ecc4e9339d39162f3fbb25b9b362579f9b8dbdbe993b27c6a72982dd409eecf2b74eb1efb93a7227dcd23e767e1f05880ee2c5d856a8ed5ba0f37bb603b2c1e92b0c9de77e1a2c748131040479b72b38905d540d818bc3d810d9523044f6c4090ae77124bfdb1d32110ea3d34482d13d3538d98a458124622769492911de881ebb8cfa8d65d9d1cc661acee0829a5eb429958709422255a2582fde146075b42ff4ae3eb59e416a78283c561f3c4265ca9a60fa705121cef92ed384d8ca2e5bfe9410deb12aec7ecea2e35c009d610f9d03a8eff7e4888d1d22c216012054bd9a8c7175c16f96a23c073ab92b31065ae53fe5c88c66e7a99f3dda0a7802f5c2697bfc93936613319f8f6fdcf8a7e6d2088183f3398e97bb827090640bac1e44d80221e5b9b47e91c9bafb3535a2b7f68bc005715c7004f60cea9bb59917b183b6c028eddd83e87b1a0a1c10f8bb51de4ccb0e54b8d240e47e999332c5ea75680aca487f1c24d268d5c1945b29bfd80b1d6e9a889bca59d61bab8f768c09815b8f2bd6006c5fce3e354c1b9b9b7cc34e46c098f170e89781149e520933e7b629339f621aeba7e4711f0aeb78a61ea89cb524bd9f28fbed9dbab097f02f840289b2171fccad4922abe9a418a1c8120d2d70decef99f517c119bb98f630f5010e9c87a41240b36c862aa92b9b2c152d19ec605765b1924d8f4dd4d995a369ba39df50c9770a17579763ebf22e65fd166c72e9876a1903b031fa510c41b389ef628b690c03f75f160dc9f832cd084abcea067d68f7d52aec18a500a06bd40a0306a5ecd0f0c3b1a650dd50aa9b3c381e8efabf8c39e2614a237f62a1ec8d9575196594058e13dfd62c88f78b2cb422b23a1bbe10a7746d9e5"], + [35611, 0, "a4c54366ad21e64907c5f6ca7cd225d5ff123075b3ed15a2e795ed1807e505193cbad1ccd8a91e6365fadd55a832dee676dc6034803b63548e82524387cdef313e59a153318aa8194eeb0a04e6b487172fb4594913719febebf8544fea7d1524f859b785d74c8c660386ed7fde940156e706571e1000306d1139514e13eec9364568fa0cac6790365d24bb9bf68e0b7e1adf466585cabe16399230566d228f899ce71931830de346cf3983c0c6430d8a4257b82a9b02c547615315de5a4f715fa9a464c6e955fc0f28a505c6d6a7e118c5cce073a087ef50e505b26f47dc8fde2d2442f4d8104f5137908e8ba7a87eea6bc4475e13aaf97f8a0502a536f5b4eeb1270a66e387c36b78e35eb7c64a54883f218140b7b7af2f58839784140a6dbd53d8c8f2643fb66980364a516b1958c7b1b17994c495b4da6178ac89511acd9feb48e34a193437c1b9c03e7abf956535f95d1bf3acf3bf6cfbcfce42bcbce08c8847812d3ddc1d467dcbb9ed050ad6190484fce3b5acd0a1d945c09777738e287e49ddee63f0f87840749054efdd0d6d882f9f1bea5a36fdc7d8778c7193af9ae6e9ce4665c1e5314dc2b6ad62a18f071886c8512fa603c72afb4b758bf9e3174639420be0e85ce77a4df1acc77ba379968cf5dec6227e9d199c836de4800c9503d780f9131706744cd66da280c9fa0a2584084868a9bcf80fbac4d48a8274271d6298945ff7c6ea37b5b3b42d1e41f2baeedcf11e07a34d552109e4a947e8688876e9f2237e166016fb9126d094fd9b6e32ed029c482c652a96618b34ed26bcf27bf3f5c6b0d1d9e74dc895b214f81baabf602b3d04a608f42c5d4c3631bb8187076fd92712ba897de2cf8217ea0a946d668faa07d8bb851c66b005fc72709d122059e389035c42df4117542923c4fa4e8acd6bcadefcf80cda56bd4229bcd5011379a3ddc0c14d7fa582a7f097c70c596bc580b42fafa96ee689bf608b8e7f980c6d07287bf0f37cf685e1ebe48473664d1a9c704c869fc5e8702b3ddfc8c0401ac40dc4eb99c318e7da06854264d6594c2b3471b392762a63a55d900615468784c11bbffb09248067e5fbe4228ab13ab6bab6066b20c2ac752ef790104eb86c259b751664fd6bd686358c8066f594d7b6ee2f2d7db9570026b2b48a02063165329fffd1345da2a19800df185e8c22518658d9074efb09a9138db12fc2a825dfe1a06b2a8a468d84a2e8a32d1b86eeafd1006e1a7eaebd70795e6f8f1db64e55795db550bf79e2e3e0f9c53a4d4534dd1bf97b000ed43ddbd41472cfeb540bc0cf03429bfac55dab41eb11b1598bcadf20ba48cfc9db53d280c1c938fcf2fe2b3fc67da4766ef6b26efd02e57e2e3cdf215c3adf0158ae140bbc0d3dad69a69cdec4b1f4170bfa2c1cb26b8ae0296d65b408a18793a2b92155574da3e060c5aa9c1311384389bbe21d120adc37e19912ab0ef90b7b7add852562c0778c5c2c833229d71b4abbcb53fdb6501d7014e211afb6b31839d3637fce91cbd5fe24bc515f8228df23adbf61f9d13fe11f5d8c6507167d2e3eee306d8d3b85cd12b97d49c970f9ea54c6e0260a7f8ca85288c124cd255ffb7c1739a98956388c1cda9d14c2bfc8d2b1ae87556799e56ff63a3226f6f1959a0a261b746c0f32f1111b8e0b4c74ecf5a75b010bd0783b8859ebaaa0abe00c859c06937bbf9893dc877d8437f47ce80c41964c58d063990d56c581f5acf4e48b0b9291c618e0787c57dc6f9c82cedb4834dd3a185c1e2dcf68b8d9a44b83c2dc1ed880df2e24f2d8243fc285047aa39f4b0a21f16c5321b4bb8584d6b145576e3c51b0f306ea703082adf766f7ff583492aac76a139d034384b8d1f0faf1059ea19e35bb2d69f12fb19a4c87f36ea33ff8f6bd4d328b84e2b5258db3b2cf4d5873585f38a8cf86490e3d0dcc56ba3573287b365e49475cd9810f3c381d0520f3cf3b77971f1c0de5a4201c9e67e8a14942c596803c965d5b6a6365d66139a274a321ee246bfca425dc6bac092f37746d2574f7691b6ef9911188bf08ab631b20b92d2539920ddb7dea4902061fd3dca4d12b3a9e05a786f0084609389d1c6cf6a4bafd5485bc98153eb40c42e5d1885f942b84b8d990c9bc2ba5d0016fa8faaee4edf926a088976761c92837c9a8b9559911608c4778879ea74c7b4028e7a9f894e1451c7e3c66f7154443634a142b32dd1bcc1631885cba25e5fbeea308fc1da0692f258bf5e8a52a0e2153946368bae2eb99ec2df3fbc4a3c8d63dd1c001cd885c03adee97a92639e590e53309e64e257515e16ee0a460f24dd61d39b8a987f5489f7c5d068f9cbbd26646722b34d00598a6c74673e97e66bbe9c9dc7782b268aad1c2747d4985dc2b4fa092e51d51729156de7bc4280bc504743d46bfe6c78d37c071d9b4fe5775509a7ea873a176585a98aa4dc5bf4ddaf880a582cf82d6d4065f1d4c164212eddd87a7fe1e934568c517a13eda4024224222334b78d4c841893a0aa29687aa483c13df709322c934a2a6be5d5aa7ea22c90816144bd25ade8ccff2878d339532f0844cdc220e65458da290ad9f02e35a1580ab5cd246c2377df7c0316d2463ca6fa7e209069bea675f317e074805247cdc373fe54022752bb683f9f27ecb1be6abc3f3e4f0c2480e3d63c51d799f9e4d99cec3b0d0aac478fcc47e318ba6033190031c157d883c6de90c3b5e240c057874da8b432a96187fa87984932806e4456307f277799aa49b2176d1f08f8de3aac44ee28ce83bad021643408681d46381d31ea65f4385d1dc0f06c0cbc6549eb189194d592637212091fedfb552d2bae2c7a634b87bfc677e887510f5e63f46720acf82234ee4eea5081980e6eb1c8440e7e79f9e775a3d00ad91e1df5468143613fe8fa47d50844940d60f87ae72a1f935041bf281620825a4829bd80a01ee5796b96b6ab4894fdfff1faa49345d1de02b09188457ba4f997ad25daf925b4bbd4291adea1b4621e71643dafa4896d48efa402a3b9a90e553d3a1a747aa83cde19ff6cdef4b5cdef055fe49d5ff30e5e11dc0c3a593cd0b957b8bf545d41c33b819f0b85c473f89de82d757b8d325746fb7700e44747281b6e7a28403f735a948418b717c0b130eb33a668873bf8e84659af40cbe3ac6a127d5822063159746cd544280f76a27d7394395ce4a1253fc781e18336aa643c42bf828355c1e24698e363f555fda852cb08a2c1f1bf830a23ef11563b7cd35910243c24508e551358cf33b5ed4131873745b12d38077d579570d1e4ea8e36a809dc421d398f77e73477fbc3d212be8d6e4748b2990105fa6838d27bae1216f0dd5ac3a7953fc0981447517ddd3a892e0c0cecac1250ea2373eb8557a1dd0d57b77e439990e39adb6fe8a7d757067128465101855b4df396e97584033578d53bb0f8f7961e70732fcd4ce33cefac7b5f1a29c12611892cb5ead814ee7147b2881a6eef0612c39de504223d4223ce4a7c3baa521f3cca18c67e4d22288ca39c2ffe798dd0969d0fbee0aeb1f6b2c9d553760a6b8c89ee2fa624042d43f1b0a8708f3d162920b2b34fd1b7036c80f1d186215af6d7cd7a5e686067f2cc00442aabf8ac22323d542d3a0821e94300c99841b42b1bbd31a30a2d45f89ff38f340b71b1861937fb429a1c51e27b9caeebeedcf71dfcc2761da602dcde0edcf95af6c2ebb756638bea50fdf9ea5325c0d5c0898a2f3570e3758aa39bec915a65c2d5ba2e9c4f6d0a934d06b25554a8586711bb22d8c23d214691face5ee68146a6daff4b6b59cb7dd70d5bf10d598f9011c5e41f69052bfbf9bff6d9034686ff0ae19cad826ff915bad43ac2d23cf12f6714a5498c9b3c89d66002c501a1b05bd612d598d35d52e4b0bc08f20f16ee66c1880122abbe8d74729c34e6438a70cdc4b4f1894a9511b72960c4785d0d34657984017db32df38b1121703a8aa4511b2b33c36dd7783cf2edbe89de4b7b653e0774a3df8499884cdca9d4d1a4efebc56fbe773eba6677dc497392a93beff307750e9383a59445b7cb7a85afe1da626aa7230ab7859a2b22ba7534e1a86b4087b62ec2a588bd6d999800d69cbde2a44e9b79aa69be2634466c00e64e3b41a6832d19ce5cba074bea5f48881ceaaf483aa18dc511cddf6a857bb5399b16adcbbc45ecc4f71090456228b9aea65841c414a380889a068725b0278f85a348e1c88cd775179aaa697b348692117f9fa915ab83af34670540187593afd8c4a6789c7742febe5e3e0f374a4744fa99fbb93265679aad0ad63cd5400d64d0e7a20fbb6166717aacaa84d0ed26930dff1ff8752d7a82f14a64b47348b91bc5f103425b7b7209d8009f7d5caf26ada3c7bb2fd9da368a8c6a1d89cfbf810059066df1d4db81db0d7621933cbba067acab6553da0bad0d1790ccf29245b05c50c7c32df2218e932425b419127050e114ee9e47e9861f57ea8f98fafcaf6b647133546ea05d66e2efb9d0380f40471bf5cdf333b70af6a76b63298d270b0b1dabfc36159987210304f0b327aada89b9c9d864fbc74e64aef2a2f78b589dec28cc1e08e464c7be0718cc3efb9fba51d9c65e38157aff7098f13995e04e6b6314cb1a93a8bdc058a5dcf0eff700bc284572cc3fe05dd6b062864466c2f2536da4089aa8787d4c8a4d5127143a2966b335fac4bcc2b5927627a2868334df840e98a043bf925d2a3103f6774ff08f8a5a4ff17058c686102b6b80d7a8342c6ba0991067db2b49b78f69d55e8be063b373601b41dd91689df54506b9f83d8139d03ff0535782b19524a7ef9648f8542c6b5e63c68268bc105838a404084e4522132fe11ad0b7420ea9d95cafbd74a742a06182ed279f935683cca9c1579e360a1d4b0469f0163bd75f8688b64108cf41d48aaad9b1b5683b9b0c632283037232295357304d69e68c343322ecb5a20f81134cd9bc7b21b372d54eccf8df5cdfa568290a080b23d1341069b9ef8ed9fc8edab7b134ad9fafad22768d90af04e26ca7e8a556172d5d50d9f9b0bd50823e3105311ca2f20b00dc0b6fd98d54417f5265a522658c34559b45e78161dcff60ce5d64d228ec62b5f64f9f446c17ab4c136feb529e87ba7105282b36bbb5a2b125cf7298d2122857cfec8b93eac06ec2c3dfc5f91e8a69097bbea26910053ff31da3b881c8af16e66b392bc9a6f0d1c59a6c71354a6fe39edaeeee254a2f231877d481cdad6360377fa6e891440c1d843a627351c3cfd85957f0a3ea781c01422a32704834ef685b123423eacc7cf57bb3b4d97557a521be276d7d58f8b1a4024b895db59b76a6f31813b6935ce853155e9e256333fe2bb18b79cdfdcd62d4c9c63f69961257c7ad9c8fbf305b4003dbb4ea9db92fcf7bfed225231fa61b013f966a05e3e8cacbf628a6d2b794bc0d7bf86e83233b156116ee9cb34bfd90afa4f423a7ef9868afb48c82eb4260a8893e4e2f9afc05c339a7309acff4b918dc04ed50eb3e0e5e40377ec22a7766f5934ad20a62e96865004085bfc695c50509427d9fca306c672676a41148c19ed745b820bc09d6a9aa193f329884437ed620906f00e17c0fe48abd8866b26f595d623851f5b3e11d8d4cbad5cf5d8924d3bc67ac76eeb93ff7714852cb49f1a7d9814e7f419523bd3f9e54ef2f7fd79464ff79f9e587594250d5bc79d1e2d11977363cdbb3b124261060c41c4997e84d1420f71858c54084d96138441460d70b3bdf710ef3c9b5d7929499ceb5233edf82c3f762d366f92b38ec602360df3c79cfcac5d7395e3bc41b81dc06dbca50212ee2e811cbe7a40eed99c59a446f84e07b4cadcef28ed92335c1189400ee34cec628166f00fdbe639a9a4af5af1ba91072ee3fd7e83dc1c6574f98daa18262a7c22a414e010638a381fca4e849f975402cbb22bd719e6b798a3e5bb0b8ee658ae2558af146c0c59148bf374734a900e941f71a477f95aa0665387ed0943d068a006583829eb5e8708b92892b606c59737def294a3eee2f3f5f052eb981281523e4440cf03de91a5e9245bd7177b76fb38e76b58259f1f3961f5ae3fcc625c17663fdfa8776ca4cbc228e8f1548b0104fb09763fb7fd450f17d9d7f5acbf06e05ba3b643752f0a80d5a18bbfd9759cb1364e7de6dab2549514bc021c3f9245b7036c66ad817702c6fb9313ff400d5a3c6fd8adc91d1f94f6591921668b9e1ed017a5f715f8d6ed5a5f8a5d37a41a0dab7e0d60b2e377043823ea29b57a1879494aad3a9e31ef358515f364a964f1118c7e4782f1f7f833e11a203184e15357a6129eb264368c006fe6ab09c5b67b91a2ed433915ab358448073383eb4b62d6b857d3fdff156e5f6f979e1ef50a9ecec830bba7b7c1b0ed15a28a7c0d276cdebc6caa50c5dbef206633468aaf79318608577c761769c53e16f9bffcba3ace51d3a26b677931e440ba7d41adfc73d92d213d886d9c9acb817cbad8b7cebc9ac3f772d8cd94e6a8d6f1eb1e962d2879abf1b5d9b131c63f73f46d733c6c7cb87d51d99b00390f4f1142407ef4a2a976f46b0a467dad3300db92be2278656c8a89079d72bf91e92776f7d3ed35ace7ee4242f1ba0596b8e49701def1b905a70f3a91b4f11c46b3cfb5c11207b2be1e383886decab3aa5ca09dc3e80ddcef7c8b320d3b7225e1e088a622097ea42bb57e3320f90ec808769742e1b7640d8a629380b7ecc3df1c604971629a510018d03df6e3b6ee35d4644da10cb13c59537ba4c4e0290b639ece7b79e605b6bab5ccfaffcf22a5519e7c4bcdf811225e7b93cc2bff8dd6f40d35982a6db32bc03a3dbcc138eaa9bb3a0c1640aedf16423fa5587e01a3da096f2bb8188db37f6d64fc67a8c99b21fc8718d66638454bc6df17f2d6e7e2e4895554e86bf808267708e97fa7babd8b2275fa4f28252ef92231931473e843b0b4181fe3cc1e0c4a0d3bbefa28cf2b7e0d5bb0336e2cffc1b4095c9de795fa7185bd25d32def8e245de9679d9d58b13dd318bd4296e6f1e5825b07dde304673fea4ae2078f6b5f3e9659c1cef4b54a5a65054bc6e82e323309120597897329b16c251592e7f2168c6f43298531bbdcb807191ec288405526756a1814d7ea9324728972003cc4f842ddb8ca8abc61076c227beca338c250541a269d9810a06e5e9fd721c065730f55fb66f6425663fb738ea4165638ff90b1ee689d198136b841b11c05e76870f382b0189eefc0dbd4c5f0b2b57a0331c15ffc88a75040b0527f655540fff0a3af6d38ee837aebf927d734af128541229edfd1a5d5535ac982c8b3925252dfd9e1c180068e498cf5ad7d14fa00b691a54e22dcf5872367d05a8abe6b55ab958c48a4b146700592b0b76c478b33d1f861ccbd23a228171e207a1b24e8f1201345e9ddc806c9066ab74cac39cc7d6bd4a96dde56f81d10e49ed8abb8f9324026d344e1d3ffc024232a84fb20bcf606b9eebdf7a0e113c4f0cf462c6fd5c5b1ebb5600a766b9d95e8bd1cb0b3589ef9d882b11d906612f59f4188aedd624259e57750b797a8a9ce627967fd4ee8a02b56711d11f06f98a3ab0dded936a78823ef892a2de62e156b58e6ca94bf3b547056c7f145c3c4d74415d33a68bdb11b8b1403607fdd3a7e7ae531c9b8dcea823ec233ae2202e5aac1e29597e7dec6e137442155c1bdf62119b672329ac5b1267e93e0ef2ed02ac3c7eb38b9904665d31aa585d28560ff4baad7bcb906ef8592fa3987710099ab4e5fdd97d9888fe52d3cc7755f6610a3fee987a94b11e8e3f9dec2b9a6178792fb8ff4f6318cb9380d81cb72d44f51aef684b29b4c7f9eb44a543ffe172c9dfd97db6fdac0923c0e933b514e6fa3ce36aa5c7264a98554e0cfb0722571d8b576567e190d0a946325387354482ca3ec9069c48957ae0fd47ebfc321f502b5f0bbb1d9c4d23a0e59270a5743f602e7382b220a2c93a4aaf8fa9c383dbbee903b4e5686804f1028ae90d110c70fb8f3b77f6c99b4e9830b3270f150cd53eb0e94c39d3bea67f60d1fadaa34ea976746a7047c9165b3f264e06ec7842a70649dc1ffd5c1fd84ae2a61b85328d39878d69b9e16c6260a17bf74cb85bb352ef02c3dac23c907170c0148363851a02edabdaf354e3ed057c5750428315c7ce64b06c3d5dd28520f69a421a6b0f3191707ce06b436aa670538f5c897c5d8f46d1070d8bb4ec157f6b4ebec89b051a5c62172826a465ac0ae9787c0228f9bf6cda6b080bccbaa4d4b225cf8ffeea21f5010e6c1b1691d831691b769d69a2f0b411f2da8e377889e14d624f5a53434fd806e495fc7f4d7f9c93835f0e40234cc2d60e4563f09a6b39d4dd6ee584761aec8a39101f7dd51db170b07549660b7145a2b2931fe0f8b91a0dd69a7bbdf61d246ee3deb8e9f80e7c75c857f428e9622d31eee421e2c6a49f5384b44789c37dcd16adc03d3599eaee8d0255cc7fb72533147025bf961e1fb10027ac12bc2b2f258e8b8d4feac7c343009f646ac0fcb0bdb6ab4a1e2720cfb9ca800574e7634f06b75c13a02cb7caf274acef532c68230f934a399c33edbb6b2b3b462a860b968f1aff893fdb29bb725f2122117c0d7cc27c06a7185f082023b963faad5e94ec9c1170a4fba5480e63863c47d5b6766c930f286edd2a82cbb7e5c896b8cb601d19042534c34fcca7fa0ba9ae8ae298d0968d3abf45c18561c285549f916b4a0b01f78016b1a73847643bf872a870c64188a90ce1058f6b0b7b0aff2796818e14c648b52b879e0cf4685da145094ad22ed0a98ad065da278917978fdb9293652837e866813a61e0c174e48c735c2e316a646d972074ff5864aea373cc3a8220cd33e6e46b4eae4e1f62cbdbb48055439e53dbc443c94cb88237a5b31041b515ebc80ea3807228d1d6caf5e29791bd8bf0e7bdbd75792db4915df36d1fd2d057a0ac039636ecf2e4cb47d8b93a86eedb70af858794875317fe27b1d2a8502d99e7751ba2fb61811447e01e0cd36e385841e54ba8a990885ee90cd4b090b76ea2ef32303440370e43c28921e1c1b80191abfe0bd8b52b95764fb0ecfbdb953f4db9fd4db8ff7a4f7bf90fa636acbcaafd1f345413a2bf451da260981850384034f9a199ccf467009bbb5812933e5051ac3e2ea543c72abbaa0bf498236d9e724ad8783e2d9901cf5613e5637da3b1cefe6e8d2445008f95fe98a6a513dbe3b376a703a455093056377120b74bd1833196195db2515376435cbb81117f1b4e7910cb8a0928b59846e34ba61d2a62c7469d833dcdd5b6ea7ca044f594de536258d3a1e7d95a4c29a1a07bc55e51f2120bd15443f3b74ba94aec61ffdd970a7a1d65c6b85b1d5320ccefde3f2a7129aedb249461fdaa6d8795234f8ba2dcf37c7ac24644d2d6b25fb4189268607dab2133bc81b67645b176a2a858c5fe2975bb652d43b8f369342729e896de702c4af5a54e4018258119a6a85f44ab6f3f61988e1b1327e18138564b434ed08e119f23ed48ec9716474fe1347f5cbea49427a44d19012870b12475878edc79cc1aa7d700942254fa720bbafc6585597cadd3761482cb3073b1a3e06a6ecebbb7e81434976ced52fb79df1d7407823fc59ecfe0e40a93e426df241ebb397ea335b33d9e21381e27db15339a26ecbe9acb5c57bbafe5ed5493e93f7e624c43a580a6ce750c6a0471101cadbb2b519f029ef8455d200c208a6647afd9e88ca66cc2272dc7bf2aa7cba2931551f5684c57a746c7056773948624236191ec44e69e00d007e0d915c720ca11ac56af1541dd7449074c8ee027412e8b5af1ddfeafdb4ae1e0ee89f90552717fd06e59e4a90a60728f4bdde60a7596b85ec26fb7ac559e944ddce3c6d72589f7be04852e968daf4886e25447cd5e71047c55d8c8f2a60e3e865e2fd236f563c87c7b4f532e7cf248e74d35cc3d1893db9171b8d1099c97e35dab8aa4c136823cc3b1c3739a49f068b189b3a38b49132ba6677d790e3c0c2212f1447070d5de751d4f7902db6de9584cda0197a03af7d1831fd114e234c3d2b64d632eb50901dd90735eaf02310e6e863d362d3b2982b778f20599463ceaccc1ad58e9a410d8160a4fc90f84c51032bfd4f5b15c0fb73406c9a2a1abe07a50330d5c7af103df0716255f3b41671167a9a97b537f0f91cada5b3d1dfae97de867dc9002d04bff0f448a573e9991711cf045e10b86bd6a9e7d02cf423cfe1d65cd2be55b527abdac93f1566d179f4807e9cc9099bdf9ecac10192f918d3e36c93cbe20497d51fae031158a958ba1745c4df55b05af942c33d8102a90c237f791935cc1c4b25356d4faf904918747d467d3d24906bdee656841b01b4300a9fbc028e43562547909af4a36bc12a0a217185e8148e34215752caf4895a98cddfdb77e7443a9c7c9a56d1fb29a23b4112d8967a6cc4885c802e3756fef09a3bbc47e98567475a0ebadbeee7ea09b7d40c871cd22f750c084ef81f1b1eb14531e1804241bc5757e7a8ea36374e9869ca9d179c6766aea039b0c749bcd364055ae7beddced00415d863faf48c9b1a21934f7610a388533ef1d2286806fd154ce5c50f8017b42bde494a434ce7a3c973fa5758504eee7e5e5830313452a490383b8bd449f71174faca926868551782f3003dbd53c8c45b8a4d5e2ce85bc35850d6b409ce143a22672868eb62aa3c11b256901498bedf091e2cd34b7c244642f3405f336cd0497e0d601f4a246f584d8e88cfacdc09bc696c00903cc5454dc910fc66feb737f091e018acf8bf4879d19743d2e2d19046606fc68e5ba723733ed192f27f626b9bdb7680fe12ee21e0252ad9d5e3c3b04831ada0db3374c86ab4bf1c3d353262e143056578b01bd161eea35b117d2eff55d37ce0978e8e578f52c91067a8ca929963208ceb79283553205ee39de9f912fbc3266d9b342d5ca76e020d4545a7c7714a6fdd1e704f0ced428384dd559c2d20590d96f176fd9c3686facc453fc01b1b50787fd91d665a6ba925cce0cd333813c8c32a3b0abef25223eab6e9c7e0787e6167322123240c86aa4a11919fbeeb0ae708211087e91a1456bc9e50365aad22a7dbfb9b2d090928917bd2b451eae600d6c03a171b7f5e7fb1880d880c5cff977f2bd8b366caed7b41cddbfa804e88f8ff1a81b7aae7c826f964b50850a64b9a7ba39593844680c87aa38da4791221a8faa0056f60775b3bbe14aefde7e7ae623d1cecca021cfe17b20c290e09471d84ce015c7c2eafc1ce1dde3ea6a2fbc8c41dbe00fafd712a99c4bcb651d1c39b59073466f15ecc70f4923d35a0c1bd37bf10f6defbcfd136c1ea464b345d9873281847ff9d905aa5e82ae50c983323b6a97b7a3a7580885637c5c4e3ada3426b22ad474f4de7e5e19a23cd675935bc19a339a9d23399ae9d5a7b36ad977ce746288f0ef30f647583448689a5462ed73380c83bae9c965e0196efef0fa7a99b44417e432a72de5af2e0cab69a2d4e5d50a16fc430695be089eb3c55a58b3efd8fd816c5ba525ffc18a3418d2b575c7b35fe16050b878df784831b9ce9bdcbf3b71935a4de10d3985d2e513a0716fca21bd843082715b68bec92b93b682e8c96f5dfcf42c319cc0e9c55d8937617913180f2033eccc7d4326e7c622186775f681de45f818a1747fb6dc7981b7934b37cdef841a99cf5e31c16885b741bbbe4f55e1cc91e03fe624ddb6e3a835821555bdd0b068e34d972676fcd9c7d489f644742a6cd9ecdfce67eb094d4e8e414cb682dda298e9057269ddf7857b4a7bd3be3eef96055e7cd62ef94a56075eeccf2c8af53d250893f4d4d87772ffa6290febdfae7fa77b22aca518cc46dc34247deaade77e14f97bfc6e7ad15ac5b2902b79a6fd0e875d030e8ac7d70c4aa695bcaec31d2e34d6500f28c5ccc0374067900d39a3d9e233d17a694156761e9bec83f576ecd5c7c179b23ed9b1fdfb851d99d5a3f1264bd921bbe5d0a1445a53a549cf2f686b2c1330e724362fc4c870eb263c90e9947a9690c0fed2d0693320723cece917f78d2fc34029944befbeaa8902e99465d3c78450abc617994393c13d4f746f43096ae3997b593127bc2d60c1d0d09cfcef711e4033330f7bd0d45a7a9e81d387ddcd8ad256228631a1bbd80c56a253d474bcd694fb3c34c96dbb770fe399e4701bc89bb688a0b02733aece0bf0f6522c0a9d3133a268ae6bf172c2f627da734ce25a58e79df2317cf04cf469bf6bdfbab4d1d4af9a9971cdea750e06f54840ed0fa064d17ff7b614f3f7e087e3cf608a9c8bf5a84f45e82b6cf846a72fa314f70246d589a55242015ff53098c44bf94236ca045c6e988c19fc6d207a0bb4aee82368cea6ab18da166876af4f55824a1c804930033c985a90223ceb0c19a2dc2c1fa4156d4282148fa05df45ba805746405304887bb2b937197d2486dbbd4b1352904a0b3bd2edf46dcba8fb49e269961a1fb8dd2a186e48efba232340bd4def596f190311335760658710d81b7b3a15405696b6d1d123be53c02d8a74adf160917386e6bb168535eead20307129e597bb903cd3efcd2c8c269864fa974e225e11b703fb780fa1c4936cd864a5eefbba44ee4c15b99609503c008c676ee8c4b08154f77a8cdc851b8b24758775fa50150f817e78ade6df5350ee4b46e3cdc7e1bc4f41fd60ccc0b090a470bcab92a5f7f8a33862e1108549df8525c2706aa3510ad5165d42d752c4d076b678501dd636f3fe36e5a83d729d516bf84773763fda85053da1573be203b081d3e859fef1d4a08b80256d277e2d89c08db3d7a50b4bc1003c353ea995967f8d5ca48f6b81cb939fd454a42f9849469547edafe908c5d20c2bc8a6b8675502bbc41dba7fc9170da95b816cfc1525535e34b00f65fa5099a63e5bd8835321f59af93d5ee4ed0d73312256a612b9f0be3959ce7a24f190801666f96e5fca0a6226b8b66f4a1bb7a27c1a126782a25a3449d44f3b7432b5d2b52e043923e1c93eb735c0be5ad9e1edf2837e5560f346dec34830b6eed0083ff8256c4577913e92f5dc94db3a304fac4f87d7176eded5f9611c00ff6202518d36601db809d0241b53f4e1c947daa6d3ce9ba085f270c051adb4870fb02f36e6783b178b9c6775ad162cb18da976b3f7816068a91410acf369db4756fccd8717ad5962bc8cadd1319ac942082eb70b891385bbd4a4920a710b059d61a7cece0d466b4c7989eaf0775c734bd17f2c7fb2bcd3308e4a6a76d85dba27c728a8f027f214ebc72b708076d68bb76abb8384a42bd4f52f4cd85020712bf246a65d35f89150cf291f0c4f9d7a3d517fb7ca0d4ab70bf739f8b5be304f01dc662470a6d5eaea3de4661d7a196b800d2cfa91d61ab617ee85410c0457ee5a51652ba62f327ad19782d5dbcc1dd882d68ad7621b1d481acd84ee06b83ed4f6b73bbed8624e4b63c8c24dc0db8f38a6eb5a923815b98a79cc2e61cee3feaacedb68e176615a4c8a0dfe7fb07bd6f3472dac08793803ddf8ec66083bc7d05af5fc92300b17b6d5baada1439c7b96f4eead96dc5d116f4d96b5a79c01e28ba9a5f17302d97c952a69f2f5e0e32ba3b463274742a4dcd90fe01a60a1e7181bf100624a97c87d9a921557137d03370cda81799b760dd4fe0ac37411328b9918c160f8b21de16fc7c35747d66a0044c15c275324f03693f6836f025159a46bf02d4d9f99e74203ab72aae0e5007208ffdf7a8f377de4421c2aa487ee7e5b2dc955f1045e7e97caab9ca5097840c9fb7e69fd3b2bc55da0662c5a7c2bad06f09ad9a8502f06556c523d1e91186e14cad5b8ca1e81358e0ee6c9e42032c74949d1cc0ac3c1db155c6314b874f03090381771e126b349b43c05366f3c09f4890f028f4fb628fb5fc42e68126c4226f231ec85c38866a826376e6668355f6624ad82b6bf3033264f0d5724c2becc950320cc6a94a2a3b1065f5cde9540e3b328f67b77065f0af75d1a47b1427cf0f22de4644376d28b22772b9877742947159bebcb97ad27d5ade931fd87dd6dc0b40460fcc0bdb2ad6b993e5a812fde015c5ee090e9f03b0ccd2187f58d34e894110ff4c5e33a341471ba084cbb3eee71b93dc1afc0d2a021d81a44662559980a7d5075c692031a5be062fed344aab7c77fae00a9dad4592d94f11e590a9804d50fdbd50489be8420d449788e2c95502ba11511411a9965de92a3af45c549281e53b090d44a4768cafcb5684d2850e49ad262fdd1cdb03e85048ea94fcedd339d7e8c707158affccc970671c4f952b24928013e8807504b51f4f7a1efc848decbb1d3a1895b04755f09f58775755596fb8f4fa736b3a873234ece782856f24d4997b01b67a791a80ea3b2e8ca9b1f37b0fb58d1437172ed3f00ea5af0e499b8121b206fa7d2e0e4beaff3aa9184cb7d6b8801e01ad6a65a5c87bcf99b972289e94a4ed0a1986606e551b893eb95d0a8a2b0abd712296d49460d05b0b997412865eb4bfb8bf4b473e329ef5f86ec34d4500ab995c98edf946ae62d9c686d096689d2c0d2ee708fda378b227605eb139de52be309c6e2d76cc81b304960dea9d813b468567fd690155883029d59a0239117bd91bf2bc53e3fd12d89b9c6f7921236e671d42092fdaac008ab9428c50ae10707a8dacb1e685819fc4a4d3d2d89214cdb10cb8e82990afdfc07b0bc410f53b76b4202f14868138bc3b0ee08ae760c6a8c48fbf06553fa0034e8dd15eb1483a4ee33d364d045b431d4b4618ecaf7aa043adb737e8101a6c7c2a581a70712bc46286be62e4b7ee79676e39aad4f405744c5b9898ba9440bc3c40e1b3327ee041ea261164408087bdf5c4472255f0176afdb64967ecf5a12b1c66609d5f4ce2b50938159db76ff738137791b87686a4a2ebf123c1e8fd63bdf4054f369732563e6192db202a0e7f2772994d7db2ed35e1917883a376b7289140b558823ae62bf214a8d3ba7b7770384d36b29c3bd1e010e44e50d1103df9648fce0ab5f76a9eaa7da84f9276ef04a033ba78098796b5f2f2f965f299be63503fc2c2e3aedfec3fb7bfe70b800de839e0d24ffd5b63131fd3f552002b1601236844b832cd76d68dbe913b59e07d4777ff6ce4088ccc38aeb90a6721188b138a2718123642e6df83f7b30febcf0e2fd087015e4063d5d8bd0494751bf24f833ba1e09bf4a96e40cbdaafb94defce0567b53340891e2cc1c1ebf90555e0a61174ec0c6a0fcf432d9fdea78a371445f02bb04839c54064e2af4c8e4e69c2db0be5f64c52bec39c4a7065c4457e282c1286190bd9777ad045b5dce7b3b2781f6747f9f0ecb2fe8996063a62cdd8630db9461ff8f946771fc2db4709347f7176064a4a4bb050f823ca36ee0c173fa69f16cabfab2a51e9d2a9903ffe6cdc72428bea92171a6c7cc3cd1c018e144bbac25cdca9aea29936603d8b39910b753a1c3d00e6efff5b05066c1a07e5ddd9f8016ede6b08a0da4ea15c1422677fe988ffb028ceddd2cda5222dcbcb9d973aed46d1aad3b57e92d1bd5bab7bad1289aef8fcd2d8c1ee4457cb04db7b752b4477a90e9a1efe5cfce26861f7ee31fce7d677b73f724d9af15ea02b6e2657d4be8f6e0065ca5e8cda58d663fd3df49a0bd20d13ca8ad1ac83e6d0f96baa20b1025fef06ba78f3acea3db504148bafdb794cbc17de982985524fac2167ec0f998777b614d8bf66940fb65a0d17d4c6866fbfe0bf3d181ae64e3ea344f01e00f83e840ad5756afd305a34b520df58ed9ad4fcc6b2cd5b4ec64fe7b9fdaefebc947ba7f9dab114d0b5e158b9ccffc77a009cbb9f5ed22ccd48c5b47d5f373584957642af0367483d09ed9dc50beefb9d11c83224b3da8a6f3bb85375e6507a7de77b716841603f24b861e2f52059df8b0576b6bca5b12b787f74f3ea29026cbfdbc05220b629e4d62e9b45c8954cd9bf796f35c3c10b5e339f256a72eac667316e2343aacf77d3494cb6e0cb488eb6fc6d48847691cdd26a01b0bd4bfbefdf8ded175f4755489ff993995417cf641c3610bc2761222219c4319d45e48f893219a8c32aa0b3e16fdb3b9f2e2275aacc6aa8458ae9bbf9cc922f565a4ce942378e1ed097e6d7243b668870ee8ecb723237566ae746407e3b261c4e1e6616960ff80d038bb395166152f5d4989904b126cd085ccd71d09b59486cbd8cedddfabcecce6b53cd6b8e2062d4931a2e2f5b4948ffe7f98dbad98e692649f2d537a9e91411efa29fdd8c8e869cca8d006185c43d6ca404351fd3034abfd05a4d3895e96f850a00aa7864f0ca646081769362ec705cc57b073a3d50cf4eb73894e10e959f35c27591df5dbd8e26726e2a997b85bbc6e23e920ef43bc44712965255901bc890f8cdf0c56201cf110ce56011b6cad4c1a804378a2dfe5f24c22d9f3716a88d23e2bfe1bd7d00d4e3245efc2afa4a0cc11d5308446327456726e6a9ba2c035910193e5a3ea14a4c79c89f3ca9679f89ed51d08f26835217e59f42c13beec5d107b854cda23e690f5e27f3d89fc8e4060e7f4b35faa3025b7bda9cd9c05efce79cf5a6010bb17cb3d93d7a18dd3ec89d4b4821967af84e3e2c8668c1645651ff7ebc9e0608bd912cc07d4bdc92c53adfec4496809ce515e1dd0bf1a6054df2efc4b3b8715c7aaac21ed5b646a3162d1498d317c3c19994a96ca5dc97b399fe823bf4a0ae37fe92a102d447c05adc9de0d6b0113f3eb4c049d0743b3b7e274631306f563838c44395ee102ca1cbdf3c2257d5e217c9ad22ce84c72b585aa9d37ff6da39237fc60568ef618026285320ccf4d5556efa41e58f31ff9f6a44b57644f7c649e29bdab6108735cffaa4ef14a289152ed9ddb5571673b59cf2de717c0da2cdd2ff3b34dd1c67560f4df7fa5902b7181cc2a82631c11c36b283b19198e48d548698e4eac45210339eb2082e6b77bd5bd113a3c7617b76c8482afe7b8418fd4bf48a8971405c4c622b147e973d0f33ecc7b9445ca2bbea085ef210aa69cdf9f47856d0abb2e556bf46d271a67f950b0124059e4a233225b7a76e142a566f16554c3c72308f2527af21bd96038fb56a1c65b2219dcc753482178b37dbfcd976e1bd2de62771ec5603bd83716c617eda4a85b23ea38f0e1a0d7911a6a1ccfd4f207b6b168dbccd65a5ed4af3b2eac198bcf6ce348153cfa1cbf4566bd5d13ccad43f4b390fa0e5b420f1c8926028c5875043f0594fc0fde754faf134fe7014444abb00aeee01e9850866fc030fdf406e119767b25111d3750c90fb89a5100929c1db03572464949210c481d9f360249b7f3a6d569d1f92a971934200a5df220927643d8e2d4769115cb22d320b6388f84656341d26301db6832a8af4d0687b8481a58025aae99428822ced71dc0b8689c10adb2e58536d7ebbd9a66e5e0a12669322ad66a5cffc7ee92256a6c5239f3831729b69f76db9cc4f2d4c1a1e85478687de12b19fa7b22beda79638d2c42db4f2b33b18e58a1e21846bdbcf314510bc6739a043191d1ded74ad1593b09bc6f05dd2380254653e1799a858d52aa03ccc31f73257e976437ef0dc411ce49c2887d340130f2204b86645226e2bf80cffba4110de9d5e47b82c616df223cbe4b3cf579e59d4afe7338472cf1ac3111067813f9fea551bde8c7a9cd6f197214ada8f00236aeab329fe7552dbe6fbff05f51adb638d6fbb34e4a626b53aff758da032a20f315e89634647060c0839d400bdcfe8a5dae2cc29d9b7ccae758da575de801c0a23247984eef4a173c8ac1df44ebae91ea396a826b7b237a798684ea854c50565e050c8cdeb48049baee06729ab045b114c782befee61529c8f74deec72ab8fb1cfa8e9948b0f60608c339b064837338a20c81ec154775b2db994fbfc6b0a69319ec0a71e22af4fb401fa8d295555b1828320a37d83308c4590d1d32ffd85fb5ba04e7b0bdd68cfc01dc986c4f3fccdf326c04e8585fe3fa18a6ef9c2965f60dee01e94576864a1eb464e1950639598fa5fcb398dd156f13b2644de551f6eb8e1b0a7d22985ece52abcf3f432b61341648f67155f0e15c3af8ce516ba875669da2d9e7fd9bbe134e300c41213635fbcadd2eda1fde9be58aa575657005b764fe08897415591b83a1ee46327d08e038c8a0ad6972a68365c7bcc3fc22ac02f0929575c5c2502ae751eb0e32c1455c528629025ec888512d70b9a7468e38765eb125f4da4144f091c6b474f2830b65d98b51bc1a136dc63ffd3c3ffcb2a5b7998509ac4d7dab47838281abaf80563b03e527404cf1198daa563957401f7663163413fbe50125d4ea030a5954f765280794e29de912e74373e8de2b08efd8fd0057948cccdbc895bd797ff463caa48a5a68b6ba1017431af5084c74b90b569c9c042a2e9379e6f37685cf077e808d8cd6f77c0e68f42a64315972fbb06c056e26ff66eae0ffd6da9ecdb0aa4875637566cda2400a5f8925a6b9e5d5982bdd15d7278eb7585e468d779ae9e981df544f578f4513ac40fcaf5d58f985c5a66c9e4bfd95c1642cae345864d4168252a9248ecf32e5fa840d85fa1076397a00715b97b93f56fd6f6971e1a4e5955d111f6c82d1c0e0ae0e9014b5bfd8cc1573810151c756d5f6b43d668de9a2b1f004fc592cc6cad7f5b58b67580aad7ca9f741f8aec8e4a5beaed28c522a0a7c0bf5732c6267bdd287fc0cf362d54d9b27dc7f7f43388b1e12696a97b19d6ef515b3bd018b1955f59fbc81aed765ec01a5f83e012320f61fe730fbf25bfb46d9b0989d05d37328de13a884500991414c7d12458439235a0632fbb85cfee938c5add8356e01acbc1fc2013d42c24bfe04a249e52e7900070fe92e3e632d328a105c18f3eece38ef0402a7c6f64f0ea492318e53370420945532ec3816da1509d98fff6fb2927b557c2ba3ce39209c7a6d877bc60f9e6001c9fd30b97b323a811565b02ec1af1556ec19eb09417ce67090d63542727913010f95676765ea01bb4e3e08a6e1b018cb79d8774596d763a49cdc1bb897f07f1e754226dc712104eb823da150312029a2bee9b39dc67ea819f952a8056cf223c68ed265b773db03d99e917226aad60ea68d0c4491c30134a1933e4d83fb8d529d4c81a62d8385aadacfcadf3ca2af1601f2cd3d5a4c894c670185fe40df56c5b8279da57df17c073765d955323c67266db14800534d021cdb771accfbd82c44da55d856f847d8ad5c847d98f8f2fba8aec270e9d039ec76e5f7947561c74fec29e34d34c5145b5329e157e49c93ad8b79634ec153e5cfb933b59a687b30143b2c720d02ea9a31802179c318c701425daf3e69910ac02cf027873bee5a92b67481bfac5109cb3abda724eb7bffa26a6b51cb49746a66d4561d1697eab45865d06033f335c3d2eb2a86ee7b2265a0d7a68f19f20b5a7efe9e59bff514b95361e54faa96c9f77f8967c03f6c50a9b7557b3d74109f77068fd2674976167d0e9ac71465bc6999238192d7696eb7125d32fbc23388d725981cf92c36c54ff378d2971675a1c3601bfda0a8e8594a6e24f14249359b893acca2c9884ac888e34ea9733997820b5178baccd482ba86b54a04ecd524943b8ad7240a3e283a3332e410e5934f92a9145c0978767a38c5292f69bd7cf024591dc005faaa0942ef29093b761d8c830b01a05c5a2633a487bc2f381b9ffdc87d704cb43c073f0b4498c166b64b0b70cc72c9ba78dfce64400306032c4de6e742698649d732dc8b25bdba7ee6b44bd5daf6e9a2101222009c5d6702c1848d5f08dd4f744586ec6b0acdd84e0ea2812cb536f27c66f74a11379405970aac410733b04cf6d293dedab9e4f36a7ece06c736b931d01776a568e7922f7f56d0a179e1839e9d692b7b33c3760b88bc0a91b98d6286bb76eb97e2e6bd1b568b2589b359d0daee8901056589c59464ec705c353e1d08cef004a9513b1fa9fe5fd2c4b8b1ca5e7440e7dc1d52409967d9a53d41844d2814f9a5a7e47769c1881d742817cadb6b3edc1853baae81c6441a10e739a9f4de9072f7fd72a407353954ced43dfa6710fa314a78fccb2adc694d2dcc7c9bb91772ead2614350887db7e21606c0203e797c6ac6f6cfe0ae53cee90677102a6054fd04395d0c9e6b7fe0d4b27a7e3660332e83c4edd7826e0bab96a546a1c2b190fbee2fae2637b02c0c4e88e67a1600a560a14fa3289ffb886d6b533d7a81c6b8f1d51d5cac15463cc5a549c909a16363c235b0db4ea1488de3fe539b351eb4187a3446978cff2d3f800b832e42b6d6f07d5260b2c7c193cf3e6dfedc3561b3f0e5bcac84eac1166fd5a9dcb6640ef393b113dc7f4b28f8a74a3dbad575abb3d1a69644174c519d326b08ac2ea28f404c68b9ec1fec5eb2979e60c15870023063e665d73664d313b04b1deb17ebfc9a10e0af4a91af6acd99db7c5a66942967f8fce693e55ea37de859917dd8ac899a79318c66dd5cb86154475784ad7cbb72fc99081c30de11833f90c1aa5164c415cdf53b15470f9178e4706a430f3efbff836f8aa6582e1294d78d7ce7642474efd411310d1fe3d9c3f904445ca4c0aec211be728323b115ac1dda910682bda64db6e3f6ae221b434ff2dab20c6a9bc7f1b04dd88645d31eae82bb01c1df94e7c92ea642f1f3966377372f96c78c0fd1b384081bc03d377494ffa29819f853c13d663380c48eacef0957374cfb9a3e1b79e755522f2a6c610ef59d7c0e1121c85f42c30b268f65e84552ed977393fc2f62a691c4bff858d30d08e919fb11823fd7402ea6a1833f64b87628ce963821847423d15ecc5d4a3015ca16c92f3e9e8997158c314c6cfe555bff6e95a8cdd40d74b2b935312d70df2415caf28f58f2bfa82a5f794650194133287e96094a44e454d54d90df573fe565efc31232c0f58afe7ea003ce513b4dab631da38338c7ff213f35d2da20fbef4925adc896f24a6f63a60313282d5c8fdf98f8eed09091fb45aec709537127cb93516d4e81d731cf4acb072d5ffbc134ec4e20b7f9dc3335d82b83614ec7d4fbb25a387a63643c5658dc732b4a970067a45d7edc40d0dfa1848ef253fd1feca77e67a7e7ef2c4ae2f7c95d36b1f7bfa1de47f090b41593830f9994ae49bb8a33120bbd9a7cdd879e396786cfc90cff3dd01058b28bfd015fac50ec42a079c58e083716348e64ff6ccde8712b2452ccef6cec1e8bdc66c70a053a8445ecd572fbda2f8d3f884d0aeb01e13fad2b7a26fc4317348dfe2654e21c3f6ab6a4e65211dba30fdd2c1c82976f5c021bded1f511c628ed74ac3ae15cae21ef62c88951313b4fbb156836a8683ef263e9b1b9531f6f912bb466be1d671253ddfd5f59edc5df35946786289ae28109a6c05fca0d0079b3e764b05d4d626bbae0291504cf203f361aadb8f18b3e981de35eaf3c79d071348423aae68851d9f362353e78fe75e8c153226c1fdd8d4819a227f527c052a7f25dfa00b04b8d776bfd4e32dcb5e89bba148137b42039f937995e338ec10aaffcfc4abade74832c47764527f96f0a8da6362d0b39fffcad3b398701bbf4fe11f0393fad7dc15ca1112da661f00eea5689999011af55d06cb84e0d97f3f53e4ba27ed6047058fd45fd639d94e8f7bf2c4717d8eb33c2115589f0e694ac900c10b9f1f686d33cfcc3a110a2fff028a13023190c1d27003ccd7919513f15ae67aefed20821f7527da96265d251148a01b6705f7f8924e11872b945d93ccd2b678be029d58ab98c8bfd9a5be88d8bfe3a395bb001ffec819e76eb70590f1a229679bcb68d8008f3ac8b906133fa60fbf5aeff9a9cd516f0c3c700f4821843811aec8d356b5eacc7dc26e8967cdd47a43298c3d4a19cd0efc85b277791f634f4deca89d0c95a158cc5961c93f597af5d2f4f4fccc2e579bf1fd27e13532421c803ca9312d9a9ee6acbf21719b2bdf2bc5fa81c07f8ca3674c8b70d9274e25823722a8efe51ab5255df78f286eb659563a1729a0ac9ba4db06eebad596da06b04180b3872b49e7c802126d5be85c93b8b9c96245bbefc6246f32a7f58e1f173dfb156a91ab61150b8bf85201a30d0f14192a06bb7b6f6ce3bc71c85b1c7388a4d894e5023ee2e0278d7ffb1153ddf28264daf305b49ee1ab3739548be16e28c70f82c0965b62cfe454f116446ed2d293e36b44bc5ef645d38e4942502db30f37bbb62a4500234e49aeff089e2205e09723c3143b01b5df4ba06fa7ae2807af2941f2392620c2af61a7bcee14d202412770a6849ca883bc5d9baaecae2cae6703282bd2e4aa56954d1a40f294bbfe8865a0fec924c0c0c8b915676ad05977eff83fa98855f9c07f44e40451ffe4e20d80bda97197eaad2d2551fd5dc8448bb3b4faafa35b164a011d69a1dc37355e6b8a32086506f7d0f75305ff9b187d4cfa3685c666ce4e48964316a21583b50cd1b1f3a1c30b6336beb8a6288ce098fd4ec7e31c4d407fa82af518ab8ac5f1393e8bf41e8018462f74afc071d5005c35629c630f13b243fa04ddf41f7dc1cd60d810b28890686b2967b642d1af715eb69743092d8eb18b9e5f8851a033c02d8576f4310c50173637b0b2d2da23b5579a4395bdf69223cba0190010573d2e27d112f14c8eb244ed0ca06f28b9ba5265f8a93218b3b2617989a76a6ac89a39ff826ba46b26d69d70e8f20a174b310205f993cd8201f00355201efa5cd17c8cb542c290c6dc7a945f35c087717d82be19cc010954366e5c2c53db64f7ba4665b5d4232836dbeea1af038c41658b6cf7deb2a4334c77ae7a0a4707db233372068d3f7b85c48a9ac579339497afa157f633c3163532cc03584b542f64f7b11a1cbdfce34e43595cd17c274401a3f7685f985f68060ca44f3e4452911d20b47688b289532bdf22f2df2980c7ed9fe9478ef12d714f31fdcad573a67610a9a6ff3e4d236b4cff774b52c82ad4faa7b2fd5f52265d7b9f46ee85ce30f07a71e23f3de24b8b6482ed0708c98431796fd368c1413ff14ba9334c5e344569ce26eddad7d8ee748abf3d04bfdceb8927ed1d33e8e498e87a46504b0b87fe40380fdfe69610642fd17c5d1d10cb8116a6bc26123ac30c3b164f113feb270fb90d313448da8568d9513cf648d3ac6a8ec378b963a34debbc56c60aa6ae763043ac6e20ac799846fa65847a12774ee791875ca8e57300c5b307d2953a7b31b891107e0e85d6e48afe1620a69872a7a8430e5f5fc05c6e9878142635ae15e3a52d00787ce2e3dbbf79bb016c3083e70e1607ef49f08d638b4b95d0493d228d2e329235800cd7c5f9e3d8760ecb28a18102ef144f22e1d149d044adbcd25951840eb6eb4aadab1c83827cac84aa87687b4fc6af008682f2a149083e41fa797e702cf05b8feb1be41522e40c9da49d53981ca020152be7177e9940eea5a9d31228e4fd0a9fe63545bf7c329e4a9508ec151f932ffc8e92bb2503526540f87200f7c27ea14bde66218509ba3e798e25b3f187e092bfae949b5093ba35310fb83bb17b1a3f53b1e6827a432025a8e777540f5648e008edfb82819fd03b033852d5e2c44d017f9f8a640283a53625ac8d5396280dae9e101e762f2ba35e3812887a0fc891625cb4e669f9cf88e24791deba6fe5f6fbd7291efe3a30cda9cea0b22feaaa938f08160ff50c46a972f4400211d7f47e8902bb6259ecaf59728392cf1dd2bf3b36d9566a0065f167e0bcc498163c19efd4971f7f0e250a009674bf6f1a117f358f94b4783c0883053b2c113604329202b920a439c276f33d551b276a8274afb1abfa331bc6411b2561c5506b0b074bb836d5917c53f94ee32d25e8b0e49280c23f69afdfda72c864c205657487f66406a4524771aa356a00c2f73d73963b3c36cae4b7dc21a66c9cbefa4f9ed5af94b513c18ebd5a405b74cd45417315f546a87638ace1bbdad962cae81f4d81facb8059adf191d5288bcf457a9947a1dde43d6231fc83fb080671139d346a53b0a7a7eb5ce2013044ac60c9f8b00f3bce383f1da0385b9c69a0239b12b9a03798534d59d4b85cdc917520cafda49a8a35ff11cb7106c478be5e2a752edff171e17c6353bbf856c9aab76f29272379bc502ae15365a56d150115c4a1b6008caa01ea00b873701f546ac5d9f67678441363b1457df1eb2e0d278182881dc32c93070743ef5a4835153c912c28f26cd521eccce541bd2893558239c06d0d0b304f1728f1f4ce8afae026cdf571665ccc8dfd131f3b7c499e7c43305f80ad513877f2db149c766851d9748f18d0fd9f4dfd7e510025d9a80bc1b9b4973701c9e827446b2884e3a3b9d4a49f232df1796b63bf27eec93b5b707f325f8ac5d24f0f54965f2a49747417d0f2bf5131fc3898b8ebb48d08930f613bd6e25adc37370e1b80afa5d960b560a138968afb1909bcd980ec17f2ae32cbf05f38a8648233895f705bc75ef0f0d5a40d71cc6e2848e26a634f30cfd87315a256562ce2ea1e424bb200821b039bfb1a5f1a7d3609025c71d77bddf19a89960871203afb5e2f3f184f5d49336ae1ef5bdf64267f488ca13811df0c6b20e362b3be5fa4109e9fa4b7f19bae682bddf34f6017669d7211be939c0fd905148449396279f39f3167a0ab783ded3e2f2dcb2c26ee0df07f5c037d0f3f634f34c16820a580758283af8bc727f3fd71b84130c9da7ae91b34af2b3c95488958a2b08f49ed8807de9bbd45b0213d025f9aff971e8678276d68197f1236451956707bb63c788cc8fb0622344fbcc44e1fb6b9ff3d5083ef58a6498682f22bac35f0a7abb173e8a8e0d3cfb62dcba72fb70b7ee68e4cd17c65fe32b407da7bd992e575ae8083e45f9bbf33d784be28d9a7a19c074a86f9b3a75fd5d65807580f7fd1035e98b4650ec39fc8c6de9afd9f748d67349387149b43480d028b08bcb68894a0862c3ae7ced0c65b12c17004df1a7170ae41eda878d877f634fd289e9c32ad3a75bdec5a436143975bfae59bbea075fd66b47d63565f85111c1c44d6b71f018b5264722fb9f09125e904b94b4853ae93498c9a48640920d1e0554175f6c58753a50d455f78485e289820275d6fc15eb7e34d173df523781197ebd5b83fea5ab6c9d5177a30193ba33d5f7c2815ee88803985b3c0e78bf16dc98b376bacdcbc9ff60d7388b3094bede26c5698a6c8183c9fbea22d811da24aca208f01d28f926a391b432e09876d781765e43277fac6de310cf1d53ecfe8f1b1045a2be80d2e7d718c333348d8588329332b5f58673d9b3cf9015b1115e0b57837512b574c3bb0fe2ccfbca159c7925eb45f3bde6eb9b0f7292e4eca030d36cc5550582c51773460f2b41789d960cb982dab1fa767dc4795bac5b90cce0de24a34eea6209adccaf8911e20a4bde015ef52e4b798af8d53b894e20675b92e3206e21646a80a225e70e08438774b056e8b2747ab4fcd68be61e7af9bd3d6a4e323de111ee83fb644347f9878fbc591e06113b6c4c9aee78034585b71f9bb1f9b97e624f3257f271fff183be4f4a8f6baaa73af0da76889e195525524679417b2dbc05ef86348ea4d870a26449713adac18f0fe82d15f7d1d891d31b2c1d95416f742a050f69bcfe6f794b3923a0cdae984a17d0e1d230669470da3501ce44e8ff7a115a6d144bee357bb01b399bfb595c8cf4fc3223cd277daebc3aa6affcc453b0927210d657e0bbb7bd161941fb5fa2d0e4a3db52f71106f428db1c0b0cd1137c362f3de71c126272d1a45a4c2549bc7292585a5f3bf1e465e8a556d3e80d581b26d3ccc857a5d5e5665e5791659b9e33d1174a19a2e7dece3ded97a165b99c2950a7e106d721bc189707df9681890dfc766e99f5849f24d1fc405cb004ab0bedf60e60a5e7417ceda28af741b9794a40260ed981d22abb492035927198d953cf342bb65ccd0992bac7371a85948edaadca3f14efaa3c6e54b4c05f04ed1fafebd448cdf9723b6d29c0893aa3c4f9e5fbb4b21859eef8229bf825914a9aeea95bab57e4ab92ed400b3adb7d4341ce4a0ccd7e7b521beaef43dff82e4d40c10fff387b6b234cd7628e8567f406eae146ebe3779147e3351a8ddb1feaf5113c85aa297b67c7f627e96bcf5a056d90471d9a6dd2fd9d686d1b49f81ac6554c4d3ff2c97f8e3ad820e27582ef43c0c4a639f4438abc6a247563e5268cdff77d6770a13e30ee2b10f32caddb7d89ec931970fe17226dd658f6977331dad84eddd787c3ea36e27aec5cbb9a36849a7b387e283f88cac5f567470b6aef77e4adb43c42ea887a886b51d70d95567db48c16f79d1f726fae426820ca4b0c1cbf3f10f379592bc01573cef704f093165730e4df9938b142a6dae2e7b81005262734742e2c3ba8d4b14bfe7476b3f57c1dd51eb4adfdbd5e7403256809bf45763bd3d82b7bb87e602dc305ecbe6c7b3eef79ac4ef730b92c11833daae7ea420ea0fc0b0665970f4144bf8e4bf9efd7086644356ae001b24c94ffd6553d9e3ca43c92e7135fa188c93a4d1f3b7e81b1ecde61095120cc500d73c9f71cfc78970dd29922047d06c01fa0b435e7e3079629e040ea2eb4ab2c4e88324d85662aebbe4aa355c3784334f09020139d664225b03d5c463baaab9641088a6742bcb4ef4f52f53de2a6e5c827c47343c93b334abe4dda951f7fb856280c338fe26abb209b2a8c1bf337904b0bcc4a82fc4dffd626c0d7496e3b2aa9a62eabfa958b410438d9c8d555b1b49fedb09ee3ffdd42addc0f19621f772d861769547fec309dda4eed50250bad918ca578183e2c495e6e66872246182b1a6256011ce04b85f23a9a63436e8ae7be2c0feaedbbb14b90e064d4a126d916ef8be2a5cc3beaf9649c1670bbcd58f9b4e4c3b5f0757e708da31c10f8bc92156b5f2fa08e20127213d26d62b62aa9deacc997ee3147142e4ef3316c9f3be0c22e65e602809ab4c53f612b340687b47b97ec54173c81c4dcae90cdf09c2697a0e9912c3fac39efca402f7685ac5787011f6841c2270a145b18d442677014ef71c301c6476c667b513ee4efdb0e50049f6b4c67c2e091962f41c4918e7ab1499123303198412c70b2776102c3628f66badd45cb61950d0033f04b4583f603f107af8a9577c209d7040ecb984cb8b6fd2e895faf1953fa756f3f25bbaaf2b857f82c987aa756768517734ca0056c32b62b6e912e1c9936705d054d0c2adbbaeef01705728aaebdf9467e8f5da50542e2f0e5f0ef0427236b2b7f1651d54c2a21b8d17fe143886f1f3ac902657d1bdddea89b9384a284d794f07028b75fc6d2e8e2b7a99693bfa78bd35af6f0cdca9b3d6641d1239d54a0acbf5e8deaebdf912bd621e1c45a518705c15d67c0fa82b3a80b6829055aa5757d2b19bb8af642e148313f21342d345bd2c6c1a38030ce36ef7e266213d49b4baa0e026fff1297eb2789e217ccc83bfbb7fec4727992c310590027991cef39c169db256ba98831444b5f000b54e35160073eca9e5938ac2a1e518fe42b973d95c9c7beadc7aa3b2fd41eef4b935a38eca110f46ed1e4165769e3b0306c53de93e417a740088dea6d26b01f01aaf5c0c79cde13bc6a05c49a2b5158464cc864f10290f075e9f2c7b8a4101bd1ec6ebea86d6ffbcf12bec2152c067dcf269cbbd29a6e4299f4679f6836c7ea4a851c23ea966fc8233e891120fbb53662fdb2cf3115c02d98bf5a73b77cd5d76d74ebd8dc6330699bb5e81d438205c7434b4ede83d6451fe8656dc6142e39fe0bb7bf273a728194afed03e235e36a44fbc5f5e0f243a07743bccc92a4f71076a47ea77e4a2b74a112fd16e79a4d404df762faa5cbd098ee2d078c6c6f3553f0babeb63de0b5b297c56ddc3bad4164884416c19c02466ffb39ae6026b1c3d80c485293dbf30838e6342d4bd58d5762057c54c9e78dd89bdba941e0ecb7a0b3d625e984e6cc8cea8e419dafc7bd8d419f1aa7bbc9be3dc74320a95d58d8e4e248adb20110e71977f095f534cfde30bb606e4e543ad8f8e96d6324263f75bd1f48e531790ee04e2147251db306af576efb547c6e2024f92d090eca95d4a8cc555e8025ad730cf28d43b194a8774752334981dceec620842df789efc47a10566122e3d14a59cdb3702c7278cad31ee25694a96c091f7e0de45639ec79712ef4e2975d2e05d1e1cb6c1fce534e3b04445c57c36e1f9e9457a98cda2a9022d5a6216ffcc76c48f6c5405c5505dd669847648381f385f2cc0583578e138d2788cbe8b85caa8616f3dc54bbcd09ac239d95c52a40bf77331dbadb16ab1978c0b2d60d2a80271b567415b9e36fc73b42f2294743efbb1aee323b950cac6c7e1e2d5ebc81b4c7ec4d7003e0ca935d25335ef7000b23be03a7482211aa2f49710b828bb953aac5841dc391f68edf1fea9a11fa4f02a1f64ce5a6f34c318fc0fa0f67dc3126473e2259c42d10f8375108c79b6038593034225e49f6c9ae2519b46daf91e2aeddaddddc396c07a3dbe88b8b9b15d7fc8c84a66998cd9b381dd72bc84c4df314cbd2a089531d699a055a8a037199494693dd25e7602ef52d10f54079d649e05e458b363932cf95952c14c86544bb6e1076858e66c1f97cfbf95ca01576dacff77aac70abc55a47dbfe08acb3262e324d5626dfca55b5d315f490519cfd4bfc221933443308e8d4e824ebe3f003323e367208444c3e70875ab7da35c55f5fc2ea9796dd709982786a4ce5cf6624d47de0427480c4388fdf3405e0575e9ab47cc349569504413c942434dc412f9edf17e27842c55b5904cf5e3d67937aeae862b441729ddcad68f1b47c0538ae039c3dbf537b6c150e6233331bc998f3edf3ae005ba64bbc220d559a422a3ae129921b6136a0597e8f4067c0c1957d74b427ce8ccb91fb0ac67143c359b3de876b4b703146f43f69597632a700c6b8471b431592c2ca6f0d1576a05650c2ce08a3dc15026e11fdc8fbc48e253031077eb42af7767e94ea887aa6cfda071b4934eb7f04c433a5e14df5822ad5e46c78a71a930891d5bf8eda43ec197147ac4cffbe51847704cf75f6f8af7245110b5287f865c59b22ff4bb2592530ddde66b5c3899fd93907bc3cb0da033d9bbd900f31449b0614f4d31260f9810b831d99463bd112b6cebc3d5a96fb9aca1513151ee4ab24fef6f319e19ce2448e39d0e2d76111036c64351db0b6a8c4fa6112d86ad2ee5b2a3e3bc32964245ce22c99e2c40ffbc08a4aa141ae1ea727422c4f0d9c3aa7ce7f4f8f648e153c49cb4f9954a9008627c8b80732710b2885717a77958c3a95b16902d996e7a9c459576f486c77bfd5eb034739e29420f06e23ff0470ad5857abd4b1fb2b246d891cde6c95b86e5315490ee954fde68c94696ea6054e1d17f9093e95c9e0da0f6fab942e945b6fb761c57da7648b6eb919255dbdbd441a0f35c567be552bed41bf87f6be210f0325472f22148a0525466260a18181f9b447841c6c30b7810efebedd283fa2a1f9ff27dc1f7c99921fcd5d89d3a706881e3a55d7f50c98672fa41f7ef4de49b6e04aee3f809e51dcec089eafbc78300cc31a2a21683cdf86b162ced51bbbf54498dfef7e97d292039990c8413e1957de7b6b5f6fcaace7a848d0769c127b7500bb6d7379afa61fcdf25af8983f671b1f324ac9d0f4f782dfb0288a1de2ff560e4d78493ee31f32f54f2398f9e2347fca5eda9b3cf4e9d5f44cc981f5a4c3380bc41b2c1bd348be6f709bc6b09d3c6b499364908ec3d8667f04e36025d5c4e98d00b2a03881876a77c1d59309c65349174efac2da2e79d924d9268d2b28653bfb199ef4b00fe42ababb84a311846dfbf711f3ab1196d31c08788070c1ac8895602696e326c4f9cd78c564fd3c77003320cb395c7eefc19fe8beb2a2af6b583c6172ed1f90473a4b279ecfe600513fd1d0ec26e4dae04eaa2b984f1fdec27c2dfc0aa671dc151347b14e088574090ddfe62cd46a51933d5d37e41f7d91ae0dc682258e59493dfa53b94eac8b1faa489a23396ce473bf8d663adc4269f918f1d59333ea64ffa9c0046ca2e57ec7179b4ce33cc0f779cd564628f8c65bae81e376e37d4d9ae08290440b4fff2a8a36a157b6a82c1f0095ac735e9a2ebd7852d0cb17f038acd29e493d9018a32af7ef876b265bdd167d53e1cd17fe7a870e08fc632037aa3802fa4fa01e793ec867d193d10499b2e7efc81d08466c3d4c65902881ff55ad9e765f504b058a5d12fc0ab3f2024e6db56788deba8f2e490ba088b27d17908e5a4bdf446b07354698d1d6747c003593c6d3c860994e290f8e04056eea9b28c0c8a370290abca641d67c6e572f4d610eb71fee3933e2bd7bc5075e15513b2923e4d234b7f81266400ffc3fafb18834f36cc40c79d2f7400d25bb64a9496a00cfabd28162e0230ca8fdaf1b2cceac149707977eea4d622fe6936202e35061b594c453f43c6f893cfc2787aacbe284493734bc8e698947917db3ea263055f4cd5d7bb368c1740780b96b8954e5003d07df70703e7ad25c3824cdb3af6829e0b02e1090eb8c5139db0028baf6ed6d48cfd8305a15ea00211026ae69a173c48a2ea1b494f01096da6e285a3675d4a2feaf590c73e944904251e88e5196476da43ee24cf2971c8172ea306c60f845697282c0f9cd1620d11ec5755b3a04fceb0019d630f5ccff11e44ea76c68c63dded7925ec73f7105c2a7e619859c3594a11a1e06846269cbe5dafe76166827eafe40ea3e475216a55ae9397157093f0158bf1d63c66a263cd7056c88556d6095e03afbac3956320ea4105a2788b19424a4114d9605090b0008790f2d10d5e54b55bdf0fb8df2b8487cfb293b8c519fe0b171c5d55ca27846fbeb6f87a369c192a27c6a105ce7f3ce24b2640f3aaaa158a27244d49eec434795bea32495844b835bd078bd120db7b8563f3aa2ed805dbb5b1dd08aed7bc88e5076a8c830fe63fab9d1de383285b7e876d5085fbacc81d36a734f704c3201092d9578c8458feef0c3b453e0a6bd3647604093fcc8aa09c82877b3127edd4968efb9d498276bff1025cb2f3062d07ea5da172b6ba3528d15ba7da3fd626da60177529d0f22c5101a6c5f179768cfdf07fe8e108f1996aa7ba573c3a9b8f4c48d11b22924b62fbdb2304826a27faa6ab088f6131e0782cd430f2bcae1b553255f030ffacf23e7b19b61b5a5b4710d1689dcde7290ef2c5978f09216419b90e5c339a3f4254213c926f2fdddfde88247ea1bf074526a31dbadc7cf1235140b2eb9fbf85cd5f8472add0818df502ccce557c02859604bf07437e09ec18333e860ecf21e368ffb46b6a8f0cb0161a2291cf77aae9cfdd7e2ad1790f23bb3cba432105dc77b14e5a488e20d7e49485ec3be9bf3166f0cfb25d328348153c239e00bec3a121b39eb390a0d15f00bec02374046117fee593478bca43180bc21e04f2e8723a4ca8812d36fd77aaf9f476200991a58f5776e6860ed77d7daa4564729453474be6f5e83fdc8bb1ab558d063b2bfb3b6238612cabe73c49ff56bfbf580e3c560ce1a42285ee56b448a2c18ad1da8270808d5ae26cbc67dfd56be1c746ea041412b62e474d10ee2640095b15d24184e2bb2503b0acff833a5d7dc98343187ab62802f0b64d96cab72fcfd894051be9d7da115da22d2adbfafb652269e6692b7653aea7ab94b0591f8042bd031115db8090275d0a5726ea56e730c5a191cdf4104698a954533feab2068d3b151c802a073aa039cdccfaa52dbaf07d0918cebc654c3d5ccd94138c23df6dc2efecc3888b949a62adce4691b21c86b2509d5d972d7e01074dc9875665cf49215995c6f635e39376de9a3a08e8a700b285835bb10f2d49f8c3c162b092bf27ac1a592c288c00fae7eb63259b4450e02b9f90e93671c9755d349c3125507fe9438beb7965dea64a67c43189dd6763439e2786b06fa8526a73018fb5ac7fb397a432db7261c8ee833e2d34e62935870a94180d525bbf6e60e0583b08c08c0a79867595f6526d518abfc5af18662eaa5aed9dc23928d37b62fb8cdb64054499da05aa35210a3be9cdef002defef9e598ea2ef900a7987a64ca44cea99ee518fe49afb80519afb50a1ccac0c0d9c2c2cc13aac073be0d2152a0265e811df541c3a4fa89f259e888c90ca2ce9de3da8aaec3867c867cd424dda0a81af8afc971490ca1261764eddada5575563ba12a89efeac03ebe5d6c4484afadac95cfc6dfc5ac6c75971bd334ccfa5574738d6fc8c06d24c71b1873e495c5beb8b90b9bca3716d25a0df27b380610cab26f0052958d0bb43ea5ffe5fb32455879ea9cacc8339597c3871a0fb35930ceff60d003a6e0d33c9fb85432d0b8e6f87a252ad82e8abd2e46a002a8604e86f48de3faf0f31018bacabdbe4f4d3118afbf295a1bafa07f2ed46de0e42cd0780b6da73be78a6009e76945c924468c6e5a559af99fea7d7361fc9010926659e3a18b8e590daf9ce3fd23a86723bfa8a30fd82bfab001b767a6286f41b2b83e529f1a0b494fae1fc0b2cb92086e39391d0298268664c0e72bd627173aba29daf5eb87de516e0248bc99139111690557e59809363e5197649ea3a90828ad7d826bdcab6910a4a5d800490afdf344ac43e828e023c7f0b988849fd04d4569919483ddd6e9f9f872d9fb8556d3be897c01d479a77dc1adc5a265ffb46ba25da5c389372406d45ba764e22b26d5d7d609d9b3889e6cc1cdf14d55b55abb10c7aefecd333f7d14e42da9934ff011fcb2c88021644b104aebac90f25d1890c2691f3ecdc30b19e6d1fbcc928f86cf9855425c22143e9b0d7fe024fa36caac7ef0fe0e69442becb32beb3b12e978b818aa99edb83c20d4416a9d12ea4750f3d6bdcc5dab3288c87526c880a662e99b8eeebe9b7da52696de346765ec5d4545d6d306f6a1b06ad79758aa42b55a695fc4a5ea0bd36ec1d6729faa35bdfe461c71336db68bfc00ccb1833d9f0e48e23b66987f1591cf62961e600a7c116e561180af8da5b7c12f870e146ae73168b054fe3d2c5b156b9348dd87005802eb96a083f8a0b70d94de72386ec4c041d0639f8d9372b986c34ab1e7d44d86f4943ede3e8a54b2a3551f06bb5ca076737c556c766b854ded62043dcf29db4aeed312886e1c9fa17bca0763aebda814eb1be555401be67335085478c1b13aaf34c63296ebd06c3040f67fb56c987b081be2aa380c291d74ed0bb7b7b5ada09b403be99da43e92c1073a6b863ebfeef029a5e7a7798b58521e40b1d34491efb6b14f0fa0ddb76c395a1e7fbb8d426b08f20c8f442eff906c12cffa271418b95c5a22776f8354702917a1715913a03a497e48df19301ce6f16d076e2fd271d8c27b66ec408c93b02c7988d85a9fc45ccf70bb7ea0eaa31706f244b45e25c71708c2562ea8d29c26fe4379ad71d7e855a3d58cc081df2c5099d4396e61b7fcf63ddd7c3d59c0d687ac1f4f745e852a4fa3ca3fcfc3fed939b079e28c342e0d15da60d26566540616f95c9523e1b7a4d68754a1a57981a872b3e9376be0c640da3a1a3680d0519383a2c583253da5c39e50311dedd4db58680f89fe8b5c4630b822fff75e029afa67df416873591c27d322b3f9c39fd05f7b6d411b9a9c9c8f78cb9c0308f3c9cd6db92f51c3eed289a464f77def66597431979a4998ba46109287bcb30a49cecfc11df5d21879288ec0fb72abc3f2cb658953aee566d93c759e99126641b09626b8de26c6f3ec19d24dd7f891dac042c7981190237bc435c5b4ce221a7f219c93784af70fbb54060024c4d5b2c949d74988e58ff66ca75d1e6d3dc78c2f91b9f57776af46c309dd0bef733ccb420b4ac3ea709b925e0415125cf9c9ddac86f1649835bdd2b60617e1d615f98d08acee131a11d85d5084969ff26bd70039ec39a3e3dd64792e20026ba4e8ccbfdd0fc99901ac0f3b0003e6b48404506e055c845542eee1d4bd90d963a5509abe8f87866ba4ca1efc0f19f7eedb4abd71e73e41af1a79d1c55f988ec096831187be5258328ea64f64be11ae9a0253b72e8681af812381ecdd19700e7393c3ec92a6807b7cf1bca0aaa2fb32abdc4487cccce74f0fd46780ff1af8352f6a92d3673051d7e63a414470afa32b31cbbb4c43b67978c59a9bb9f1802a55cde26cdacf4d3fbe6502eb8f96d88e19c263db56e07678e1b80b53e4c209994d6ff643c536d9cf04cc271fe770cc70b9bb657b4faeb24ed29babd59fc066c0aca8fc3da9625aec3a00617a96d88af1d7e0cd9c719d5484b33c597ff761a24a9f777890ebcbdd4a120089e39530a8e5b004b049965ab69cb3410971e4641c20e3d8728f608b2e5b1b0a54b214eac3b5930ae2f966f715d829e9f42674f74b769bb62719757f780d9366dccdb585f2c6ac22eadd02ddc7fabab5b0cdad4ec45090cc2510004046be3b385cf2391496aebff41e30980fcd75cce75ef5fb2b0323aecd1fa938bf335118addbe84eb59848a06f203ea612a79adfd943a5b04dc2c7e573257c1750adf30ec3445d2a8c9360e7cb67a36703d65d2fc3a30da53c1540ebd5b0d4cbd11c07034a94749fb106bb3290eecb1081b821cef21cd05adbdcce4524fca7fe7b27565721afbb267759360de753cb58aa62e0ba5c3688f69778b0967a1ad143cbffb0ab5710e0be5bf5228aebe05434e490384fcca0086c96410c707f41b24b5052ee69c5e95c4076f7c778a619443201d37125e5129b62d00fa3cb51f3d1f63c112a1d2f0d7e7a1c9ff59174555303d0cf1c296345e96fa951b0665ceaa8a940c6f677aca9b4a9ca6b4fdc6b466e7e6baafe64f4e8a9c5a67184aca4a380e5e5a45f51786b104ef8184323b1252b633e5392b028ace24f0d566519d881f8b87a51def3c3ebbd352ba6c176c818ca9954a77a147608491fe3f55ae373d55e8786415128b1a4c931e209187bda109f31f18a38f89fe16ceef9c8864735926ff64a7fd591e2cbb3145b585c9ed27ced2ac88000b5ada406ae50ada1a01ba7c5b346fa74642875ded8ef361cbb7d80f068d0c0243eb82b4c39bd7502c97ef0ab9a6fd86ca2f23a3aa7a144135a754f6fe6deb6cbb7c31bc5d3d894543ce922b90c5103b6b62c0d23030dfb759540c7c515ad8fa65e4723ae4ea7bd00fb797eab856555c83f274b9f8ccb8ee15e555caa601d9923a19fc15702a212b92bacdcb264fdb7122abea8c91017df00bb51a4587f5d92947cc842fc433b5a0373e218ec688f85ffe0469ecaadd80859c7bd7b8559e489e2cf048c2de791170ea9729d831df205ab3ac93fdec04624e18518207f9bbfea7847eb1a5f00df58aec64e9e47e3cefffc6122543fd82933d269394e4f97247b0163e634181ad40f74f1f2b32e2a57d85c72ab504d800ca4339c0d9b30808f510e04ebf27a6df238638eb8dc62a6ba337fba844002088a123a0d37d8788b2275e644dbd1b1f71560de6ebae79b89b888c317eabd7fb09a091182c91669ba25f1ea7ed88cbbc80172feca7af32185acc354b90f35630b004407144b92e9c858f2c3f20a0dde368e233d7cf19b5052abfbbe54342f747db2ff14ab136b73a0bab2cf0fdbc6df378610d5534702256bb23ff78ce713a4194e75e91770e9cd5ed2a7dc513e6bb6b2c53b450b851254ffd763022e1e9b34b93bd7a3d7bfa6abdb7b4adfbb0590a94f35b7947921d2d188ce72676e05bb7a7579b0acd3ed2561d6b2b50a698bc073f7104c71bb5f08c4461158f636e5db617e6ae7ccc823304f9436b5f6e48b9d600ce743d86e98ec88f126315ebd5722feb192a63eba8934da46587f6df9166ffe9b50bc3cbaa1e01a3bf71a76a17a5156637c43fe1fa1b6bd2be6538ea63067531b8a418437ab0e98d86807ff43289e4826e1b7e83a21943af986df6fbd9585800b3f777c51b5935ca110ba59e25a737fb3f7570678f813e864d8f5826f65a75bdc8abdf9e2e627cd0678d0b4949f713647e27796613f487bd49c905aa4f6397386ac22ec51e2defbeba54983b1daa1f5b2cb9327029e203db9c01f9c94a0f0d42b3bd5525ec30b0bc79f40887a515c0a689328f117504896de5c670853ae545aa57d5a36997999478da8e34bc36de00b291125fdc4f2c07f9d47f366267c38523407a26a911c6fca0ef8de34e82b158d518e1d2e6e81ba70a5de2004427aa8e3cea839b93aeb7605536d76cfd974c5bffa69b8bb7e580903780759a710643b769a7d5694bb421647ac75ca2043ecb004f5bb4db59cad1b54b4138379c99dfcf6970a351d58c971132e7deeb2d1a828368ca340f91bfacfa3b1bdd4cd1ac847dd938afd5a8e2ff510e1a27ca85ec2f2b1253fb94b7f8604e2df21bb627108a7be891fbc4cc157d317e58e229c1398b6d1733845282810d6fc3c1321cdd405cbb11a2c2b3999a2a1377d9f5652833ee5c0bc9e0ff668034e448aae198a3e909bfb626ca94c277cf6e08f980fd3c854614a1d0e6a26720069b51eaeb81c7228ce0b7469f4636f1491fdbe02dd45d8d2c46708d92ef4a89828d56744deee1a21d744a4359d839461cd6ae70bc528b2d6ab7a24c4cd380843dea3c771bf3f46aebff65b300e820b1096973ed70fab70e2d4d4721c8715ad226852b011103cb9a166be5dd0ad6a09fc1e0065e41c7139beddc345af113c2183ff2aefa5e4d3691f9f78543d639b4d0b2b0acda10525508c5f3edf2e8c14bedc59cb971bb6c094992950afa25344cf9db3f742bb4f7e9e83da27b72acdaa5d76e3901c3c659a34da8d4fbc16958016dda97f28fa2ee60218eadb71378c7fc5bcd4a03c25717419a38499dc4874e8cbef153e8cb49544cebfc9261cae1545d0ff75a5c433bdeb0ece9ecd909bb150decebaaf8c3fe6a0c060511e35fd9e4b6e2e7282f904d3da78e6d014755a509c85674b235884800332ef15b5b5c7ef1d09ff9fc40da3d2c9ea78b606e34ae1240d4eb2f428a9d0406e4db26bab933ec3f1908d77f9f4361a1b736e2897dc27e74d207aeee1974eb7af6143642db82ba41c8a503f49aee0ede6b3f59f59be5abcf73e52b7f070c0f5fa827134ca41c6964d03a64b0fecd611e5e1fbde4976edd02a699f398d57bc5797d025c7982270a11fe6ce0222cc37e1145f4d8f3aa999b15bbf37547cc2b737427e30101bece8f4b4e852980dd7e4a396b922a873e5898b1679598434ed12f60deb9bc6d1fc7292e83581641b385523f9eab49b0625b52887d65a23d8c241a8d4ddad62d62c81a1988a72650bd81e7fc3a2537e3ad5c48885309e253be80d76366adb3fad7ae26b77014fa41c8fbe4aa091d6171ef67dd6f622e5470532449ee77b110bff873e695c298078c519879e7ad02c5a9c7bc93bd6be8f83afea6f826b64b1ddc70a91da5ad647bdc75f80562ebac477a3a8488f5874fc0f38189f7988abddfae9bddf036e7c33b7c1c9c060e8647c50b71c7463e847e9e3cf3f3e8d68f212965538b7b7a3c4dae7549f788d69399aa1b7184038fc631a314d3401758d74310f5f48d4f740e5272a363aafd1a21395fc00db830268fde14c3777751b334904c7652d785bc62a9030fefaa3d4c4df861ed3cbaa20c2ecbf02232fed9d2c00368965c96d6859e1913a339b5a1f944ee7b2e95706929243b33831ebffcbec5bd3b3f69940fa94b37e74b472c26148937c94fc3d62f9d56791df4c8bee473fc3506329928f9f0e22f1618c423859eef3c63bfa63945b33516680c19792c26d47a4ae93c661f0067ec57311e1ad6fbb0779031b90c6a2cf6e49770d58ac73d623733afe68965fd2ad672ed4f177c57185484bb2400ee0fabdf9998e98ff04be923bddf12d7b408bcd7fdf590c10b19dfab270c6c22eebd10067e3d6dff981b0e35d865601e5bf3b6d3603b977e53d999cea51b363e88617242e705bcfba2ccdbdeffaec7b7fb267ab7c2894c3250073bfa71251fa585f87fcefca31a456b6daf6d182e576964cf909a8e0fa2a5ffc346b5de40e63e9915b33bfdd494166eed5855bc2f422d22d41134fe3aceb367b0a99f1e455acace2c24bf0a3608ecc4f65d6579238c7bc4a1cadab2e03f21ff84d84e8f1f12d2288860c9cca26840e5da47111ec4987606e7c1bbb9dcfb1e28d7b541ba9a3043cf331047b7d9b60db3518aab5cc1c1d99755999252dfbd011bc277283159f3bf0be9a2da97a468f06f48874faad57c6de34dab2093f1da3b066ef7ab44f7f03d178089e13818b8de88fe40ed7496ffc7e87ee3eb6b6fc0ec8ca8443d1393225721af7d2d74b74597733e92d64c2797296a5c348dc47f23f68a23bd98ceaeafcd9f59156e56b5ea1e7144203459ed32e4eb3ab4cafd2034fc0d76507734ff98ac50e5676f6ea13b63fa3766e2995ceac7f8d8c843f05d7a35d8a9285091aa926a8440117649c865db2ca1b007f0912803247edccb91edaa9e45d52723b81f7f4d55d5cf18ca27ae84b58576ef5ebdf20d7c737e0fcf0f679fcec61ae8e5fed4dbf6d218e729c7051d53dce7e78724b5632a75f938fc29dd86b13b4598d5023624c701f631ad5d146cd2df69698c3597bd9ab5ad87ac401e8201d0783c137324447cb87564012f01df469e97fdc5fd8eea9202a70cdc5f1378962c8be9fb0541d5f18464308dd7cbf5a9bed2771168063fab40ab1b9cf0f2b1ccd6c7e076a4fa0f382769ce357d8d1e542eeede2f705c5cab6d48f8830043db60aa5f49b7c338e44a07c234b0c13c6bd72343378b93e3c53f60e4b2fd87ce09a0e4cb40145938af2fe63a5f1e65ed824d2ad2881f0c14a972b7c1c67ffdccbbf04dff8cbb576b9ceddb2e8f414e4f263aeb654e86a4df33966b8c87ea07e95c9d39c5dcffc81e28d495bbd8121453eee373b9e147bcc2bbdea210fa7b46a362ef4b958fab4558184a5cba9ed52f65ca72b2f50d94e93feca26f00ae7b363b3b37539ff5c232913a1d77a398adfe502832b404ee044664096f2ec7ad3828bd105e57fcf16fd2287466ddbbeafffeabb9cb340432522c5cb7b2f7af649fd58df3946a362dbf2ff1218c6449f2b745b510be361201403ae1a6e0aef162a6b948018ab465b53bd558275178ce41d9ca107abfce666cc562f5b5546e2ea1d07b5c05421282ab5f65bbf82b1663d4592a99cc5621c964683a7e597d4995e7ba3b06d9ee0b49fade9b25ab4c2c2a79cc85264ddea9286da4b8a4e511dee8533ab0eb77c016ef302c207803c9220d94a37a1b77adbbb5f5fe5e5b2faf7b174525a0fcb4e17f1d64d3a507649ef1eb9fc7a6e3b654bf880acdb0d55b4157b381f1f9e23ed253f34d70440baa824935dde70467cc26281f95089f0aa59190162b09c5de116881bf2d8ae33471fd2a8b1bda9a15f50f647625218cce5f808d97f462a463239c29a07c1624e15e1208ab215a87e6c94134a577db732501bbac89aebb5e5b8faca85b2ad6755e1ac3c28485169e142dfb488c939d083c8312ad0ce9b72f3fd21d428d0c237280f62b6e387b4c45f83f45c7d8b7496528f623d5f0032bc82e87d886d927f7ea44a36ef04db02b61f76cf330af29a6ea8c895c416559a36c70749672c13817378ec886a5a66d4821861e38bf0f55cd593dde33316637e5968e9d387546b375ef2b90dd63b38aa865a8b9619a6dfd41ab787160af2d5c804fb07cbc5e9bfef547d23ded0b40a714a022788508b29b2065877eaba769e23585d0dbd36b167cc9f463f3ea07d77b37d65a29a1ee6b5c884f11ccfcf9c7d1e708cacedcc5cc881d8b4949b40af6483285b5f2642038563c5b5d667fdb77fd34c2b1439093803e33a44549a76799c2f4bccccd9ddb08dc111775b4ca1dcc58ff27f9b8a5b4df53a911d365635331ed8a8baa44b734bc0e4455943951bc5139180dec0d5d8809902906404c69ca312770265e1f5617ed4a6600eeb305bf18848ce72146633780ccb66ccfff90673eb6988f031a1c5e2b4676ab7fa842e383548661c52997295487ecc2649acf90ea286246257171b98f91736104e0a5e0dcf828cc500fc509d430d140cb39720841e96b14317c9eac68919e8c530588db4aedc81bf731c3f33010d364628d36aef36c1ccb4e29a2aa89f5c2365839dd755340e51800304f6d67a340827bbe2fb04e418a72f029bcb38d0c618f3e35d1d040fe27d2f7baf1d53ef823e96d247ad4a9aba7fdd954c7a57b5ccc674c441f01a2c7d43ea8b732b6c403079e447ef1c97063fbafc8c570c4c66de369568e31bf8ff49c4fa35f2c101da68f752a21551c375c69b81473f0bdaf402946b9288d0ec8a4c6ed7c18833f8f9dcdf397c9ac03aea06558a8bf7c9d2b95b308d9fec29c52dfd14cb0aa01f706d5f7edb02f8c9af691aac8bbb671542b1c2e1f549e7db14080c5120917eb87e7125f5d3ba4f415ddd4cec714b620a61de85492d6ece994f2b0956dd0c62caca5a63475b3274085ee1725b4d3ada2e09ce104f1e7ab2fffa7e616a19603bc0170a76b56cbaccb7ff066d1c401bc19b523bcd592eb3e5eef93d0e6e9a4e1fe69c12037d88a0c8f44ff7ea55b894d185be4a3cc5ae8115cc7e5cbd658add6276fc132a59866f5717179fefd3f8f201f05f1db75ade785259929b7eef9ab222a2648f4bdce33871f8ab050a4c5a0db2105cff71c27c8b95c093db93dbf0bc2939e04f05626f8ed52854cad797bb087fad95f693867f20a884d47177a69653c0cbcd9c465f080d2a97af01b234a6819ef1281b3dfe3f78f23c52beddee3b884c6c6ad13bc302ecf74f40ad5623e4c59626c20bbc7c00d96454a3796f8194775f59dcd0961eee1e1575bcc413dc23ce23b4526abfb22b9c6ce92bcb30ac228cc75b8b94c8cf6edb4b4304ffadd2e3129fb5b1d429d8393c9a6a9c3a6528c66b2184cac72649bdd0548a50c24a8624ce8ef79381889a304d61b0999c18598aca5e1c379192566a34cf4951f9b2fa76eec0e843270a92bdc28b1e4c7ff73e741581299567b80216c67553fd17a98b70ce49fab58e6521ca18223a7d22b817a3027e53f6351c1ccc81a8f54b03870156d81d4b3a1ff9ef95a6180fe761ba34a6282d52a339159c061523004f563c86f1c2ea3d6368dec18534cd2ac21103295b59382f8bc9fa1d2ab23eabc1b5674256870237d93e1e0078b09fbd9f5dc8006bf79bd2b29fe79b6f7c47e782f35ada41d09fcfd3e0e5642d1637f6300a8bbd9d69eb420383ac99116e491c18428a91409d64ee438753d4d5054b46e05305a453391fc750ec92ea6a760cf88be914e6c207df8ed0a1513bd9d7f81fd0952aba012f2537aedee7ea848f0b81e1d5fe28daee6ba74aee5d3a0943abd4f036e11c84386621c53d35d476b7e65eb0c1be5835874c38c9a1f830da6bdef4d9805ab91acd748f2f5d135a2a1d7a8ba750f43fd8fb8c749cf5e9b462e646bd3a2c167ec3bfd15c11cb0c62e77aa73b4a449c9cac2dc167405b373c64bc87f3eb221a91ed79a5ba5b037bd5fe50f004425269e11f50938e0b6269b7bbb610aebaddeb207b8781b51b5d2270d473a0a0ec7a5d450735383409d9a49d4075d1cab3e5f067424834a9de8d5c29dc61ed275e3ad3cdfe5a906a21d8f9db146260388a1cc4bd10b4d7e6043a540d973e3036369eae5c9c227d8bb2c85261d47b944c6f713a3cbdc978e207e5bc4bbdd3a5b982eb8d2429700272d3820012ecafc60201928e8d52079c69596f2d7d64254bc70149a72668efbfd0a22a041b13727cb1c78b82451686ad5cb5538d358e33319f57a347f404ee890afc95c78de2933abdefb3e5c319945aab14c0d2e2c8c8210513df2ec3871709b7604981969bcb131a9378c7df6dfe29d9a9e5dba8108568ad547c6a3f9552e338f8894a95588a4e1aec953e5b33d60d2a254a994b93506b7fc25c6b77b60f9642af43433db60f96336b7ebdb8a59c4a10b120dc45ae3f63a79d6431e3b5bf773d23046f403a0e8616f8bbfde9f0fb74802eb6fcd386ee0f739097c457c345be8490156d1ded846234bbd8370e25de7c1a7f62c6736f641346f22bb06e1e9f75d5c1a02f74bf60651a6c48402c303194d8d36facb48633f837d935fa39295ce65fedb857dbbb499cfed4855e05c544bbf826be9d3261d0e82b545f7c05a47e11b6d23504d895ce1b02b931454b722d88706d637ed11cfe72dca6a667c851e612aaa76360b2c807f6eaf42647bad467d0f3a204c79bdb04b638e52a6126c8fdd9f99e2e77cc47cd5d7383e2694969a7318bda506aeec71ee43fad416722903fcb3fa1205a3178f8ceb44d3f5018356b512cf792698bc77634bdaf125c81ccd683b641362c218e12f2d7b40681e429925a70e6024adcbf7ae83d286398d04daa23a9785262eff58857c167205993d5152b8a813b200e52457f20af11959533f5f266c31e90e16f216d00c0b28f82d227adf6f56b2949d7013fb35333049b03ecea61464d8e9d8764f0f97f68ad89bc5a3dde8d45f46cf2dedc270647c42e3d4ba30e5f0deefa75598568176453757661c173b88577367a1594911ebe590f02910ae895cb7fafa2bbe401aaf59f5f0757f233d8059daa924901464a1f9cf3b06d3123e65c8ea644c2ffc57437a9f35ad0c72078dcbe7181c86a3c9f9df910828a480846ac3398ab9ccafea1340be0617b0ec8332194311e142b7213a99e403c2146a4d208fcf439489477eb541e87a5d7d79bc2cd1056699bc9171cc8301e4a51b615b49668d1ce01739deffb990fc206a9c73f940bde3edc2cf91471b8db59ad5205547daabc83f9216e3a0f0da9770737b2e193761f18947195f5478f4dad3b706117c7dc4909b8ee5a3af3fb5bf25c4c8d3914db47b9d57de0137a87e74d59ab6aa8f0ab7fe195037ef6bca239839efa5bf29423290d9f2e6de63a6673ffb119a08b819066311d88db8b18781d25592d054e336062cfee07a64a24caf0c4c77fdd97459fc6846bb22466601809b95ac72539653486f7d74d990fbbbfcec1ceeee7b7e3d17d6fd59fb4b9471ed65de0254fbd41935e151b5b16843dda5e9fab6b64d0fe52b70c8c553a47f3032dc47ba3cf32ef5a8a30cc71d3ec5ee3aa7b7fb33077763c59dcf1e3def3c76fe4e7c3190ceec1b7cb0fe9824f7cc279b5e28635309d2e1a87780b5846ed451df223ea317ce02fb0a90c8d8f9236a8f3a703b22a733e2ee261e4cf9158ee039dbd6301b611904ca115688a7cc817f3b831c3dc57c656593f67ec83f8162c14befc51241caa54307798c88256750474cccaa7e4c6ad92d0824490c355f38f4bbae67b2b9ce6091d816d87fdce52e5d3d7ef6549407f37c90cf606ac503889159377cb8019bf93f848d4491ec8b730314b12b570445e9ac82a7437493c80ad886f07731089265d551fb2ddaaa7c9b14137d70f0d238833ccf7aa01bb1fad37f396914ec98beb92580ed7123ffb4df06e4bff175f67f4c155ba4524a11787261357e9203abd2359204e11674239ec429997cabef8d483257adbd6780ef25baa03909e76d9fd2e4f31a0b1b3fee725e84547489357845b13c9546cbff907ccb831c4e99d3709dcf7e4dc74e318d8df52513c8626ec644283bb89a1ba2a3d641e45f9399ad0256221217eeaacce79a3e11a9baa42398ea70190ba75bcb9e3192284b8d17755518cebe5a8c1722abb346f7b7ed4ea0d5ed2602839c84d0f8ef6c45031686e40e76b6d463e1f775c873da07935dd97853944fc7cec477c335ce3a2f8ea038ed41c6a6ce502319b4d55c6e63dddb69e28e01a0ae23e55d9440f9970c72443c30d6d3a449bcb535fe714d8b104002c6362868c4c2819e397b1a94f05b2d9e51b354d0cdb00e59d5fd5e1676caaeb4f91552d83c55276d3dc3b3f15b5d10888c17e2d88e34f13e71914a9e47311c29bf19ec259a2db3c47a2ad29633728fc98ee10bb124268909fe54e1f8780cc7e31a7ff0f8b423bf6c16acf096c9eb0116a7feb60fa23cc24c22088b958b2b9788271f5352e0f5251a1d40c1ff1eb0cbf00ed9fbadb2a2f9a0869c68d0df501e0db4d70283094d313fd0daf216454b5036799f28bf466f85f2abba57758dfd8634cbb98074e5dfb6bebdc6b56a87a2b9827e40a03d95a9bf5591dc1d4d4a7f900b735e8c259558c5e5f93b9a5f8210966d94020216d68a70684ad0c382ddef41958f0a2eded7dc1e3f5a1dec7157f572439c4d842e1bcc3a551b346711048eb77d82237b32caa1d7206782d105fce756f74fc2d6222f78ea2b0420f46305d317ab2dcb8797d49d5824cb1f6111dadc8a301ae32a23f9f6494d0d9133b5188c9de1384f1c818358aaf9ece594d785ab5fc958d216b0464382c0548f139050c6d885431f6fc3f1c1d9a198452fef9c77cf0648597a30eef0e8ca7d823d0460996224627b7a0bc46d2a26e178ac4b7780bc30c7d99882203100f1159dc8420f95c80a3cbfa5b19f3d418a4713f4a46a713d40858632b28bb6704acf6411ae76cb8ff7189cdaa5aebf449380994c8ad7d69411de0e2db76dd53ad34631d3cfb07a6950694bf5da2b57527d7db30a99c597691a52f335ca3533f4119c1e34cdef359650d59181a86131ffeff60a8478bee59958524981f58ffeeebc43eca3c5e7f9fb919eb3d60136f639b7b8864c4e57360299af29d16963ff7395b8e9a913cfcdc2ca65ea065cb9bdb1869f275591ef11c17e59e7a9934267e01851147d90bba9ba2dc56b2ce269cf488acbbcd6931236c8ac4cac504e52de83ba228f1809923cf1288e3cf6203c3b08bffa68b2b153e3d7deca2f896f7e6013278bf1a38da7a48a58eaa38fd7aff26a9a08276dee2939a88e6154efa0cf0e0276bff70bd149979301acd655b99ec1db66f25a0bac46433ebf673d05b6c95c152f54fa51e8279e2a37cac3efcb2c70dc82a7f962e939d6c68850dd43b74259b0cf19657e5a9589105da43dbac339938e9b97b019ca0320442369d2f716a7a27c13c2df4195c72ea5bfd8e5567bcb2683647be9a9e4e6d22e3917844fd79187ce47ae7daa1eaccd4e3a9884032f39ba5e588e08c8a18391fc13e9f41952b256c29601f057bd3d3d0d76a3e3892fc1c386e2221398d5ffe2eebea97341dff16c4321044e6c734a448998726edc56e371ea6ed6624789d3b5e2d18fd697bef703246fd9106c16057c369fa915e1fee9837583f3059f6e14d37a3c3244e9c7db0a6018f40190bb03df699ac07bfb48b2cf490c819cba0f8c54041b687f702258f9ef611d43bc499a5fd54f9195fd06d4277ebee605fb7bdf8b680b88a978ad8922d70699b0525c085231876e0fd5e7d11de32f05181455d06875833fe0db35eeaf609d57afd3f85089d39ce69465614cd5f9e1b475214ca4d5d43a77b93d8740cd60b256bf8f3bdf718b1a38956c852ae5502bfc846d98728930bf0f89ed5d3a0be3e1887b5c3032183f19e9e64fa22788509efb4db671d8f42e2462a37b40e369ac25dc3b76ddcc594d6733c3c1308740d4b3fef1febb89fe32a34065320b02c6881e4d2d62d00da6ca411dad5d01a2aecde052d97aa126c371a110b2a387af58fb9d8d62bdcb0997cdc1480275088bdfd95b7e0355dc05086d17167a3ceb7ad10ba65fada5086bb47792feac6428fe4f2bf6f12734308893efaf8e86541b4db302a8e7d7405f84b6e4d4aaa246907cd40da4a37b61d908d80459c0c931ce37499e3ac23094c672686bf1e3bba4485d40023ebd64c84758a1a01e7813321b2cb52956e75ff00d918fd7a29475fc91add8a1ab1bc45ce4a2039d4041ca32996c9281916f37bed2fa233b7ba084eb2110996caa59ae646fa4d346c72e007dafb7534f8aeafd3221d78546f70ff0b1835118c14bf310b613c40054da80c6f3786898787844e437e4cc7085f6b1f78ee9f67e2ded03bff12d9ad25b88abbc55d59a7a71c8b704a51aa9ef06e9093f22954cb514fff3a749e11226bc32d1dda8ac6b68a087c43de5885d03aece839bcfcf41ecd12e5aa66f819ea001247a1ef399ce32828b58a077bc1fd1d7597997e8d1219c022ca1f975ae368a694f083a5a40d334037410403a679822bed0c2f569c6f31bb1fecd8a78b99e469f6892ed5a7a48dcac6523d33a4b95d9e23c1b3401f3fd147ccbc072eb84100a45f359917aa09484b4df5279f0a03b6f9ffc77ff964f548f42ce067e080a6a7f9e64666640813e9e772976a4e1962b8428090780d3e1c92959f21cc3b8733d8b236f77871470222aa0717c1d7e40b34f44c817896629a15478cfcaae13b6a0cd7f2da79774b0108ae1c992e89491a2d8c307055bcfaa7659e3cc22878f375270526f19e895623ebc2bff53b119c7452f78d8f81b11760885c3b4f93755ddca27613a9248034df413d5f777225abb97d9dab2f9348b9d56c6f"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ok", + "step": 0, + "verdicts": { + "signature": "F4", + "seal": "S0", + "lines": [ + "Firmado con la clave dkauthor1jtf6s2c7ywr6scx40jhye32sj82rjp8a6cj7f54jsh36rd96vaqqcg54xg. No prueba quién la tiene." + ] + } + }, + { + "name": "the public note changed in PUBLIC_HEADER", + "spec": true, + "dkc": { + "base": "format3_note.dkc", + "edits": [ + [184, 1, "6e"] + ] + }, + "release": { + "round": 1000, + "signature": "b44679b9a59af2ec876b1a6b1ad52ea9b1615fc3982b19576350f93447cb1125e342b73a8dd2bacbe47e4b6b63ed5e39" + }, + "now": "2023-08-23T15:59:24Z", + "registry": "default", + "network": true, + "frozen": false, + "error": "ERR_HEADER_BINDING", + "step": 15 + }, { "name": "format 3 time_only relabeled format 1", "spec": false, diff --git a/testdata/vectors/note.json b/testdata/vectors/note.json new file mode 100644 index 0000000..afaac31 --- /dev/null +++ b/testdata/vectors/note.json @@ -0,0 +1,98 @@ +{ + "spec": "0.11", + "description": "The data of the public note, datekeys.note version 1 in the noncritical array of PUBLIC_HEADER (spec §24.1): the text in UTF-8, from 1 to 1024 bytes, that meets the rules of the declared author of §29.6. See testdata/README.md.", + "notes": [ + { + "name": "a note", + "data": "4361727461732064656c207669616a652061204c6973626f61", + "result": "ok" + }, + { + "name": "letters that are not ASCII and an emoji", + "data": "c391616e64c3ba2c2061c3b16f203230323620f09f8c8d", + "result": "ok" + }, + { + "name": "1024 bytes", + "data": "61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "result": "ok" + }, + { + "name": "an emoji with VS16, which the whitelist admits", + "data": "e29da4efb88f", + "result": "ok" + }, + { + "name": "no byte", + "data": "", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note of 0 bytes, not 1 to 1024" + }, + { + "name": "1025 bytes", + "data": "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note of 1025 bytes, not 1 to 1024" + }, + { + "name": "a tab", + "data": "610962", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: control U+0009 in the declared author" + }, + { + "name": "a line feed", + "data": "610a62", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: control U+000A in the declared author" + }, + { + "name": "a space at the start", + "data": "2061", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: the declared author starts or ends with U+0020" + }, + { + "name": "a space at the end", + "data": "6120", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: the declared author starts or ends with U+0020" + }, + { + "name": "a bidi override", + "data": "61e280ae62", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: bidirectional control U+202E" + }, + { + "name": "a zero width space, ignorable", + "data": "61e2808b62", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: invisible U+200B" + }, + { + "name": "a byte order mark at the start", + "data": "efbbbf486f6c61", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: byte order mark U+FEFF" + }, + { + "name": "a byte that is not UTF-8", + "data": "61ff", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that is not valid UTF-8" + }, + { + "name": "the UTF-8 of a lone surrogate", + "data": "eda080", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that is not valid UTF-8" + }, + { + "name": "a noncharacter", + "data": "61efbfbe62", + "result": "ERR_EXTENSION_DATA_INVALID", + "detail": "a public note that breaks the rules of text: text: noncharacter U+FFFE" + } + ] +} diff --git a/testdata/vectors/security.json b/testdata/vectors/security.json index 640137d..f1bb4fc 100644 --- a/testdata/vectors/security.json +++ b/testdata/vectors/security.json @@ -1,132 +1,237 @@ { "spec": "0.11", - "description": "SECURITY_CBOR of format 3, exactly its SECURITY_LEN bytes, and the verdicts of the signature and of the seal (spec §29.3, §29.7), generated by the reference implementation, which implements no alg and no seal_type. See testdata/README.md.", + "description": "SECURITY_CBOR of format 3, exactly its SECURITY_LEN bytes, the verdicts of the signature and of the seal in the context of the file, and their lines (spec §29.3, §29.7, §29.9). See testdata/README.md.", + "context": { + "control_commit": "0101010101010101010101010101010101010101010101010101010101010101", + "head_digest": "0202020202020202020202020202020202020202020202020202020202020202", + "round_time": "2030-01-01T00:00:00Z" + }, "vectors": [ { "name": "empty, as writers of this version write it", "hex": "a20071646174656b6579732d73656375726974790101", "signature": "F0", - "seal": "S0" + "seal": "S0", + "lines": [ + "Sin firma de autor." + ] }, { - "name": "a signature of alg 1", + "name": "a signature of alg 1 that does not verify: its S has bits above 252", "hex": "a30071646174656b6579732d73656375726974790101025869a30001015820111111111111111111111111111111111111111111111111111111111111111102584022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", + "signature": "F2", + "seal": "S0", + "lines": [ + "La firma no corresponde a este contenido." + ] + }, + { + "name": "a signature of alg 1 that verifies", + "hex": "a30071646174656b6579732d73656375726974790101025869a30001015820c1f26f2fe7a8b5046cadaea50cfd6f1c9eba22a77d964d84cdc9843d98057a0902584099e44f44384abbffd3c0853ce1b3841b89f0677152342210b619c1612707f11fe3b1213d135030fecf018f0c06aa7bc4b170028be79038cf5abd2c3d2ff39900", + "signature": "F4", + "seal": "S0", + "lines": [ + "Firmado con la clave dkauthor1c8ex7tl84z6sgm9d46jselt0rj0t5g480ktympxdexzrmxq90gysk64cx5. No prueba quién la tiene." + ] + }, + { + "name": "a signature of alg 4294967295, reserved for tests", + "hex": "a30071646174656b6579732d7365637572697479010102586da3001affffffff015820111111111111111111111111111111111111111111111111111111111111111102584022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", "signature": "F1", - "seal": "S0" + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "a seal of seal_type 1", + "name": "a seal of seal_type 1, reserved", "hex": "a30071646174656b6579732d73656375726974790101035826a200010158203333333333333333333333333333333333333333333333333333333333333333", "signature": "F0", - "seal": "S1" + "seal": "S1", + "lines": [ + "Sin firma de autor.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] }, { - "name": "a seal of seal_type 2, RFC 3161", + "name": "a seal of seal_type 2 whose token is not DER", "hex": "a30071646174656b6579732d73656375726974790101035826a200020158203333333333333333333333333333333333333333333333333333333333333333", "signature": "F0", - "seal": "S1" + "seal": "S2", + "lines": [ + "Sin firma de autor.", + "El sello de tiempo es ilegible: no prueba nada." + ] }, { - "name": "a seal of seal_type 3, OpenTimestamps", + "name": "a seal of seal_type 3, which no version defines", "hex": "a30071646174656b6579732d73656375726974790101035826a200030158203333333333333333333333333333333333333333333333333333333333333333", "signature": "F0", - "seal": "S1" + "seal": "S1", + "lines": [ + "Sin firma de autor.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] }, { - "name": "a signature and a seal", + "name": "a seal of seal_type 4294967295, reserved for tests", + "hex": "a30071646174656b6579732d7365637572697479010103582aa2001affffffff0158203333333333333333333333333333333333333333333333333333333333333333", + "signature": "F0", + "seal": "S1", + "lines": [ + "Sin firma de autor.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] + }, + { + "name": "a signature that does not verify and a seal of seal_type 1", "hex": "a40071646174656b6579732d73656375726974790101025869a30001015820111111111111111111111111111111111111111111111111111111111111111102584022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222035826a200010158203333333333333333333333333333333333333333333333333333333333333333", - "signature": "F1", - "seal": "S1" + "signature": "F2", + "seal": "S1", + "lines": [ + "La firma no corresponde a este contenido.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] }, { "name": "a signature of alg 0, and the seal intact", "hex": "a40071646174656b6579732d73656375726974790101025849a3000001582011111111111111111111111111111111111111111111111111111111111111110258202222222222222222222222222222222222222222222222222222222222222222035826a200010158203333333333333333333333333333333333333333333333333333333333333333", "signature": "F1", - "seal": "S1" + "seal": "S1", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] }, { "name": "a signature with an empty key, and the seal intact", "hex": "a40071646174656b6579732d73656375726974790101025828a3000101400258202222222222222222222222222222222222222222222222222222222222222222035826a200010158203333333333333333333333333333333333333333333333333333333333333333", "signature": "F1", - "seal": "S1" + "seal": "S1", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] }, { "name": "a signature that is not CBOR", "hex": "a30071646174656b6579732d736563757269747901010241ff", "signature": "F1", - "seal": "S0" + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { "name": "a signature with a byte more", "hex": "a30071646174656b6579732d7365637572697479010102586aa3000101582011111111111111111111111111111111111111111111111111111111111111110258402222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222200", "signature": "F1", - "seal": "S0" + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { "name": "a seal of seal_type 0", "hex": "a30071646174656b6579732d73656375726974790101035826a200000158203333333333333333333333333333333333333333333333333333333333333333", "signature": "F0", - "seal": "S2" + "seal": "S2", + "lines": [ + "Sin firma de autor.", + "El sello de tiempo es ilegible: no prueba nada." + ] }, { "name": "a seal that breaks its schema, with an unknown seal_type", "hex": "a30071646174656b6579732d73656375726974790101035829a300186301582033333333333333333333333333333333333333333333333333333333333333330200", "signature": "F0", - "seal": "S2" + "seal": "S2", + "lines": [ + "Sin firma de autor.", + "El sello de tiempo es ilegible: no prueba nada." + ] }, { "name": "a seal that is not CBOR", "hex": "a30071646174656b6579732d736563757269747901010341ff", "signature": "F0", - "seal": "S2" + "seal": "S2", + "lines": [ + "Sin firma de autor.", + "El sello de tiempo es ilegible: no prueba nada." + ] }, { "name": "key 2 that is not a byte string", "hex": "a30071646174656b6579732d7365637572697479010102a10001", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "key 2 that is an empty byte string", "hex": "a30071646174656b6579732d736563757269747901010240", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "an unknown key 4", "hex": "a30071646174656b6579732d73656375726974790101044101", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "a byte more after the map", "hex": "a20071646174656b6579732d7365637572697479010100", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "version 2", "hex": "a20071646174656b6579732d73656375726974790102", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "the type tag of the head", "hex": "a2006d646174656b6579732d686561640101", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "keys 2 and 3 out of order", "hex": "a40071646174656b6579732d73656375726974790101035826a200010158203333333333333333333333333333333333333333333333333333333333333333025869a30001015820111111111111111111111111111111111111111111111111111111111111111102584022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] }, { "name": "an array", "hex": "8271646174656b6579732d736563757269747901", "signature": "X", - "seal": "X" + "seal": "X", + "lines": [ + "No se han podido comprobar la firma ni el sello: trátala como no firmada y sin fecha probada." + ] } ] } diff --git a/testdata/vectors/security_cms.json b/testdata/vectors/security_cms.json index 74f8958..ff3c0a0 100644 --- a/testdata/vectors/security_cms.json +++ b/testdata/vectors/security_cms.json @@ -1,10 +1,10 @@ { - "description": "SECURITY_CBOR with an author signature of alg 2 or a time seal of seal_type 2, its context and the verdicts of spec v0.11 29.7, 29.10 and 29.11. Certificates and tokens are made once with test keys and the file is frozen. See testdata/README.md.", + "description": "SECURITY_CBOR with an author signature of alg 2 or a time seal of seal_type 2, the context of its capsule, and the verdicts, the result of each signer and the lines of spec v0.12 29.7, 29.10 and 29.11. Certificates and tokens are made once with test keys and the file is frozen. See testdata/README.md.", "spec": "0.11", "cases": [ { - "name": "alg 2: two signers, each sealed before the round time", - "security_cbor": "a30071646174656b6579732d7365637572697479010102590f61a3000201584582582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc582046218f3323671ebac0c2383e2382322e0a05624f864841d69933d9651b76113902590f1230820f0e06092a864886f70d010702a0820eff30820efb020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e430820306308201eea0030201020208193a2a79e27fbc66300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100e3755ca7fd01a67483239a8cf4ed8c0046683ce30f7ff4b1850d9fb62775a9317ed98ef3655024ff23da46fd710cfb864146d87fb43b3cb77f910bddfbb84c2d26d74ca4059002e3bbfcc5322d03201b1fa9314edc683cb267b7ffb7c3cae0784b6c7ded5211c7ed2ce59f4412f5a709d9549303f5235aca2c4e15512a7daa45d360d75f6aaa112eae1218329fb370d411d39785254d1f034751c940bf01876e0abee9dcf28bd7fe9864b9587848bdf606b5b9ba2f2ead6ae0e7bb28f2c3a727aa4d358af65d6a0e1251258184f6fc5bc2e4211fc5d84cdfc7f8b82a1a3c7ea44be1f4e475d6f3f6fef80459d97481fe89e6b9320c1b47916722293bca3241e90203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101003c5778f609c3e7755e03614c0d14720257e98aca07dd96cad905cc9c0ecf07baf165844fbb75f075821a385259e9341347d54065d02504bed0d1481dcb349144e9a859f4105e16ce37b3aba616a086051cf6df62d7736c286ca3c9bd220ef7a0619ecb8cea10ae0253911922ed5efdddaa0105b231782d5529dc59749665439c2b213897706ae621120dfb449576a10ecf43e87a175a7f737f1fecdbd3b89ba3e7f29553b515c6a632136b70ebac0b2015cce0931dc3f548bf51ec10a6ac9dbe9c757505ec3a8effe70d862d912210f28ff5f4a25a8d6b862db9a784d78ad2324d0abd5b6b4dd4524469549b2098834491385ff8dfd11345790a1610bbb48e2d31820a4e308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e243989a6cc0f8dd3048764de75c6849ea1dde4e74226f09bf6c182c449a3a493037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d04030204473045022100e985ff316ee456c61378ea1ea48c67da0dfa3bb71be5a252f372d24850a71d5d02204ac5759b9daab6efa5a1d3864db7747a9d3daa55bdaaf0e15305f7d21bd19d03a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e976abf3318fce3ff4fea8cdbd2b92aea1544e560de862b3e2c90dcd2b83cbaa02012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204209d0a3a3e4112f315d650b827cc04b4a9b631201488076f91d605914108ba9d09300a06082a8648ce3d040302044630440220141c329e9fb6079d97ccbd69f3bf737ff466c4b2dcd36727d6193089338f18d302203e9e317eaec54f7716d78905663f287595cd3bbf8c0570c30f505b5b4ea2f9bf30820583020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208193a2a79e27fbc66300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e243989a6cc0f8dd3048764de75c6849ea1dde4e74226f09bf6c182c449a3a493037060b2a864886f70d010910022f3128302630243022042046218f3323671ebac0c2383e2382322e0a05624f864841d69933d9651b761139300d06092a864886f70d01010105000482010008cd9f2444946f21c6027271b61ab2a978c16103f32afd8e108ef61766a500e13fb93a17b0514e843559ab3ac97f4203bc019f048e9219f2005c0c5dd8226743cc5b28a266693700f580d04802acba95a71c57f408524737d42c08f2df0b282ad57dd940788902b49e1e3aad5434b381181b575f689eb4e67f3d6c9f6af66b87821529b30ddacaaef7cd9ed7ee20907eadddf1ceb7f35f31e1c7e5b0c52cf2c0dda17f0fee656e2bffdb3d571642d10e7e76fce44f9b8810ddf89ae0b5bb3114ec39ccdc6a72d248fb55040a29c10b854c79893195560359c1a369f2d81c5507850717e7a69921d34283365216dab0e8d9fdb55cbd985934754ca6ca435bb356a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203133909689be7b6e7f3a635f7628c1dd502b72b770090e5484b9a30563b9579302012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d0109043122042002c0ae1862d888d856794a82163f419ffa4eb371ceea06e3ac96d088e2e99b71300a06082a8648ce3d0403020447304502202bf0294f2c65f11243655691bfda067e717feab0cc7a94ee8a2996c89d6f6b34022100afabbc3e20527df993f954c9dbf756f1b2a8fa0552fe4d9605152f0d5f8e0ad2", + "name": "alg 2: two signers, each sealed before the round time: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590f5fa3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d315820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba02590f1030820f0c06092a864886f70d010702a0820efd30820ef9020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b131820a4c308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022072d9da1232fcc8e95b949f381c5b7d03853fd4f29a9858c51f6ef1bec291826a022100f4a5b33a4dc0a38e693e4b95658fc00aebc5e1d022c707270693cafb847091e4a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420c3dd50f58d0927db105326e2d252c0e3b98f3f202e5fd863c27d5c9e07ffe06802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420fcfe6f18f0034524eaba8ca21bd499b0d6f5c3172f0f6dae2abc6a960b1f94ca300a06082a8648ce3d040302044730450221008d2ed035eae96a568de4c13c27dca202802919a37e6c3165787691e83595654602207f846954bc5e20b3c30f82a598e6ef704e0413428b42e2a811d6bff3c384d95630820581020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d010101050004820100142182e679a9044c5af50daa3faa26c2fc96f8a74e6ef3dd1cb14cdd3760661db00333ef361eb66da29151fc5d5d435de2d7b493332a59ca728ea7a69e8d9b6ef348bf10d1ac0c3d38dc19b88f2e38eea9f796072724698a6c4e0ff730b4abc9fa411deef8ebdf86ab0c5b40214d734956d9887e599ade56b2d5437cea9ad0d9ca62a9505f6a2cc85348d8468245718d14b79279b3865587ca213ebc0039d42e89f91df852091df32fe55e58589538f87f4b71a207cf2fb1d2fb12c8c2cd9d695a242ee7d16430e75527d8ad3d7937718a9da0d4a1534a78e0692e0fb0482fa0541458f78a38d1af28ebf5e65ad7d8ec7cd5f97fc1450aab545d47ec090fb266a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420eb258f2b2a7040cccd1a2fa0291bad8be5ff485216bd475a60af8c7d39d4263602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205c352555e91a6537702c0bc8faaba6c173900d5c369f7466e74184661de6dee5300a06082a8648ce3d0403020446304402202e4cbb4c19a381e00715ca1b94a215f10eb4cad3eb3207a8de95008afeca92a9022064aa9d6133a3b29d0530c19990caf4d72d33f942563af1147312caadcddbef1a", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", @@ -27,11 +27,17 @@ "seal_time": "2026-09-30T12:00:00Z", "before_round_time": true } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López», «Luis Gómez». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Luis Gómez» (emisor según su certificado: «Luis Gómez»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." ] }, { - "name": "alg 2: a seal after the round time proves nothing before it", - "security_cbor": "a30071646174656b6579732d73656375726974790101025906b0a3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc025906833082067f06092a864886f70d010702a08206703082066c020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4318204c9308204c50201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d04030204473045022100f4e2b82dc6b1429bb433247b34fb25a907a086ae34b602f65bf84c419b14bbec02203fd119c23b1dc005258bfb0d16ef7efc487f948e9dc7b9b6d7b5d33eb6aac167a182039a30820396060b2a864886f70d010910020e318203853082038106092a864886f70d010702a08203723082036e020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203fa6e3f4031d5ad633dce60408c4c63aafb6af2d65f7a0cebb9f286c8c961d3e02012a180f32303330303130313031303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d01090431220420acc298b6d7077397d13950532815d76c9b30a39aaf67312f460f77550a67ab54300a06082a8648ce3d04030204483046022100e265c660c3bb8be16a524b8e8bd7849f45c0101ec5ae9a3f94605c3b095e8fb9022100c616fb16ad2a70bcc30b34ccb6dbb598a3a415472106d449c29f207537e93f8f", + "name": "alg 2: sealed after the round time: F6, not before the opening date", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906ada3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402207b418c09599dfbfd508812bfefd54fd607b0ae7933e52d553a1373cf1db449b902202eb112dddd1015315da9eecb215119dd9aa701504c9b8ca2ba25c59bda11a1a2a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042093d6b632991416ecc364af6c2c4c03c8c49e25be63e49bd43f15af842020b96202012a180f32303330303130313031303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200ead51f5839c61b45ca2bf5177fa1f03d265bf707342bbad9e05a750158f5b10300a06082a8648ce3d0403020447304502206c4395595930949338acc25fca2c31cb17c36c475afe064fc4b577c532984add022100ec32085b2b7b6c7ddd195c0eac42679229e2531d0992a7b7b47b4d22b480a13e", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", @@ -47,11 +53,39 @@ "seal_time": "2030-01-01T01:00:00Z", "before_round_time": false } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2030-01-01T01:00:00Z, no antes de la fecha de apertura." + ] + }, + { + "name": "alg 2: t plus the accuracy of the seal equals the round time: F6, not before the opening date", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906aea3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906813082067d06092a864886f70d010702a082066e3082066a020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d040302044830460221009fbefa9d8e1c5f13960f41c1153c7ec458462d96787c66cf3455a32fc1e050d6022100fa62539eeaa797568a7dfa6f39f670d51628e9a7f62cc7b1b925a430d3fe2fcea182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e9c6c85e87da589abfc28382eaef7d4f2645728833e187466ba82f66b3f6faf002012a180f32303239313233313233353935395a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420fcc65d864f7ab71ba20c004dcef24a9fd3527d38d9e944fdde2c578bb4b9acfa300a06082a8648ce3d04030204463044022074051f1b87bff6c5edb10d0bbf7d13b831bcf97abbc85710565a13801432e603022035ec40364c4e81671977cd57e8e4b37d6474dd23b85fb082451fbc52319569dd", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2029-12-31T23:59:59Z", + "before_round_time": false + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2029-12-31T23:59:59Z, no antes de la fecha de apertura." ] }, { - "name": "alg 2: a signer who is not required shows apart", - "security_cbor": "a30071646174656b6579732d7365637572697479010102590d37a3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc02590d0a30820d0606092a864886f70d010702a0820cf730820cf3020101310d300b0609608648016503040201300b06092a864886f70d010701a0820323308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4308201a330820128a003020102020835a4deccdaab6ba3300a06082a8648ce3d040303302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f301e170d3230303130313030303030305a170d3430303130313030303030305a302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f3076301006072a8648ce3d020106052b81040022036200043385b3174e9de495aad288fd3549a386e2187016abdfbc3deb2f2ed314c72eb6dd930cd70aa5c1d7137bf4e66fd459874b391883d01c0d53815dfe7fa2fbf291f64972d69b8a9d81e172cb78ac6d353e54a097d8f07112950f85cc2c140fea1ea321301f300e0603551d0f0101ff040403020780300d0603551d0e040604044f74726f300a06082a8648ce3d0403030369003066023100d171c2da04ba594e86a73a57adbd9b20f75d8785464b718334adbfa5bb268812ee6f881b96dbd12172fda26ce2213e2e023100fb198badb7b2fa34ff4d71c689c453e0ba93ea31192b6bb486be6385718ef7b95933af58748ad2a5e998214a527c2a92318209a9308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d04030204473045022100e7458b88374bd0ca99f4b2b443bc82ffac1718c5aa2d8aef2d381e665e2f2314022076ada20a1e1181febe5c531f34a05f98594b2c072f45c0c52ea4c34fcbf18640a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104204997b27370ce829613415dfa4dc4edb0e309cf1c166c2c94fb4a839020a496ce02012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d0109043122042075eadf0db2015273d67c2bc8a6649061d1275903fe2fa96e17bc60ff4490fdb0300a06082a8648ce3d0403020446304402206361a04ec1f1142b6ee695db78dfad8bd6abe1012ef294b10fa768e20f9b9d8f022038c21706cb8f1d59af7ea3096ac1560077d8882b8bf929f169928341fef7a805308204de0201013033302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f020835a4deccdaab6ba3300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042088dce787be2d37c7b7b8be2a37e7268b20d60f98cd2e69431bf660619ae1bf59300a06082a8648ce3d04030204673065023100e9b4dff00534a57117ddb1e618364ecd99bc49acc15f430cd580931bef35658c583827941b1a90679cc2de9dd215c16d023004858dba8c4f71f0dcca26f4b48cb8c549273905c5e0e9acc1ee21b02abc9277f65202f92ba4e80206bfaaff2b799238a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104201d41f0fd23c7965e32d4dadbb85e6f8132c2174442a93442b7b01b9a284ddfdf02012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d01090431220420f386d364fed4b4c3d4a2a0cc1d15fe9698f0c336a81dd847e13af387291d3218300a06082a8648ce3d040302044730450221008cd1e5b7216fd5865ae9ca2f58007b115ef41f871efe25fee66a71f152c4c7c102201cd7968a591709b980c1c18cc16a31c545efd5da054f5d2554be217cd4d4dae0", + "name": "alg 2: a signer who is not required shows apart and does not count: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590d36a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590d0930820d0506092a864886f70d010702a0820cf630820cf2020101310d300b0609608648016503040201300b06092a864886f70d010701a0820321308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c308201a130820128a00302010202083e653f571d5d0582300a06082a8648ce3d040303302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f301e170d3230303130313030303030305a170d3430303130313030303030305a302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f3076301006072a8648ce3d020106052b8104002203620004f8274cdaf3627a9af9cc1943b349b927b99ee53e36e434ed9015b0862fe181a36f87ecacf8403e15a9addbf2013d970f59cdc0dc3488bfa2dbfc300cc7e834a18f192eb1b484457755d7cb13854d0d03d60009bbb26a6a85a4a9e3129ffc3f0ea321301f300e0603551d0f0101ff040403020780300d0603551d0e040604044f74726f300a06082a8648ce3d040303036700306402301072926087d3aa69b3ff18d2d21504e9f56eb5afdc8d1726b264690cdb4f5613acba445ddc7ab2231cb13596ea15fe9502304eec23aa156868ef1b6212a8573d056d008efbc160b96fcc8493a0bde0e0d16dafa863ff3b1b31bb3f45a6249e21bad5318209aa308204c50201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d040302044830460221009d3eaeaa8b46c5ed521b30383530e78708f24c25dfec138582a37f3fdd20641e022100fcb0b1bfc7f4ba0200905af42eb7eb01f76e0c7d3ed29aaf789eb52765ba1fcda182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420cbebe8af22982238ae1036db7b72fc5b490eb69a715d62a0088c500a00231d0e02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205c8deed3110faa54bcf414e53d3fd22425d6285dd56b7ab3a143702f3b8e8182300a06082a8648ce3d04030204483046022100a29e27ba0cca9b00ecad2e59584f1a97f28a66d7a7b6bda432ef79d114dd6c0f022100fc5c1b3d6643b3a4714ebd84db0396efdeab09c36bc4c93f5de4c565cddcd8a4308204dd0201013033302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f02083e653f571d5d0582300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f312830263024302204202f9d88f4d07a3853fd9d529d47d19999d67f17602578713b370e9d437a765bf0300a06082a8648ce3d04030204673065023052584d7f2e10ffdc8002657b5e33dcc6a5c6e2d08cc333a7d71022875cfbce7ebdff1e34c0abfcedefbf12d0c02a6b14023100f5a5d4d322b28e4752f45fd2c27fa83ad753d5fa6e9b44b4b9dcb4a894f061e99c8422a6a76aa8b9e27f8ef0b08e38a9a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e487d27588cfcbe06e9105d4f37d5e805bce78113663705c1e6aec05e73f8c9d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200ef84f91b09da53c17c9d0f76563843d705fba2afeda516f0711901ce2e16111300a06082a8648ce3d04030204473045022100b8965022d1347cebfab46a1d0e658889793a0a32292042d629d18a17630bd0660220579e15f62ec1367a46ec1915b5abf981913ace66d40ec125ad340f82d4c740c3", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", @@ -76,11 +110,17 @@ "seal_time": "2026-09-30T12:00:00Z", "before_round_time": true } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos.", + " Otro firmante, «Otro»: válida. No cuenta." ] }, { - "name": "alg 2: a required signer is absent", - "security_cbor": "a30071646174656b6579732d73656375726974790101025906d0a3000201584582582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc582046218f3323671ebac0c2383e2382322e0a05624f864841d69933d9651b761139025906813082067d06092a864886f70d010702a082066e3082066a020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e243989a6cc0f8dd3048764de75c6849ea1dde4e74226f09bf6c182c449a3a493037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d04030204463044022030e89724e9a7bc7742c3070ea844c8c6135fc2f1f090ff02d4b8e013787f748a02202d7e5a32fa3be2e4497b868bdbea7dc74cea338e9af063796a16f58b592f8c9ea182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420d978156a516b3550c5c59d8f842ae75f4b086e551f91176ba97a3c5b1a9de88102012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d0109043122042042f3033bb9a81c0ed2dd9c2f2b07a99c2278d32eeeaafc2eb6fd1545090e8a26300a06082a8648ce3d04030204473045022100cf6c1039534dd01fee54a21ba821557991d573eb63bb1b1aae7738bb40acf08502207225a9f503c13c87b958ee8d83776e621da7b6cadd14c4fd4631d562b4ff1d7c", + "name": "alg 2: a required signer is absent: F5", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906d0a3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d315820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba025906813082067d06092a864886f70d010702a082066e3082066a020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020447304502207a08d498aa3e141b4222432d97f692f7ea4ef500dd15bd415c264fef9da53bc0022100fa9caa6060ed28e0e232386894b2734d1af59e7e1ad524141c32060ded14212fa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203d225e1016210f61815a9018b2df8bf9123bc27553d07909bdbdd8d3dc915e2802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420180460645e77ec7d03ec74f81c3c168f56f02cdda1bf097618d09ea17e6637d7300a06082a8648ce3d04030204473045022100bd09c15884043e0fb85f6e648cfe3f7709b9edcd2c94e1dbea60c03c9ed7f33002200b586291f9cdb760967df02c2f2d34e87f1cf6d5dc7f2fcb3354b5c6f0e9604e", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", @@ -97,16 +137,19 @@ "before_round_time": true }, { - "holder": "46218f3323671ebac0c2383e2382322e0a05624f864841d69933d9651b761139", + "holder": "a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba", "issuer": "", "result": "absent", "before_round_time": false } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." ] }, { - "name": "alg 2: no seal", - "security_cbor": "a30071646174656b6579732d7365637572697479010102590311a3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc025902e4308202e006092a864886f70d010702a08202d1308202cd020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e43182012a308201260201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d0403020446304402202405ddf8c290eca0488e097209f2b5d4fd00ef228bcf2dfacdd21620614de47d022069ae19a347d757338f52b04e0dff7c199a03f229e03fe60e5c04c61be7d346ac", + "name": "alg 2: the author withdrawn and the co-signer intact: F5", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590a99a3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d315820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba02590a4a30820a4606092a864886f70d010702a0820a3730820a33020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b13182058630820582020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d010101050004820100142182e679a9044c5af50daa3faa26c2fc96f8a74e6ef3dd1cb14cdd3760661db00333ef361eb66da29151fc5d5d435de2d7b493332a59ca728ea7a69e8d9b6ef348bf10d1ac0c3d38dc19b88f2e38eea9f796072724698a6c4e0ff730b4abc9fa411deef8ebdf86ab0c5b40214d734956d9887e599ade56b2d5437cea9ad0d9ca62a9505f6a2cc85348d8468245718d14b79279b3865587ca213ebc0039d42e89f91df852091df32fe55e58589538f87f4b71a207cf2fb1d2fb12c8c2cd9d695a242ee7d16430e75527d8ad3d7937718a9da0d4a1534a78e0692e0fb0482fa0541458f78a38d1af28ebf5e65ad7d8ec7cd5f97fc1450aab545d47ec090fb266a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420eb258f2b2a7040cccd1a2fa0291bad8be5ff485216bd475a60af8c7d39d4263602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205c352555e91a6537702c0bc8faaba6c173900d5c369f7466e74184661de6dee5300a06082a8648ce3d04030204473045022100c961f0245f490c920249a42d4488f94bd178de29d98e05fe45bd88023f7ad42502204fbd45470f9b819f82f2762736afd05899cf76da4c53095cac182f59c544573c", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", @@ -114,18 +157,50 @@ }, "signature": "F5", "seal": "S0", + "signers": [ + { + "holder": "84476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31", + "issuer": "", + "result": "absent", + "before_round_time": false + }, + { + "holder": "Luis Gómez", + "issuer": "Luis Gómez", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: a signature withdrawn and SIGNERS changed to hide it: F2", + "security_cbor": "a30071646174656b6579732d73656375726974790101025909b7a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259098a3082098606092a864886f70d010702a082097730820973020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b1318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402203418d51514d5c0f6e75670727af401f63e94bb259faaed46d0cf50087c7eb2d302207d7ce307ea7014e670c0a8e20260b1a7597a2633a471c117a14f1eaa3792d001a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420881d624d4aff452cdeef0a8a3e373d13b3eeaeb66d1b6dda627bfad9607cc6b102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ef2f728017dac908a8cde4f0c80d40c754baaade4fa00be45f13d8be41499bc6300a06082a8648ce3d04030204473045022100d9b88343833a625aa1ea1d4e206120f93769e9de4b96faf3fb3cd17ad813448902202a5db6ca4b3bbd2f80e5e59e7d9140bfd3ca1f6f5939689802df392a883423ce", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F2", + "seal": "S0", "signers": [ { "holder": "Ana López", "issuer": "Ana López", - "result": "without seal", + "result": "invalid", "before_round_time": false } + ], + "lines": [ + "La firma no corresponde a este contenido." ] }, { - "name": "alg 2: a seal from before the certificate was valid", - "security_cbor": "a30071646174656b6579732d73656375726974790101025906b0a3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc025906833082067f06092a864886f70d010702a08206703082066c020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4318204c9308204c50201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d04030204483046022100a53ff1be1b099213410faaf5d129f313f3805943b0ca9a91548095523e3e6ab40221008f2f80658797162a7635698ae27d641099a2a56a704518c39a7457943cc0307da182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ac6338330973f43870125e217bb36d225633fc89616b39f9ed38d320c383f89102012a180f32303139303130313030303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d0109043122042000ffc82983ab7841e9c7c7221c7df79d31f4d835953932a940efd1c4e38a1165300a06082a8648ce3d0403020447304502207264362223b28bd85933b98a7320b68d5221c78078f4e410d8d5ab26a96162c7022100f2b315a3fccf8b533d430c8722cbac202f59391b521d4b329e6471ddbda9aa95", + "name": "alg 2: the CAdES-T of a signer withdrawn: F5, without seal", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590bc3a3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d315820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba02590b7430820b7006092a864886f70d010702a0820b6130820b5d020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b1318206b0308201e6020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d010101050004820100142182e679a9044c5af50daa3faa26c2fc96f8a74e6ef3dd1cb14cdd3760661db00333ef361eb66da29151fc5d5d435de2d7b493332a59ca728ea7a69e8d9b6ef348bf10d1ac0c3d38dc19b88f2e38eea9f796072724698a6c4e0ff730b4abc9fa411deef8ebdf86ab0c5b40214d734956d9887e599ade56b2d5437cea9ad0d9ca62a9505f6a2cc85348d8468245718d14b79279b3865587ca213ebc0039d42e89f91df852091df32fe55e58589538f87f4b71a207cf2fb1d2fb12c8c2cd9d695a242ee7d16430e75527d8ad3d7937718a9da0d4a1534a78e0692e0fb0482fa0541458f78a38d1af28ebf5e65ad7d8ec7cd5f97fc1450aab545d47ec090fb266308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402203418d51514d5c0f6e75670727af401f63e94bb259faaed46d0cf50087c7eb2d302207d7ce307ea7014e670c0a8e20260b1a7597a2633a471c117a14f1eaa3792d001a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420881d624d4aff452cdeef0a8a3e373d13b3eeaeb66d1b6dda627bfad9607cc6b102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ef2f728017dac908a8cde4f0c80d40c754baaade4fa00be45f13d8be41499bc6300a06082a8648ce3d04030204473045022100d9b88343833a625aa1ea1d4e206120f93769e9de4b96faf3fb3cd17ad813448902202a5db6ca4b3bbd2f80e5e59e7d9140bfd3ca1f6f5939689802df392a883423ce", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", @@ -137,213 +212,2629 @@ { "holder": "Ana López", "issuer": "Ana López", - "result": "invalid seal", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Luis Gómez", + "issuer": "Luis Gómez", + "result": "without seal", "before_round_time": false } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." ] }, { - "name": "alg 2: a key 3 beside it", - "security_cbor": "a40071646174656b6579732d73656375726974790101025906aea3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc025906813082067d06092a864886f70d010702a082066e3082066a020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d0403020447304502210088b768db47d80f09500a967980ad2ac0a2eb82f458777e891f593e34cc14d0820220659290ece942794938661a0484c3bd5b0530b42344b0bdc01312980c5ba3fbcea182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420b4d58800f353fd51a2be33700e54876fefe6d247dbd0accc92f6397889a8ba4702012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204202a52076c932f135a14b86a88f42b66b77977d5b5d43cba3d115e89ee5fa1110b300a06082a8648ce3d0403020446304402206d1b9fb6d44839be881774b7498bb3b765666102095c3996e98e551f54f63bee0220190f2d2305c490196dd6a9b9bc348b6986f656434ba6b560e5dc55efd2084bd90346a20001014101", + "name": "alg 2: no seal: F5", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590312a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025902e5308202e106092a864886f70d010702a08202d2308202ce020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c3182012b308201270201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020447304502200c35f0b0f0fa5f1add543636eafb6ff41a97e62308e775c44b4ddba9ab57bbed022100ecd13ac752530f87a24d3d0384bdb2d8ff59d111a1f708db9b845e22fb382f86", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, "signature": "F5", - "seal": "S1", + "seal": "S0", "signers": [ { "holder": "Ana López", "issuer": "Ana López", + "result": "without seal", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: the certificate of the signer out of validity, its authority valid: F5, out of validity", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906b4a300020158238158207d614f95e000b5a74cbd0e05508ddf0be7400597739e0169759fc1323c276e56025906873082068306092a864886f70d010702a082067430820670020101310d300b0609608648016503040201300b06092a864886f70d010701a08201813082017d30820123a00302010202080eb675eae0c5ebfe300a06082a8648ce3d040302302f31163014060355040a130d446174654b6579732074657374311530130603550403130c416e61206361647563616461301e170d3230303130313030303030305a170d3236303130313030303030305a302f31163014060355040a130d446174654b6579732074657374311530130603550403130c416e612063616475636164613059301306072a8648ce3d020106082a8648ce3d03010703420004c3c4d555fbd862c764fc901d331da05a20c811380a9a2061643724eb457cadd7fcb79a47f56f2c7109d858abb8d0365260cf73185e9d42d0de9391a894c53e8ca3293027300e0603551d0f0101ff04040302078030150603551d0e040e040c416e61206361647563616461300a06082a8648ce3d040302034800304502203a34cfeb02dc2897b59358ecd7bbe34da76936799e9f783f50da529411defa490221008538de14438184add3ee9f2a72648844e65c1aaa912e5ccab1a02f3d020664e8318204c8308204c4020101303b302f31163014060355040a130d446174654b6579732074657374311530130603550403130c416e6120636164756361646102080eb675eae0c5ebfe300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420857507fdc2c39ff74e6b11ace24e76eacb1e3ed43faae66c35c57b2a837d1f963037060b2a864886f70d010910022f312830263024302204207d614f95e000b5a74cbd0e05508ddf0be7400597739e0169759fc1323c276e56300a06082a8648ce3d04030204463044022037900b2397788ce12090c7908b6bf53ebbf5b3011e58e7a6f9efc8e056c21fbd02206a597f2cbb20c1c3ae00fd113d8f5dcdf109dd571e72a8d7b1e943953f05620da182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420bdb19cd96ca81cecf83448b869fd35a9ded8405882bba5f08cd619e5f831a14e02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420b8fd801d5d289ef2fa7ca332d048536a002b1eaaf67f1f6331898b7dedb9a32f300a06082a8648ce3d0403020447304502210086e8012d185b3af87143cc01f357ac69e948cbfbd520050178decd09812d46ef0220523d554467667b24f71f5f3df280e2729bbac60dc2b68504bd55d18b6f4a53f4", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Ana caducada", + "issuer": "Ana caducada", + "result": "out of validity", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: sealed at the last second of the validity of the certificate: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906afa30002015823815820c829a4fb3e275ec523b077a30166218c91ae33b64bae31e06cd75581b8b303ea025906823082067e06092a864886f70d010702a082066f3082066b020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c3082017830820120a003020102020808b61e76b6282925300a06082a8648ce3d040302302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b457661204d617274c3ad6e301e170d3230303130313030303030305a170d3236303933303132303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b457661204d617274c3ad6e3059301306072a8648ce3d020106082a8648ce3d03010703420004ba4f00ddeb37505f913aee65dd41a0b52f03fd04e48c863c1025201f9ea69977ce203f0882e50601e63ed3328c1c06327404974ef09cb6c6eb3fa5ece43d243fa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b457661204d617274c3ad6e300a06082a8648ce3d0403020346003043022073010554d364487e6b2045884405b42c0d96d5424387afb541f9168df74066e7021f406290902008a78e1bdbdc6e2eff0e6bfc08322f36c38eaf43519868f285ab318204c8308204c4020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b457661204d617274c3ad6e020808b61e76b6282925300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420a0a86154a9d80345b429b28feef0086bbd95abd3caf621026697dd52f0a5c8cb3037060b2a864886f70d010910022f31283026302430220420c829a4fb3e275ec523b077a30166218c91ae33b64bae31e06cd75581b8b303ea300a06082a8648ce3d040302044730450220601e4bb15d4754572f897a9cd9a56160597e2feceae2a1497409737f05590d8f022100ab988f365a4a9244c8c6a7e9f9844f49b27299750cafdc173a8624e42e8326e4a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042066a7ce3974632838d4a3caf170d4ac547d8c7a0388b7a917bab4f1b679ceafab02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420d908913f693398ca68aa9a2df2a5ee3ec335b282b22e3a508496f11e29eb5be9300a06082a8648ce3d0403020447304502206679aaac5d688393ee91b987e9db1f1dc8035480fd881fbb1366c51119b1718e022100a82a5ed72f4defd55a2df3b9e897904ac30e3734273ffe5a0243d4434466df6a", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Eva Martín", + "issuer": "Eva Martín", "result": "valid", "seal_time": "2026-09-30T12:00:00Z", "before_round_time": true } + ], + "lines": [ + "Firmado con un certificado a nombre de «Eva Martín». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Eva Martín» (emisor según su certificado: «Eva Martín»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." ] }, { - "name": "alg 2: another head", - "security_cbor": "a30071646174656b6579732d73656375726974790101025906afa3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc025906823082067e06092a864886f70d010702a082066f3082066b020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4318204c8308204c40201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d0403020446304402207a1647947225c8f411342b312c22561009adb7b7ce3302d76f98cc0820b143c002205010984a5c17f64b3f12548fed1cf39ec99926848dae4d68148a3edc9ff90203a182039a30820396060b2a864886f70d010910020e318203853082038106092a864886f70d010702a08203723082036e020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420635c606d8492e086879058d5ed73f29d342b9849792743228d08f00ebe4c81d102012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204204aa9eb4ecca82d42d6f3408fd0ee151cc773de1b32f642dfff5470c4f143a0ac300a06082a8648ce3d04030204483046022100ea89187fe24bbefcc313b9e666adbe7ae53c0a95d97ab3a43de657e308253d20022100ae8d4020e8db3e85da2a2591d9caeb1c0099521cd97535d4f0a851a1c0f53ac8", + "name": "alg 2: a seal whose authority was not valid at its time: F5, invalid seal", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906a8a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259067b3082067706092a864886f70d010702a082066830820664020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c1308204bd0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402206eb67bc26fa0210c1b63a6a7d423c9865d34c807c910076caa0af68f45473bd902203f2d6c8fecb09cb263cdf2f4358d758fb01297a72ced486606631f2c7627e4d1a18203933082038f060b2a864886f70d010910020e3182037e3082037a06092a864886f70d010702a082036b30820367020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b06096086480165030402010420fc57a779a5efcad979e1d80fc2ab639ec0ffea0ff4dd7b3dada7fc58aacbe70002012a180f32303139303130313030303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420f144affcd373fbcfbfdcdb28737fa4676bd3b86fb32c29f1ec20fa763171fbd6300a06082a8648ce3d04030204473045022020dca80907b8b1e10fcc243e91a7ca650f7a096f13e5a57aa4f93ff3ad09fb28022100efe5ae2037cfe7be935765f1799e9c4f90719382a21315d87418e4cdd05513b8", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", - "head_digest": "9f2e6d33a3787ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F2", + "signature": "F5", "seal": "S0", "signers": [ { "holder": "Ana López", "issuer": "Ana López", - "result": "invalid", + "result": "invalid seal", "before_round_time": false } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." ] }, { - "name": "alg 2: without the context of a capsule", - "security_cbor": "a30071646174656b6579732d73656375726974790101025906afa3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc025906823082067e06092a864886f70d010702a082066f3082066b020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da0030201020208399eb3a7749a61f6300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200049ba7f4999209b8a6d393b928bbd84aae10eefcda758b94ac9a171c3f8059a065bdd433cfd9da5789f85d9a3be45a73bc5f1308c0991b2fd5cec0b11fa27d7eeea3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100871158b887973e04034747995358dea51032602153b05e6bf5cf1b8778d0a623022100be16176bd54cab25f50e34ed130d6324c43f7f1d775f307a28a8b8f2109791e4318204c8308204c40201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a0208399eb3a7749a61f6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204208a0a6d927c8efe36ab066eaa1321276832694a7d36b38e01786e2fca1ba4387d3037060b2a864886f70d010910022f3128302630243022042013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc300a06082a8648ce3d0403020447304502210098cce1331f2bcbeead0a8f72d10e370e88547acbb7a060774476fbbeefbcb4dd02203cc8ad8db9161990e9405998479d55122325b0d0aacf592db0a3489615244822a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420dcd9f7eb86fc8586a0bb1f37714d9f11e2aa854872daacc521058ab89d29d0e602012a180f32303236303933303132303030305a3003020101a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204205fe6287d68fc6e459c852cb7ac7bf5050374de18353747e70bb9a219ecba780a300a06082a8648ce3d04030204473045022100d7d713c85125e46ccecb2f5fb4e2db990b5e54f71b6486e5b81e64b8ba56efcd022077904deb3e45c01f144899fdeacd3f628c3cb672dfe188d84ae99578ad853f2c", - "no_context": true, + "name": "alg 2: a seal over another signature value: F5, invalid seal", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906a8a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259067b3082067706092a864886f70d010702a082066830820664020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c1308204bd0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402204625f9e74f8d7e687a9017e765e6aa14939b7567fa3f8898b7b64363d49267c302207307ddd0bb28d15cd3ca5dad268e3cebe1958544a66795aac693efea4c11ca40a18203933082038f060b2a864886f70d010910020e3182037e3082037a06092a864886f70d010702a082036b30820367020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b06096086480165030402010420d9298a10d1b0735837dc4bd85dac641b0f3cef27a47e5d53a54f2f3f5b2fcffa02012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042020b72ae51c6f228bc1779cb6f447612e6884942940b9d925cf0600ec815f8eb6300a06082a8648ce3d04030204473045022100bb9da5f3fe14ab5755580bb818f8a1af8cccd3ef07bed4c5cb0ec61c20b46e9a02207d13555ccc764040838ae642d26628d693086c5617cc98be54593f2bd961d3c9", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F1", - "seal": "S0" + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "invalid seal", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] }, { - "name": "alg 2: SIGNERS out of order", - "security_cbor": "a30071646174656b6579732d7365637572697479010102584fa30002015845825820ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb58203e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d02423000", + "name": "alg 2: a seal of a TSTInfo of version 2: F5, invalid seal", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906aaa3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259067d3082067906092a864886f70d010702a082066a30820666020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c3308204bf0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100f48d2a25865b7f1299b4ae346635d3020070f82fa2a585392c0924252eefb101022100bc1533f89ba4137f96b5e7b1cd3078df0a7ccd0c235a79a0479ac14517b6c0bca18203933082038f060b2a864886f70d010910020e3182037e3082037a06092a864886f70d010702a082036b30820367020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010206032a0304302f300b06096086480165030402010420daf37bbd6801e911ac5d5c96a53b661e35ef0f17ffef315bc0a4802b47a826a102012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420e73015b126aa18e757e94dd1b1f62398dda9f7c644c14b4725619d3e49cd3ec0300a06082a8648ce3d04030204473045022100f47abbbe015718cae2bde2d64bb5e1d5f617b2b6bc0be740b5eb62ddc3779cfc02204b9eefd49c3d7c6fc9b0c912f81f05c6b03bf280a19275fae2aec4b194d071a6", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F1", - "seal": "S0" + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "invalid seal", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] }, { - "name": "alg 2: an empty SIGNERS", - "security_cbor": "a30071646174656b6579732d73656375726974790101024aa3000201418002423000", + "name": "alg 2: a seal by an authority with a key of 1024 bits: F5, invalid seal", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590736a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025907093082070506092a864886f70d010702a08206f6308206f2020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c3182054f3082054b0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100c90a16723e16afca1dc3bf0c8e54b33e66fa2c87fc4fe5029dde14a9fdf4a871022100c848c4cfe608814c83fee5431b187b972d07927b7e979c48f6520d5a1f8a910ba182041f3082041b060b2a864886f70d010910020e3182040a3082040606092a864886f70d010702a08203f7308203f3020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104208de224e00b0298462644c03023a99e7ccd6bf8da9fabb88ab72ab4a6fe85e06902012a180f32303236303933303132303030305aa08202143082021030820179a003020102020834607a68cbc589f9300d06092a864886f70d01010b0500303331163014060355040a130d446174654b6579732074657374311930170603550403131054534120646520313032342062697473301e170d3230303130313030303030305a170d3430303130313030303030305a303331163014060355040a130d446174654b657973207465737431193017060355040313105453412064652031303234206269747330819f300d06092a864886f70d010101050003818d0030818902818100dd3aad48825de04694dfa7355a5ce025f3bdfc8b9980834ee5a7266a79b7addd06982b04e0441fad740ffd310de87605e43314ab7e042c1fad6fd5972c60a85262082dde7600619046abb312a614e792d5962151083a4881a5dd0ca9f34be3cddbbfd6639dd170b813613ca937af39fcc4c627421fdf90f2df6621dafa0b2b3b0203010001a32d302b300e0603551d0f0101ff04040302078030190603551d0e0412041054534120646520313032342062697473300d06092a864886f70d01010b0500038181005aab1baba9d7a44438be0a31b17387168fabb75ea68dd97007a930c83bde518f6eb564282b04cb79613fdf8cbde7f7e833a91b335631cbd977bc40c0f02484afb8b50faf3943e37d529e8469e87cdf5e49d6d9d684c3909c7278d9cdd1d1a6fb0677af08e2b12e3f8b3feb2ee7e11784679929eca9fa21a9db25f2e11a472279318201633082015f020101303f303331163014060355040a130d446174654b6579732074657374311930170603550403131054534120646520313032342062697473020834607a68cbc589f9300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414142590676d545cf7ba13a1e58b6adec5a816183e302f06092a864886f70d010904312204204052708f73b2e92c2e8773cc69ed575021fb218cb50c67fb428f5995de76a450300d06092a864886f70d01010105000481803e29bdc5b7581ce44e6eda70377dfb7ffe720386fe6f6b2ff01a6bdec45fbb50525c5b708262c336d71a12daccecc6a555e71fcd3e5cfcabf171b9aba9898e50e4046ddd17bc7d3bf8df4ef2b61b8a0862f837c44a9616d15354ef7a7a7bfeb158043a59bf76d18254381f5c6be4f025a41a5efcc7f758eb3c4b587913b8e249", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F1", - "seal": "S0" + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "invalid seal", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: a seal with an imprint of SHA-384: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906bda3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906903082068c06092a864886f70d010702a082067d30820679020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204d6308204d20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100e4d1069300df5a2ae3adcbde8132ec6283854c38fe95b279e354d6a046a7a73a022002f0659568e246a144c1a645c67a32fd89791b65683994b77e9a3e73cdbd9309a18203a7308203a3060b2a864886f70d010910020e318203923082038e06092a864886f70d010702a082037f3082037b020101310d300b06096086480165030402013075060b2a864886f70d0109100104a0660464306202010106032a0304303f300b06096086480165030402020430a1f3f7291d224a54620f972710a825b38f9bfd0be2822c789f70d058fc94122e8cd7f2e1610d5d5da51aaf1504decf8f02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ddb6f1f0ae7bd9bad865ce42617098c5b2ffd39d92840cc56fdf61752f19202b300a06082a8648ce3d0403020446304402204261558e986db9e04e1c49726af0d4513f918b4ca105c70fcd2c377e9e4f6e0d022026d7e2c9d3a92be3864119c21e4e53aed70c8869c2f234a59a411d52b58ab2ae", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] }, { - "name": "alg 2: not a CMS", - "security_cbor": "a30071646174656b6579732d73656375726974790101025832a3000201582381582013c811b56e109e9ce48cd885cd2686750c380fde4bbd887399239d013d70c8cc02476e6f7420444552", + "name": "alg 2: a seal in BER makes the signature not DER: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906aaa3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259067d3082067906092a864886f70d010702a082066a30820666020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c3308204bf0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100d45d7fd21a6695767f3e6b78f1ab5d8ae7cea1c754c16f3a765bd24f83b0a0e50221008cfe498e55dac558c64906c2b9f5db9111799a7ef165e0fcd95215d5889b5f7da18203933082038f060b2a864886f70d010910020e3182037e308006092a864886f70d010702a082036b30820367020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b06096086480165030402010420a1c87849d93fb76f858609ee96d703b477b475e1f7405777d6fad1a836de3db402012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204208efa0a9224e3e83fcedb09fb2edda42726cb3d6471f9affc5f50114051277dc6300a06082a8648ce3d04030204473045022100a698b5d49345029f16b9191471c284e12474ee27acd8d3b4bf2776d6beb3a487022033c773b63a419b50fa901a24b471b706335d6a27cb2ac3879697bfc8f2e0a6b20000", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, "signature": "F1", - "seal": "S0" + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "seal: before the round time", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d04030204473045022035826188c3bb3188be9cf91df2dc4304c17631fafffe8f2c0f80642bbc6c25b6022100908217b93a2edc80ef83409cd4442a388f18364dbdeced11e0e18d6677221ba0", + "name": "alg 2: a key 3 of seal_type 4294967295 beside it: F5 and S1", + "security_cbor": "a40071646174656b6579732d73656375726974790101025906ada3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204463044022059e779083e9995e2d792cb0a6667509aab134a198f9b68434515a35b59190ca702200900d042a700531fcb346f3930a10bdf7e8ad9afe64bfc7bd8d04f4926d1867ea182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420be64c585d0ba7a5b8d2fe9616d3eb912ede5887993230647e676d1a70b49ef2002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042074fb139cc895a814e5e961e9f85abd6fde7e7fe163219b51a832fc1fab54f1f9300a06082a8648ce3d04030204473045022100bb11bde1c0a6e7a319345284931c589d9e4a36b74e1c9ff3fcc432e6045303fe02204c5865aa9e7719eb26515b5073cde7557841bff074acb00c208cb60d9e934530034aa2001affffffff014101", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S4", - "seal_holder": "Autoridad de Sellado de prueba", - "seal_time": "2026-09-30T12:00:00Z" + "signature": "F5", + "seal": "S1", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] }, { - "name": "seal: after the round time", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303330303130313030303130305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204206ec611e50ba08a9652626f2e01c82ecea7dcc274e609f2aa345d021863dcad7d300a06082a8648ce3d04030204473045022058e49c9469d43a91f95e2f85cef863047352a1dcabf91b5e7e33045b2999b49b022100ef93e6c13cdcbe5b60aa931f645f5289a594ff09c1914623c035fcc09c6eb46d", + "name": "alg 2: a valid seal of seal_type 2 in key 3 beside it: F5 and S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025906ada3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204463044022059e779083e9995e2d792cb0a6667509aab134a198f9b68434515a35b59190ca702200900d042a700531fcb346f3930a10bdf7e8ad9afe64bfc7bd8d04f4926d1867ea182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420be64c585d0ba7a5b8d2fe9616d3eb912ede5887993230647e676d1a70b49ef2002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042074fb139cc895a814e5e961e9f85abd6fde7e7fe163219b51a832fc1fab54f1f9300a06082a8648ce3d04030204473045022100bb11bde1c0a6e7a319345284931c589d9e4a36b74e1c9ff3fcc432e6045303fe02204c5865aa9e7719eb26515b5073cde7557841bff074acb00c208cb60d9e93453003590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b0609608648016503040201042020eae71a0e861623f2d2dcb10f71c6d44610a18933f1d82bbd65e2222c653b8302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420cbf0e16e407b4ee198285447b5f4d3010fba18573b6b816b02b416dae15e4bba300a06082a8648ce3d040302044830460221008bffd403d01e293e4225d69504d8cd6e6f7f62f39aa93eb0e816ca8873fcba52022100b577c2cd158fe8e25350b4be61e5d1c7a7ece6b83c4ee9bb87b20fb97117979e", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S5", + "signature": "F5", + "seal": "S4", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], "seal_holder": "Autoridad de Sellado de prueba", - "seal_time": "2030-01-01T00:01:00Z" + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "alg 2: in the context of another head: F2", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906afa3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906823082067e06092a864886f70d010702a082066f3082066b020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c8308204c40201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100941e2ee815ee1e8114bc6b8aceed2eabb06c3312cf9c26545f6d7386d3503178022040ba3dbaf79f3c933056c14f480bfa275e6b8392307c6c25ed925f23c7c7e977a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104206dcd467fb597bfaba1d210f415510f3e21bbc6a678a7f9fd05ea0bf56b76a22c02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420d84a9989977eca9b539ee09fcddbae13727e120098c70637c92310864d7684ca300a06082a8648ce3d040302044830460221008de90a07847ffb60a6185e2730e5b90f50333ce124e3f7f772e49d84f6e199bd022100b089806880bd57fa83caa9a9bf4c18b634c4c3478942f7d965a80f14334faee6", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3787ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F2", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "invalid", + "before_round_time": false + } + ], + "lines": [ + "La firma no corresponde a este contenido." + ] }, { - "name": "seal: the accuracy reaches the round time", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303239313233313233353935395a3003020102a08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d01090431220420471721ed38663795e173165313eb086b98a36585f824a592258e6796265b290c300a06082a8648ce3d0403020446304402200d7a4e1cbb38fc5ab7e36e68a02ff0ce522afd5d5339f3f498a2ed38b5d5929e02204e3fc60d1475324c1262d93e2ccc3220b6f20d5c2789ab98de90fc725095dc68", + "name": "alg 2: a message-digest of another message: F2", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906b0a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906833082067f06092a864886f70d010702a08206703082066c020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c9308204c50201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042028ea0f231192a65711a644003b0cb3a049bfaf43397b36c8beed63137374ed973037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100e150941bc16b83041f302a9f0f8cfbb8367e4ed5d0d2028791769cbfcd5e9077022100f6ba7ad04cfb8a6e1a75fb549204cf563626663db0e132bd1d80f42cba84abb1a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042065122ba7682f08ff154612b6bb37e31daa45e5ff3787eaf194db4258bfed924202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420b16285a5ad4d8853f2d5f61a6c2ab3c82ed41fc81e7a07a8d6128a24de695ff2300a06082a8648ce3d04030204483046022100f362d86ef7f131287075d33f1b440c70f5ef31f5739522b995e9dd58b3c87d33022100be97165b93d96511e6ea97f093b6bdb757efe9435de6d9e60d03e8aa437055be", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S5", - "seal_holder": "Autoridad de Sellado de prueba", - "seal_time": "2029-12-31T23:59:59Z" + "signature": "F2", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "invalid", + "before_round_time": false + } + ], + "lines": [ + "La firma no corresponde a este contenido." + ] }, { - "name": "seal: over another subject", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b06096086480165030402010420d9298a10d1b0735837dc4bd85dac641b0f3cef27a47e5d53a54f2f3f5b2fcffa02012a180f32303236303933303132303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d0109043122042020b72ae51c6f228bc1779cb6f447612e6884942940b9d925cf0600ec815f8eb6300a06082a8648ce3d0403020447304502204acb02f9a823d1d511923009bbba27633f0fb1d86abf288e8c91fac127ffeea402210091ed23012ba6318ba11640fadd5b532cf162b9be3911d6f724b812f17d38c7d3", + "name": "alg 2: one signer invalid and another absent: F2", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906cfa3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d315820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042028ea0f231192a65711a644003b0cb3a049bfaf43397b36c8beed63137374ed973037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402206a18bf8ab1de957f371eabbbcaabcb1640aafa3e2ace174f4d5bec7785a739cd02203c853cbab4d79f8b648824b430e8885c66bf61dfbaee691259f094585447923aa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104200574e15aa901376d4b9680d37e0d9350eabe61ddd71ea57e96050b9c23e2818602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204209155740403e3d2c14b03a560f12453e42d9a0189644fc8984206c8d459c5a0d3300a06082a8648ce3d04030204473045022100cd6b70b3dbbed2fccefded1507a762ee65650cc27b8adf539db01512cf73749e022027c4a6134202b378084a3529da59d80007511d64ac669c39dbf791233f22604e", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S3" + "signature": "F2", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "invalid", + "before_round_time": false + }, + { + "holder": "a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba", + "issuer": "", + "result": "absent", + "before_round_time": false + } + ], + "lines": [ + "La firma no corresponde a este contenido." + ] }, { - "name": "seal: the authority had expired at its time", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303431303130313030303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d01090431220420952183c5071984e2814df7f00ebb35b71da2bdcbbdd4dbe03d05d716ab67687b300a06082a8648ce3d04030204473045022100c206a35b6ac94901a3fcc2e507a2a21f3d23ba85f2e156d98e87cb045531f7db02203e32681a6f58a9c6abe88c04cb4debf27ce8cd5d2d5b7c954e002a3d14533ef8", + "name": "alg 2: not a CMS: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025832a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102476e6f7420444552", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S3" + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "seal: a TSTInfo of version 2", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010206032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204207e5374ba63316e3801f8ceee00bf0d1654583ad4b2abf0c568aee47d8b8cec8a300a06082a8648ce3d04030204473045022100b8760f30aaea150c3cc178d6f8d69da5aa1658a39fb8c18519de80927b9becad022017b1bbd893a5cd8e5f8406499d77a17e5e1234007aba5a0dd656609ab30109ef", + "name": "alg 2: SIGNERS out of order, beside a valid CMS: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590f5fa30002015845825820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590f1030820f0c06092a864886f70d010702a0820efd30820ef9020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b131820a4c308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420fe53067859ba4c905fe8ac45e8ae7a2ace2c32b9c06dd02b67c28af70d8be1113037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100f59884dd56bdde7fa9e324e46fe0280d0f287ca682d6e007b89b60ed4bfc0690022079c72d92e593a8f5d75e897285161e0dbad8075ccd2f5b1b6a10050d4a2492e6a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420b60ec609899285d9ba2998e9920ace92ef473e722fd1ee3a8c68f7c35e79ca1a02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042001a813f46316416dd2c776839a69bf1d204a2f6ced69c670ef33f20b5f023d46300a06082a8648ce3d0403020446304402206c542b0c6df36c9cedb86ca13511f0b77dde9e16e0a5c2d22e35e409e3e6b26e022065967edc3532da7b6543e5393b4c782323899aed9fa835679c2cec11b7d2b8ea30820582020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420fe53067859ba4c905fe8ac45e8ae7a2ace2c32b9c06dd02b67c28af70d8be1113037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d010101050004820100009f25036d9b3205f6ae2389b1cd3c78d8f373def1be5c786dcf82c3773d09880d259376ff2c661f2006d3e3615e0c69678dbdfed78bd85d168b5735d833a41798cbf1ec24fa6b3107305feb0d43a2a6a7a379c7405d81313789dd8e31c3a840285bf4a9b44937388e29f1be0aee3efbb053104384236b15042d3419ff741facba64ca3d022280a8ff2503f8cd01d326fea7f18c12f5b1719afe81e8d1f494d97ea0638961bfe0ef53ce0998b70a4b6b3675e7d904f2d0b25e316293885d072813518f531dc981cf36959fd73cddc8ac76f9a5a65d64a021553136e9216a39712e221fa3b277d7da5064181785dfa184eb7a09fca17a9e451815084c828818f3a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420af2e10e7b9c85dcd7ca05523c537fd18e58e63ecb95fdd2ce8eee076f4e24bfe02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ddf49ba85d9b76fd82d50eef0ebc0e72109846d159352bb860b1952f5020f013300a06082a8648ce3d04030204473045022100da1193d67e1160defa15c818f25d4940b7d140f51b735bb8326884cf3953a28a0220765f7ee77b4ff3c605de74a098ed5677d46eb146d1e02e3b0adf48f715a4dabe", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S2" + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "seal: not DER", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a034ca2000201476e6f7420444552", + "name": "alg 2: SIGNERS empty, beside a valid CMS: F1", + "security_cbor": "a30071646174656b6579732d736563757269747901010259068aa30002014180025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042072b62e739dc090609750c53c15240618f2610302b88c44e0bc30b15684cb99223037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020447304502210099bb5a75da4d4339e067c66d2863e1db3fd92d45710e6c5fe9f0a97b31fc53be02207e3ee0fbdcd19cdff8cea37ad3ef9385277c51a3429896bfe5d6a2446cd1198aa182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042027ad4184015ee7d79425e0eb708c04c9d2b62080165260d4d3ee0b520e3c274402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420544cb6ff88f16e9d12c25ee37977280425a3e4b3397e8bc7e69856192aaa249e300a06082a8648ce3d040302044630440220038942838abdd27f43196d1f64d949cc28f3ff6d4a5b7faadaac6b24f72cce6f022060d8026f83ed9b04dfe5bced7504dbff2b546f81c5ab477823ba437347ee2948", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S2" + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "seal: SHA-384 in the imprint", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590396a200020159038f3082038b06092a864886f70d010702a082037c30820378020101310d300b06096086480165030402013070060b2a864886f70d0109100104a061045f305d02010106032a0304303f300b06096086480165030402020430e8ebf3d61bf90b15bca8f52f442c258a22fd8813dde6462308f13d3d2ae3bc512fb5b2613a392c68a94f4281a60ee3be02012a180f32303236303933303132303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204200fb8e41b236629a2ce055afa2f6fc3bc4fbc56a606cb5dc6eb44388b65a65133300a06082a8648ce3d0403020447304502202cf305a8f490c47d643b1321ec74fc560d720c782f940120b8c72feb44c64603022100e8bc71c72a78453cc208edf5a8ef00ab72d0f180f21ebfb016108fb2dd30334f", + "name": "alg 2: SIGNERS with an element of 31 bytes, beside a valid CMS: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906aca3000201582281581f84476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e9ee213db3810e40032a91387aa2e64acfdbc10326652e94a801da0d95a133cc3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402206f0690bf213478bdaa3c0b4a518b76d24702135a4ae1f2635f02a289d25796c7022006ce00428753596cf9d675e1910e3b6a823cc098b8f134905b47d237064d812aa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104209535a5c92eb0b479ff87096c67e01865440f3e90d7093fa24785ab76cbeceb6602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ecada8f23f7d2b546abb48f902a4e80c4dae0b94569a0ad5d7ac1c9c7c626c32300a06082a8648ce3d04030204473045022054f51675fc46dec55c5f963688a9c0400985f68c743a0a822d5f28f5e3bd11da02210096bf78f0c2d1b9ecf1d8f9ab2b87b6dc20b564b4bc1bf3c32df92ed2cf6f0eb1", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F4", - "seal": "S1" + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "seal: without a context, as a reader of v0.10", - "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d04030204473045022100f3e262b82a8270b9ba9ac7c53e3ac684cfafb8799ca3543161e5f4883dd7f1cc02204c806cc886fbd06e0eecc1e3a3857fb33741f04a5d0f4e3f6327f1a895df483e", - "no_context": true, + "name": "alg 2: SIGNERS with a certificate twice, beside a valid CMS: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590f61a3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590f1230820f0e06092a864886f70d010702a0820eff30820efb020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b131820a4e308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207f0972277a7c59718d468a3fb5ccc9533d0bfdc1372bf9333c75a2b468ee019d3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020447304502206a32adb9d7123baea85952c909175afdc42f51596de7916ca416104251ab08aa022100f3e2773ec9c183032ec0245e4f34ed4a30b5a2fbb5a085bd4077c4a138471a65a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104201434612837f8d48c4c823c9fcb218d847f711cdb8f5734a843fe90b6f778146002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420617c1ecc3c450062722ece04dd7b3d7675247a5e7e47548b1a603fec2dfa722d300a06082a8648ce3d040302044730450221008ba5f4a89072335b7d41bdb2d3dd7d0d26c299736c4d94111e9952b3110b5e21022075288f834a020b7028f11b22a1445ed1cbb98f5b29b3a2ce49bc12dfa14c990f30820583020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207f0972277a7c59718d468a3fb5ccc9533d0bfdc1372bf9333c75a2b468ee019d3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d0101010500048201003344eef8900e08621d6159d278fd7ec912b61e3e944a87522ae19310a60ab95484ebe8ad490e44c599bdad512e4cffe006f1d1c2f048a0ae88031e1f2961d046e5afd23afaabffbbf2bd3f2c3705e2616198c88fcb5bb66701b4c1976094f25ae1132aa0062f0fcae5ec6bb2b4484cc0355e2b0b75a6624726f5b4d086250aaf460d0fa32dcaa9f2d4508042607aca02b64dffaee352807dd4aac04041fc7e15f2f93c1f757b5a79bad1ddaf48557ca3d3333f43de8b15bef4ce2fad29cec702ca69aaf5ad710b68ddd5fe8bac561043ec4d63f60825bfc44fb9127f7233d1a0617c156279d42463ceceb831d0f8c72a5c942975d12d2aad3630fc3ad787c49fa182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ca85333637d46fcce3fd844c53a4184bfae1fdc076a02accb4f58a5d9065a11d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420f6011fc833d3029a833f710553fe26954c543adc06fbbaf8b3c4dd2a56809b51300a06082a8648ce3d04030204483046022100e249f2a003168ba817e73b691a7b879b7279b2d065fd4d82dd2a656c37d2e9e6022100f0169bf615ba6d825aa7b9aae45941bb46c8827f1bf89c6852b694315e5dfb70", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, "signature": "F1", - "seal": "S1" + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] }, { - "name": "seal: over a capsule without a signature", - "security_cbor": "a30071646174656b6579732d7365637572697479010103590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104202c95d37cb9658ed6387ff8e29854bbff409a1c4456e17ab6d2c46eeb54d7b3eb02012a180f32303236303933303132303030305aa08201b8308201b430820159a003020102020816b536ff6d9413dc300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d030107034200044430921fc91a68617c785dbc7c013ede1800b37704747bd9b7280e20e475251cca9f1799b84f3cc4cf4640590697e4c425fde6329b1878f7198e91ca9fafd9e7a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020349003046022100b26b717908be147fccbe24182e8c0072e920af74fd217c818ee34950d3a8aa41022100a6d042065cc3048680da599203465f7ac6322d76a8409dfc9c79435a72c2a30a3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261020816b536ff6d9413dc300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414f4b0c8ba1da2495736b3b8ebba20262ca957c5bd302f06092a864886f70d0109043122042016bf09210739e6175026faad38a0095930e12eaf345d0e740cdaf4aa5022f143300a06082a8648ce3d04030204473045022100e9c7003e488da05574e7bb2828349e8ce5d324edc32e4ab996d1b6c0335a090502206c5d0742831aa0c9a99315560dbb1e5550522f44bb9fb4ebc9482e9f9f4c911b", + "name": "alg 2: SIGNERS of 16 entries, the most, each signer sealed: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025966cba300020159022190582007d599acc78169f777ad444377ae3a89da0c680a762d6f3a61eeda3dc90e984858204be912775404da05812de056d756fdeb9d288fbf02e05b8dec669242b101355e5820554d127d73102dda5038bd01ad5c01d7f0a1e37fcbd45a6f1ac4f5e52e9ce19958206c49616ed7c440fbe2b7646a7f31485aefb2ade393a201189dae6830fd04780e58207b5382d148c70f4a5fc48e608ee33e2223a48feceaf75d042eef9f0af428ef4358207f5741a8d060c5776a36d1588e717fc455c46ea893211fd79180634baeba70cf582091a5b1f1573c2adb4e3393a744a51f1af03f45860bb2b5efe404da4acd3b2889582093aae1a69480dad5da2b26175f1b6fe3c734dcc3882919ddb029cc037885ab225820a125a5c482051795d4424bb196547ecb6a2a8a4d898dfd64b514a3f18eca762b5820a15c752812015184bc15ea70aec3c2ae34f0711c9af4b9cb65917bd72a5f91585820a52c99e28590dc187b44d81b5830900b849d13f2b77b5ca9d504494e7949aea75820b26e2d2d281740452b591b167058bfca8a212629589f96906b0700207a7ad6a15820bfd5e0b55a4088b3107561ac41d9bec2a4c96d9ed129a020cd95cccbd601eec05820df5af1cf14fcf49b1593104afa2b7a70878ccf15d5dd63e4ef1f567477ea8ae45820f2e06e6ea8c4b4614420f0d277a6feb0deaad261f702aa412e7710221b04036d5820f4e2a930321fd995cd24b545e20a883450a520b18d23eb121474b97e3b76201b0259649f3082649b06092a864886f70d010702a082648c30826488020101310d300b0609608648016503040201300b06092a864886f70d010701a08217de3082017930820120a00302010202080789f55fcd4882c8300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203033301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030333059301306072a8648ce3d020106082a8648ce3d030107034200047735555ea0af22cda454eb34e3d38c16779e8762cded13648fb9499693f4b4fd12a5a13a07b331e24ffe5b2c6d81c464bee87e706554d1aeaef2718dc207692aa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203033300a06082a8648ce3d04030203470030440220431b4abe456a0bd26bf37e13281791c43c25affdf32a0e6b7c35537156fc0f7602201a13357c3c7e3bff233044eda419e04b8507aa4314403995126bba48f7b353e53082017930820120a003020102020818cadac6d07749cd300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203133301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031333059301306072a8648ce3d020106082a8648ce3d03010703420004542d4618e6716667acc3b37c37123d6309f77ff6920b9247bec9ba43f21506bd3fee380483cdcb00793a62456a472319e67dc085037dd280e3b7ec5be59f1137a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203133300a06082a8648ce3d0403020347003044022033f677f8da9a037f5c0df52f88e5824376dccf59fc2b4e362ad567a3517636cb02204f5cf0e84242b590142d3963deb613f69731183fcc7b8ee5f92ae88daddd47513082017930820120a00302010202081fe99410dbe90f7a300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203038301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030383059301306072a8648ce3d020106082a8648ce3d030107034200043aae71b67e4233f590498caf9f0cbb878fb9e5bae1a0932bebe696d0b34519253ebd288f9b6d60a6b5ff6f3352ff719a6ceb0f472fcc341f1d07310e9e59d1aaa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203038300a06082a8648ce3d040302034700304402203de33b864c850d4081673ae58dd2ec8253dc022fededf0da29437e616ffb566202207616da52dee74a1423ddf3e99567171055ab8aecef991ef5d0d65680d1f088bd3082017a30820120a003020102020803d06c6c8f5fa193300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203136301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031363059301306072a8648ce3d020106082a8648ce3d03010703420004a59dbcba792e6fff17dba6c9972ee83408af4fa25c5bab7a147f63b917ccd292a95f713056f5e2dfef5bdcae1d3e8d1ab0e20d6c7bd2dd8c1c4afad4a86cd518a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203136300a06082a8648ce3d040302034800304502203dafa55d2166fc86ae91de99857d055a9d3a70acb03eff62b45fca0573a835fd0221009e64cab7b68a2054200d4191257492fbb624892d7434bfdb267bbd2039820b473082017a30820120a00302010202080b56a89d5af569b3300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203034301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030343059301306072a8648ce3d020106082a8648ce3d03010703420004ba71c70bd313dec1abd928de932a234d44bf3ce1332f1501954e649063e72c147cde72f4876d275827f41cf1c5360bcf3cf10bea7aab61a68cd142c6e8a5b8d8a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203034300a06082a8648ce3d0403020348003045022100f26e3665f6c2411c53ea5c1ef595a3823054d55ea9f3e67b67ae41129ac26ca502205151b21a7dcd1ba3e3934d450bd960f3a0238572ba8971b787ec06774c220d1c3082017a30820120a003020102020814a203d3073d44e5300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203037301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030373059301306072a8648ce3d020106082a8648ce3d03010703420004089e720859f6c3cb6034ac75daf8168986978d01ac2934f65c9660a91117c16e392dd88d94566af4c6862c06d053948c3663132a9cf9e17b76c23e2ee64df5a6a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203037300a06082a8648ce3d0403020348003045022100d486ae70c630f9cb10d3c9e4707d847076326b62d85875d01deebc90208e121d02203a3e0ccba63673d5ac0f01a271ed021bea5d07ac5559f0aebd5a2d5c6c6c9bf53082017a30820120a00302010202081dbc49e063a640d4300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203131301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031313059301306072a8648ce3d020106082a8648ce3d0301070342000403f37589c25b78b0f9496669d7a4e048a07c702ed41f4cce19ab5939ae7a9443b1a0860992aa5562503f6486d23decf4a09f4cad15a6e3f1474ce2ad94e835afa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203131300a06082a8648ce3d040302034800304502206a07e33a92d293c9ebe8c0d718e5ff19d363683e476d0c96a893aa8df2f580f1022100cbed8ffe0d4347fba89aed5d7111d9af08186805391318a59de806e6043a87b93082017a30820120a00302010202081e5da526e488cc7a300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203036301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030363059301306072a8648ce3d020106082a8648ce3d03010703420004bec32ff77619f42698463ba550574d2765c8852a42e673439cc269b36dd60868d50eab77096bc680b2a2b99cf38ae5de717da96915db0efd9460a65d6abd928ba3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203036300a06082a8648ce3d040302034800304502205c5f1130830463fd693059207106d0378797f2fe4be3248aa915d58d78ecd63b022100908065f561ba1fc19c748f99e209bc1211cfe90ea3a973bb02e2f79b1481be113082017a30820120a0030201020208235a1a82d739ce3b300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203130301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031303059301306072a8648ce3d020106082a8648ce3d03010703420004d54a3a0fe62c2676e0595829c00442724a73c155e1bebc54b4add5fecd63b81a74a3358f531543208af95618dcdafff5badb81d9dbf070347274c78450d6bce8a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203130300a06082a8648ce3d04030203480030450221008d3e76f88e91a629d993c741b79a70f80173000830df0c1a22f0a05010cf6f53022059c5a9d0bc24dc8388db20e482d200a5a728ce5b63a19fffade5c8f4d93f565a3082017a30820120a003020102020824346f24941ca901300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203134301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031343059301306072a8648ce3d020106082a8648ce3d03010703420004423fbc3776e5ffdf689031ec956c70fb2fb31d3bf3355199d304b80e3036ba75bffa33968f7d533205962a7627eda5d9b6ec0efd3cd8086de568357b6c467788a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203134300a06082a8648ce3d040302034800304502200d34a47985585120129586b2c5be208a99be5f476fd0683c3829f1b48458c8b0022100b6a99616838ce93c1122e7faced7f3b3e4d9bee3b1ee7ecbe3d7ed8bc196a3093082017a30820120a0030201020208262f181d319e7f3b300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203039301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030393059301306072a8648ce3d020106082a8648ce3d030107034200044a6b49339efe1d0dbc20aa236c64f338ad5890269ee809320f3c36638cc8c5cd967ba9d6aefe751156a25d8d6f589006270e4a93c8c298d6e0deee12acf5427ca3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203039300a06082a8648ce3d0403020348003045022100a20c31ff7cd32dc1f9bb8d438855b148e69dc39492e2ceecfc0662c701895a9b022067612248faaeb1981701aa845e9c069ffd249bb2e3040d0643a675a5ef5e08c93082017a30820120a0030201020208268f999b616d329f300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203031301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030313059301306072a8648ce3d020106082a8648ce3d03010703420004c127dc65860d20c61c8317e1fbb649a0522cd95a0e6205b1638c90bda8aec17ea2bc1751f7f3599f466cd7c998418f166dbd849ca663387da015b8db0f18f48ca3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203031300a06082a8648ce3d04030203480030450220563fae89aa1b588d34330a9a7c6322f5ed2243e1678d0f79476873b0ae57f15a022100ac9dcdfc8fe88e04b9b16d0ac9b07dd45c8fff285d1d9d6be705d7c020f881613082017a30820120a00302010202082b979fdcd7c39cda300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203032301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030323059301306072a8648ce3d020106082a8648ce3d030107034200048d83d942618837a16319ad19af5aec28057367a94cc29724c81c4fe08821b2f9b93dc65369d47c858bfaed985ab379336a6290040ae6ef8bb0c993168c99b6a3a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203032300a06082a8648ce3d0403020348003045022100b76462d77fe101aef621b57e8d7b285356f834954bfe37c4909c1ec7520767a4022023bb0025968b8da3f54800f7c20fabf4c65607c7588dd15040854f3c66a6bf753082017a30820120a00302010202082c7b1c7f6ba952e6300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203132301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031323059301306072a8648ce3d020106082a8648ce3d03010703420004f2a4d6007264b466d2a1335f8a211c45f3cbacba4e4c3da1e5fbdb9ce23103b1ca8fdc945053b1d0d9bfc4fbca17088458cd8b59725f512da0605238f01b57b3a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203132300a06082a8648ce3d0403020348003045022071a3a50a8ce90b64519dde72ce7da15328a87c4c1e989dcf48ae2bf495c98155022100be7a785774fc389be9e7cfe6904da4bf73d47f634a995a1899d7cfea30845dc23082017a30820120a00302010202083e9eca4e08e4ce8f300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203035301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030353059301306072a8648ce3d020106082a8648ce3d03010703420004e795c41091565b75b9d7a7606e245c6a38a4fa965a335cf6aba0f1e822f78965848c8db2ca4386dab8ac77789bfcfc2f976aa22f470fa9e6eb6aeb20be33b60ca3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203035300a06082a8648ce3d04030203480030450220425b9040edee9bc092cd1266c870e38219b4ad6b9e9be01981da75e7209170bf022100c90e97305933be519b0d96ba4f4145e76d1de9c0fdb8cc2031b2ba30b2d9a96e3082017b30820120a00302010202082a90e816430ce8c3300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203135301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031353059301306072a8648ce3d020106082a8648ce3d03010703420004de9bc16d3d061388ab6d11f627d93f97ac83934c5772d41b1a2d16fe9f72ee6593b648adb75e9dc60f70b8cee5cc7f30fefa766046dfaf397d8d36b29944ae31a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203135300a06082a8648ce3d0403020349003046022100d9743d7c3f826d8cd2677b9f45adb10de248e5b853532d1a2fae9fb116cbd9d9022100f66a6e192a35db710f6507aef5a82f400d4882f66c2745c993e4ba2b0bb23ab831824c83308204c2020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203037020814a203d3073d44e5300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420a15c752812015184bc15ea70aec3c2ae34f0711c9af4b9cb65917bd72a5f9158300a06082a8648ce3d0403020446304402205e0129061462b7402b193104ea09d0599971000659a4495b462ad1196fb921cb0220294c8c9e7972f81eafdf75b4619ff7fa1493b29fe387a81bf0d82be26de2c310a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104204ce1eab8334c63293ab2ea29b7d075bc36978ef2f056c2c64c6b774e7503f63402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420767cc51151bc5a162b39c4823228995247a7af0c1c1fa63eda5bdb8826d669e7300a06082a8648ce3d040302044630440220191f42686deb6acb6db5bc2a6202d5ab255b2efe6f50111bde2acd41a5c370f502202758a23b7b129ecbcf28e14f90b76ef6b7ae69dde3e84ee8b74ae28b268dc2b0308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303802081fe99410dbe90f7a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420df5af1cf14fcf49b1593104afa2b7a70878ccf15d5dd63e4ef1f567477ea8ae4300a06082a8648ce3d04030204463044022025548d84205d447299ea0ba9f17a0544b772531f33250fec2c44da7b4e4e2e4c02205ec7f05c883cc4aae706d7279cf1bc067903af15aa52fa62d896d804466e8c9fa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420dcf4a36c38166bc7b2078bd8db24595bae3eba4789c1377aafa6148204b937c202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a74050c7f9ee0a36914993ce574c2badf9d58011cd2afcd38a9f1f29f79b7626300a06082a8648ce3d04030204473045022067b4839a73f0d84cc2f364499e82c9c9b8d052688fb0b2e7612e0a143b22c1a8022100896c0ebcde7150ad48a83c18f5cde11123e3edec1f1262ac0635afd93a02b769308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520313102081dbc49e063a640d4300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420f4e2a930321fd995cd24b545e20a883450a520b18d23eb121474b97e3b76201b300a06082a8648ce3d04030204473045022003e137146acd4c9214b60732e6c05ce5cf47af0738910b0cbb7f31984e3e8804022100ca6729bd52545d560023a7586cc444618500c845a9f12ecaa10c9e413ed1912ca182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420b71f81e0f0f3853d2e1df271c57f746f2d46bda9d188a41bd36ff46fb998de2302012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420025c9bed8e72366dfc871dc4c5cc3c62e1073cec78b9f859991f14353f304aa0300a06082a8648ce3d0403020446304402203a2cf7e5133dcfce4dc0475dc7cde238182a1c7c04f833538c44c2cbb20f77b10220226fefb0bade83cc519687f19ad9546682bbcd8dcb5fa162a6da5cfb691b43d7308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203133020818cadac6d07749cd300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420bfd5e0b55a4088b3107561ac41d9bec2a4c96d9ed129a020cd95cccbd601eec0300a06082a8648ce3d0403020447304502210081dbbce4f6bd7644a529eacc4101219e9c3b62996cff830bd3214b9c8a2d501302202a9d97378dfed1d0e2905dca54778a013dd7b25c41045f26f3d9bead0938e469a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104204580fa61563e033a2c751f3c7177c7494ce9c621c9e2fa8e5b89f9377c40963802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a020065f3bb02bd34b7851bc948127f895e071b6086f1448ff2aec041d4029c9300a06082a8648ce3d040302044630440220154c08841a7b97330ca2c0a026b9d7e72bba623a44f42ec3f3302a1a51e5d18d02205b4e77484057a6c7835f0c0e43864ba511cd4f2c1cf1be6c19786f16b4cbbfc4308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030310208268f999b616d329f300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f312830263024302204207b5382d148c70f4a5fc48e608ee33e2223a48feceaf75d042eef9f0af428ef43300a06082a8648ce3d0403020447304502203dda55c9787865af755d897a90da6039d96c079c06a16fd915a2946326ffd70e022100f641a93ed48551b0f5a8f01a120ae04b57f5f694acb5607da8466bf9f5499146a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420d43815184b9bcb1611a8b01d9492497b49d26bf605c2dace87250ac24d8d637702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420c54eea7eaa316229072538960fe00a77622e011f8e9a517c307bfdbb69d36cb9300a06082a8648ce3d04030204473045022100d645255d5da79629b1ba1a4f5175582ccdfc3255ccf3f17c42c6c37d78149a4002204a176af6e4b9a519ead1cda41a23d8c44ee7484986b928f407ab82961ddd87fe308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303302080789f55fcd4882c8300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f312830263024302204204be912775404da05812de056d756fdeb9d288fbf02e05b8dec669242b101355e300a06082a8648ce3d0403020446304402207108e1c3c424b3ed84f8a680cdc64b39847507a2309234f572e1bbe479f4776502206e78f6ce0ee0b116bebe8da55da4d49ee7a1f38fda0e58764300b5b31c4800fba182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420d75e0bede4f6378ab848f385f942ace9fde9c4e7007f88dad61d4503608fbe1f02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420dd4aae56936feefc7a758bb165e727af794174a577173f53d842bac026a1044d300a06082a8648ce3d04030204483046022100f77594e353de44b90ab0d2105cfb9030b337a0a728bcd7d21bdf5367ccbd5e3002210094a1780b93100294b71bf6c9c20615b14f06314291184f57029cd8f2cd7f8312308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303402080b56a89d5af569b3300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420b26e2d2d281740452b591b167058bfca8a212629589f96906b0700207a7ad6a1300a06082a8648ce3d04030204473045022100e2d23c36c881e78daf3feebc663a20d5e83c7a34defadb60df058a7bb2dce31f0220291c3804b81579b844dfb4f44a35bdff6aa9d6b8217d5b1dc10a209e388a244aa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420711be363789ab5e68d7ea2edd608e44f8195319b68028118da61b0f1359d75e102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204208d65807c701bed9361a087d70d1e0196edd9622fb34bf019e265e7a0a3584f70300a06082a8648ce3d04030204473045022100ff59a9ec0c9dee10bdd4b53a40dce80fb4d34b8292f95cd5d7c2def0d077af2502206af09685ca832cb18fd118d5ff9186eee9f68dfa46c3b5189034f26ac0279cfb308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520313202082c7b1c7f6ba952e6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420f2e06e6ea8c4b4614420f0d277a6feb0deaad261f702aa412e7710221b04036d300a06082a8648ce3d04030204473045022022b20989f312b883bd8ef645310dc9d3d8a6578a7c7ea4a83ed7fd306b818d60022100b8453cbed30b70f883c1c651a491164e45099aaf7b16fb4b88835aebb604b876a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420adaaa01de0481cacb480e4ed47af51f8a2336d816690ace550239afc3045142402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042028d5db5187ce9a2b13907b0f7fdd4f4e013f8917ef88777c212545a3dea5d105300a06082a8648ce3d04030204473045022100b4c5f2051dea92528780967d7818e66fa86824700161f565aa76ff9deaf723210220757ac3946c1e332540add6f40c895d9c5983f391df4e5270e20bade4ccf3525d308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303202082b979fdcd7c39cda300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f312830263024302204207f5741a8d060c5776a36d1588e717fc455c46ea893211fd79180634baeba70cf300a06082a8648ce3d04030204483046022100a05bd7a02bdbaba55c9c5ffcb94396281c31c726d7db039e168306f6c29e5c96022100b5eec35ea751ab6e96187af10c50600740b7591330ca85be94c91ab729a8a715a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420983ef6a6d50e4d3ef6c0e1cc3c727d65c2c9b720caa3b26a918f0181b5fc25ee02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420d4fd15cbcf23346b2277ed66ea63aad9eee9504231400c3bcba16e00b8aa4d9e300a06082a8648ce3d0403020447304502210082de107b1d3f74c2f4e8818703d08534b4c354597d5914cefeedc01402e9704202203e4eddb66d9cfa0c391900ca3b04275627e1dbae65ce766368ef16b90d41ad98308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303502083e9eca4e08e4ce8f300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420554d127d73102dda5038bd01ad5c01d7f0a1e37fcbd45a6f1ac4f5e52e9ce199300a06082a8648ce3d04030204483046022100c22da274f671c1459f7e2207fd25aa626ba3baa24276304b066da0ae6d3a08120221009569069045593cf5e6908502014eec9d5d21fdfcdb8dbdb68349060915d6442ca182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ddc25f4404daa7e1e52a75cdd541df6fe82e2ee215f9de0e94ee6d10ee416d6d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204207f3eb5fb477de4ac8ed1184451e537cc58fde04009784db9159a472146318786300a06082a8648ce3d0403020447304502205e6b2767f0e9a6857d59babbb013dd1d8c2a3006e9a7c7b5b8475ae412127361022100fd280fa304b87bf69adb5d13aa65a9ab4e664a39808a4cce6207b10f1457f93a308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303602081e5da526e488cc7a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f3128302630243022042093aae1a69480dad5da2b26175f1b6fe3c734dcc3882919ddb029cc037885ab22300a06082a8648ce3d04030204473045022100c68e578da03080637168160f6a33748ccb8202bae4f76c136fb80f3ec889861f02204b69314a4773a42e014751de3cb35c907d9ee359a3d64c47ecbf7629e97cdf34a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104208bec322402ff18bdaf271f56fd5f051f564a0477926ffd8cee3e47418d0ed08c02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420853f74a73c4f59938be0ec800fcc1784072c7ba7e395d23decd9993ff9172f13300a06082a8648ce3d0403020448304602210090020c596e2ffbe8c29d6afaabcfd4bfad8e5a3132bb778a116bcc9842efbe14022100ddc1d1e8b795ec0332c4f17c8a3e4e691750b888721538f4b2052db2a9e06ae8308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030390208262f181d319e7f3b300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420a125a5c482051795d4424bb196547ecb6a2a8a4d898dfd64b514a3f18eca762b300a06082a8648ce3d0403020447304502201ecbf8a968bdacdb5d035472d0c885774d5039791238efa5220e72c431c42cd5022100fe46df5c0485222be8bf2edbefab584a722e360bc04c27079b6054e9a228a410a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104202f334d7b685e1bbc63fa5c058cfb43644039d99a25bec9d1aacccd85020f487802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a377c47a9f086accfab313d4d0fcec9a7efb802039e9a0e9e715773b9de8c20e300a06082a8648ce3d040302044830460221009cd935d3bdde4f88019a39f38f57c067438fc84992ceb951c13e94e683bd76d70221009776114534fd32202bb141e845de0f8923b85f1b57ddae7a353d6f2060f650f5308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031300208235a1a82d739ce3b300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f31283026302430220420a52c99e28590dc187b44d81b5830900b849d13f2b77b5ca9d504494e7949aea7300a06082a8648ce3d04030204483046022100e082e39794180b28f8f18d09e9c84e5aadad6eb8e64e3033ceb1b0fd566c8c88022100c140c8e5cdb3365384ad4affcd0df37da9712e1f8920ac08deffe15bdc3c39e4a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420f99faa1e83d9a9d902ef17d49809da2003da9456e72a03170c46c9709d8ab95602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042012928162cc21e5780c48fa04c2ceeb717d92b7a3addce995b20550869d07c6eb300a06082a8648ce3d04030204473045022100f290f48af8905196d3b9894cc7b85edba3b66098370b89fb1a1686312bb1a14102202c7e3160e0d50b24bd609ca610ca639fbd389ab976030e23031a06242e4f3657308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203134020824346f24941ca901300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f3128302630243022042007d599acc78169f777ad444377ae3a89da0c680a762d6f3a61eeda3dc90e9848300a06082a8648ce3d04030204473045022100fbc17088862b9199c9e38d98fb7ffc46acdd5400eda373dc1e1c57273350f98602201dda9f633d8212efe391dffcbbe2739f78db7ee25f29221a6c88ed563b9efeaea182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042060d3409b60bb7d6cb8cc35adce39f37fd884d95c26fb902db566c95f3f4175ec02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200434c8124ef3493e48711d51cb6080da1837f12ef22a01587f758951005db7aa300a06082a8648ce3d04030204483046022100cb6893906fddfda087c4ff0da848476c3c7597bdfc26ec4619dda16b6969a445022100a9824194673384f7ac62876328bc93a4ca626b7aa56553f0a2bc7b049a25e3d3308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520313502082a90e816430ce8c3300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f312830263024302204206c49616ed7c440fbe2b7646a7f31485aefb2ade393a201189dae6830fd04780e300a06082a8648ce3d04030204473045022056e2b381715d0bec5c3174621cb5019a6df3bfecaee9c3c575f3b12a6bd3d7cf022100cf09bc2ebc9496f630f3bc8344003a218d5a2070db5f88488245a7f62d0efed0a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104205dbbb842d0246717d73155081b20be31cd15c2d37c9cc3caf9d082feb99d1ed602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204206388b41c8828db5406220edb6caad1b0c9b15b74f3da7a6f41b9cc5280ddd9a5300a06082a8648ce3d04030204483046022100be03ca7de1c510ea0cfa4df1f189c81b7a6c5ecba94228e0302555b1e4332beb022100f071e6fa5bd93fd63deb0c64307461d3f2e97c674dda0e3e38436a0db0be3e99308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203136020803d06c6c8f5fa193300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207701d4f51ac01c97d6838849300065b0560091a3d310ad593a9a58d914454cfb3037060b2a864886f70d010910022f3128302630243022042091a5b1f1573c2adb4e3393a744a51f1af03f45860bb2b5efe404da4acd3b2889300a06082a8648ce3d04030204473045022100f6e22bb94e8068134a58ab0c377094389f86d5fa334cb6c7c1859763ea2d303702202f5b54c7fcbe611a06a5ba8bc4c15dd5d80a61580b70ca528be34af71d1bb7fea182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420caa6c869888a0c09f244432721bdbbe0aa5bb40743e087c05d697527fa38282202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420e7247893aabf31d31b31b7ab32931851673f1e650dd297f65239a0043589699d300a06082a8648ce3d04030204483046022100ae15bd4756d666c37c1713148372529fae4ad205cec0495ec9343a1c7eecb73d022100ea8fea04611e2400d86ce4c8e10f8bd594c66d63d0389a1ba73658f4f17cf923", "context": { "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", "round_time": "2030-01-01T00:00:00Z" }, - "signature": "F0", - "seal": "S4", + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Firmante 14", + "issuer": "Firmante 14", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 03", + "issuer": "Firmante 03", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 05", + "issuer": "Firmante 05", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 15", + "issuer": "Firmante 15", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 01", + "issuer": "Firmante 01", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 02", + "issuer": "Firmante 02", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 16", + "issuer": "Firmante 16", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 06", + "issuer": "Firmante 06", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 09", + "issuer": "Firmante 09", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 07", + "issuer": "Firmante 07", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 10", + "issuer": "Firmante 10", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 04", + "issuer": "Firmante 04", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 13", + "issuer": "Firmante 13", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 08", + "issuer": "Firmante 08", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 12", + "issuer": "Firmante 12", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + }, + { + "holder": "Firmante 11", + "issuer": "Firmante 11", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Firmante 14», «Firmante 03», «Firmante 05», «Firmante 15», «Firmante 01», «Firmante 02», «Firmante 16», «Firmante 06», «Firmante 09», «Firmante 07», «Firmante 10», «Firmante 04», «Firmante 13», «Firmante 08», «Firmante 12», «Firmante 11». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Firmante 14» (emisor según su certificado: «Firmante 14»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 03» (emisor según su certificado: «Firmante 03»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 05» (emisor según su certificado: «Firmante 05»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 15» (emisor según su certificado: «Firmante 15»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 01» (emisor según su certificado: «Firmante 01»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 02» (emisor según su certificado: «Firmante 02»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 16» (emisor según su certificado: «Firmante 16»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 06» (emisor según su certificado: «Firmante 06»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 09» (emisor según su certificado: «Firmante 09»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 07» (emisor según su certificado: «Firmante 07»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 10» (emisor según su certificado: «Firmante 10»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 04» (emisor según su certificado: «Firmante 04»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 13» (emisor según su certificado: «Firmante 13»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 08» (emisor según su certificado: «Firmante 08»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 12» (emisor según su certificado: «Firmante 12»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " «Firmante 11» (emisor según su certificado: «Firmante 11»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: SIGNERS of 17 entries, beside a valid CMS of the 17: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102596d2aa300020159024391582007d599acc78169f777ad444377ae3a89da0c680a762d6f3a61eeda3dc90e984858204be912775404da05812de056d756fdeb9d288fbf02e05b8dec669242b101355e5820554d127d73102dda5038bd01ad5c01d7f0a1e37fcbd45a6f1ac4f5e52e9ce19958206c49616ed7c440fbe2b7646a7f31485aefb2ade393a201189dae6830fd04780e58207b5382d148c70f4a5fc48e608ee33e2223a48feceaf75d042eef9f0af428ef4358207f5741a8d060c5776a36d1588e717fc455c46ea893211fd79180634baeba70cf582091a5b1f1573c2adb4e3393a744a51f1af03f45860bb2b5efe404da4acd3b2889582093aae1a69480dad5da2b26175f1b6fe3c734dcc3882919ddb029cc037885ab225820a125a5c482051795d4424bb196547ecb6a2a8a4d898dfd64b514a3f18eca762b5820a15c752812015184bc15ea70aec3c2ae34f0711c9af4b9cb65917bd72a5f91585820a52c99e28590dc187b44d81b5830900b849d13f2b77b5ca9d504494e7949aea75820b26e2d2d281740452b591b167058bfca8a212629589f96906b0700207a7ad6a15820bfd5e0b55a4088b3107561ac41d9bec2a4c96d9ed129a020cd95cccbd601eec05820df5af1cf14fcf49b1593104afa2b7a70878ccf15d5dd63e4ef1f567477ea8ae45820eaa83426ae731a5de3ad9528df169c41395f463f4853eba5c7e5fcefcb614c535820f2e06e6ea8c4b4614420f0d277a6feb0deaad261f702aa412e7710221b04036d5820f4e2a930321fd995cd24b545e20a883450a520b18d23eb121474b97e3b76201b02596adc30826ad806092a864886f70d010702a0826ac930826ac5020101310d300b0609608648016503040201300b06092a864886f70d010701a082195c3082017930820120a00302010202080789f55fcd4882c8300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203033301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030333059301306072a8648ce3d020106082a8648ce3d030107034200047735555ea0af22cda454eb34e3d38c16779e8762cded13648fb9499693f4b4fd12a5a13a07b331e24ffe5b2c6d81c464bee87e706554d1aeaef2718dc207692aa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203033300a06082a8648ce3d04030203470030440220431b4abe456a0bd26bf37e13281791c43c25affdf32a0e6b7c35537156fc0f7602201a13357c3c7e3bff233044eda419e04b8507aa4314403995126bba48f7b353e53082017930820120a003020102020818cadac6d07749cd300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203133301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031333059301306072a8648ce3d020106082a8648ce3d03010703420004542d4618e6716667acc3b37c37123d6309f77ff6920b9247bec9ba43f21506bd3fee380483cdcb00793a62456a472319e67dc085037dd280e3b7ec5be59f1137a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203133300a06082a8648ce3d0403020347003044022033f677f8da9a037f5c0df52f88e5824376dccf59fc2b4e362ad567a3517636cb02204f5cf0e84242b590142d3963deb613f69731183fcc7b8ee5f92ae88daddd47513082017930820120a00302010202081fe99410dbe90f7a300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203038301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030383059301306072a8648ce3d020106082a8648ce3d030107034200043aae71b67e4233f590498caf9f0cbb878fb9e5bae1a0932bebe696d0b34519253ebd288f9b6d60a6b5ff6f3352ff719a6ceb0f472fcc341f1d07310e9e59d1aaa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203038300a06082a8648ce3d040302034700304402203de33b864c850d4081673ae58dd2ec8253dc022fededf0da29437e616ffb566202207616da52dee74a1423ddf3e99567171055ab8aecef991ef5d0d65680d1f088bd3082017a30820120a003020102020803d06c6c8f5fa193300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203136301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031363059301306072a8648ce3d020106082a8648ce3d03010703420004a59dbcba792e6fff17dba6c9972ee83408af4fa25c5bab7a147f63b917ccd292a95f713056f5e2dfef5bdcae1d3e8d1ab0e20d6c7bd2dd8c1c4afad4a86cd518a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203136300a06082a8648ce3d040302034800304502203dafa55d2166fc86ae91de99857d055a9d3a70acb03eff62b45fca0573a835fd0221009e64cab7b68a2054200d4191257492fbb624892d7434bfdb267bbd2039820b473082017a30820120a00302010202080b56a89d5af569b3300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203034301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030343059301306072a8648ce3d020106082a8648ce3d03010703420004ba71c70bd313dec1abd928de932a234d44bf3ce1332f1501954e649063e72c147cde72f4876d275827f41cf1c5360bcf3cf10bea7aab61a68cd142c6e8a5b8d8a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203034300a06082a8648ce3d0403020348003045022100f26e3665f6c2411c53ea5c1ef595a3823054d55ea9f3e67b67ae41129ac26ca502205151b21a7dcd1ba3e3934d450bd960f3a0238572ba8971b787ec06774c220d1c3082017a30820120a003020102020814a203d3073d44e5300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203037301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030373059301306072a8648ce3d020106082a8648ce3d03010703420004089e720859f6c3cb6034ac75daf8168986978d01ac2934f65c9660a91117c16e392dd88d94566af4c6862c06d053948c3663132a9cf9e17b76c23e2ee64df5a6a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203037300a06082a8648ce3d0403020348003045022100d486ae70c630f9cb10d3c9e4707d847076326b62d85875d01deebc90208e121d02203a3e0ccba63673d5ac0f01a271ed021bea5d07ac5559f0aebd5a2d5c6c6c9bf53082017a30820120a00302010202081dbc49e063a640d4300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203131301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031313059301306072a8648ce3d020106082a8648ce3d0301070342000403f37589c25b78b0f9496669d7a4e048a07c702ed41f4cce19ab5939ae7a9443b1a0860992aa5562503f6486d23decf4a09f4cad15a6e3f1474ce2ad94e835afa3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203131300a06082a8648ce3d040302034800304502206a07e33a92d293c9ebe8c0d718e5ff19d363683e476d0c96a893aa8df2f580f1022100cbed8ffe0d4347fba89aed5d7111d9af08186805391318a59de806e6043a87b93082017a30820120a00302010202081e5da526e488cc7a300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203036301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030363059301306072a8648ce3d020106082a8648ce3d03010703420004bec32ff77619f42698463ba550574d2765c8852a42e673439cc269b36dd60868d50eab77096bc680b2a2b99cf38ae5de717da96915db0efd9460a65d6abd928ba3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203036300a06082a8648ce3d040302034800304502205c5f1130830463fd693059207106d0378797f2fe4be3248aa915d58d78ecd63b022100908065f561ba1fc19c748f99e209bc1211cfe90ea3a973bb02e2f79b1481be113082017a30820120a0030201020208235a1a82d739ce3b300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203130301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031303059301306072a8648ce3d020106082a8648ce3d03010703420004d54a3a0fe62c2676e0595829c00442724a73c155e1bebc54b4add5fecd63b81a74a3358f531543208af95618dcdafff5badb81d9dbf070347274c78450d6bce8a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203130300a06082a8648ce3d04030203480030450221008d3e76f88e91a629d993c741b79a70f80173000830df0c1a22f0a05010cf6f53022059c5a9d0bc24dc8388db20e482d200a5a728ce5b63a19fffade5c8f4d93f565a3082017a30820120a003020102020824346f24941ca901300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203134301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031343059301306072a8648ce3d020106082a8648ce3d03010703420004423fbc3776e5ffdf689031ec956c70fb2fb31d3bf3355199d304b80e3036ba75bffa33968f7d533205962a7627eda5d9b6ec0efd3cd8086de568357b6c467788a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203134300a06082a8648ce3d040302034800304502200d34a47985585120129586b2c5be208a99be5f476fd0683c3829f1b48458c8b0022100b6a99616838ce93c1122e7faced7f3b3e4d9bee3b1ee7ecbe3d7ed8bc196a3093082017a30820120a0030201020208262f181d319e7f3b300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203039301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030393059301306072a8648ce3d020106082a8648ce3d030107034200044a6b49339efe1d0dbc20aa236c64f338ad5890269ee809320f3c36638cc8c5cd967ba9d6aefe751156a25d8d6f589006270e4a93c8c298d6e0deee12acf5427ca3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203039300a06082a8648ce3d0403020348003045022100a20c31ff7cd32dc1f9bb8d438855b148e69dc39492e2ceecfc0662c701895a9b022067612248faaeb1981701aa845e9c069ffd249bb2e3040d0643a675a5ef5e08c93082017a30820120a0030201020208268f999b616d329f300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203031301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030313059301306072a8648ce3d020106082a8648ce3d03010703420004c127dc65860d20c61c8317e1fbb649a0522cd95a0e6205b1638c90bda8aec17ea2bc1751f7f3599f466cd7c998418f166dbd849ca663387da015b8db0f18f48ca3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203031300a06082a8648ce3d04030203480030450220563fae89aa1b588d34330a9a7c6322f5ed2243e1678d0f79476873b0ae57f15a022100ac9dcdfc8fe88e04b9b16d0ac9b07dd45c8fff285d1d9d6be705d7c020f881613082017a30820120a00302010202082b979fdcd7c39cda300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203032301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030323059301306072a8648ce3d020106082a8648ce3d030107034200048d83d942618837a16319ad19af5aec28057367a94cc29724c81c4fe08821b2f9b93dc65369d47c858bfaed985ab379336a6290040ae6ef8bb0c993168c99b6a3a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203032300a06082a8648ce3d0403020348003045022100b76462d77fe101aef621b57e8d7b285356f834954bfe37c4909c1ec7520767a4022023bb0025968b8da3f54800f7c20fabf4c65607c7588dd15040854f3c66a6bf753082017a30820120a00302010202082c7b1c7f6ba952e6300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203132301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031323059301306072a8648ce3d020106082a8648ce3d03010703420004f2a4d6007264b466d2a1335f8a211c45f3cbacba4e4c3da1e5fbdb9ce23103b1ca8fdc945053b1d0d9bfc4fbca17088458cd8b59725f512da0605238f01b57b3a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203132300a06082a8648ce3d0403020348003045022071a3a50a8ce90b64519dde72ce7da15328a87c4c1e989dcf48ae2bf495c98155022100be7a785774fc389be9e7cfe6904da4bf73d47f634a995a1899d7cfea30845dc23082017a30820120a0030201020208343f870ef90a07fb300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203137301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031373059301306072a8648ce3d020106082a8648ce3d03010703420004e7f5e36fb59b3e1295ba5d3321c4fa83e7ea221130daaabb1cb0669bea9ab1c2d999c77c574441624ddd16225bdbf19a60f0eaa0d67288fb258750b5e8985bb5a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203137300a06082a8648ce3d0403020348003045022100c70c920c93d19756bf422fdce7fa83607d87aac3043a01dd6635ae8bfa6050c50220192b1634514c0810af07f73bd904770492757f708ef8e3633f9df2bf67e7b4913082017a30820120a00302010202083e9eca4e08e4ce8f300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203035301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030353059301306072a8648ce3d020106082a8648ce3d03010703420004e795c41091565b75b9d7a7606e245c6a38a4fa965a335cf6aba0f1e822f78965848c8db2ca4386dab8ac77789bfcfc2f976aa22f470fa9e6eb6aeb20be33b60ca3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203035300a06082a8648ce3d04030203480030450220425b9040edee9bc092cd1266c870e38219b4ad6b9e9be01981da75e7209170bf022100c90e97305933be519b0d96ba4f4145e76d1de9c0fdb8cc2031b2ba30b2d9a96e3082017b30820120a00302010202082a90e816430ce8c3300a06082a8648ce3d040302302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203135301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031353059301306072a8648ce3d020106082a8648ce3d03010703420004de9bc16d3d061388ab6d11f627d93f97ac83934c5772d41b1a2d16fe9f72ee6593b648adb75e9dc60f70b8cee5cc7f30fefa766046dfaf397d8d36b29944ae31a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4669726d616e7465203135300a06082a8648ce3d0403020349003046022100d9743d7c3f826d8cd2677b9f45adb10de248e5b853532d1a2fae9fb116cbd9d9022100f66a6e192a35db710f6507aef5a82f400d4882f66c2745c993e4ba2b0bb23ab831825142308204c2020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303402080b56a89d5af569b3300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420b26e2d2d281740452b591b167058bfca8a212629589f96906b0700207a7ad6a1300a06082a8648ce3d0403020446304402203c8b662708ef2581a275275084a29fd6629925877696268ad66d14163214c30702207e1b475f34e1ef5619da4f6194ad04191c7cc2c7c9e75b089052b2def1969df6a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420fbbcde53a72881810370f5268d4e4d0899cef177159458633053dd811374f35202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a8dd1a2eae548a36df56443f20cfff02b1c70d065cd4554ff819486bf76ee3f7300a06082a8648ce3d0403020446304402201f3e0adb744e45f6715e2c6fef9f29a30c875c7ed51fa73247fd491e84d36ef402205165fa6e8a03a3f7e0cf1ce7b7b771ccdeec85596d14b944ed73ec725d8c51f6308204c2020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303802081fe99410dbe90f7a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420df5af1cf14fcf49b1593104afa2b7a70878ccf15d5dd63e4ef1f567477ea8ae4300a06082a8648ce3d0403020446304402205b1fb64f59eacbc98faf79cf706bd8bf3174e9521c15a221d191d7781f0b260b02205b7079af8538ad7fe9aef39f18d9a57c69a8567c37b59725a4c5b463abadadc3a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042091d4506f52c3871232dc59f28ec94e827a8282e9dfb0295ece9a7ce305b5b31e02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200f772c696878dee91c2f96da65e8ad3bd892dbe3c51ae583f2f7f198f6318939300a06082a8648ce3d04030204463044022074bdbca4b29a4895a3f78d55e1c9be7e688fd60e1385d833828296c4a03a7bca02203a412ae7286c2ff725531e5d34d2c3c54f3bb282da2f93d8a152665693b75e55308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303302080789f55fcd4882c8300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f312830263024302204204be912775404da05812de056d756fdeb9d288fbf02e05b8dec669242b101355e300a06082a8648ce3d04030204463044022067f923c78d7ed57340ec6561023d8ab7e6895438b001720ed63a6c8ca1cb1d2802204783910f6fda1b95923560ee9aa2d198f08bcb66088fd99f0b6eeae3e589cbc2a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042086bcb6e80e82bd0bc55954db354a7315577b06fbe5af3cfdf606d86be6af4d5902012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204207abb08a784f4a8be00bbf5688633618b9cae107faad6270eb432a09c294a6bdb300a06082a8648ce3d04030204473045022100e9f00938752c8291f5c2ad855622cfa6f6938a221189028e4916f781ff0d3f7902200c836793547fb21c881d5c2ceae444e642558788dae15912118f0ffca4978571308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303502083e9eca4e08e4ce8f300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420554d127d73102dda5038bd01ad5c01d7f0a1e37fcbd45a6f1ac4f5e52e9ce199300a06082a8648ce3d04030204473045022040e92db3280c5ccf2141f7ce474eb2a03c73b4dd7d137b3b9d74ae03ab09df720221008fccd423ce4417506c27c7c0c2f8ba774c992224b80facb3832be7d4a97730bfa182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203c08fd6e31845a76a8215f8ad68ad4dca39879885ae59ea762da7839300feb6902012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420802d6ee9e07d2d9634ef89e33b1bf4cec6e94602f1c0577db686f0c87295c2f7300a06082a8648ce3d040302044630440220151fa9d298bdb5af0b7511f6baedc4d93928f5332753bb26d15cc39a3ac6afb202205c12a7c59777903e9e2ca592ca58dcc8c5c9bc015fa888e58487fed8e16b99a1308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303602081e5da526e488cc7a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f3128302630243022042093aae1a69480dad5da2b26175f1b6fe3c734dcc3882919ddb029cc037885ab22300a06082a8648ce3d04030204473045022073e7b428493b289f1b47dc9e7460b5dc54aad5f22f3cf7bcfed9015ed4c61a01022100c6ecaf1ddea0ffa610fc651d19114bbbc6bd05f56ae94feabebdb38d0dfa16b8a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042077eb9281205ad7cbce0e52ebd5b14e914c654fe420e2d93e02905b663c6e602d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203c3c58c1c5ed194e568ab05ea8541da6f8e7157c0fa5c5aea6655e0c445e145b300a06082a8648ce3d040302044630440220399ca41d84039fc340f3f779a0ee263150c06c699eef15806952ecc808d1ba7002206dec0a4f41097af411e0a598e37a9d2a87e3621187af3980da270ec5909ce149308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203037020814a203d3073d44e5300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420a15c752812015184bc15ea70aec3c2ae34f0711c9af4b9cb65917bd72a5f9158300a06082a8648ce3d04030204473045022100c7c1ea4e098ae3db2fdb7862cb06d2a6369e4c0d21cbebed2149dc46f174fb58022072d6764df26514bba32dc6a46b06a7905ab1bd930349a168e6076c2c37ffe4dca182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420bd85cabe4565500b153e1ab232bfaf5edf1590f3d83e4b2e2ecea7fc6006efa802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ec3dce173f76426e78bdc710de87de0e572f63eddb087c9fb30b53d3d8b19ca5300a06082a8648ce3d0403020446304402203dcff6bbae05daa3c7e51f3b320814b907a3775db3ab8bfa7589f55f40847c1402200198fcd7a6837ff682333c844e5ee14bb89da2e97ca4b27a56717ec51d5ccc18308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030390208262f181d319e7f3b300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420a125a5c482051795d4424bb196547ecb6a2a8a4d898dfd64b514a3f18eca762b300a06082a8648ce3d0403020446304402207d7176537f4d3a3ba4a21e00186558a824f5483752944b56773cd2dc6146e7c602206057f17e649b17442adce836bbd6a2b64933ccf1be4167a46960892f0f62ba0fa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042022776453dec9465792e98b0091b72ae103f0bcd0c20ebf602ef3e0114d12f94402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420153c6f5e33992a8764a5cbffb2e34a1a2b07f1c867232cd8dda2b3a83530fbb6300a06082a8648ce3d04030204473045022100c74dd2e3c15839b0541c77a30da2b34da61322389eddda9d2b61e0b28a267c80022050fe257b88db9a4aa8f9c72c1386b41e3d2d8ed139fc830993a0706799145125308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203133020818cadac6d07749cd300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420bfd5e0b55a4088b3107561ac41d9bec2a4c96d9ed129a020cd95cccbd601eec0300a06082a8648ce3d0403020447304502200f16d388b6939e6b11c56e2dacfe70beab2cfc40d86fcea1c7f810c80ee35123022100decfe8880fd60852c17fd8974bff0662f22b05e5a4fe24a02c58c10e5e1ebfb0a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420df22b68375486750eaddc52ef4fba05dd8f2829bcca5acc39b8e633646324ef402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204208548bc3bf6e7e2dc1b31c2f68f8247c5375d2e9158285d7fcc8942f7efb04b8a300a06082a8648ce3d04030204463044022025e79291009c77d6cf287991632880699f4198cccb1f9810c0a4612f52f6817b02206d5e4297370e995d47bf962b70cc211b46ad81da4f648fdd7a517b09a75efe61308204c3020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203134020824346f24941ca901300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f3128302630243022042007d599acc78169f777ad444377ae3a89da0c680a762d6f3a61eeda3dc90e9848300a06082a8648ce3d040302044730450220775e7e9970f8ce4826245d6561da89cff9b14f0663b7060f55631afffbc60e4c022100df4a6a757794840820576538008f34f24865e867d0f286964b362fa60d2775c6a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104201cfc1834ad8a0f6f768c190dc61ba4f1f5ba9dde97623de9ecbe2ff1fbb51b3702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420621c66fbb0b26050368f8fab04e83375a21907c964269429d2c022169574a565300a06082a8648ce3d0403020446304402203804cbf4759c4f734ce47959be4c6fd111281ae072ae63685ffcd980e59747e102207d0828b64ebce540f6f27909603289adf78ac810aa51bf92347e79bfebac82b5308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652030310208268f999b616d329f300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f312830263024302204207b5382d148c70f4a5fc48e608ee33e2223a48feceaf75d042eef9f0af428ef43300a06082a8648ce3d04030204473045022100fb0e1188a654b03ae90ffecf2c7d34b962300f81b9bce5f6b35f4c84cd59e533022052e129d8f78aae5b7eb0a47817201410c048398cacc58564c25979f7f417b45ba182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042012d5131b83041173797fd2879ec3c9314cc7b54783abe6ef3e4adba091befc2702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420999aee39b32e9ae9da6137ff388fa07cc8fc89212b05c55b1137ca325195212e300a06082a8648ce3d0403020447304502210087b7c10cb22de1b3b7049547c351be875a5da1c76913c72e9977d031f1cb64a80220282a45d59ad134c3f7793f6daed24a59c40eecbb730125f3be5c2c9a2dca76d5308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520313202082c7b1c7f6ba952e6300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420f2e06e6ea8c4b4614420f0d277a6feb0deaad261f702aa412e7710221b04036d300a06082a8648ce3d04030204473045022100f3fcdff6c35345ef60ec64d754e92f6bfbefa08666999a69be392ba00bd9fe920220205c72bc1f187fe241b12b29ffa487fda7b1fd778371ab950d8ca8ba349e8f77a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420fe8ef777cb28d6458e44ecab7fc84cacb61ba26ba2daa634d4cf8c9494d6a1c802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203c232c0b535d7f7f2884aba5a336a4c610548de33d1546da028d648626ced413300a06082a8648ce3d04030204473045022100d1a076fd95a0bd22aa2e27a81ef7c7f28424782e9f6e8efe3415954646db82fe022021d2dac3e5bdc188844123150cb042d9abfc050e72340e06484884a629b1b37f308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520313502082a90e816430ce8c3300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f312830263024302204206c49616ed7c440fbe2b7646a7f31485aefb2ade393a201189dae6830fd04780e300a06082a8648ce3d04030204473045022034a44615d0669fb176bb37e7c6db79e380bcc4fc8aa6c26947962a082e86d46a022100d688b7d6bdffcf65ccee6046b665580ae67279e6ba1a8147ecce96f8eaa389d9a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e8b17ece10e6c401c6e789ca23bb3b00b9a92b9ce6c7cd7ed7e50fbf81d663e202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042016b894d41bad8aeb35c8a34f886e436e1a103440d686918f5b2473626ba701b4300a06082a8648ce3d04030204473045022100b1138c14bdb1e428d381cd73ef8d95ab67a432c59e6a1d54c7c247137cd3ee8b022038b33d197e758dddc8f8ea242b8f9cac81660310cd0947f1078486f1f97cc4e3308204c4020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e7465203136020803d06c6c8f5fa193300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f3128302630243022042091a5b1f1573c2adb4e3393a744a51f1af03f45860bb2b5efe404da4acd3b2889300a06082a8648ce3d04030204473045022100d175f0db0ad7f1c63e92f25876a4b67a7ddcc3502dd8af3c1e2d2407d47ab3c00220650a0dbe4c535f41237d17a73b62879d7e1d564e843acbf1322f6c571ffe0e5ea182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104209543f648252214886e095a22fe9fa6aa19eaf1ab7d20a3f4af285640590cfdd102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203cd07fcfc5bae6363b436b9e1c59abb23369f02c91e048ae61fcf7da1c906334300a06082a8648ce3d04030204473045022100c54867bd83835cd7f8b06aaff181274ca06c15ff5a0f49202a2d00b6ba5ccf3202207ad750f32990413e282a406ce8c706a5dff0abff62baa56be9e8653f5871c9d0308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520303202082b979fdcd7c39cda300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f312830263024302204207f5741a8d060c5776a36d1588e717fc455c46ea893211fd79180634baeba70cf300a06082a8648ce3d0403020447304502210084562ec8679603b39d09baf1337872a618a84f07d0cdd02af77ea024fda90e41022053b4408e886f3294ea49b7327277ae4bea74f0f99e5796d41c9d97ae30ba00d9a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042090a55bd2959ef925a0bc34577950e9df54aa63e99e6d1e22e0ed315e28a4192c02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042009897670191ea647e7df8c04bf060bc78bf33344ed42935ef3566d489fec29e3300a06082a8648ce3d04030204483046022100c2e5d760ac595d21a99f53e1def79f98184f036952ca785e13cf3bbdcb1abb78022100b0fb5bb063f9129925ef750ac56014ce37daf804efbd5d212f83085166587c46308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031300208235a1a82d739ce3b300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420a52c99e28590dc187b44d81b5830900b849d13f2b77b5ca9d504494e7949aea7300a06082a8648ce3d04030204483046022100ad14610951b4d7fef8fd34a65f5910b6465f4f86933fcfd13c8f6b9c801b4a52022100cb5432e018954aaf390759b0ff4dea89c0fc63c430e8f803b9c0333e8dfebddba182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420db5ac4641d438c9ba7b17a9f709d14dc5875b26ccf2b97908ff251cc8baa579602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420dcb4da1a2b171be2abf1f43241ead62c76c92534501e67bb93aa227df603dc9e300a06082a8648ce3d04030204473045022100e872b03cd94ad707a2f70237687320479400c73f933103a46158c396c9ae5f0602200ed37945d2555917960a1e81496eeedc3da6bcfb498d6c2fdded1a9fc3abc29e308204c5020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e74652031370208343f870ef90a07fb300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420eaa83426ae731a5de3ad9528df169c41395f463f4853eba5c7e5fcefcb614c53300a06082a8648ce3d04030204473045022041b5879e4cc8b5d1321d4440310f7489cbc14706ed830e23a619fb775ef185ba022100b2dce31064f34d1f15c2af2779fcf5f585e9a722dead64ff6a056998eb86e8d5a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e69737f55b739ee2f89c8e010a136c9c93d1a0f2a7a2d4eef34a547a4ffbd8d002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420961355026b85d97568d555d760991c840da160d91485bdbbfe5da3faefb709bb300a06082a8648ce3d04030204483046022100c55bfe61d2932c96e0c2fb2208cdd92eae8ea96b9556906161f86189d8d270c3022100c791a8a22db8f8c543e8efd6d8dfa3dd7d76c5d72191a5fab544c280c59b9eba308204c6020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b4669726d616e746520313102081dbc49e063a640d4300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204206c74f9d5165de4221a3ab006d1df02cc01e406e1634ea9192a877412fc9b73a13037060b2a864886f70d010910022f31283026302430220420f4e2a930321fd995cd24b545e20a883450a520b18d23eb121474b97e3b76201b300a06082a8648ce3d04030204483046022100ed8627b065a886115fdd111a22dfddda67fdf7dbf6578434ad8dab34766ae33a022100fd1048ef5b8377392a03aac7e1c65be915a932ea85aa2eb2bd4e2f060a070386a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104207ef75f3c9fc2ded99c30e27b28d356e326fd838d021c780b88ee48259f68a8a602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042091d605672da850ed4a2f7bf647b9aaccb4163640a7b68c5ccc05608029f5a834300a06082a8648ce3d04030204483046022100d5eaf22a1f063e6a69a611b9a8a7f26a43fa16e39134fbc9376afdc7e4446a8b022100b97691d6249ec976bfe72e7433a3bee757c99211a8d6a15999d6ea9a37be9830", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: the signature in BER: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906b0a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590683308006092a864886f70d010702a08206703082066c020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c9308204c50201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020448304602210093c4ae7b4ec73b6ad87bd99366b977e7bb5b991dceab4a536065563e7c0c10dc022100b06f40f917505cc4570573701026da0865e3c297a6cb6c740fcefb1778e2592aa182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ff0b13e006a193b4f0273e1e93cd4a33a82d749a45012ce816b5b61f7271aa6b02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420f30391e6891ad45a5fac7599ab3f0baac65cb098f9150235acacedda9eeb5ba9300a06082a8648ce3d04030204483046022100d26f5656384e811d321e0668dbfb754bd11542a5d364851e7c1ceddf996720da0221008790c40eff84682a155e74723799f8c12a3f7c29c918238ac66da5eebbe00eaa0000", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: signerInfos out of order: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590f60a3000201584582582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d315820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba02590f1130820f0d06092a864886f70d010702a0820efe30820efa020101310d300b0609608648016503040201300b06092a864886f70d010701a0820486308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b131820a4d30820582020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d010101050004820100142182e679a9044c5af50daa3faa26c2fc96f8a74e6ef3dd1cb14cdd3760661db00333ef361eb66da29151fc5d5d435de2d7b493332a59ca728ea7a69e8d9b6ef348bf10d1ac0c3d38dc19b88f2e38eea9f796072724698a6c4e0ff730b4abc9fa411deef8ebdf86ab0c5b40214d734956d9887e599ade56b2d5437cea9ad0d9ca62a9505f6a2cc85348d8468245718d14b79279b3865587ca213ebc0039d42e89f91df852091df32fe55e58589538f87f4b71a207cf2fb1d2fb12c8c2cd9d695a242ee7d16430e75527d8ad3d7937718a9da0d4a1534a78e0692e0fb0482fa0541458f78a38d1af28ebf5e65ad7d8ec7cd5f97fc1450aab545d47ec090fb266a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420eb258f2b2a7040cccd1a2fa0291bad8be5ff485216bd475a60af8c7d39d4263602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205c352555e91a6537702c0bc8faaba6c173900d5c369f7466e74184661de6dee5300a06082a8648ce3d0403020447304502207483efe36b51e89059cf951fe1d591339fad7f20ffa162decc0d8aaef0138dc602210081427f5568db3b46acde90291e93a7404b71cd4cb0e7ce480f8925bbd72fbc6b308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e03aa376a09538b8f97858f3fae3f123b373d8139a5c94eb7245192616f469ab3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100dc37bd93d881469d5752a0729208e666f28430db910a83af07ca3a17bad3cf65022100fa3ca39d179f365c1ddc9360694a630ca6428abefb3def47e644cc7c03a5fa84a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203dec87b749e367c9508f8667936d7cee3f0a54d4a7f87de0bd42ee9ec4c02c8402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042030117fcc6cf4e5e1f481164b80fdb550238f1494bef4c0d98bf7ce979119c664300a06082a8648ce3d0403020446304402207ad4e5182339ddc53b8e944d40a889dfd8af68da4ce878ec6166311d959e192702201202e326ce270bd94570ba2b7447d1de398105fb94d94346387194e4ee9d9ecb", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: two SignerInfo of one certificate: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590ceea3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590cc130820cbd06092a864886f70d010702a0820cae30820caa020101310d300b0609608648016503040201300b06092a864886f70d010701a08202f8308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c3182098b308204c10201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402200ff7490ecc0f6c3b7a30e11b503720aa3c46976dcf26d6ba246143ff4e5b2bb102206cbd9b6c0dad5f4bc10a609501c1d4ec9c53a1b45c56583647ae7394e8931e4ca182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420955b60ad6c57a289bc7a8d3bd68b24bf681c099db0ab1399558985aa3ffce6ed02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204207158d3e1e400fd498cad639fa7d60d41e7497d60553749ea05e15ec0aad0c5d3300a06082a8648ce3d04030204463044022015e578dcaf6b649cd7bf09dc6b8c17440e8b5f10748b5f815440c26e35726550022069a5d53164bc8e5281342c3a7272cea22bb06c2bb440d7d1a4d0d22ebbe2c508308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d040302044630440220631452b3eb6dfe904db4b488304daf3b1ed17b456dbbbd2480f310919c0f63a802202c1a56e0a4c4e657a807cde8aab29fc547601d901524276e73d204a5e147e7d0a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420d837dc274995bfd5cf4e3365f8ce8b6db6a0759760625cac1bbadea01e90b60602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042099fd05ca7a974b7257c69235e4fa96350ac16b5b2ac738a6b77adc1dd4f8ba55300a06082a8648ce3d04030204473045022100d998bca2366059cd17ff40c0508898396ad10f086c97e12d2c92879253d97923022036733d1d67512074606e0a50c0e2f74fcf4f3d8467e44b317cf1c366a735e19d", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: the same SignerInfo twice: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590b77a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590b4a30820b4606092a864886f70d010702a0820b3730820b33020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c31820990308204c40201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100a473f349e80105cb6718dff3ff633bb23d333ac040ca06ca49e0a2e5695420e102204c1281c319850068fc0131a96f77943c12efe60cc6e3b900c30240b59840ea13a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042088929af57eb854ea1b70a1e85b0dbbaf280ad759c5e662103050716140dea06a02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420859878a4d833a64739b459ec82654f6bf8c2be75254217d34042598635a1e55b300a06082a8648ce3d0403020448304602210081efb6499bcc49b97e33a5a62f72ff84d30902ab70fa283467d74bb464c2af5a022100fab6b7301e5550e4fbd1037cda904abb702d02e868ceafc6779bc40f3d7716e9308204c40201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100a473f349e80105cb6718dff3ff633bb23d333ac040ca06ca49e0a2e5695420e102204c1281c319850068fc0131a96f77943c12efe60cc6e3b900c30240b59840ea13a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042088929af57eb854ea1b70a1e85b0dbbaf280ad759c5e662103050716140dea06a02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420859878a4d833a64739b459ec82654f6bf8c2be75254217d34042598635a1e55b300a06082a8648ce3d0403020448304602210081efb6499bcc49b97e33a5a62f72ff84d30902ab70fa283467d74bb464c2af5a022100fab6b7301e5550e4fbd1037cda904abb702d02e868ceafc6779bc40f3d7716e9", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: a SignerInfo of version 3 with issuerAndSerialNumber: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906ada3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906803082067c06092a864886f70d010702a082066d30820669020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c6308204c20201033039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100bbe10b61e38ff148c369a4852ba74b168607a2149e368d07aadfc0dc731f8630022047fd536f7fdb5edf9ed390287064cd3ffa1fd307e8da854decea08fbf2a0ce10a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042087a8a7b5f8e4211563f4335f720e6727f55d77afb9279710257181ca277a054f02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420f9ee7397e04334c4db5d0396972d3c0cf3e147bdafa0b22ad9366cb3d0de66d4300a06082a8648ce3d04030204463044022068e54e26903b412ceb43aca1478a4e1e4af412c5e8718a7a20ecd4fdcb085e9f02204889a9ed26f5c95068af4ea3df89dfafd8e13e9d2b65383697291c680c2c7f6b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: a SignerInfo of version 1 with subjectKeyIdentifier: F1", + "security_cbor": "a30071646174656b6579732d736563757269747901010259067fa3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906523082064e06092a864886f70d010702a082063f3082063b020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c3182049830820494020101800a416e61204cc3b370657a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100fc3d24b587a9c6cef17a2f77a7633d163d1c58f131e42c468972b8c481b872ff0221008b11256ecb0377fe3a265b1d78c66b64ada7803e8d36723a0947f5206fb301caa182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420a7f24b480c51afd93bf805a6263f54dbfb7d4f7ccd359ce93d4746ce22f379a702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420c0648a0ca27b51b51c74c0517d8c53a5f5ee15546580c3357f87dd20c5c6ee97300a06082a8648ce3d0403020446304402201e09835e251528b331339a15a4650b8b9ceb2ffeefbe71d847aedd82814787e30220271ef792c76ba131b7212961846f60090f633042fea13551515453bab4d26ce0", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: two content-type attributes: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906caa3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259069d3082069906092a864886f70d010702a082068a30820686020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204e3308204df0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a0819e301806092a864886f70d010903310b06092a864886f70d010701301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100846a707ec6f1d74a9f352461241983a2146c1ad1e72a841351831d6a9ade5008022100e90832939ce230332b330ca16a7b0ba1ef7b8cb298401232f1802805a7e75e02a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104206c8fb2bd68994bb5c0264e91a6cfb0e490d601a332bcd770ce05e55e313c598202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204207e2b77f1bd46f2d0a6fc7e6dbdae9dd57c1b89a9c08ac4273e4572a1df29da17300a06082a8648ce3d04030204483046022100bcb2ee5ff91340a450f0337b119ea42fb1f1c047e9cb7133b5356018f22aae2b022100a724bb7ac80938864a4a8c76f7e6e2890f544ee33af5d546d5076832c035acff", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: a second content-type with an empty set of values: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906bca3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259068f3082068b06092a864886f70d010702a082067c30820678020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204d5308204d10201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08193300d06092a864886f70d0109033100301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402204865496581fc9d9c1e49a395da5279f9bff882da89b0afcd347444c8467cb04e02202f3e8bd17aa1c0afdd96415760772ebf5b024fcb0592d596b9029e2818123472a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042080ebd0c9536eb6399573247dc477413843007ddde7c078bbca5dd8d33e7c9cef02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420d343c0786b592b85152c03f681acd5d83433d82a06c6f6dcdb01ba2e3dfb9a3b300a06082a8648ce3d04030204473045022100eea06a91682c98d13f7974ae5ca2935fb0ae95582e3e166b12f7a6997665b8ac022075d31b3e1bdd96e9eb34e6f72d744b4f7f9662f7be9200d4dbfd45fd60e156b9", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: an ESSCertIDv2 of SHA-1: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906aba3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259067e3082067a06092a864886f70d010702a082066b30820667020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c4308204c00201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08181301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3034060b2a864886f70d010910022f312530233021301f300706052b0e03021a041442416e75ea779ebea2e456811d82573dd3dc191a300a06082a8648ce3d0403020446304402200436f063b9f54258500fe47643172fb66fd89f0ffa92f6ba364758321d39ae72022058081588ed9298400c5521ad31aa5771e2110a852a9ebeaff7449c3304589778a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420b5693818528c8854435f6d925e57725d9fc5e398c2901baea5f9e06a89341be502012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420107351791ff2ca9fb0fad82630951261bb7b009ee0f8ea0b3adc63a45d5543ef300a06082a8648ce3d0403020448304602210095528af62bd1c43ee55de600e65af81b2d4e01cdb6f39558f226128561e5f0400221008d5d56f20baf2c1c3061f1629f4ca06f1dc5a94e57963b1d06e11b6ebd89f08c", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: an ESSCertIDv2 with the hash of another certificate: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906aea3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906813082067d06092a864886f70d010702a082066e3082066a020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300a06082a8648ce3d040302044730450220114d5719d7fb0d11bb66bd65285ac3ce929bacf3a381184aee1de3fdb86cb3f402210082c71d0dab0f32e36f15fbf1b46901b8d8631d93263d69c3ad19ba98dc8f763ca182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420305bc9255465dac32ed8ef858d6f6799a8c4d9caf9c00fb8e534f9d640f7cd5e02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420288d6ac4e2ce14594d03ae1d3c1ac3963ea656610e26f47896e3a9203c543779300a06082a8648ce3d04030204473045022100ae535abba7e28a21c01376786921c097282fa0a081b86e6537f2d65e5e892feb022031354504063a549b07867e73d20d91bc60def58f945d8b5cb3ded04cb783dfd9", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: only a signing-certificate, without the v2: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906a1a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906743082067006092a864886f70d010702a08206613082065d020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204ba308204b60201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a078301806092a864886f70d010903310b06092a864886f70d010701302b060b2a864886f70d010910020c311c301a30183016041442416e75ea779ebea2e456811d82573dd3dc191a302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c300a06082a8648ce3d040302044730450220179dd6a6137e354c5a6748ecedd83ec07ac6ecbd0b6802c637ee79435d961584022100a301b6868c3c8e266862ad9b822c262c1ca4bf7befd90a3564b160f5139d020ba182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104207fc8f8abae799408536bc1fce04f1ac5729cf1aa43718e4a7abaab6e29aed84402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420e7aecc2d7225d245cecf98f6d9201a741e2e7af02217edf4d7de8c93168c47ef300a06082a8648ce3d04030204473045022050140fdbef5823882f156c6e305a989b1a93a49b1c47367b1e1404305dd889ff0221008dd4374874fc82abb2d8f4658378a373a1a388a138914d8e0615c4feac193d3b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: two signature-time-stamp attributes: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590a46a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590a1930820a1506092a864886f70d010702a0820a0630820a02020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c3182085f3082085b0201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402200c7758779ad391ebccf798a701d0fd63af88cb6fc346ffad25aa2eebe691111c0220384cf2df9a35cae0bfb5fdbdc79959ff985bb51f596b5a2c74d80985fd4c21caa182073130820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420bdadc24ae84c13aa4158c76d068860e943bac5f172d64f9ae77ea864d8846d8102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042055f95c425c7daa5104abac4f44a4b98278dd1228a40e67fc64063f7cab039c86300a06082a8648ce3d040302044730450221008034673941d72aa0cb9c76beb1ad795d413fac3b503dcaa3101827da927ade76022043b00c3d9e2a54639988387f704644120d437b74fb458588e7a5a714aa8a5b8130820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420bdadc24ae84c13aa4158c76d068860e943bac5f172d64f9ae77ea864d8846d8102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042055f95c425c7daa5104abac4f44a4b98278dd1228a40e67fc64063f7cab039c86300a06082a8648ce3d040302044830460221009700636bff778cf801f7e2c901ad4f85e58f18d1727713dfcf11055d9bf3210f02210085635b896c35e060a8a77deea5ee8ff7cc3878166a62b940b34e8f97115c7a6c", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: a CRL in crls: F1", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906b3a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906863082068206092a864886f70d010702a08206733082066f020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4ca1053003020101318204c5308204c10201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402200788e632d14dbfc397934b36db0c94a1c4978c8d8a74df44c946946653df988102205d7e64235a3af961022d064d1696d362e08d07f44d7d417c193ad9cf7db2183aa182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104202dc6e4e9bd835cc89248d28344ab622d420f89d6b5245363f36bd0843ef4747602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204201aa3000cabcca645dfaef77a9f5939349b6ee8fff7ff2a8c7a1f5836116c17ec300a06082a8648ce3d04030204463044022023aa1e46f7b35f7925dbf69061d5ca7b02abdb316fae91e89491c24ba28310a80220558c4fd245c186fe65c806b2b7dce30d2474862a07807514145e3e81d381f051", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: no certificate of the signer: F1", + "security_cbor": "a30071646174656b6579732d736563757269747901010259052da3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d3102590500308204fc06092a864886f70d010702a08204ed308204e9020101310d300b0609608648016503040201300b06092a864886f70d010701318204c6308204c20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204463044022014daf0b89d2d973977888698d140ce03afbd2c189a486e2be1d5fb399feae385022019ee925d082a46fc95abf93cf99b90c27ae4ea537c4fa4b282a5c19db7d7a3b2a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104202b0d33beb6ae6db2f8659529c655b3baa74a75c5b2bda601d189f4215ae3d0f602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420c6bcdb92170b39ea86de8dcea83298e3959fc4c939bce27caeb7776ddc5d4acf300a06082a8648ce3d0403020447304502210098d0b26056c864a183112ff57cda869dd93255c574e68496d95e0b16612e898c0220723def7b6e93c26a4e37f18c3b59c184395cd3cfa645b2c813147beb748608f0", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: the certificate of the signer of version 1: F1", + "security_cbor": "a30071646174656b6579732d736563757269747901010259065ea3000201582381582074a6df836c74a2c32063b9b888408646d400be9adaa39f6e218a5966f1011348025906313082062d06092a864886f70d010702a082061e3082061a020101310d300b0609608648016503040201300b06092a864886f70d010701a0820147308201433081ea020809c17d4032debd6e300a06082a8648ce3d0403023011310f300d06035504030c06416e61207631301e170d3230303130313030303030305a170d3430303130313030303030305a3011310f300d06035504030c06416e612076313059301306072a8648ce3d020106082a8648ce3d0301070342000431f96392f4e8de56ab4a887e4c2fa103518aaf0efd6b6d47709f6e29969dfaf4626748d83084063cdfa309a9f2424416d45c1910170ef778b7c7dfaba14f7158a331302f301d0603551d0e04160414157d56f8456bca489eeec5113e3a30b86736fbe9300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022007b078060c6309e91dbb8306669204eb11c300a8f9797b1a4f41f191e1375a7b022100b4637570f375bc3cfd06e282323cf7835c586834493449d2102f973506b9326e318204ac308204a8020101301d3011310f300d06035504030c06416e61207631020809c17d4032debd6e300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042058d315d3d70d21df317e17d00fcee2ee8aae57fb564fbd412dee7a09ccd4be133037060b2a864886f70d010910022f3128302630243022042074a6df836c74a2c32063b9b888408646d400be9adaa39f6e218a5966f1011348300a06082a8648ce3d0403020447304502200bf0db05d54dcac9172c406b6f4c541a7a2c997c3567dcd4ae149dcc30803b2d022100d5385c98589719892872e964a9af078ad8f7c96afe04f833250597cb76a88c75a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420313c4e0d3d9afb61fdce0b9f2baf608f6c3e7a37b6506a7d12d867f9b1380f4f02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ca8bb6a51dd484a4d7ab64a3bd886a74cf2b740976792fe8126fa83671fc5d1f300a06082a8648ce3d04030204483046022100d878b0aad02e91b69e3656e0b921c78027bc4475f6f35eb9179481fcf9b37937022100bd03b7f3dcd352a9f7db9feee965ffd6b23a6089890b437c3655cd7c34a376f1", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: the certificate of the signer valid until a fraction of a second: F1", + "security_cbor": "a30071646174656b6579732d736563757269747901010259065ca30002015823815820bb894ce611443b7b10b639fe5f148cebad5b76a4eabb8d77e43ccb719ce640e60259062f3082062b06092a864886f70d010702a082061c30820618020101310d300b0609608648016503040201300b06092a864886f70d010701a082014a308201463081eda0030201020208391d5f2084eb7367300a06082a8648ce3d040302300e310c300a06035504030c03416e613022170d3230303130313030303030305a181132303339313233313233353935392e355a300e310c300a06035504030c03416e613059301306072a8648ce3d020106082a8648ce3d030107034200046527d595155b7e2d06d521c29cf22816e3afe019bbb38ce3aed841a845a27bde2d2427b5dfc0051a995ca0156eb8a6e5731b931adda6d04cd7346fa8452848c2a331302f301d0603551d0e0416041446e5df81aee488fd8c3ab6f9f795b374dfdaa10d300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100fe88205d0936dcd998568a0155a576f065049614f54df4234551ef3c96e789be022049f23bfc9cf835be97949c70703275643fcfdfad0905de908c7cc5b1cdc60995318204a7308204a3020101301a300e310c300a06035504030c03416e610208391d5f2084eb7367300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420d87a3059015448013115cf74662bad01eb84ff86d62ff89ffbb617f8967f1b3b3037060b2a864886f70d010910022f31283026302430220420bb894ce611443b7b10b639fe5f148cebad5b76a4eabb8d77e43ccb719ce640e6300a06082a8648ce3d040302044630440220441d26c5061f936bf5f97275b98673c1c2b56c11f00d14504ec404382096a827022078e6531495ecc55208312b14a2185a2c55883884d2a846bf9b949940bb64688ba182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104209724a3e4491e5cfa0618341b2ee51563a10339bf5e6f805a92e999d6350190f302012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042046406af54e6e84dc633a45184b0ad0cdf4aa54455a0b8c135cd31943bb406ab5300a06082a8648ce3d0403020447304502204e80009fd86ba4a1c0e83e0bd45590135af768e7639ddd942c43b4cc21cc2b2402210090e4c21058a578dc0d4b017ed6906452fb949f960c4d00666fb545311d2615a5", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: the certificate of the signer with an extension twice: F1", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590656a30002015823815820e0bc2f3b8789563ed046190061f16ba5aee530c5e9a8cacad3a89bb1599a4e98025906293082062506092a864886f70d010702a082061630820612020101310d300b0609608648016503040201300b06092a864886f70d010701a08201433082013f3081e6a003020102020829b71f222fb2282d300a06082a8648ce3d040302300e310c300a06035504030c03416e61301e170d3230303130313030303030305a170d3430303130313030303030305a300e310c300a06035504030c03416e613059301306072a8648ce3d020106082a8648ce3d030107034200048123b4f8e8907eaf812a86ea470788715f7466c856bdec9d495348d2ab60098bc7e49a7ec95bc8f312abb00c1998f8dd4d71e8c6017de2bc6f991d4ae8f2616ba32e302c300a0603551d0e0403040101300e0603551d0f0101ff040403020780300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022019c0963a7fc69d987818881f29cb93e1863e2ac41670d0b6fe2bc5e487549076022100f6a5d10ace7875dd8e375b2179c662c7d4ccd95a064fcf92d5fc6f4a460a5789318204a8308204a4020101301a300e310c300a06035504030c03416e61020829b71f222fb2282d300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420f63da361c4cc3317660584955dd429d8bb0647b842513dfb8dea8e650f928c6b3037060b2a864886f70d010910022f31283026302430220420e0bc2f3b8789563ed046190061f16ba5aee530c5e9a8cacad3a89bb1599a4e98300a06082a8648ce3d04030204473045022100af0e41fb37f8710af0806133fc872aae088f444101585610c3af854820165485022022a460f6382347b061548dc89e07bcd216512c82d564fa0f148fe7b2f63f9d73a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104202165e29edb17f252018817843d1acd8814f225ff841159c27cccdb1ee8205a1102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420b8701e38408d24294d798e7432d95d11003031424e25d228ee0e4dd9b997ccce300a06082a8648ce3d04030204473045022100c149280aef5a98b1b9c3860fc4e3092600a3e14b4773e07092350089105f54ad02207610bd41960ff4dc3dab35d48b536e5291eff201a2a937f259067c85e1cf9214", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S0", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada." + ] + }, + { + "name": "alg 2: ECDSA P-256 with SHA-384: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906bea3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906913082068d06092a864886f70d010702a082067e3082067a020101310d300b0609608648016503040202300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204d7308204d30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040202a08194301806092a864886f70d010903310b06092a864886f70d0107013037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31303f06092a864886f70d01090431320430712463ba388913018fae8afd67e97e0dda58f56e73b5fbb2e3ed9c8bd4e4969628fd15caf395c18ee23c53eb2ae5fb78300a06082a8648ce3d04030304463044022044fc79f606ca03f3fcbed8e7581e505cba5fd10ca82bf22cfeb050c5ecf36280022071358e4ebc2371331e90adba9b588c5d208fa67b08b08c64e8ef73ab55444a89a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420a487b73fff930977497def9ec241bfd67885979da2def23a36fd4937e9a178da02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204208dd9ea46bcdf897cadb5da0acdf3d38f685e16a87b8b02cb11d52f94f2f1f54c300a06082a8648ce3d04030204483046022100b85b4f1d9c49e30e180cfc6eb9556bbe58474e984fac9bd569e422cc51d28726022100b34ac5003ebe1397767bdb485d6616080777f4cdedb163907e2f66f568c72842", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: ECDSA P-256 with SHA-512: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906cea3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906a13082069d06092a864886f70d010702a082068e3082068a020101310d300b0609608648016503040203300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204e7308204e30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040203a081a4301806092a864886f70d010903310b06092a864886f70d0107013037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31304f06092a864886f70d01090431420440ed9a6f12455333a642921ec22aaca476162997f9cd1e6fd401634d59c1e892cea9f0ace980fb06fcad2e86d507348ccc7ce520e82e273659af7ec319c75181af300a06082a8648ce3d04030404473045022022ed915e4087eb47a4b0bc1cc384a61570eef62b27900bd3f05a31eda48482a4022100fbe4332e8bc08b2211f19c83cb18d34ce5918d2e30d6c137a422a2e8eebaad26a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203ea97d671864c5af4be128153da3e945fd8a3083c3c5b94dac7235388ee3813b02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204201b95dd5ad795fe7a21a8ff278922b21f90b4134f79feca30c931f36ccbb30954300a06082a8648ce3d04030204473045022100b51e8e534a271893c96d3a5018831e30ad3c177c7df2122379fedda898a43003022022752aee696bdb2e14e03ffb577050445c98a750e51f3d5f5c60737aa28c058f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: ECDSA P-384 with SHA-384: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590700a300020158238158202f9d88f4d07a3853fd9d529d47d19999d67f17602578713b370e9d437a765bf0025906d3308206cf06092a864886f70d010702a08206c0308206bc020101310d300b0609608648016503040202300b06092a864886f70d010701a08201a5308201a130820128a00302010202083e653f571d5d0582300a06082a8648ce3d040303302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f301e170d3230303130313030303030305a170d3430303130313030303030305a302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f3076301006072a8648ce3d020106052b8104002203620004f8274cdaf3627a9af9cc1943b349b927b99ee53e36e434ed9015b0862fe181a36f87ecacf8403e15a9addbf2013d970f59cdc0dc3488bfa2dbfc300cc7e834a18f192eb1b484457755d7cb13854d0d03d60009bbb26a6a85a4a9e3129ffc3f0ea321301f300e0603551d0f0101ff040403020780300d0603551d0e040604044f74726f300a06082a8648ce3d040303036700306402301072926087d3aa69b3ff18d2d21504e9f56eb5afdc8d1726b264690cdb4f5613acba445ddc7ab2231cb13596ea15fe9502304eec23aa156868ef1b6212a8573d056d008efbc160b96fcc8493a0bde0e0d16dafa863ff3b1b31bb3f45a6249e21bad5318204f0308204ec0201013033302731163014060355040a130d446174654b6579732074657374310d300b060355040313044f74726f02083e653f571d5d0582300b0609608648016503040202a08194301806092a864886f70d010903310b06092a864886f70d0107013037060b2a864886f70d010910022f312830263024302204202f9d88f4d07a3853fd9d529d47d19999d67f17602578713b370e9d437a765bf0303f06092a864886f70d01090431320430c8f2f1074510d68b0c55380fdc5fc22e7df1948964fe87a3da08748a5a6eeb375f99801d0de936f0216c9b5659cc86aa300a06082a8648ce3d0403030467306502304b02b53d564982a885eb3199d024d83fc4788d0693addc1cebcf37615600c010d025b2968c944d016b37a9cd5dbbc9b0023100ba78f2def85d10e0c1f3e0460f4524bc32281cc3e75efb5fb67047c197b713e479219a71edb8b47a11dcf520d27b6648a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420f8ee34de7cc7e51184a3b60a4c7637bc073f814eb4e992fe5c9ab29aa64d412002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204202308e1bc3070b6497a089a78ab8357dc2c829e3178f25d3bcdf06fbb73ed8573300a06082a8648ce3d040302044630440220568979b5d604c95ccdd9b56bef28fa9a337d4c202e8dd84dffb760f6489b002f02202ba9d76ec3673568f4d99f399e748427bd43a84bb0b7c23efd3071825da9b232", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Otro", + "issuer": "Otro", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Otro». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Otro» (emisor según su certificado: «Otro»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: ECDSA P-521 with SHA-512: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590799a30002015823815820a46f6e57009cf1300ec5371aeb6273d025fff2c2f942e47e72765135cfeac7350259076c3082076806092a864886f70d010702a082075930820755020101310d300b0609608648016503040203300b06092a864886f70d010701a0820203308201ff30820160a003020102020814256b6f08ed3077300a06082a8648ce3d040304302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a5261c3ba6c2053616e7a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a5261c3ba6c2053616e7a30819b301006072a8648ce3d020106052b81040023038186000400503775f71936107af369bfc49fff473965c3a74192994dbcb60011e5f495a88ebb82a5e77281118ba99823cbafc8d52f11f011f83f0ba1c5a06845dbd78ad6087c013b4dc7ce52f288a93575d1b40cd5b52f2504c8ae30f14bf9212bac7b5b94309272fc7b081737c280f1a4501303075398e320f870bcf95c970aaaff24950aa89a08a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a5261c3ba6c2053616e7a300a06082a8648ce3d04030403818c003081880242019c421a87002574f05da8fb8bae2cb2da08d6d9d2d40a98e08f2780a12a6221c2f8bfa27a0fdbcece6d5ef04875716b914f250dc56323bfb402e506b68725f9cf0b0242009edeb02777835eea8f9aed3faf04a20a6724f4cb88e0de145469a655db7a71ff26ccf01ac6cda8de519534556258a706cf98c5cd4cde7bcbc3ef2c06e5a33ef3a63182052b308205270201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a5261c3ba6c2053616e7a020814256b6f08ed3077300b0609608648016503040203a081a4301806092a864886f70d010903310b06092a864886f70d0107013037060b2a864886f70d010910022f31283026302430220420a46f6e57009cf1300ec5371aeb6273d025fff2c2f942e47e72765135cfeac735304f06092a864886f70d010904314204405b192f8d81b23e561f4eec7b48eabb3fe384eeec0545f9a557c554d458d424a8f3a09d69b38057385e142990dbeb3e4de2f874a741b323e1bc470fc591a33f2e300a06082a8648ce3d04030404818b30818802420143724f7f44c443e3e3f9846667e006144ec0c8bcc5747d7a52205efbd6a0411c33294add8f319dca0307dd8b814c3c24b30986038a22197d8374f6ecf066971bc80242019200b3d8f0830dcada81e38e54b6712e57b56901c15b8a96943627122097978db38fffbef627fd508557f23e75233f547cd314cca850bb86721eb77e220f9711eea182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420f849fe1209c796b0ed418486439283bed98504cdb8544efd59bf4ac27f171d4602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204204bd149afc9e469d5add0fb5744f63eba70580dd24e084df1100689ce480a0ced300a06082a8648ce3d04030204463044022022f840a061b5c840eb325ac219ae1c233153f74e0e47fbd707012ee0a18226ca0220244f9245e6f0d8d2eee1ff5efd57317f9be6a3c93f94851cc3e04f9a1116db65", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Raúl Sanz", + "issuer": "Raúl Sanz", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Raúl Sanz». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Raúl Sanz» (emisor según su certificado: «Raúl Sanz»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: RSA of 2048 bits, sha256WithRSAEncryption: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025908fba30002015823815820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba025908ce308208ca06092a864886f70d010702a08208bb308208b7020101310d300b0609608648016503040201300b06092a864886f70d010701a082030a30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b13182058630820582020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420545ade85714b87a7ba396029179031b9e8ef8e8d0078fb5e4e4bd09bea49ea6d3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300d06092a864886f70d01010b050004820100865628527a8a7419b5d679d3d28a3fa193b30231e2df43126ba8cc6c12e1b2c76ca7465f5de07b21668a19f4a31866ca9329e9af360f20128338294c295b295cd9108f279359d6c554a74d5289d211230936c83e95c567b1e209584948c05e225386c3a7ea73c100be1f5784c0e04139136ccae9d08337daa4126b6171799fa16e0cd7bf402253f28b0a49e1a59ca3fd32b585bf5b471a8a8f625622d2a3c3b318beb216f1965151772658f4f0f5633411a305d4757004c72b062a0a3553b4f7693cfcd6efc22ff841f0dc16b5ac5930fd7580b2ab3eadbb1da5723efdbbfd4a3359bd7ea5f7283086b4fe4c72dcbb954c22dc78af3f3db33a5210569909eb06a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104200522d6b0d172a5af580801c20890ea49582a7a33f632ee599df0693b285f2b4b02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042053c758c425301a95614aaa13cf0063785438e5be48c7d932101f5d2354d4959d300a06082a8648ce3d0403020447304502202a33f0bea31a5dc0b7db5ccea985f4340a78bac38df45f4b7084e9996f730fc9022100cb7cc37d24f89f784624cad526996228269dbd7a0f3eb4a5878b19fe6e6fa11b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Luis Gómez", + "issuer": "Luis Gómez", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Luis Gómez». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Luis Gómez» (emisor según su certificado: «Luis Gómez»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: RSA of 3072 bits: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590a6fa30002015823815820f428dca08e3e0a8c712f68b2335109c175774a883cb407538183a1fcf02ce95702590a4230820a3e06092a864886f70d010702a0820a2f30820a2b020101310d300b0609608648016503040201300b06092a864886f70d010701a0820401308203fd30820265a0030201020208272793053c14e195300d06092a864886f70d01010b0500302b31163014060355040a130d446174654b65797320746573743111300f06035504031308536172612047696c301e170d3230303130313030303030305a170d3430303130313030303030305a302b31163014060355040a130d446174654b65797320746573743111300f06035504031308536172612047696c308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a58dc394ba771fa495920bf6ece2afe8c32702662bbd1d43d72a49106ec983abfd735e1b4f8ac8f8a9b59682eec8935e377e98b77678b7575f352d3f7136aa04656387d21cca798e7aaa55d70c444cc9ec911fcad8539b08cee17060e85801f292900b6a2af46b7f39379ffc72e4c6e6d45371f0328b057ab15a99a814377d955b71a59065127580677a876accf6fcae84e62cc49cdcb5f8e0e686d32b74a74ebbf74ba3bb46d2a40b2321f9848f9eeb61fdd85156a8ff619566ea8820f4f5106ac4647334e84a8c0816e01493cf1de9d0e8d44546365bd8babe8e679fb857fb8f8eda941f1ca5a47337037c8dd954d26794823d00b49d777066d7ec9a5d5af7b8ac2dda19088ca2e9753b53fd0d92b54641a883f90460ae2cc16f07fa7d4909a031d5344e07cd7a757de46d1b25b9003ed3df05f9b52c8abb26d70363077176f024d44fee99a74459e0bc5dc397efa3acb7bcb0486ba3e67b9b42bd0b6f6e26d8c221f8469c9a0228fd4dac63d30865a46230d286025e599bd4bed61214573d0203010001a3253023300e0603551d0f0101ff04040302078030110603551d0e040a0408536172612047696c300d06092a864886f70d01010b0500038201810090af898fa9480c5ea21da69217dc8f87c78436a3e0df6162ea63c1bbe74ca5f9882ecfd04a1a626e19a367b51195a262a55c775ee9805f5eed2181be90559bb271db5253b8957e249277dcb079d969f7c6842066eebf43f3198a49e0834aff1302b606f8b40b06a3aa124a1428a356380b8b137500caa660f3ae856eae705d8607e3806e6202aea259fb7af7193df6544b1ba16c6fd8cfb78ad2ec6a3bc75e5b58af5f1606bd9594151551788e7481c6f504b473b72fdc6ad69c9a0e9ffbeb2226cdfc0448c44a9748c5ca392387c60f5089ae21443495db25ab64b431f8c53c96e9db6ad499f9e9d5c5c0f3d34ec2f4f44febf9a2eddc2310d5cdd3bc16c0b5a43d1b8022475581278f978badc9d72e403aadfe81f626bb6b7aa3b46c7d7d6e3908d73389ac8620ee3928812bdd0651f2b8228f174a32e0be2f702e73a6412d88dcc66bf6854a5050e9b8f155846d3b4ec58ae4080ad116553559786587a24e4dcaa7c58db60d164ac7ef0214148f4c960ae612bb8f735ffcb326a32964790031820603308205ff0201013037302b31163014060355040a130d446174654b65797320746573743111300f06035504031308536172612047696c0208272793053c14e195300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042057d015da73b2452958aabdcca03b80e606232e6b5880b76e8af3d1882a95db4b3037060b2a864886f70d010910022f31283026302430220420f428dca08e3e0a8c712f68b2335109c175774a883cb407538183a1fcf02ce957300d06092a864886f70d0101010500048201802eee9f5edd31ec5f758212f48294c827981d1eb1006ee8a85d57a0854422dddcb5e6dde6d4e6700518dce93e1f13d83aa9da665a81e544ba4d803db58d93301aac53d6dc8679adb75dd5901f8d19f47e872d2bc533797c7979962ae8cbac8a6a225070b6247eb87a5a1e0277beb8aaac2fa558d531c619ce12a7772700bc5caa2e132657e93bf118b2557aee720a9b1098f7694aec751216b633f545b741e2b6878c992ae6956b3a0045021d597365c264c1593bc2ba87efc3b49ec9b188d903e81bda35050abe6406b495246e5197f4c64ab9560b00f5dd101811ea588b7eae91c627573a10ed67efbf03a52757b75171313de6c2846ddfed211aa81e82fd9422a45a52bc8b8e7c6af02e8ca7fbd304b041572366fd282000261f263054ecdc3a729f6d083d1ee63f44c81f3baa80c34efa2645defb2ecd548827f126f079f6fb5455ff7a14f24bb49275ad9fba460f07363d823d17af4b149c21b494748caac9cd75f6ee687ede9097e90090e420f902609744f5c13275bad8e5a25259f8bca182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ad4b6450b1f46bffa9b4825016ea2dd0a3ef0d22cb4a88ef76c9328b5385735402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042024d62de26485a8497b5b2a93606d5f6168c2bbb4c47c5f4c3f3f96e15fec3b5b300a06082a8648ce3d04030204473045022100ac9531c3f2d2325ae52ccf033649fabd918e6d45086e2d2e331fbbe5b053fa2a02201e7b3dcb4fb882e2e79ec02437bbba36d94939d4b643330e3874bfbd4d976032", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Sara Gil", + "issuer": "Sara Gil", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Sara Gil». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Sara Gil» (emisor según su certificado: «Sara Gil»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: RSA of 4096 bits with SHA-512: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590c16a3000201582381582033bec266e8e2718c2c8827b314a2558e31cbfd18141ee53b59724ceb2cc6bb0702590be930820be506092a864886f70d010702a0820bd630820bd2020101310d300b0609608648016503040203300b06092a864886f70d010701a082050730820503308202eba003020102020800a8af01f2fe0834300d06092a864886f70d01010b0500302d31163014060355040a130d446174654b6579732074657374311330110603550403130a5061626c6f205275697a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b6579732074657374311330110603550403130a5061626c6f205275697a30820222300d06092a864886f70d01010105000382020f003082020a0282020100b90d4c41972ec7021328871c4b051f997ec63c536b749b888ce3ef3f9455d5b3e6300e4241219ff2b02957c0a83ff17aecb392491dffc62b666de4c0b93df3a190dc647ed1cb50dfbeb2ac623e8575e20a4ad84f55c7ad6ab300132b6daab4a1d92b2bb50ba47869f9511a1447048e1c258749bdad83dede85bd070bdd9455373af6fefb65eec5043e2fb67c8565c7e71a335546266df9de554574e9887cddcbde57e9aa3ba988959c78866edd89d8da161d185d78a7bfb9e39f50eec63216200c545ec43654cab6a3c0a565960a89f1c519acefbb4024f1751e24583481b0f84610e53e6c27144a8bd74f8dcf83b27701947aeeb278551957917f88ac256baeeae674da478c4e715e14bd4ee5e44d824ec71df31b62ed9ca35fdcb338a31e2bddb13375fdc249d9af692b1cdfde8fa53c8d1d9719f4ba72b872fc9470a4cf4529d755bc2513a756f86fd92f46f2c592360685daac83073df404dff5e1242687b933315bf7a40207f79eafd40a16ad082ef2cd4a4dc07d1294655b12d03fbe2ec8aea764a2fa77823de1c58279cf4891f0c00b09c87e5160d766d87de11863aa095500e7d942aa5565b133975fc85225caa98ecad6a6b7fa26514b2cf03ec4da6ca53cf9adef5ebb0fdb949a012271423ef6858e44b0b342d9eff41c2a03548e5201a7837fadaba783af6ac050a3df6a7f46cf441acd19e94eb5d95aec3775530203010001a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a5061626c6f205275697a300d06092a864886f70d01010b0500038202010068163e90bff11003b4405e2101941e30b8c275e2f561afd10f9f9947ebda0114011b2b750415f9c7de634f19f2e3ff6e803d6fd4be4d212c49174d8be40dcdfc23465860cd2fe3d203064cda71fc583e6715ae92f40e2ae6489a8a7561b79639a65c1f1e5f48afd848ababe0f089fd8001168b5fa4392974442aa1c8aafe28bdc2de901a65cc05324a6ae55043aee983aad6ea3a878ca160925fbf6a39b771bfe2c55657febbbefa1abdda32238584aa02eb901a800f63642c0ea6cf1a14633a70339c564227551fabfafce8e06e934d06cf5c76f8013e695e784c0633bab96ad869b7d14826e99c245d6a78ff6939fa0997ba662cced174f07f769c6ac1fa4190a65ca173cb0bd60b2a6999b86fd1e0be2090c5cc0f1015090e295ab7226a5535cccfdfa1affcb4724ceee3556c9bd30d65ab4b6c806755b74ade224d898d11b1b274a39906bb724706af82d04c9374f5111349f298cce029a407f99410307d7c88a23d9c43af22eef5f450fcb26bc8d2023b249d7a5c28a507fd0e429370c84a959fe7d2c91664282c277c2e476d6172e22b177600e047605c9d9e4d94cacc28eec8c977e9c7bb166a22dc560749fc89444ab58358df9b2f0a16c5e2fedd3862632ac17ed15fbb36493114f6892f8bd7d7044a6cb859702fe9a946f4dc6786fa1b020cd3abde3a1d0b81b759981b0e51a07902a513d33dc277db772a758b4a318206a4308206a00201013039302d31163014060355040a130d446174654b6579732074657374311330110603550403130a5061626c6f205275697a020800a8af01f2fe0834300b0609608648016503040203a081a4301806092a864886f70d010903310b06092a864886f70d0107013037060b2a864886f70d010910022f3128302630243022042033bec266e8e2718c2c8827b314a2558e31cbfd18141ee53b59724ceb2cc6bb07304f06092a864886f70d0109043142044009c518c0a436733b46299c24d464db43bf773cc5039a5fec463e7b683002981b83d3e2dbaf29fd519ace7801edf8c735f0206d7ee6e7e9aaf5e8496720014822300d06092a864886f70d01010105000482020006f15daa5557867d3b6abdcf2071dbbc7db166963f8fea6c6fd7cf1d46f6ff7361ff3996e03ffd8e28a9eafb90c256edc5732e5bd39afbc5cd424b0cec439c8999396123d937662cc23c32c941cb8fed392404b0ce9d7eb4110a762d8663110b318e2a5fbdaa31583379432a160b6a9a1353e663c49fa44dd77bc714369fe5ef283fd8ff71d009e122549d3e45ea5be8c1c0b41c6a27cadff506e700576ba0b5c971d5bd6ddb608bd2e5bbdedfb04ef71ea9dd8624be6d5cffb931c1493d1de60d8131f3b39388345ebef8f932fe75d806e966a9a1259cb0fd8d3a3e249f675895a2c2f4925bcc8194b8bb298de6366dc944b7e25b7c63b37a8b0071b8341cbc16a5df60429b8f179a3c75dfb63c8386579e7adaf1bf78ec08bb7fe3287c0cc61c009453868e045dbb8e3ff55508e1de3917ea713ca9ddf431a622dfc914b53e9ddb9acea162cb48ee6bd26b2eb0e72d2f75ee9afb220f279a8b894178b69a0af8064fac1f5c0424045063795fa7832806b30a1bbe08407903f5e21d6604fb834203200c1b81684acfc1a629aa194578f86e402273c553e1fb39f0d1fcc805b99fcf261fceb829ba11617bec9c64e937bf5f8d8207467712a945b8b01486f0cb67fce9de8c476dd64b2bd3f392b8dbf57a35ebc17cd7d6afd43e5055c45c0c6077f7401bca326d509c8d66909e8222e7005ddda7ec025460b6f0d1ddb8900470a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104209eb735277c04db23b20fb9eeccc1b068c34b087e0afa093a1fee593d98ee744e02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a9e5128e6f47ad06c8847d3b739dca06893e5837fc2c7240ef84e9aac0457ec6300a06082a8648ce3d04030204463044022010b54355866f2dabaded4dff2ece9e551e9364ec01ae89416e0707948f81c42a02205a6a76037641f7060497309c2c593375b3f2572b5533f2252380012f3105c8d5", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Pablo Ruiz", + "issuer": "Pablo Ruiz", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Pablo Ruiz». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Pablo Ruiz» (emisor según su certificado: «Pablo Ruiz»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: RSASSA-PSS: F6", + "security_cbor": "a30071646174656b6579732d736563757269747901010259092aa30002015823815820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba025908fd308208f906092a864886f70d010702a08208ea308208e6020101310d300b0609608648016503040201300b06092a864886f70d010701a082030a30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b1318205b5308205b1020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420545ade85714b87a7ba396029179031b9e8ef8e8d0078fb5e4e4bd09bea49ea6d3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba303d06092a864886f70d01010a3030a00d300b0609608648016503040201a11a301806092a864886f70d010108300b0609608648016503040201a203020120048201008d40446cb4f7dec901b1d9d7376f92ce603a87e7539ee2da3522357cd16b802b8e4a9e88122fdac7bdd3af45427b3fc16209b6c08831aaec51bb57ffbd22f00e110d10155f7624dcaa0ec984d919d8249fb4f9c92f971d49b077fc8c205b6af7cb85f939780d001ecdc0d0645120e3308a73652ca6b0bef85fdd34b7ac7e94dbe7a35e89682fae1ae5af74fe35613dda35034910d92c6ae02712b4d75e84213884dc5c2050b64fca2af4d13890dca1450208082a631d6bc9655d1b465c20937facfa0333ee626196924974ed9b21598b20ef4314d4caf6093b09788640e6e79a81f797922ac6b04a6e00b6b614fd80fb97a6663e67909ff8b9af52efbecc9b2ca182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203df29e7e52ece75bbe78136096bd4493d9be0ea088fa931cd94a8588ddd046f902012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420cc172053c61fefd97b677c46648055e19ae6334a70ef145aaf6692a96bf2538b300a06082a8648ce3d0403020446304402205a7109d64c3ee53013da4b5db9eeb4c0fd357baf41c6f34bab5796b62294887102207018d38ee7ad7cf0e0f0122b00ebeef2161611a4cab71ce6c9ee9d28d68c1221", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Luis Gómez", + "issuer": "Luis Gómez", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Luis Gómez». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Luis Gómez» (emisor según su certificado: «Luis Gómez»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: the sid by subjectKeyIdentifier: F6", + "security_cbor": "a30071646174656b6579732d736563757269747901010259067da3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906503082064c06092a864886f70d010702a082063d30820639020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c3182049630820492020103800a416e61204cc3b370657a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402206919f2df5b7aa24e752d0beb2e55aa5b97cf6be9e5c488d26c9f93f56522a06b0220657c62d90953f4db3006b3eb5d17b37195e2abbd164b43454c3d2eb821b89790a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042084784b03019ebc7829010c1b0d048bdbd10a2f208dcdc5a25ed04875e9f24c3102012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200ebbf0876bd3fbbab29ad1b7cf4b37a1c96c7e81cdeb683235a16a9054175543300a06082a8648ce3d04030204463044022062dfae59c068fdfa989eee6ca7eecec9c8070add942807aa466e41d838b7dc840220562c9d819803ed6b7b234ee42bb67474b99182cc60a3c1856d72d0b85f280f2f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: a signing-certificate beside the v2: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906dca3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906af308206ab06092a864886f70d010702a082069c30820698020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204f5308204f10201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a081b1301806092a864886f70d010903310b06092a864886f70d010701302b060b2a864886f70d010910020c311c301a30183016041442416e75ea779ebea2e456811d82573dd3dc191a302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d040302044730450220035cbee12ea99d671b142da3792e74e4520b5cb1ff87d847b104ce6cfd129cd5022100a0c01d9bf0519a904bbaf73f8dfaed74b2bfc73cb1cf5715130a537016cb5444a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420fc3c739c30b8fe5e5f69a2248c13fe2d79954b4216cf0ea7604f29ac03ca884302012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420cfc14fb4be415673609ec1c45b1bc8d77c0b0495a7becedb2c0cb8a6a064e424300a06082a8648ce3d04030204483046022100854798eaf18a60fb3d802c33a8aa0c852b81c089e4295ed469052df726e946f20221009b6dc4cb00ec7477f7cb040b2f1bb178669e3088cde2aa756d1a9747a35fcd26", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: an ESSCertIDv2 with SHA-256 written: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906bba3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259068e3082068a06092a864886f70d010702a082067b30820677020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204d4308204d00201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08191301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3044060b2a864886f70d010910022f313530333031302f300b0609608648016503040201042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100b34faa50488a79d2275335b5008d3fc2139a8d41164d4d4ef31ed201e04e6c14022100f42f553496165ddc2b03ae952de53a16b1256d88710d6e8f054b15c442310fe9a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104205643b7487ed3a9a7fc6d7474af363dd84510f2eb6ed83a716714ebad4cf48c2a02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a9d65f1c6788bfacb7a01d08f0026a2e945b81455d9571c8498f158d297e4f98300a06082a8648ce3d0403020446304402202947b176f00843345a6ed914646eb18fad3edbf13c20e5944a2851517298fe6a022021b90a6208929349120945a4c5bb2a0af6f99d5d80af7df6fd9d29a9327e8044", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: an unknown attribute with an arc of 2^31: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906c3a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906963082069206092a864886f70d010702a08206833082067f020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204dc308204d80201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a081993013060d2a864886f70d0109888080800031020500301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d0403020446304402200957be6e1a33812cf33a975c660db9eba37486667777f07e9f71016dd4972ebc02201c33e42ebe169ed034ecd9830a7d1db7a707b9600699e65f3476d165eec1d828a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ebf223b57a82a52068b814aea822c9593a39f310e9cf9aecc1b657f65eb8400c02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420059a794619bbc922cf1da6bc8fd1ae456d137c4dbc70e8d12e224ad6405819d2300a06082a8648ce3d04030204483046022100d20dc1db6f8cfb82e85faa6763e770682989b8893181a1ba53183c3d9ced70e5022100d12e8a69be32730c55752c34a7142814e16f4aabdf4a585cb9607fa609b5f93f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: the certificate of the signer twice in certificates: F6", + "security_cbor": "a30071646174656b6579732d736563757269747901010259082ca3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025907ff308207fb06092a864886f70d010702a08207ec308207e8020101310d300b0609608648016503040201300b06092a864886f70d010701a08202f8308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c9308204c50201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204483046022100964fe39e50c1bd8fc4173b405026c13a6fa3bcc26f46c504cb8a1a317732e376022100b0adc28caba53270055782612ea6fa93ed08675b6c900deb805ec9f63d97d84fa182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420fd0371a98e121ba8b24fd9732f538e3fc6e55d43803c30ed2122ddaed86828d002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ef4f1a94f1b86c1eb111121cf4682e6c73da7385984da6acd1d850296436ee71300a06082a8648ce3d04030204483046022100e767bc1cc4c5ccf8abf916b23d42039e87a806b48e40d38d2c00974604ccb23a0221008104a35606693dd2dece8f1d7a1c31ee99e5198984f0351d5645432dba67493f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: a certificate of version 1 that names no signer: F6", + "security_cbor": "a30071646174656b6579732d736563757269747901010259081ba3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025907ee308207ea06092a864886f70d010702a08207db308207d7020101310d300b0609608648016503040201300b06092a864886f70d010701a08202e9308201693082010e02081db4dc506b63cfc5300a06082a8648ce3d04030230233121301f06035504030c18496e7465726d65646961206465207665727369c3b36e2031301e170d3230303130313030303030305a170d3430303130313030303030305a30233121301f06035504030c18496e7465726d65646961206465207665727369c3b36e20313059301306072a8648ce3d020106082a8648ce3d03010703420004ca7205a75bd66ad6f4c379d09265a67f526ffcdb52a147e38f1c1aed272295d5faec0fa57301c5faf7f73f9bd1f1b4ab1c3ef65aecfbd7f22eb3310a4024146da331302f301d0603551d0e04160414ef61419a0835a4cc8c1f9118e7cd637266149bb3300e0603551d0f0101ff040403020780300a06082a8648ce3d04030203490030460221008890d8c9c6daa3b5401fe36dd6c16a6a62229874f229005a02350bf4f98f6f9e022100fd61efe31aa9e86ce648430466cf207718255917512050962bf04c1ac315521a308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204473045022100a96a9e59e8af0c11ed36821436f58f38e12a00e09deaaeddcf876b16deba18d8022037ecbba588e7535d31825b5e67faa0c48984fbde9c875e527248756a952d4419a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104201c9e40503e6a488957b18addec31490e43c5e9df0603eead0efaa3132bfaa38a02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204207fad643780a02dd78a56efebb50fbbbf966dee736b5e523c738e8bc863e9f126300a06082a8648ce3d04030204473045022051d39eafc25b71d029a3bcadbea149aaf5da29fa15b1d09a5021a68985f55928022100a5fb10819df937648b3988af5164f79662a327d7d779da25996f131cc9203702", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: an attribute certificate in certificates: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906b6a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906893082068506092a864886f70d010702a082067630820672020101310d300b0609608648016503040201300b06092a864886f70d010701a0820183308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4ca1053003020101318204c8308204c40201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d040302044730450220649f9f0735fa96d1620e57b23becaddb8d4b244ee1507e6fe7010899166d9ff7022100eb1ed2cb29d7a8827bc5281c1e847abbf2ef317a7c5db7cf34265ab07eca011fa182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420b85586e1dd8bd2df2815ce1d9bb744974c8d832672346d189ca6163f5055a0c502012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a390db14a6430d36733ded33def6695ab100973feb57bc3c9212af47f23ea5dc300a06082a8648ce3d0403020448304602210084982d4e81ccbe1916aaf65299f12b96cda3558c23b52c4b29ce4d3789b02784022100c883de7803ed70199d421c3f34f7636a53dca41fe11c3a104998f287afbd2d84", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: an OCSP response in crls: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906c1a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31025906943082069006092a864886f70d010702a08206813082067d020101310d300b0609608648016503040201300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4ca111a10f06082b060105050710023003020100318204c7308204c30201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5346b7763a20d80f7a0ae67d5f32387359677d0dad91e56f0e86d45668d7a4c3037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300a06082a8648ce3d04030204463044022018c7d86d37a928d13ddeb3687b0d8641b87512f0f02185363ed1600fd097194302205e60fd7e996fce64ea95ea19f1067a561a2b3d69d6553b3fec8820e96e117b59a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042058bbbea716ea105fa2b8cdc7da49475ea921376fc44328e8769c1575130f794602012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a8efb4472271f746fe8e9cbc48e6b760efd88e9c0f3fe362f330cf3fe458e81b300a06082a8648ce3d040302044830460221008caf1b4d2a92e772b9b54fae9fa19f18e7a33d5aac744a1484843376a284f160022100d3af3771fda81cb595a3209ba5c0ef27680aec643deb76c5de9ac6ec88bfd4ed", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: a certificate whose own signature is not one: F6", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590635a30002015823815820046bd295ddb3502ccafcd4eaf8769945a74cc522013ad87dabb3ad22ec3500a0025906083082060406092a864886f70d010702a08205f5308205f1020101310d300b0609608648016503040201300b06092a864886f70d010701a082011c308201183081f7a00302010202080ea5b0ac4d459a44300a06082a8648ce3d04030230153113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a30153113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200048154dad0c8c0377ff27cfcc6252fa1f9ec78c50724a161d34ccce04ed6d64821d77fc3c8d8fe7d4a23770a7de65cdf03e098123128db50d8fd00044ca42fc144a331302f301d0603551d0e04160414161d2a8bb5e29dbb41a7a4f98d6c3259a90d9563300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020310006e6f742061207369676e6174757265318204ae308204aa020101302130153113301106035504030c0a416e61204cc3b370657a02080ea5b0ac4d459a44300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420741b109a66760a13c1102bf8cd79fc8ab00617d0ead30df7c8b5068754b871873037060b2a864886f70d010910022f31283026302430220420046bd295ddb3502ccafcd4eaf8769945a74cc522013ad87dabb3ad22ec3500a0300a06082a8648ce3d040302044630440220548fb31f8cd525639fcdcea99ef2514914d30794fe8d2fb5444153ca2779480b022019c0a4bc1efe9c3e780807af9c1eafc4d03b8f1694445480ea7f0018dd5aaca7a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e3a8c20a7de4f5f2da3f5433456c8e73e12f256d52fb5351598abf9740e2266902012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203d6e76de6213638e1e95c21d6b7f2398994b9459c11cb7a261104658ed5ed563300a06082a8648ce3d0403020447304502206b746733ee8ec0fcb7cc44633599008136b8d013cf262b2effb55db77a902bc6022100f2671aa67b20d88abb4caf0f5bd9f38647fd12b6974acded7b2505afa1ce864d", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Ana López»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: a NumericString in the subject, which is DER: F6", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906c6a30002015823815820dbaa212f75561589f205aaacae092b493f18e3a24500e177c795e5770c0f6c84025906993082069506092a864886f70d010702a082068630820682020101310d300b0609608648016503040201300b06092a864886f70d010701a082018e3082018a30820131a003020102020835ce541854951e70300a06082a8648ce3d04030230323114301206035504030c0b4976616e20506574726f76311a301806082a85030381030101120c313233343536373839303132301e170d3230303130313030303030305a170d3430303130313030303030305a30323114301206035504030c0b4976616e20506574726f76311a301806082a85030381030101120c3132333435363738393031323059301306072a8648ce3d020106082a8648ce3d0301070342000498c3f89f6cbb9adbb0d1d7c7cc607ea5238935a294116e5b90479f8c43a9416fc9bcb1debe59dbb66a30b7091ed1b5b1a32ca400d1dffb7cb51a96b462b230e3a331302f301d0603551d0e0416041485c2ec1c1fbbbe24bdcc8ce0a969533a1a87222e300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034700304402206ef5d1ed9ba5218665d6d321b82e7423d70a1fa19cb28bf22f98a33d93ebe18c02205f482d9d9e183d926f2613307d067f521c3da681c94c5eb7fe97613a47df2008318204cd308204c9020101303e30323114301206035504030c0b4976616e20506574726f76311a301806082a85030381030101120c313233343536373839303132020835ce541854951e70300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204200032a8fc6f59f75e350cb5acb025d158905d016884be371346fdad768310e6d23037060b2a864886f70d010910022f31283026302430220420dbaa212f75561589f205aaacae092b493f18e3a24500e177c795e5770c0f6c84300a06082a8648ce3d04030204473045022100ad8a36402bb51a50a682917660d255cb98c3979c71b8fe1ff383117c5f5cc219022017b6d6eb775f6940569f3f41af28e6dfcd3e65bba9135f4d1833e0c0df98f369a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104204e03909a37da59d7de056c1b0c086f3c3a579d61b362ff1742d07477296fe9b802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420fcbdbda72e3960e0289c3e35caafa30c3a1cecbf5d3766834d3bdb8523a6b3d8300a06082a8648ce3d04030204483046022100b4684497e95e1f94c28eec3d0e21856121130841b4833941f357f64646b26879022100bdd5c9886c11e5874689499ae4f1285cc1e37328d59359474fc37589b0c3b13e", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ivan Petrov", + "issuer": "Ivan Petrov", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ivan Petrov». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ivan Petrov» (emisor según su certificado: «Ivan Petrov»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "alg 2: RSASSA-PSS with trailerField written: F5, not verifiable", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590930a30002015823815820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba02590903308208ff06092a864886f70d010702a08208f0308208ec020101310d300b0609608648016503040201300b06092a864886f70d010701a082030a30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b1318205bb308205b7020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420545ade85714b87a7ba396029179031b9e8ef8e8d0078fb5e4e4bd09bea49ea6d3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba304206092a864886f70d01010a3035a00d300b0609608648016503040201a11a301806092a864886f70d010108300b0609608648016503040201a203020120a30302010104820100a4cdf692f53e5f81a29faea22c631dbd6d7c80a3920c51f3faaeababffd928d7e7a4168baa849707dd34dbdf5514066a7e364dc6659cd33953de9e516867e3db3123db436237e6b084d82a5401dd60b66f3112823b6fb59c73213692c2f3cd0dfb154611b3753671316182ba9e33a9323e70beb3a3c3c065e2b8e1beb3c300759eec63e5991fdf0f37d85fe64278c3239f7883abc7324a5fdef2b76b35eef478d9f35d938f5c0cc5874bf15d9661eac8cbdc22e78d5d341ec873836f641b25d6531e6a5356a1776cd7cb00c0c813a9ed697b706ab4a300386ac6f0976c5af9230bcfeb99ad7ad83e64f1fb244f042d8e5e59cc3f0f40eb52ac9b93e6b31ed942a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042015bb510f6037315d5e41f2630489ce193279fc0f185d0f36ca6479a260569f8d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042033604f0feffdc63be57cf9dbc6e9f8831fd08895ba12154c2d4d5b5586d2b925300a06082a8648ce3d04030204473045022049f92ed4b27af09173e65fcf88a9767c5391bb0d4c274e43e45ca026876ee07b022100ded3deda574fee71122c9cb8c66c1be53e1bf40bbc3d6afc8cf0976a2696f5ef", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Luis Gómez", + "issuer": "Luis Gómez", + "result": "not verifiable", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: a digest outside the table, SHA-1: F5, not verifiable", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590699a3000201582381582084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d310259066c3082066806092a864886f70d010702a0820659308206550201013109300706052b0e03021a300b06092a864886f70d010701a082017c308201783082011da003020102020817a4eee96b02780c300a06082a8648ce3d040302302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a301e170d3230303130313030303030305a170d3430303130313030303030305a302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004a986a8fbf38687cc9b33e317826adfdbde8cebce8b371ad4446ed8944fb8fb4a25b13681b8f490136711d5b55946c8b64abd13ae5a1d26ec639cc89e54c64d89a3273025300e0603551d0f0101ff04040302078030130603551d0e040c040a416e61204cc3b370657a300a06082a8648ce3d0403020349003046022100b568dd629e42e98beddd33b9299d2efb83b47caba7969276dcbacb5441b67dcd022100d5887a4ac170180c9c5fbf0a02c76970730853b2fbe880659ac1f96dccbaea4c318204b6308204b20201013039302d31163014060355040a130d446174654b65797320746573743113301106035504030c0a416e61204cc3b370657a020817a4eee96b02780c300706052b0e03021aa078301806092a864886f70d010903310b06092a864886f70d010701302306092a864886f70d01090431160414185f61deecd9878e855e027ea94d3962366ff1593037060b2a864886f70d010910022f3128302630243022042084476858d209c64def278a50ef97305a33c6680a4dcf7ff7339f02d2037b8d31300906072a8648ce3d040104473045022100bcda33277206d779f33f5bb1781920c0bb0442577ebc87413c8c9698bdc3d48f02205ef24281371496cc8f026bc2d5e742f0a7cf546706822d548d6094a67eb6d1f9a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042067fe625718e4b47b1f1285eb4958826f1ad11b00a94521b7da57f94782acf06d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420116a08042887231e6f068b7e32ecdb8e33d0a5e923f4cf6a07ef8c215479f6ef300a06082a8648ce3d04030204483046022100f50d5b182f978555ee917a4b236a9420bc363427adac3294e41a704fae7f3fff022100a64a909e7941483fb3573ddd8edb59d73fa9faab9aa1376027c7844bafb44f4f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Ana López", + "result": "not verifiable", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: RSA of 1024 bits: F5, not verifiable", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590775a3000201582381582060968b23dcb4a8b31b5acf295be75909ee023bfc26f16f5593babd5dfcd58eda025907483082074406092a864886f70d010702a082073530820731020101310d300b0609608648016503040201300b06092a864886f70d010701a0820205308202013082016aa00302010202080c2efd27d5ad2ad7300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b6579732074657374311430120603550403130b436c61766520636f727461301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b436c61766520636f72746130819f300d06092a864886f70d010101050003818d0030818902818100b7f952ab6f06cfa760a911e0d43c39bb23c7e65bc028c5e9b47f56dc6fff6ec4fda7d7b1f7b2bcbee922e92d03d66e8909f9cfe238bb3093fc9d288033e0093554e028fe13d28ef41349993640b11f091df12edbe8e74b02d7fcfa929c70c1efeacbec65f1f530b3fdcc9d4a6316b1c972efddfb743b9fc78e762b4b88d0ff850203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b436c61766520636f727461300d06092a864886f70d01010b0500038181002f9f02e2210c99c7544ab601980b2abbb183e588ce75b529ab43e94a182a8a2b77f76332661d5f14af925727f51b66aae1335d14a87860b2623619b7a90b076857b08e0b9e4459abdc66542e2cac433ed7d36dcbb72957d514c200178b334c9f220622c65b1dda86ba44e14e230c2bbff05b6657ea3482b45b7a6d1574c36ea43182050530820501020101303a302e31163014060355040a130d446174654b6579732074657374311430120603550403130b436c61766520636f72746102080c2efd27d5ad2ad7300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204203f9697f6296c582b0f6cee0e22cbd5c4955bf2029f1bafa4bb8ac5b557f9574d3037060b2a864886f70d010910022f3128302630243022042060968b23dcb4a8b31b5acf295be75909ee023bfc26f16f5593babd5dfcd58eda300d06092a864886f70d010101050004818091847be8d766dca3b440470c5616e378b8b0db07e686442beb53703dc3cf5458a79a8feb4f1d1bf6e43b4b5ec98fcc11e8f8e18f3236158d07a54639809e8ddc8cbda4baee4888fad23e2a3226daeb5ae734142c3d25740ddb11e5daa988aafbec76179a9b875e4d5328a28b3ac7d8fb771a2a6a5a876c3e5f4c17c9c929479ea182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104207027298f19ee58407e5e7dfd415ed4bddd2346f3697864b645cc90f86b2245a402012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a3efc73032e5ae5fcfa34a65b33cdecd113471cdfcb48661f0ec311edcad485b300a06082a8648ce3d040302044730450221009366f7f5bd94e986abf9291933f08e674109c599a47e86d8879af287a239bb3c022065d43cc5dbb71b5d47c12acb4567155535d49bbd02e2c0a891a2924e74383571", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Clave corta", + "issuer": "Clave corta", + "result": "not verifiable", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: RSA with an even modulus: F5, not verifiable", + "security_cbor": "a30071646174656b6579732d73656375726974790101025908bba30002015823815820a6a4f3b34873d4e4db7f4c3b68ba83bd0fecbfe4373223306d090aa87c2423470259088e3082088a06092a864886f70d010702a082087b30820877020101310d300b0609608648016503040201300b06092a864886f70d010701a08202e3308202df308201c7a003020102020805d92b8ae95b9b08300d06092a864886f70d01010b050030163114301206035504030c0b4dc3b364756c6f20706172301e170d3230303130313030303030305a170d3430303130313030303030305a30163114301206035504030c0b4dc3b364756c6f2070617230820122300d06092a864886f70d01010105000382010f003082010a0282010100cc3d22762e6f981711769ca89a30fc6d469dd9d5a81225e8ee5f4ed26afc92d45fdaa38559cbc4793164dcd3dec53b920a83dd96115668c28e0eb50d7155d84ec4ac4eb3bdfa435c9ca6cb0dbce1ea5b987ae206ced2aa858a867b7facef3ce6710fef0db2a7623c4669774bb6de37325a5eae6411045ded234c129f1fb2d20b7c34f7a8ab088d7490d6d2e282555df2fb85bb722d9bbc07fdf0676b5572df5cba37b3541c38f569b26a88b96f2fd61e77c2a91a408b83d50d4f485cbced5dea92254f4769b82ee9989ffd263dff20418a6042588a0e7fc4b0c00ebe32cf3a94755992504f29b6df69fdb0618f1d940579d7ef193dd6ffdf209a6224a909e4f00203010001a331302f301d0603551d0e04160414f540a27d4f51edabe7f6f7ed9be4a7d38991e8b0300e0603551d0f0101ff040403020780300d06092a864886f70d01010b0500038201010043e47cb3b66133e76e63d9b66fc44ec1c851d7d58283de0205f3368f3301cec6087a992368aaa0f0c5481171a7482f3c94d9e3d11f151ba4db191005162285acd446504f0fd5fa58dd7d07c33df60542af199d4ba049364c0394522699983bf583bc62ddb42b3b329c799190c6c272f16ad8fc0799fcebc450a1f9feddbb57e5fe6ff17ab506cfa363e309997d3eaf7f0c71103ccd0831d15ab51f487de9d6dc941ed5cb7c9b8e37205eec31b30cdb726ad9e1c42d577fb216855f8848a12b3340811e5cb266a74ef8a11eff2f8461c3576643c53c6fb57ed93fd13b6ba70e97d434b719c25eccd70c19690a56a2c3ac962e5c41cd5be72935323b3b234b743b3182056d30820569020101302230163114301206035504030c0b4dc3b364756c6f20706172020805d92b8ae95b9b08300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042057ef04d18d11ed3fcca77ca630bbdd50c7ad382e471d1afcdbe7ac2ee44804c53037060b2a864886f70d010910022f31283026302430220420a6a4f3b34873d4e4db7f4c3b68ba83bd0fecbfe4373223306d090aa87c242347300d06092a864886f70d010101050004820100295cdeae2d81156e893fb0ae195c6af84d97feba419306e675fa10a0974544523c6a20a1d3327b123289bc312dc2b76627fdbc7b12701ac86aeb1818e8f2bbc872e2d95ac7deaf0b72bfa488be9b9d1cda20fdd284e21c9e092c94be75cb461280a1ea0aba093aa139602b950aac1ee5ac9d63e1cff7319677cc21dfab1872e306c0e5aca8b898175b59a18792df2894c80fc00e82e026fde1c442092247c2d0695b054f969ce71e936008e4ff6ea4cf475c1b73052e17899bb53fc8f1680907f0e91de501a5e69c7ba19e341d38879cef0366af7d3a823ad451868f3978c547ebb8262bd94af84010c2e3200354985355724a8ce09315a5980a36b34b1d9b7ea182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203f3dbb2d14fc516d5b3a173d5a229333b57b1d64450c6a62868cf1a0a339e62002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203975e408892f073d043b5bb982426420e7eb6fded17df1da7fe073023b2fe565300a06082a8648ce3d040302044630440220730c8fcc585747decfbb59c13d7b8acdc3a318710a48f5b79adfe19c3bc4ce9e02202081183c8dc9f554554812dfe5630ff03f88d0844f3040d8f1585592b2f0ee20", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Módulo par", + "issuer": "Módulo par", + "result": "not verifiable", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: an EC key compressed: F5, not verifiable", + "security_cbor": "a30071646174656b6579732d736563757269747901010259065fa30002015823815820c31a02e3a559c62da89a834da41ff2023558fb0c60e891f915edee1ae03c5555025906323082062e06092a864886f70d010702a082061f3082061b020101310d300b0609608648016503040201300b06092a864886f70d010701a08201403082013c3081e3a0030201020208350a51cc128fa711300a06082a8648ce3d040302301b3119301706035504030c1050756e746f20636f6d7072696d69646f301e170d3230303130313030303030305a170d3430303130313030303030305a301b3119301706035504030c1050756e746f20636f6d7072696d69646f3039301306072a8648ce3d020106082a8648ce3d030107032200035104ca0dec58d5ee9d0b01bd432c959167b6e1c4b685ac11678ba0c833aef94ea331302f301d0603551d0e041604147e71844f1f82edb371a7ea33dc7113c1a81ae1c0300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100b440ba4f130ba2c37818cc865cb99a472398a77c2656a6c75456b1dfc692e2360220246d3ca4c5f6f3e76344d2715b6e1517c0eee56e72066aeac3dd1dbb142301fc318204b4308204b00201013027301b3119301706035504030c1050756e746f20636f6d7072696d69646f0208350a51cc128fa711300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204209cdbd1b82188031d52285979db4196c26d090fe42cc903b28b29564aa10b6a3a3037060b2a864886f70d010910022f31283026302430220420c31a02e3a559c62da89a834da41ff2023558fb0c60e891f915edee1ae03c5555300a06082a8648ce3d04030204463044022033e1613004082af2705967afba1d5c6f1bccf8937543b49e2decfa600233903a022067f8a4795a8a0fa795df0ec47c82a5e21ccbefff3c4160f64345b3d8e18569f3a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203da8a3a99137c4e09f5db08449669824e99c270ba01bf368537e1ca9d5d8374802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420737402ab0efca76dd75ae01e3d6e8db71f7964b9e3716493bf4e9442f730071b300a06082a8648ce3d0403020447304502206b47b3ab1599bfc7f543b0c3421466135d76bd4dd477818d9dc1c12898b36ca6022100c250207c7e3566d6bd0ada5d0278a16128d8dc8e03ca6c5667ae1ebc86cdb696", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Punto comprimido", + "issuer": "Punto comprimido", + "result": "not verifiable", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: a key on brainpoolP256r1: F5, not verifiable", + "security_cbor": "a30071646174656b6579732d736563757269747901010259067fa300020158238158204ba3e7640cb64ca0b1f43af05941e52964e206cba39ac66e99387cadaae69a17025906523082064e06092a864886f70d010702a082063f3082063b020101310d300b0609608648016503040201300b06092a864886f70d010701a08201613082015d30820102a00302010202081fc425d2b3db4892300a06082a8648ce3d040302301a3118301606035504030c0f437572766120627261696e706f6f6c301e170d3230303130313030303030305a170d3430303130313030303030305a301a3118301606035504030c0f437572766120627261696e706f6f6c305a301406072a8648ce3d020106092b2403030208010107034200045104ca0dec58d5ee9d0b01bd432c959167b6e1c4b685ac11678ba0c833aef94e152f278e1714d65ebffe6dceb1b90ada0fe36a1cb6d379c0c96e677266be34efa331302f301d0603551d0e04160414e250e86d5e532693390d25cb270822adf8b5e7ab300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100f978b18f6ebaf44e6f02df0c0a86c960d8abe90fa651a35b401ac787f36c905402210093947469cdf0cf86ba865cb7924e1653ff1377c0c91b68ecfa84a5d31c7ac283318204b3308204af0201013026301a3118301606035504030c0f437572766120627261696e706f6f6c02081fc425d2b3db4892300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204204c7f88acbd90b0b6c8606fe4e02c78997e0b830c72901f92f1f91f3a0bac6f9c3037060b2a864886f70d010910022f312830263024302204204ba3e7640cb64ca0b1f43af05941e52964e206cba39ac66e99387cadaae69a17300a06082a8648ce3d04030204463044022039f0a56e914d3e4ce8ae092bd67bbfd865c3a0adc240029a4cfc3bff42967dca02204b926683a47e46e714248baf9e381109cb5a5c966fa87d74895789a7c1263906a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420a5b54fccb09a5a64b7463609cf5ca2319d6658bffddf452d9339d6c80d42c7f802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420758df4c469fb093e12f54803837e3a47e102f9617d2e6e872161c39e49e831a4300a06082a8648ce3d040302044730450221008a7fd8ff7051625d5f4d943ef8ef3483c042c51d2570a582848783d5090925e9022006a5be856599ee5a8f87b6cce52426c8cbf8c35afec944e90ee544e22d080752", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F5", + "seal": "S0", + "signers": [ + { + "holder": "Curva brainpool", + "issuer": "Curva brainpool", + "result": "not verifiable", + "before_round_time": false + } + ], + "lines": [ + "Faltan firmas o sellos que la propia cápsula exige: trátala como no firmada." + ] + }, + { + "name": "alg 2: an RSA key with an ECDSA algorithm: F2", + "security_cbor": "a30071646174656b6579732d73656375726974790101025908f8a30002015823815820a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba025908cb308208c706092a864886f70d010702a08208b8308208b4020101310d300b0609608648016503040201300b06092a864886f70d010701a082030a30820306308201eea0030201020208325566517f129f8a300d06092a864886f70d01010b0500302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a301e170d3230303130313030303030305a170d3430303130313030303030305a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a30820122300d06092a864886f70d01010105000382010f003082010a0282010100b25cb0a3f54aa8487b15fba355e38dd4b68183fad4925688c195529caba202127232fd41e799960260f05b120a89703feae05d8725661e3e156b7243158c70a9afe71390a8e29e8afd792458fdecc752403b55c0af444012defb62055e349180e787f0605771744e9ba71049fbe78b153b0bab73d62debed2ef88979c6d6877591a09daf186279973b9a1d9cdbebc0838b220378577b639e601086d79aa7b0bc3a19dce14cdc7c176bd93efa74c1b56256edaa4efa66567772e4f8f6d3a602524664e485399b159a09a69b4dbf6ba5adbb62835dbb0379ca948103cb7715f889f48cb871c5a704f2a9ff6a4d7ea1e89acd02344743210955441f6b3c99cc92170203010001a3283026300e0603551d0f0101ff04040302078030140603551d0e040d040b4c7569732047c3b36d657a300d06092a864886f70d01010b050003820101006e5267bb69fbfa581dc0bb3b2e54a394a67d8b432b575dff6593cf09350e40a238720585329acf2807779c1da6473d551ee6dc3d81e8379052b9db1b26c74c302fd3f9601c62aa2ff34ec6c6dcf234728b889bc2463875d03ae8563b751380f6a4d0d554ef9cf7b520ad3a523f794739b72f398cc73d1a7f8cf8d21a24c5c994a102993be83ba0bc0968cb43b9b719a3226d22e310ee4dbdff8a74b4ea328d8f6296d0c1500c1332fa012d67a9fccb5c99ebab7a2119d960e51a1ef80d694f6c1f1afda9f42e18058873ef91cf851352e680aabd5e541f2a3ddf6d196b76be26d03b2e173daf290144d7e489679aea10acf91301b8c93d79bde85cfcbdd391b1318205833082057f020101303a302e31163014060355040a130d446174654b65797320746573743114301206035504030c0b4c7569732047c3b36d657a0208325566517f129f8a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420545ade85714b87a7ba396029179031b9e8ef8e8d0078fb5e4e4bd09bea49ea6d3037060b2a864886f70d010910022f31283026302430220420a7c9f84f9e93ea8c9e935b30dde117eb76471da44f7e45f2696c393f614e86ba300a06082a8648ce3d04030204820100865628527a8a7419b5d679d3d28a3fa193b30231e2df43126ba8cc6c12e1b2c76ca7465f5de07b21668a19f4a31866ca9329e9af360f20128338294c295b295cd9108f279359d6c554a74d5289d211230936c83e95c567b1e209584948c05e225386c3a7ea73c100be1f5784c0e04139136ccae9d08337daa4126b6171799fa16e0cd7bf402253f28b0a49e1a59ca3fd32b585bf5b471a8a8f625622d2a3c3b318beb216f1965151772658f4f0f5633411a305d4757004c72b062a0a3553b4f7693cfcd6efc22ff841f0dc16b5ac5930fd7580b2ab3eadbb1da5723efdbbfd4a3359bd7ea5f7283086b4fe4c72dcbb954c22dc78af3f3db33a5210569909eb06a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104200522d6b0d172a5af580801c20890ea49582a7a33f632ee599df0693b285f2b4b02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042053c758c425301a95614aaa13cf0063785438e5be48c7d932101f5d2354d4959d300a06082a8648ce3d0403020447304502204d406bf7bd6b376a6501f028883f371fb707ec375e81220e3bdc5e5c21f56c27022100c85bb450b7444afd65a4aae8af20e02d819f45788cc628817bd15b33f7b7483d", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F2", + "seal": "S0", + "signers": [ + { + "holder": "Luis Gómez", + "issuer": "Luis Gómez", + "result": "invalid", + "before_round_time": false + } + ], + "lines": [ + "La firma no corresponde a este contenido." + ] + }, + { + "name": "names: a commonName of 64 code points, shown", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906eea300020158238158208c75b1a9defb70dac9f2571cd9bf30c71ef74f2ceb3c55f9a1918e39f4ff670b025906c1308206bd06092a864886f70d010702a08206ae308206aa020101310d300b0609608648016503040201300b06092a864886f70d010701a08201d1308201cd30820173a003020102020828c30036dac937c0300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30818e31818b30818806035504030c8180c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b13059301306072a8648ce3d020106082a8648ce3d03010703420004cc617a97914ea95163d70c8b778147837b238760c9586042fc6943af67df4072e3b137fb86e31319b35bb9a6fbdfabec00dc285db0168559d34c12d8ca0264aea331302f301d0603551d0e04160414f1f57fb1e5080453f25f9b337bbb60a4c1418cd8300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100ab6a5de1cd1d07b3af72e99afc9dd3dc852e46ab1ccb375587bb4cc6fa2d0455022043317855299f71aa69cf76edbc219a4b7f46ee2be02befb707c03e9a368f9cbc318204b2308204ae020101302330173115301306035504030c0c434120646520707275656261020828c30036dac937c0300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204202df3d1a95ffad6cda344dd261982ae11466ea1dd2a7b904ec42fb4c2c469ec333037060b2a864886f70d010910022f312830263024302204208c75b1a9defb70dac9f2571cd9bf30c71ef74f2ceb3c55f9a1918e39f4ff670b300a06082a8648ce3d04030204473045022100bc98d57b856983a800a59b3eec8d42fa0b7b6a643a84c578b92b8bcb838c8105022004383aa1fd43de9da1123c97171b6e5b810d4bf6d62d302215123869c8d40d74a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e8795383fb37af54c3f9d30f7684b3adff138c0cf43a76fb08b8d03a3c183de502012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a7cfb03a9a03c48e139b65aac6802aeb2e98957fe53edc42347c2c1a742227a9300a06082a8648ce3d04030204483046022100d7df883ae8a4836cbd8ff1c62de6584e6fbd25a58974ba8ad857e8c71c288067022100dd513457ef0602e97075f3385e372db7603a097c070953593da73b799d33a1e8", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "ññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññ", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «ññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññ». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «ññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññ» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a commonName of 65 code points, its SHA-256", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906eca3000201582381582059f43d6b2f8fdc680edb8c3c00972a690324b9d0d7a1eabdb5fe3732f708d9c9025906bf308206bb06092a864886f70d010702a08206ac308206a8020101310d300b0609608648016503040201300b06092a864886f70d010701a08201d1308201cd30820174a003020102020823460cf2c6d62368300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30818f31818c30818906035504030c8181c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1c3b1613059301306072a8648ce3d020106082a8648ce3d0301070342000441c8e0e6055c64ee53690e40e243971449409af892b8b9d55ce704cf6ec314e5ca374ef86e707ad9897239dbb14cfa8a6f11a2f4eeb4be790818619ce9cfe674a331302f301d0603551d0e04160414652cd45d9dbdc8201a546f50ec127dfdb5d2611c300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020347003044022014e13a8005e54c547197d89c65d34c897f365a17925d040f4cc246900620c4ef02205f483b0f9cfd98d31e0823d1f9ccd5d85e84535224c0a0a341f78dffd9f9c0a6318204b0308204ac020101302330173115301306035504030c0c434120646520707275656261020823460cf2c6d62368300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207c5f77e297cde92bb5621664998d6ffcb5c71f729bc74bfe3229e9dc8859dc2d3037060b2a864886f70d010910022f3128302630243022042059f43d6b2f8fdc680edb8c3c00972a690324b9d0d7a1eabdb5fe3732f708d9c9300a06082a8648ce3d0403020446304402206ec7714967dc122fadab93308bb334b846d16d3af305b164aeb7f73462071f6702207cc7f9db84fc8c1dae9f6b4b60fd074664c73d9401dda4683df4414df289e5e0a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042031a86d378496bedb091f1a1000fa37ace27775df00d341d59e72dfef826c52ea02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200ecf93a2c09f9e0aeed1e9051b086bfc9571ac8b6c6cedd07724b31eeaca12c2300a06082a8648ce3d04030204473045022046a14c1ba7a7ee9a45f043da7e75cfbbcaf41ec51afe467938227bbd2905bf21022100d831898e7487029885c2053a27dee66721fe53ebe453083e7e9179672ee93808", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "59f43d6b2f8fdc680edb8c3c00972a690324b9d0d7a1eabdb5fe3732f708d9c9", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «59f43d6b2f8fdc680edb8c3c00972a690324b9d0d7a1eabdb5fe3732f708d9c9». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «59f43d6b2f8fdc680edb8c3c00972a690324b9d0d7a1eabdb5fe3732f708d9c9» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: two spaces in a row, its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590671a30002015823815820238546d8567ba3865979ef19b116b1ec79613e6ffc185caec739f423d81e8ef3025906443082064006092a864886f70d010702a08206313082062d020101310d300b0609608648016503040201300b06092a864886f70d010701a0820156308201523081faa003020102020839f63ecac8441a9d300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30163114301206035504030c0b416e6120204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200042ac4f35a2a9daa31ab3b7d44e5cc8d912a417eb6af9e18d761701352049a669e5ee28eac5d1fbcd87e12eeacf2860a14409d878c1a141dad40dd46521ed518eea331302f301d0603551d0e0416041416469c0fc5eecc540e985c63080e29a93f7e1144300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034700304402205fbcdfc5660b1e2c03eee6b5c80aae598f3c216564824d4b741c9dc1e9e0d72f022020581cde8793c6e83aa3af64343847697cb86245d7e3eedaf474b51fac31836b318204b0308204ac020101302330173115301306035504030c0c434120646520707275656261020839f63ecac8441a9d300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420f8bcbe8210ba8ba02c5cf52ade7c9b4b4d7a84ff7c11258b75ebf15a2c14532a3037060b2a864886f70d010910022f31283026302430220420238546d8567ba3865979ef19b116b1ec79613e6ffc185caec739f423d81e8ef3300a06082a8648ce3d0403020447304502202e12be72a5944c09e703594341f8a37cab130a41c98265ebeeb6f1b6bf42e914022100bcd32ea5bb3ddccc44094733de70721a372d5a1642b7e2f6d72198de13d9a30ea182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042021e319b7052656af70b05b9f9f6d8e6cbc677958de3d5a10c19b1497819d1cea02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420c3485d00f871d226efe634cd1daa9c8090c9d92b94300ed483f72340fef22769300a06082a8648ce3d0403020446304402205519eee9a2eff6aab2e687ff1930f23bf9bd6e82a27dbc6c505e0afeab3a8e2002200efdfba5bca11cabff0cacfeba5e47ac23aa2155b435647b54ccf0c591e4ea13", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "238546d8567ba3865979ef19b116b1ec79613e6ffc185caec739f423d81e8ef3", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «238546d8567ba3865979ef19b116b1ec79613e6ffc185caec739f423d81e8ef3». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «238546d8567ba3865979ef19b116b1ec79613e6ffc185caec739f423d81e8ef3» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: an escape, its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590677a300020158238158206f221fd7d619c20a32c91f5a9fde0c64f106c3d9239da4b9837ae759d2a78cd00259064a3082064606092a864886f70d010702a082063730820633020101310d300b0609608648016503040201300b06092a864886f70d010701a082015a308201563081fca003020102020839cb5c804245605e300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30183116301406035504030c0d416e611b5b324a4cc3b370657a3059301306072a8648ce3d020106082a8648ce3d030107034200042ded6982c3c3f5417438c8ded0f3f54dba01d7117c5d9d26c227bed68da4eb17149cbbe736949b71ef078164e9bcde20b513d8b72ba14ae51b638b3c876b2b73a331302f301d0603551d0e04160414642ce6cfa0610ca89e5b59accb7c07e5b67c7a38300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100fb48511a4b14651cdd53ef2ddfe175b2009358cd496c71fee50c5c4f261e41d7022100f5684a87ac7d180e4b8831180fb40d0e0b0c06a31c196995103e1158d6f808ab318204b2308204ae020101302330173115301306035504030c0c434120646520707275656261020839cb5c804245605e300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420be35e696ee624513169e091856ba105b649127a9b18a8e28cfcce6ebcba7fe983037060b2a864886f70d010910022f312830263024302204206f221fd7d619c20a32c91f5a9fde0c64f106c3d9239da4b9837ae759d2a78cd0300a06082a8648ce3d0403020447304502200b504e0e13455828266e7a1c50e586af78b3dc25c02ac7050029c7cabefb3a160221008014f173bab900a02c24cc1788889455e1956e9421050f8672f1a1217dd0618fa182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042033a4d54ffc76ffa0d95008a45957677e01dd0501d97e6964e3637d18475f77b902012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205ed0d8140068ee112ade04b64d290d406215d2f1d53a118cc150c4ef969717c6300a06082a8648ce3d04030204483046022100a3716e7a226ff43ac866b632d2e077cf1f2f23a33c571e28a3f2a68b347468e702210085350db290b8e99d9e69ad9970eaf2ed11952ee5a9e0c48b54f82c3cbd37caf1", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "6f221fd7d619c20a32c91f5a9fde0c64f106c3d9239da4b9837ae759d2a78cd0", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «6f221fd7d619c20a32c91f5a9fde0c64f106c3d9239da4b9837ae759d2a78cd0». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «6f221fd7d619c20a32c91f5a9fde0c64f106c3d9239da4b9837ae759d2a78cd0» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: U+202E, its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590675a30002015823815820a5ea1cb23b2c610048375c213b2d62f4253e45ce56a87d8de2e34d5d1e24f732025906483082064406092a864886f70d010702a082063530820631020101310d300b0609608648016503040201300b06092a864886f70d010701a0820159308201553081fca003020102020826b467a4e5692c87300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30183116301406035504030c0d416e6120e280ae7a6570c3b34c3059301306072a8648ce3d020106082a8648ce3d0301070342000483e0cefa1113ef2298a2871fe53acae08bf8b35493db715b303b4b7d48448b3161457584d47bd52fcbbdf00f7a99746a305f1f0aced72a078887bec44769699aa331302f301d0603551d0e04160414518309084534657ae20689c4569faef730716ce6300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034800304502200c3f6a6ad2b7c4f28956f06a876e5a8204e2787bf5d1fd3b202e1575fff211f402210096bf478202639f4488a319c465e9f029e8f08cd02b43afe2f69e2f676e07dbd8318204b1308204ad020101302330173115301306035504030c0c434120646520707275656261020826b467a4e5692c87300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207cf6ea64ba91bf3b491521785a795cbbdb1c5eabc6c4c93f93cf4b4c8a8f92423037060b2a864886f70d010910022f31283026302430220420a5ea1cb23b2c610048375c213b2d62f4253e45ce56a87d8de2e34d5d1e24f732300a06082a8648ce3d040302044830460221008117a24a6be29b9f5c373d4a428c94642f79794bc6e87d90912e8d5d0b275606022100d65ada6faa3c880ec7291ad10d536da0f61cacd2699fbd3920f0d52513d96189a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420d0921df8b4ce800e7ad603a3ddccbecfd535226a2294f31dee041788d5148d4202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042026989a1552e0ca2ea2f132acd23289f5d0353af74982594ecf5adf82043e3325300a06082a8648ce3d0403020446304402206a97592e02eeae7843f48f9c952e6754145d7ebe7007975659d5683c1f6aece00220342b062f01f96414d4c0996d46cdec4b1cd97d951869d4c42840dca66d1ab3f0", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "a5ea1cb23b2c610048375c213b2d62f4253e45ce56a87d8de2e34d5d1e24f732", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «a5ea1cb23b2c610048375c213b2d62f4253e45ce56a87d8de2e34d5d1e24f732». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «a5ea1cb23b2c610048375c213b2d62f4253e45ce56a87d8de2e34d5d1e24f732» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a byte order mark, its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590677a300020158238158207d7565a79e64b75e7ad84488f0e4fbf4298b24112fe480713f189a34cda6581d0259064a3082064606092a864886f70d010702a082063730820633020101310d300b0609608648016503040201300b06092a864886f70d010701a082015a308201563081fca00302010202081fa914aaa0fb29b9300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30183116301406035504030c0defbbbf416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004cc6785a7d46d4bac3512d80ad40e9615556ddb447f6142174ca1ea27e99d47e86509780913e8578526f9ad0505edb0e0efd8bdc9d927119c3879af2d4323174aa331302f301d0603551d0e0416041496e31c86c435951d3ea228fecc15c40d31070fcc300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100cf3cb23b140c8518d190819233070c042d5ff6061ee7d09768fc25657acf9d59022100ede4dc8092ad55ee5f7edce2f90fd3c5acc70aa4a22964f5541d1068f65f17f8318204b2308204ae020101302330173115301306035504030c0c43412064652070727565626102081fa914aaa0fb29b9300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420dfc782b85d4ef05f1e4e2bc19709f4f2ea326c4ff3d2c35f2ec47c137809fed63037060b2a864886f70d010910022f312830263024302204207d7565a79e64b75e7ad84488f0e4fbf4298b24112fe480713f189a34cda6581d300a06082a8648ce3d04030204483046022100ad7560c62c4776fb283e308bfdc203704527a5920ec279fc3bef0ed9159739fa022100e0fdf7f8c9a4792f961ba450ad3c0025e0f1325b0735b1181052fec5c915db9da182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042080bda69458c83f6ebcce6c7efc7a661656780bfba3a884293430d8c8787ca4d302012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420d679aaf43393c1f1ef44c66c7e069cc42cbf22c5852725a832c7e00fd3b53d76300a06082a8648ce3d0403020447304502201a0c110ba6dc4e4c3ab36e4e4ae89becde6c0d508663c677e1c354e2465128fc022100b2bc097d975446247087c1822ca8016b9200211938c13b6d902d689813187f81", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "7d7565a79e64b75e7ad84488f0e4fbf4298b24112fe480713f189a34cda6581d", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «7d7565a79e64b75e7ad84488f0e4fbf4298b24112fe480713f189a34cda6581d». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «7d7565a79e64b75e7ad84488f0e4fbf4298b24112fe480713f189a34cda6581d» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a line feed, its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590672a30002015823815820b73649447e2741f656954d1d0fc93d5aeac826a943ce12071ccbda12b5d4a7c6025906453082064106092a864886f70d010702a08206323082062e020101310d300b0609608648016503040201300b06092a864886f70d010701a0820156308201523081f9a00302010202083c9e130023a16cfa300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30153113301106035504030c0a416e610a4cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004cf18a34762bdf63c67cf117ae7e5ed37df1b2640490af860b65829d6b6f79426da93867e6f6e3d21a48cadcfc3590aabfb5094551d7d1310adc66b9278ffc5eda331302f301d0603551d0e041604148e0a29642dde389b89b93c084a6f84bcc3e0dea2300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100c6181229c72e1434759509fccb876b6090f807cc693b034d646b27f657634e33022014ef3ed61b3d6eb12cc00af1558e270f71240d25f4449d2e54f36be80310fe8e318204b1308204ad020101302330173115301306035504030c0c43412064652070727565626102083c9e130023a16cfa300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420c0ff505d3c4279efcd857ed73697c9342c8512801c322b062e4ea199ce57108f3037060b2a864886f70d010910022f31283026302430220420b73649447e2741f656954d1d0fc93d5aeac826a943ce12071ccbda12b5d4a7c6300a06082a8648ce3d0403020447304502206a46014f847a6c183e0834d0a8a69b22971f2e713742efde53212921af2bb1b9022100f100dc4813af4821471e3f0c64ba052969111f9abf8edd14a757fe08628ccb3da182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104205b40bf9d9ca0d78410386335786a5a6b9ca7a24d2112e44d62fc592269979fd702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042057d55e296add2ad02cfb443efb62345070a153d0b044a94773f6c5a072c33dd6300a06082a8648ce3d0403020447304502210085fb3816c47b8f08d5c22273b7eeedd1c438c711b5f901d21bc52c540ef58996022067f3deaea6e321e5c77ae4705a18783f2ad13cb14a50c677253d97efdc50e07a", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "b73649447e2741f656954d1d0fc93d5aeac826a943ce12071ccbda12b5d4a7c6", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «b73649447e2741f656954d1d0fc93d5aeac826a943ce12071ccbda12b5d4a7c6». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «b73649447e2741f656954d1d0fc93d5aeac826a943ce12071ccbda12b5d4a7c6» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: givenName, surname and a commonName with the NIF, the name without the NIF", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906dfa30002015823815820d692f403add9b3f4fe64b916e94be501b0619d817d16610a071d1523946093e5025906b2308206ae06092a864886f70d010702a082069f3082069b020101310d300b0609608648016503040201300b06092a864886f70d010701a08201c2308201be30820163a0030201020208151eddc836ab262d300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a307f310b3009060355040613024553311830160603550405130f49444345532d31323334353637385a311a301806035504040c1145535041c3914f4c2045535041c3914f4c310d300b060355042a0c044a55414e312b302906035504030c2245535041c3914f4c2045535041c3914f4c204a55414e202d2031323334353637385a3059301306072a8648ce3d020106082a8648ce3d030107034200044708403c1dcaa590c99f5c233fd06796426311424c92b5d583e7abd0f2370b84a47750591ff3d8fd906e2b71f5e5585bdf8c90bab5062a456717234a4d9c4deda331302f301d0603551d0e041604140d2039f2b26fbe8e88068aae91ba5f508cad0793300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100f24ebe9842dd7004f8ec6b17d5e0522c09c2ce1fe6f1c9f2421753efe91a548f0221008c8aaf3f8fc9b95f79b01308857a08867d23ebe722bef1153b8519aca556f778318204b2308204ae020101302330173115301306035504030c0c4341206465207072756562610208151eddc836ab262d300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420d75c489279517cffda676cb16ae3af758a46f227958c61968a0c382f0e52415a3037060b2a864886f70d010910022f31283026302430220420d692f403add9b3f4fe64b916e94be501b0619d817d16610a071d1523946093e5300a06082a8648ce3d04030204473045022066f127341f96b4a6c94c5962c3a58c3d3fafc7bb87f347cc6f8819a73a9f0c7e022100ad29d66b9f421ea250abe27853768e227732ab741dfe7b90f0c33f9f326a6e21a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e539512cc9267157d8b61c1051e91a21496c02c63900b57953dfd15bfe93f2eb02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420c4eb8b7bb8ad50376c4677b3151ca49ae4d8ee02949c7a873849e3f64239bf86300a06082a8648ce3d04030204483046022100ce7761a97ee8180bd586aaacb00539f2a10ff6f5e65ef45b3fdf927c6566ea90022100d8d425e66a38ad7e4d4ba1e5eecab45331f15b95ef50e48eb51a71756b91bd1a", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "JUAN ESPAÑOL ESPAÑOL", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «JUAN ESPAÑOL ESPAÑOL». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «JUAN ESPAÑOL ESPAÑOL» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a commonName in a VisibleString, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d736563757269747901010259066fa300020158238158206d11ef317224927fbf5a7fc47b9b3d9055cf1a23ccdbbd6d67d64c1bcc9cf583025906423082063e06092a864886f70d010702a082062f3082062b020101310d300b0609608648016503040201300b06092a864886f70d010701a0820155308201513081f8a00302010202083b9f2fe9769baed0300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30143112301006035504031a09416e61204c6f70657a3059301306072a8648ce3d020106082a8648ce3d03010703420004943ec4c6484457048e288d6ce2e6208cfa15fcc70220b2ed25c79a6f39dbb9eb780f900fbb06fa0ac03ad1e64412157e7ce5bea241155b0adf7a60f5c63121f7a331302f301d0603551d0e041604143be2e91d44c53deeb907bfba27f824e1786bc43e300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034800304502210086320ad899fc47e9b13c570a04db9a17c27437f8a55ca6d8531331c29074033e022032f3d639f79604db32a2e85f49443f450c376ae3946d1aa64c257a741e21acc9318204af308204ab020101302330173115301306035504030c0c43412064652070727565626102083b9f2fe9769baed0300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420df56f258c598f585bf51a7f87b7d33c154d7ddc8b1424cda5365bd968435eb4b3037060b2a864886f70d010910022f312830263024302204206d11ef317224927fbf5a7fc47b9b3d9055cf1a23ccdbbd6d67d64c1bcc9cf583300a06082a8648ce3d0403020446304402205d0e7d5ee6969418367e214f21825704f64920f6bcc783da09be63794606a720022067a9fa0ffaab8893ee61c62cd570573259ac19fead876f4b46778ff721d041e0a182039730820393060b2a864886f70d010910020e318203823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420b0e385927f75f10774214c3776c57660f9ec448b70d27c00f65314307e13245302012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042040d02bb836d2bbe5d0c61d63ba4d0e9572dd7b49224d85a01320e0cb3bf755e9300a06082a8648ce3d04030204463044022071834f61e706e9d59160e8cf9e07491ce2571f32aaa135ad9ba7673dda871227022047e437692d73010183ee4b67233d145b78541991b054e7304b5df3bbc2d0bfde", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "6d11ef317224927fbf5a7fc47b9b3d9055cf1a23ccdbbd6d67d64c1bcc9cf583", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «6d11ef317224927fbf5a7fc47b9b3d9055cf1a23ccdbbd6d67d64c1bcc9cf583». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «6d11ef317224927fbf5a7fc47b9b3d9055cf1a23ccdbbd6d67d64c1bcc9cf583» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a PrintableString, shown", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590674a30002015823815820e102f0375b1477f82256d2fe94ab3afb4f2c308419d3cbee73bebbd0d9db3efc025906473082064306092a864886f70d010702a082063430820630020101310d300b0609608648016503040201300b06092a864886f70d010701a0820156308201523081f8a003020102020832567d6cbc5fb07b300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30143112301006035504031309416e61204c6f70657a3059301306072a8648ce3d020106082a8648ce3d03010703420004f47be825de15c6012ee26496222c4e0b61edfc239701077ab97a6727a8e3a038b421749bafde51f0e320f3a99cd35a31d21adf65a6634f1e2faab4fd66b47e5da331302f301d0603551d0e04160414fdcd67e2453233b21898a6b61727f21f813d747c300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100c1c8575ac8857c98e6394cb92dad336bca34d986ffedfeb62b116cb976d11c93022100b3436ce058c7149367e18fb5ce357a7f32cb674f0b3898641613ad775ec3faf4318204b3308204af020101302330173115301306035504030c0c434120646520707275656261020832567d6cbc5fb07b300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207c279d24e5d5559edf03f49f9433e05d54b2a199c9cb990ab2c24b5a006123223037060b2a864886f70d010910022f31283026302430220420e102f0375b1477f82256d2fe94ab3afb4f2c308419d3cbee73bebbd0d9db3efc300a06082a8648ce3d040302044830460221009a49b5409bdd4d270a737fada65d8d3b974dab35b845559416dfd926be79ca5502210082cfdc6c6c5de6e98dae56e4514d0ec41e5c5e5fa175defa5d9473fc8993e9efa182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420d8b46dbd91eeb4d65c8f2ad3a383d8322ba2285a8fb2943207886c734b67aeb802012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204201f795dd4862dd6afb6344895f05e276d8e71de78b6092bc7e488fed0f3004d08300a06082a8648ce3d04030204483046022100b65be92824ffd15b91e19388ad7e0fa8d12227638273b021e3e4f82b4f015e60022100f67344cfd24dbfabb22cf2da9e18fdd16818cf1d0c6c806173a7a79650dae06b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana Lopez", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana Lopez». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana Lopez» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a PrintableString with an underscore, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d736563757269747901010259066fa30002015823815820c3a4b8399b8205f12083a075be0c73815f3dc729ea87e8d282111c0152d7b2a2025906423082063e06092a864886f70d010702a082062f3082062b020101310d300b0609608648016503040201300b06092a864886f70d010701a0820154308201503081f8a003020102020825a7d7da0034736d300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30143112301006035504031309416e615f4c6f70657a3059301306072a8648ce3d020106082a8648ce3d0301070342000408be9dfcfd9b5adb4889e9924ad365385203beb4d9667423073bb19f87832de3e7f109bbfc11a20aecfe69f590b6df8949d082b411e84e7334a733906f7e581fa331302f301d0603551d0e041604147a0bb066da8bf5a1a2f229ea9ff3cbb6473ad195300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020347003044022036e61d13674d9544459cb9af1c0a9390bbb2746de1984e11481b086a4ecbbd4002207f6fdabb13cfc57d4d4f682a54c64395cefaeb05f0c00c31416499936c388c5a318204b0308204ac020101302330173115301306035504030c0c434120646520707275656261020825a7d7da0034736d300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042022af549f3922034d4cd259ced72b5ec2e67dfdb7c919feec59f388281482b9883037060b2a864886f70d010910022f31283026302430220420c3a4b8399b8205f12083a075be0c73815f3dc729ea87e8d282111c0152d7b2a2300a06082a8648ce3d0403020446304402202f3a87ffdf64de21238228dab4a2120af234fc7454cfb438626347d7cc2b70de0220455b98cd74e8aaba241edea74deef5c00ec5eeda7c1905c2fc7342d7612fcef1a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420f167e7c4c77f2281bf25c80af5e6755bb450fe4b58e1c97523b38aa3b1cf982002012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042056babee9eb9eecf97bc573a5c6246135c8c0c09bd3fe5a8f2c39355deecbfd45300a06082a8648ce3d0403020447304502205b035d52a90e0dc46ba8ee2d7ebfda812868908b755c837d9f9c7b8352f7b30902210085f3789f03bc484210d94d8b153f8e60b6c8623bd5b54b9358d20aad1e0439a4", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "c3a4b8399b8205f12083a075be0c73815f3dc729ea87e8d282111c0152d7b2a2", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «c3a4b8399b8205f12083a075be0c73815f3dc729ea87e8d282111c0152d7b2a2». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «c3a4b8399b8205f12083a075be0c73815f3dc729ea87e8d282111c0152d7b2a2» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a PrintableString with an at sign, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590676a30002015823815820f817ec9509cbab242673f52bdbee7e59fec5d0a4ba11a13da2a6e35ae1194516025906493082064506092a864886f70d010702a082063630820632020101310d300b0609608648016503040201300b06092a864886f70d010701a082015a308201563081fea00302010202080c798696e1ebf65c300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a301a311830160603550403130f616e61406578616d706c652e636f6d3059301306072a8648ce3d020106082a8648ce3d0301070342000498a7b7fe9a8e0a1e89a2a74f3ae981cb1406faaacb34fab29bd23797e8e67c2ea2cf0b99f972db3c336add540d8034ba198d889223bd4ed0b3193fd74edffef3a331302f301d0603551d0e0416041493fa20c41bd732983f15c7af00fa5778d1e6498a300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034700304402200c3240a69791ff71cdf3b6e4e253b9dfe257a07a9d7ae0374e1ace0fb85aecb502204cb97f2532b1593eeeb27778c1865890a6b42930ea6d34661aa3574a536c4b2b318204b1308204ad020101302330173115301306035504030c0c43412064652070727565626102080c798696e1ebf65c300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042033a524c0469afd14cb641cee54d25449d2ca1c9531eff79b5eb956dc7106e4bd3037060b2a864886f70d010910022f31283026302430220420f817ec9509cbab242673f52bdbee7e59fec5d0a4ba11a13da2a6e35ae1194516300a06082a8648ce3d04030204473045022100aebf36348f9657650f7abe28c4ea6720418d5cd87ae942831077ae7bee2d55ec0220741fc8053bab65de617ee7f6826b29eb2b945d90c3012ca3c710273d17b5ada4a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420bb3ab24e60c8578d242870e7132de1c8770b008f3d73fe97f6cb88cf5c53ae8202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204204e478d40e837ce7fbc8e9fc8ee8052095e93ddd934b7af84c84c6141334c98ae300a06082a8648ce3d04030204473045022100cde9fd30390bebc79d1bd04994d1d50d3ca6350c63ab57183a288d86afdf11fe02205bbba07c53b208dc7d47900cb64a859426c163d10bcb0cd6566b837fc3508597", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "f817ec9509cbab242673f52bdbee7e59fec5d0a4ba11a13da2a6e35ae1194516", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «f817ec9509cbab242673f52bdbee7e59fec5d0a4ba11a13da2a6e35ae1194516». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «f817ec9509cbab242673f52bdbee7e59fec5d0a4ba11a13da2a6e35ae1194516» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a BMPString, shown", + "security_cbor": "a30071646174656b6579732d736563757269747901010259067ea30002015823815820d9b810865b3a83eef883508c83563ff3c9642b87258e038cfc6042c4e9246de4025906513082064d06092a864886f70d010702a082063e3082063a020101310d300b0609608648016503040201300b06092a864886f70d010701a08201603082015c30820101a00302010202082f5d4b44edc2b5ac300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a301d311b301906035504031e120041006e00610020004c00f300700065007a3059301306072a8648ce3d020106082a8648ce3d03010703420004d2333695da2cf3db608dd879033729086da7811141023a1d85309a65648ce85179c52d727b0d394a2b063d7dd567752006698dd9139af1f3c6a4c49ab3c4d453a331302f301d0603551d0e041604141126fdadc5909abacb6d2766dffe9bfa91c78c28300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100dda40b27582cb3cdfdc41d8065b7dabaf57d03767fbd1dbdd221654d96234a8c022100c7da23f437d209f74fff1b7eef92d1612f65b0f1b0089ad5a57625f0e3685bf7318204b3308204af020101302330173115301306035504030c0c43412064652070727565626102082f5d4b44edc2b5ac300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d0109043122042081955a2c97bb4aa9e4ca07c19cb26b8ddcaa352ef844d3d59e7d401f71c9ac4c3037060b2a864886f70d010910022f31283026302430220420d9b810865b3a83eef883508c83563ff3c9642b87258e038cfc6042c4e9246de4300a06082a8648ce3d04030204483046022100ac3499c6d136e618abafdf55b9c89bc5b7682eb1140b897c6bc360f95fd27156022100fe8c007f95f40a0d1a81ba63fbef72f7341b105ea1d17f2f85800256623ed6f8a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420733541884d2d6e43b7b9bbcb515dd43e1b837828b051ef19cf5f30c78fbef35a02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420eb9667ac3a9b2ef17f35848dad80b4b41d7104a2c1397b2c76219fa4e24dd601300a06082a8648ce3d04030204483046022100f261b01777b110e178930e1658578e02c95bdd6da3c6c40a1b4d0e33f7299231022100c2e7bd9849fe22fd48a4a79eeea978b9bd22f9f96235610fe49b72136b676311", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a BMPString of odd length, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590670a30002015823815820b0448f6e9d17424b15abb63cab9b159e611f2ca3d97f41ef7ebcf37aaac59b6c025906433082063f06092a864886f70d010702a08206303082062c020101310d300b0609608648016503040201300b06092a864886f70d010701a08201533082014f3081f6a003020102020816fd1088877b2a10300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30123110300e06035504031e070041006e0061003059301306072a8648ce3d020106082a8648ce3d03010703420004d0ca5bf95588bec1aafbee8a6643cb420ca4f553a9dc522f75a9b7976cc6bc4d42aa5481c09e63d3201641ccf1c8de876db439f70e6a550d8360a1b1a28f873ea331302f301d0603551d0e041604149e419d4ff7b48cf995135c277c4c1be367001416300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100eceb3d5917fb5d8855cb99d2ff80df317ac1f4d92ac784bbcd63e8350e062f4502204a407df0c96391f08476584bd0567b8b570ac45d30606a19e5a411d148ace0d9318204b2308204ae020101302330173115301306035504030c0c434120646520707275656261020816fd1088877b2a10300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420263ec53c674237bc7999633a74b99fd75af72a116647c8fc9e25bf95b28a6a363037060b2a864886f70d010910022f31283026302430220420b0448f6e9d17424b15abb63cab9b159e611f2ca3d97f41ef7ebcf37aaac59b6c300a06082a8648ce3d04030204483046022100f23d208c01b7b7da37ec25ce77eb23df33587bc09fdd36498ea634d1a686b9a902210085f2cb69df44d0bab5fcc762189b74c0eee2eb960e010071024120c4a6debdf4a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420fe120e98f7bde91ca9fb70699501efc0063485a4d9a6a3eb9525bec14617cfa502012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042030bfd3e5146455b74c372d900bdadd6ca279ab95c61fffcc7fd1277aa4b98e41300a06082a8648ce3d04030204473045022072c6803557caa382e4c093d1bbe7e0daf495933246f119d011df02420e1906db022100fe6361a9d56e54f664ad58b8be258147a4f030e5d0b48504767ea7a0e53cc3ae", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "b0448f6e9d17424b15abb63cab9b159e611f2ca3d97f41ef7ebcf37aaac59b6c", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «b0448f6e9d17424b15abb63cab9b159e611f2ca3d97f41ef7ebcf37aaac59b6c». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «b0448f6e9d17424b15abb63cab9b159e611f2ca3d97f41ef7ebcf37aaac59b6c» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a BMPString with a surrogate, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590674a30002015823815820129f54b938e96f1d7ddabb664b08abd2ebd0ca353ba8e67f17399b2d06cf6464025906473082064306092a864886f70d010702a082063430820630020101310d300b0609608648016503040201300b06092a864886f70d010701a0820158308201543081fba003020102020815a5cdb72a66a49a300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30173115301306035504031e0c0041006e00610020d83dde003059301306072a8648ce3d020106082a8648ce3d0301070342000455764121843df30d51eb63a16c911cee3d6236b9cce187337c448d169f520603ff32ace261eae92a3292f6fa81716a57060c3bb47325abe5f964db94fed12df6a331302f301d0603551d0e04160414ba992b349a31fd1831cf0c30ed106e56a6e8ac31300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022059e3279ea30e40ec68640ade08169a817401ed5d38d9d74a7a17a8eb47066ce1022100f1290a27a59f749d0ddb209d349e987c04572ec0a5fb1aaadc33eb63529f8817318204b1308204ad020101302330173115301306035504030c0c434120646520707275656261020815a5cdb72a66a49a300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207ddcaf93fefd774b98e68e6c5d34036e6b1f605fb987025a275472c5a4e657cf3037060b2a864886f70d010910022f31283026302430220420129f54b938e96f1d7ddabb664b08abd2ebd0ca353ba8e67f17399b2d06cf6464300a06082a8648ce3d040302044630440220542060448182e9ab51b7b4d2ca4c18915fcad39dc00107c934889bda2df93f8702203579e9b243221d1684ff5148df84ad6d388e689ea99932d1845a24cb082fef17a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042026ce717f1b88c4f525124d6be5c1310a6d86f45f88beecb77ae41416e8a6c45302012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042073c1a50669c921b080096d81b4bff099913377c9e26e95524c9b8e592ab6d1cd300a06082a8648ce3d04030204483046022100d1788cc75c6de53bd5c661eec9a1407d6c9fa94ae7c53ef7f15025e4c3391c4d0221009d44054afb7d3667391cbf41c955a36f683a75cfffa6e1e4bf06752ac604f531", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "129f54b938e96f1d7ddabb664b08abd2ebd0ca353ba8e67f17399b2d06cf6464", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «129f54b938e96f1d7ddabb664b08abd2ebd0ca353ba8e67f17399b2d06cf6464». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «129f54b938e96f1d7ddabb664b08abd2ebd0ca353ba8e67f17399b2d06cf6464» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a TeletexString in ASCII, shown", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590673a30002015823815820b89b1c9db4b8e8b52d3214bb6bf873211b1aca6f25831cf5af248ad08e6ce95c025906463082064206092a864886f70d010702a08206333082062f020101310d300b0609608648016503040201300b06092a864886f70d010701a0820155308201513081f8a0030201020208273eaa16db1b6fc5300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30143112301006035504031409416e61204c6f70657a3059301306072a8648ce3d020106082a8648ce3d030107034200048b9d6bea4763308f4d518ee64907a787f59c18972d1f2bf8487606a86d7ce47fd1d5d8e78373c5b12c2dab6029193635a1191a12503bc82ff993a909d49a830ca331302f301d0603551d0e04160414e4a3b69c5c592b3efdc004b24207524a1feef3c0300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034800304502201af9c7a9580a04ec8512abdd72f3b8459efb442795cad45632aaa72f871103f102210085efc8ee3ac8a1120e6b930a0bba5221fade36100683d11a55decb944c3893fd318204b3308204af020101302330173115301306035504030c0c4341206465207072756562610208273eaa16db1b6fc5300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420440a4a222c8c6dc521c23c7857ac3dcd515278adb9314dce435470786e702c1b3037060b2a864886f70d010910022f31283026302430220420b89b1c9db4b8e8b52d3214bb6bf873211b1aca6f25831cf5af248ad08e6ce95c300a06082a8648ce3d04030204483046022100807e70b3f3affa843d4bed12707e674a3e0d0e44ab50eb419a8eb8bb3931969c022100c1199df01692ab06273cb147ac779d2215b2b5b630c44fce7b005eef6cc5ae35a182039930820395060b2a864886f70d010910020e318203843082038006092a864886f70d010702a08203713082036d020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104205c592ae3df41904a1affe586075c925e60235214e3aa6d24ac77210f2c2bb16d02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042056c55e29dac3a1aa4095b7ad1c79473b08069a1426061a608052390abdda45bd300a06082a8648ce3d04030204483046022100c907bb93761e6927e5ccd2afff7154abe6373329be3aac312d5d8ccd75432372022100c3e3659df0ccaa524c63f9cfc510ecda16fb9ccd7e441f924ba585dc00991884", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana Lopez", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana Lopez». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana Lopez» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a TeletexString with a byte of 0xE9, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d736563757269747901010259066fa300020158238158205c1b65735232e1b4a43f8710d45aa929153111886f3c40860a0b1a10f03d82e3025906423082063e06092a864886f70d010702a082062f3082062b020101310d300b0609608648016503040201300b06092a864886f70d010701a0820154308201503081f6a00302010202081af7a39dd8de1a72300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30123110300e06035504031407416e61204ce9613059301306072a8648ce3d020106082a8648ce3d0301070342000496cc97a262c573d40841982ea58f5f64072ac64e61b4d9560bb4edeb831fcbe87f72e7b80e5fe60c6469c4d41b981bdc6e4fa47b3c7b295092b644696cee3568a331302f301d0603551d0e04160414bf5d266e14329d8a8394c19ce45c330a56353ee0300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100a9d151def42b6476d9da3ed8149b867a4a396b7c21a4042f716cec4c5b6f58550221008cd0d6ba676da0a08dcfa652cb935ddc8d52013af836551ffb4a8a4e6739ef9b318204b0308204ac020101302330173115301306035504030c0c43412064652070727565626102081af7a39dd8de1a72300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d010904312204207febf5a51e214e0d2f76dd9fb6c0808fcbc70e8b0865033849caf11d3f4575d93037060b2a864886f70d010910022f312830263024302204205c1b65735232e1b4a43f8710d45aa929153111886f3c40860a0b1a10f03d82e3300a06082a8648ce3d0403020446304402206b085a6584c96c3d7bade18012b99e3f19d4bdbcc15cf031456b8b30cfe56ea8022055f9691d4de8f927509cfba565d2c2c219b1f004774181604e7f621d06fb14faa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420ce52ec5523b8bcc20414b121470efbf8b5cec0833e68bc9bf7e80bb5ebede5df02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042068ca601c5b63e8b2d242b8dbf9658b97c4db6c2a8d538d27404d4db9345ffd79300a06082a8648ce3d04030204473045022100f521457278edbae2a6739f2af787f05400e6f87aca215a5bcc8e9c76409487e402207dee2458f318a30d5a79fa773eba3a76c56d8c07035439470659526a38e5244b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "5c1b65735232e1b4a43f8710d45aa929153111886f3c40860a0b1a10f03d82e3", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «5c1b65735232e1b4a43f8710d45aa929153111886f3c40860a0b1a10f03d82e3». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «5c1b65735232e1b4a43f8710d45aa929153111886f3c40860a0b1a10f03d82e3» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: an IA5String, shown", + "security_cbor": "a30071646174656b6579732d736563757269747901010259067ea300020158238158206327ee5c7a23556909bcdd33a7fa12d2e6e4b34b3076e749f0410c4fb05856a7025906513082064d06092a864886f70d010702a082063e3082063a020101310d300b0609608648016503040201300b06092a864886f70d010701a08201623082015e30820104a00302010202080980568b48e7f840300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a3020311e301c06035504031615616e612e6c6f70657a406578616d706c652e636f6d3059301306072a8648ce3d020106082a8648ce3d030107034200048bec298d3cce1e4c431cb0821ea4558f11cf3e655eb99d58a193ad85e9c02647767ee5a8009c0cd706fb648ee8084df0b3df2512f4c936c727cfffe2131f935fa331302f301d0603551d0e04160414be3bc7e16e9cec57f78e9cc1efb0617ff1840135300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100ab87e793f772c4b03a3e80566d073066a95e024391cefcf0fac0cf687764ef7b02202ff5471141e5ef42f1325a9f6a78bc3a3141f0b2633db4c7a6b376df2a9a48c1318204b1308204ad020101302330173115301306035504030c0c43412064652070727565626102080980568b48e7f840300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420eaf1f5db6113b05e430222bd5e36d430b110b83a9b470c9c69bf4a7b9cd9da103037060b2a864886f70d010910022f312830263024302204206327ee5c7a23556909bcdd33a7fa12d2e6e4b34b3076e749f0410c4fb05856a7300a06082a8648ce3d0403020447304502203d2c53060b5fa5cac78924a4982f6a20b1b6e2b7c8e12594c73b55635cc07685022100f00d191f612e2458b25a96560a3cde955d0a96081c3bf32d097f5f2c6aebb1e2a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042052dac37742ae61780bad5ac8d1fe157c399c95581a85162d44e0dba21e70217702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203cf789cbef64e35d58d04c6890c45616a232b798c64409a62e9cb57efab914c0300a06082a8648ce3d04030204473045022100eaf20d54e7c9947883aa0b272ea27040e1e93c98605919825f3c57059f013a8102200ad2bfb8d965d63d9ad3c5edfd76b63261ccf090d06f8a2ac698c18843e09012", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "ana.lopez@example.com", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «ana.lopez@example.com». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «ana.lopez@example.com» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: a UTF8String that is not UTF-8, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590670a30002015823815820e4bdbd0fe3141a1354411b7519012caf6351e9d43d26e0157b28311dd6c53d93025906433082063f06092a864886f70d010702a08206303082062c020101310d300b0609608648016503040201300b06092a864886f70d010701a0820154308201503081f8a00302010202081a3f46405c941de9300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30143112301006035504030c09416e61204cf370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004b8b8c823ede33ba3e4e0350c70335a13e51567fbbee1218e5895eb4750fc7302832a322297ee842d90b1e8e5bc5f7e97fae6f1893028f1f440a3f036b2aefba0a331302f301d0603551d0e0416041475505d04fc045ef787c7e9dec9c91efd553394a6300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020347003044022003189fbc3bd255b81b1603349f5e840f8c2f3f5a5ee24b7c45b4941f4b476e06022061a99f5347622d3fa822e50e78b6157a81863bd8b34e56168107a9ac77ea3c56318204b1308204ad020101302330173115301306035504030c0c43412064652070727565626102081a3f46405c941de9300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e400f33454ffe740d7cc2f586e0074d8c9e987035023c877704eab148aafd0bf3037060b2a864886f70d010910022f31283026302430220420e4bdbd0fe3141a1354411b7519012caf6351e9d43d26e0157b28311dd6c53d93300a06082a8648ce3d0403020447304502206915546028eac8a99d17fcd1440b83d3ddce6ebb5297407f07e9e0de26c82ab5022100b30f160efae0de0525d3f25c7c477c069836094ee57c6417ec122cd0ed391529a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420e924bf97d6ab1a49f759d6484d2ad045d8805a820e0add799ad344be96d17aa202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203b5d65541eff5cec9e1c117ddddb22ef2edacd2c70c7e5c01983ea3edcae76f5300a06082a8648ce3d04030204473045022100b59c83e015bce3a4102e48b6e9f2867e20c75f301eb25e3ccdb86d5b0ae3d86c02202e09d2347b910013d8e9c5b9c174e0a1d10216d44c39e3a2f94c5e04a05fdc01", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "e4bdbd0fe3141a1354411b7519012caf6351e9d43d26e0157b28311dd6c53d93", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «e4bdbd0fe3141a1354411b7519012caf6351e9d43d26e0157b28311dd6c53d93». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «e4bdbd0fe3141a1354411b7519012caf6351e9d43d26e0157b28311dd6c53d93» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: two commonNames, no text: its SHA-256", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590689a300020158238158204cde95fbd3c5c7423d592efa68edf9018c3afe95c439519edb66d4f2939b8aed0259065c3082065806092a864886f70d010702a082064930820645020101310d300b0609608648016503040201300b06092a864886f70d010701a082016d308201693082010fa0030201020208113bee1a736122fc300a06082a8648ce3d04030230173115301306035504030c0c434120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a302b3113301106035504030c0a416e61204cc3b370657a3114301206035504030c0b4c7569732047c3b36d657a3059301306072a8648ce3d020106082a8648ce3d030107034200047a5c92e8934143064df326734ff4c337852ed97d91f6f9c83cff3432b1e3bc506944d45e64941a94255cff72f0182d1e72d7bda408cf62d9e21939295559308ba331302f301d0603551d0e04160414788b7b55631213ac2c02a92bc029208c4fcc60a3300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034800304502205c800fc5d9dd9184fce2363ceead3ed5589f53c7951e6e97d363627ea73611c1022100fa57ffaf10ffb797164669c144b38d048c0f97f10c43723211a24f2ff494f381318204b1308204ad020101302330173115301306035504030c0c4341206465207072756562610208113bee1a736122fc300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420757dc1690dae8258d41e4423fed2e3a20687e949bb40dd61202c632cc05a2b463037060b2a864886f70d010910022f312830263024302204204cde95fbd3c5c7423d592efa68edf9018c3afe95c439519edb66d4f2939b8aed300a06082a8648ce3d04030204473045022100bd32093491f8a7dc2963a097914c13a0d354bdb1e2dd6d3ccd50618227923fdc0220059161db8752e7760c36e39fc83e920d7717380bbe486756338c0f91da55ceb3a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104202a9f2b5690b941aa2ecdece7a272047825f7a0d4f268fb3788b2061ab7e2444202012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205b347f2f9e28423909be13e5a274a0a648c9dca37f38a025d6a1b8a349a5ce58300a06082a8648ce3d04030204473045022100dc694b3c15509bc2d074d55bee8dd67971c917f95534e29bd25a19bc878ec18a022067eaeea336cd831ac5b12d20a23efcb91b7a3a2d79c0a9abdb730f0dbe0a1cd1", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "4cde95fbd3c5c7423d592efa68edf9018c3afe95c439519edb66d4f2939b8aed", + "issuer": "CA de prueba", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «4cde95fbd3c5c7423d592efa68edf9018c3afe95c439519edb66d4f2939b8aed». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «4cde95fbd3c5c7423d592efa68edf9018c3afe95c439519edb66d4f2939b8aed» (emisor según su certificado: «CA de prueba»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: an issuer without a commonName, its organizationName", + "security_cbor": "a30071646174656b6579732d736563757269747901010259069fa30002015823815820120a29a3ea3057e9185309304391f6db2f52d24b6cacc1933858b2ae1ea95c7f025906723082066e06092a864886f70d010702a082065f3082065b020101310d300b0609608648016503040201300b06092a864886f70d010701a082016d308201693082010fa003020102020835cbe0f09017b203300a06082a8648ce3d040302302d310b3009060355040613024553311e301c060355040a0c1542616e636f206465205072756562617320532e412e301e170d3230303130313030303030305a170d3430303130313030303030305a30153113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004ba83707532f2f329482a7c83e5459d19f207844822aa17ebae81e90fef6e6a99ea8237fd22c4e19bc2a19ae6d929ded1dceecfda3648257352953cf567f0978ba331302f301d0603551d0e04160414df166d38aedbfb740259f22779196235a81aa6ea300e0603551d0f0101ff040403020780300a06082a8648ce3d040302034800304502210085a4b61adf849bfbbc716fa725019b9bb58fca27c3a7336f66122daafd86173b02201297f041a1c47cf3fed94533d51a6c0d215458e1cadbc0847adb8437c6eca00c318204c7308204c30201013039302d310b3009060355040613024553311e301c060355040a0c1542616e636f206465205072756562617320532e412e020835cbe0f09017b203300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420e5513079c4c374af3c43f51f8e446579c6f18e9146ced8485bd805fac3f921af3037060b2a864886f70d010910022f31283026302430220420120a29a3ea3057e9185309304391f6db2f52d24b6cacc1933858b2ae1ea95c7f300a06082a8648ce3d0403020447304502201b43949b9d07e23fd3063232bc6a7070a53d3e2712db86c4e7a883aaec732e1e0221009d3cc5f49992ad92207f8aea22ff18f53b98b6d4848dae045531f8ed9e1040eaa182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b06096086480165030402010420a0deebd71cb6f3694e82ca31e88afff546ef98fb26403de26a9b51be46e14f6702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420fb998fa97a0bc9fa296e4bd29925b98c5db67bb9409fbd1ce4fe916c13750d44300a06082a8648ce3d0403020447304502203ac89dbbd8a3f9acb51083c03cb9aa707444229acef3212ac7365ef5a3e7180f02210083624f62ee429a144842d97d6155599a64ee5a09341286207711498f8d72488b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "Banco de Pruebas S.A.", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «Banco de Pruebas S.A.»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: an issuer without text, the SHA-256 of its name", + "security_cbor": "a30071646174656b6579732d7365637572697479010102590696a30002015823815820f5a650ad3cddb4c44cf7f965929d620db3ef7b1c674bf31f287982fee5cd9805025906693082066506092a864886f70d010702a082065630820652020101310d300b0609608648016503040201300b06092a864886f70d010701a0820169308201653082010ba0030201020208096369fbd47134c9300a06082a8648ce3d0403023029310b3009060355040613024553311a3018060355040b0c11556e696461642064652070727565626173301e170d3230303130313030303030305a170d3430303130313030303030305a30153113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d0301070342000431134e24089c2cb7886e97d804624f735ee3d9277feb71d5744a890f2545d667bb2ec1b772489ea957ef6a920ab41db6a0ddb8be8fc6aea6fe10cfad8c79692da331302f301d0603551d0e04160414d7c37a6975fff72918000788cf6eb6e6e69fe980300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100f5670bec7943933a38972ef132542e7acba2b780fa41071323635ecdf5b4afbb022054464e10833e5a0440cc9791188f4ab1656f1e98f6ceb02758ed97f03810b035318204c2308204be02010130353029310b3009060355040613024553311a3018060355040b0c11556e6964616420646520707275656261730208096369fbd47134c9300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420b0eea8e98d1d957953b415ab5d73d438255928e141b6b9d184bb207e04d8b74e3037060b2a864886f70d010910022f31283026302430220420f5a650ad3cddb4c44cf7f965929d620db3ef7b1c674bf31f287982fee5cd9805300a06082a8648ce3d0403020446304402205000da48172caeafae70b5ec3ef04b27876c5286ca9e8c069b58042320cc183f022069aceb47aafcbbf0e1163c71f3c4cc1324d010ff6a2892b745ecaf29ead1defba182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104208fc26dcdf7c3be46dcc15b6b7ff79a3f1707546cb349e92ac9b16fbbf774490702012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420db39fb2f4e32cfc39aba26a8029823afe54547182e34939fd913091cdec5a64d300a06082a8648ce3d0403020447304502205e70ab55452620148f59aa607e71682c03ece2b1a6f20b4c4c27eb874b97fdfd022100a6b0fd4c52c6bcfc0aedcfff521336d9ad497997893a9f028af7ccac886a013e", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "c2271e2dfd46284fff425ad04d32adcb48e82b5b393f676db23e44af3c5aa70d", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «c2271e2dfd46284fff425ad04d32adcb48e82b5b393f676db23e44af3c5aa70d»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "names: an issuer whose commonName has an escape, the SHA-256 of its name and not its organizationName", + "security_cbor": "a30071646174656b6579732d73656375726974790101025906bca300020158238158206cc2f8b4fe7625ab82daa9e0a05c69cf42cbfee647123125f7d40e8c5c6ffe110259068f3082068b06092a864886f70d010702a082067c30820678020101310d300b0609608648016503040201300b06092a864886f70d010701a082017b308201773082011da003020102020800ac5a6c1f56ef65300a06082a8648ce3d040302303b311e301c060355040a0c1542616e636f206465205072756562617320532e412e3119301706035504030c1043411b5b324a20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a30153113301106035504030c0a416e61204cc3b370657a3059301306072a8648ce3d020106082a8648ce3d03010703420004c5be97d889eb702cb6529b85113e37683623a8755ae114d9667c79ae07cc817eab87aadde6c90eed4d26f1162ca3c404d055ee8100634218f1bbf47aa36d47b9a331302f301d0603551d0e04160414e64094848799accb402041fa98ca3ca30c470b41300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020348003045022100c3d6572b8f5455e34fca00bd9b781dc9ac1bfa8eb098d85d46462b40b94b5194022025cb0dae1f956c5cdb697503d28835d6bf47065aaec7041574227d0745e25490318204d6308204d20201013047303b311e301c060355040a0c1542616e636f206465205072756562617320532e412e3119301706035504030c1043411b5b324a20646520707275656261020800ac5a6c1f56ef65300b0609608648016503040201a08184301806092a864886f70d010903310b06092a864886f70d010701302f06092a864886f70d01090431220420efcde0509101aa1085bfe01c22fe98dcfd2effca13c2307cd98c4b7b04d5cec33037060b2a864886f70d010910022f312830263024302204206cc2f8b4fe7625ab82daa9e0a05c69cf42cbfee647123125f7d40e8c5c6ffe11300a06082a8648ce3d04030204483046022100e62d1abec568ebb733698daa1945d14f0cefa84356cf69af877348167e9744110221008b4ab2a38ed2f09778611c67a69907f09242e4a73f2e8e60d65225c0249ade43a182039830820394060b2a864886f70d010910020e318203833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b0609608648016503040201042065130a54b303e7fb24180f8160c497220d76237bc2f18967a4f4e4228ecf5f1c02012a180f32303236303933303132303030305a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204206cbb15b96e441fb68844ea678d7da11830ec7eaf49e81fb4ff0baee40e65d5d2300a06082a8648ce3d0403020447304502210094b3af6d9ac992a72bb8dfe7ea4ec0131619766ae70360abc4aeb8c47509daf3022022b568901f370a2574c7beb927348e9f000046581f8906a5cf88cbfef230296c", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F6", + "seal": "S0", + "signers": [ + { + "holder": "Ana López", + "issuer": "88bf031a13dd79b9faffed72614e0617a07bd5b05560d30d3ee6603ce67add54", + "result": "valid", + "seal_time": "2026-09-30T12:00:00Z", + "before_round_time": true + } + ], + "lines": [ + "Firmado con un certificado a nombre de «Ana López». DateKeys no comprueba quién lo emitió: para eso, exporta la firma a un validador oficial.", + " «Ana López» (emisor según su certificado: «88bf031a13dd79b9faffed72614e0617a07bd5b05560d30d3ee6603ce67add54»), sellado por «Autoridad de Sellado de prueba» el 2026-09-30T12:00:00Z, antes de la fecha de apertura.", + " DateKeys no comprueba quién emitió los sellos." + ] + }, + { + "name": "seal: before the round time: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590384a200020159037d3082037906092a864886f70d010702a082036a30820366020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d0403020446304402204dab068527240f30c87d2d560ec73678465f0c46db4baf051f65274591471e3102205ba482ebc0d0c767e4ac5205065d90fdc1ed7ba3ff932ee43c26649956c81a9f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: after the round time: S5", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303330303130313030303130305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204206ec611e50ba08a9652626f2e01c82ecea7dcc274e609f2aa345d021863dcad7d300a06082a8648ce3d040302044830460221009aa0f6848ad166fab696c672bae16c2c0109100a0fb30113d8dbfe85914442db0221008d6e94b67c871fafe1e9bd103ab37d88ed7ce9ed7af4cef903a8ed23506889a1", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S5", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2030-01-01T00:01:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Sellado después de la fecha de apertura: no prueba nada anterior." + ] + }, + { + "name": "seal: t plus the accuracy past the round time: S5", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303239313233313233353935395a3003020102a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420471721ed38663795e173165313eb086b98a36585f824a592258e6796265b290c300a06082a8648ce3d04030204473045022027f0692afb054b51edb73a2a4e4d1ba123aeeb543f882ee63c905112f160cba70221008931ec501768f3fd292baa3854b97a5eaab5b61b2b2149ad7ef702555721c7ca", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S5", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2029-12-31T23:59:59Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Sellado después de la fecha de apertura: no prueba nada anterior." + ] + }, + { + "name": "seal: t plus the accuracy equal to the round time: S5", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303239313233313233353935395a3003020101a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200c92345a64ba03e7fc117b1fd5b182eadf35f1e7e647d05e4e6dd62c19551f71300a06082a8648ce3d0403020447304502210090dd1499741cdc1db55c09d4f29baaebbcfa46d0ff3bf7b324918cb5834d1aa70220687da12daa3c00fce83288177b7f9ae09a4c7292040fd9ecf5b28f858acbe9fb", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S5", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2029-12-31T23:59:59Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Sellado después de la fecha de apertura: no prueba nada anterior." + ] + }, + { + "name": "seal: t plus an accuracy of 999 ms and 999 µs, a microsecond before the round time: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038fa20002015903883082038406092a864886f70d010702a082037530820371020101310d300b0609608648016503040201306a060b2a864886f70d0109100104a05b0459305702010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303239313233313233353935395a3008800203e7810203e7a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420dffc10ff512cea5697c26b7b028ecefeecc555665c52d00566bbc811479eb4b8300a06082a8648ce3d04030204473045022070e105176b646191b6e71802e91134b5c63aece6bc5e4d6551baa0b4f4439041022100ae0fa46234ec43c1d16321926d7cbc35f363ac70ee184b27ec9a71951bec35e1", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2029-12-31T23:59:59Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2029-12-31T23:59:59Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: an accuracy of seconds, millis and micros: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590391a200020159038a3082038606092a864886f70d010702a082037730820373020101310d300b0609608648016503040201306b060b2a864886f70d0109100104a05c045a305802010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a3009020101800105810107a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420c7433f4f549627ce50bf6999972074127f7111198c0289f3de36cfe7c19253ca300a06082a8648ce3d04030204483046022100f01e02c52dfff00f648dd15102dfdd4b52e54681d6e39229df7cc054cb0f668c022100aa816dcd3813023e1e992b455554b810001c051b1f350dbee565bfd5c24370f7", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: a genTime with a fraction of a second: S4, t with its fraction", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590388a20002015903813082037d06092a864886f70d010702a082036e3082036a020101310d300b06096086480165030402013063060b2a864886f70d0109100104a0540452305002010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a181232303236303933303132303030302e32355aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042005d43bf52a7f967939a0e9d4e324e1b392e796e34499f47d67b3aecb2b34904e300a06082a8648ce3d0403020447304502210089c2a0079c18ed5eaf7e41595498fe60bb6e9caeefc565caa8036080fa57d90c0220799964c8e19e264c12cffcd5d23c71aa56035d1bb476c1ebad71ef3910501f59", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00.25Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00.25Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: the certificate of the authority twice: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359053da20002015905363082053206092a864886f70d010702a08205233082051f020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa082036e308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d04030204483046022100fbd33e432a54b32c7431c75cd272a034c852798cce58711503f395ba750d16c30221009a685993f26e7fab895a54837a8258fea6ef223978b48ac3ec676a8dafd71fd0", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: a CRL in the token decides nothing: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359039fa20002015903983082039406092a864886f70d010702a082038530820381020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aaa11730153003020101300a06082a8648ce3d040302030200003182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d04030204483046022100dae2e5c0f707044d304a0e2000a33ffb080566f8a049329a833a961c7cdcc54b022100cbb80054cac4df6ef223dc1cf815e361e8c22048f2b32978953fa28c0b918ce3", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: signing-certificate-v2 in the token: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590392a200020159038b3082038706092a864886f70d010702a082037830820374020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201413082013d020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a08186301a06092a864886f70d010903310d060b2a864886f70d0109100104302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da173037060b2a864886f70d010910022f3128302630243022042079af916a777a1c2b97c8068025c0615fddc5bae1bc80f8e7f8120f8f4afe1f54300a06082a8648ce3d04030204473045022100aeaa0d021621735c3c7965667036bdeb0a1dfa9bbe6123763de26b5cc1a5b1fe0220511b573a65cc1e8bfe3bb66f70bf38a47f1e73d4610e7b0f248f90149ac9998b", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: ordering TRUE, a nonce, a tsa and extensions: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a035903cca20002015903c5308203c106092a864886f70d010702a08203b2308203ae020101310d300b06096086480165030402013081a5060b2a864886f70d0109100104a0819504819230818f02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a0101ff020163a02da42b30293127302506035504030c1e4175746f72696461642064652053656c6c61646f20646520707275656261a10b300906032a030404020500a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204203f199f5b9cc7f10ad32fe64fb00aa45c7c03e34ebc4a6f73f1be93c169f0c758300a06082a8648ce3d04030204483046022100cb049510829795d6d30bc63d015f3ec50dfb0a17067d5035b2a8fdf9134d79410221008a56ed0830bd3b04c9e5d9bbaf224e447e635f4793425111a9b88f8cfdf33e48", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: an authority of RSA with RSASSA-PSS and SHA-512: S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590604a20002015905fd308205f906092a864886f70d010702a08205ea308205e6020101310d300b06096086480165030402033060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa082032e3082032a30820212a003020102020806a14148bbd4631f300d06092a864886f70d01010b0500303a31163014060355040a130d446174654b65797320746573743120301e060355040313174175746f72696461642052534120646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a303a31163014060355040a130d446174654b65797320746573743120301e060355040313174175746f7269646164205253412064652070727565626130820122300d06092a864886f70d01010105000382010f003082010a0282010100d3aebaca3410843388deaf0d72b746468acf453c8c01ba759b8c8b598bba57f07998e9629061a9f3dc099c41b52f9bf2db6241bc3e37657a3cbb2b59229818628357a7244966d22e594388cf358c6eaef673b830c20381f035f08f301df9da9faff15b4177874f614ff4a3d729007bb45a8a68fdb72deeee4f15ba96f51de9961aeaa64a11b0298913ea3e36e5dc070f47cea538ae49b8f45acecaf57637fde46c243137562939b0cde947df8e761fe78017359ccfb3e58369116d4ca38d022b03a8c3b46b9bc0e6cc1b98c08a77ee3851be604a6621453521540a50c2d8b355378b95ad04be6d8ab3e5e104df5406490fdc9496b8ba1541c2d6e11180a687470203010001a3343032300e0603551d0f0101ff04040302078030200603551d0e041904174175746f72696461642052534120646520707275656261300d06092a864886f70d01010b050003820101003d3c4fe149aed22acad8fee7253a0dfd0598ea5577b7435c9651c226c5c38ca71c2b091772bb527a7e2e64679391de5acdbe735ef368ad1d12673b7fbea6c50d6097236760fc6a51f32e18197d120e73853caed41fc448ff442324e8a775a576587abf4c8e64301a2a8a08bcc7eb0ad48390b0f632a85704a6b12ee03d200a77294f0eff3133bb6c4268a4035f1bcad6ac2ca8c9b7f0a1b29db13d6daf2752bd88d6b984025f4ddeaddec5f0523d3e572bf5568fbb0434f7ee2140c9367ec05c7c0839a4f13422aa3c7557b57c2c944d597364d860907ec42922326897c1b6277b6de32bf927f55820d224ee5cdd614d2bcba950745678b7064bb8730058154f3182023c308202380201013046303a31163014060355040a130d446174654b65797320746573743120301e060355040313174175746f72696461642052534120646520707275656261020806a14148bbd4631f300b0609608648016503040203a0819a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414d1ab96236a13c3d97c75c0e3e6f432c9151104be304f06092a864886f70d010904314204407298b8cff89151b3e6475e21a879e85a22007dd0abbfe5edaca5152b41d113382663d56c7ad9131541a7e7b9cac6cb35bb9f0fe538408a185e8aaa97141d2ae7303d06092a864886f70d01010a3030a00d300b0609608648016503040203a11a301806092a864886f70d010108300b0609608648016503040203a20302014004820100c9b6e4030ad813f3ee982f15bc7e8df271f48762445669c5ae8cfeef164320a263f7a6e459ddca73fa4e10f2a3720b09b47e6e4116e607e5222af817f7b0304c1668e29f868a62bba4ba737bbaff529713965a54fde7302e38de0e500d5e91c69d6bcd09f7d81991f16fc330486bb50a242338796055b6ca1945f04bea7664e70abcf34e0f0c022baab42a8f66bcf08a0d0a1b670ec20a850c8b950d304cf0149639e34ce13e4b02a32d6f15c7bc0a55c66da7f508bd5176ebb69aa1b9e0d420ced33e7c9793c046e191e14747448b4b461d86bdcc3ed7cfdb8924a0358f60e700508edea3fa356fbdc1e63ea966c2c0ccb3e0aeda38a1ae45a4698dfb846a62", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "Autoridad RSA de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «Autoridad RSA de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: an authority named with 50 spaces and the text of F3: S4, by its SHA-256", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590499a20002015904923082048e06092a864886f70d010702a082047f3082047b020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08202853082028130820227a00302010202080581dd1a77d3607b300a06082a8648ce3d04030230818531163014060355040a130d446174654b6579732074657374316b30690603550403136254534120202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204669726d61646f20636f6e206c6120636c617665207175652067756172646173746520636f6d6f2042616e636f301e170d3230303130313030303030305a170d3430303130313030303030305a30818531163014060355040a130d446174654b6579732074657374316b30690603550403136254534120202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204669726d61646f20636f6e206c6120636c617665207175652067756172646173746520636f6d6f2042616e636f3059301306072a8648ce3d020106082a8648ce3d03010703420004153ee1b2d6be80818659e4efdc05323ea820974b75f518bc8ea423057f41879bef2c445d40578916f5f8b2da65015a595d69f116decf8875ca06fc9d30cf1a63a37f307d300e0603551d0f0101ff040403020780306b0603551d0e0464046254534120202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204669726d61646f20636f6e206c6120636c617665207175652067756172646173746520636f6d6f2042616e636f300a06082a8648ce3d0403020348003045022100aac95d19a5ba8a6d7bfe39696118fbd30cc14a8baaa834b9d1e76a675fa84b4d02206fb2aef9906937ed524e77c0a98fd210a9955762c819255de2d02ab73df484f73182017a3082017602010130819230818531163014060355040a130d446174654b6579732074657374316b30690603550403136254534120202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204669726d61646f20636f6e206c6120636c617665207175652067756172646173746520636f6d6f2042616e636f02080581dd1a77d3607b300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a3018301604144f465da7cdaf9dd0cd57a09a28897dd58d368b0e302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d040302044730450220064fa0b1dee52e6f981bbd5580de617141f9fbde4895ca0be8b0112fdc2c4edd0221008531e4d601ab369abb4c66f82b792c44c6b9c010d0828156cc43a6b862631861", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S4", + "seal_holder": "f13fc863d8ebfcf02b952a95eb64e8d8050cd2a6c590bc041551887f21aa8efa", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Según un sello a nombre de «f13fc863d8ebfcf02b952a95eb64e8d8050cd2a6c590bc041551887f21aa8efa», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: over another subject: S3", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b06096086480165030402010420d9298a10d1b0735837dc4bd85dac641b0f3cef27a47e5d53a54f2f3f5b2fcffa02012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042020b72ae51c6f228bc1779cb6f447612e6884942940b9d925cf0600ec815f8eb6300a06082a8648ce3d04030204483046022100f09c22a8cd5fbc3f838025f8d43b17995d60ce5ad6a0061d114e0c8b293868d3022100ecdab4ed21ad6d648c6dc0a7c40e045be86e522d0a32b877d371339f72bcd423", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S3", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello no corresponde a este contenido." + ] + }, + { + "name": "seal: a messageImprint of 33 bytes: S3", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590387a20002015903803082037c06092a864886f70d010702a082036d30820369020101310d300b06096086480165030402013061060b2a864886f70d0109100104a0520450304e02010106032a03043030300b060960864801650304020104213d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe06830002012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420e14673224fd3e13a751672ee6f95b3cdf0be3fbadd726916f4d97eb78ff589db300a06082a8648ce3d04030204483046022100e5d36db0a072135cdf5c826864e6e8c610fe94e4357a65ce6e19fe43012585f80221009e7b9de9fe10f4ae733404316cf60f7ccbee647875296db7a869362cd137c8ba", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S3", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello no corresponde a este contenido." + ] + }, + { + "name": "seal: the authority had expired at its time: S3", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303431303130313030303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420952183c5071984e2814df7f00ebb35b71da2bdcbbdd4dbe03d05d716ab67687b300a06082a8648ce3d04030204483046022100e0bae76ec8a85032595ddb4532f05c99208bc8fd12e4cb2d3ee66358a95d657b022100b984bfce8e4ef66dea2faadba72c968accb1847241816a707ea28d847c3ba8f6", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S3", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello no corresponde a este contenido." + ] + }, + { + "name": "seal: the authority was not yet valid at its time: S3", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303139303130313030303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042044d80301d075c9f489b16d0f00c21f83059c52b83e76b34d19dc70ae8e7cea12300a06082a8648ce3d04030204483046022100d2a6da69cdca1b4817dc05dc1f1c6059e2d5da3fc06ec2ca9d3685d52731998e022100d5f7ad754a9ba11df1ce41cd82628f5c6b958c4c845e3cbcd822dfffa771c12e", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S3", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello no corresponde a este contenido." + ] + }, + { + "name": "seal: the signature of the authority does not verify: S3", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d04030204483046022100d565654acf211a7290b744937e2aaf30fca36f88eef0e25be53efb937679aefd022100fa93dfc8a131354da2582a4619c7528a970aad562aa44c8dbf205da418cbf4b2", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S3", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello no corresponde a este contenido." + ] + }, + { + "name": "seal: the message-digest of the token is not that of its TSTInfo: S3", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590386a200020159037f3082037b06092a864886f70d010702a082036c30820368020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204209cb77e9328b55652b615505fe05fb92485f47cd33d3d43911efee1a459c999d2300a06082a8648ce3d04030204483046022100d5105bb33a2b8fa347a96b1489a9af8782d3d53560cf102bc270b2bca8fc66c6022100cfdb9e0a7efbdf63f4961bb2f9e55cf8a5d6ce871c7ef250d0549f89fabeb5c6", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S3", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello no corresponde a este contenido." + ] + }, + { + "name": "seal: not DER: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a034ca2000201476e6f7420444552", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a token in BER: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590384a200020159037d308006092a864886f70d010702a082036a30820366020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d0403020446304402204c0110666328d06abd251c91ef3b9a9a11d969eb358e3e32f6367f9409f8ab5802201b65227ab9a5a93c6de2d25e9c4c1e4c7033177ede5d9784515af47411bb268d0000", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a token without its message-digest: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590352a200020159034b3082034706092a864886f70d010702a082033830820334020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201013081fe020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a049301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236300a06082a8648ce3d0403020446304402200c1f5dde35a64b2f2e816031547b08178ffe1862520cf9a08a106308955505c5022042232717ea06458a47782a6f80fe5e17e53934f12f3c9b578d802ede69e464ef", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a token of two SignerInfo: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359062fa20002015906283082062406092a864886f70d010702a082061530820611020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa082033e3082018330820129a00302010202080f07e46e227ae88a300a06082a8648ce3d040302303131163014060355040a130d446174654b6579732074657374311730150603550403130e4f747261206175746f7269646164301e170d3230303130313030303030305a170d3430303130313030303030305a303131163014060355040a130d446174654b6579732074657374311730150603550403130e4f747261206175746f72696461643059301306072a8648ce3d020106082a8648ce3d03010703420004515865511dbeedeb1b1db69ee914e86bff3086f1dbbf44e5b45aeb85343fb6add3dd7259b4a49d9cbf26992a1287d3f5283f22996c43edbd58e69a7e73fe7364a32b3029300e0603551d0f0101ff04040302078030170603551d0e0410040e4f747261206175746f7269646164300a06082a8648ce3d0403020348003045022100e3ad404b546fd67696acd39f4740dab0e21acdc00c7271e18728cb64d268bb4802200bede5c3632d6641bd3466f696f89d08b5465527733297b8fd860515df029052308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182025730820120020101303d303131163014060355040a130d446174654b6579732074657374311730150603550403130e4f747261206175746f726964616402080f07e46e227ae88a300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a30183016041482023b384a619cbf10d51eb812eeb7a1d4502df1302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d0403020447304502210097a5d44f5b0b5028971090fb06c993016d73498ac56e1f2251c5cff7414e1d3702207a938dc28506c81b3b218e41578d099b9c144d74fabf4b2527f9763507a5f98b3082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d040302044630440220416b5fdf2e0c05b729eb03be2d6081c5bd036af422d9f9995fe6429b49627e3702204e5bda30aa010eb58698ff539fa62e79c8896aec540aedcd91020bc30e9ad8ba", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a TSTInfo of version 2: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590385a200020159037e3082037a06092a864886f70d010702a082036b30820367020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010206032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204207e5374ba63316e3801f8ceee00bf0d1654583ad4b2abf0c568aee47d8b8cec8a300a06082a8648ce3d04030204473045022004409f426a034d27775b2246e7443d881835760d2604ed66f36500f15add84fb022100f9262340f4a1f379e50b1f5148326051596c968761890c22aede2be197a29628", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a negative accuracy: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590389a20002015903823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a30030201ffa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a9c9380a639fa3980607590c17d56e38dad075e97380652bce382337466003ba300a06082a8648ce3d040302044630440220420a02fec1cf20f5ae460672897662cea47b53b1df5d6d8fe674c6f0e33661c402204cea27fc47191ff9f4fc79aca9e833256091e1e1729057dcf0a25bb6e5518025", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: an accuracy of seconds in an INTEGER that is not minimal: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013066060b2a864886f70d0109100104a0570455305302010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a300402020005a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204205d02bea8721f1c92565548e3f478f9f0b345f515a9ba755a09b6bcf65d5917dd300a06082a8648ce3d040302044630440220490736cbac9d6050c376555c42198adadc11c7e1559830814bb1d51f5351a88c02203bb1d0f7ae9a4fb5fa54f8a3b3e37f2e864f066f893637df550b817e788d1f8d", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: an accuracy of millis in an INTEGER that is not minimal: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013066060b2a864886f70d0109100104a0570455305302010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a300480020005a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204204562f9a7e36f0c44eea3523ec6d646fa27d516697a7cc18c63d32c4b0a1c84ce300a06082a8648ce3d040302044630440220650e12a2447adbafed425a15847733b66c39d67c5d1463abb615bb5b0821b6800220472576ee749c96807a9f536f5b62c79910c1cbfce548b73c9bcbd9ae8306f14d", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: an accuracy of 0 millis: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013065060b2a864886f70d0109100104a0560454305202010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a3003800100a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042027870375d1a7000967491b9752b3bd47aec9e728634574b0404b4b0a822b9f8a300a06082a8648ce3d0403020447304502206562d19a053d84169f775b9b5df9000d3429fe7d1b32cda52bb8d99eaddb1f2d022100ec5d1cd32ddb2b8b55455a2e0f6999dec5e5f9ef12741da4c7381367c334ed22", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: an accuracy of 1000 millis: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038aa20002015903833082037f06092a864886f70d010702a08203703082036c020101310d300b06096086480165030402013066060b2a864886f70d0109100104a0570455305302010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a3004800203e8a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420ca10280c624b4a546b22b94f7146708a8d807f035e91b9199745dee3bfbacc37300a06082a8648ce3d04030204463044022078e607400141403b8e4a1f4d303acab24717f18fa54eb188dd8e0bbfb07d58cc02204c899ebeba7fb9013b88e95270edf63ab8e78210c76f83dc1722a206bb583572", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: an accuracy of 1000 micros: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038ca20002015903853082038106092a864886f70d010702a08203723082036e020101310d300b06096086480165030402013066060b2a864886f70d0109100104a0570455305302010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a3004810203e8a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042054f4193f7c2178dae2b2cf95b0b7ceb40692212a3f09a3a964e38184b52ab410300a06082a8648ce3d04030204483046022100cbff307f50f9f8c8697034bd631677ac6507c0602c1a0ae515d1e25d3b95fb09022100fdccbb6c545f5aee1bb23ff8ab2da3e4ddd34a89e2c5bb98e54527ff4f8a5b4a", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: an accuracy of 2^31 seconds: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a0359038fa20002015903883082038406092a864886f70d010702a082037530820371020101310d300b06096086480165030402013069060b2a864886f70d0109100104a05a0458305602010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a300702050080000000a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042091e56bbc482354105a8cae08a6e099ad1997bff20575d4635cb61b069ac8ce71300a06082a8648ce3d04030204483046022100d3872433332422fe0e61302d585c0105c7bb9cda09cff141947a1e13aae67778022100d99cfcdaa4841e7986da6b5471bb403484836a259f5b8de98c6280f31bfb7768", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a genTime without Z: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590385a200020159037e3082037a06092a864886f70d010702a082036b30820367020101310d300b0609608648016503040201305f060b2a864886f70d0109100104a050044e304c02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180e3230323630393330313230303030a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204202b7ae4494d65b847ddef3d17477bdd36f23ab425368ba58c1d7fefa8251b3ca4300a06082a8648ce3d04030204483046022100b11e6c9a3703d60895789f4d97dad5249739702d039e792b1d63cf1c172609d1022100d94371e1cafd48fa05b30b4f4fefc60ca6a34db77530a8b7d78e0f613710458a", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a genTime with a trailing zero in its fraction: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590387a20002015903803082037c06092a864886f70d010702a082036d30820369020101310d300b06096086480165030402013063060b2a864886f70d0109100104a0540452305002010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a181232303236303933303132303030302e35305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420a1130c91a36fa66d784b26eca9e64798097cd9584e4c2a8c3c27d322b45b01f1300a06082a8648ce3d040302044630440220629399b8df74102b9840d6bed36bf8004655e4a6a0c333a0488647fead5e704802201941b71aa49f759169e3358da20b30fdd310701ae0e988bf51cf195a31428a9d", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: ordering FALSE written: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590389a20002015903823082037e06092a864886f70d010702a082036f3082036b020101310d300b06096086480165030402013063060b2a864886f70d0109100104a0540452305002010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305a010100a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013530820131020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d01090431220420e6c8a5c3dbcdc3b908c2de27644276cb694a19a71be7606749b04806105b424a300a06082a8648ce3d04030204483046022100904df5bca3a2ac528a508532ea7aca9c3e073d017c6417d4d368fd2253419bf2022100c0a035920387ad420223f8208a3e3344db0316497c227eb01a0b19ba6dc25419", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: a field after the last: S2", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590395a200020159038e3082038a06092a864886f70d010702a082037b30820377020101310d300b06096086480165030402013070060b2a864886f70d0109100104a061045f305d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa10b300906032a030404020500020107a08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204206eca55e8dc0993d09fb1e40ee67cd8eadbef58e03582fb2d7bd53e26f0ac2670300a06082a8648ce3d040302044730450220455d2ea8da4496bb323653eafcc93a77ce6b8024d75008a7d92b15440842536a022100a23c9918e1be05227a4bfa1fb562e0d3d4da81ba1a4dcc2c125fc94e60e79ea9", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S2", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "El sello de tiempo es ilegible: no prueba nada." + ] + }, + { + "name": "seal: SHA-384 in the imprint: S1", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590394a200020159038d3082038906092a864886f70d010702a082037a30820376020101310d300b06096086480165030402013070060b2a864886f70d0109100104a061045f305d02010106032a0304303f300b06096086480165030402020430e8ebf3d61bf90b15bca8f52f442c258a22fd8813dde6462308f13d3d2ae3bc512fb5b2613a392c68a94f4281a60ee3be02012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d010904312204200fb8e41b236629a2ce055afa2f6fc3bc4fbc56a606cb5dc6eb44388b65a65133300a06082a8648ce3d04030204463044022075e31ea8dfb2a6e2f4a993a81f274b8f18c699ec988e2ea51d3c8e3a02e5c814022002c4dc6805262ae4c4abe3ca14797462d8026d49cc336701e9f9b8be2ee5c02f", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S1", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] + }, + { + "name": "seal: a token signed with SHA-1: S1", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a03590370a20002015903693082036506092a864886f70d010702a0820356308203520201013109300706052b0e03021a3060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201233082011f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300706052b0e03021aa06e301a06092a864886f70d010903310d060b2a864886f70d0109100104302306092a864886f70d01090431160414223e71b36a17a92dcf1852185e119970daa5bfce302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236300906072a8648ce3d040104473045022045eec1468a8a161bfeac7a4bbd19da2787584d404ce4b4ee32df60216692bb9a022100a34cbea16d28c303b835515b3cb2dfa6ced08f77d231cc60a8ff4ec38402a6f9", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S1", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] + }, + { + "name": "seal: an authority with a compressed key: S1", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a035902e4a20002015902dd308202d906092a864886f70d010702a08202ca308202c6020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa082013d308201393081dfa003020102020824ecc452deec0dc4300a06082a8648ce3d04030230193117301506035504030c0e54534120636f6d7072696d696461301e170d3230303130313030303030305a170d3430303130313030303030305a30193117301506035504030c0e54534120636f6d7072696d6964613039301306072a8648ce3d020106082a8648ce3d0301070322000263f275991854ed479ff26dbaacab802dc150a44f2c392cf10230de83a3582004a331302f301d0603551d0e04160414f3c46e30b0daec2938e04ac9eee629927605c21b300e0603551d0f0101ff040403020780300a06082a8648ce3d0403020349003046022100a2b79a3bd50fe1de439c6f9fde0bd162843e074f26df177f4f1e17a5af29877f022100da02b4fd50a13e57123fa537be0affdf08598e2f223d7d3c14e517242e07112e3182010d30820109020101302530193117301506035504030c0e54534120636f6d7072696d696461020824ecc452deec0dc4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a3018301604141f0eeefa3f60162b6e69889c8162ad93530e5255302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300a06082a8648ce3d0403020448304602210086f27e6379ad8f67693246ad129bb31feb9a4d30211efe790be57ff751e83217022100dcba2b18dcb744fac420a66dd00de09ca7551013e8338c90206d3c36711502e9", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S1", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] + }, + { + "name": "seal: an authority with a key of 1024 bits: S1", + "security_cbor": "a40071646174656b6579732d73656375726974790101025869a30001015820ea4a6c63e29c520abef5507b132ec5f9954776aebebe7b92421eea691446d22c02584064d805ef80b891e851aa844d3c455a4b95752f88ee0f1d8e3d0d28c7431d516c9838294e7c361f20c7c9a33e7c7c8803ad934bff6174aae97a88ad8fac41f90a035903f5a20002015903ee308203ea06092a864886f70d010702a08203db308203d7020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104203d799ba25f479a7f2d0c37fcf326752ce74b3a0f654dbb9026738c763afe068302012a180f32303236303933303132303030305aa08201ff308201fb30820164a00302010202083f2fff00e4083e2d300d06092a864886f70d01010b0500302c31163014060355040a130d446174654b6579732074657374311230100603550403130954534120636f727461301e170d3230303130313030303030305a170d3430303130313030303030305a302c31163014060355040a130d446174654b6579732074657374311230100603550403130954534120636f72746130819f300d06092a864886f70d010101050003818d0030818902818100cda33d4c73d2d1e0e6ac2b8c102906760593ba39838bd7b501ba0ea12088ef9dfe48c385e59ae61add3b68497380a059ee637ee4120a62f349b66079bf9bdcc16496250a6d5d06ffe11e86c0eb9344052698fea3cded7048fdc49cbc26953feb48c14e8b27ab806d86c1c29dae96ee745e2b38d43b719e3bf6773a871c1f9df50203010001a3263024300e0603551d0f0101ff04040302078030120603551d0e040b040954534120636f727461300d06092a864886f70d01010b050003818100724958bb60052d879bff74b54617be43aa63d718e2ecc166bed2a20bc0e24aa1ece01d1c99a56f0467f142d02aa9b47c2493739fe6914497b7646f8dc4d1fb54a1fd8406f55869dbced7ffa792119b2adeba67536f7a3b488c0c7357a7710f3a08413e0dae29e297d59fde1304ec2ee37672ae6f8cddc0b649883a7a4a1e13943182015c308201580201013038302c31163014060355040a130d446174654b6579732074657374311230100603550403130954534120636f72746102083f2fff00e4083e2d300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414b2fd00bad67795fe6c22e07ccfd023e6c04d598e302f06092a864886f70d010904312204205fe6075847442b1eea668b09c8f86114d1271afe9991081fc0cdb5a31588da17300d06092a864886f70d0101010500048180acbbe95c37ec7417b0875ed03eeeaae2e7c2a787cca045ea2e358dcfcd058b59b966e9a9547506c308d0cd5ec9d280af9622b3f3441a35cde01ae544f3eef6cf235e192da7f360f9d96f85ca95dfe5a3a67fd3ea6182b86f8d5f1559a471a7b98fa86f4d4bea292a705db34a7d1d7bf4e43564cd9a44ab4a17350683f0539449", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F4", + "seal": "S1", + "lines": [ + "Firmado con la clave dkauthor1af9xcclzn3fq40h42pa3xtk9lx25wa4wh6l8hyjzrm4xj9zx6gkqx3lrza. No prueba quién la tiene.", + "Lleva un sello de tiempo que esta versión no sabe comprobar: aquí no prueba nada." + ] + }, + { + "name": "seal: over a capsule without a signature: F0 and S4", + "security_cbor": "a30071646174656b6579732d7365637572697479010103590385a200020159037e3082037a06092a864886f70d010702a082036b30820367020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b060960864801650304020104202c95d37cb9658ed6387ff8e29854bbff409a1c4456e17ab6d2c46eeb54d7b3eb02012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa3182013430820130020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042016bf09210739e6175026faad38a0095930e12eaf345d0e740cdaf4aa5022f143300a06082a8648ce3d0403020447304502207d8f2c68f3a73fdca841cadcdb5f424194e88ebbd30ea1a0c4a219d1c4724c6f022100a792b478dd63b1ddea97f36d18d216b98f303ad1bc6f16cd2dad42154193e0ce", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F0", + "seal": "S4", + "seal_holder": "Autoridad de Sellado de prueba", + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "Sin firma de autor.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] + }, + { + "name": "seal: beside a signature of alg 4294967295, which it seals all the same: F1 and S4", + "security_cbor": "a40071646174656b6579732d73656375726974790101024da3001affffffff01410102410103590384a200020159037d3082037906092a864886f70d010702a082036a30820366020101310d300b06096086480165030402013060060b2a864886f70d0109100104a051044f304d02010106032a0304302f300b06096086480165030402010420a70d3e431fbd63dd7f0e37d7fd8b15e66bdc5306892058aaf3651bfa3646838d02012a180f32303236303933303132303030305aa08201b7308201b330820159a00302010202083a16a0f6d84f70f4300a06082a8648ce3d040302304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f20646520707275656261301e170d3230303130313030303030305a170d3430303130313030303030305a304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f206465207072756562613059301306072a8648ce3d020106082a8648ce3d0301070342000419006a9eefa2e443b6338174ffe5b1350bdd43d50d1100af362632cbacdfbf07068f7eb824a6ad0c005b146f32eb3683fd35d6b004d1519b85a9b1a8f4b624e3a33b3039300e0603551d0f0101ff04040302078030270603551d0e0420041e4175746f72696461642064652053656c6c61646f20646520707275656261300a06082a8648ce3d0403020348003045022028e38b70b347a248bd75b43db48cf6edfecd6f179366f5ea9d52818438a09427022100aff59b85a6f1e32bbfd92cc85035a6314e382610832ae72f2617be66fe2849aa318201333082012f020101304d304131163014060355040a130d446174654b6579732074657374312730250603550403131e4175746f72696461642064652053656c6c61646f2064652070727565626102083a16a0f6d84f70f4300b0609608648016503040201a07a301a06092a864886f70d010903310d060b2a864886f70d0109100104302b060b2a864886f70d010910020c311c301a301830160414c3c8dd2b1c4e17b8ccb3f48fec62f5f148d81236302f06092a864886f70d0109043122042038965a0ba9d82c889844414028060b82f332fec5fe7595e0eab642ebebb3c4de300a06082a8648ce3d0403020446304402200e927169234a8f17430671219e8d322c9b3582cc173baa2b9e986b61fa72f4e902204cc18c18074e9ef66f27e5672052cfea6b92fe8137b83dd05520a7bb6024a434", + "context": { + "control_commit": "0fcd568a5cb9bdb4677b69354b11ee415af8f784519cff3da49a26f84eaee7f2", + "head_digest": "9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d", + "round_time": "2030-01-01T00:00:00Z" + }, + "signature": "F1", + "seal": "S4", "seal_holder": "Autoridad de Sellado de prueba", - "seal_time": "2026-09-30T12:00:00Z" + "seal_time": "2026-09-30T12:00:00Z", + "lines": [ + "No se ha comprobado ninguna firma: trátala como no firmada.", + "Según un sello a nombre de «Autoridad de Sellado de prueba», existía el 2026-09-30T12:00:00Z, antes de que la cápsula pudiera abrirse. DateKeys no comprueba quién emitió el sello." + ] } ] }