From e2e52c4a0e0959a8182e3d95cc8620daf3f774cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1=20autouploader?= Date: Wed, 28 Feb 2024 18:41:40 +0000 Subject: [PATCH] Manpage update by job --- tzpfms.pdf | Bin 65847 -> 77364 bytes tzpfms.ps | 802 ++++++++++++++++++++++++------------ zfs-fido2-change-key.8 | 186 +++++++++ zfs-fido2-change-key.8.html | 205 +++++++++ zfs-fido2-clear-key.8 | 113 +++++ zfs-fido2-clear-key.8.html | 143 +++++++ zfs-fido2-load-key.8 | 98 +++++ zfs-fido2-load-key.8.html | 117 ++++++ 8 files changed, 1397 insertions(+), 267 deletions(-) create mode 100644 zfs-fido2-change-key.8 create mode 100644 zfs-fido2-change-key.8.html create mode 100644 zfs-fido2-clear-key.8 create mode 100644 zfs-fido2-clear-key.8.html create mode 100644 zfs-fido2-load-key.8 create mode 100644 zfs-fido2-load-key.8.html diff --git a/tzpfms.pdf b/tzpfms.pdf index fdf8743540d6f9718627969e0949b4bce2c86368..acdcef63bf5fcd24b33a98d5e848d2fe452cce97 100644 GIT binary patch delta 52994 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�Bk=rPuM)r&>o`+0+sU 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.5 G(hange ZFS dataset k) +-2.5 E .3 -.15(ey t)-.1 H 2.5(oo).15 G(ne authenticated by a FIDO2 de) +-2.5 E(vice)-.25 E F1(SYNOPSIS)72 112.8 Q F2(zfs-fido2-change-key)108 +124.8 Q F0([)2.5 E F21.666 E/F3 10/Courier-Oblique@0 SF +(backup-file)6 E F0(])A F3(dataset)2.5 E F1(DESCRIPTION)72 141.6 Q F0 +2.867 -.8(To n)108 153.6 T 1.267(ormalise the).8 F F3(dataset)3.767 E F0 +(,)A F2(zfs-fido2-change-key)3.766 E F0 1.266 +(will open its encryption root in its stead.)3.766 F F2 +(zfs-fido2-change-key)108 165.6 Q F0(will)14.654 E/F4 10/Times-Italic@0 +SF(ne)14.654 E(ver)-.15 E F0 12.154(create or destro)14.654 F 14.655(ye) +-.1 G 12.155(ncryption roots; use)-14.655 F/F5 10/Courier@0 SF +(zfs-change-key)108 177.6 Q F0(\(8\) for that.)A +(First, a connection is made to the FIDO2 de)108 194.4 Q(vice, which) +-.25 E F4(must)2.5 E F0(be support the)2.5 E F5(hmac-secret)2.5 E F0 +-.15(ex)2.5 G(tension.).15 E(If)108 211.2 Q F3(dataset)3.244 E F0 -.1 +(wa)3.244 G 3.244(sp).1 G(re)-3.244 E .743(viously encrypted with)-.25 F +F2(fzifdso)3.243 E F0 .743(and the)3.243 F F1(FIDO2)3.243 E F0 .743 +(back-end w)3.243 F .743(as used, the meta-)-.1 F .926 +(data will be silently cleared.)108 223.2 R .926 +(Otherwise, or in case of an error)5.926 F 3.426(,d)-.4 G .926 +(ata required for manual interv)-3.426 F(ention)-.15 E +(will be written to the standard error stream.)108 235.2 Q(Ne)108 252 Q +.465(xt, a ne)-.15 F 2.965(wc)-.25 G .465 +(redential of type ES256 is generated on the de)-2.965 F .464 +(vice \(with relying party ID)-.25 F F5(fzifdso)2.964 E F0(and)2.964 E +.499(name equal to the dataset name\) with the)108 264 R F5(hmac-secret) +2.999 E F0 -.15(ex)2.999 G .499(tension requested; the de).15 F .499 +(vice PIN, if an)-.25 F -.65(y,)-.15 G(is prompted for here.)108 276 Q +(This mimicks a W)5 E(ebAuthn re)-.8 E(gistration step.)-.15 E .962(The\ +n, the credential is asserted with a 32-byte random salt, which hashes \ +it with de)108 292.8 R(vice-pri)-.25 E -.25(va)-.25 G .962(te data,).25 +F .137(and thus generates the wrapping k)108 304.8 R .438 -.15(ey \()-.1 +H .138(which is optionally back).15 F .138(ed up \(see)-.1 F F1(OPTIONS) +2.638 E F0 2.638(\)\). This)B .138(mimicks a)2.638 F -.8(We)108 316.8 S +(bAuthn login step.).8 E(The follo)108 333.6 Q +(wing properties are set on)-.25 E F3(dataset)2.5 E F0(:)A F1<83>128 +345.6 Q F5(xyz.nabijaczleweli:tzpfms.backend)7.5 E F0(=)A F1(FIDO2)A<83> +128 357.6 Q F5(xyz.nabijaczleweli:tzpfms.key)7.5 E F0(=)A F3(salt)A F2 +(:)A F3(credential-ID)A F2(:)A F3(credential-public-key)139 369.6 Q F5 +(tzpfms.backend)108 386.4 Q F0 2.708(identi\214es this dataset for w) +5.208 F 2.707(ork with)-.1 F F1(FIDO2)5.207 E F0(-back-ended)A F2 +(tzpfms)5.207 E F0 2.707(tools \(i.e.)5.207 F F2(fzifdso)108 398.4 Q F5 +(zfs-fido2-change-key)36.505 E F0(\(8\),)A F5(zfs-fido2-load-key)33.005 +E F0 30.505(\(8\), and)B F5(zfs-fido2-clear-key)108 410.4 Q F0(\(8\)\).) +A F5(tzpfms.key)108 427.2 Q F0 .486(is a colon-separated tuple of unpad\ +ded URL-safe base64 blobs; the \214rst one is the ran-)2.986 F .217(dom\ + salt; the second represents the ID of created credential, and the thir\ +d \211 its public k)108 439.2 R -.15(ey)-.1 G 5.217(.T)-.5 G .217 +(here e)-5.217 F(xists)-.15 E(no other user)108 451.2 Q +(-land tool for deciphering this; perhaps there should be.)-.2 E +(Finally)108 468 Q 12.006(,t)-.65 G 9.506(he equi)-12.006 F -.25(va)-.25 +G 9.506(lent of).25 F F2 9.505(zfs change-key)12.005 F17.171 E F5 +(keylocation=prompt)15.505 E F217.171 E F5(keyformat=raw)108 480 Q +F3(dataset)6.106 E F0 .106(is performed with the ne)2.606 F 2.606(wk) +-.25 G -.15(ey)-2.706 G 5.106(.I)-.5 G 2.606(fa)-5.106 G 2.606(ne)-2.606 +G .107(rror occurred, best ef)-2.606 F .107(fort is made)-.25 F +(to clean up the properties, or to issue a note for manual interv)108 +492 Q(ention into the standard error stream.)-.15 E 4.056<418c>108 508.8 +S 1.556(nal v)-4.056 F 1.556(eri\214cation should be made by running) +-.15 F F2 3.222(zfs-fido2-load-key \255n)4.056 F F3(dataset)7.555 E F0 +6.555(.I)C 4.055(ft)-6.555 G(hat)-4.055 E .729 +(command succeeds, all is well, b)108 520.8 R .729 +(ut otherwise the dataset can be manually rolled back to a passphrase) +-.2 F(with)108 532.8 Q F2(zfs-fido2-clear-key)5.147 E F3(dataset)8.647 E +F0(\(or)5.147 E 5.146(,i)-.4 G 5.146(ft)-5.146 G 2.646(hat f)-5.146 F +2.646(ails to w)-.1 F(ork,)-.1 E F2 2.646(zfs change-key)5.146 F +10.312 E F5(keyformat=passphrase)108 544.8 Q F3(dataset)6 E F0 +(\), and you are hereby ask)A(ed to report a b)-.1 E(ug, please.)-.2 E +F2(zfs-fido2-clear-key)108 561.6 Q F3(dataset)7.606 E F0 1.607 +(can be used to clear the properties and go back to using a)4.106 F +(passphrase.)108 573.6 Q F1(OPTIONS)72 590.4 Q F2109.666 602.4 Q +F3(backup-file)6 E F0(Sa)203 602.4 Q .353 -.15(ve a b)-.2 H .052 +(ack-up of the k).15 F .352 -.15(ey t)-.1 H(o).15 E F3(backup-file)2.552 +E F0 2.552(,w)C .052(hich must not e)-2.552 F .052(xist beforehand.)-.15 +F .693(This back-up)203 614.4 R F4(must)3.193 E F0 .694 +(be stored securely)3.193 F 3.194(,o)-.65 G -.25(ff)-3.194 G 3.194 +(-site. In).25 F .694(case of a catastrophic e)3.194 F -.15(ve)-.25 G +(nt,).15 E(the k)203 626.4 Q .3 -.15(ey c)-.1 H(an be loaded by running) +.15 E F2(zfs load-key)233 638.4 Q F3(dataset)6 E F5(<)6 E F3 +(backup-file)6 E F1(ENVIR)72 655.2 Q 1.666(ONMENT V)-.3 F(ARIABLES)-1.35 +E F5(TZPFMS_PASSPHRASE_HELPER)108 667.2 Q F0 .046(By def)133 679.2 R +.045(ault, passphrases are prompted for and read in on the standard out\ +put and input streams.)-.1 F(If)5.045 E F5(TZPFMS_PASSPHRASE_HELPER)133 +691.2 Q F0 1.595(is set and nonempty)4.095 F 4.096(,i)-.65 G 4.096(tw) +-4.096 G 1.596(ill be run via)-4.096 F F5(/bin/)4.096 E F2 3.262 +(sh \255c)B F0(to)4.096 E(pro)133 703.2 Q +(vide each passphrase, instead.)-.15 E .643 +(The standard output stream of the helper is tied to an anon)133 720 R +.643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) +133 732 Q(xcept for a trailing ne)-.15 E(w-line, if an)-.25 E 3.8 -.65 +(y. T)-.15 H(he ar).65 E(guments are:)-.18 E F5($1)143 744 Q F0 +(Pre-formatted noun phrase with all the information belo)160 744 Q 1.3 +-.65(w, f)-.25 H(or use as a prompt).65 E(fzifdso 0)72 817.889 Q +(February 28, 2024)153.568 E(1)183.837 E 0 Cg EP +%%Page: 2 2 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 41.363(ZFS-FIDO2-CHANGE-KEY\(8\) System)72 48 R +(Manager')2.5 E 2.5(sM)-.55 G 38.862(anual ZFS-FIDO2-CHANGE-KEY\(8\)) +-2.5 F/F1 10/Courier@0 SF($2)143 84 Q F0 +(Either the dataset name or the element of the TPM hierarch)160 84 Q 2.5 +(yb)-.05 G(eing prompted for)-2.5 E F1($3)143 96 Q F0("ne)160 96 Q +(w" if this is for a ne)-.25 E 2.5(wp)-.25 G(assphrase, otherwise blank) +-2.5 E F1($4)143 108 Q F0("ag)160 108 Q(ain" if it')-.05 E 2.5(st)-.55 G +(he second prompt for that passphrase, otherwise blank)-2.5 E .177 +(If the helper doesn')133 124.8 R 2.677(te)-.18 G .177 +(xist \(the shell e)-2.827 F .177(xits with)-.15 F/F2 10/Times-Bold@0 SF +(127)2.677 E F0 .178(\), a diagnostic is issued and the normal prompt)B +(is used as f)133 136.8 Q 2.5(all-back. If)-.1 F(it f)2.5 E(ails for an) +-.1 E 2.5(yo)-.15 G(ther reason, the prompting is aborted.)-2.5 E F2 +1.666(FIDO2 back-end con\214guration)72 153.6 R(En)87 165.6 Q(vir)-.4 E +.625(onment v)-.18 F(ariables)-.1 E F1(FIDO_DEBUG)108 177.6 Q F0 +(If set, enables lib\214do2 deb)173 177.6 Q +(ug logging to the standard error stream.)-.2 E F2(De)87 194.4 Q .625 +(vice selection)-.15 F F0 .727(When creating, the \214rst de)108 206.4 R +.727(vice which supports the)-.25 F F1(hmac-secret)3.226 E F0 -.15(ex) +3.226 G .726(tension is used.).15 F .726(When loading,)5.726 F +(the assertion is shopped around to e)108 218.4 Q -.15(ve)-.25 G +(ry such de).15 E(vice.)-.25 E F2 .625(See also)87 235.2 R F0 +(The lib\214do2 documentation at https://de)108 247.2 Q -.15(ve)-.25 G +(lopers.yubico.com/lib\214do2/.).15 E F2 1.666(SPECIAL THANKS)72 264 R +F0 1.6 -.8(To a)108 276 T(ll who support further de).8 E -.15(ve)-.25 G +(lopment, in particular:).15 E F2<83>128 288 Q F0(ThePhD)7.5 E F2<83>128 +300 Q F0(Embark Studios)7.5 E F2<83>128 312 Q F0(Jasper Bekk)7.5 E(ers) +-.1 E F2<83>128 324 Q F0(EvModder)7.5 E F2(REPOR)72 340.8 Q 1.666 +(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 352.8 Q +(.ht/\001nabijaczle)-.55 E(weli/fzifdso)-.25 E F1 +(\001nabijaczleweli/tzpfms@lists.sr.ht)108 369.6 Q F0 83.762(,a)C(rchi) +-83.762 E -.15(ve)-.25 G 83.763(da).15 G(t)-83.763 E(https://lists.sr) +108 381.6 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(fzifdso 0)72 +817.889 Q(February 28, 2024)153.568 E(2)183.837 E 0 Cg EP +%%Page: 1 3 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF 50.243(ZFS-FIDO2-CLEAR-KEY\(8\) System)72 48 R +(Manager')2.5 E 2.5(sM)-.55 G 47.742(anual ZFS-FIDO2-CLEAR-KEY\(8\))-2.5 +F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF +(zfs-fido2-clear-key)108 96 Q F0 3.587<8a72>3.588 G -.25(ew)-3.587 G +1.087(rap ZFS dataset k).25 F 1.387 -.15(ey i)-.1 H 3.587(np).15 G +(asssw)-3.587 E 1.087(ord and clear tzpfms FIDO2 meta-)-.1 F(data)108 +108 Q F1(SYNOPSIS)72 124.8 Q F2(zfs-fido2-change-key)108 136.8 Q/F3 10 +/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 153.6 Q F0 +(After v)108 165.6 Q(erifying)-.15 E F3(dataset)2.5 E F0 -.1(wa)2.5 G +2.5(se).1 G(ncrypted with)-2.5 E F2(tzpfms)2.5 E F0(back)2.5 E(end)-.1 E +F1(FIDO2)2.5 E F0(:)A 5(1. performs)118 177.6 R 5.641(the equi)8.141 F +-.25(va)-.25 G 5.641(lent of).25 F F2 5.642(zfs change-key)8.142 F +13.308 E/F4 10/Courier@0 SF(keylocation=prompt)11.642 E F213.308 E +F4(keyformat=passphrase)133 189.6 Q F3(dataset)6 E F0(,)A 5(2. remo)118 +201.6 R -.15(ve)-.15 G 10.689(st).15 G(he)-10.689 E F4 +(xyz.nabijaczleweli:tzpfms.)10.689 E F0({)A F4(backend)A F0(,)A F4(key) +14.189 E F0 10.689(}p)C 8.189(roperties from)-10.689 F F3(dataset)133 +213.6 Q F0(.)A(See)108 230.4 Q F4(zfs-fido2-change-key)2.5 E F0 +(\(8\) for a detailed description.)A F1(ENVIR)72 247.2 Q 1.666(ONMENT V) +-.3 F(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 259.2 Q F0 .045 +(By def)133 271.2 R .045(ault, passphrases are prompted for and read in\ + on the standard output and input streams.)-.1 F(If)5.046 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 283.2 Q F0 1.596(is set and nonempty)4.096 +F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F F4 +(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 295.2 Q +(vide each passphrase, instead.)-.15 E .643 +(The standard output stream of the helper is tied to an anon)133 312 R +.643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) +133 324 Q(xcept for a trailing ne)-.15 E(w-line, if an)-.25 E 3.8 -.65 +(y. T)-.15 H(he ar).65 E(guments are:)-.18 E F4($1)143 336 Q F0 +(Pre-formatted noun phrase with all the information belo)160 336 Q 1.3 +-.65(w, f)-.25 H(or use as a prompt).65 E F4($2)143 348 Q F0 +(Either the dataset name or the element of the TPM hierarch)160 348 Q +2.5(yb)-.05 G(eing prompted for)-2.5 E F4($3)143 360 Q F0("ne)160 360 Q +(w" if this is for a ne)-.25 E 2.5(wp)-.25 G(assphrase, otherwise blank) +-2.5 E F4($4)143 372 Q F0("ag)160 372 Q(ain" if it')-.05 E 2.5(st)-.55 G +(he second prompt for that passphrase, otherwise blank)-2.5 E .178 +(If the helper doesn')133 388.8 R 2.678(te)-.18 G .178 +(xist \(the shell e)-2.828 F .177(xits with)-.15 F F1(127)2.677 E F0 +.177(\), a diagnostic is issued and the normal prompt)B(is used as f)133 +400.8 Q 2.5(all-back. If)-.1 F(it f)2.5 E(ails for an)-.1 E 2.5(yo)-.15 +G(ther reason, the prompting is aborted.)-2.5 E F1 1.666 +(FIDO2 back-end con\214guration)72 417.6 R(En)87 429.6 Q(vir)-.4 E .625 +(onment v)-.18 F(ariables)-.1 E F4(FIDO_DEBUG)108 441.6 Q F0 +(If set, enables lib\214do2 deb)173 441.6 Q +(ug logging to the standard error stream.)-.2 E F1(De)87 458.4 Q .625 +(vice selection)-.15 F F0 .726(When creating, the \214rst de)108 470.4 R +.726(vice which supports the)-.25 F F4(hmac-secret)3.227 E F0 -.15(ex) +3.227 G .727(tension is used.).15 F .727(When loading,)5.727 F +(the assertion is shopped around to e)108 482.4 Q -.15(ve)-.25 G +(ry such de).15 E(vice.)-.25 E F1 .625(See also)87 499.2 R F0 +(The lib\214do2 documentation at https://de)108 511.2 Q -.15(ve)-.25 G +(lopers.yubico.com/lib\214do2/.).15 E F1 1.666(SPECIAL THANKS)72 528 R +F0 1.6 -.8(To a)108 540 T(ll who support further de).8 E -.15(ve)-.25 G +(lopment, in particular:).15 E F1<83>128 552 Q F0(ThePhD)7.5 E F1<83>128 +564 Q F0(Embark Studios)7.5 E F1<83>128 576 Q F0(Jasper Bekk)7.5 E(ers) +-.1 E F1<83>128 588 Q F0(EvModder)7.5 E F1(REPOR)72 604.8 Q 1.666 +(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 616.8 Q +(.ht/\001nabijaczle)-.55 E(weli/fzifdso)-.25 E F4 +(\001nabijaczleweli/tzpfms@lists.sr.ht)108 633.6 Q F0 83.763(,a)C(rchi) +-83.763 E -.15(ve)-.25 G 83.762(da).15 G(t)-83.762 E(https://lists.sr) +108 645.6 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(fzifdso 0)72 +817.889 Q(February 28, 2024)153.568 E(1)183.837 E 0 Cg EP +%%Page: 1 4 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Roman@0 SF(ZFS-FIDO2-LO)72 48 Q 55.603(AD-KEY\(8\) System) +-.35 F(Manager')2.5 E 2.5(sM)-.55 G 53.102(anual ZFS-FIDO2-LO)-2.5 F +(AD-KEY\(8\))-.35 E/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10 +/Courier-Bold@0 SF(zfs-fido2-load-key)108 96 Q F0 2.5<8a6c>2.5 G +(oad FIDO2-encrypted ZFS dataset k)-2.5 E -.15(ey)-.1 G F1(SYNOPSIS)72 +112.8 Q F2(zfs-fido2-change-key)108 124.8 Q F0([)2.5 E F21.666 E +F0(])A/F3 10/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 141.6 +Q F0 1.141(After v)108 153.6 R(erifying)-.15 E F3(dataset)3.641 E F0 -.1 +(wa)3.641 G 3.641(se).1 G 1.141(ncrypted with)-3.641 F F2(tzpfms)3.641 E +F0(back)3.641 E(end)-.1 E F1(FIDO2)3.641 E F0 3.641(,a)C 1.142 +(sserts the preserv)-3.641 F 1.142(ed chal-)-.15 F(lenge, HMA)108 165.6 +Q(Cking the salt with the on-de)-.4 E +(vice secret, and loads the resulting k)-.25 E .3 -.15(ey i)-.1 H(nto) +.15 E F3(dataset)2.5 E F0(.)A(See)108 182.4 Q/F4 10/Courier@0 SF +(zfs-fido2-change-key)2.5 E F0(\(8\) for a detailed description.)A F1 +(OPTIONS)72 199.2 Q F2109.666 211.2 Q F0 3.208 +(Do a no-op/dry run, can be used e)131 211.2 R -.15(ve)-.25 G 5.708(ni) +.15 G 5.708(ft)-5.708 G 3.208(he k)-5.708 F 3.508 -.15(ey i)-.1 H 5.708 +(sa).15 G 3.208(lready loaded.)-5.708 F(Equi)8.207 E -.25(va)-.25 G +3.207(lent to).25 F F2(zfs)5.707 E(load-key)131 223.2 Q F0 -.55('s)C F2 +4.716 E F0(option.)2.5 E F1(ENVIR)72 240 Q 1.666(ONMENT V)-.3 F +(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 252 Q F0 .045(By def) +133 264 R .045(ault, passphrases are prompted for and read in on the st\ +andard output and input streams.)-.1 F(If)5.046 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 276 Q F0 1.596(is set and nonempty)4.096 F +4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F F4 +(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 288 Q +(vide each passphrase, instead.)-.15 E .643 +(The standard output stream of the helper is tied to an anon)133 304.8 R +.643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) +133 316.8 Q(xcept for a trailing ne)-.15 E(w-line, if an)-.25 E 3.8 -.65 +(y. T)-.15 H(he ar).65 E(guments are:)-.18 E F4($1)143 328.8 Q F0 +(Pre-formatted noun phrase with all the information belo)160 328.8 Q 1.3 +-.65(w, f)-.25 H(or use as a prompt).65 E F4($2)143 340.8 Q F0 +(Either the dataset name or the element of the TPM hierarch)160 340.8 Q +2.5(yb)-.05 G(eing prompted for)-2.5 E F4($3)143 352.8 Q F0("ne)160 +352.8 Q(w" if this is for a ne)-.25 E 2.5(wp)-.25 G +(assphrase, otherwise blank)-2.5 E F4($4)143 364.8 Q F0("ag)160 364.8 Q +(ain" if it')-.05 E 2.5(st)-.55 G +(he second prompt for that passphrase, otherwise blank)-2.5 E .178 +(If the helper doesn')133 381.6 R 2.678(te)-.18 G .178 +(xist \(the shell e)-2.828 F .177(xits with)-.15 F F1(127)2.677 E F0 +.177(\), a diagnostic is issued and the normal prompt)B(is used as f)133 +393.6 Q 2.5(all-back. If)-.1 F(it f)2.5 E(ails for an)-.1 E 2.5(yo)-.15 +G(ther reason, the prompting is aborted.)-2.5 E F1 1.666(SPECIAL THANKS) +72 410.4 R F0 1.6 -.8(To a)108 422.4 T(ll who support further de).8 E +-.15(ve)-.25 G(lopment, in particular:).15 E F1<83>128 434.4 Q F0 +(ThePhD)7.5 E F1<83>128 446.4 Q F0(Embark Studios)7.5 E F1<83>128 458.4 +Q F0(Jasper Bekk)7.5 E(ers)-.1 E F1<83>128 470.4 Q F0(EvModder)7.5 E F1 +(REPOR)72 487.2 Q 1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 +499.2 Q(.ht/\001nabijaczle)-.55 E(weli/fzifdso)-.25 E F4 +(\001nabijaczleweli/tzpfms@lists.sr.ht)108 516 Q F0 83.762(,a)C(rchi) +-83.762 E -.15(ve)-.25 G 83.763(da).15 G(t)-83.763 E(https://lists.sr) +108 528 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(fzifdso 0)72 +817.889 Q(February 28, 2024)153.568 E(1)183.837 E 0 Cg EP +%%Page: 1 5 +%%BeginPageSetup +BP +%%EndPageSetup /F0 10/Times-Roman@0 SF 93.563(ZFS-TPM-LIST\(8\) System)72 48 R (Manager')2.5 E 2.5(sM)-.55 G 91.062(anual ZFS-TPM-LIST\(8\))-2.5 F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF (zfs-tpm-list)108 96 Q F0 2.5<8a70>2.5 G(rint dataset tzpfms metadata) --2.5 E F1(SYNOPSIS)72 112.8 Q F2(zfs-tpm-list)108 124.8 Q F0([)2.5 E F2 -1.666 E F0 2.5(][)C F2-.834 E F0(|)A F21.666 E/F3 10 -/Courier-Oblique@0 SF(depth)6 E F0 2.5(][)C F2-.834 E F0(|)A F2 -1.666 E F3(back-end)6 E F0 2.5(][)C F2-.834 E F0(|)A F2 -1.666 E F0(])A([)186 136.8 Q F3(filesystem)A F0(|)A F3(volume)A F0 +-2.5 E F1(SYNOPSIS)72 112.8 Q F2(zfs-fido2-change-key)108 124.8 Q F0([) +2.5 E F21.666 E F0 2.5(][)C F2-.834 E F0(|)A F21.666 E +/F3 10/Courier-Oblique@0 SF(depth)6 E F0 2.5(][)C F2-.834 E F0(|)A +F21.666 E F3(back-end)6 E F0 2.5(][)C F2-.834 E F0(|)A F2 +1.666 E F0(])A([)234 136.8 Q F3(filesystem)A F0(|)A F3(volume)A F0 1.666(]...)C F1(DESCRIPTION)72 153.6 Q F0(Lists the follo)108 165.6 Q (wing properties on encryption roots:)-.25 E/F4 10/Courier@0 SF(name)128 177.6 Q(back-end)128 189.6 Q F0(the)187 189.6 Q F2(tzpfms)2.979 E F0 @@ -326,26 +591,28 @@ listed \212 by def)108 307.2 R .966(ault, those managed by)-.1 F F2 G(re una)-2.5 E -.25(va)-.2 G(ilable.).25 E F2109.666 446.4 Q F0 (List only encryption roots whose k)185 446.4 Q -.15(ey)-.1 G 2.5(sa).15 G(re a)-2.5 E -.25(va)-.2 G(ilable.).25 E F1(EXAMPLES)72 463.2 Q F4($) -108 475.2 Q F2(zfs-tpm-list)6 E F4 72(NAME BACK-END)108 487.2 R 18 -(KEYSTATUS COHERENT)12 F 36(tarta-zoot TPM1.X)108 499.2 R 18 +108 475.2 Q F2(zfs-fido2-change-key)6 E F4 72(NAME BACK-END)108 487.2 R +18(KEYSTATUS COHERENT)12 F 36(tarta-zoot TPM1.X)108 499.2 R 18 (available yes)24 F 6(tarta-zoot/home TPM2)108 511.2 R 6 -(unavailable yes)36 F($)108 535.2 Q F2 1.666(zfs-tpm-list \255ad0)6 F F4 -24(NAME BACK-END)108 547.2 R 6(KEYSTATUS COHERENT)12 F 6(filling -)108 -559.2 R 6(available yes)54 F($)108 583.2 Q F2 1.666(zfs-tpm-list \255b)6 -F F1(TPM2)6 E F4 72(NAME BACK-END)108 595.2 R 18(KEYSTATUS COHERENT)12 F -6(tarta-zoot/home TPM2)108 607.2 R 6(unavailable yes)36 F($)108 631.2 Q -F2 1.666(zfs-tpm-list \255ra)6 F F3(tarta-zoot)6 E F4 72(NAME BACK-END) -108 643.2 R 18(KEYSTATUS COHERENT)12 F 36(tarta-zoot TPM1.X)108 655.2 R -18(available yes)24 F 6(tarta-zoot/home TPM2)108 667.2 R 6 -(unavailable yes)36 F 12(tarta-zoot/bkp -)108 679.2 R 18(available yes) -54 F 18(tarta-zoot/vm -)108 691.2 R 18(available yes)54 F($)108 715.2 Q -F2 1.666(zfs-tpm-list \255al)6 F F4 72(NAME BACK-END)108 727.2 R 6 +(unavailable yes)36 F($)108 535.2 Q F2 1.666 +(zfs-fido2-change-key \255ad0)6 F F4 24(NAME BACK-END)108 547.2 R 6 +(KEYSTATUS COHERENT)12 F 6(filling -)108 559.2 R 6(available yes)54 F($) +108 583.2 Q F2 1.666(zfs-fido2-change-key \255b)6 F F1(TPM2)6 E F4 72 +(NAME BACK-END)108 595.2 R 18(KEYSTATUS COHERENT)12 F 6 +(tarta-zoot/home TPM2)108 607.2 R 6(unavailable yes)36 F($)108 631.2 Q +F2 1.666(zfs-fido2-change-key \255ra)6 F F3(tarta-zoot)6 E F4 72 +(NAME BACK-END)108 643.2 R 18(KEYSTATUS COHERENT)12 F 36 +(tarta-zoot TPM1.X)108 655.2 R 18(available yes)24 F 6 +(tarta-zoot/home TPM2)108 667.2 R 6(unavailable yes)36 F 12 +(tarta-zoot/bkp -)108 679.2 R 18(available yes)54 F 18(tarta-zoot/vm -) +108 691.2 R 18(available yes)54 F($)108 715.2 Q F2 1.666 +(zfs-fido2-change-key \255al)6 F F4 72(NAME BACK-END)108 727.2 R 6 (KEYSTATUS COHERENT)12 F 54(filling -)108 739.2 R 6(available yes)54 F 36(tarta-zoot TPM1.X)108 751.2 R 6(available yes)24 F 12 (tarta-zoot/bkp -)108 763.2 R 6(available yes)54 F 18(tarta-zoot/vm -) 108 775.2 R 6(available yes)54 F F0(tzpfms 0.3.4-6-g)72 817.889 Q 86.133 (a0246cb December)-.05 F(4, 2022)2.5 E(1)183.842 E 0 Cg EP -%%Page: 2 2 +%%Page: 2 6 %%BeginPageSetup BP %%EndPageSetup @@ -362,7 +629,7 @@ F0 83.762(,a)C(rchi)-83.762 E -.15(ve)-.25 G 83.763(da).15 G(t)-83.763 E (https://lists.sr)108 201.6 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.) -.25 E(tzpfms 0.3.4-6-g)72 817.889 Q 86.133(a0246cb December)-.05 F (4, 2022)2.5 E(2)183.842 E 0 Cg EP -%%Page: 1 3 +%%Page: 1 7 %%BeginPageSetup BP %%EndPageSetup @@ -371,192 +638,193 @@ BP -2.5 F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF(zfs-tpm1x-change-key)108 96 Q F0 2.5<8a63>2.5 G(hange ZFS dataset k) -2.5 E .3 -.15(ey t)-.1 H 2.5(oo).15 G(ne stored on the TPM)-2.5 E F1 -(SYNOPSIS)72 112.8 Q F2(zfs-tpm-list)108 124.8 Q F0([)2.5 E F2 -1.666 E/F3 10/Courier-Oblique@0 SF(backup-file)6 E F0 2.5(][)C F2 --.834 E F3(PCR)6 E F0([)A F2(,)A F3(PCR)A F0 1.666(]...)C(])-1.666 E F3 -(dataset)2.5 E F1(DESCRIPTION)72 141.6 Q F0 6.867 -.8(To n)108 153.6 T -5.267(ormalise the).8 F F3(dataset)7.767 E F0(,)A F2(zfs-tpm-list)7.766 -E F0 5.266(will open its encryption root in its stead.)7.766 F F2 -(zfs-tpm-list)108 165.6 Q F0(will)2.5 E/F4 10/Times-Italic@0 SF(ne)2.5 E -(ver)-.15 E F0(create or destro)2.5 E 2.5(ye)-.1 G(ncryption roots; use) --2.5 E/F5 10/Courier@0 SF(zfs-change-key)2.5 E F0(\(8\) for that.)A -(First, a connection is made to the TPM, which)108 182.4 Q F4(must)2.5 E -F0(be TPM-1.X-compatible.)2.5 E(If)108 199.2 Q F3(dataset)3.176 E F0 -.1 +(SYNOPSIS)72 112.8 Q F2(zfs-fido2-change-key)108 124.8 Q F0([)2.5 E F2 +1.666 E/F3 10/Courier-Oblique@0 SF(backup-file)6 E F0 2.5(][)C F2 +-.834 E F3(PCR)6 E F0([)A F2(,)A F3(PCR)A F0 1.666(]...)C(])-1.666 +E F3(dataset)2.5 E F1(DESCRIPTION)72 141.6 Q F0 2.867 -.8(To n)108 153.6 +T 1.267(ormalise the).8 F F3(dataset)3.767 E F0(,)A F2 +(zfs-fido2-change-key)3.766 E F0 1.266 +(will open its encryption root in its stead.)3.766 F F2 +(zfs-fido2-change-key)108 165.6 Q F0(will)14.654 E/F4 10/Times-Italic@0 +SF(ne)14.654 E(ver)-.15 E F0 12.154(create or destro)14.654 F 14.655(ye) +-.1 G 12.155(ncryption roots; use)-14.655 F/F5 10/Courier@0 SF +(zfs-change-key)108 177.6 Q F0(\(8\) for that.)A +(First, a connection is made to the TPM, which)108 194.4 Q F4(must)2.5 E +F0(be TPM-1.X-compatible.)2.5 E(If)108 211.2 Q F3(dataset)3.177 E F0 -.1 (wa)3.176 G 3.176(sp).1 G(re)-3.176 E .676(viously encrypted with)-.25 F F2(tzpfms)3.176 E F0 .676(and the)3.176 F F1(TPM1.X)3.176 E F0 .676 (back-end w)3.176 F .676(as used, the meta-)-.1 F .926 -(data will be silently cleared.)108 211.2 R .926 +(data will be silently cleared.)108 223.2 R .926 (Otherwise, or in case of an error)5.926 F 3.426(,d)-.4 G .926 (ata required for manual interv)-3.426 F(ention)-.15 E -(will be written to the standard error stream.)108 223.2 Q(Ne)108 240 Q -.294(xt, a ne)-.15 F 2.794(ww)-.25 G .294(rapping k)-2.794 F .594 -.15 +(will be written to the standard error stream.)108 235.2 Q(Ne)108 252 Q +.295(xt, a ne)-.15 F 2.794(ww)-.25 G .294(rapping k)-2.794 F .594 -.15 (ey i)-.1 H 2.794(sg).15 G .294(enerated on the TPM, optionally back) -2.794 F .294(ed up \(see)-.1 F F1(OPTIONS)2.794 E F0 .294 -(\), and sealed)B .586(on the TPM; the user is prompted for an optional\ - passphrase to protect the k)108 252 R .885 -.15(ey w)-.1 H .585 -(ith, and for the SRK).15 F(passphrase, set when taking o)108 264 Q +(\), and sealed)B .585(on the TPM; the user is prompted for an optional\ + passphrase to protect the k)108 264 R .886 -.15(ey w)-.1 H .586 +(ith, and for the SRK).15 F(passphrase, set when taking o)108 276 Q (wnership, if not "well-kno)-.25 E(wn" \(all zeroes\).)-.25 E(The follo) -108 280.8 Q(wing properties are set on)-.25 E F3(dataset)2.5 E F0(:)A F1 -<83>128 292.8 Q F5(xyz.nabijaczleweli:tzpfms.backend)7.5 E F0(=)A F1 -(TPM1.X)A<83>128 304.8 Q F5(xyz.nabijaczleweli:tzpfms.key)7.5 E F0(=)A +108 292.8 Q(wing properties are set on)-.25 E F3(dataset)2.5 E F0(:)A F1 +<83>128 304.8 Q F5(xyz.nabijaczleweli:tzpfms.backend)7.5 E F0(=)A F1 +(TPM1.X)A<83>128 316.8 Q F5(xyz.nabijaczleweli:tzpfms.key)7.5 E F0(=)A F3(parent-key-blob)A F2(:)A F3(sealed-object-blob)A F5(tzpfms.backend) -108 321.6 Q F0 .291(identi\214es this dataset for w)2.791 F .292 -(ork with)-.1 F F1(TPM1.X)2.792 E F0(-back-ended)A F2(tzpfms)2.792 E F0 -.292(tools \(namely)2.792 F F5(zfs-tpm1x-change-key)108 333.6 Q F0 +108 333.6 Q F0 .292(identi\214es this dataset for w)2.792 F .291 +(ork with)-.1 F F1(TPM1.X)2.791 E F0(-back-ended)A F2(tzpfms)2.791 E F0 +.291(tools \(namely)2.791 F F5(zfs-tpm1x-change-key)108 345.6 Q F0 (\(8\),)A F5(zfs-tpm1x-load-key)2.5 E F0(\(8\), and)A F5 -(zfs-tpm1x-clear-key)2.5 E F0(\(8\)\).)A F5(tzpfms.key)108 350.4 Q F0 -1.412(is a colon-separated pair of he)3.913 F 1.412 -(xadecimal-string \(i.e. "4F7730" for "Ow0"\) blobs; the)-.15 F .867 -(\214rst one represents the RSA k)108 362.4 R 1.167 -.15(ey p)-.1 H .868 +(zfs-tpm1x-clear-key)2.5 E F0(\(8\)\).)A F5(tzpfms.key)108 362.4 Q F0 +1.412(is a colon-separated pair of he)3.912 F 1.412 +(xadecimal-string \(i.e. "4F7730" for "Ow0"\) blobs; the)-.15 F .868 +(\214rst one represents the RSA k)108 374.4 R 1.168 -.15(ey p)-.1 H .867 (rotecting the blob, and it is protected with either the passphrase, if) -.15 F(pro)108 374.4 Q 1.414(vided, or the SHA1 constant)-.15 F F5 -(CE4CF677875B5EB8993591D5A9AF1ED24A3A8736)3.913 E F0 3.913(;t)C 1.413 -(he sec-)-3.913 F .379 -(ond represents the sealed object containing the wrapping k)108 386.4 R +.15 F(pro)108 386.4 Q 1.413(vided, or the SHA1 constant)-.15 F F5 +(CE4CF677875B5EB8993591D5A9AF1ED24A3A8736)3.914 E F0 3.914(;t)C 1.414 +(he sec-)-3.914 F .379 +(ond represents the sealed object containing the wrapping k)108 398.4 R -.15(ey)-.1 G 2.879(,a)-.5 G .379 (nd is protected with the SHA1 constant)-2.879 F F5 -(B9EE715DBE4B243FAA81EA04306E063710383E35)108 398.4 Q F0 6.721(.T)C -1.721(here e)-6.721 F 1.721(xists no other user)-.15 F 1.72 -(-land tool for)-.2 F(decrypting this; perhaps there should be.)108 -410.4 Q(Finally)108 427.2 Q 12.005(,t)-.65 G 9.505(he equi)-12.005 F --.25(va)-.25 G 9.505(lent of).25 F F2 9.505(zfs change-key)12.005 F -17.172 E F5(keylocation=prompt)15.506 E F217.172 E F5 -(keyformat=raw)108 439.2 Q F3(dataset)6.107 E F0 .107 -(is performed with the ne)2.607 F 2.606(wk)-.25 G -.15(ey)-2.706 G 5.106 -(.I)-.5 G 2.606(fa)-5.106 G 2.606(ne)-2.606 G .106 -(rror occurred, best ef)-2.606 F .106(fort is made)-.25 F +(B9EE715DBE4B243FAA81EA04306E063710383E35)108 410.4 Q F0 6.72(.T)C 1.72 +(here e)-6.72 F 1.721(xists no other user)-.15 F 1.721(-land tool for) +-.2 F(decrypting this; perhaps there should be.)108 422.4 Q(Finally)108 +439.2 Q 12.006(,t)-.65 G 9.506(he equi)-12.006 F -.25(va)-.25 G 9.506 +(lent of).25 F F2 9.505(zfs change-key)12.005 F17.171 E F5 +(keylocation=prompt)15.505 E F217.171 E F5(keyformat=raw)108 451.2 +Q F3(dataset)6.106 E F0 .106(is performed with the ne)2.606 F 2.606(wk) +-.25 G -.15(ey)-2.706 G 5.106(.I)-.5 G 2.606(fa)-5.106 G 2.606(ne)-2.606 +G .107(rror occurred, best ef)-2.606 F .107(fort is made)-.25 F (to clean up the properties, or to issue a note for manual interv)108 -451.2 Q(ention into the standard error stream.)-.15 E 4.055<418c>108 468 -S 1.555(nal v)-4.055 F 1.556(eri\214cation should be made by running) --.15 F F2 3.222(zfs-tpm1x-load-key \255n)4.056 F F3(dataset)7.556 E F0 -6.556(.I)C 4.056(ft)-6.556 G(hat)-4.056 E .729 -(command succeeds, all is well, b)108 480 R .729 +463.2 Q(ention into the standard error stream.)-.15 E 4.056<418c>108 480 +S 1.556(nal v)-4.056 F 1.556(eri\214cation should be made by running) +-.15 F F2 3.222(zfs-tpm1x-load-key \255n)4.056 F F3(dataset)7.555 E F0 +6.555(.I)C 4.055(ft)-6.555 G(hat)-4.055 E .729 +(command succeeds, all is well, b)108 492 R .729 (ut otherwise the dataset can be manually rolled back to a passphrase) --.2 F(with)108 492 Q F2(zfs-tpm1x-clear-key)5.146 E F3(dataset)8.646 E -F0(\(or)5.146 E 5.146(,i)-.4 G 5.146(ft)-5.146 G 2.646(hat f)-5.146 F -2.646(ails to w)-.1 F(ork,)-.1 E F2 2.647(zfs change-key)5.147 F -10.313 E F5(keyformat=passphrase)108 504 Q F3(dataset)6 E F0 +-.2 F(with)108 504 Q F2(zfs-tpm1x-clear-key)5.147 E F3(dataset)8.647 E +F0(\(or)5.147 E 5.146(,i)-.4 G 5.146(ft)-5.146 G 2.646(hat f)-5.146 F +2.646(ails to w)-.1 F(ork,)-.1 E F2 2.646(zfs change-key)5.146 F +10.312 E F5(keyformat=passphrase)108 516 Q F3(dataset)6 E F0 (\), and you are hereby ask)A(ed to report a b)-.1 E(ug, please.)-.2 E -F2(zfs-tpm1x-clear-key)108 520.8 Q F3(dataset)7.607 E F0 1.607 -(can be used to clear the properties and go back to using a)4.107 F -(passphrase.)108 532.8 Q F1(OPTIONS)72 549.6 Q F2109.666 561.6 Q -F3(backup-file)6 E F0(Sa)203 561.6 Q .352 -.15(ve a b)-.2 H .052 +F2(zfs-tpm1x-clear-key)108 532.8 Q F3(dataset)7.606 E F0 1.607 +(can be used to clear the properties and go back to using a)4.106 F +(passphrase.)108 544.8 Q F1(OPTIONS)72 561.6 Q F2109.666 573.6 Q +F3(backup-file)6 E F0(Sa)203 573.6 Q .353 -.15(ve a b)-.2 H .052 (ack-up of the k).15 F .352 -.15(ey t)-.1 H(o).15 E F3(backup-file)2.552 -E F0 2.552(,w)C .052(hich must not e)-2.552 F .053(xist beforehand.)-.15 -F .694(This back-up)203 573.6 R F4(must)3.194 E F0 .694 -(be stored securely)3.194 F 3.194(,o)-.65 G -.25(ff)-3.194 G 3.194 -(-site. In).25 F .693(case of a catastrophic e)3.194 F -.15(ve)-.25 G -(nt,).15 E(the k)203 585.6 Q .3 -.15(ey c)-.1 H(an be loaded by running) -.15 E F2(zfs load-key)233 597.6 Q F3(dataset)6 E F5(<)6 E F3 -(backup-file)6 E F2109.666 614.4 Q F3(PCR)6 E F0([)A F2(,)A F3 -(PCR)A F0 1.666(]...)C .638(Bind the k)203 614.4 R .939 -.15(ey t)-.1 H +E F0 2.552(,w)C .052(hich must not e)-2.552 F .052(xist beforehand.)-.15 +F .693(This back-up)203 585.6 R F4(must)3.193 E F0 .694 +(be stored securely)3.193 F 3.194(,o)-.65 G -.25(ff)-3.194 G 3.194 +(-site. In).25 F .694(case of a catastrophic e)3.194 F -.15(ve)-.25 G +(nt,).15 E(the k)203 597.6 Q .3 -.15(ey c)-.1 H(an be loaded by running) +.15 E F2(zfs load-key)233 609.6 Q F3(dataset)6 E F5(<)6 E F3 +(backup-file)6 E F2109.666 626.4 Q F3(PCR)6 E F0([)A F2(,)A F3 +(PCR)A F0 1.666(]...)C .639(Bind the k)203 626.4 R .939 -.15(ey t)-.1 H 3.139(os).15 G .639(pace- or comma-separated)-3.139 F F3(PCR)3.139 E F0 -3.139(s\212i)C 3.139(ft)-3.139 G(he)-3.139 E 3.139(yc)-.15 G .639 -(hange, the wrap-)-3.139 F .463(ping k)203 626.4 R .763 -.15(ey w)-.1 H -.463(ill not be able to be unsealed.).15 F .462 -(The minimum number of PCRs for a)5.462 F(PC TPM is)203 638.4 Q F1(24) +3.139(s\212i)C 3.139(ft)-3.139 G(he)-3.139 E 3.139(yc)-.15 G .638 +(hange, the wrap-)-3.139 F .462(ping k)203 638.4 R .762 -.15(ey w)-.1 H +.462(ill not be able to be unsealed.).15 F .463 +(The minimum number of PCRs for a)5.462 F(PC TPM is)203 650.4 Q F1(24) 2.5 E F0(\(numbered [)2.5 E F1(0)A F0(,)A F1(23)2.5 E F0 2.5(]\). F)B -(or most, this is also the maximum.)-.15 E F1(ENVIR)72 655.2 Q 1.666 -(ONMENT V)-.3 F(ARIABLES)-1.35 E F5(TZPFMS_PASSPHRASE_HELPER)108 667.2 Q -F0 .045(By def)133 679.2 R .045(ault, passphrases are prompted for and \ -read in on the standard output and input streams.)-.1 F(If)5.046 E F5 -(TZPFMS_PASSPHRASE_HELPER)133 691.2 Q F0 1.596(is set and nonempty)4.096 +(or most, this is also the maximum.)-.15 E F1(ENVIR)72 667.2 Q 1.666 +(ONMENT V)-.3 F(ARIABLES)-1.35 E F5(TZPFMS_PASSPHRASE_HELPER)108 679.2 Q +F0 .046(By def)133 691.2 R .045(ault, passphrases are prompted for and \ +read in on the standard output and input streams.)-.1 F(If)5.045 E F5 +(TZPFMS_PASSPHRASE_HELPER)133 703.2 Q F0 1.595(is set and nonempty)4.095 F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F F5 -(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 703.2 Q +(/bin/)4.096 E F2 3.262(sh \255c)B F0(to)4.096 E(pro)133 715.2 Q (vide each passphrase, instead.)-.15 E .643 -(The standard output stream of the helper is tied to an anon)133 720 R +(The standard output stream of the helper is tied to an anon)133 732 R .643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) -133 732 Q(xcept for a trailing ne)-.15 E(w-line, if an)-.25 E 3.8 -.65 -(y. T)-.15 H(he ar).65 E(guments are:)-.18 E F5($1)143 744 Q F0 -(Pre-formatted noun phrase with all the information belo)160 744 Q 1.3 --.65(w, f)-.25 H(or use as a prompt).65 E(tzpfms 0.3.4-6-g)72 817.889 Q -86.128(a0246cb February)-.05 F(28, 2024)2.5 E(1)183.837 E 0 Cg EP -%%Page: 2 4 +133 744 Q(xcept for a trailing ne)-.15 E(w-line, if an)-.25 E 3.8 -.65 +(y. T)-.15 H(he ar).65 E(guments are:)-.18 E(tzpfms 0.3.4-6-g)72 817.889 +Q 86.128(a0246cb February)-.05 F(28, 2024)2.5 E(1)183.837 E 0 Cg EP +%%Page: 2 8 %%BeginPageSetup BP %%EndPageSetup /F0 10/Times-Roman@0 SF 36.913(ZFS-TPM1X-CHANGE-KEY\(8\) System)72 48 R (Manager')2.5 E 2.5(sM)-.55 G 34.412(anual ZFS-TPM1X-CHANGE-KEY\(8\)) --2.5 F/F1 10/Courier@0 SF($2)143 84 Q F0 -(Either the dataset name or the element of the TPM hierarch)160 84 Q 2.5 -(yb)-.05 G(eing prompted for)-2.5 E F1($3)143 96 Q F0("ne)160 96 Q +-2.5 F/F1 10/Courier@0 SF($1)143 84 Q F0 +(Pre-formatted noun phrase with all the information belo)160 84 Q 1.3 +-.65(w, f)-.25 H(or use as a prompt).65 E F1($2)143 96 Q F0 +(Either the dataset name or the element of the TPM hierarch)160 96 Q 2.5 +(yb)-.05 G(eing prompted for)-2.5 E F1($3)143 108 Q F0("ne)160 108 Q (w" if this is for a ne)-.25 E 2.5(wp)-.25 G(assphrase, otherwise blank) --2.5 E F1($4)143 108 Q F0("ag)160 108 Q(ain" if it')-.05 E 2.5(st)-.55 G -(he second prompt for that passphrase, otherwise blank)-2.5 E .178 -(If the helper doesn')133 124.8 R 2.678(te)-.18 G .178 -(xist \(the shell e)-2.828 F .177(xits with)-.15 F/F2 10/Times-Bold@0 SF -(127)2.677 E F0 .177(\), a diagnostic is issued and the normal prompt)B -(is used as f)133 136.8 Q 2.5(all-back. If)-.1 F(it f)2.5 E(ails for an) +-2.5 E F1($4)143 120 Q F0("ag)160 120 Q(ain" if it')-.05 E 2.5(st)-.55 G +(he second prompt for that passphrase, otherwise blank)-2.5 E .177 +(If the helper doesn')133 136.8 R 2.677(te)-.18 G .177 +(xist \(the shell e)-2.827 F .177(xits with)-.15 F/F2 10/Times-Bold@0 SF +(127)2.677 E F0 .178(\), a diagnostic is issued and the normal prompt)B +(is used as f)133 148.8 Q 2.5(all-back. If)-.1 F(it f)2.5 E(ails for an) -.1 E 2.5(yo)-.15 G(ther reason, the prompting is aborted.)-2.5 E F2 -1.666(TPM1.X back-end con\214guration)72 153.6 R .625(TPM selection)87 -165.6 R F0(The)108 177.6 Q/F3 10/Courier-Bold@0 SF(tzpfms)2.729 E F0 -.229(suite connects to a local)2.729 F F1(tcsd)2.73 E F0 .23 -(\(8\) process \(at)B F1(localhost:30003)2.73 E F0 2.73(\)b)C 2.73(yd) --2.73 G(ef)-2.73 E 2.73(ault. Use)-.1 F(the)2.73 E(en)108 189.6 Q -(vironment v)-.4 E(ariable)-.25 E F1(TZPFMS_TPM1X)2.5 E F0 -(to specify a remote TCS hostname.)2.5 E .111(The T)108 206.4 R(rouSerS) --.35 E F1(tcsd)2.611 E F0 .111(\(8\) daemon will try)B F1(/dev/tpm0)2.61 -E F0 2.61(,t)C(hen)-2.61 E F1(/udev/tpm0)2.61 E F0 2.61(,t)C(hen)-2.61 E -F1(/dev/tpm)2.61 E F0 2.61(;b)C 2.61(yo)-2.61 G(ccu-)-2.61 E -.1(py)108 -218.4 S(ing one of the earlier ones with, for e).1 E +1.666(TPM1.X back-end con\214guration)72 165.6 R .625(TPM selection)87 +177.6 R F0(The)108 189.6 Q/F3 10/Courier-Bold@0 SF(tzpfms)2.73 E F0 .23 +(suite connects to a local)2.73 F F1(tcsd)2.73 E F0 .23 +(\(8\) process \(at)B F1(localhost:30003)2.729 E F0 2.729(\)b)C 2.729 +(yd)-2.729 G(ef)-2.729 E 2.729(ault. Use)-.1 F(the)2.729 E(en)108 201.6 +Q(vironment v)-.4 E(ariable)-.25 E F1(TZPFMS_TPM1X)2.5 E F0 +(to specify a remote TCS hostname.)2.5 E .11(The T)108 218.4 R(rouSerS) +-.35 E F1(tcsd)2.61 E F0 .11(\(8\) daemon will try)B F1(/dev/tpm0)2.61 E +F0 2.61(,t)C(hen)-2.61 E F1(/udev/tpm0)2.611 E F0 2.611(,t)C(hen)-2.611 +E F1(/dev/tpm)2.611 E F0 2.611(;b)C 2.611(yo)-2.611 G(ccu-)-2.611 E -.1 +(py)108 230.4 S(ing one of the earlier ones with, for e).1 E (xample, shell redirection, a later one can be selected.)-.15 E F2 .625 -(See also)87 235.2 R F0(The T)108 247.2 Q +(See also)87 247.2 R F0(The T)108 259.2 Q (rouSerS project page at https://sourcefor)-.35 E (ge.net/projects/trousers.)-.18 E 4.415 -(The TPM 1.2 main speci\214cation inde)108 264 R 6.915(xa)-.15 G 6.915 +(The TPM 1.2 main speci\214cation inde)108 276 R 6.915(xa)-.15 G 6.915 (th)-6.915 G(ttps://trustedcomputinggroup.or)-6.915 E -(g/resource/tpm-main-)-.18 E(speci\214cation.)108 276 Q F2 1.666 -(SPECIAL THANKS)72 292.8 R F0 1.6 -.8(To a)108 304.8 T +(g/resource/tpm-main-)-.18 E(speci\214cation.)108 288 Q F2 1.666 +(SPECIAL THANKS)72 304.8 R F0 1.6 -.8(To a)108 316.8 T (ll who support further de).8 E -.15(ve)-.25 G(lopment, in particular:) -.15 E F2<83>128 316.8 Q F0(ThePhD)7.5 E F2<83>128 328.8 Q F0 -(Embark Studios)7.5 E F2<83>128 340.8 Q F0(Jasper Bekk)7.5 E(ers)-.1 E -F2<83>128 352.8 Q F0(EvModder)7.5 E F2(REPOR)72 369.6 Q 1.666(TING B)-.4 -F(UGS)-.1 E F0(https://todo.sr)108 381.6 Q(.ht/\001nabijaczle)-.55 E -(weli/tzpfms)-.25 E F1(\001nabijaczleweli/tzpfms@lists.sr.ht)108 398.4 Q -F0 83.763(,a)C(rchi)-83.763 E -.15(ve)-.25 G 83.762(da).15 G(t)-83.762 E -(https://lists.sr)108 410.4 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.) --.25 E F2 1.666(SEE ALSO)72 427.2 R F0 -(PCR allocations: https://wiki.archlinux.or)108 439.2 Q(g/title/T)-.18 E +.15 E F2<83>128 328.8 Q F0(ThePhD)7.5 E F2<83>128 340.8 Q F0 +(Embark Studios)7.5 E F2<83>128 352.8 Q F0(Jasper Bekk)7.5 E(ers)-.1 E +F2<83>128 364.8 Q F0(EvModder)7.5 E F2(REPOR)72 381.6 Q 1.666(TING B)-.4 +F(UGS)-.1 E F0(https://todo.sr)108 393.6 Q(.ht/\001nabijaczle)-.55 E +(weli/tzpfms)-.25 E F1(\001nabijaczleweli/tzpfms@lists.sr.ht)108 410.4 Q +F0 83.762(,a)C(rchi)-83.762 E -.15(ve)-.25 G 83.763(da).15 G(t)-83.763 E +(https://lists.sr)108 422.4 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.) +-.25 E F2 1.666(SEE ALSO)72 439.2 R F0 +(PCR allocations: https://wiki.archlinux.or)108 451.2 Q(g/title/T)-.18 E (rusted_Platform_Module#Accessing_PCR_re)-.35 E(gisters)-.15 E -(and https://trustedcomputinggroup.or)108 451.2 Q +(and https://trustedcomputinggroup.or)108 463.2 Q (g/wp-content/uploads/PC-)-.18 E(ClientSpeci\214c_Platform_Pro\214le_fo\ -r_TPM_2p0_Systems_v51.pdf, Section 2.3.4 "PCR Usage", T)108 463.2 Q -(able)-.8 E(1.)108 475.2 Q(tzpfms 0.3.4-6-g)72 817.889 Q 86.128 +r_TPM_2p0_Systems_v51.pdf, Section 2.3.4 "PCR Usage", T)108 475.2 Q +(able)-.8 E(1.)108 487.2 Q(tzpfms 0.3.4-6-g)72 817.889 Q 86.128 (a0246cb February)-.05 F(28, 2024)2.5 E(2)183.837 E 0 Cg EP -%%Page: 1 5 +%%Page: 1 9 %%BeginPageSetup BP %%EndPageSetup /F0 10/Times-Roman@0 SF 45.793(ZFS-TPM1X-CLEAR-KEY\(8\) System)72 48 R (Manager')2.5 E 2.5(sM)-.55 G 43.292(anual ZFS-TPM1X-CLEAR-KEY\(8\))-2.5 F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF -(zfs-tpm1x-clear-key)108 96 Q F0 3.008<8a72>3.007 G -.25(ew)-3.008 G +(zfs-tpm1x-clear-key)108 96 Q F0 3.008<8a72>3.008 G -.25(ew)-3.008 G .508(rap ZFS dataset k).25 F .808 -.15(ey i)-.1 H 3.008(np).15 G(asssw) -3.008 E .508(ord and clear tzpfms TPM1.X meta-)-.1 F(data)108 108 Q F1 -(SYNOPSIS)72 124.8 Q F2(zfs-tpm-list)108 136.8 Q/F3 10/Courier-Oblique@0 -SF(dataset)2.5 E F1(DESCRIPTION)72 153.6 Q F0(After v)108 165.6 Q -(erifying)-.15 E F3(dataset)2.5 E F0 -.1(wa)2.5 G 2.5(se).1 G -(ncrypted with)-2.5 E F2(tzpfms)2.5 E F0(back)2.5 E(end)-.1 E F1(TPM1.X) -2.5 E F0(:)A 5(1. performs)118 177.6 R 5.642(the equi)8.142 F -.25(va) --.25 G 5.642(lent of).25 F F2 5.642(zfs change-key)8.142 F13.307 E -/F4 10/Courier@0 SF(keylocation=prompt)11.641 E F213.307 E F4 -(keyformat=passphrase)133 189.6 Q F3(dataset)6 E F0(,)A 5(2. remo)118 +(SYNOPSIS)72 124.8 Q F2(zfs-fido2-change-key)108 136.8 Q/F3 10 +/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 153.6 Q F0 +(After v)108 165.6 Q(erifying)-.15 E F3(dataset)2.5 E F0 -.1(wa)2.5 G +2.5(se).1 G(ncrypted with)-2.5 E F2(tzpfms)2.5 E F0(back)2.5 E(end)-.1 E +F1(TPM1.X)2.5 E F0(:)A 5(1. performs)118 177.6 R 5.641(the equi)8.141 F +-.25(va)-.25 G 5.641(lent of).25 F F2 5.642(zfs change-key)8.142 F +13.308 E/F4 10/Courier@0 SF(keylocation=prompt)11.642 E F213.308 E +F4(keyformat=passphrase)133 189.6 Q F3(dataset)6 E F0(,)A 5(2. remo)118 201.6 R -.15(ve)-.15 G 10.689(st).15 G(he)-10.689 E F4 (xyz.nabijaczleweli:tzpfms.)10.689 E F0({)A F4(backend)A F0(,)A F4(key) 14.189 E F0 10.689(}p)C 8.189(roperties from)-10.689 F F3(dataset)133 213.6 Q F0(.)A(See)108 230.4 Q F4(zfs-tpm1x-change-key)2.5 E F0 (\(8\) for a detailed description.)A F1 1.666 (TPM1.X back-end con\214guration)72 247.2 R .625(TPM selection)87 259.2 -R F0(The)108 271.2 Q F2(tzpfms)2.73 E F0 .23(suite connects to a local) -2.73 F F4(tcsd)2.73 E F0 .23(\(8\) process \(at)B F4(localhost:30003) -2.729 E F0 2.729(\)b)C 2.729(yd)-2.729 G(ef)-2.729 E 2.729(ault. Use)-.1 -F(the)2.729 E(en)108 283.2 Q(vironment v)-.4 E(ariable)-.25 E F4 -(TZPFMS_TPM1X)2.5 E F0(to specify a remote TCS hostname.)2.5 E .11 -(The T)108 300 R(rouSerS)-.35 E F4(tcsd)2.61 E F0 .11 -(\(8\) daemon will try)B F4(/dev/tpm0)2.61 E F0 2.61(,t)C(hen)-2.61 E F4 -(/udev/tpm0)2.611 E F0 2.611(,t)C(hen)-2.611 E F4(/dev/tpm)2.611 E F0 -2.611(;b)C 2.611(yo)-2.611 G(ccu-)-2.611 E -.1(py)108 312 S -(ing one of the earlier ones with, for e).1 E +R F0(The)108 271.2 Q F2(tzpfms)2.729 E F0 .229 +(suite connects to a local)2.729 F F4(tcsd)2.73 E F0 .23 +(\(8\) process \(at)B F4(localhost:30003)2.73 E F0 2.73(\)b)C 2.73(yd) +-2.73 G(ef)-2.73 E 2.73(ault. Use)-.1 F(the)2.73 E(en)108 283.2 Q +(vironment v)-.4 E(ariable)-.25 E F4(TZPFMS_TPM1X)2.5 E F0 +(to specify a remote TCS hostname.)2.5 E .111(The T)108 300 R(rouSerS) +-.35 E F4(tcsd)2.611 E F0 .111(\(8\) daemon will try)B F4(/dev/tpm0)2.61 +E F0 2.61(,t)C(hen)-2.61 E F4(/udev/tpm0)2.61 E F0 2.61(,t)C(hen)-2.61 E +F4(/dev/tpm)2.61 E F0 2.61(;b)C 2.61(yo)-2.61 G(ccu-)-2.61 E -.1(py)108 +312 S(ing one of the earlier ones with, for e).1 E (xample, shell redirection, a later one can be selected.)-.15 E F1 .625 (See also)87 328.8 R F0(The T)108 340.8 Q (rouSerS project page at https://sourcefor)-.35 E @@ -571,11 +839,11 @@ F(the)2.729 E(en)108 283.2 Q(vironment v)-.4 E(ariable)-.25 E F4 F1<83>128 446.4 Q F0(EvModder)7.5 E F1(REPOR)72 463.2 Q 1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 475.2 Q(.ht/\001nabijaczle)-.55 E (weli/tzpfms)-.25 E F4(\001nabijaczleweli/tzpfms@lists.sr.ht)108 492 Q -F0 83.762(,a)C(rchi)-83.762 E -.15(ve)-.25 G 83.763(da).15 G(t)-83.763 E +F0 83.763(,a)C(rchi)-83.763 E -.15(ve)-.25 G 83.762(da).15 G(t)-83.762 E (https://lists.sr)108 504 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(tzpfms 0.3.4-6-g)72 817.889 Q 86.133(a0246cb December)-.05 F(4, 2022) 2.5 E(1)183.842 E 0 Cg EP -%%Page: 1 6 +%%Page: 1 10 %%BeginPageSetup BP %%EndPageSetup @@ -584,15 +852,15 @@ BP (AD-KEY\(8\))-.35 E/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10 /Courier-Bold@0 SF(zfs-tpm1x-load-key)108 96 Q F0 2.5<8a6c>2.5 G (oad TPM1.X-encrypted ZFS dataset k)-2.5 E -.15(ey)-.1 G F1(SYNOPSIS)72 -112.8 Q F2(zfs-tpm-list)108 124.8 Q F0([)2.5 E F21.666 E F0(])A/F3 -10/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 141.6 Q F0 .191 -(After v)108 153.6 R(erifying)-.15 E F3(dataset)2.691 E F0 -.1(wa)2.691 -G 2.691(se).1 G .191(ncrypted with)-2.691 F F2(tzpfms)2.69 E F0(back) -2.69 E(end)-.1 E F1(TPM1.X)2.69 E F0 .19(will unseal the k)2.69 F .49 --.15(ey a)-.1 H .19(nd load).15 F(it into)108 165.6 Q F3(dataset)2.5 E -F0(.)A .236 +112.8 Q F2(zfs-fido2-change-key)108 124.8 Q F0([)2.5 E F21.666 E +F0(])A/F3 10/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 141.6 +Q F0 .19(After v)108 153.6 R(erifying)-.15 E F3(dataset)2.69 E F0 -.1 +(wa)2.69 G 2.69(se).1 G .19(ncrypted with)-2.69 F F2(tzpfms)2.69 E F0 +(back)2.69 E(end)-.1 E F1(TPM1.X)2.69 E F0 .191(will unseal the k)2.69 F +.491 -.15(ey a)-.1 H .191(nd load).15 F(it into)108 165.6 Q F3(dataset) +2.5 E F0(.)A .236 (The user is \214rst prompted for the SRK passphrase, set when taking o) -108 182.4 R .236(wnership, if not "well-kno)-.25 F .236(wn" \(all)-.25 F +108 182.4 R .236(wnership, if not "well-kno)-.25 F .235(wn" \(all)-.25 F (zeroes\); then for the additional passphrase, set when creating the k) 108 194.4 Q -.15(ey)-.1 G 2.5(,i)-.5 G 2.5(fo)-2.5 G(ne w)-2.5 E (as set.)-.1 E(See)108 211.2 Q/F4 10/Courier@0 SF(zfs-tpm1x-change-key) @@ -600,14 +868,14 @@ F0(.)A .236 109.666 240 Q F0 3.208(Do a no-op/dry run, can be used e)131 240 R -.15(ve)-.25 G 5.708(ni).15 G 5.708(ft)-5.708 G 3.208(he k)-5.708 F 3.508 -.15(ey i)-.1 H 5.708(sa).15 G 3.208(lready loaded.)-5.708 F(Equi) -8.207 E -.25(va)-.25 G 3.207(lent to).25 F F2(zfs)5.707 E(load-key)131 +8.208 E -.25(va)-.25 G 3.208(lent to).25 F F2(zfs)5.708 E(load-key)131 252 Q F0 -.55('s)C F24.716 E F0(option.)2.5 E F1(ENVIR)72 268.8 Q 1.666(ONMENT V)-.3 F(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 -280.8 Q F0 .045(By def)133 292.8 R .045(ault, passphrases are prompted \ -for and read in on the standard output and input streams.)-.1 F(If)5.046 -E F4(TZPFMS_PASSPHRASE_HELPER)133 304.8 Q F0 1.596(is set and nonempty) -4.096 F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F -F4(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 316.8 Q +280.8 Q F0 .046(By def)133 292.8 R .045(ault, passphrases are prompted \ +for and read in on the standard output and input streams.)-.1 F(If)5.045 +E F4(TZPFMS_PASSPHRASE_HELPER)133 304.8 Q F0 1.595(is set and nonempty) +4.095 F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F +F4(/bin/)4.096 E F2 3.262(sh \255c)B F0(to)4.096 E(pro)133 316.8 Q (vide each passphrase, instead.)-.15 E .643 (The standard output stream of the helper is tied to an anon)133 333.6 R .643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) @@ -620,23 +888,23 @@ F4(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 316.8 Q 381.6 Q(w" if this is for a ne)-.25 E 2.5(wp)-.25 G (assphrase, otherwise blank)-2.5 E F4($4)143 393.6 Q F0("ag)160 393.6 Q (ain" if it')-.05 E 2.5(st)-.55 G -(he second prompt for that passphrase, otherwise blank)-2.5 E .178 -(If the helper doesn')133 410.4 R 2.678(te)-.18 G .178 -(xist \(the shell e)-2.828 F .177(xits with)-.15 F F1(127)2.677 E F0 -.177(\), a diagnostic is issued and the normal prompt)B(is used as f)133 +(he second prompt for that passphrase, otherwise blank)-2.5 E .177 +(If the helper doesn')133 410.4 R 2.677(te)-.18 G .177 +(xist \(the shell e)-2.827 F .177(xits with)-.15 F F1(127)2.677 E F0 +.178(\), a diagnostic is issued and the normal prompt)B(is used as f)133 422.4 Q 2.5(all-back. If)-.1 F(it f)2.5 E(ails for an)-.1 E 2.5(yo)-.15 G(ther reason, the prompting is aborted.)-2.5 E F1 1.666 (TPM1.X back-end con\214guration)72 439.2 R .625(TPM selection)87 451.2 -R F0(The)108 463.2 Q F2(tzpfms)2.729 E F0 .229 -(suite connects to a local)2.729 F F4(tcsd)2.73 E F0 .23 -(\(8\) process \(at)B F4(localhost:30003)2.73 E F0 2.73(\)b)C 2.73(yd) --2.73 G(ef)-2.73 E 2.73(ault. Use)-.1 F(the)2.73 E(en)108 475.2 Q -(vironment v)-.4 E(ariable)-.25 E F4(TZPFMS_TPM1X)2.5 E F0 -(to specify a remote TCS hostname.)2.5 E .111(The T)108 492 R(rouSerS) --.35 E F4(tcsd)2.611 E F0 .111(\(8\) daemon will try)B F4(/dev/tpm0)2.61 -E F0 2.61(,t)C(hen)-2.61 E F4(/udev/tpm0)2.61 E F0 2.61(,t)C(hen)-2.61 E -F4(/dev/tpm)2.61 E F0 2.61(;b)C 2.61(yo)-2.61 G(ccu-)-2.61 E -.1(py)108 -504 S(ing one of the earlier ones with, for e).1 E +R F0(The)108 463.2 Q F2(tzpfms)2.73 E F0 .23(suite connects to a local) +2.73 F F4(tcsd)2.73 E F0 .23(\(8\) process \(at)B F4(localhost:30003) +2.729 E F0 2.729(\)b)C 2.729(yd)-2.729 G(ef)-2.729 E 2.729(ault. Use)-.1 +F(the)2.729 E(en)108 475.2 Q(vironment v)-.4 E(ariable)-.25 E F4 +(TZPFMS_TPM1X)2.5 E F0(to specify a remote TCS hostname.)2.5 E .11 +(The T)108 492 R(rouSerS)-.35 E F4(tcsd)2.61 E F0 .11 +(\(8\) daemon will try)B F4(/dev/tpm0)2.61 E F0 2.61(,t)C(hen)-2.61 E F4 +(/udev/tpm0)2.611 E F0 2.611(,t)C(hen)-2.611 E F4(/dev/tpm)2.611 E F0 +2.611(;b)C 2.611(yo)-2.611 G(ccu-)-2.611 E -.1(py)108 504 S +(ing one of the earlier ones with, for e).1 E (xample, shell redirection, a later one can be selected.)-.15 E F1 .625 (See also)87 520.8 R F0(The T)108 532.8 Q (rouSerS project page at https://sourcefor)-.35 E @@ -651,11 +919,11 @@ F4(/dev/tpm)2.61 E F0 2.61(;b)C 2.61(yo)-2.61 G(ccu-)-2.61 E -.1(py)108 F1<83>128 638.4 Q F0(EvModder)7.5 E F1(REPOR)72 655.2 Q 1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 667.2 Q(.ht/\001nabijaczle)-.55 E (weli/tzpfms)-.25 E F4(\001nabijaczleweli/tzpfms@lists.sr.ht)108 684 Q -F0 83.763(,a)C(rchi)-83.763 E -.15(ve)-.25 G 83.762(da).15 G(t)-83.762 E +F0 83.762(,a)C(rchi)-83.762 E -.15(ve)-.25 G 83.763(da).15 G(t)-83.763 E (https://lists.sr)108 696 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(tzpfms 0.3.4-6-g)72 817.889 Q 86.133(a0246cb December)-.05 F(4, 2022) 2.5 E(1)183.842 E 0 Cg EP -%%Page: 1 7 +%%Page: 1 11 %%BeginPageSetup BP %%EndPageSetup @@ -664,112 +932,112 @@ BP F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF (zfs-tpm2-change-key)108 96 Q F0 2.5<8a63>2.5 G(hange ZFS dataset k)-2.5 E .3 -.15(ey t)-.1 H 2.5(oo).15 G(ne stored on the TPM)-2.5 E F1 -(SYNOPSIS)72 112.8 Q F2(zfs-tpm-list)108 124.8 Q F0([)2.5 E F2 -1.666 E/F3 10/Courier-Oblique@0 SF(backup-file)6 E F0 2.5(][)C F2 --.834 E F3(algorithm)6 E F2(:)A F3(PCR)A F0([)A F2(,)A F3(PCR)A F0 1.666 -(]...)C([)186 136.8 Q F2(+)A F3(algorithm)A F2(:)A F3(PCR)A F0([)A F2(,) -A F3(PCR)A F0 1.666(]...)C -3.332 1.666(]... [)-1.666 H F2A F0(]]) -A F3(dataset)2.5 E F1(DESCRIPTION)72 153.6 Q F0 1.676 -.8(To n)108 165.6 -T(ormalise).8 E F3(dataset)2.576 E F0(,)A F2(zfs-tpm-list)2.576 E F0 -.076(will open its encryption root in its stead.)2.576 F F2 -(zfs-tpm-list)5.077 E F0(will)108 177.6 Q/F4 10/Times-Italic@0 SF(ne)2.5 -E(ver)-.15 E F0(create or destro)2.5 E 2.5(ye)-.1 G -(ncryption roots; use)-2.5 E/F5 10/Courier@0 SF(zfs-change-key)2.5 E F0 -(\(8\) for that.)A(First, a connection is made to the TPM, which)108 -194.4 Q F4(must)2.5 E F0(be TPM-2.0-compatible.)2.5 E(If)108 211.2 Q F3 -(dataset)3.055 E F0 -.1(wa)3.055 G 3.055(sp).1 G(re)-3.055 E .555 -(viously encrypted with)-.25 F F2(tzpfms)3.055 E F0 .555(and the)3.055 F -F1(TPM2)3.055 E F0 .554(back-end w)3.054 F .554(as used, the pre)-.1 F -(vious)-.25 E -.1(ke)108 223.2 S 3.059(yw)-.05 G .559 -(ill be freed from the TPM.)-3.059 F .56 +(SYNOPSIS)72 112.8 Q F2(zfs-fido2-change-key)108 124.8 Q F0([)2.5 E F2 +1.666 E/F3 10/Courier-Oblique@0 SF(backup-file)6 E F0 2.5(][)C F2 +-.834 E F3(algorithm)6 E F2(:)A F3(PCR)A F0([)A F2(,)A F3(PCR)A F0 +1.666(]...)C([)234 136.8 Q F2(+)A F3(algorithm)A F2(:)A F3(PCR)A F0([)A +F2(,)A F3(PCR)A F0 1.666(]...)C -3.332 1.666(]... [)-1.666 H F2A +F0(]])A F3(dataset)2.5 E F1(DESCRIPTION)72 153.6 Q F0 4.32 -.8(To n)108 +165.6 T(ormalise).8 E F3(dataset)5.22 E F0(,)A F2(zfs-fido2-change-key) +5.22 E F0 2.719(will open its encryption root in its stead.)5.22 F F2 +(zfs-fido2-change-key)108 177.6 Q F0(will)14.654 E/F4 10/Times-Italic@0 +SF(ne)14.654 E(ver)-.15 E F0 12.154(create or destro)14.654 F 14.655(ye) +-.1 G 12.155(ncryption roots; use)-14.655 F/F5 10/Courier@0 SF +(zfs-change-key)108 189.6 Q F0(\(8\) for that.)A +(First, a connection is made to the TPM, which)108 206.4 Q F4(must)2.5 E +F0(be TPM-2.0-compatible.)2.5 E(If)108 223.2 Q F3(dataset)3.055 E F0 -.1 +(wa)3.055 G 3.055(sp).1 G(re)-3.055 E .555(viously encrypted with)-.25 F +F2(tzpfms)3.055 E F0 .555(and the)3.055 F F1(TPM2)3.055 E F0 .554 +(back-end w)3.054 F .554(as used, the pre)-.1 F(vious)-.25 E -.1(ke)108 +235.2 S 3.059(yw)-.05 G .559(ill be freed from the TPM.)-3.059 F .56 (Otherwise, or in case of an error)5.56 F 3.06(,d)-.4 G .56 (ata required for manual interv)-3.06 F(en-)-.15 E -(tion will be written to the standard error stream.)108 235.2 Q(Ne)108 -252 Q .295(xt, a ne)-.15 F 2.794(ww)-.25 G .294(rapping k)-2.794 F .594 +(tion will be written to the standard error stream.)108 247.2 Q(Ne)108 +264 Q .295(xt, a ne)-.15 F 2.794(ww)-.25 G .294(rapping k)-2.794 F .594 -.15(ey i)-.1 H 2.794(sg).15 G .294 (enerated on the TPM, optionally back)-2.794 F .294(ed up \(see)-.1 F F1 (OPTIONS)2.794 E F0 .294(\), and sealed)B .588 -(to a persistent object on the TPM under the o)108 264 R .589 +(to a persistent object on the TPM under the o)108 276 R .589 (wner hierarch)-.25 F .589(y; if there is a passphrase set on the o)-.05 -F(wner)-.25 E(hierarch)108 276 Q 1.603 -.65(y, t)-.05 H .302 +F(wner)-.25 E(hierarch)108 288 Q 1.603 -.65(y, t)-.05 H .302 (he user is prompted for it; the user is al).65 F -.1(wa)-.1 G .302 (ys prompted for an optional passphrase to protect).1 F -(the sealed object with.)108 288 Q(The follo)108 304.8 Q +(the sealed object with.)108 300 Q(The follo)108 316.8 Q (wing properties are set on)-.25 E F3(dataset)2.5 E F0(:)A F1<83>128 -316.8 Q F5(xyz.nabijaczleweli:tzpfms.backend)7.5 E F0(=)A F1(TPM2)A<83> -128 328.8 Q F5(xyz.nabijaczleweli:tzpfms.key)7.5 E F0(=)A F3 -(persistent-object-ID)A F0([)139 340.8 Q F2(;)A F3(algorithm)A F2(:)A F3 +328.8 Q F5(xyz.nabijaczleweli:tzpfms.backend)7.5 E F0(=)A F1(TPM2)A<83> +128 340.8 Q F5(xyz.nabijaczleweli:tzpfms.key)7.5 E F0(=)A F3 +(persistent-object-ID)A F0([)139 352.8 Q F2(;)A F3(algorithm)A F2(:)A F3 (PCR)A F0([)A F2(,)A F3(PCR)A F0 1.666(]...)C([)-1.666 E F2(+)A F3 (algorithm)A F2(:)A F3(PCR)A F0([)A F2(,)A F3(PCR)A F0 1.666(]...)C -1.666(]...)-1.666 G(])-1.666 E F5(tzpfms.backend)108 357.6 Q F0 1.263 +1.666(]...)-1.666 G(])-1.666 E F5(tzpfms.backend)108 369.6 Q F0 1.263 (identi\214es this dataset for w)3.763 F 1.264(ork with)-.1 F F1(TPM2) 3.764 E F0(-back-ended)A F2(tzpfms)3.764 E F0 1.264(tools \(namely)3.764 -F F5(zfs-tpm2-change-key)108 369.6 Q F0(\(8\),)A F5(zfs-tpm2-load-key) +F F5(zfs-tpm2-change-key)108 381.6 Q F0(\(8\),)A F5(zfs-tpm2-load-key) 2.5 E F0(\(8\), and)A F5(zfs-tpm2-clear-key)2.5 E F0(\(8\)\).)A F5 -(tzpfms.key)108 386.4 Q F0 1.509(is an inte)4.009 F 1.509 +(tzpfms.key)108 398.4 Q F0 1.509(is an inte)4.009 F 1.509 (ger representing the sealed object, optionally follo)-.15 F 1.509 (wed by a semicolon and)-.25 F .822(PCR list as speci\214ed with)108 -398.4 R F24.988 E F0 3.322(,n)C .822(ormalised to be)-3.322 F F2 +410.4 R F24.988 E F0 3.322(,n)C .822(ormalised to be)-3.322 F F2 (tpm-tools)3.322 E F0 .823(-toolchain-compatible; if needed, it can)B -.866(be passed to)108 410.4 R F2 2.532(tpm2_unseal \255c)3.366 F F5 +.866(be passed to)108 422.4 R F2 2.532(tpm2_unseal \255c)3.366 F F5 (${tzpfms.key)6.866 E F2(%%)A F5(;)A/F6 10/Symbol SF(*)A F5(})A F0(with) 3.366 E F25.032 E F0(")6.866 E F5(str:${passphrase})A F0 3.365("o) -C(r)-3.365 E F2109.666 422.4 Q F0(")6.727 E F5(pcr:${tzpfms.key)A +C(r)-3.365 E F2109.666 434.4 Q F0(")6.727 E F5(pcr:${tzpfms.key)A F2(#)A F6(*)A F5(;})A F0 .727(", as the case may be, or equi)B -.25(va) -.25 G .728(lent, for back-up \(see).25 F F1(OPTIONS)3.228 E F0(\).)A -.448(If you ha)108 434.4 R .748 -.15(ve a s)-.2 H .448(ealed k).15 F +.448(If you ha)108 446.4 R .748 -.15(ve a s)-.2 H .448(ealed k).15 F .748 -.15(ey y)-.1 H .448(ou can access with that or equi).15 F -.25(va) -.25 G .447(lent tool and set both of these properties, it).25 F -(will funxion seamlessly)108 446.4 Q(.)-.65 E(Finally)108 463.2 Q 12.005 +(will funxion seamlessly)108 458.4 Q(.)-.65 E(Finally)108 475.2 Q 12.005 (,t)-.65 G 9.505(he equi)-12.005 F -.25(va)-.25 G 9.505(lent of).25 F F2 9.505(zfs change-key)12.005 F17.172 E F5(keylocation=prompt)15.506 -E F217.172 E F5(keyformat=raw)108 475.2 Q F3(dataset)6.107 E F0 +E F217.172 E F5(keyformat=raw)108 487.2 Q F3(dataset)6.107 E F0 .107(is performed with the ne)2.607 F 2.606(wk)-.25 G -.15(ey)-2.706 G 5.106(.I)-.5 G 2.606(fa)-5.106 G 2.606(ne)-2.606 G .106 (rror occurred, best ef)-2.606 F .106(fort is made)-.25 F .289(to clean\ up the persistent object and properties, or to issue a note for manual\ - interv)108 487.2 R .29(ention into the stan-)-.15 F(dard error stream.) -108 499.2 Q 2.625<418c>108 516 S .125(nal v)-2.625 F .125 + interv)108 499.2 R .29(ention into the stan-)-.15 F(dard error stream.) +108 511.2 Q 2.625<418c>108 528 S .125(nal v)-2.625 F .125 (eri\214cation should be made by running)-.15 F F2 1.79 (zfs-tpm2-load-key \255n)2.624 F F3(dataset)6.124 E F0 5.124(.I)C 2.624 (ft)-5.124 G .124(hat com-)-2.624 F .506(mand succeeds, all is well, b) -108 528 R .506(ut otherwise the dataset can be manually rolled back to \ -a passphrase with)-.2 F F2(zfs-tpm2-clear-key)108 540 Q F3(dataset) +108 540 R .506(ut otherwise the dataset can be manually rolled back to \ +a passphrase with)-.2 F F2(zfs-tpm2-clear-key)108 552 Q F3(dataset) 11.539 E F0(\(or)8.039 E 8.039(,i)-.4 G 8.039(ft)-8.039 G 5.539(hat f) -8.039 F 5.539(ails to w)-.1 F(ork,)-.1 E F2 5.539(zfs change-key)8.039 -F13.204 E F5(keyformat=passphrase)108 552 Q F3(dataset)6 E F0 +F13.204 E F5(keyformat=passphrase)108 564 Q F3(dataset)6 E F0 (\), and you are hereby ask)A(ed to report a b)-.1 E(ug, please.)-.2 E -F2(zfs-tpm2-clear-key)108 568.8 Q F3(dataset)6.029 E F0 .029 +F2(zfs-tpm2-clear-key)108 580.8 Q F3(dataset)6.029 E F0 .029 (can be used to free the TPM persistent object and go back to us-)2.529 -F(ing a passphrase.)108 580.8 Q F1(OPTIONS)72 597.6 Q F2109.666 -609.6 Q F3(backup-file)6 E F0(Sa)203 609.6 Q .353 -.15(ve a b)-.2 H .052 +F(ing a passphrase.)108 592.8 Q F1(OPTIONS)72 609.6 Q F2109.666 +621.6 Q F3(backup-file)6 E F0(Sa)203 621.6 Q .353 -.15(ve a b)-.2 H .052 (ack-up of the k).15 F .352 -.15(ey t)-.1 H(o).15 E F3(backup-file)2.552 E F0 2.552(,w)C .052(hich must not e)-2.552 F .052(xist beforehand.)-.15 -F .693(This back-up)203 621.6 R F4(must)3.193 E F0 .694 +F .693(This back-up)203 633.6 R F4(must)3.193 E F0 .694 (be stored securely)3.193 F 3.194(,o)-.65 G -.25(ff)-3.194 G 3.194 (-site. In).25 F .694(case of a catastrophic e)3.194 F -.15(ve)-.25 G -(nt,).15 E(the k)203 633.6 Q .3 -.15(ey c)-.1 H(an be loaded by running) -.15 E F2(zfs load-key)233 645.6 Q F3(dataset)6 E F5(<)6 E F3 -(backup-file)6 E F2109.666 662.4 Q F3(algorithm)6 E F2(:)A F3(PCR) +(nt,).15 E(the k)203 645.6 Q .3 -.15(ey c)-.1 H(an be loaded by running) +.15 E F2(zfs load-key)233 657.6 Q F3(dataset)6 E F5(<)6 E F3 +(backup-file)6 E F2109.666 674.4 Q F3(algorithm)6 E F2(:)A F3(PCR) A F0([)A F2(,)A F3(PCR)A F0 1.666(]...)C([)-1.666 E F2(+)A F3(algorithm) A F2(:)A F3(PCR)A F0([)A F2(,)A F3(PCR)A F0 1.666(]...)C 1.666(]...) --1.666 G 1.425(Bind the k)203 674.4 R 1.725 -.15(ey t)-.1 H 3.925(os).15 +-1.666 G 1.425(Bind the k)203 686.4 R 1.725 -.15(ey t)-.1 H 3.925(os).15 G 1.425(pace- or comma-separated)-3.925 F F3(PCR)3.924 E F0 3.924(sw)C -1.424(ithin their corresponding)-3.924 F(hashing)203 686.4 Q F3 +1.424(ithin their corresponding)-3.924 F(hashing)203 698.4 Q F3 (algorithm)2.523 E F0 2.523<8a69>2.523 G 2.523(ft)-2.523 G(he)-2.523 E 2.523(yc)-.15 G .023(hange, the wrapping k)-2.523 F .323 -.15(ey w)-.1 H -.024(ill not be able to be).15 F 2.5(unsealed. There)203 698.4 R(are)2.5 +.024(ill not be able to be).15 F 2.5(unsealed. There)203 710.4 R(are)2.5 E F1(24)2.5 E F0(PCRs, numbered [)2.5 E F1(0)A F0(,)A F1(23)2.5 E F0(].) -A F3(algorithm)203 715.2 Q F0 2.968(may be an)5.469 F 5.468(yo)-.15 G +A F3(algorithm)203 727.2 Q F0 2.968(may be an)5.469 F 5.468(yo)-.15 G 5.468(fc)-5.468 G(ase-insensiti)-5.468 E 3.268 -.15(ve ")-.25 H F1(sha1) .15 E F0 2.968(", ")B F1(sha256)A F0 2.968(", ")B F1(sha384)A F0(",)A(") -203 727.2 Q F1(sha512)A F0 4.983(", ")B F1(sm3_256)A F0 4.983(", ")B F1 +203 739.2 Q F1(sha512)A F0 4.983(", ")B F1(sm3_256)A F0 4.983(", ")B F1 (sm3-256)A F0 4.983(", ")B F1(sha3_256)A F0 4.983(", ")B F1(sha3-256)A -F0 4.983(", ")B F1(sha3_384)A F0(",)A(")203 739.2 Q F1(sha3-384)A F0 +F0 4.983(", ")B F1(sha3_384)A F0(",)A(")203 751.2 Q F1(sha3-384)A F0 (", ")A F1(sha3_512)A F0(", or ")A F1(sha3-512)A F0 (", and must be supported by the TPM.)A(tzpfms 0.3.4-6-g)72 817.889 Q 86.128(a0246cb February)-.05 F(28, 2024)2.5 E(1)183.837 E 0 Cg EP -%%Page: 2 8 +%%Page: 2 12 %%BeginPageSetup BP %%EndPageSetup @@ -847,7 +1115,7 @@ E F3 1.666(SEE ALSO)72 616.8 R F4(tpm2_unseal)108 628.8 Q F0(\(1\))A r_TPM_2p0_Systems_v51.pdf, Section 2.3.4 "PCR Usage", T)108 669.6 Q (able)-.8 E(1.)108 681.6 Q(tzpfms 0.3.4-6-g)72 817.889 Q 86.128 (a0246cb February)-.05 F(28, 2024)2.5 E(2)183.837 E 0 Cg EP -%%Page: 1 9 +%%Page: 1 13 %%BeginPageSetup BP %%EndPageSetup @@ -857,8 +1125,8 @@ F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF (zfs-tpm2-clear-key)108 96 Q F0 2.5<8a72>2.5 G -.25(ew)-2.5 G (rap ZFS dataset k).25 E .3 -.15(ey i)-.1 H 2.5(np).15 G(asssw)-2.5 E (ord and clear tzpfms TPM2 metadata)-.1 E F1(SYNOPSIS)72 112.8 Q F2 -(zfs-tpm-list)108 124.8 Q/F3 10/Courier-Oblique@0 SF(dataset)2.5 E F1 -(DESCRIPTION)72 141.6 Q F0(After v)108 153.6 Q(erifying)-.15 E F3 +(zfs-fido2-change-key)108 124.8 Q/F3 10/Courier-Oblique@0 SF(dataset)2.5 +E F1(DESCRIPTION)72 141.6 Q F0(After v)108 153.6 Q(erifying)-.15 E F3 (dataset)2.5 E F0 -.1(wa)2.5 G 2.5(se).1 G(ncrypted with)-2.5 E F2 (tzpfms)2.5 E F0(back)2.5 E(end)-.1 E F1(TPM2)2.5 E F0(:)A 5 (1. performs)118 165.6 R 5.641(the equi)8.141 F -.25(va)-.25 G 5.641 @@ -928,7 +1196,7 @@ F0 83.763(,a)C(rchi)-83.763 E -.15(ve)-.25 G 83.762(da).15 G(t)-83.762 E (https://lists.sr)108 710.4 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.) -.25 E(tzpfms 0.3.4-6-g)72 817.889 Q 86.133(a0246cb December)-.05 F (4, 2022)2.5 E(1)183.842 E 0 Cg EP -%%Page: 1 10 +%%Page: 1 14 %%BeginPageSetup BP %%EndPageSetup @@ -937,23 +1205,23 @@ BP (AD-KEY\(8\))-.35 E/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10 /Courier-Bold@0 SF(zfs-tpm2-load-key)108 96 Q F0 2.5<8a6c>2.5 G (oad TPM2-encrypted ZFS dataset k)-2.5 E -.15(ey)-.1 G F1(SYNOPSIS)72 -112.8 Q F2(zfs-tpm-list)108 124.8 Q F0([)2.5 E F21.666 E F0(])A/F3 -10/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 141.6 Q F0 .864 -(After v)108 153.6 R(erifying)-.15 E F3(dataset)3.364 E F0 -.1(wa)3.364 -G 3.364(se).1 G .864(ncrypted with)-3.364 F F2(tzpfms)3.365 E F0(back) -3.365 E(end)-.1 E F1(TPM2)3.365 E F0 3.365(,u)C .865(nseals the k)-3.365 -F 1.165 -.15(ey a)-.1 H .865(nd loads it).15 F(into)108 165.6 Q F3 -(dataset)2.5 E F0(.)A(The user is prompted for the additional passphras\ -e, set when creating the k)108 182.4 Q -.15(ey)-.1 G 2.5(,i)-.5 G 2.5 -(fo)-2.5 G(ne w)-2.5 E(as set.)-.1 E(See)108 199.2 Q/F4 10/Courier@0 SF -(zfs-tpm2-change-key)2.5 E F0(\(8\) for a detailed description.)A F1 -(OPTIONS)72 216 Q F2109.666 228 Q F0 3.208 -(Do a no-op/dry run, can be used e)131 228 R -.15(ve)-.25 G 5.708(ni).15 -G 5.708(ft)-5.708 G 3.208(he k)-5.708 F 3.508 -.15(ey i)-.1 H 5.708(sa) -.15 G 3.208(lready loaded.)-5.708 F(Equi)8.207 E -.25(va)-.25 G 3.207 -(lent to).25 F F2(zfs)5.707 E(load-key)131 240 Q F0 -.55('s)C F2 -4.716 E F0(option.)2.5 E F1(ENVIR)72 256.8 Q 1.666(ONMENT V)-.3 F -(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 268.8 Q F0 .045 +112.8 Q F2(zfs-fido2-change-key)108 124.8 Q F0([)2.5 E F21.666 E +F0(])A/F3 10/Courier-Oblique@0 SF(dataset)2.5 E F1(DESCRIPTION)72 141.6 +Q F0 .864(After v)108 153.6 R(erifying)-.15 E F3(dataset)3.364 E F0 -.1 +(wa)3.364 G 3.364(se).1 G .864(ncrypted with)-3.364 F F2(tzpfms)3.365 E +F0(back)3.365 E(end)-.1 E F1(TPM2)3.365 E F0 3.365(,u)C .865 +(nseals the k)-3.365 F 1.165 -.15(ey a)-.1 H .865(nd loads it).15 F +(into)108 165.6 Q F3(dataset)2.5 E F0(.)A(The user is prompted for the \ +additional passphrase, set when creating the k)108 182.4 Q -.15(ey)-.1 G +2.5(,i)-.5 G 2.5(fo)-2.5 G(ne w)-2.5 E(as set.)-.1 E(See)108 199.2 Q/F4 +10/Courier@0 SF(zfs-tpm2-change-key)2.5 E F0 +(\(8\) for a detailed description.)A F1(OPTIONS)72 216 Q F2109.666 +228 Q F0 3.208(Do a no-op/dry run, can be used e)131 228 R -.15(ve)-.25 +G 5.708(ni).15 G 5.708(ft)-5.708 G 3.208(he k)-5.708 F 3.508 -.15(ey i) +-.1 H 5.708(sa).15 G 3.208(lready loaded.)-5.708 F(Equi)8.207 E -.25(va) +-.25 G 3.207(lent to).25 F F2(zfs)5.707 E(load-key)131 240 Q F0 -.55('s) +C F24.716 E F0(option.)2.5 E F1(ENVIR)72 256.8 Q 1.666(ONMENT V) +-.3 F(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 268.8 Q F0 .045 (By def)133 280.8 R .045(ault, passphrases are prompted for and read in\ on the standard output and input streams.)-.1 F(If)5.046 E F4 (TZPFMS_PASSPHRASE_HELPER)133 292.8 Q F0 1.596(is set and nonempty)4.096 diff --git a/zfs-fido2-change-key.8 b/zfs-fido2-change-key.8 new file mode 100644 index 0000000..6ac1dcc --- /dev/null +++ b/zfs-fido2-change-key.8 @@ -0,0 +1,186 @@ +.\" SPDX-License-Identifier: MIT +. +.Dd February 28, 2024 +.ds doc-volume-operating-system +.Dt ZFS-FIDO2-CHANGE-KEY 8 +.Os fzifdso 0 +. +.Sh NAME +.Nm zfs-fido2-change-key +.Nd change ZFS dataset key to one authenticated by a FIDO2 device +.Sh SYNOPSIS +.Nm +.Op Fl b Ar backup-file +.Ar dataset +. +.Sh DESCRIPTION +To normalise the +.Ar dataset , +.Nm +will open its encryption root in its stead. +.Nm +will +.Em never +create or destroy encryption roots; use +.Xr zfs-change-key 8 +for that. +.Pp +First, a connection is made to the FIDO2 device, which +.Em must +be support the +.Ql hmac-secret +extension. +.Pp +If +.Ar dataset +was previously encrypted with +.Nm fzifdso +and the +.Sy FIDO2 +back-end was used, the metadata will be silently cleared. +Otherwise, or in case of an error, data required for manual intervention will be written to the standard error stream. +.Pp +Next, a new credential of type ES256 is generated on the device (with relying party ID +.Li fzifdso +and name equal to the dataset name) +with the +.Ql hmac-secret +extension requested; the device PIN, if any, is prompted for here. +This mimicks a WebAuthn registration step. +.Pp +Then, the credential is asserted with a 32-byte random salt, +which hashes it with device-private data, and thus generates the wrapping key +.Pq which is optionally backed up Pq see Sx OPTIONS . +This mimicks a WebAuthn login step. +.Pp +The following properties are set on +.Ar dataset : +.Bl -bullet -compact -offset 4n -width "@" +.It +.Li xyz.nabijaczleweli:tzpfms.backend Ns = Ns Sy FIDO2 +.It +.Li xyz.nabijaczleweli:tzpfms.key Ns = Ns Ar salt Ns Cm \&:\:\& Ns Ar credential-ID Ns Cm \&:\:\& Ns Ar credential-public-key +.El +.Pp +.Li tzpfms.backend +identifies this dataset for work with +.Sy FIDO2 Ns -back-ended +.Nm tzpfms +tools +.Pq i.e. Nm fzifdso Xr zfs-fido2-change-key 8 , Xr zfs-fido2-load-key 8 , and Xr zfs-fido2-clear-key 8 . +.Pp +.Li tzpfms.key +is a colon-separated tuple of unpadded URL-safe base64 blobs; +the first one is the random salt; +the second represents the ID of created credential, +and the third \(en its public key. +There exists no other user-land tool for deciphering this; perhaps there should be. +.\"" TODO: make an LD_PRELOADable for extracting the key maybe? +.Pp +Finally, the equivalent of +.Nm zfs Cm change-key Fl o Li keylocation=prompt Fl o Li keyformat=raw Ar dataset +is performed with the new key. +If an error occurred, best effort is made to clean up the properties, +or to issue a note for manual intervention into the standard error stream. +.Pp +A final verification should be made by running +.Nm zfs-fido2-load-key Fl n Ar dataset . +If that command succeeds, all is well, +but otherwise the dataset can be manually rolled back to a passphrase with +.Nm zfs-fido2-clear-key Ar dataset +.Pq or, if that fails to work, Nm zfs Cm change-key Fl o Li keyformat=passphrase Ar dataset , +and you are hereby asked to report a bug, please. +.Pp +.Nm zfs-fido2-clear-key Ar dataset +can be used to clear the properties and go back to using a passphrase. +. +.Sh OPTIONS +.Bl -tag -compact -width ".Fl b Ar backup-file" +.It Fl b Ar backup-file +Save a back-up of the key to +.Ar backup-file , +which must not exist beforehand. +This back-up +.Em must +be stored securely, off-site. +In case of a catastrophic event, the key can be loaded by running +.Dl Nm zfs Cm load-key Ar dataset Li < Ar backup-file +.El +. +.\" SPDX-License-Identifier: MIT +. +.Sh ENVIRONMENT VARIABLES +.Bl -tag -compact -width 4n +.It Ev TZPFMS_PASSPHRASE_HELPER +By default, passphrases are prompted for and read in on the standard output and input streams. +If +.Ev TZPFMS_PASSPHRASE_HELPER +is set and nonempty, it will be run via +.Pa /bin/ Ns Nm sh Fl c +to provide each passphrase, instead. +.Pp +The standard output stream of the helper is tied to an anonymous file and used in its entirety as the passphrase, except for a trailing new-line, if any. +The arguments are: +.Bl -tag -compact -offset 2n -width ".Li $1" +.It Li $1 +Pre-formatted noun phrase with all the information below, for use as a prompt +.\" Passphrase for tarta-zoot +.\" New passphrase for tarta-zoot (again) +.It Li $2 +Either the dataset name or the element of the TPM hierarchy being prompted for +.It Li $3 +.Qq new +if this is for a new passphrase, otherwise blank +.It Li $4 +.Qq again +if it's the second prompt for that passphrase, otherwise blank +.El +.Pp +If the helper doesn't exist +.Pq the shell exits with Sy 127 , +a diagnostic is issued and the normal prompt is used as fall-back. +If it fails for any other reason, the prompting is aborted. +. +. +.El +. +.\" SPDX-License-Identifier: MIT +. +.Sh FIDO2 back-end configuration +.Ss Environment variables +.Bl -tag -compact -width ".Ev FIDO_DEBUG" +.It Ev FIDO_DEBUG +If set, enables libfido2 debug logging to the standard error stream. +.El +. +.Ss Device selection +When creating, the first device which supports the +.Ql hmac-secret +extension is used. +When loading, the assertion is shopped around to every such device. +. +.Ss See also +The libfido2 documentation at +.Lk https:/\&/developers.yubico.com/libfido2/ . +. +.\" SPDX-License-Identifier: MIT +. +.Sh SPECIAL THANKS +To all who support further development, in particular: +.Bl -bullet -offset 4n -compact -width "@" +.It +ThePhD +.It +Embark Studios +.It +Jasper Bekkers +.It +EvModder +.El +. +.Sh REPORTING BUGS +.Lk https:/\&/todo.sr.ht/\(tinabijaczleweli/fzifdso +.Pp +.Mt \(tinabijaczleweli/tzpfms@lists.sr.ht , +archived at +.Lk https:/\&/lists.sr.ht/\(tinabijaczleweli/tzpfms . diff --git a/zfs-fido2-change-key.8.html b/zfs-fido2-change-key.8.html new file mode 100644 index 0000000..ef9d309 --- /dev/null +++ b/zfs-fido2-change-key.8.html @@ -0,0 +1,205 @@ + + + + + + + + ZFS-FIDO2-CHANGE-KEY(8) + + + + + + + + +
ZFS-FIDO2-CHANGE-KEY(8)System Manager's ManualZFS-FIDO2-CHANGE-KEY(8)
+
+
+

+

zfs-fido2-change-key — + change ZFS dataset key to one authenticated by a FIDO2 + device

+
+
+

+ + + + + +
zfs-fido2-change-key[-b backup-file] + dataset
+
+
+

+

To normalise the dataset, + zfs-fido2-change-key will open its encryption root + in its stead. zfs-fido2-change-key will + + create or destroy encryption roots; use + zfs-change-key(8) + for that.

+

First, a connection is made to the FIDO2 device, which + must be support the + ‘hmac-secret’ extension.

+

If dataset was previously encrypted with + fzifdso and the FIDO2 back-end was + used, the metadata will be silently cleared. Otherwise, or in case of an + error, data required for manual intervention will be written to the standard + error stream.

+

Next, a new credential of type ES256 is generated on the device + (with relying party ID fzifdso and name equal to the + dataset name) with the ‘hmac-secret’ + extension requested; the device PIN, if any, is prompted for here. This + mimicks a WebAuthn registration step.

+

Then, the credential is asserted with a 32-byte random salt, which + hashes it with device-private data, and thus generates the wrapping key + (which is optionally backed up (see + OPTIONS)). This mimicks a WebAuthn login + step.

+

The following properties are set on + dataset:

+ +

tzpfms.backend identifies this dataset for + work with FIDO2-back-ended tzpfms + tools (i.e. fzifdso + zfs-fido2-change-key(8), + zfs-fido2-load-key(8), + and + zfs-fido2-clear-key(8)).

+

tzpfms.key is a colon-separated tuple of + unpadded URL-safe base64 blobs; the first one is the random salt; the second + represents the ID of created credential, and the third – its public + key. There exists no other user-land tool for deciphering this; perhaps + there should be.

+

Finally, the equivalent of zfs + change-key -o + keylocation=prompt -o + keyformat=raw dataset is + performed with the new key. If an error occurred, best effort is made to + clean up the properties, or to issue a note for manual intervention into the + standard error stream.

+

A final verification should be made by running + zfs-fido2-load-key -n + dataset. If that command succeeds, all is well, but + otherwise the dataset can be manually rolled back to a passphrase with + zfs-fido2-clear-key dataset + (or, if that fails to work, zfs + change-key -o + keyformat=passphrase dataset), + and you are hereby asked to report a bug, please.

+

zfs-fido2-clear-key + dataset can be used to clear the properties and go + back to using a passphrase.

+
+
+

+
+
+ backup-file
+
Save a back-up of the key to backup-file, which must + not exist beforehand. This back-up must be stored + securely, off-site. In case of a catastrophic event, the key can be loaded + by running +
zfs + load-key dataset + < + backup-file
+
+
+
+
+

+
+
+
By default, passphrases are prompted for and read in on the standard + output and input streams. If + TZPFMS_PASSPHRASE_HELPER is set and nonempty, it + will be run via /bin/sh + -c to provide each passphrase, instead. +

The standard output stream of the helper is tied to an + anonymous file and used in its entirety as the passphrase, except for a + trailing new-line, if any. The arguments are:

+
+
+
+
Pre-formatted noun phrase with all the information below, for use as a + prompt
+
+
Either the dataset name or the element of the TPM hierarchy being + prompted for
+
+
"new" if this is for a new passphrase, otherwise blank
+
+
"again" if it's the second prompt for that passphrase, + otherwise blank
+
+
+

If the helper doesn't exist (the shell exits with + ), a + diagnostic is issued and the normal prompt is used as fall-back. If it + fails for any other reason, the prompting is aborted.

+
+
+
+
+

+
+

+
+
+
If set, enables libfido2 debug logging to the standard error stream.
+
+
+
+

+

When creating, the first device which supports the + ‘hmac-secret’ extension is used. When + loading, the assertion is shopped around to every such device.

+
+
+

+

The libfido2 documentation at + https://developers.yubico.com/libfido2/.

+
+
+
+

+

To all who support further development, in particular:

+
    +
  • ThePhD
  • +
  • Embark Studios
  • +
  • Jasper Bekkers
  • +
  • EvModder
  • +
+
+
+

+

https://todo.sr.ht/~nabijaczleweli/fzifdso

+

~nabijaczleweli/tzpfms@lists.sr.ht, + archived at + https://lists.sr.ht/~nabijaczleweli/tzpfms.

+
+
+ + + + + +
February 28, 2024fzifdso 0
+ + diff --git a/zfs-fido2-clear-key.8 b/zfs-fido2-clear-key.8 new file mode 100644 index 0000000..dd2a76c --- /dev/null +++ b/zfs-fido2-clear-key.8 @@ -0,0 +1,113 @@ +.\" SPDX-License-Identifier: MIT +. +.Dd February 28, 2024 +.ds doc-volume-operating-system +.Dt ZFS-FIDO2-CLEAR-KEY 8 +.Os fzifdso 0 +. +.Sh NAME +.Nm zfs-fido2-clear-key +.Nd rewrap ZFS dataset key in passsword and clear tzpfms FIDO2 metadata +.Sh SYNOPSIS +.Nm +.Ar dataset +. +.Sh DESCRIPTION +After verifying +.Ar dataset +was encrypted with +.Nm tzpfms +backend +.Sy FIDO2 : +.Bl -enum -compact -offset 2n -width 2n +.It +performs the equivalent of +.Nm zfs Cm change-key Fl o Li keylocation=prompt Fl o Li keyformat=passphrase Ar dataset , +.It +removes the +.Li xyz.nabijaczleweli:tzpfms.\& Ns Brq Li backend , key +properties from +.Ar dataset . +.El +.Pp +See +.Xr zfs-fido2-change-key 8 +for a detailed description. +. +.\" SPDX-License-Identifier: MIT +. +.Sh ENVIRONMENT VARIABLES +.Bl -tag -compact -width 4n +.It Ev TZPFMS_PASSPHRASE_HELPER +By default, passphrases are prompted for and read in on the standard output and input streams. +If +.Ev TZPFMS_PASSPHRASE_HELPER +is set and nonempty, it will be run via +.Pa /bin/ Ns Nm sh Fl c +to provide each passphrase, instead. +.Pp +The standard output stream of the helper is tied to an anonymous file and used in its entirety as the passphrase, except for a trailing new-line, if any. +The arguments are: +.Bl -tag -compact -offset 2n -width ".Li $1" +.It Li $1 +Pre-formatted noun phrase with all the information below, for use as a prompt +.\" Passphrase for tarta-zoot +.\" New passphrase for tarta-zoot (again) +.It Li $2 +Either the dataset name or the element of the TPM hierarchy being prompted for +.It Li $3 +.Qq new +if this is for a new passphrase, otherwise blank +.It Li $4 +.Qq again +if it's the second prompt for that passphrase, otherwise blank +.El +.Pp +If the helper doesn't exist +.Pq the shell exits with Sy 127 , +a diagnostic is issued and the normal prompt is used as fall-back. +If it fails for any other reason, the prompting is aborted. +. +. +.El +. +.\" SPDX-License-Identifier: MIT +. +.Sh FIDO2 back-end configuration +.Ss Environment variables +.Bl -tag -compact -width ".Ev FIDO_DEBUG" +.It Ev FIDO_DEBUG +If set, enables libfido2 debug logging to the standard error stream. +.El +. +.Ss Device selection +When creating, the first device which supports the +.Ql hmac-secret +extension is used. +When loading, the assertion is shopped around to every such device. +. +.Ss See also +The libfido2 documentation at +.Lk https:/\&/developers.yubico.com/libfido2/ . +. +.\" SPDX-License-Identifier: MIT +. +.Sh SPECIAL THANKS +To all who support further development, in particular: +.Bl -bullet -offset 4n -compact -width "@" +.It +ThePhD +.It +Embark Studios +.It +Jasper Bekkers +.It +EvModder +.El +. +.Sh REPORTING BUGS +.Lk https:/\&/todo.sr.ht/\(tinabijaczleweli/fzifdso +.Pp +.Mt \(tinabijaczleweli/tzpfms@lists.sr.ht , +archived at +.Lk https:/\&/lists.sr.ht/\(tinabijaczleweli/tzpfms . diff --git a/zfs-fido2-clear-key.8.html b/zfs-fido2-clear-key.8.html new file mode 100644 index 0000000..46e553e --- /dev/null +++ b/zfs-fido2-clear-key.8.html @@ -0,0 +1,143 @@ + + + + + + + + ZFS-FIDO2-CLEAR-KEY(8) + + + + + + + + +
ZFS-FIDO2-CLEAR-KEY(8)System Manager's ManualZFS-FIDO2-CLEAR-KEY(8)
+
+
+

+

zfs-fido2-clear-key — + rewrap ZFS dataset key in passsword and clear tzpfms FIDO2 + metadata

+
+
+

+ + + + + +
zfs-fido2-clear-keydataset
+
+
+

+

After verifying dataset was encrypted with + tzpfms backend + :

+
    +
  1. performs the equivalent of zfs + change-key -o + keylocation=prompt -o + keyformat=passphrase + dataset,
  2. +
  3. removes the + xyz.nabijaczleweli:tzpfms.{backend, + key} properties from + dataset.
  4. +
+

See + zfs-fido2-change-key(8) + for a detailed description.

+
+
+

+
+
+
By default, passphrases are prompted for and read in on the standard + output and input streams. If + TZPFMS_PASSPHRASE_HELPER is set and nonempty, it + will be run via /bin/sh + -c to provide each passphrase, instead. +

The standard output stream of the helper is tied to an + anonymous file and used in its entirety as the passphrase, except for a + trailing new-line, if any. The arguments are:

+
+
+
+
Pre-formatted noun phrase with all the information below, for use as a + prompt
+
+
Either the dataset name or the element of the TPM hierarchy being + prompted for
+
+
"new" if this is for a new passphrase, otherwise blank
+
+
"again" if it's the second prompt for that passphrase, + otherwise blank
+
+
+

If the helper doesn't exist (the shell exits with + ), a + diagnostic is issued and the normal prompt is used as fall-back. If it + fails for any other reason, the prompting is aborted.

+
+
+
+
+

+
+

+
+
+
If set, enables libfido2 debug logging to the standard error stream.
+
+
+
+

+

When creating, the first device which supports the + ‘hmac-secret’ extension is used. When + loading, the assertion is shopped around to every such device.

+
+
+

+

The libfido2 documentation at + https://developers.yubico.com/libfido2/.

+
+
+
+

+

To all who support further development, in particular:

+
    +
  • ThePhD
  • +
  • Embark Studios
  • +
  • Jasper Bekkers
  • +
  • EvModder
  • +
+
+
+

+

https://todo.sr.ht/~nabijaczleweli/fzifdso

+

~nabijaczleweli/tzpfms@lists.sr.ht, + archived at + https://lists.sr.ht/~nabijaczleweli/tzpfms.

+
+
+ + + + + +
February 28, 2024fzifdso 0
+ + diff --git a/zfs-fido2-load-key.8 b/zfs-fido2-load-key.8 new file mode 100644 index 0000000..247ca04 --- /dev/null +++ b/zfs-fido2-load-key.8 @@ -0,0 +1,98 @@ +.\" SPDX-License-Identifier: MIT +. +.Dd February 28, 2024 +.ds doc-volume-operating-system +.Dt ZFS-FIDO2-LOAD-KEY 8 +.Os fzifdso 0 +. +.Sh NAME +.Nm zfs-fido2-load-key +.Nd load FIDO2-encrypted ZFS dataset key +.Sh SYNOPSIS +.Nm +.Op Fl n +.Ar dataset +. +.Sh DESCRIPTION +After verifying +.Ar dataset +was encrypted with +.Nm tzpfms +backend +.Sy FIDO2 , +asserts the preserved challenge, HMACking the salt with the on-device secret, and loads the resulting key into +.Ar dataset . +.Pp +See +.Xr zfs-fido2-change-key 8 +for a detailed description. +. +.Sh OPTIONS +.Bl -tag -compact -width ".Fl n" +.It Fl n +Do a no-op/dry run, can be used even if the key is already loaded. +Equivalent to +.Nm zfs Cm load-key Ns 's +.Fl n +option. +.El +. +.\" SPDX-License-Identifier: MIT +. +.Sh ENVIRONMENT VARIABLES +.Bl -tag -compact -width 4n +.It Ev TZPFMS_PASSPHRASE_HELPER +By default, passphrases are prompted for and read in on the standard output and input streams. +If +.Ev TZPFMS_PASSPHRASE_HELPER +is set and nonempty, it will be run via +.Pa /bin/ Ns Nm sh Fl c +to provide each passphrase, instead. +.Pp +The standard output stream of the helper is tied to an anonymous file and used in its entirety as the passphrase, except for a trailing new-line, if any. +The arguments are: +.Bl -tag -compact -offset 2n -width ".Li $1" +.It Li $1 +Pre-formatted noun phrase with all the information below, for use as a prompt +.\" Passphrase for tarta-zoot +.\" New passphrase for tarta-zoot (again) +.It Li $2 +Either the dataset name or the element of the TPM hierarchy being prompted for +.It Li $3 +.Qq new +if this is for a new passphrase, otherwise blank +.It Li $4 +.Qq again +if it's the second prompt for that passphrase, otherwise blank +.El +.Pp +If the helper doesn't exist +.Pq the shell exits with Sy 127 , +a diagnostic is issued and the normal prompt is used as fall-back. +If it fails for any other reason, the prompting is aborted. +. +. +.El +. +. +.\" SPDX-License-Identifier: MIT +. +.Sh SPECIAL THANKS +To all who support further development, in particular: +.Bl -bullet -offset 4n -compact -width "@" +.It +ThePhD +.It +Embark Studios +.It +Jasper Bekkers +.It +EvModder +.El +. +.Sh REPORTING BUGS +.Lk https:/\&/todo.sr.ht/\(tinabijaczleweli/fzifdso +.Pp +.Mt \(tinabijaczleweli/tzpfms@lists.sr.ht , +archived at +.Lk https:/\&/lists.sr.ht/\(tinabijaczleweli/tzpfms . diff --git a/zfs-fido2-load-key.8.html b/zfs-fido2-load-key.8.html new file mode 100644 index 0000000..ffc6446 --- /dev/null +++ b/zfs-fido2-load-key.8.html @@ -0,0 +1,117 @@ + + + + + + + + ZFS-FIDO2-LOAD-KEY(8) + + + + + + + + +
ZFS-FIDO2-LOAD-KEY(8)System Manager's ManualZFS-FIDO2-LOAD-KEY(8)
+
+
+

+

zfs-fido2-load-key — + load FIDO2-encrypted ZFS dataset key

+
+
+

+ + + + + +
zfs-fido2-load-key[-n] dataset
+
+
+

+

After verifying dataset was encrypted with + tzpfms backend + , + asserts the preserved challenge, HMACking the salt with the on-device + secret, and loads the resulting key into dataset.

+

See + zfs-fido2-change-key(8) + for a detailed description.

+
+
+

+
+
+
Do a no-op/dry run, can be used even if the key is already loaded. + Equivalent to zfs + load-key's -n option.
+
+
+
+

+
+
+
By default, passphrases are prompted for and read in on the standard + output and input streams. If + TZPFMS_PASSPHRASE_HELPER is set and nonempty, it + will be run via /bin/sh + -c to provide each passphrase, instead. +

The standard output stream of the helper is tied to an + anonymous file and used in its entirety as the passphrase, except for a + trailing new-line, if any. The arguments are:

+
+
+
+
Pre-formatted noun phrase with all the information below, for use as a + prompt
+
+
Either the dataset name or the element of the TPM hierarchy being + prompted for
+
+
"new" if this is for a new passphrase, otherwise blank
+
+
"again" if it's the second prompt for that passphrase, + otherwise blank
+
+
+

If the helper doesn't exist (the shell exits with + ), a + diagnostic is issued and the normal prompt is used as fall-back. If it + fails for any other reason, the prompting is aborted.

+
+
+
+
+

+

To all who support further development, in particular:

+
    +
  • ThePhD
  • +
  • Embark Studios
  • +
  • Jasper Bekkers
  • +
  • EvModder
  • +
+
+
+

+

https://todo.sr.ht/~nabijaczleweli/fzifdso

+

~nabijaczleweli/tzpfms@lists.sr.ht, + archived at + https://lists.sr.ht/~nabijaczleweli/tzpfms.

+
+
+ + + + + +
February 28, 2024fzifdso 0
+ +