encryptdecrypt.sh 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # SPDX-License-Identifier: BSD-3-Clause
  2. source helpers.sh
  3. cleanup() {
  4. rm -f primary.ctx decrypt.ctx key.pub key.priv key.name decrypt.out \
  5. decrypt2.out encrypt.out encrypt2.out secret.dat secret2.dat \
  6. iv.dat iv2.dat key128.ctx plain.dec128.tpm plain.dec256.tpm plain.enc128.tpm \
  7. plain.enc256.tpm sym128.key key256.ctx plain.dec128.ssl plain.dec256.ssl \
  8. plain.enc128.ssl plain.enc256.ssl plain.txt sym256.key
  9. if [ "$1" != "no-shut-down" ]; then
  10. shut_down
  11. fi
  12. }
  13. trap cleanup EXIT
  14. start_up
  15. cleanup "no-shut-down"
  16. if ! is_cmd_supported "EncryptDecrypt"; then
  17. echo "Command EncryptDecrypt is not supported by your device, skipping..."
  18. skip_test
  19. fi
  20. echo "12345678" > secret.dat
  21. tpm2 clear -Q
  22. tpm2 createprimary -Q -C e -g sha1 -G rsa -c primary.ctx
  23. tpm2 create -Q -g sha256 -G aes -u key.pub -r key.priv -C primary.ctx
  24. tpm2 load -Q -C primary.ctx -u key.pub -r key.priv -n key.name -c decrypt.ctx
  25. tpm2 encryptdecrypt -Q -c decrypt.ctx -o encrypt.out secret.dat
  26. tpm2 encryptdecrypt -Q -c decrypt.ctx -d -o decrypt.out encrypt.out
  27. # Test using stdin/stdout
  28. cat secret.dat | tpm2 encryptdecrypt -c decrypt.ctx | tpm2 encryptdecrypt \
  29. -c decrypt.ctx -d > secret2.dat
  30. # test using IVs
  31. dd if=/dev/urandom of=iv.dat bs=16 count=1
  32. cat secret.dat | tpm2 encryptdecrypt -c decrypt.ctx --iv iv.dat | \
  33. tpm2 encryptdecrypt -c decrypt.ctx --iv iv.dat:iv2.dat -d > secret2.dat
  34. cmp secret.dat secret2.dat
  35. # Test using specified object modes
  36. tpm2 create -Q -G aes128cbc -u key.pub -r key.priv -C primary.ctx
  37. rm decrypt.ctx
  38. tpm2 load -Q -C primary.ctx -u key.pub -r key.priv -n key.name -c decrypt.ctx
  39. # We need to perform cbc on blocksize of 16
  40. echo -n 1234567812345678 > secret.dat
  41. # specified mode
  42. tpm2 encryptdecrypt -Q -c decrypt.ctx -G cbc --iv=iv.dat -o encrypt.out \
  43. secret.dat
  44. # Unspecified mode (figure out via readpublic)
  45. tpm2 encryptdecrypt -Q -d -c decrypt.ctx --iv iv.dat -o decrypt.out encrypt.out
  46. cmp secret.dat decrypt.out
  47. # Test that iv looping works
  48. tpm2 encryptdecrypt -Q -c decrypt.ctx -G cbc --iv=iv.dat:iv2.dat \
  49. -o encrypt.out secret.dat
  50. tpm2 encryptdecrypt -Q -c decrypt.ctx -G cbc --iv=iv2.dat -o encrypt2.out \
  51. secret.dat
  52. tpm2 encryptdecrypt -Q -d -c decrypt.ctx --iv iv.dat -o decrypt.out encrypt.out
  53. tpm2 encryptdecrypt -Q -d -c decrypt.ctx --iv iv2.dat -o decrypt2.out \
  54. encrypt2.out
  55. cmp secret.dat decrypt.out
  56. cmp secret.dat decrypt2.out
  57. # Test that input data sizes greater than TPM2_MAX_BUFFER or 1024 work
  58. dd if=/dev/zero bs=1 count=2048 status=none of=secret2.dat
  59. cat secret2.dat | tpm2 encryptdecrypt -Q -c decrypt.ctx -o encrypt.out
  60. tpm2 encryptdecrypt -Q -c decrypt.ctx -d -o decrypt.out encrypt.out
  61. cmp secret2.dat decrypt.out
  62. # Test that last block in input data shorter than block length has pkcs7 padding
  63. dd if=/dev/zero bs=1 count=2050 status=none of=secret2.dat
  64. cat secret2.dat | tpm2 encryptdecrypt -Q -c decrypt.ctx -o encrypt.out -e
  65. tpm2 encryptdecrypt -Q -c decrypt.ctx -d -o decrypt.out encrypt.out
  66. ## Last block is short 14 or hex 0E trailing bytes
  67. echo 0e0e0e0e0e0e0e0e0e0e0e0e0e0e | xxd -r -p >> secret2.dat
  68. cmp secret2.dat decrypt.out
  69. # Test that pkcs7 padding is added as last block for block length aligned inputs
  70. dd if=/dev/zero bs=1 count=2048 status=none of=secret2.dat
  71. cat secret2.dat | tpm2 encryptdecrypt -Q -c decrypt.ctx -o encrypt.out -e
  72. tpm2 encryptdecrypt -Q -c decrypt.ctx -d -o decrypt.out encrypt.out
  73. ## Last block is short 14 or hex 0E trailing bytes
  74. echo 10101010101010101010101010101010 | xxd -r -p >> secret2.dat
  75. cmp secret2.dat decrypt.out
  76. # Test pkcs7 padding is stripped from input data is shorter than block length
  77. dd if=/dev/zero bs=1 count=2050 status=none of=secret2.dat
  78. cat secret2.dat | tpm2 encryptdecrypt -Q -c decrypt.ctx -o encrypt.out -e
  79. tpm2 encryptdecrypt -Q -c decrypt.ctx -d -o decrypt.out -e encrypt.out
  80. cmp secret2.dat decrypt.out
  81. # Test that pkcs7 pad is stripped off last block for block length aligned inputs
  82. dd if=/dev/zero bs=1 count=2048 status=none of=secret2.dat
  83. cat secret2.dat | tpm2 encryptdecrypt -Q -c decrypt.ctx -o encrypt.out -e
  84. tpm2 encryptdecrypt -Q -c decrypt.ctx -d -o decrypt.out -e encrypt.out
  85. cmp secret2.dat decrypt.out
  86. # Negative that bad mode fails
  87. trap - ERR
  88. # mode CFB should fail, since the object was explicitly created with mode CBC
  89. tpm2 encryptdecrypt -Q -c decrypt.ctx -G cfb --iv=iv.dat -o encrypt.out \
  90. secret.dat
  91. # set the error handler for checking interoperability with openssl
  92. trap onerror ERR
  93. # Testing interoperability with openssl - Also exercises PKCS7 padding
  94. dd if=/dev/urandom of=sym128.key bs=1 count=16
  95. dd if=/dev/urandom of=sym256.key bs=1 count=32
  96. tpm2 loadexternal -C n -G aes -r sym128.key -c key128.ctx
  97. tpm2 loadexternal -C n -G aes -r sym256.key -c key256.ctx
  98. echo "plaintext" > plain.txt
  99. ## Encrypt with ossl and tpm for cbc mode that requires padding
  100. ### Key size = 128
  101. openssl enc -in plain.txt -out plain.enc128.ssl -K `xxd -c 128 -p sym128.key` \
  102. -aes-128-cbc -iv 0
  103. tpm2 encryptdecrypt -c key128.ctx -o plain.enc128.tpm -e -G cbc plain.txt
  104. diff plain.enc128.ssl plain.enc128.tpm
  105. ### Key size = 256
  106. openssl enc -in plain.txt -out plain.enc256.ssl -K `xxd -c 256 -p sym256.key` \
  107. -aes-256-cbc -iv 0
  108. tpm2 encryptdecrypt -c key256.ctx -o plain.enc256.tpm -e -G cbc plain.txt
  109. diff plain.enc256.ssl plain.enc256.tpm
  110. ## Decrypt ciphertext from tpm in openssl and vice versa
  111. ### Key size = 128
  112. tpm2 encryptdecrypt -c key128.ctx -o plain.dec128.tpm -e \
  113. -G cbc -d plain.enc128.ssl
  114. diff plain.dec128.tpm plain.txt
  115. openssl enc -d -in plain.enc128.tpm -out plain.dec128.ssl -aes-128-cbc -iv 0 \
  116. -K `xxd -c 128 -p sym128.key`
  117. diff plain.dec128.ssl plain.txt
  118. ### Key size = 256
  119. tpm2 encryptdecrypt -c key256.ctx -o plain.dec256.tpm -e \
  120. -G cbc -d plain.enc256.ssl
  121. diff plain.dec256.tpm plain.txt
  122. openssl enc -d -in plain.enc256.tpm -out plain.dec256.ssl -aes-256-cbc -iv 0 \
  123. -K `xxd -c 256 -p sym256.key`
  124. diff plain.dec256.ssl plain.txt
  125. ## Encrypt with ossl and tpm for cfb mode that does not apply padding
  126. ### Key size = 128
  127. openssl enc -in plain.txt -out plain.enc128.ssl -K `xxd -c 128 -p sym128.key` \
  128. -aes-128-cfb -iv 0
  129. tpm2 encryptdecrypt -c key128.ctx -o plain.enc128.tpm -G cfb plain.txt
  130. diff plain.enc128.ssl plain.enc128.tpm
  131. ### Key size = 256
  132. openssl enc -in plain.txt -out plain.enc256.ssl -K `xxd -c 256 -p sym256.key` \
  133. -aes-256-cfb -iv 0
  134. tpm2 encryptdecrypt -c key256.ctx -o plain.enc256.tpm -G cfb plain.txt
  135. diff plain.enc256.ssl plain.enc256.tpm
  136. ## Decrypt ciphertext from tpm in openssl and vice versa
  137. ### Key size = 128
  138. tpm2 encryptdecrypt -c key128.ctx -o plain.dec128.tpm \
  139. -G cfb -d plain.enc128.ssl
  140. diff plain.dec128.tpm plain.txt
  141. openssl enc -d -in plain.enc128.tpm -out plain.dec128.ssl -aes-128-cfb -iv 0 \
  142. -K `xxd -c 128 -p sym128.key`
  143. diff plain.dec128.ssl plain.txt
  144. ### Key size = 256
  145. tpm2 encryptdecrypt -c key256.ctx -o plain.dec256.tpm \
  146. -G cfb -d plain.enc256.ssl
  147. diff plain.dec256.tpm plain.txt
  148. openssl enc -d -in plain.enc256.tpm -out plain.dec256.ssl -aes-256-cfb -iv 0 \
  149. -K `xxd -c 256 -p sym256.key`
  150. diff plain.dec256.ssl plain.txt
  151. exit 0