Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 
0003 #include <linux/list.h>
0004 #include <linux/kernel.h>
0005 #include <linux/dm-verity-loadpin.h>
0006 
0007 #include "dm.h"
0008 #include "dm-core.h"
0009 #include "dm-verity.h"
0010 
0011 #define DM_MSG_PREFIX   "verity-loadpin"
0012 
0013 LIST_HEAD(dm_verity_loadpin_trusted_root_digests);
0014 
0015 static bool is_trusted_verity_target(struct dm_target *ti)
0016 {
0017     u8 *root_digest;
0018     unsigned int digest_size;
0019     struct dm_verity_loadpin_trusted_root_digest *trd;
0020     bool trusted = false;
0021 
0022     if (!dm_is_verity_target(ti))
0023         return false;
0024 
0025     if (dm_verity_get_root_digest(ti, &root_digest, &digest_size))
0026         return false;
0027 
0028     list_for_each_entry(trd, &dm_verity_loadpin_trusted_root_digests, node) {
0029         if ((trd->len == digest_size) &&
0030             !memcmp(trd->data, root_digest, digest_size)) {
0031             trusted = true;
0032             break;
0033         }
0034     }
0035 
0036     kfree(root_digest);
0037 
0038     return trusted;
0039 }
0040 
0041 /*
0042  * Determines whether the file system of a superblock is located on
0043  * a verity device that is trusted by LoadPin.
0044  */
0045 bool dm_verity_loadpin_is_bdev_trusted(struct block_device *bdev)
0046 {
0047     struct mapped_device *md;
0048     struct dm_table *table;
0049     struct dm_target *ti;
0050     int srcu_idx;
0051     bool trusted = false;
0052 
0053     if (list_empty(&dm_verity_loadpin_trusted_root_digests))
0054         return false;
0055 
0056     md = dm_get_md(bdev->bd_dev);
0057     if (!md)
0058         return false;
0059 
0060     table = dm_get_live_table(md, &srcu_idx);
0061 
0062     if (table->num_targets != 1)
0063         goto out;
0064 
0065     ti = dm_table_get_target(table, 0);
0066 
0067     if (is_trusted_verity_target(ti))
0068         trusted = true;
0069 
0070 out:
0071     dm_put_live_table(md, srcu_idx);
0072     dm_put(md);
0073 
0074     return trusted;
0075 }