duplicate.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. # SPDX-License-Identifier: BSD-3-Clause
  2. source helpers.sh
  3. cleanup() {
  4. rm -f primary.ctx new_parent.prv new_parent.pub new_parent.ctx policy.dat \
  5. session.dat key.prv key.pub key.ctx duppriv.bin dupseed.dat key2.prv \
  6. key2.pub key2.ctx sym_key_in.bin \
  7. primary.pub rsa-priv.pem rsa.pub rsa.priv rsa.dpriv rsa.seed rsa-pub.pem rsa.sig
  8. if [ "$1" != "no-shut-down" ]; then
  9. shut_down
  10. fi
  11. }
  12. trap cleanup EXIT
  13. start_up
  14. create_duplication_policy() {
  15. tpm2 startauthsession -Q -S session.dat
  16. tpm2 policycommandcode -Q -S session.dat -L policy.dat TPM2_CC_Duplicate
  17. tpm2 flushcontext -Q session.dat
  18. rm session.dat
  19. }
  20. start_duplication_session() {
  21. tpm2 startauthsession -Q --policy-session -S session.dat
  22. tpm2 policycommandcode -Q -S session.dat -L policy.dat TPM2_CC_Duplicate
  23. }
  24. end_duplication_session() {
  25. tpm2 flushcontext -Q session.dat
  26. rm session.dat
  27. }
  28. dump_duplication_session() {
  29. rm session.dat
  30. }
  31. dd if=/dev/urandom of=sym_key_in.bin bs=1 count=16 status=none
  32. tpm2 createprimary -Q -C o -g sha256 -G rsa -c primary.ctx
  33. # Create a new parent, we will only use the public portion
  34. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r new_parent.prv \
  35. -u new_parent.pub -a "decrypt|fixedparent|fixedtpm|restricted|\
  36. sensitivedataorigin"
  37. # Create the key we want to duplicate
  38. create_duplication_policy
  39. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r key.prv -u key.pub \
  40. -L policy.dat -a "sensitivedataorigin|sign|decrypt"
  41. tpm2 load -Q -C primary.ctx -r key.prv -u key.pub -c key.ctx
  42. tpm2 loadexternal -Q -C o -u new_parent.pub -c new_parent.ctx
  43. ## Null parent, Null Sym Alg
  44. start_duplication_session
  45. tpm2 duplicate -Q -C null -c key.ctx -G null -p "session:session.dat" \
  46. -r dupprv.bin -s dupseed.dat
  47. end_duplication_session
  48. ## Null Sym Alg
  49. start_duplication_session
  50. tpm2 duplicate -Q -C new_parent.ctx -c key.ctx -G null \
  51. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  52. end_duplication_session
  53. ## Null parent
  54. start_duplication_session
  55. tpm2 duplicate -Q -C null -c key.ctx -G aes -i sym_key_in.bin \
  56. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  57. end_duplication_session
  58. ## AES Sym Alg, user supplied key
  59. start_duplication_session
  60. tpm2 duplicate -Q -C new_parent.ctx -c key.ctx -G aes -i sym_key_in.bin \
  61. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  62. end_duplication_session
  63. ## AES Sym Alg, no user supplied key
  64. start_duplication_session
  65. tpm2 duplicate -Q -C new_parent.ctx -c key.ctx -G aes -o sym_key_out.bin \
  66. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  67. end_duplication_session
  68. ## Repeat the tests with a key that requires encrypted duplication
  69. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r key2.prv -u key2.pub \
  70. -L policy.dat -a "sensitivedataorigin|sign|decrypt|encryptedduplication"
  71. tpm2 load -Q -C primary.ctx -r key2.prv -u key2.pub -c key2.ctx
  72. ## AES Sym Alg, user supplied key
  73. start_duplication_session
  74. tpm2 duplicate -Q -C new_parent.ctx -c key2.ctx -G aes -i sym_key_in.bin \
  75. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  76. end_duplication_session
  77. ## AES Sym Alg, no user supplied key
  78. start_duplication_session
  79. tpm2 duplicate -Q -C new_parent.ctx -c key2.ctx -G aes -o sym_key_out.bin \
  80. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  81. end_duplication_session
  82. ## External RSA key, wrapped for the primary key
  83. tpm2 readpublic -c primary.ctx -o primary.pub
  84. openssl genrsa -out rsa-priv.pem
  85. openssl rsa -in rsa-priv.pem -pubout > rsa-pub.pem
  86. tpm2 duplicate \
  87. -U primary.pub \
  88. -G rsa \
  89. -k rsa-priv.pem \
  90. -u rsa.pub \
  91. -r rsa.dpriv \
  92. -s rsa.seed
  93. tpm2 import \
  94. -C primary.ctx \
  95. -G rsa \
  96. -i rsa.dpriv \
  97. -s rsa.seed \
  98. -u rsa.pub \
  99. -r rsa.priv
  100. # validate that TPM signatures with this imported key are acceptable to OpenSSL
  101. tpm2 load \
  102. -C primary.ctx \
  103. -c rsa.ctx \
  104. -u rsa.pub \
  105. -r rsa.priv
  106. echo foo | tpm2 sign \
  107. -c rsa.ctx \
  108. -o rsa.sig \
  109. -f plain
  110. echo foo | openssl dgst \
  111. -sha256 \
  112. -verify rsa-pub.pem \
  113. -signature rsa.sig
  114. trap - ERR
  115. ## Null parent - should fail (TPM_RC_HIERARCHY)
  116. start_duplication_session
  117. tpm2 duplicate -Q -C null -c key2.ctx -G aes -i sym_key_in.bin \
  118. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  119. if [ $? -eq 0 ]; then
  120. echo "Expected \"tpm2 duplicate -C null \" to fail."
  121. exit 1
  122. fi
  123. dump_duplication_session
  124. ## Null Sym Alg - should fail (TPM_RC_SYMMETRIC)
  125. start_duplication_session
  126. tpm2 duplicate -Q -C new_parent.ctx -c key2.ctx -G null \
  127. -p "session:session.dat" -r dupprv.bin -s dupseed.dat
  128. if [ $? -eq 0 ]; then
  129. echo "Expected \"tpm2 duplicate -G null \" to fail."
  130. exit 1
  131. fi
  132. dump_duplication_session
  133. exit 0