pw_kvs: IgnoreChecksum class

Verify always passes for IgnoreChecksum.

Change-Id: Iba6d0812e5f11c46feb1938fc369163478e675a0
diff --git a/pw_kvs/checksum_test.cc b/pw_kvs/checksum_test.cc
index 205defb..4f0d8c5 100644
--- a/pw_kvs/checksum_test.cc
+++ b/pw_kvs/checksum_test.cc
@@ -67,6 +67,25 @@
   EXPECT_EQ(state[1], byte{0xFF});
 }
 
+TEST(IgnoreChecksum, NeverUpdate_VerifyWithoutData) {
+  IgnoreChecksum checksum;
+
+  EXPECT_EQ(Status::OK, checksum.Verify({}));
+}
+
+TEST(IgnoreChecksum, NeverUpdate_VerifyWithData) {
+  IgnoreChecksum checksum;
+
+  EXPECT_EQ(Status::OK, checksum.Verify(as_bytes(span(kString))));
+}
+
+TEST(IgnoreChecksum, AfterUpdate_Verify) {
+  IgnoreChecksum checksum;
+
+  checksum.Update(as_bytes(span(kString)));
+  EXPECT_EQ(Status::OK, checksum.Verify({}));
+}
+
 constexpr size_t kAlignment = 10;
 
 constexpr std::string_view kData =
diff --git a/pw_kvs/public/pw_kvs/checksum.h b/pw_kvs/public/pw_kvs/checksum.h
index e9cb85f..ff89d44 100644
--- a/pw_kvs/public/pw_kvs/checksum.h
+++ b/pw_kvs/public/pw_kvs/checksum.h
@@ -71,6 +71,16 @@
   span<const std::byte> state_;
 };
 
+// A checksum algorithm for which Verify always passes. This can be used to
+// disable checksum verification for a particular entry format.
+class IgnoreChecksum final : public ChecksumAlgorithm {
+ public:
+  constexpr IgnoreChecksum() : ChecksumAlgorithm({}) {}
+
+  void Reset() override {}
+  void Update(span<const std::byte>) override {}
+};
+
 // Calculates a checksum in kAlignmentBytes chunks. Checksum classes can inherit
 // from this and implement UpdateAligned and FinalizeAligned instead of Update
 // and Finalize.