@@ -4309,7 +4309,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
4309
4309
*/
4310
4310
static int
4311
4311
crypt_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 )
4313
4313
{
4314
4314
struct smb2_transform_hdr * tr_hdr =
4315
4315
(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,
4320
4320
u8 key [SMB3_ENC_DEC_KEY_SIZE ];
4321
4321
struct aead_request * req ;
4322
4322
u8 * iv ;
4323
- DECLARE_CRYPTO_WAIT (wait );
4324
- struct crypto_aead * tfm ;
4325
4323
unsigned int crypt_len = le32_to_cpu (tr_hdr -> OriginalMessageSize );
4326
4324
void * creq ;
4327
4325
size_t sensitive_size ;
@@ -4333,14 +4331,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4333
4331
return rc ;
4334
4332
}
4335
4333
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
-
4344
4334
if ((server -> cipher_type == SMB2_ENCRYPTION_AES256_CCM ) ||
4345
4335
(server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4346
4336
rc = crypto_aead_setkey (tfm , key , SMB3_GCM256_CRYPTKEY_SIZE );
@@ -4380,11 +4370,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4380
4370
aead_request_set_crypt (req , sg , sg , crypt_len , iv );
4381
4371
aead_request_set_ad (req , assoc_data_len );
4382
4372
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 );
4388
4374
4389
4375
if (!rc && enc )
4390
4376
memcpy (& tr_hdr -> Signature , sign , SMB2_SIGNATURE_SIZE );
@@ -4526,7 +4512,7 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
4526
4512
/* fill the 1st iov with a transform header */
4527
4513
fill_transform_hdr (tr_hdr , orig_len , old_rq , server -> cipher_type );
4528
4514
4529
- rc = crypt_message (server , num_rqst , new_rq , 1 );
4515
+ rc = crypt_message (server , num_rqst , new_rq , 1 , server -> secmech . enc );
4530
4516
cifs_dbg (FYI , "Encrypt message returned %d\n" , rc );
4531
4517
if (rc )
4532
4518
goto err_free ;
@@ -4551,8 +4537,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4551
4537
unsigned int buf_data_size , struct iov_iter * iter ,
4552
4538
bool is_offloaded )
4553
4539
{
4554
- struct kvec iov [ 2 ] ;
4540
+ struct crypto_aead * tfm ;
4555
4541
struct smb_rqst rqst = {NULL };
4542
+ struct kvec iov [2 ];
4556
4543
size_t iter_size = 0 ;
4557
4544
int rc ;
4558
4545
@@ -4568,9 +4555,31 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4568
4555
iter_size = iov_iter_count (iter );
4569
4556
}
4570
4557
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 );
4572
4578
cifs_dbg (FYI , "Decrypt message returned %d\n" , rc );
4573
4579
4580
+ if (is_offloaded )
4581
+ crypto_free_aead (tfm );
4582
+
4574
4583
if (rc )
4575
4584
return rc ;
4576
4585
0 commit comments