All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick Ohly <patrick.ohly at intel.com>
To: tpm2@lists.01.org
Subject: [tpm2] using TPM2 NVRAM for storing LUKS password
Date: Thu, 09 Nov 2017 13:53:56 +0100	[thread overview]
Message-ID: <1510232036.22094.29.camel@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 3971 bytes --]

Hello!

I am trying to port the refkit support for whole-disk encryption from
TPM 1.2 to TPM 2.0. In refkit, an installer image sets up the internal
disk with the root partition encrypted with LUKS. The initramfs then
unlocks that partition before mounting it and transferring control to
/bin/init. TPM NVRAM is used to store a per-machine LUKS password.

The automated tests uses QEMU + swtpm. More precisely, I am using QEMU
2.10.0 with backported chardev patches plus a custom patch that makes
it possible to have QEMU start swtpm.  swtpm and libtpms are from the
current tpm2-preview branches (5c70e401824e4f3f0900bddb50e7ea5fb7bbd84f
resp. e0331c6d71b273ef7f71ce6fa17306f6773f543e).

I'm using tpm2.0-tools v2.1.0. Kernel is 4.9.

In this setup, I get a TPM2.0 /dev/tpm0 in the virtual machine when I
start QEMU with:

-chardev 'socket,id=chrtpm0,cmd=exec swtpm_oe.sh socket --terminate --ctrl type=unixio,,clientfd=0 --tpmstate dir=... --log level=10,,file=.../swtpm.log --tpm2' \
-tpmdev emulator,id=tpm0,chardev=chrtpm0 \
-device tpm-tis,tpmdev=tpm0 

The whole thing is built with Yocto/OE-Core, hence the swtpm_oe.sh
wrapper script. It just sets some paths, then calls swtpm.

There are automated tests, too. All of this was working with TPM1.2.
With TPM2.0, I have everything set up and installing to internal disk
works without issues. But after rebooting the virtual machine, the
NVRAM no longer contains the password. tpm2_nvlist shows nothing.

I'm unsure whether this is an issue in tpm2.0-tools, in swtpm2, or my
usage of both. Let me describe in more details what commands are used. 

The virtual TPM gets initialized with:
    swtpm_setup_oe.sh --tpm2 --tpm-state ... --createe

The commands that run as part of installation are:
    tpm2_takeownership -o ownerpass -e endorsepass -l lockpass
    tpm2_nvdefine -x 0x1500001 -s 40 -a 0x40000001 -t 0x80020002 -P ownerpass
    tpm2_nvwrite -x 0x1500001 -a 0x40000001 -f /dev/shm/keydir.sVrmLQ/keyfile -P ownerpass
    52 45 46 4b 49 54 5f 30 70 e6 2b b9 ca 0c 1c 00 1d 6d eb 58 a1 7a cf 0d 1d 71 46 bc fd 7a 80 a0 8f 8b 0a 30 fc 89 9b db 

    tpm2_nvlist
    1 NV indexes defined.

      0. NV Index: 0x1500001
      {
    	    Hash algorithm(nameAlg):11
         	    The Index attributes(attributes):0xa0020002
         	    The size of the data area(dataSize):40
       }

    tpm2_nvreadlock -x 0x1500001 -a 0x40000001 -P ownerpass


Then the initramfs does:
    tpm2_nvlist
    0 NV indexes defined.

    tpm2_nvread -x 0x1500001 -a 0x40000001 -s 40 -o 0 -P ownerpass
    ERROR: Failed to read NVRAM area at index 0x1500001 (22020097). Error:0x28b

I tried also without tpm2_nvreadlock and without tpm2_takeownership,
but neither of that made a difference.

Conceptually this is similar to the commands used with TPM 1.2. The
simplifying assumption is that only a single OS is getting installed to
virgin hardware and then Secure Boot ensures that no other code ever
gets access to the active TPM. Therefore a fixed index and no real
access protection for the slot are okay. A read-lock is set to ensure
that the key is protected from potentially malicious applications which
 might have access to /dev/tpm0. Does that sound alright?

The index was chosen as in the tpm2.0-tools Wiki (https://github.com/in
tel/tpm2-tools/wiki/How-to-use-tpm2-tools). Is there anything special
about that index?

I checked the swtpm.log (log level 10). Somehow it only contains
SWTPM_IO_Read/Write entries. I'll check whether logging perhaps also
needs to be enabled during compilation.

Any other suggestions for how I could debug this?

-- 
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.



             reply	other threads:[~2017-11-09 12:53 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-09 12:53 Patrick Ohly [this message]
  -- strict thread matches above, loose matches on Subject: below --
2017-11-09 14:12 [tpm2] using TPM2 NVRAM for storing LUKS password Javier Martinez Canillas
2017-11-09 15:10 Patrick Ohly
2017-11-09 15:17 Stefan Berger
2017-11-09 15:25 flihp
2017-11-09 19:51 Patrick Ohly
2017-11-09 20:40 Patrick Ohly
2017-11-09 20:43 Patrick Ohly
2017-11-10  9:07 Patrick Ohly
2017-11-10 11:53 Stefan Berger
2017-11-10 12:04 Stefan Berger
2017-11-10 12:44 Patrick Ohly
2017-11-10 12:53 Patrick Ohly
2017-11-10 15:27 Stefan Berger
2017-11-27 10:03 Patrick Ohly
2017-11-27 11:50 Stefan Berger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1510232036.22094.29.camel@intel.com \
    --to=tpm2@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.