From e5977605d959cc62912a1a8740af3647cdcd7969 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 2 Oct 2026 03:28:33 +0200 Subject: [PATCH] Test data: the generator writes the fixtures of v0.10 again The review found that genfixtures -force rewrote the five fixtures of format 3 of v0.10 with the area of 32 KiB and then failed, leaving testdata half done. EncryptFiles takes TestAreaLen, only with TestVectors, as Encrypt takes TestVectors for format 2 (spec 62.1 rules 1 and 13), and the generator gives those fixtures their area of 512 bytes: -force now regenerates them with the same L and P. - format3_seal_unsupported uses seal_type 4294967295, reserved for tests, as spec 67 says, instead of seal_type 1, which a later version may define; capsule.AlgTest and SealTypeTest name the two values. - format3_unsigned: the capsule of format3_signed without its signature, with the area of 32 KiB: the same P (spec 64). Co-Authored-By: Claude Opus 5.5 --- capsule/encrypt.go | 12 +- capsule/encrypt3.go | 18 ++- capsule/signature.go | 4 + internal/testkit/genfixtures/format3.go | 2 +- internal/testkit/genfixtures/main.go | 22 ++- .../fixtures/format3_seal_unsupported.dkc | Bin 1563 -> 1563 bytes .../format3_seal_unsupported.inspect.json | 4 +- .../fixtures/format3_seal_unsupported.json | 24 +-- .../format3_seal_unsupported.plaintext | Bin 659 -> 659 bytes testdata/fixtures/format3_unsigned.dkc | Bin 0 -> 35611 bytes .../fixtures/format3_unsigned.inspect.json | 61 +++++++ testdata/fixtures/format3_unsigned.json | 152 ++++++++++++++++++ testdata/fixtures/format3_unsigned.plaintext | Bin 0 -> 32915 bytes 13 files changed, 269 insertions(+), 30 deletions(-) create mode 100644 testdata/fixtures/format3_unsigned.dkc create mode 100644 testdata/fixtures/format3_unsigned.inspect.json create mode 100644 testdata/fixtures/format3_unsigned.json create mode 100644 testdata/fixtures/format3_unsigned.plaintext diff --git a/capsule/encrypt.go b/capsule/encrypt.go index a29985b..43f20e4 100644 --- a/capsule/encrypt.go +++ b/capsule/encrypt.go @@ -102,10 +102,14 @@ type EncryptOptions struct { // makes EncryptFiles fail, once the person has signed. Set it when a // signature with certificates may be large. LargeArea bool - // TestVectors lets Encrypt write format 2, which only a generator of - // test vectors may write (spec §62.1 rule 1, §70). EncryptFiles, which - // writes format 3, ignores it. + // TestVectors lets Encrypt write format 2, and EncryptFiles an area of + // TestAreaLen bytes, which only a generator of test vectors may write + // (spec §62.1 rules 1 and 13, §70). TestVectors bool + // TestAreaLen, with TestVectors, is the area that EncryptFiles writes + // instead of AreaLen, as the area of 512 bytes of the fixtures of v0.10: + // a multiple of AreaUnit up to MaxAreaLen. 0 for the area of this version. + TestAreaLen uint32 // Now is the clock. Required: no package of this module reads the wall // clock on its own. Now func() time.Time @@ -163,7 +167,7 @@ func Encrypt(dst io.Writer, src io.Reader, opts EncryptOptions) (*Result, error) return nil, errors.New("capsule: format 2 has no head: Comment, Author and the head extensions are for EncryptFiles") case opts.Length < 0: return nil, fmt.Errorf("capsule: EncryptOptions.Length %d is negative", opts.Length) - case opts.AuthorKey != nil || opts.CMSSigner != nil || opts.Sealer != nil || opts.LargeArea || opts.PublicNote != "": + case opts.AuthorKey != nil || opts.CMSSigner != nil || opts.Sealer != nil || opts.LargeArea || opts.PublicNote != "" || opts.TestAreaLen != 0: return nil, errors.New("capsule: format 2 has no security area or public note: AuthorKey, CMSSigner, Sealer, LargeArea and PublicNote are for EncryptFiles") } s, err := newSealer(opts, uint64(opts.Length)) diff --git a/capsule/encrypt3.go b/capsule/encrypt3.go index c83efb2..df786f2 100644 --- a/capsule/encrypt3.go +++ b/capsule/encrypt3.go @@ -65,6 +65,16 @@ func EncryptFiles(dst io.Writer, sources []Source, opts EncryptOptions) (*Result if opts.Length != 0 { return nil, errors.New("capsule: EncryptOptions.Length is for Encrypt: EncryptFiles computes L from the files") } + common := uint32(AreaLen) + switch t := opts.TestAreaLen; { + case t == 0: + case !opts.TestVectors: + return nil, errors.New("capsule: EncryptOptions.TestAreaLen is for generators of test vectors: it needs TestVectors (spec §62.1 rule 13)") + case t%AreaUnit != 0 || t > MaxAreaLen || opts.LargeArea: + return nil, fmt.Errorf("capsule: a test area of %d bytes: a multiple of %d up to %d, without LargeArea", t, AreaUnit, MaxAreaLen) + default: + common = t + } s, err := newSealer(opts, 0) if err != nil { return nil, err @@ -92,7 +102,7 @@ func EncryptFiles(dst io.Writer, sources []Source, opts EncryptOptions) (*Result // newHead bounds content by MaxPayloadLength: the sum does not overflow. // This L is the first one, with the common area: the signature decides // whether the area grows (spec §29.8), and prepare returns the final L. - area := uint32(AreaLen) + area := common length := BodyFrameSize + uint64(area) + uint64(len(measured)) + content if _, err := PaddedLength(length, s.code); err != nil { return nil, err @@ -132,10 +142,10 @@ func EncryptFiles(dst io.Writer, sources []Source, opts EncryptOptions) (*Result // The area is the common one, or the large one only when what was // signed does not fit and LargeArea allows it (§62.1 rule 13). switch { - case len(security) <= AreaLen: - area = AreaLen + case len(security) <= int(common): + area = common case !opts.LargeArea: - return 0, fmt.Errorf("capsule: SECURITY_CBOR of %d bytes does not fit in the area of %d bytes: LargeArea lets the writer widen it to %d", len(security), AreaLen, LargeAreaLen) + return 0, fmt.Errorf("capsule: SECURITY_CBOR of %d bytes does not fit in the area of %d bytes: LargeArea lets the writer widen it to %d", len(security), common, LargeAreaLen) case len(security) <= LargeAreaLen: area = LargeAreaLen default: diff --git a/capsule/signature.go b/capsule/signature.go index ad67945..174f8a1 100644 --- a/capsule/signature.go +++ b/capsule/signature.go @@ -34,6 +34,10 @@ const ( AlgEd25519 = 1 // AlgCMS is a CMS signature with X.509 certificates (§29.10). AlgCMS = 2 + // AlgTest and SealTypeTest are reserved for tests: no version defines + // them, so they are F1 and S1 in every version (§29.3). + AlgTest = 4294967295 + SealTypeTest = 4294967295 ) // AuthorKey signs AUTHOR_MESSAGE with alg 1, as *authorkey.Key does. diff --git a/internal/testkit/genfixtures/format3.go b/internal/testkit/genfixtures/format3.go index 51d5d27..81bf444 100644 --- a/internal/testkit/genfixtures/format3.go +++ b/internal/testkit/genfixtures/format3.go @@ -93,7 +93,7 @@ func randomBytes(n int) []byte { // random key of 32 bytes and a random signature of 64 (verdict F1: this // reader does not implement that alg; spec v0.11, §29.7). func unsupportedSignature() ([]byte, error) { - return capsule.EncodeAuthorSignature(4294967295, randomBytes(32), randomBytes(64)) + return capsule.EncodeAuthorSignature(capsule.AlgTest, randomBytes(32), randomBytes(64)) } // patterned returns n bytes that look like the content of a binary file: diff --git a/internal/testkit/genfixtures/main.go b/internal/testkit/genfixtures/main.go index 7c7699a..f4c4b7b 100644 --- a/internal/testkit/genfixtures/main.go +++ b/internal/testkit/genfixtures/main.go @@ -376,6 +376,10 @@ type spec struct { // options of EncryptFiles: a signer with certificates, or a sealer. configure func(o *capsule.EncryptOptions) error body func() ([]byte, error) + // area, when not 0, is the security area of a fixture of an earlier + // version, which EncryptFiles writes only for test vectors: 512 bytes in + // the fixtures of v0.10, which are compatibility fixtures (spec §67). + area uint32 } // Extension data of the fixtures (spec §54, §72): the header carries the raw @@ -441,11 +445,11 @@ func specs() []spec { {name: "format2_time_and_key_recipients", format: f2, description: "format 2 time_and_key capsule for three known X25519 recipients and a portable .dkk, and 12 dummies", round: 1001, policy: capsule.TimeAndKey, recipients: 3, portable: true, padding: capsule.Reforzado, plaintext: []byte("DateKeys fixture for several recipients.\n")}, {name: "format2_time_and_key_sixteen", format: f2, description: "format 2 time_and_key capsule for sixteen known X25519 recipients, without dummies", round: 2000, policy: capsule.TimeAndKey, recipients: 16, padding: capsule.Reforzado, plaintext: []byte("DateKeys fixture for sixteen recipients.\n")}, - {name: "format3_single", format: f3, description: "format 3 time_only capsule with a single file, nota.txt, with its mtime", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: note}, - {name: "format3_tree", format: f3, description: "format 3 time_only capsule with five files in three folders, one of them over two STREAM chunks and one without mtime, a comment of two lines and a declared author", round: 1001, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: tree, comment: "Para abrir en familia.\nCon cariño, desde 2026.", author: "Ana López"}, - {name: "format3_comment_only", format: f3, description: "format 3 time_only capsule with a comment of two lines, the second one with a TAB, a declared author and no files", round: 1004, policy: capsule.TimeOnly, padding: capsule.Reforzado, comment: "Feliz cumpleaños.\n\tAbre esto dentro de diez años.", author: "Ana"}, - {name: "format3_bloque256", format: f3, description: "format 3 time_only capsule with padding code 1 (bloque256) and one file of 20000 bytes", round: 1000, policy: capsule.TimeOnly, padding: capsule.Bloque256, files: report}, - {name: "format3_time_and_key_portable", format: f3, description: "format 3 time_and_key capsule with one credential, a portable .dkk, and 15 dummies", round: 1000, policy: capsule.TimeAndKey, portable: true, padding: capsule.Reforzado, files: secret}, + {name: "format3_single", format: f3, area: capsule.AreaUnit, description: "format 3 time_only capsule with a single file, nota.txt, with its mtime", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: note}, + {name: "format3_tree", format: f3, area: capsule.AreaUnit, description: "format 3 time_only capsule with five files in three folders, one of them over two STREAM chunks and one without mtime, a comment of two lines and a declared author", round: 1001, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: tree, comment: "Para abrir en familia.\nCon cariño, desde 2026.", author: "Ana López"}, + {name: "format3_comment_only", format: f3, area: capsule.AreaUnit, description: "format 3 time_only capsule with a comment of two lines, the second one with a TAB, a declared author and no files", round: 1004, policy: capsule.TimeOnly, padding: capsule.Reforzado, comment: "Feliz cumpleaños.\n\tAbre esto dentro de diez años.", author: "Ana"}, + {name: "format3_bloque256", format: f3, area: capsule.AreaUnit, description: "format 3 time_only capsule with padding code 1 (bloque256) and one file of 20000 bytes", round: 1000, policy: capsule.TimeOnly, padding: capsule.Bloque256, files: report}, + {name: "format3_time_and_key_portable", format: f3, area: capsule.AreaUnit, description: "format 3 time_and_key capsule with one credential, a portable .dkk, and 15 dummies", round: 1000, policy: capsule.TimeAndKey, portable: true, padding: capsule.Reforzado, files: secret}, {name: "format3_area_1024", format: f3, description: "format 3 time_only capsule with a security area of 1024 bytes, as a later version may write it, holding the empty security", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, body: func() ([]byte, error) { return body3(1024, capsule.EncodeSecurity(), "", "", note) }}, {name: "format3_security_v2", format: f3, description: "format 3 time_only capsule whose security is of version 2: verdict X", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, @@ -468,13 +472,13 @@ func specs() []spec { } return body3(capsule.AreaUnit, s, "", "", note) }}, - {name: "format3_seal_unsupported", format: f3, 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", round: 2000, policy: capsule.TimeOnly, padding: capsule.Reforzado, + {name: "format3_seal_unsupported", format: f3, 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", round: 2000, policy: capsule.TimeOnly, padding: capsule.Reforzado, body: func() ([]byte, error) { sig, err := unsupportedSignature() if err != nil { return nil, err } - seal, err := capsule.EncodeSeal(1, randomBytes(32)) + seal, err := capsule.EncodeSeal(capsule.SealTypeTest, randomBytes(32)) if err != nil { return nil, err } @@ -484,6 +488,7 @@ func specs() []spec { } return body3(capsule.AreaUnit, s, "", "", note) }}, + {name: "format3_unsigned", format: f3, 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", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: note}, {name: "format3_signed", format: f3, description: "format 3 time_only capsule with a single file, nota.txt, signed with alg 1 by a test key whose seed the record gives: verdict F4, and the commitments and the message of the signature", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: note, signer: signerSeed}, {name: "format3_signed_cms", format: f3, description: "format 3 time_only capsule with a single file, nota.txt, signed with alg 2 by two test certificates, an ECDSA P-256 one and an RSA 2048 one, each sealed by a test time-stamping authority before the round time: verdict F6, with the certificates, the commitments, SIGNERS and the result of each signer in the record", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: note, configure: configureCMS}, {name: "format3_sealed", format: f3, description: "format 3 time_only capsule with a single file, nota.txt, signed with alg 1 by the test key of format3_signed and sealed with seal_type 2 by a test time-stamping authority before the round time: verdicts F4 and S4, with SEAL_SUBJECT and the token in the record", round: 1000, policy: capsule.TimeOnly, padding: capsule.Reforzado, files: note, signer: signerSeed, configure: configureSeal}, @@ -634,6 +639,9 @@ func write(s spec) (*written, error) { var res *capsule.Result if s.format == capsule.Format3 { opts.Comment, opts.Author = s.comment, s.author + if s.area != 0 { + opts.TestVectors, opts.TestAreaLen = true, s.area + } if s.configure != nil { if err := s.configure(&opts); err != nil { return nil, err diff --git a/testdata/fixtures/format3_seal_unsupported.dkc b/testdata/fixtures/format3_seal_unsupported.dkc index fcdb590a7901a03bc545c6845ef4b855ef347348..78d93e5634e1127ec1675c14e76b8f1515066fe9 100644 GIT binary patch delta 1362 zcmV-Y1+Ds<44Vv)ArOu)WQ=#cWtxe~mHBTWH-M2by?<*qRzy@wMpidaZF*HuV{LkD zH%c~bLq#)rICoPtZfjw6Old?=D^pEuD@sOkOK)dUOKM3uLt1i8Old)5cy|gzYjSc- zV@ow{FmrQySaWD_XHIW*Qcy2TL~~eHFEUV7K{H1=Ia*UhFH(AWX-aQFW;a)GWn@G( zdUirEX@7823Pw#tGB{~7I8!%LWMwZ+NOp2-F<~}%GGuN>PH1s5a#2o7cusmrLSt!J z3N0-yAZ|lVaZWE)P-iqoP;66rZ)HbyH%mlxXEQlLOh+6?A~okLL$?p0?0?Y+sHfa4PuaYN#f^&n zPZU8mqQHlc*g0p-+dQSfvarnbWjU8A?WQrrQekIhEoE+Fa(QrcX>V>WZ*pfZb}SWQ_`XG(WX|c{fF7cx!G_Q$s^fH8E&XZ7@nqH)t<&Z8kG8YDRKQWjQcSFbXX#Eg(iK zO++_ZXLwOYZensUW?FeRXEjz&Rc1kVLw|8LMm0$=Pj4$$S6OjML^uk-zu3dz&L-#n zyQhEOrBKDN`Y0T=ph=(&lu<-GJ*%|zc-VjEVks6(uwtbPUAMN?ZaMdx51p`fwr)DSKAhw#m>-+&P*FD~g zqD+N0b1T~bK}HCh>zdt$hhG;v>wn`{xu?;H2rUV1;0VfwnNRD2yp3fX{pAb%@o&wi z7=Lcc*blQW-MDn-fspkMt|y?G!zc}(+FTa{-R4H|>*VaVsl-+>qLSf@#v$>a)`qh% z&fJ6$<|R)oon)FbK5@f0u8Yq|ON$BO7RoK)(HAIh=3R#feLcg#raQ!i{PZ3BeaELf>zvA(r@aC)!Hz3tb|K^^ zazta8Xs0k@$=M?*uh_jwD8uqONf!> z)reLNqPc`otB{XWLM83h;(zv1NW28aiD6YZLE$rwGLZ5J1%RtsU$89mBYrN znW({n{(mS{O@w0k70i~w zkjovQRbpVs$I!aVpX|DehS%aEOLXmmwvR8v}SbZ}ZWa(FLxS2sgtNnuG$PeU(DD|%u|T6IlXa%@2}PAh9qM_6w& zYGz1OV}Da(3NJQmP(nscPfd7EO?Xc=VQ55gbwyKjN;YtAaW^lxW@Jx9F-g0cW`BmYTTv^!R=58@b&>QrCFBSR@<31`!uV>WZ*pfZb}5O%VoYyvMQb=&c4b63FljhqH91x^N=;^K zO$uj7RYF>0bTLa%_M?ym3>|hnBpD$rB4M;rokckr7ZIDU=;UXEOU?ve9L`FUL7{}nj_wt zLTreBMd^?}|B#g8qZ85C3%Z+~UD zsm)}IwFq$vJ4S79l_)oa>Qlm?fzENWO(G@a>B6(h!LpN-ea=nh0_V zwEPAPk-8)g)5#BYwpihmw=`aAe1G#QUfoWJbde3Dd@QKYF*V6P{S4RASEr>aGYdn+ zsnbH2aa{r9_JO*|RJ3_tJ6F9o6h2--;U7d#bXjC4q-6q|L=EPscl~aD_XF@F!AD`Y zW08#&6vz)+)8!bKa(VT!5EIk>n0K{j6FDis`v0{q;@X+VM`mdaW!sDANq;zAUbaj) zWS`@+9cEkF7O)DD&y}jg5#xn;l_LbYJ(qCh3MPMhco(!~tDhHg`dn4BE8w%ztfYhv zS+~Jcl&;1)-TJ&b2DJN>M~IS0kHQi^Yzs2NgmQgD8nu+SSz*fG19}*Ah&lcggP-pn z8sfD%UOM6d*$o7IXV@+SwtvRK5555OG)P2GA%_elbb}#t-cF;)E^gFsu(x7>$?4y^ z7x^V8T4#Ugc~e*_wQ+)@It)o zaA9-#^C4DM(C$WTg{Fu5Ual=;!peB*z8?%7?b^0Q#Hhd>A<(`s@qZfEZ+MU!B2`d& z4RUiSl60EZcoqe&*5 zG%g_mL$F)Y1=y&nbT=1p=WoxHy2PyR@h;+QNlPE&)XN@TEPy<**6L%E&)^yhpJE#3 UV_t^rhyO_k^B#(0H^N~JhIZ^+WdHyG 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 d9f916e534c47a60030ce154e2382d47055049b2..c4f27ee82f87e188dcaf379da4b8a48a73d5bcc4 100644 GIT binary patch delta 207 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 LBpx`=`*=vS1kzOz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..17f700109be44a9381ae10fc65e6357bc63d859a GIT binary patch literal 32915 zcmeIuKT8{N0LJk0$)OxbISU)e{k1B^hW`-Y5&eooHN2mRtb61}qwXbic|NpAK`xI?%_lmSt>=kii zDtgeUtS2uvy6vam%71^KyjiZ*+us*1X2-uTpY0ys{MlbRn6FhIzy31*y3*^UNfz=f OB%zb^(>%?3t%tX8v_O0S literal 0 HcmV?d00001