import_tpm.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. # SPDX-License-Identifier: BSD-3-Clause
  2. source helpers.sh
  3. cleanup() {
  4. rm -f primary.ctx \
  5. new_parent.prv new_parent.pub new_parent.ctx \
  6. ipolicy.dat dpolicy.dat session.dat \
  7. key.prv key.pub key.ctx \
  8. dup.prv dup.pub dup.seed \
  9. key2.prv key2.pub key2.ctx \
  10. sym_key_in.bin \
  11. dup.ctx
  12. if [ "$1" != "no-shut-down" ]; then
  13. shut_down
  14. fi
  15. }
  16. trap cleanup EXIT
  17. start_up
  18. create_policy() {
  19. tpm2 startauthsession -Q -S session.dat
  20. tpm2 policycommandcode -Q -S session.dat -L $1 $2
  21. tpm2 flushcontext -Q session.dat
  22. rm session.dat
  23. }
  24. start_session() {
  25. tpm2 startauthsession -Q --policy-session -S session.dat
  26. tpm2 policycommandcode -Q -S session.dat -L $1 $2
  27. }
  28. end_session() {
  29. tpm2 flushcontext -Q session.dat
  30. rm session.dat
  31. }
  32. create_load_new_parent() {
  33. # Create new parent
  34. tpm2 create -Q -C primary.ctx -g sha256 -G rsa -r new_parent.prv \
  35. -u new_parent.pub -a "restricted|sensitivedataorigin|decrypt|userwithauth"
  36. # Load new parent key, only the public part
  37. tpm2 loadexternal -Q -C o -u new_parent.pub -c new_parent.ctx
  38. }
  39. load_new_parent() {
  40. # Load new parent key, public & private parts
  41. tpm2 load -Q -C primary.ctx -r new_parent.prv -u new_parent.pub \
  42. -c new_parent.ctx
  43. }
  44. create_load_duplicatee() {
  45. # Create the key we want to duplicate
  46. create_policy dpolicy.dat TPM2_CC_Duplicate
  47. if [ -z "$2" ];then
  48. tpm2 create -Q -C primary.ctx -g sha256 -G $1 -r key.prv \
  49. -u key.pub -L dpolicy.dat -a "sensitivedataorigin|decrypt|userwithauth"
  50. else
  51. tpm2 create -Q -C primary.ctx -g sha256 -G $1 -p "$2" -r key.prv \
  52. -u key.pub -L dpolicy.dat -a "sensitivedataorigin|decrypt|userwithauth"
  53. fi
  54. # Load the key
  55. tpm2 load -Q -C primary.ctx -r key.prv -u key.pub -c key.ctx
  56. # Extract the public part for import later
  57. tpm2 readpublic -Q -c key.ctx -o dup.pub
  58. }
  59. do_duplication() {
  60. start_session dpolicy.dat TPM2_CC_Duplicate
  61. if [ "$2" = "aes" ]
  62. then
  63. tpm2 duplicate -Q -C new_parent.ctx -c key.ctx -G aes -o sym.key \
  64. -p "session:session.dat" -r dup.dup -s dup.seed
  65. else
  66. tpm2 duplicate -Q -C new_parent.ctx -c key.ctx -G null \
  67. -p "session:session.dat" -r dup.dup -s dup.seed
  68. fi
  69. end_session
  70. }
  71. do_import_load() {
  72. if [ "$2" = "aes" ]
  73. then
  74. tpm2 import -Q -C new_parent.ctx -k sym.key -u dup.pub -i dup.dup \
  75. -r dup.prv -s dup.seed
  76. else
  77. tpm2 import -Q -C new_parent.ctx -u dup.pub -i dup.dup -r dup.prv \
  78. -s dup.seed
  79. fi
  80. tpm2 load -Q -C new_parent.ctx -r dup.prv -u dup.pub -c dup.ctx
  81. }
  82. test() {
  83. # New parent ...
  84. create_load_new_parent
  85. # Key to be duplicated
  86. create_load_duplicatee $1
  87. # Duplicate the key
  88. do_duplication $2
  89. # Remove, we're done with it
  90. rm new_parent.ctx
  91. # Load the full thing this time
  92. load_new_parent
  93. # Import & load the duplicate
  94. do_import_load $2
  95. }
  96. # Part 1 : Duplicate 3 varieties of key (aes, rsa or ecc)
  97. # and protect them using sym_alg null or aes, verify they
  98. # can be imported & loaded
  99. for dup_key_type in aes rsa ecc; do
  100. for sym_key_type in aes null; do
  101. tpm2 createprimary -Q -C o -g sha256 -G rsa -c primary.ctx
  102. test $dup_key_type $sym_key_type
  103. cleanup "no-shut-down"
  104. done
  105. done
  106. test_key_usage() {
  107. # Part 2 :
  108. # Create a rsa key (Kd)
  109. # Encrypt a message using Kd
  110. # Duplicate Kd
  111. # Import & Load Kd
  112. # Decrypt the message and verify
  113. tpm2 createprimary -Q -C o -g sha256 -G rsa -c primary.ctx
  114. # New parent ...
  115. create_load_new_parent
  116. # Key to be duplicated
  117. create_load_duplicatee rsa "$1"
  118. # Encrypt a secret message
  119. echo "Mary had a little lamb ..." > plain.txt
  120. tpm2 rsaencrypt -Q -c key.ctx -o cipher.txt plain.txt
  121. # Duplicate the key
  122. do_duplication null
  123. # Remove, we're done with it
  124. rm new_parent.ctx
  125. # Load the full thing this time
  126. load_new_parent
  127. # Import & load the duplicate
  128. do_import_load null
  129. # Decrypt the secret message using duplicated key
  130. if [ -z "$1" ];then
  131. tpm2 rsadecrypt -Q -c dup.ctx -o recovered.txt cipher.txt
  132. else
  133. tpm2 rsadecrypt -Q -p "$1" -c dup.ctx -o recovered.txt cipher.txt
  134. fi
  135. # Check we got it right ...
  136. diff recovered.txt plain.txt
  137. # Cleanup
  138. rm plain.txt recovered.txt cipher.txt
  139. cleanup "no-shut-down"
  140. }
  141. #Test key with password
  142. test_key_usage foo
  143. #Test key without password
  144. test_key_usage
  145. exit 0