@@ -4312,7 +4312,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
4312
4312
*/
4313
4313
static int
4314
4314
crypt_message (struct TCP_Server_Info * server , int num_rqst ,
4315
- struct smb_rqst * rqst , int enc )
4315
+ struct smb_rqst * rqst , int enc , struct crypto_aead * tfm )
4316
4316
{
4317
4317
struct smb2_transform_hdr * tr_hdr =
4318
4318
(struct smb2_transform_hdr * )rqst [0 ].rq_iov [0 ].iov_base ;
@@ -4323,8 +4323,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4323
4323
u8 key [SMB3_ENC_DEC_KEY_SIZE ];
4324
4324
struct aead_request * req ;
4325
4325
u8 * iv ;
4326
- DECLARE_CRYPTO_WAIT (wait );
4327
- struct crypto_aead * tfm ;
4328
4326
unsigned int crypt_len = le32_to_cpu (tr_hdr -> OriginalMessageSize );
4329
4327
void * creq ;
4330
4328
size_t sensitive_size ;
@@ -4336,14 +4334,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4336
4334
return rc ;
4337
4335
}
4338
4336
4339
- rc = smb3_crypto_aead_allocate (server );
4340
- if (rc ) {
4341
- cifs_server_dbg (VFS , "%s: crypto alloc failed\n" , __func__ );
4342
- return rc ;
4343
- }
4344
-
4345
- tfm = enc ? server -> secmech .enc : server -> secmech .dec ;
4346
-
4347
4337
if ((server -> cipher_type == SMB2_ENCRYPTION_AES256_CCM ) ||
4348
4338
(server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4349
4339
rc = crypto_aead_setkey (tfm , key , SMB3_GCM256_CRYPTKEY_SIZE );
@@ -4383,11 +4373,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4383
4373
aead_request_set_crypt (req , sg , sg , crypt_len , iv );
4384
4374
aead_request_set_ad (req , assoc_data_len );
4385
4375
4386
- aead_request_set_callback (req , CRYPTO_TFM_REQ_MAY_BACKLOG ,
4387
- crypto_req_done , & wait );
4388
-
4389
- rc = crypto_wait_req (enc ? crypto_aead_encrypt (req )
4390
- : crypto_aead_decrypt (req ), & wait );
4376
+ rc = enc ? crypto_aead_encrypt (req ) : crypto_aead_decrypt (req );
4391
4377
4392
4378
if (!rc && enc )
4393
4379
memcpy (& tr_hdr -> Signature , sign , SMB2_SIGNATURE_SIZE );
@@ -4493,7 +4479,7 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
4493
4479
/* fill the 1st iov with a transform header */
4494
4480
fill_transform_hdr (tr_hdr , orig_len , old_rq , server -> cipher_type );
4495
4481
4496
- rc = crypt_message (server , num_rqst , new_rq , 1 );
4482
+ rc = crypt_message (server , num_rqst , new_rq , 1 , server -> secmech . enc );
4497
4483
cifs_dbg (FYI , "Encrypt message returned %d\n" , rc );
4498
4484
if (rc )
4499
4485
goto err_free ;
@@ -4518,8 +4504,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4518
4504
unsigned int buf_data_size , struct iov_iter * iter ,
4519
4505
bool is_offloaded )
4520
4506
{
4521
- struct kvec iov [ 2 ] ;
4507
+ struct crypto_aead * tfm ;
4522
4508
struct smb_rqst rqst = {NULL };
4509
+ struct kvec iov [2 ];
4523
4510
size_t iter_size = 0 ;
4524
4511
int rc ;
4525
4512
@@ -4535,9 +4522,31 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4535
4522
iter_size = iov_iter_count (iter );
4536
4523
}
4537
4524
4538
- rc = crypt_message (server , 1 , & rqst , 0 );
4525
+ if (is_offloaded ) {
4526
+ if ((server -> cipher_type == SMB2_ENCRYPTION_AES128_GCM ) ||
4527
+ (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4528
+ tfm = crypto_alloc_aead ("gcm(aes)" , 0 , 0 );
4529
+ else
4530
+ tfm = crypto_alloc_aead ("ccm(aes)" , 0 , 0 );
4531
+ if (IS_ERR (tfm )) {
4532
+ rc = PTR_ERR (tfm );
4533
+ cifs_server_dbg (VFS , "%s: Failed alloc decrypt TFM, rc=%d\n" , __func__ , rc );
4534
+
4535
+ return rc ;
4536
+ }
4537
+ } else {
4538
+ if (unlikely (!server -> secmech .dec ))
4539
+ return - EIO ;
4540
+
4541
+ tfm = server -> secmech .dec ;
4542
+ }
4543
+
4544
+ rc = crypt_message (server , 1 , & rqst , 0 , tfm );
4539
4545
cifs_dbg (FYI , "Decrypt message returned %d\n" , rc );
4540
4546
4547
+ if (is_offloaded )
4548
+ crypto_free_aead (tfm );
4549
+
4541
4550
if (rc )
4542
4551
return rc ;
4543
4552
0 commit comments