abrmd_policynamehash.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. # SPDX-License-Identifier: BSD-3-Clause
  2. source helpers.sh
  3. cleanup() {
  4. rm -f helpers.sh signing_key_private.pem signing_key_public.pem \
  5. signing_key.ctx signing_key.name authorized.policy policy.dat \
  6. primary.ctx key.prv key.pub key.ctx new_parent.prv new_parent.pub \
  7. new_parent.ctx new_parent.name key.name name.hash policy.namehash \
  8. policynamehash.signature policy.namehash verification.tkt dupprv.bin \
  9. dupseed.dat
  10. tpm2 flushcontext session.ctx 2>/dev/null || true
  11. if [ "${1}" != "no-shutdown" ]; then
  12. shut_down
  13. fi
  14. }
  15. trap cleanup EXIT
  16. start_up
  17. cleanup "no-shutdown"
  18. #
  19. # Restrict key duplication to specific new parent and specific duplicable key.
  20. #
  21. # Generate a duplicable object
  22. openssl genrsa -out signing_key_private.pem 2048
  23. openssl rsa -in signing_key_private.pem -out signing_key_public.pem -pubout
  24. tpm2 loadexternal -G rsa -C o -u signing_key_public.pem -c signing_key.ctx \
  25. -n signing_key.name
  26. tpm2 startauthsession -S session.ctx -g sha256
  27. tpm2 policyauthorize -S session.ctx -L authorized.policy -n signing_key.name
  28. tpm2 policycommandcode -S session.ctx -L policy.dat TPM2_CC_Duplicate
  29. tpm2 flushcontext session.ctx
  30. tpm2 createprimary -C o -g sha256 -G rsa -c primary.ctx -Q
  31. ## The duplicable key
  32. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r key.prv -u key.pub \
  33. -L policy.dat -a "sensitivedataorigin|sign|decrypt"
  34. tpm2 load -Q -C primary.ctx -r key.prv -u key.pub -c key.ctx
  35. # Create the new parent
  36. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r new_parent.prv \
  37. -u new_parent.pub \
  38. -a "decrypt|fixedparent|fixedtpm|restricted|sensitivedataorigin"
  39. tpm2 loadexternal -Q -C o -u new_parent.pub -c new_parent.ctx
  40. # Modify the duplicable key policy to namehash policy to restrict parent and key
  41. tpm2 readpublic -Q -c new_parent.ctx -n new_parent.name
  42. tpm2 readpublic -Q -c key.ctx -n key.name
  43. cat key.name new_parent.name | openssl dgst -sha256 -binary > name.hash
  44. tpm2 startauthsession -S session.ctx -g sha256
  45. tpm2 policynamehash -L policy.namehash -S session.ctx -n name.hash
  46. tpm2 flushcontext session.ctx
  47. openssl dgst -sha256 -sign signing_key_private.pem \
  48. -out policynamehash.signature policy.namehash
  49. tpm2 startauthsession -S session.ctx -g sha256
  50. tpm2 policyauthorize -S session.ctx -L authorized.policy -i policy.namehash \
  51. -n signing_key.name
  52. tpm2 policycommandcode -S session.ctx -L policy.dat TPM2_CC_Duplicate
  53. tpm2 flushcontext session.ctx
  54. # Satisfy the policy and attempt key duplication
  55. tpm2 verifysignature -c signing_key.ctx -g sha256 -m policy.namehash \
  56. -s policynamehash.signature -t verification.tkt -f rsassa
  57. tpm2 startauthsession -S session.ctx --policy-session -g sha256
  58. tpm2 policynamehash -S session.ctx -n name.hash
  59. tpm2 policyauthorize -S session.ctx -i policy.namehash -n signing_key.name \
  60. -t verification.tkt
  61. tpm2 policycommandcode -S session.ctx TPM2_CC_Duplicate
  62. tpm2 duplicate -C new_parent.ctx -c key.ctx -G null -p "session:session.ctx" \
  63. -r dupprv.bin -s dupseed.dat
  64. tpm2 flushcontext session.ctx
  65. # Attempt duplicating the key to a parent that is not in the policynamehash
  66. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r unintended_parent.prv \
  67. -u unintended_parent.pub \
  68. -a "decrypt|fixedparent|fixedtpm|restricted|sensitivedataorigin"
  69. tpm2 loadexternal -Q -C o -u unintended_parent.pub -c unintended_parent.ctx
  70. tpm2 startauthsession -S session.ctx --policy-session -g sha256
  71. tpm2 policynamehash -S session.ctx -n name.hash
  72. tpm2 policyauthorize -S session.ctx -i policy.namehash -n signing_key.name \
  73. -t verification.tkt
  74. tpm2 policycommandcode -S session.ctx TPM2_CC_Duplicate
  75. trap - ERR
  76. tpm2 duplicate -C unintended_parent.ctx -c key.ctx -G null \
  77. -p "session:session.ctx" -r dupprv.bin -s dupseed.dat
  78. if [ $? == 0 ];then
  79. echo "ERROR: Duplication had to fail!"
  80. exit 1
  81. fi
  82. trap onerror ERR
  83. tpm2 flushcontext session.ctx
  84. exit 0