<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 5, 2023 at 11:38 PM Adrian Vovk <<a href="mailto:adrianvovk@gmail.com" target="_blank">adrianvovk@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
2. The alternative approach involves pre-calculating PCR[7] on the<br>
client if we're updating DBX or Shim. Here's how I envision this<br>
going:<br>
- We read the TPM log (which we can trust because we're currently<br>
booted to system verified via the chain of trust) and extract<br>
everything read into PCR[7]<br>
- We clear PCR[16], then start replaying everything from the TPM log<br>
- When we reach the measurement of DBX, we pre-calculate the new value<br>
of DBX and measure that in instead. This would probably need<br>
collaboration w/ fwupd<br>
- When we reach the measurements made by Shim, we use the new values<br>
instead. See <a href="https://github.com/rhboot/shim/issues/555" rel="noreferrer" target="_blank">https://github.com/rhboot/shim/issues/555</a><br>
- PCR[16] now contains the future value for PCR[7]. We enroll (into a<br>
new keyslot) TPM decryption. We seal against 16+11+14, but then<br>
configure it to unseal against 7+11+14 (this is the one step I'm iffy<br>
about. Is this possible??)<br></blockquote><div><br></div><div>You don't need to replay everything *into a real PCR* at all – the extend operation is just a regular hash operation SHA(pcr||value), you can recalculate everything in software, then seal the keyslot against your provided PCR values instead of the "live" ones.</div><div><br></div><div>I have an old <strike>hack</strike> proof of concept for that (written mostly because I didn't want to touch any of that SB signing even with a stick):</div><div><br></div><div>1. PCR[4] replay in userspace <a href="https://github.com/grawity/tpm_futurepcr" target="_blank">https://github.com/grawity/tpm_futurepcr</a></div><div>(code is ugly but it's really just calculating a hash chain, while "updating" certain TPM log events)<br></div><div><br></div><div>2. Creating systemd-compatible LUKS tpm2 tokens against arbitrary PCR values <a href="https://git.nullroute.lt/cgit/hacks/tpmreseal.git/" target="_blank">https://git.nullroute.lt/cgit/hacks/tpmreseal.git/</a></div><div>(systemd has extended its LUKS token format a little bit since then, but the basic format still works, at least I'm able to use it on my system)</div><div><br></div><div>I expected #1 to be superseded by `systemd-measure` (available in latest systemd); apparently it's not quite the same but it does focus on Secure Boot and signed PCRs, so maybe you can get `systemd-measure` to do exactly what you want? There's a github RFE filed for #2 so it might show up in systemd-cryptenroll someday.<br></div><div><br></div></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Mantas Mikulėnas</div></div></div>