From a7756fa21ec03df72a694ecc1ce3f434a867df69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1=20autouploader?= Date: Sun, 3 Mar 2024 19:46:07 +0000 Subject: [PATCH] Manpage update by job 1161213 --- tzpfms.pdf | Bin 65713 -> 81305 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 53eef3e6ff5dc9322428aa49680d9ae3b7c1aa55..56fc17680c7c5c66d5a3c769cfc3c5d70b72bfd2 100644 GIT binary patch delta 59297 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�ytrftgZJ$B*uRRU? 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

<8`{t-O)7;eVT82 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%0Dhd1dNolw+JnlW@iyBIYyAG}+p`YcsM_{En)=*p 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 eUyM5rjt2IQuJ*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-23-g984c5d5)72 817.889 Q(December 4, 2022)83.023 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-23-g984c5d5)72 817.889 Q(December 4, 2022)83.023 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-23-g984c5d5)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-23-g984c5d5)72 817.889 Q(February 28, 2024)83.018 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-23-g984c5d5)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-23-g984c5d5)72 817.889 Q (February 28, 2024)83.018 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-23-g984c5d5)72 817.889 Q(December 4, 2022)83.023 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-23-g984c5d5)72 817.889 Q(December 4, 2022)83.023 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-23-g984c5d5)72 817.889 Q(February 28, 2024)83.018 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-23-g984c5d5)72 817.889 Q (February 28, 2024)83.018 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-23-g984c5d5)72 817.889 Q(December 4, 2022)83.023 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
+ +