@@ -4254,7 +4254,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
42544254 */
42554255static int
42564256crypt_message (struct TCP_Server_Info * server , int num_rqst ,
4257- struct smb_rqst * rqst , int enc )
4257+ struct smb_rqst * rqst , int enc , struct crypto_aead * tfm )
42584258{
42594259 struct smb2_transform_hdr * tr_hdr =
42604260 (struct smb2_transform_hdr * )rqst [0 ].rq_iov [0 ].iov_base ;
@@ -4265,8 +4265,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
42654265 u8 key [SMB3_ENC_DEC_KEY_SIZE ];
42664266 struct aead_request * req ;
42674267 u8 * iv ;
4268- DECLARE_CRYPTO_WAIT (wait );
4269- struct crypto_aead * tfm ;
42704268 unsigned int crypt_len = le32_to_cpu (tr_hdr -> OriginalMessageSize );
42714269 void * creq ;
42724270 size_t sensitive_size ;
@@ -4278,14 +4276,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
42784276 return rc ;
42794277 }
42804278
4281- rc = smb3_crypto_aead_allocate (server );
4282- if (rc ) {
4283- cifs_server_dbg (VFS , "%s: crypto alloc failed\n" , __func__ );
4284- return rc ;
4285- }
4286-
4287- tfm = enc ? server -> secmech .enc : server -> secmech .dec ;
4288-
42894279 if ((server -> cipher_type == SMB2_ENCRYPTION_AES256_CCM ) ||
42904280 (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
42914281 rc = crypto_aead_setkey (tfm , key , SMB3_GCM256_CRYPTKEY_SIZE );
@@ -4325,11 +4315,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
43254315 aead_request_set_crypt (req , sg , sg , crypt_len , iv );
43264316 aead_request_set_ad (req , assoc_data_len );
43274317
4328- aead_request_set_callback (req , CRYPTO_TFM_REQ_MAY_BACKLOG ,
4329- crypto_req_done , & wait );
4330-
4331- rc = crypto_wait_req (enc ? crypto_aead_encrypt (req )
4332- : crypto_aead_decrypt (req ), & wait );
4318+ rc = enc ? crypto_aead_encrypt (req ) : crypto_aead_decrypt (req );
43334319
43344320 if (!rc && enc )
43354321 memcpy (& tr_hdr -> Signature , sign , SMB2_SIGNATURE_SIZE );
@@ -4436,7 +4422,7 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
44364422 /* fill the 1st iov with a transform header */
44374423 fill_transform_hdr (tr_hdr , orig_len , old_rq , server -> cipher_type );
44384424
4439- rc = crypt_message (server , num_rqst , new_rq , 1 );
4425+ rc = crypt_message (server , num_rqst , new_rq , 1 , server -> secmech . enc );
44404426 cifs_dbg (FYI , "Encrypt message returned %d\n" , rc );
44414427 if (rc )
44424428 goto err_free ;
@@ -4461,8 +4447,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
44614447 unsigned int buf_data_size , struct iov_iter * iter ,
44624448 bool is_offloaded )
44634449{
4464- struct kvec iov [ 2 ] ;
4450+ struct crypto_aead * tfm ;
44654451 struct smb_rqst rqst = {NULL };
4452+ struct kvec iov [2 ];
44664453 size_t iter_size = 0 ;
44674454 int rc ;
44684455
@@ -4479,9 +4466,31 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
44794466 iter_size = iov_iter_count (iter );
44804467 }
44814468
4482- rc = crypt_message (server , 1 , & rqst , 0 );
4469+ if (is_offloaded ) {
4470+ if ((server -> cipher_type == SMB2_ENCRYPTION_AES128_GCM ) ||
4471+ (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4472+ tfm = crypto_alloc_aead ("gcm(aes)" , 0 , 0 );
4473+ else
4474+ tfm = crypto_alloc_aead ("ccm(aes)" , 0 , 0 );
4475+ if (IS_ERR (tfm )) {
4476+ rc = PTR_ERR (tfm );
4477+ cifs_server_dbg (VFS , "%s: Failed alloc decrypt TFM, rc=%d\n" , __func__ , rc );
4478+
4479+ return rc ;
4480+ }
4481+ } else {
4482+ if (unlikely (!server -> secmech .dec ))
4483+ return - EIO ;
4484+
4485+ tfm = server -> secmech .dec ;
4486+ }
4487+
4488+ rc = crypt_message (server , 1 , & rqst , 0 , tfm );
44834489 cifs_dbg (FYI , "Decrypt message returned %d\n" , rc );
44844490
4491+ if (is_offloaded )
4492+ crypto_free_aead (tfm );
4493+
44854494 if (rc )
44864495 return rc ;
44874496
0 commit comments