@@ -4250,7 +4250,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
4250
4250
*/
4251
4251
static int
4252
4252
crypt_message (struct TCP_Server_Info * server , int num_rqst ,
4253
- struct smb_rqst * rqst , int enc )
4253
+ struct smb_rqst * rqst , int enc , struct crypto_aead * tfm )
4254
4254
{
4255
4255
struct smb2_transform_hdr * tr_hdr =
4256
4256
(struct smb2_transform_hdr * )rqst [0 ].rq_iov [0 ].iov_base ;
@@ -4261,8 +4261,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4261
4261
u8 key [SMB3_ENC_DEC_KEY_SIZE ];
4262
4262
struct aead_request * req ;
4263
4263
u8 * iv ;
4264
- DECLARE_CRYPTO_WAIT (wait );
4265
- struct crypto_aead * tfm ;
4266
4264
unsigned int crypt_len = le32_to_cpu (tr_hdr -> OriginalMessageSize );
4267
4265
void * creq ;
4268
4266
size_t sensitive_size ;
@@ -4274,14 +4272,6 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4274
4272
return rc ;
4275
4273
}
4276
4274
4277
- rc = smb3_crypto_aead_allocate (server );
4278
- if (rc ) {
4279
- cifs_server_dbg (VFS , "%s: crypto alloc failed\n" , __func__ );
4280
- return rc ;
4281
- }
4282
-
4283
- tfm = enc ? server -> secmech .enc : server -> secmech .dec ;
4284
-
4285
4275
if ((server -> cipher_type == SMB2_ENCRYPTION_AES256_CCM ) ||
4286
4276
(server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4287
4277
rc = crypto_aead_setkey (tfm , key , SMB3_GCM256_CRYPTKEY_SIZE );
@@ -4321,11 +4311,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
4321
4311
aead_request_set_crypt (req , sg , sg , crypt_len , iv );
4322
4312
aead_request_set_ad (req , assoc_data_len );
4323
4313
4324
- aead_request_set_callback (req , CRYPTO_TFM_REQ_MAY_BACKLOG ,
4325
- crypto_req_done , & wait );
4326
-
4327
- rc = crypto_wait_req (enc ? crypto_aead_encrypt (req )
4328
- : crypto_aead_decrypt (req ), & wait );
4314
+ rc = enc ? crypto_aead_encrypt (req ) : crypto_aead_decrypt (req );
4329
4315
4330
4316
if (!rc && enc )
4331
4317
memcpy (& tr_hdr -> Signature , sign , SMB2_SIGNATURE_SIZE );
@@ -4432,7 +4418,7 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
4432
4418
/* fill the 1st iov with a transform header */
4433
4419
fill_transform_hdr (tr_hdr , orig_len , old_rq , server -> cipher_type );
4434
4420
4435
- rc = crypt_message (server , num_rqst , new_rq , 1 );
4421
+ rc = crypt_message (server , num_rqst , new_rq , 1 , server -> secmech . enc );
4436
4422
cifs_dbg (FYI , "Encrypt message returned %d\n" , rc );
4437
4423
if (rc )
4438
4424
goto err_free ;
@@ -4457,8 +4443,9 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4457
4443
unsigned int buf_data_size , struct iov_iter * iter ,
4458
4444
bool is_offloaded )
4459
4445
{
4460
- struct kvec iov [ 2 ] ;
4446
+ struct crypto_aead * tfm ;
4461
4447
struct smb_rqst rqst = {NULL };
4448
+ struct kvec iov [2 ];
4462
4449
size_t iter_size = 0 ;
4463
4450
int rc ;
4464
4451
@@ -4475,9 +4462,31 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
4475
4462
iter_size = iov_iter_count (iter );
4476
4463
}
4477
4464
4478
- rc = crypt_message (server , 1 , & rqst , 0 );
4465
+ if (is_offloaded ) {
4466
+ if ((server -> cipher_type == SMB2_ENCRYPTION_AES128_GCM ) ||
4467
+ (server -> cipher_type == SMB2_ENCRYPTION_AES256_GCM ))
4468
+ tfm = crypto_alloc_aead ("gcm(aes)" , 0 , 0 );
4469
+ else
4470
+ tfm = crypto_alloc_aead ("ccm(aes)" , 0 , 0 );
4471
+ if (IS_ERR (tfm )) {
4472
+ rc = PTR_ERR (tfm );
4473
+ cifs_server_dbg (VFS , "%s: Failed alloc decrypt TFM, rc=%d\n" , __func__ , rc );
4474
+
4475
+ return rc ;
4476
+ }
4477
+ } else {
4478
+ if (unlikely (!server -> secmech .dec ))
4479
+ return - EIO ;
4480
+
4481
+ tfm = server -> secmech .dec ;
4482
+ }
4483
+
4484
+ rc = crypt_message (server , 1 , & rqst , 0 , tfm );
4479
4485
cifs_dbg (FYI , "Decrypt message returned %d\n" , rc );
4480
4486
4487
+ if (is_offloaded )
4488
+ crypto_free_aead (tfm );
4489
+
4481
4490
if (rc )
4482
4491
return rc ;
4483
4492
0 commit comments