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

+

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

+

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

+

The following properties are set on + dataset:

+ +

tzpfms.backend identifies this dataset for + work with FIDO2-back-ended tzpfms + tools (i.e. fzifdso + zfs-fido2-change-key(8), + zfs-fido2-load-key(8), + 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.

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

+

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

+
+
+

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

+

After verifying dataset was encrypted with + tzpfms backend + :

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

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

+
+
+

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

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

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

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

+
+
+
+
+

+
+

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

+

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

+
+
+

+

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

+
+
+
+

+

To all who support further development, in particular:

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

+

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

+

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

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

+

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

+
+
+

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

+

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

+

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

+
+
+

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

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

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

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

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

+
+
+
+
+

+

To all who support further development, in particular:

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

+

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

+

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

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