19
19
#include "dm-audit.h"
20
20
#include <linux/module.h>
21
21
#include <linux/reboot.h>
22
- #include <linux/scatterlist.h>
23
22
#include <linux/string.h>
24
23
#include <linux/jump_label.h>
25
24
#include <linux/security.h>
@@ -61,9 +60,6 @@ module_param_array_named(use_bh_bytes, dm_verity_use_bh_bytes, uint, NULL, 0644)
61
60
62
61
static DEFINE_STATIC_KEY_FALSE (use_bh_wq_enabled );
63
62
64
- /* Is at least one dm-verity instance using ahash_tfm instead of shash_tfm? */
65
- static DEFINE_STATIC_KEY_FALSE (ahash_enabled );
66
-
67
63
struct dm_verity_prefetch_work {
68
64
struct work_struct work ;
69
65
struct dm_verity * v ;
@@ -118,100 +114,21 @@ static sector_t verity_position_at_level(struct dm_verity *v, sector_t block,
118
114
return block >> (level * v -> hash_per_block_bits );
119
115
}
120
116
121
- static int verity_ahash_update (struct dm_verity * v , struct ahash_request * req ,
122
- const u8 * data , size_t len ,
123
- struct crypto_wait * wait )
124
- {
125
- struct scatterlist sg ;
126
-
127
- if (likely (!is_vmalloc_addr (data ))) {
128
- sg_init_one (& sg , data , len );
129
- ahash_request_set_crypt (req , & sg , NULL , len );
130
- return crypto_wait_req (crypto_ahash_update (req ), wait );
131
- }
132
-
133
- do {
134
- int r ;
135
- size_t this_step = min_t (size_t , len , PAGE_SIZE - offset_in_page (data ));
136
-
137
- flush_kernel_vmap_range ((void * )data , this_step );
138
- sg_init_table (& sg , 1 );
139
- sg_set_page (& sg , vmalloc_to_page (data ), this_step , offset_in_page (data ));
140
- ahash_request_set_crypt (req , & sg , NULL , this_step );
141
- r = crypto_wait_req (crypto_ahash_update (req ), wait );
142
- if (unlikely (r ))
143
- return r ;
144
- data += this_step ;
145
- len -= this_step ;
146
- } while (len );
147
-
148
- return 0 ;
149
- }
150
-
151
- /*
152
- * Wrapper for crypto_ahash_init, which handles verity salting.
153
- */
154
- static int verity_ahash_init (struct dm_verity * v , struct ahash_request * req ,
155
- struct crypto_wait * wait , bool may_sleep )
156
- {
157
- int r ;
158
-
159
- ahash_request_set_tfm (req , v -> ahash_tfm );
160
- ahash_request_set_callback (req ,
161
- may_sleep ? CRYPTO_TFM_REQ_MAY_SLEEP | CRYPTO_TFM_REQ_MAY_BACKLOG : 0 ,
162
- crypto_req_done , (void * )wait );
163
- crypto_init_wait (wait );
164
-
165
- r = crypto_wait_req (crypto_ahash_init (req ), wait );
166
-
167
- if (unlikely (r < 0 )) {
168
- if (r != - ENOMEM )
169
- DMERR ("crypto_ahash_init failed: %d" , r );
170
- return r ;
171
- }
172
-
173
- if (likely (v -> salt_size && (v -> version >= 1 )))
174
- r = verity_ahash_update (v , req , v -> salt , v -> salt_size , wait );
175
-
176
- return r ;
177
- }
178
-
179
- static int verity_ahash_final (struct dm_verity * v , struct ahash_request * req ,
180
- u8 * digest , struct crypto_wait * wait )
181
- {
182
- int r ;
183
-
184
- if (unlikely (v -> salt_size && (!v -> version ))) {
185
- r = verity_ahash_update (v , req , v -> salt , v -> salt_size , wait );
186
-
187
- if (r < 0 ) {
188
- DMERR ("%s failed updating salt: %d" , __func__ , r );
189
- goto out ;
190
- }
191
- }
192
-
193
- ahash_request_set_crypt (req , NULL , digest , 0 );
194
- r = crypto_wait_req (crypto_ahash_final (req ), wait );
195
- out :
196
- return r ;
197
- }
198
-
199
117
int verity_hash (struct dm_verity * v , struct dm_verity_io * io ,
200
- const u8 * data , size_t len , u8 * digest , bool may_sleep )
118
+ const u8 * data , size_t len , u8 * digest )
201
119
{
120
+ struct shash_desc * desc = & io -> hash_desc ;
202
121
int r ;
203
122
204
- if ( static_branch_unlikely ( & ahash_enabled ) && ! v -> shash_tfm ) {
205
- struct ahash_request * req = verity_io_hash_req ( v , io );
206
- struct crypto_wait wait ;
207
-
208
- r = verity_ahash_init ( v , req , & wait , may_sleep ) ?:
209
- verity_ahash_update ( v , req , data , len , & wait ) ?:
210
- verity_ahash_final ( v , req , digest , & wait );
123
+ desc -> tfm = v -> shash_tfm ;
124
+ if ( unlikely ( v -> initial_hashstate == NULL )) {
125
+ /* Version 0: salt at end */
126
+ r = crypto_shash_init ( desc ) ?:
127
+ crypto_shash_update ( desc , data , len ) ?:
128
+ crypto_shash_update ( desc , v -> salt , v -> salt_size ) ?:
129
+ crypto_shash_final ( desc , digest );
211
130
} else {
212
- struct shash_desc * desc = verity_io_hash_req (v , io );
213
-
214
- desc -> tfm = v -> shash_tfm ;
131
+ /* Version 1: salt at beginning */
215
132
r = crypto_shash_import (desc , v -> initial_hashstate ) ?:
216
133
crypto_shash_finup (desc , data , len , digest );
217
134
}
@@ -362,7 +279,7 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io,
362
279
}
363
280
364
281
r = verity_hash (v , io , data , 1 << v -> hash_dev_block_bits ,
365
- verity_io_real_digest (v , io ), ! io -> in_bh );
282
+ verity_io_real_digest (v , io ));
366
283
if (unlikely (r < 0 ))
367
284
goto release_ret_r ;
368
285
@@ -465,7 +382,7 @@ static noinline int verity_recheck(struct dm_verity *v, struct dm_verity_io *io,
465
382
goto free_ret ;
466
383
467
384
r = verity_hash (v , io , buffer , 1 << v -> data_dev_block_bits ,
468
- verity_io_real_digest (v , io ), true );
385
+ verity_io_real_digest (v , io ));
469
386
if (unlikely (r ))
470
387
goto free_ret ;
471
388
@@ -581,7 +498,7 @@ static int verity_verify_io(struct dm_verity_io *io)
581
498
}
582
499
583
500
r = verity_hash (v , io , data , block_size ,
584
- verity_io_real_digest (v , io ), ! io -> in_bh );
501
+ verity_io_real_digest (v , io ));
585
502
if (unlikely (r < 0 )) {
586
503
kunmap_local (data );
587
504
return r ;
@@ -1092,12 +1009,7 @@ static void verity_dtr(struct dm_target *ti)
1092
1009
kfree (v -> zero_digest );
1093
1010
verity_free_sig (v );
1094
1011
1095
- if (v -> ahash_tfm ) {
1096
- static_branch_dec (& ahash_enabled );
1097
- crypto_free_ahash (v -> ahash_tfm );
1098
- } else {
1099
- crypto_free_shash (v -> shash_tfm );
1100
- }
1012
+ crypto_free_shash (v -> shash_tfm );
1101
1013
1102
1014
kfree (v -> alg_name );
1103
1015
@@ -1157,7 +1069,8 @@ static int verity_alloc_zero_digest(struct dm_verity *v)
1157
1069
if (!v -> zero_digest )
1158
1070
return r ;
1159
1071
1160
- io = kmalloc (sizeof (* io ) + v -> hash_reqsize , GFP_KERNEL );
1072
+ io = kmalloc (sizeof (* io ) + crypto_shash_descsize (v -> shash_tfm ),
1073
+ GFP_KERNEL );
1161
1074
1162
1075
if (!io )
1163
1076
return r ; /* verity_dtr will free zero_digest */
@@ -1168,7 +1081,7 @@ static int verity_alloc_zero_digest(struct dm_verity *v)
1168
1081
goto out ;
1169
1082
1170
1083
r = verity_hash (v , io , zero_data , 1 << v -> data_dev_block_bits ,
1171
- v -> zero_digest , true );
1084
+ v -> zero_digest );
1172
1085
1173
1086
out :
1174
1087
kfree (io );
@@ -1324,60 +1237,22 @@ static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v,
1324
1237
static int verity_setup_hash_alg (struct dm_verity * v , const char * alg_name )
1325
1238
{
1326
1239
struct dm_target * ti = v -> ti ;
1327
- struct crypto_ahash * ahash ;
1328
- struct crypto_shash * shash = NULL ;
1329
- const char * driver_name ;
1240
+ struct crypto_shash * shash ;
1330
1241
1331
1242
v -> alg_name = kstrdup (alg_name , GFP_KERNEL );
1332
1243
if (!v -> alg_name ) {
1333
1244
ti -> error = "Cannot allocate algorithm name" ;
1334
1245
return - ENOMEM ;
1335
1246
}
1336
1247
1337
- /*
1338
- * Allocate the hash transformation object that this dm-verity instance
1339
- * will use. The vast majority of dm-verity users use CPU-based
1340
- * hashing, so when possible use the shash API to minimize the crypto
1341
- * API overhead. If the ahash API resolves to a different driver
1342
- * (likely an off-CPU hardware offload), use ahash instead. Also use
1343
- * ahash if the obsolete dm-verity format with the appended salt is
1344
- * being used, so that quirk only needs to be handled in one place.
1345
- */
1346
- ahash = crypto_alloc_ahash (alg_name , 0 ,
1347
- v -> use_bh_wq ? CRYPTO_ALG_ASYNC : 0 );
1348
- if (IS_ERR (ahash )) {
1248
+ shash = crypto_alloc_shash (alg_name , 0 , 0 );
1249
+ if (IS_ERR (shash )) {
1349
1250
ti -> error = "Cannot initialize hash function" ;
1350
- return PTR_ERR (ahash );
1351
- }
1352
- driver_name = crypto_ahash_driver_name (ahash );
1353
- if (v -> version >= 1 /* salt prepended, not appended? */ ) {
1354
- shash = crypto_alloc_shash (alg_name , 0 , 0 );
1355
- if (!IS_ERR (shash ) &&
1356
- strcmp (crypto_shash_driver_name (shash ), driver_name ) != 0 ) {
1357
- /*
1358
- * ahash gave a different driver than shash, so probably
1359
- * this is a case of real hardware offload. Use ahash.
1360
- */
1361
- crypto_free_shash (shash );
1362
- shash = NULL ;
1363
- }
1364
- }
1365
- if (!IS_ERR_OR_NULL (shash )) {
1366
- crypto_free_ahash (ahash );
1367
- ahash = NULL ;
1368
- v -> shash_tfm = shash ;
1369
- v -> digest_size = crypto_shash_digestsize (shash );
1370
- v -> hash_reqsize = sizeof (struct shash_desc ) +
1371
- crypto_shash_descsize (shash );
1372
- DMINFO ("%s using shash \"%s\"" , alg_name , driver_name );
1373
- } else {
1374
- v -> ahash_tfm = ahash ;
1375
- static_branch_inc (& ahash_enabled );
1376
- v -> digest_size = crypto_ahash_digestsize (ahash );
1377
- v -> hash_reqsize = sizeof (struct ahash_request ) +
1378
- crypto_ahash_reqsize (ahash );
1379
- DMINFO ("%s using ahash \"%s\"" , alg_name , driver_name );
1251
+ return PTR_ERR (shash );
1380
1252
}
1253
+ v -> shash_tfm = shash ;
1254
+ v -> digest_size = crypto_shash_digestsize (shash );
1255
+ DMINFO ("%s using \"%s\"" , alg_name , crypto_shash_driver_name (shash ));
1381
1256
if ((1 << v -> hash_dev_block_bits ) < v -> digest_size * 2 ) {
1382
1257
ti -> error = "Digest size too big" ;
1383
1258
return - EINVAL ;
@@ -1402,7 +1277,7 @@ static int verity_setup_salt_and_hashstate(struct dm_verity *v, const char *arg)
1402
1277
return - EINVAL ;
1403
1278
}
1404
1279
}
1405
- if (v -> shash_tfm ) {
1280
+ if (v -> version ) { /* Version 1: salt at beginning */
1406
1281
SHASH_DESC_ON_STACK (desc , v -> shash_tfm );
1407
1282
int r ;
1408
1283
@@ -1681,7 +1556,8 @@ static int verity_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1681
1556
goto bad ;
1682
1557
}
1683
1558
1684
- ti -> per_io_data_size = sizeof (struct dm_verity_io ) + v -> hash_reqsize ;
1559
+ ti -> per_io_data_size = sizeof (struct dm_verity_io ) +
1560
+ crypto_shash_descsize (v -> shash_tfm );
1685
1561
1686
1562
r = verity_fec_ctr (v );
1687
1563
if (r )
@@ -1788,10 +1664,7 @@ static int verity_preresume(struct dm_target *ti)
1788
1664
bdev = dm_disk (dm_table_get_md (ti -> table ))-> part0 ;
1789
1665
root_digest .digest = v -> root_digest ;
1790
1666
root_digest .digest_len = v -> digest_size ;
1791
- if (static_branch_unlikely (& ahash_enabled ) && !v -> shash_tfm )
1792
- root_digest .alg = crypto_ahash_alg_name (v -> ahash_tfm );
1793
- else
1794
- root_digest .alg = crypto_shash_alg_name (v -> shash_tfm );
1667
+ root_digest .alg = crypto_shash_alg_name (v -> shash_tfm );
1795
1668
1796
1669
r = security_bdev_setintegrity (bdev , LSM_INT_DMVERITY_ROOTHASH , & root_digest ,
1797
1670
sizeof (root_digest ));
@@ -1817,7 +1690,7 @@ static struct target_type verity_target = {
1817
1690
.name = "verity" ,
1818
1691
/* Note: the LSMs depend on the singleton and immutable features */
1819
1692
.features = DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE ,
1820
- .version = {1 , 11 , 0 },
1693
+ .version = {1 , 12 , 0 },
1821
1694
.module = THIS_MODULE ,
1822
1695
.ctr = verity_ctr ,
1823
1696
.dtr = verity_dtr ,
0 commit comments