diff --git a/fs_mgr/libdm/dm_target.cpp b/fs_mgr/libdm/dm_target.cpp index 20b26df37..7c1826766 100644 --- a/fs_mgr/libdm/dm_target.cpp +++ b/fs_mgr/libdm/dm_target.cpp @@ -111,5 +111,9 @@ std::string DmTargetVerity::GetParameterString() const { return base + " " + std::to_string(optional_args_.size()) + " " + optional; } +std::string DmTargetAndroidVerity::GetParameterString() const { + return keyid_ + " " + block_device_; +} + } // namespace dm } // namespace android diff --git a/fs_mgr/libdm/include/libdm/dm_target.h b/fs_mgr/libdm/include/libdm/dm_target.h index d5974f4f1..31863c8fa 100644 --- a/fs_mgr/libdm/include/libdm/dm_target.h +++ b/fs_mgr/libdm/include/libdm/dm_target.h @@ -128,6 +128,20 @@ class DmTargetVerity final : public DmTarget { bool valid_; }; +class DmTargetAndroidVerity final : public DmTarget { + public: + DmTargetAndroidVerity(uint64_t start, uint64_t length, const std::string& block_device, + const std::string& keyid) + : DmTarget(start, length), keyid_(keyid), block_device_(block_device) {} + + std::string name() const override { return "android-verity"; } + std::string GetParameterString() const override; + + private: + std::string keyid_; + std::string block_device_; +}; + // This is the same as DmTargetVerity, but the table may be specified as a raw // string. This code exists only for fs_mgr_verity and should be avoided. Use // DmTargetVerity for new code instead. diff --git a/fs_mgr/tools/dmctl.cpp b/fs_mgr/tools/dmctl.cpp index 32cbb32ee..45a81af2d 100644 --- a/fs_mgr/tools/dmctl.cpp +++ b/fs_mgr/tools/dmctl.cpp @@ -40,6 +40,7 @@ using DmTable = ::android::dm::DmTable; using DmTarget = ::android::dm::DmTarget; using DmTargetLinear = ::android::dm::DmTargetLinear; using DmTargetZero = ::android::dm::DmTargetZero; +using DmTargetAndroidVerity = ::android::dm::DmTargetAndroidVerity; using DmTargetTypeInfo = ::android::dm::DmTargetTypeInfo; using DmBlockDevice = ::android::dm::DeviceMapper::DmBlockDevice; @@ -96,6 +97,16 @@ class TargetParser final { } return std::make_unique(start_sector, num_sectors, block_device, physical_sector); + } else if (target_type == "android-verity") { + if (!HasArgs(2)) { + std::cerr << "Expected \"android-verity\" " + << std::endl; + return nullptr; + } + std::string keyid = NextArg(); + std::string block_device = NextArg(); + return std::make_unique(start_sector, num_sectors, keyid, + block_device); } else { std::cerr << "Unrecognized target type: " << target_type << std::endl; return nullptr;