@@ -4488,7 +4488,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
4488
4488
*/
4489
4489
static int
4490
4490
crypt_message (struct TCP_Server_Info * server , int num_rqst ,
4491
- struct smb_rqst * rqst , int enc )
4491
+ struct smb_rqst * rqst , int enc , struct crypto_aead * tfm )
4492
4492
{
4493
4493
struct smb2_transform_hdr * tr_hdr =
4494
4494
(struct smb2_transform_hdr * )rqst [0 ].rq_iov [0 ].iov_base ;
@@ -4499,8 +4499,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4499
4499
u8 key [SMB3_ENC_DEC_KEY_SIZE ];
4500
4500
struct aead_request * req ;
4501
4501
u8 * iv ;
4502
- DECLARE_CRYPTO_WAIT (wait );
4503
- struct crypto_aead * tfm ;
4504
4502
unsigned int crypt_len = le32_to_cpu (tr_hdr -> OriginalMessageSize );
4505
4503
void * creq ;
4506
4504
@@ -4511,14 +4509,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4511
4509
return rc ;
4512
4510
}
4513
4511
4514
- rc = smb3_crypto_aead_allocate (server );
4515
- if (rc ) {
4516
- cifs_server_dbg (VFS , "%s: crypto alloc failed\n" , __func__ );
4517
- return rc ;
4518
- }
4519
-
4520
- tfm = enc ? server -> secmech .enc : server -> secmech .dec ;
4521
-
4522
4512
if ((server -> cipher_type == SMB2_ENCRYPTION_AES256_CCM ) ||
4523
4513
(server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4524
4514
rc = crypto_aead_setkey (tfm , key , SMB3_GCM256_CRYPTKEY_SIZE );
@@ -4557,11 +4547,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4557
4547
aead_request_set_crypt (req , sg , sg , crypt_len , iv );
4558
4548
aead_request_set_ad (req , assoc_data_len );
4559
4549
4560
- aead_request_set_callback (req , CRYPTO_TFM_REQ_MAY_BACKLOG ,
4561
- crypto_req_done , & wait );
4562
-
4563
- rc = crypto_wait_req (enc ? crypto_aead_encrypt (req )
4564
- : crypto_aead_decrypt (req ), & wait );
4550
+ rc = enc ? crypto_aead_encrypt (req ) : crypto_aead_decrypt (req );
4565
4551
4566
4552
if (!rc && enc )
4567
4553
memcpy (& tr_hdr -> Signature , sign , SMB2_SIGNATURE_SIZE );
@@ -4650,7 +4636,7 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
4650
4636
/* fill the 1st iov with a transform header */
4651
4637
fill_transform_hdr (tr_hdr , orig_len , old_rq , server -> cipher_type );
4652
4638
4653
- rc = crypt_message (server , num_rqst , new_rq , 1 );
4639
+ rc = crypt_message (server , num_rqst , new_rq , 1 , server -> secmech . enc );
4654
4640
cifs_dbg (FYI , "Encrypt message returned %d\n" , rc );
4655
4641
if (rc )
4656
4642
goto err_free ;
@@ -4676,8 +4662,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4676
4662
unsigned int npages , unsigned int page_data_size ,
4677
4663
bool is_offloaded )
4678
4664
{
4679
- struct kvec iov [ 2 ] ;
4665
+ struct crypto_aead * tfm ;
4680
4666
struct smb_rqst rqst = {NULL };
4667
+ struct kvec iov [2 ];
4681
4668
int rc ;
4682
4669
4683
4670
iov [0 ].iov_base = buf ;
@@ -4692,9 +4679,31 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4692
4679
rqst .rq_pagesz = PAGE_SIZE ;
4693
4680
rqst .rq_tailsz = (page_data_size % PAGE_SIZE ) ? : PAGE_SIZE ;
4694
4681
4695
- rc = crypt_message (server , 1 , & rqst , 0 );
4682
+ if (is_offloaded ) {
4683
+ if ((server -> cipher_type == SMB2_ENCRYPTION_AES128_GCM ) ||
4684
+ (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4685
+ tfm = crypto_alloc_aead ("gcm(aes)" , 0 , 0 );
4686
+ else
4687
+ tfm = crypto_alloc_aead ("ccm(aes)" , 0 , 0 );
4688
+ if (IS_ERR (tfm )) {
4689
+ rc = PTR_ERR (tfm );
4690
+ cifs_server_dbg (VFS , "%s: Failed alloc decrypt TFM, rc=%d\n" , __func__ , rc );
4691
+
4692
+ return rc ;
4693
+ }
4694
+ } else {
4695
+ if (unlikely (!server -> secmech .dec ))
4696
+ return - EIO ;
4697
+
4698
+ tfm = server -> secmech .dec ;
4699
+ }
4700
+
4701
+ rc = crypt_message (server , 1 , & rqst , 0 , tfm );
4696
4702
cifs_dbg (FYI , "Decrypt message returned %d\n" , rc );
4697
4703
4704
+ if (is_offloaded )
4705
+ crypto_free_aead (tfm );
4706
+
4698
4707
if (rc )
4699
4708
return rc ;
4700
4709
0 commit comments