@@ -4309,7 +4309,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
43094309 */
43104310static int
43114311crypt_message (struct TCP_Server_Info * server , int num_rqst ,
4312- struct smb_rqst * rqst , int enc )
4312+ struct smb_rqst * rqst , int enc , struct crypto_aead * tfm )
43134313{
43144314 struct smb2_transform_hdr * tr_hdr =
43154315 (struct smb2_transform_hdr * )rqst [0 ].rq_iov [0 ].iov_base ;
@@ -4320,8 +4320,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
43204320 u8 key [SMB3_ENC_DEC_KEY_SIZE ];
43214321 struct aead_request * req ;
43224322 u8 * iv ;
4323- DECLARE_CRYPTO_WAIT (wait );
4324- struct crypto_aead * tfm ;
43254323 unsigned int crypt_len = le32_to_cpu (tr_hdr -> OriginalMessageSize );
43264324 void * creq ;
43274325 size_t sensitive_size ;
@@ -4333,14 +4331,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
43334331 return rc ;
43344332 }
43354333
4336- rc = smb3_crypto_aead_allocate (server );
4337- if (rc ) {
4338- cifs_server_dbg (VFS , "%s: crypto alloc failed\n" , __func__ );
4339- return rc ;
4340- }
4341-
4342- tfm = enc ? server -> secmech .enc : server -> secmech .dec ;
4343-
43444334 if ((server -> cipher_type == SMB2_ENCRYPTION_AES256_CCM ) ||
43454335 (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
43464336 rc = crypto_aead_setkey (tfm , key , SMB3_GCM256_CRYPTKEY_SIZE );
@@ -4380,11 +4370,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
43804370 aead_request_set_crypt (req , sg , sg , crypt_len , iv );
43814371 aead_request_set_ad (req , assoc_data_len );
43824372
4383- aead_request_set_callback (req , CRYPTO_TFM_REQ_MAY_BACKLOG ,
4384- crypto_req_done , & wait );
4385-
4386- rc = crypto_wait_req (enc ? crypto_aead_encrypt (req )
4387- : crypto_aead_decrypt (req ), & wait );
4373+ rc = enc ? crypto_aead_encrypt (req ) : crypto_aead_decrypt (req );
43884374
43894375 if (!rc && enc )
43904376 memcpy (& tr_hdr -> Signature , sign , SMB2_SIGNATURE_SIZE );
@@ -4526,7 +4512,7 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
45264512 /* fill the 1st iov with a transform header */
45274513 fill_transform_hdr (tr_hdr , orig_len , old_rq , server -> cipher_type );
45284514
4529- rc = crypt_message (server , num_rqst , new_rq , 1 );
4515+ rc = crypt_message (server , num_rqst , new_rq , 1 , server -> secmech . enc );
45304516 cifs_dbg (FYI , "Encrypt message returned %d\n" , rc );
45314517 if (rc )
45324518 goto err_free ;
@@ -4551,8 +4537,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
45514537 unsigned int buf_data_size , struct iov_iter * iter ,
45524538 bool is_offloaded )
45534539{
4554- struct kvec iov [ 2 ] ;
4540+ struct crypto_aead * tfm ;
45554541 struct smb_rqst rqst = {NULL };
4542+ struct kvec iov [2 ];
45564543 size_t iter_size = 0 ;
45574544 int rc ;
45584545
@@ -4568,9 +4555,31 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
45684555 iter_size = iov_iter_count (iter );
45694556 }
45704557
4571- rc = crypt_message (server , 1 , & rqst , 0 );
4558+ if (is_offloaded ) {
4559+ if ((server -> cipher_type == SMB2_ENCRYPTION_AES128_GCM ) ||
4560+ (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4561+ tfm = crypto_alloc_aead ("gcm(aes)" , 0 , 0 );
4562+ else
4563+ tfm = crypto_alloc_aead ("ccm(aes)" , 0 , 0 );
4564+ if (IS_ERR (tfm )) {
4565+ rc = PTR_ERR (tfm );
4566+ cifs_server_dbg (VFS , "%s: Failed alloc decrypt TFM, rc=%d\n" , __func__ , rc );
4567+
4568+ return rc ;
4569+ }
4570+ } else {
4571+ if (unlikely (!server -> secmech .dec ))
4572+ return - EIO ;
4573+
4574+ tfm = server -> secmech .dec ;
4575+ }
4576+
4577+ rc = crypt_message (server , 1 , & rqst , 0 , tfm );
45724578 cifs_dbg (FYI , "Decrypt message returned %d\n" , rc );
45734579
4580+ if (is_offloaded )
4581+ crypto_free_aead (tfm );
4582+
45744583 if (rc )
45754584 return rc ;
45764585
0 commit comments