On Sat, Mar 15, 2025 at 03:45:14AM -0500, Glenn Washburn wrote:
> On Mon, 13 Jan 2025 11:07:12 +0800
> Gary Lin via Grub-devel <grub-devel@gnu.org> wrote:
> 
> > Since 'grub-protect' already supports NV index mode, tpm2_seal_nv() is
> > replaced with one 'grub-protect' command to simplify the test script.
> > 
> > Two more NV index test cases are also added to test key sealing and
> > unsealing with the NV index handle 0x1000000.
> > 
> > Also, there is a minor fix to reset 'ret' to 0 when a test case fails so
> > that the other test cases could continue.
> 
> I missed the original patch for this test, so this should have been
> said earlier. This patch goes a long way in removing external
> dependencies for this test, but it doesn't remove all of them. Please
> document all debian packages needed to be installed to run this test in
> the INSTALL file and note that they are needed for the tpm test (as
> done for other documented packages). This should go under the section
> "Prerequisites for make-check".
> 
Sure. I'll add swtpm and tpm2-tools to the INSTALL file.

Thanks,

Gary Lin

> Thanks,
> Glenn
> 
> > 
> > Signed-off-by: Gary Lin <g...@suse.com>
> > Reviewed-by: Stefan Berger <stef...@linux.ibm.com>
> > ---
> >  tests/tpm2_key_protector_test.in | 155 ++++++++++---------------------
> >  1 file changed, 51 insertions(+), 104 deletions(-)
> > 
> > diff --git a/tests/tpm2_key_protector_test.in 
> > b/tests/tpm2_key_protector_test.in
> > index a92e5f498..1ba70a3d5 100644
> > --- a/tests/tpm2_key_protector_test.in
> > +++ b/tests/tpm2_key_protector_test.in
> > @@ -225,112 +225,45 @@ EOF
> >      fi
> >  }
> >  
> > -tpm2_seal_nv () {
> > -    keyfile="$1"
> > -    nv_index="$2"
> > -    pcr_list="$3"
> > -
> > -    primary_file=${tpm2testdir}/primary.ctx
> > -    session_file=${tpm2testdir}/session.dat
> > -    policy_file=${tpm2testdir}/policy.dat
> > -    keypub_file=${tpm2testdir}/key.pub
> > -    keypriv_file=${tpm2testdir}/key.priv
> > -    name_file=${tpm2testdir}/sealing.name
> > -    sealing_ctx_file=${tpm2testdir}/sealing.ctx
> > -
> > -    # Since we don't run a resource manager on our swtpm instance, it has
> > -    # to flush the transient handles after tpm2_createprimary, tpm2_create
> > -    # and tpm2_load to avoid the potential out-of-memory (0x902) errors.
> > -    # Ref: 
> > https://github.com/tpm2-software/tpm2-tools/issues/1338#issuecomment-469689398
> > -
> > -    # Create the primary object
> > -    tpm2_createprimary -Q -C o -g sha256 -G ecc -c "${primary_file}" || 
> > ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to create the primary object: ${ret}" >&2
> > -   return 1
> > -    fi
> > -    tpm2_flushcontext -t || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to flush the transient handles: ${ret}" >&2
> > -   return 1
> > -    fi
> > -
> > -    # Create the policy object
> > -    tpm2_startauthsession -S "${session_file}" || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to start auth session: ${ret}" >&2
> > -   return 1
> > -    fi
> > -    tpm2_policypcr -Q -S "${session_file}" -l "${pcr_list}" -L 
> > "${policy_file}" || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to create the policy object: ${ret}" >&2
> > -   return 1
> > -    fi
> > -    tpm2_flushcontext "${session_file}" || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to flush the transient handles: ${ret}" >&2
> > -   return 1
> > -    fi
> > +tpm2_seal_unseal_nv() {
> > +    handle_type="$1"
> > +    key_type="$2"
> >  
> > -    # Seal the key into TPM
> > -    tpm2_create -Q \
> > -   -C "${primary_file}" \
> > -   -u "${keypub_file}" \
> > -   -r "${keypriv_file}" \
> > -   -L "${policy_file}" \
> > -   -i "${keyfile}" || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to seal \"${keyfile}\": ${ret}" >&2
> > -   return 1
> > -    fi
> > -    tpm2_flushcontext -t || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to flush the transient handles: ${ret}" >&2
> > -   return 1
> > -    fi
> > +    extra_opt=""
> > +    extra_grub_opt=""
> >  
> > -    tpm2_load -Q \
> > -   -C "${primary_file}" \
> > -   -u "${keypub_file}" \
> > -   -r "${keypriv_file}" \
> > -   -n "${name_file}" \
> > -   -c "${sealing_ctx_file}" || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to load the sealed key into TPM: ${ret}" >&2
> > -   return 1
> > -    fi
> > -    tpm2_flushcontext -t || ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to flush the transient handles: ${ret}" >&2
> > -   return 1
> > +    if [ "$handle_type" == "nvindex" ]; then
> > +   nv_index="0x1000000"
> > +    else
> > +   nv_index="0x81000000"
> >      fi
> >  
> > -    tpm2_evictcontrol -Q -C o -c "${sealing_ctx_file}" ${nv_index} || 
> > ret=$?
> > -    if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to store the sealed key into ${nv_index}: ${ret}" >&2
> > -   return 1
> > +    if [ "$key_type" == "tpm2key" ]; then
> > +   extra_opt="--tpm2key"
> > +    else
> > +   extra_grub_opt="--pcrs=0,1"
> >      fi
> >  
> > -    return 0
> > -}
> > -
> > -tpm2_seal_unseal_nv() {
> > -    nv_index="0x81000000"
> > -    pcr_list="sha256:0,1"
> > -
> >      grub_cfg=${tpm2testdir}/testcase.cfg
> >  
> >      # Seal the key into a NV index guarded by PCR 0 and 1
> > -    tpm2_seal_nv "${lukskeyfile}" ${nv_index} ${pcr_list} || ret=$?
> > +    grub-protect ${extra_opt} \
> > +   --tpm2-device="${tpm2dev}" \
> > +   --action=add \
> > +   --protector=tpm2 \
> > +   --tpm2-bank=sha256 \
> > +   --tpm2-pcrs=0,1 \
> > +   --tpm2-keyfile="${lukskeyfile}" \
> > +   --tpm2-nvindex="${nv_index}" || ret=$?
> >      if [ "${ret}" -ne 0 ]; then
> > -   echo "Failed to seal the secret key into ${nv_index}" >&2
> > +   echo "Failed to seal the secret key into ${nv_index}: ${ret}" >&2
> >     return 99
> >      fi
> >  
> >      # Write the TPM unsealing script
> >      cat > ${grub_cfg} <<EOF
> >  loopback luks (host)${luksfile}
> > -tpm2_key_protector_init --mode=nv --nvindex=${nv_index} --pcrs=0,1
> > +tpm2_key_protector_init --mode=nv --nvindex=${nv_index} ${extra_grub_opt}
> >  if cryptomount -a --protector tpm2; then
> >      cat (crypto0)+1
> >  fi
> > @@ -340,7 +273,12 @@ EOF
> >      ${grubshell} --timeout=${timeout} --emu-opts="-t ${tpm2dev}" < 
> > "${grub_cfg}" > "${testoutput}" || ret=$?
> >  
> >      # Remove the object from the NV index
> > -    tpm2_evictcontrol -Q -C o -c "${nv_index}" || :
> > +    grub-protect \
> > +   --tpm2-device="${tpm2dev}" \
> > +   --protector=tpm2 \
> > +   --action=remove \
> > +   --tpm2-nvindex=${nv_index} \
> > +   --tpm2-evict || :
> >  
> >      if [ "${ret}" -eq 0 ]; then
> >     if ! grep -q "^${vtext}$" "${testoutput}"; then
> > @@ -366,24 +304,33 @@ srktests+=("ECC transient fallback_srk")
> >  for i in "${!srktests[@]}"; do
> >      tpm2_seal_unseal ${srktests[$i]} || ret=$?
> >      if [ "${ret}" -eq 0 ]; then
> > -        echo "TPM2 [${srktests[$i]}]: PASS"
> > +   echo "TPM2 [SRK][${srktests[$i]}]: PASS"
> >      elif [ "${ret}" -eq 1 ]; then
> > -        echo "TPM2 [${srktests[$i]}]: FAIL"
> > +   echo "TPM2 [SRK][${srktests[$i]}]: FAIL"
> > +   ret=0
> >      else
> > -   echo "Unexpected failure [${srktests[$i]}]" >&2
> > +   echo "Unexpected failure [SRK][${srktests[$i]}]" >&2
> >     exit ${ret}
> >      fi
> >  done
> >  
> > -# Testcase for NV index mode
> > -tpm2_seal_unseal_nv || ret=$?
> > -if [ "${ret}" -eq 0 ]; then
> > -    echo "TPM2 [NV Index]: PASS"
> > -elif [ "${ret}" -eq 1 ]; then
> > -    echo "TPM2 [NV Index]: FAIL"
> > -else
> > -    echo "Unexpected failure [NV index]" >&2
> > -    exit ${ret}
> > -fi
> > +# Testcases for NV index mode
> > +declare -a nvtests=()
> > +nvtests+=("persistent raw")
> > +nvtests+=("nvindex raw")
> > +nvtests+=("nvindex tpm2key")
> > +
> > +for i in "${!nvtests[@]}"; do
> > +    tpm2_seal_unseal_nv ${nvtests[$i]} || ret=$?
> > +    if [ "${ret}" -eq 0 ]; then
> > +   echo "TPM2 [NV Index][${nvtests[$i]}]: PASS"
> > +    elif [ "${ret}" -eq 1 ]; then
> > +   echo "TPM2 [NV Index][${nvtests[$i]}]: FAIL"
> > +   ret=0
> > +    else
> > +   echo "Unexpected failure [NV index][${nvtests[$i]}]" >&2
> > +   exit ${ret}
> > +    fi
> > +done
> >  
> >  exit 0

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to