From 8841b46e8ef615f706136fcca8e936508d1dbe48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1=20autouploader?= Date: Tue, 5 Mar 2024 21:51:06 +0000 Subject: [PATCH] Manpage update by job 1162459 --- tzpfms.pdf | Bin 65827 -> 81695 bytes tzpfms.ps | 951 +++++++++++++++++++++++++----------- zfs-fido2-add-backup.8 | 125 +++++ zfs-fido2-add-backup.8.html | 153 ++++++ zfs-fido2-change-key.8 | 188 +++++++ zfs-fido2-change-key.8.html | 207 ++++++++ zfs-fido2-clear-key.8 | 121 +++++ zfs-fido2-clear-key.8.html | 151 ++++++ zfs-fido2-load-key.8 | 98 ++++ zfs-fido2-load-key.8.html | 117 +++++ 10 files changed, 1822 insertions(+), 289 deletions(-) create mode 100644 zfs-fido2-add-backup.8 create mode 100644 zfs-fido2-add-backup.8.html 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 7c89f45abdb60d6f5911401aeb4fd02eca87bbf7..d30e51ef0647cb9f720da0ffc444a0ab83c5201e 100644 GIT binary patch delta 60240 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 QK-8^BY9N)p1|a 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 lAbr^?UxXgd#Q^%AU7G!#hV(hVT76X4gHK%Scl` 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 delta 45214 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 Df5Z$t diff --git a/tzpfms.ps b/tzpfms.ps index a00bf52..1c7779f 100644 --- a/tzpfms.ps +++ b/tzpfms.ps @@ -1,15 +1,15 @@ %!PS-Adobe-3.0 %%Creator: groff version 1.23.0 -%%CreationDate: Tue Mar 5 21:49:23 2024 +%%CreationDate: Tue Mar 5 21:51:05 2024 %%DocumentNeededResources: font Times-Roman %%+ font Times-Bold %%+ font Courier-Bold %%+ font Courier-Oblique %%+ font Courier -%%+ font Symbol %%+ font Times-Italic +%%+ font Symbol %%DocumentSuppliedResources: procset grops 1.23 0 -%%Pages: 10 +%%Pages: 15 %%PageOrder: Ascend %%DocumentMedia: Default 595 842 0 () () %%Orientation: Portrait @@ -237,8 +237,8 @@ setpacking %%IncludeResource: font Courier-Bold %%IncludeResource: font Courier-Oblique %%IncludeResource: font Courier -%%IncludeResource: font Symbol %%IncludeResource: font Times-Italic +%%IncludeResource: font Symbol grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron /Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef @@ -276,20 +276,389 @@ def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron %%BeginPageSetup BP %%EndPageSetup +/F0 10/Times-Roman@0 SF(ZFS-FIDO2-ADD-B)72 48 Q -.4(AC)-.35 G 42.103 +(KUP\(8\) System).4 F(Manager')2.5 E 2.5(sM)-.55 G 39.602 +(anual ZFS-FIDO2-ADD-B)-2.5 F -.4(AC)-.35 G(KUP\(8\)).4 E/F1 10 +/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF +(zfs-fido2-add-backup)108 96 Q F0 2.5<8a61>2.5 G(llo)-2.5 E 2.5(wa)-.25 +G(nother FIDO2 de)-2.5 E(vice to unlock ZFS dataset)-.25 E F1(SYNOPSIS) +72 112.8 Q F2(zfs-fido2-add-backup)108 124.8 Q/F3 10/Courier-Oblique@0 +SF(dataset)2.5 E F1(DESCRIPTION)72 141.6 Q F0(After)108 153.6 Q/F4 10 +/Courier@0 SF(zfs-fido2-change-key)7.564 E F0 5.064(\(8\) deri)B -.15 +(ve)-.25 G 7.563(st).15 G 5.063(he k)-7.563 F 5.363 -.15(ey f)-.1 H +5.063(or a dataset from a FIDO2 de).15 F(vice,)-.25 E F2 +(zfs-fido2-add-backup)108 165.6 Q F0(may be e)2.5 E -.15(xe)-.15 G +(cuted to e).15 E(xtend this to an)-.15 E 2.5(yn)-.15 G +(umber of additional de)-2.5 E(vices.)-.25 E .273(First, the wrapping k) +108 182.4 R .574 -.15(ey i)-.1 H 2.774(se).15 G .274 +(xtracted as normally during)-2.924 F F4(zfs-fido2-load-key)2.774 E F0 +.274(\(8\), then a credential)B 1.604(is made as-if during)108 194.4 R +F4(zfs-fido2-change-key)4.104 E F0 1.604(\(8\) \(e)B 1.604 +(xcept the "primary" de)-.15 F 1.603(vice and all the ones)-.25 F .185 +(holding backups are e)108 206.4 R .185(xcluded from the search\); ho) +-.15 F(we)-.25 E -.15(ve)-.25 G .985 -.4(r, t).15 H(he).4 E F4 +(hmac-secret)2.685 E F0 .185(is instead used as a sym-)2.685 F 1.555 +(metric AES-256-GCM \()108 218.4 R F4(EVP_CIPHER-AES)A F0 1.555 +(\(7ssl\)\) k)B 1.855 -.15(ey t)-.1 H 4.055(oe).15 G 1.555 +(ncrypt the wrapping k)-4.055 F 1.855 -.15(ey d)-.1 H 1.555 +(irectly with a).15 F(random IV)108 230.4 Q(.)-1.29 E(This turns the)108 +247.2 Q F4(xyz.nabijaczleweli:tzpfms.key)2.5 E F0 -.25(va)2.5 G +(riable into).25 E F3(salt)108 259.2 Q F2(:)A F3(credential-ID)A F2(:)A +F3(credential-public-key)A F0([)A F2(.)A F3(backup-salt)A F2(:)A F3 +(backup-credential-ID)108 271.2 Q F2(:)A F3 +(backup-credential-public-key)A F2(:)A F3(IV)A F2(:)A F3(encrypted-key)A +F0 1.666(]...)C F4(tzpfms.key)108 288 Q F0 2.238 +(is actually a dot-separated list of de)4.738 F 2.238(vice b)-.25 F +4.738(undles. The)-.2 F 2.239(\214rst one is as-described in)4.738 F F4 +(zfs-fido2-change-key)108 300 Q F0 5.181(\(8\). Subsequent)B 2.681 +(ones also include \(identically-encoded\) IVs and en-)5.181 F +(crypted blobs.)108 312 Q F4(zfs-fido2-load-key)108 328.8 Q F0 .081 +(\(8\) shops assertions around de)B .081(vices in a de)-.25 F .082 +(vice-major order \212 depending on)-.25 F(de)108 340.8 Q +(vice numbering, a backup may be loaded e)-.25 E -.15(ve)-.25 G 2.5(ni) +.15 G 2.5(ft)-2.5 G(he primary de)-2.5 E(vice is present.)-.25 E F1 +(ENVIR)72 357.6 Q 1.666(ONMENT V)-.3 F(ARIABLES)-1.35 E F4 +(TZPFMS_PASSPHRASE_HELPER)108 369.6 Q F0 .046(By def)133 381.6 R .045(a\ +ult, passphrases are prompted for and read in on the standard output an\ +d input streams.)-.1 F(If)5.045 E F4(TZPFMS_PASSPHRASE_HELPER)133 393.6 +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 405.6 Q(vide each passphrase, instead.)-.15 E .643 +(The standard output stream of the helper is tied to an anon)133 422.4 R +.643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) +133 434.4 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 446.4 Q F0 +(Pre-formatted noun phrase with all the information belo)160 446.4 Q 1.3 +-.65(w, f)-.25 H(or use as a prompt).65 E F4($2)143 458.4 Q F0 +(Either the dataset name or the element of the TPM hierarch)160 458.4 Q +2.5(yb)-.05 G(eing prompted for)-2.5 E F4($3)143 470.4 Q F0("ne)160 +470.4 Q(w" if this is for a ne)-.25 E 2.5(wp)-.25 G +(assphrase, otherwise blank)-2.5 E F4($4)143 482.4 Q F0("ag)160 482.4 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 499.2 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 +511.2 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 528 R(En)87 540 Q(vir)-.4 E .625 +(onment v)-.18 F(ariables)-.1 E F4(FIDO_DEBUG)108 552 Q F0 +(If set, enables lib\214do2 deb)173 552 Q +(ug logging to the standard error stream.)-.2 E F1(De)87 568.8 Q .625 +(vice selection)-.15 F F0 .727(When creating, the \214rst de)108 580.8 R +.727(vice which supports the)-.25 F F4(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 592.8 Q -.15(ve)-.25 G +(ry such de).15 E(vice.)-.25 E F1 .625(See also)87 609.6 R F0 +(The lib\214do2 documentation at https://de)108 621.6 Q -.15(ve)-.25 G +(lopers.yubico.com/lib\214do2/.).15 E F1 1.666(SPECIAL THANKS)72 638.4 R +F0 1.6 -.8(To a)108 650.4 T(ll who support further de).8 E -.15(ve)-.25 +G(lopment, in particular:).15 E F1<83>128 662.4 Q F0(ThePhD)7.5 E F1<83> +128 674.4 Q F0(Embark Studios)7.5 E F1<83>128 686.4 Q F0(Jasper Bekk)7.5 +E(ers)-.1 E F1<83>128 698.4 Q F0(EvModder)7.5 E F1(REPOR)72 715.2 Q +1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 727.2 Q +(.ht/\001nabijaczle)-.55 E(weli/fzifdso)-.25 E F4 +(\001nabijaczleweli/tzpfms@lists.sr.ht)108 744 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 756 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(fzifdso 0)72 +817.889 Q(February 29, 2024)153.568 E(1)183.837 E 0 Cg EP +%%Page: 1 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/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 +SF(zfs-fido2-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 authenticated by a FIDO2 de) +-2.5 E(vice)-.25 E F1(SYNOPSIS)72 112.8 Q F2(zfs-fido2-add-backup)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-add-backup)3.766 E F0 1.266 +(will open its encryption root in its stead.)3.766 F F2 +(zfs-fido2-add-backup)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(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.555 E F0 -.1(wa) +3.555 G 3.555(sp).1 G(re)-3.555 E 1.054(viously encrypted with)-.25 F F2 +(fzifdso)3.554 E F0 1.054(and the)3.554 F F1(FIDO2)3.554 E F0 1.054 +(back-end w)3.554 F 1.054(as used, pre)-.1 F(vious)-.25 E 1.272 +(credentials will be deleted from their de)108 223.2 R 1.272 +(vices \(as-if via)-.25 F F5(zfs-fido2-clear-key)3.773 E F0 1.273 +(\(8\)\), if a)B -.25(va)-.2 G(ilable.).25 E .594 +(Otherwise, or in case of an error)108 235.2 R 3.093(,d)-.4 G .593 +(ata required for manual interv)-3.093 F .593 +(ention will be written to the standard)-.15 F(error stream.)108 247.2 Q +(Ne)108 264 Q .464(xt, a ne)-.15 F 2.964(wc)-.25 G .464 +(redential of type ES256 is generated on the de)-2.964 F .465 +(vice \(with relying party ID)-.25 F F5(fzifdso)2.965 E F0(and)2.965 E +.499(name equal to the dataset name\) with the)108 276 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 288 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 304.8 R(vice-pri)-.25 E -.25(va)-.25 G .963(te data,).25 +F .138(and thus generates the wrapping k)108 316.8 R .438 -.15(ey \()-.1 +H .138(which is optionally back).15 F .138(ed up \(see)-.1 F F1(OPTIONS) +2.637 E F0 2.637(\)\). This)B .137(mimicks a)2.637 F -.8(We)108 328.8 S +(bAuthn login step.).8 E(The follo)108 345.6 Q +(wing properties are set on)-.25 E F3(dataset)2.5 E F0(:)A F1<83>128 +357.6 Q F5(xyz.nabijaczleweli:tzpfms.backend)7.5 E F0(=)A F1(FIDO2)A<83> +128 369.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 381.6 Q F0 +([)A F2(.)A F0 1.666(...)1.666 G 1.666(]...)-1.666 G F5(tzpfms.backend) +108 398.4 Q F0 2.707(identi\214es this dataset for w)5.207 F 2.708 +(ork with)-.1 F F1(FIDO2)5.208 E F0(-back-ended)A F2(tzpfms)5.208 E F0 +2.708(tools \(i.e.)5.208 F F2(fzifdso)108 410.4 Q F5 +(zfs-fido2-change-key)60.228 E F0(\(8\),)A F5(zfs-fido2-load-key)56.727 +E F0(\(8\),)A F5(zfs-fido2-add-backup)108 422.4 Q F0(\(8\), and)A F5 +(zfs-fido2-clear-key)2.5 E F0(\(8\)\).)A F5(tzpfms.key)108 439.2 Q F0 +.486(is a colon-separated tuple of unpadded URL-safe base64 blobs; the \ +\214rst one is the ran-)2.985 F .217(dom salt; the second represents th\ +e ID of created credential, and the third \211 its public k)108 451.2 R +-.15(ey)-.1 G 5.217(.T)-.5 G .216(here e)-5.217 F(xists)-.15 E +(no other user)108 463.2 Q +(-land tool for deciphering this; perhaps there should be.)-.2 E +(Finally)108 480 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 492 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 +(to clean up the properties, or to issue a note for manual interv)108 +504 Q(ention into the standard error stream.)-.15 E 4.055<418c>108 520.8 +S 1.555(nal v)-4.055 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.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 532.8 R .729 +(ut otherwise the dataset can be manually rolled back to a passphrase) +-.2 F(with)108 544.8 Q F2(zfs-fido2-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 556.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 573.6 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 585.6 Q F1(OPTIONS)72 602.4 Q F2109.666 614.4 Q +F3(backup-file)6 E F0(Sa)203 614.4 Q .352 -.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 626.4 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 638.4 Q .3 -.15(ey c)-.1 H(an be loaded by running) +.15 E F2(zfs load-key)233 650.4 Q F3(dataset)6 E F5(<)6 E F3 +(backup-file)6 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 .045(By def)133 691.2 R +.045(ault, passphrases are prompted for and read in on the standard out\ +put and input streams.)-.1 F(If)5.046 E F5(TZPFMS_PASSPHRASE_HELPER)133 +703.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 F5(/bin/)4.095 E F2 3.261 +(sh \255c)B F0(to)4.095 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 732 R +.643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) +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(fzifdso 0)72 817.889 Q +(March 4, 2024)161.068 E(1)191.337 E 0 Cg EP +%%Page: 2 3 +%%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($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 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 .178 +(If the helper doesn')133 136.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 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(FIDO2 back-end con\214guration)72 165.6 R(En)87 177.6 Q(vir)-.4 E +.625(onment v)-.18 F(ariables)-.1 E F1(FIDO_DEBUG)108 189.6 Q F0 +(If set, enables lib\214do2 deb)173 189.6 Q +(ug logging to the standard error stream.)-.2 E F2(De)87 206.4 Q .625 +(vice selection)-.15 F F0 .726(When creating, the \214rst de)108 218.4 R +.726(vice which supports the)-.25 F F1(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 230.4 Q -.15(ve)-.25 G +(ry such de).15 E(vice.)-.25 E F2 .625(See also)87 247.2 R F0 +(The lib\214do2 documentation at https://de)108 259.2 Q -.15(ve)-.25 G +(lopers.yubico.com/lib\214do2/.).15 E F2 1.666(SPECIAL THANKS)72 276 R +F0 1.6 -.8(To a)108 288 T(ll who support further de).8 E -.15(ve)-.25 G +(lopment, in particular:).15 E F2<83>128 300 Q F0(ThePhD)7.5 E F2<83>128 +312 Q F0(Embark Studios)7.5 E F2<83>128 324 Q F0(Jasper Bekk)7.5 E(ers) +-.1 E F2<83>128 336 Q F0(EvModder)7.5 E F2(REPOR)72 352.8 Q 1.666 +(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 364.8 Q +(.ht/\001nabijaczle)-.55 E(weli/fzifdso)-.25 E F1 +(\001nabijaczleweli/tzpfms@lists.sr.ht)108 381.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 393.6 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(fzifdso 0)72 +817.889 Q(March 4, 2024)161.068 E(2)191.337 E 0 Cg EP +%%Page: 1 4 +%%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.587 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-add-backup)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.642(the equi)8.142 F +-.25(va)-.25 G 5.642(lent of).25 F F2 5.642(zfs change-key)8.142 F +13.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. loads)118 +201.6 R .79(the primary and e)3.29 F -.15(ve)-.25 G .79 +(ry backup credential, and for each success, if the de).15 F .791 +(vice containing it)-.25 F(supports the)133 213.6 Q F4(credMgmt)2.5 E F0 +(feature and has a PIN set, tries to delete the credential from the de) +2.5 E(vice,)-.25 E 5(3. remo)118 225.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 237.6 Q F0(.)A -.15(Fo)108 254.4 S 5.859(re).15 G -.15(ve) +-6.109 G 3.359(ry remo).15 F -.25(va)-.15 G 5.859(lf).25 G 3.359 +(ailure and missing de)-5.959 F 3.36 +(vice or PIN an instruction for manual remo)-.25 F -.25(va)-.15 G 5.86 +(lw).25 G(ith)-5.86 E F4(fido2-token)108 266.4 Q F0(\(1\) is issued.)A +(See)108 283.2 Q F4(zfs-fido2-change-key)2.5 E F0 +(\(8\) for a detailed description.)A F1(ENVIR)72 300 Q 1.666(ONMENT V) +-.3 F(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 312 Q F0 .046 +(By def)133 324 R .045(ault, passphrases are prompted for and read in o\ +n the standard output and input streams.)-.1 F(If)5.045 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 336 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 348 Q +(vide each passphrase, instead.)-.15 E .643 +(The standard output stream of the helper is tied to an anon)133 364.8 R +.643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) +133 376.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 388.8 Q F0 +(Pre-formatted noun phrase with all the information belo)160 388.8 Q 1.3 +-.65(w, f)-.25 H(or use as a prompt).65 E F4($2)143 400.8 Q F0 +(Either the dataset name or the element of the TPM hierarch)160 400.8 Q +2.5(yb)-.05 G(eing prompted for)-2.5 E F4($3)143 412.8 Q F0("ne)160 +412.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 424.8 Q F0("ag)160 424.8 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 441.6 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 +453.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 +(FIDO2 back-end con\214guration)72 470.4 R(En)87 482.4 Q(vir)-.4 E .625 +(onment v)-.18 F(ariables)-.1 E F4(FIDO_DEBUG)108 494.4 Q F0 +(If set, enables lib\214do2 deb)173 494.4 Q +(ug logging to the standard error stream.)-.2 E F1(De)87 511.2 Q .625 +(vice selection)-.15 F F0 .727(When creating, the \214rst de)108 523.2 R +.727(vice which supports the)-.25 F F4(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 535.2 Q -.15(ve)-.25 G +(ry such de).15 E(vice.)-.25 E F1 .625(See also)87 552 R F0 +(The lib\214do2 documentation at https://de)108 564 Q -.15(ve)-.25 G +(lopers.yubico.com/lib\214do2/.).15 E F1 1.666(SPECIAL THANKS)72 580.8 R +F0 1.6 -.8(To a)108 592.8 T(ll who support further de).8 E -.15(ve)-.25 +G(lopment, in particular:).15 E F1<83>128 604.8 Q F0(ThePhD)7.5 E F1<83> +128 616.8 Q F0(Embark Studios)7.5 E F1<83>128 628.8 Q F0(Jasper Bekk)7.5 +E(ers)-.1 E F1<83>128 640.8 Q F0(EvModder)7.5 E F1(REPOR)72 657.6 Q +1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 669.6 Q +(.ht/\001nabijaczle)-.55 E(weli/fzifdso)-.25 E F4 +(\001nabijaczleweli/tzpfms@lists.sr.ht)108 686.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 698.4 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(fzifdso 0)72 +817.889 Q(March 4, 2024)161.068 E(1)191.337 E 0 Cg EP +%%Page: 1 5 +%%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-add-backup)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.142(After v)108 153.6 R(erifying)-.15 E F3(dataset)3.642 E F0 -.1 +(wa)3.642 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.141 +(sserts the preserv)-3.641 F 1.141(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.208 E -.25(va)-.25 G +3.208(lent to).25 F F2(zfs)5.708 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 .046(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.045 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 276 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 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 .177 +(If the helper doesn')133 381.6 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 +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.763(,a)C(rchi) +-83.763 E -.15(ve)-.25 G 83.762(da).15 G(t)-83.762 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 6 +%%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-add-backup)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 +177.6 Q(back-end)128 189.6 Q F0(the)187 189.6 Q F2(tzpfms)2.978 E F0 .478(back-end \(e.g.)2.978 F F1(TPM2)2.978 E F0(for)2.978 E F4 -(zfs-tpm2-change-key)2.978 E F0 .478(\(8\) or)B F1(TPM1.X)2.978 E F0 +(zfs-tpm2-change-key)2.978 E F0 .478(\(8\) or)B F1(TPM1.X)2.979 E F0 (for)187 201.6 Q F4(zfs-tpm1x-change-key)2.5 E F0(\(8\)\), or ")A F1(-)A F0 2.5("i)C 2.5(fn)-2.5 G(one is con\214gured)-2.5 E F4(keystatus)128 213.6 Q F1 -2.1 -.25(av a)187 213.6 T(ilable).25 E F0(or)2.5 E F1(una) @@ -300,18 +669,18 @@ F0 2.5("i)C 2.5(fn)-2.5 G(one is con\214gured)-2.5 E F4(keystatus)128 2.5 E F1(no)2.5 E F0(otherwise)2.5 E 8.743(Incoherent datasets require \ immediate operator attention, with either the appropriate)108 254.4 R F2 (zfs-tpm)108 266.4 Q/F5 10/Symbol SF(*)A F2(-clear-key)A F0 1.778 -(program or)4.277 F F2 1.778(zfs change-key)4.278 F F0(and)4.278 E F2 +(program or)4.278 F F2 1.778(zfs change-key)4.278 F F0(and)4.278 E F2 1.778(zfs inherit)4.278 F F0 4.278<8a69>4.278 G 4.278(ft)-4.278 G 1.778 -(he k)-4.278 F 2.078 -.15(ey b)-.1 H(e-).15 E .566(comes unloaded, the) -108 278.4 R 3.066(yw)-.15 G .566(ill require restoration from back-up.) --3.066 F(Ho)5.566 E(we)-.25 E -.15(ve)-.25 G 1.366 -.4(r, t).15 H .566 -(his should ne).4 F -.15(ve)-.25 G 3.065(ro).15 G(ccur)-3.065 E 3.065 -(,u)-.4 G(nless)-3.065 E +(he k)-4.278 F 2.077 -.15(ey b)-.1 H(e-).15 E .565(comes unloaded, the) +108 278.4 R 3.065(yw)-.15 G .566(ill require restoration from back-up.) +-3.065 F(Ho)5.566 E(we)-.25 E -.15(ve)-.25 G 1.366 -.4(r, t).15 H .566 +(his should ne).4 F -.15(ve)-.25 G 3.066(ro).15 G(ccur)-3.066 E 3.066 +(,u)-.4 G(nless)-3.066 E (something went horribly wrong with the dataset properties.)108 290.4 Q .965(If no datasets are speci\214ed, all matching encryption roots are \ -listed \212 by def)108 307.2 R .966(ault, those managed by)-.1 F F2 +listed \212 by def)108 307.2 R .965(ault, those managed by)-.1 F F2 (tzpfms)108 319.2 Q F0(.)A F1(OPTIONS)72 336 Q F2109.666 348 Q F0 -1.583(Scripting mode \212 remo)185 348 R 1.883 -.15(ve h)-.15 H 1.583 +1.582(Scripting mode \212 remo)185 348 R 1.882 -.15(ve h)-.15 H 1.583 (eaders and separate \214elds by a single tab instead of).15 F (columnating them with spaces.)185 360 Q F2109.666 376.8 Q F0 (Recurse into all descendants of speci\214ed datasets.)185 376.8 Q F2 @@ -326,26 +695,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-add-backup)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-add-backup \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-add-backup \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-add-backup \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-add-backup \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-29-g1d39364)72 817.889 Q(December 4, 2022)82.463 E(1)183.842 E 0 Cg EP -%%Page: 2 2 +%%Page: 2 7 %%BeginPageSetup BP %%EndPageSetup @@ -358,11 +729,11 @@ BP (EvModder)7.5 E F1(REPOR)72 160.8 Q 1.666(TING B)-.4 F(UGS)-.1 E F0 (https://todo.sr)108 172.8 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms)-.25 E/F2 10/Courier@0 SF(\001nabijaczleweli/tzpfms@lists.sr.ht)108 189.6 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 201.6 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.) -.25 E(tzpfms 0.3.4-29-g1d39364)72 817.889 Q(December 4, 2022)82.463 E (2)183.842 E 0 Cg EP -%%Page: 1 3 +%%Page: 1 8 %%BeginPageSetup BP %%EndPageSetup @@ -371,159 +742,161 @@ 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-add-backup)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.866 -.8(To n)108 153.6 +T 1.266(ormalise the).8 F F3(dataset)3.766 E F0(,)A F2 +(zfs-fido2-add-backup)3.766 E F0 1.266 +(will open its encryption root in its stead.)3.766 F F2 +(zfs-fido2-add-backup)108 165.6 Q F0(will)14.655 E/F4 10/Times-Italic@0 +SF(ne)14.655 E(ver)-.15 E F0 12.154(create or destro)14.655 F 14.654(ye) +-.1 G 12.154(ncryption roots; use)-14.654 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.176 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 +(will be written to the standard error stream.)108 235.2 Q(Ne)108 252 Q .294(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 + passphrase to protect the k)108 264 R .885 -.15(ey w)-.1 H .585 +(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 +108 333.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 +.292(tools \(namely)2.792 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 +(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.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 +(\214rst one represents the RSA k)108 374.4 R 1.167 -.15(ey p)-.1 H .868 (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 +.15 F(pro)108 386.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 +(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 +(B9EE715DBE4B243FAA81EA04306E063710383E35)108 410.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 +422.4 Q(Finally)108 439.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 +(keyformat=raw)108 451.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 (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 +463.2 Q(ention into the standard error stream.)-.15 E 4.055<418c>108 480 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 +(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 +-.2 F(with)108 504 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 +10.313 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 +F2(zfs-tpm1x-clear-key)108 532.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 +(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 .352 -.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 +F .694(This back-up)203 585.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 +(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 .638(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 +(hange, the wrap-)-3.139 F .463(ping k)203 638.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) +(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 \ +(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 .045(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.046 E F5 -(TZPFMS_PASSPHRASE_HELPER)133 691.2 Q F0 1.596(is set and nonempty)4.096 +(TZPFMS_PASSPHRASE_HELPER)133 703.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 F5 -(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 703.2 Q +(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 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-29-g1d39364)72 +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-29-g1d39364)72 817.889 Q(February 28, 2024)82.458 E(1)183.837 E 0 Cg EP -%%Page: 2 4 +%%Page: 2 9 %%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 +-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 .178 -(If the helper doesn')133 124.8 R 2.678(te)-.18 G .178 +(If the helper doesn')133 136.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) +(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 +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.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 +-2.73 G(ef)-2.73 E 2.73(ault. Use)-.1 F(the)2.73 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 .111(The T)108 206.4 R(rouSerS) +(to specify a remote TCS hostname.)2.5 E .111(The T)108 218.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 +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 +.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.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 +(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-29-g1d39364)72 817.889 Q +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-29-g1d39364)72 817.889 Q (February 28, 2024)82.458 E(2)183.837 E 0 Cg EP -%%Page: 1 5 +%%Page: 1 10 %%BeginPageSetup BP %%EndPageSetup @@ -533,14 +906,14 @@ 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 .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-add-backup)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 F +13.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 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 @@ -575,7 +948,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 504 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(tzpfms 0.3.4-29-g1d39364)72 817.889 Q(December 4, 2022)82.463 E(1) 183.842 E 0 Cg EP -%%Page: 1 6 +%%Page: 1 11 %%BeginPageSetup BP %%EndPageSetup @@ -584,13 +957,13 @@ 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-add-backup)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 (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 (zeroes\); then for the additional passphrase, set when creating the k) @@ -655,7 +1028,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 696 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(tzpfms 0.3.4-29-g1d39364)72 817.889 Q(December 4, 2022)82.463 E(1) 183.842 E 0 Cg EP -%%Page: 1 7 +%%Page: 1 12 %%BeginPageSetup BP %%EndPageSetup @@ -664,132 +1037,132 @@ 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 -(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 +(SYNOPSIS)72 112.8 Q F2(zfs-fido2-add-backup)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.319 -.8(To n)108 +165.6 T(ormalise).8 E F3(dataset)5.219 E F0(,)A F2(zfs-fido2-add-backup) +5.219 E F0 2.72(will open its encryption root in its stead.)5.219 F F2 +(zfs-fido2-add-backup)108 177.6 Q F0(will)14.655 E/F4 10/Times-Italic@0 +SF(ne)14.655 E(ver)-.15 E F0 12.154(create or destro)14.655 F 14.654(ye) +-.1 G 12.154(ncryption roots; use)-14.654 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.054 E F0 -.1 +(wa)3.054 G 3.054(sp).1 G(re)-3.054 E .554(viously encrypted with)-.25 F +F2(tzpfms)3.055 E F0 .555(and the)3.055 F F1(TPM2)3.055 E F0 .555 +(back-end w)3.055 F .555(as used, the pre)-.1 F(vious)-.25 E -.1(ke)108 +235.2 S 3.06(yw)-.05 G .56(ill be freed from the TPM.)-3.06 F .56 +(Otherwise, or in case of an error)5.56 F 3.059(,d)-.4 G .559 +(ata required for manual interv)-3.059 F(en-)-.15 E +(tion will be written to the standard error stream.)108 247.2 Q(Ne)108 +264 Q .294(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 -(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 +(OPTIONS)2.794 E F0 .294(\), and sealed)B .589 +(to a persistent object on the TPM under the o)108 276 R .589 +(wner hierarch)-.25 F .588(y; if there is a passphrase set on the o)-.05 +F(wner)-.25 E(hierarch)108 288 Q 1.602 -.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 -(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) +1.666(]...)-1.666 G(])-1.666 E F5(tzpfms.backend)108 369.6 Q F0 1.264 +(identi\214es this dataset for w)3.764 F 1.263(ork with)-.1 F F1(TPM2) +3.763 E F0(-back-ended)A F2(tzpfms)3.763 E F0 1.263(tools \(namely)3.763 +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.508(is an inte)4.008 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 -(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 +(wed by a semicolon and)-.25 F .823(PCR list as speci\214ed with)108 +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 .822(-toolchain-compatible; if needed, it can)B +.865(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 -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 +3.366 E F25.032 E F0(")6.866 E F5(str:${passphrase})A F0 3.366("o) +C(r)-3.366 E F2109.666 434.4 Q F0(")6.728 E F5(pcr:${tzpfms.key)A +F2(#)A F6(*)A F5(;})A F0 .728(", as the case may be, or equi)B -.25(va) +-.25 G .727(lent, for back-up \(see).25 F F1(OPTIONS)3.227 E F0(\).)A +.447(If you ha)108 446.4 R .747 -.15(ve a s)-.2 H .447(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 -(,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 -.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\ +-.25 G .448(lent tool and set both of these properties, it).25 F +(will funxion seamlessly)108 458.4 Q(.)-.65 E(Finally)108 475.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 487.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 .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 -(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) -11.539 E F0(\(or)8.039 E 8.039(,i)-.4 G 8.039(ft)-8.039 G 5.539(hat f) + interv)108 499.2 R .289(ention into the stan-)-.15 F +(dard error stream.)108 511.2 Q 2.624<418c>108 528 S .124(nal v)-2.624 F +.124(eri\214cation should be made by running)-.15 F F2 1.791 +(zfs-tpm2-load-key \255n)2.625 F F3(dataset)6.125 E F0 5.125(.I)C 2.625 +(ft)-5.125 G .125(hat com-)-2.625 F .507(mand succeeds, all is well, b) +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.538 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.205 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 .352 -.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 -(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) +E F0 2.552(,w)C .052(hich must not e)-2.552 F .053(xist beforehand.)-.15 +F .694(This back-up)203 633.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 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 -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 -(algorithm)2.523 E F0 2.523<8a69>2.523 G 2.523(ft)-2.523 G(he)-2.523 E +-1.666 G 1.424(Bind the k)203 686.4 R 1.724 -.15(ey t)-.1 H 3.924(os).15 +G 1.424(pace- or comma-separated)-3.924 F F3(PCR)3.925 E F0 3.925(sw)C +1.425(ithin their corresponding)-3.925 F(hashing)203 698.4 Q F3 +(algorithm)2.524 E F0 2.524<8a69>2.524 G 2.523(ft)-2.524 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 +.023(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.468 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 +.15 E F0 2.968(", ")B F1(sha256)A F0 2.969(", ")B F1(sha384)A F0(",)A(") +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-29-g1d39364)72 817.889 Q(February 28, 2024)82.458 E(1)183.837 E 0 Cg EP -%%Page: 2 8 +%%Page: 2 13 %%BeginPageSetup BP %%EndPageSetup /F0 10/Times-Roman@0 SF 44.133(ZFS-TPM2-CHANGE-KEY\(8\) System)72 48 R (Manager')2.5 E 2.5(sM)-.55 G 41.632(anual ZFS-TPM2-CHANGE-KEY\(8\))-2.5 F/F1 10/Courier-Bold@0 SF109.666 84 Q F0 -.4(Wi)203 84 S(th).4 E -F14.589 E F0 2.923(,a)C .422(lso prompt for a passphrase.)-2.923 F -.422(This is skipped by def)5.422 F .422(ault because the)-.1 F .675 +F14.588 E F0 2.922(,a)C .422(lso prompt for a passphrase.)-2.922 F +.422(This is skipped by def)5.422 F .423(ault because the)-.1 F .675 (passphrase is)203 96 R/F2 10/Times-Italic@0 SF(OR)3.175 E F0 .675 (ed with the PCR polic)B 3.175(y\212t)-.15 G .675(he wrapping k)-3.175 F .975 -.15(ey c)-.1 H .675(an be unsealed).15 F F2(either)203 108 Q F0 -1.39(passphraseless with the right PCRs)3.89 F F2(or)3.89 E F0 1.389 +1.389(passphraseless with the right PCRs)3.889 F F2(or)3.89 E F0 1.39 (with the passphrase, and this is)3.89 F(usually not the intent.)203 120 Q/F3 10/Times-Bold@0 SF(ENVIR)72 136.8 Q 1.666(ONMENT V)-.3 F(ARIABLES) --1.35 E/F4 10/Courier@0 SF(TZPFMS_PASSPHRASE_HELPER)108 148.8 Q F0 .045 +-1.35 E/F4 10/Courier@0 SF(TZPFMS_PASSPHRASE_HELPER)108 148.8 Q F0 .046 (By def)133 160.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 172.8 Q F0 1.596(is set and nonempty)4.096 + on the standard output and input streams.)-.1 F(If)5.045 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 172.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.095 E F1 3.261(sh \255c)B F0(to)4.095 E(pro)133 184.8 Q +(/bin/)4.096 E F1 3.262(sh \255c)B F0(to)4.096 E(pro)133 184.8 Q (vide each passphrase, instead.)-.15 E .643 (The standard output stream of the helper is tied to an anon)133 201.6 R .643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) @@ -802,10 +1175,10 @@ F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F F4 249.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 261.6 Q F0("ag)160 261.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 278.4 R 2.678(te)-.18 G .178 -(xist \(the shell e)-2.828 F .177(xits with)-.15 F F3(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 278.4 R 2.677(te)-.18 G .177 +(xist \(the shell e)-2.827 F .177(xits with)-.15 F F3(127)2.677 E F0 +.178(\), a diagnostic is issued and the normal prompt)B(is used as f)133 290.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 F3 1.666 (TPM2 back-end con\214guration)72 307.2 R(En)87 319.2 Q(vir)-.4 E .625 @@ -814,13 +1187,13 @@ Q 2.5(yo)-.15 G(f:)-2.5 E F3(NONE)2.5 E F0(,)A F3(ERR)2.5 E(OR)-.3 E F0 (,)A F3 -1.2(WA)2.5 G(RNING)1.2 E F0(,)A F3(INFO)2.5 E F0(,)A F3(DEB)2.5 E(UG)-.1 E F0(,)A F3(TRA)2.5 E(CE)-.55 E F0 5(.D)C(ef)-5 E(ault:)-.1 E F3 -1.2(WA)2.5 G(RNING)1.2 E F0(.)A F3 .625(TPM selection)87 348 R F0 -.621(The library)108 360 R F1(libtss2-tcti-default.so)3.121 E F0 .621 -(can be link)3.121 F .621(ed to an)-.1 F 3.122(yo)-.15 G 3.122(ft)-3.122 -G(he)-3.122 E F4(libtss2-tcti-)3.122 E/F5 10/Symbol SF(*)A F4(.so)A F0 -(li-)3.122 E .781(braries to select the def)108 372 R .781 -(ault, otherwise)-.1 F F4(/dev/tpmrm0)3.28 E F0 3.28(,t)C(hen)-3.28 E F4 -(/dev/tpm0)3.28 E F0 3.28(,t)C(hen)-3.28 E F4(localhost:2321)3.28 E F0 -(will be tried, in order \(see)108 384 Q F4(ESYS_CONTEXT)2.5 E F0 +.622(The library)108 360 R F1(libtss2-tcti-default.so)3.122 E F0 .622 +(can be link)3.122 F .621(ed to an)-.1 F 3.121(yo)-.15 G 3.121(ft)-3.121 +G(he)-3.121 E F4(libtss2-tcti-)3.121 E/F5 10/Symbol SF(*)A F4(.so)A F0 +(li-)3.121 E .78(braries to select the def)108 372 R .78 +(ault, otherwise)-.1 F F4(/dev/tpmrm0)3.281 E F0 3.281(,t)C(hen)-3.281 E +F4(/dev/tpm0)3.281 E F0 3.281(,t)C(hen)-3.281 E F4(localhost:2321)3.281 +E F0(will be tried, in order \(see)108 384 Q F4(ESYS_CONTEXT)2.5 E F0 (\(3\)\).)A F3 .625(See also)87 400.8 R F0 2.247 (The tpm2-tss git repository at https://github)108 412.8 R (.com/tpm2-softw)-.4 E 2.247(are/tpm2-tss and the documentation at)-.1 F @@ -837,7 +1210,7 @@ G(he)-3.122 E F4(libtss2-tcti-)3.122 E/F5 10/Symbol SF(*)A F4(.so)A F0 F3<83>128 542.4 Q F0(EvModder)7.5 E F3(REPOR)72 559.2 Q 1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 571.2 Q(.ht/\001nabijaczle)-.55 E (weli/tzpfms)-.25 E F4(\001nabijaczleweli/tzpfms@lists.sr.ht)108 588 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 600 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E F3 1.666(SEE ALSO)72 616.8 R F4(tpm2_unseal)108 628.8 Q F0(\(1\))A (PCR allocations: https://wiki.archlinux.or)108 645.6 Q(g/title/T)-.18 E @@ -847,7 +1220,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-29-g1d39364)72 817.889 Q (February 28, 2024)82.458 E(2)183.837 E 0 Cg EP -%%Page: 1 9 +%%Page: 1 14 %%BeginPageSetup BP %%EndPageSetup @@ -857,13 +1230,13 @@ 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-add-backup)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 -(lent of).25 F F2 5.642(zfs change-key)8.142 F13.308 E/F4 10 -/Courier@0 SF(keylocation=prompt)11.642 E F213.308 E F4 +(1. performs)118 165.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 177.6 Q F3(dataset)6 E F0(,)A 5(2. frees)118 189.6 R(the sealed k)2.5 E .3 -.15(ey p)-.1 H(re).15 E (viously used to encrypt)-.25 E F3(dataset)2.5 E F0(,)A 5(3. remo)118 @@ -872,12 +1245,12 @@ F/F1 10/Times-Bold@0 SF -.2(NA)72 84 S(ME).2 E/F2 10/Courier-Bold@0 SF 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-tpm2-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 +-.3 F(ARIABLES)-1.35 E F4(TZPFMS_PASSPHRASE_HELPER)108 259.2 Q F0 .046 (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 + on the standard output and input streams.)-.1 F(If)5.045 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 283.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 F4 -(/bin/)4.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 295.2 Q +(/bin/)4.096 E F2 3.262(sh \255c)B F0(to)4.096 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) @@ -889,10 +1262,10 @@ F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F F4 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 +(he second prompt for that passphrase, otherwise blank)-2.5 E .177 +(If the helper doesn')133 388.8 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 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 (TPM2 back-end con\214guration)72 417.6 R(En)87 429.6 Q(vir)-.4 E .625 @@ -901,13 +1274,13 @@ Q 2.5(yo)-.15 G(f:)-2.5 E F1(NONE)2.5 E F0(,)A F1(ERR)2.5 E(OR)-.3 E F0 (,)A F1 -1.2(WA)2.5 G(RNING)1.2 E F0(,)A F1(INFO)2.5 E F0(,)A F1(DEB)2.5 E(UG)-.1 E F0(,)A F1(TRA)2.5 E(CE)-.55 E F0 5(.D)C(ef)-5 E(ault:)-.1 E F1 -1.2(WA)2.5 G(RNING)1.2 E F0(.)A F1 .625(TPM selection)87 458.4 R F0 -.621(The library)108 470.4 R F2(libtss2-tcti-default.so)3.121 E F0 .621 -(can be link)3.121 F .621(ed to an)-.1 F 3.122(yo)-.15 G 3.122(ft)-3.122 -G(he)-3.122 E F4(libtss2-tcti-)3.122 E/F5 10/Symbol SF(*)A F4(.so)A F0 -(li-)3.122 E .781(braries to select the def)108 482.4 R .781 -(ault, otherwise)-.1 F F4(/dev/tpmrm0)3.28 E F0 3.28(,t)C(hen)-3.28 E F4 -(/dev/tpm0)3.28 E F0 3.28(,t)C(hen)-3.28 E F4(localhost:2321)3.28 E F0 -(will be tried, in order \(see)108 494.4 Q F4(ESYS_CONTEXT)2.5 E F0 +.622(The library)108 470.4 R F2(libtss2-tcti-default.so)3.122 E F0 .622 +(can be link)3.122 F .621(ed to an)-.1 F 3.121(yo)-.15 G 3.121(ft)-3.121 +G(he)-3.121 E F4(libtss2-tcti-)3.121 E/F5 10/Symbol SF(*)A F4(.so)A F0 +(li-)3.121 E .78(braries to select the def)108 482.4 R .78 +(ault, otherwise)-.1 F F4(/dev/tpmrm0)3.281 E F0 3.281(,t)C(hen)-3.281 E +F4(/dev/tpm0)3.281 E F0 3.281(,t)C(hen)-3.281 E F4(localhost:2321)3.281 +E F0(will be tried, in order \(see)108 494.4 Q F4(ESYS_CONTEXT)2.5 E F0 (\(3\)\).)A F1 .625(See also)87 511.2 R F0 2.247 (The tpm2-tss git repository at https://github)108 523.2 R (.com/tpm2-softw)-.4 E 2.247(are/tpm2-tss and the documentation at)-.1 F @@ -924,11 +1297,11 @@ G(he)-3.122 E F4(libtss2-tcti-)3.122 E/F5 10/Symbol SF(*)A F4(.so)A F0 F1<83>128 652.8 Q F0(EvModder)7.5 E F1(REPOR)72 669.6 Q 1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 681.6 Q(.ht/\001nabijaczle)-.55 E (weli/tzpfms)-.25 E F4(\001nabijaczleweli/tzpfms@lists.sr.ht)108 698.4 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 710.4 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.) -.25 E(tzpfms 0.3.4-29-g1d39364)72 817.889 Q(December 4, 2022)82.463 E (1)183.842 E 0 Cg EP -%%Page: 1 10 +%%Page: 1 15 %%BeginPageSetup BP %%EndPageSetup @@ -937,28 +1310,28 @@ 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-add-backup)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 .865(After v)108 153.6 R(erifying)-.15 E F3(dataset)3.365 E F0 -.1 +(wa)3.365 G 3.365(se).1 G .865(ncrypted with)-3.365 F F2(tzpfms)3.365 E +F0(back)3.365 E(end)-.1 E F1(TPM2)3.365 E F0 3.365(,u)C .864 +(nseals the k)-3.365 F 1.164 -.15(ey a)-.1 H .864(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.208 E -.25(va) +-.25 G 3.208(lent to).25 F F2(zfs)5.708 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 .046 (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 + on the standard output and input streams.)-.1 F(If)5.045 E F4 +(TZPFMS_PASSPHRASE_HELPER)133 292.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.095 E F2 3.261(sh \255c)B F0(to)4.095 E(pro)133 304.8 Q +(/bin/)4.096 E F2 3.262(sh \255c)B F0(to)4.096 E(pro)133 304.8 Q (vide each passphrase, instead.)-.15 E .643 (The standard output stream of the helper is tied to an anon)133 321.6 R .643(ymous \214le and used in its entirety as)-.15 F(the passphrase, e) @@ -971,23 +1344,23 @@ F 4.096(,i)-.65 G 4.096(tw)-4.096 G 1.596(ill be run via)-4.096 F F4 369.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 381.6 Q F0("ag)160 381.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 398.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 398.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 410.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 427.2 R .625(TPM selection)87 439.2 -R F0(The)108 451.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 463.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 480 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 -492 S(ing one of the earlier ones with, for e).1 E +R F0(The)108 451.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 463.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 480 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 492 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 508.8 R F0(The T)108 520.8 Q (rouSerS project page at https://sourcefor)-.35 E @@ -1002,7 +1375,7 @@ 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 626.4 Q F0(EvModder)7.5 E F1(REPOR)72 643.2 Q 1.666(TING B)-.4 F(UGS)-.1 E F0(https://todo.sr)108 655.2 Q(.ht/\001nabijaczle)-.55 E (weli/tzpfms)-.25 E F4(\001nabijaczleweli/tzpfms@lists.sr.ht)108 672 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 684 Q(.ht/\001nabijaczle)-.55 E(weli/tzpfms.)-.25 E(tzpfms 0.3.4-29-g1d39364)72 817.889 Q(December 4, 2022)82.463 E(1) 183.842 E 0 Cg EP diff --git a/zfs-fido2-add-backup.8 b/zfs-fido2-add-backup.8 new file mode 100644 index 0000000..08a80cb --- /dev/null +++ b/zfs-fido2-add-backup.8 @@ -0,0 +1,125 @@ +.\" SPDX-License-Identifier: MIT +. +.Dd February 29, 2024 +.ds doc-volume-operating-system +.Dt ZFS-FIDO2-ADD-BACKUP 8 +.Os fzifdso 0 +. +.Sh NAME +.Nm zfs-fido2-add-backup +.Nd allow another FIDO2 device to unlock ZFS dataset +.Sh SYNOPSIS +.Nm +.Ar dataset +. +.Sh DESCRIPTION +After +.Xr zfs-fido2-change-key 8 +derives the key for a dataset from a FIDO2 device, +.Nm +may be executed to extend this to any number of additional devices. +.Pp +First, the wrapping key is extracted as normally during +.Xr zfs-fido2-load-key 8 , +then a credential is made as-if during +.Xr zfs-fido2-change-key 8 +(except the "primary" device and all the ones holding backups are excluded from the search); +however, the +.Ql hmac-secret +is instead used as a symmetric AES-256-GCM +.Pq Xr EVP_CIPHER-AES 7ssl +key to encrypt the wrapping key directly with a random IV. +.Pp +This turns the +.Li xyz.nabijaczleweli:tzpfms.key +variable into +.br +.Ar salt Ns Cm :\:\& Ns Ar credential-ID Ns Cm :\:\& Ns Ar credential-public-key Ns Oo Cm \&. Ns Ar backup-salt Ns Cm :\:\& Ns Ar backup-credential-ID Ns Cm :\:\& Ns Ar backup-credential-public-key Ns Cm :\:\& Ns Ar IV Ns Cm :\:\& Ns Ar encrypted-key Oc Ns … +.Pp +.Li tzpfms.key +is actually a dot-separated list of device bundles. +The first one is as-described in +.Xr zfs-fido2-change-key 8 . +Subsequent ones also include (identically-encoded) IVs and encrypted blobs. +.Pp +.Xr zfs-fido2-load-key 8 +shops assertions around devices in a device-major order \(em +depending on device numbering, a backup may be loaded even if the primary device is present. +. +.\" 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-add-backup.8.html b/zfs-fido2-add-backup.8.html new file mode 100644 index 0000000..e6d3444 --- /dev/null +++ b/zfs-fido2-add-backup.8.html @@ -0,0 +1,153 @@ + + + + + + + + ZFS-FIDO2-ADD-BACKUP(8) + + + + + + + + +
ZFS-FIDO2-ADD-BACKUP(8)System Manager's ManualZFS-FIDO2-ADD-BACKUP(8)
+
+
+

+

zfs-fido2-add-backup — + allow another FIDO2 device to unlock ZFS dataset

+
+
+

+ + + + + +
zfs-fido2-add-backupdataset
+
+
+

+

After + zfs-fido2-change-key(8) + derives the key for a dataset from a FIDO2 device, + zfs-fido2-add-backup may be executed to extend this + to any number of additional devices.

+

First, the wrapping key is extracted as normally during + zfs-fido2-load-key(8), + then a credential is made as-if during + zfs-fido2-change-key(8) + (except the "primary" device and all the ones holding backups are + excluded from the search); however, the + ‘hmac-secret’ is instead used as a + symmetric AES-256-GCM + (EVP_CIPHER-AES(7ssl)) + key to encrypt the wrapping key directly with a random IV.

+

This turns the + xyz.nabijaczleweli:tzpfms.key variable into +
+ salt:credential-ID:credential-public-key[.backup-salt:backup-credential-ID:backup-credential-public-key:IV:encrypted-key]…

+

tzpfms.key is actually a dot-separated + list of device bundles. The first one is as-described in + zfs-fido2-change-key(8). + Subsequent ones also include (identically-encoded) IVs and encrypted + blobs.

+

zfs-fido2-load-key(8) + shops assertions around devices in a device-major order — depending + on device numbering, a backup may be loaded even if the primary device is + present.

+
+
+

+
+
+
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 29, 2024fzifdso 0
+ + diff --git a/zfs-fido2-change-key.8 b/zfs-fido2-change-key.8 new file mode 100644 index 0000000..8238eba --- /dev/null +++ b/zfs-fido2-change-key.8 @@ -0,0 +1,188 @@ +.\" SPDX-License-Identifier: MIT +. +.Dd March 4, 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 +support the +.Ql hmac-secret +extension. +.Pp +If +.Ar dataset +was previously encrypted with +.Nm fzifdso +and the +.Sy FIDO2 +back-end was used, previous credentials will be deleted from their devices (as-if via +.Xr zfs-fido2-clear-key 8 ) , +if available. +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 Ns Oo Cm \&. Ns … Oc Ns … +.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 , Xr zfs-fido2-add-backup 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..8cd7f1a --- /dev/null +++ b/zfs-fido2-change-key.8.html @@ -0,0 +1,207 @@ + + + + + + + + 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 support the + ‘hmac-secret’ extension.

+

If dataset was previously encrypted with + fzifdso and the FIDO2 back-end was + used, previous credentials will be deleted from their devices (as-if via + zfs-fido2-clear-key(8)), + if available. 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), + zfs-fido2-add-backup(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.

+
+
+ + + + + +
March 4, 2024fzifdso 0
+ + diff --git a/zfs-fido2-clear-key.8 b/zfs-fido2-clear-key.8 new file mode 100644 index 0000000..f7ab9d5 --- /dev/null +++ b/zfs-fido2-clear-key.8 @@ -0,0 +1,121 @@ +.\" SPDX-License-Identifier: MIT +. +.Dd March 4, 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 +loads the primary and every backup credential, and for each success, if the device containing it supports the +.Ql credMgmt \" or credentialMgmtPreview +feature and has a PIN set, tries to delete the credential from the device, +.It +removes the +.Li xyz.nabijaczleweli:tzpfms.\& Ns Brq Li backend , key +properties from +.Ar dataset . +.El +.Pp +For every removal failure and missing device or PIN an instruction for manual removal with +.Xr fido2-token 1 +is issued. +.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..97e05e7 --- /dev/null +++ b/zfs-fido2-clear-key.8.html @@ -0,0 +1,151 @@ + + + + + + + + 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. loads the primary and every backup credential, and for each success, if + the device containing it supports the + ‘credMgmt’ feature and has a PIN + set, tries to delete the credential from the device,
  4. +
  5. removes the + xyz.nabijaczleweli:tzpfms.{backend, + key} properties from + dataset.
  6. +
+

For every removal failure and missing device or PIN an instruction + for manual removal with + fido2-token(1) + is issued.

+

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.

+
+
+ + + + + +
March 4, 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
+ +