@@ -10,7 +10,7 @@ use tss_esapi::{
1010 interface_types:: {
1111 algorithm:: { HashingAlgorithm , PublicAlgorithm , SymmetricMode } ,
1212 key_bits:: AesKeyBits ,
13- resource_handles :: Hierarchy ,
13+ reserved_handles :: Hierarchy ,
1414 } ,
1515 structures:: {
1616 CreatePrimaryKeyResult , Digest , InitialValue , MaxBuffer , PublicBuilder ,
@@ -73,27 +73,25 @@ fn main() {
7373
7474 // The data we wish to encrypt. Be aware that there is a limit to the size of this data
7575 // that can be encrypted or decrypted (1024 bytes). In some cases you may need to encrypt a
76- // " content encryption key" , which can be decrypted and released and then used to decrypt
76+ // content encryption key (CEK) , which can be decrypted and released and then used to decrypt
7777 // the actual data in question outside of the TPM.
7878 //
79- // TPMs also tend to be "slower" for encryption/decryption, so you may consider the
79+ // TPMs also tend to be "slower" for encryption/decryption, so you should consider the
8080 // CEK pattern for performance reasons.
8181 let data_to_encrypt = "TPMs are super cool, you should use them!"
8282 . as_bytes ( )
8383 . to_vec ( ) ;
8484
8585 eprintln ! ( "{:?}" , data_to_encrypt. len( ) ) ;
8686
87- // Input data needs to always be a multiple of AES_BLOCK_SIZE, so we implement PKCS7 padding
88- // to achieve this.
87+ // Input data needs to always be a multiple of the AES block size, in this case which is 16
88+ // bytes for AES-128-CBC. Normally you *MUST* implement a secure padding scheme such as pkcs7
89+ // but in this example we will *manually* pad the data.
8990
90- // REVIEW NOTE: Tss-esapi likely should expose these as constants from AesKeyBits::Aes128
91- // to prevent ambiguity!
91+ // WARNING: Manually implemented pkcs7 follows. This has not been audited. Don't use this
92+ // in production.
9293 const AES_BLOCK_SIZE : usize = 16 ;
9394
94- // REVIEW NOTE: Should we added PKCS7 padding as a function to MaxBuffer to prevent
95- // people needing to "roll their own"?
96-
9795 let need_k_bytes = AES_BLOCK_SIZE - ( data_to_encrypt. len ( ) % AES_BLOCK_SIZE ) ;
9896 // PKCS7 always pads to remove ambiguous situations.
9997 let need_k_bytes = if need_k_bytes == 0 {
@@ -109,11 +107,12 @@ fn main() {
109107
110108 let padded_data_to_encrypt = MaxBuffer :: try_from ( padded_data_to_encrypt) . unwrap ( ) ;
111109
112- // Padding always has to be added.
110+ // Padding always has to be added in pkcs7 to make it unambiguous .
113111 assert_ne ! (
114112 data_to_encrypt. as_slice( ) ,
115113 padded_data_to_encrypt. as_slice( )
116114 ) ;
115+ // END WARNING
117116
118117 // AES requires a random initial_value before any encryption or decryption. This must
119118 // be persisted with the encrypted data, else decryption can not be performed.
@@ -174,6 +173,9 @@ fn main() {
174173 panic ! ( "Should not be empty" ) ;
175174 }
176175
176+ // WARNING: Manually implemented pkcs7 follows. This has not been audited. Don't use this
177+ // in production.
178+
177179 let last_byte = decrypted_data. len ( ) - 1 ;
178180 let k_byte = decrypted_data[ last_byte] ;
179181 // Since pkcs7 padding repeats this byte k times, we check that this byte
@@ -194,6 +196,8 @@ fn main() {
194196 let mut decrypted_data = decrypted_data. to_vec ( ) ;
195197 decrypted_data. truncate ( truncate_to) ;
196198
199+ // END WARNING
200+
197201 println ! ( "data_to_encrypt = {:?}" , data_to_encrypt) ;
198202 println ! ( "decrypted_data = {:?}" , decrypted_data) ;
199203 // They are the same!
0 commit comments