diff --git a/pw_kvs/BUILD b/pw_kvs/BUILD
index 69a13ec..0f054f8 100644
--- a/pw_kvs/BUILD
+++ b/pw_kvs/BUILD
@@ -27,6 +27,7 @@
     srcs = [
         "checksum.cc",
         "flash_memory.cc",
+        "format.cc",
         "key_value_store.cc",
         "pw_kvs_private/format.h",
         "pw_kvs_private/macros.h",
diff --git a/pw_kvs/BUILD.gn b/pw_kvs/BUILD.gn
index 0c17d87..5179386 100644
--- a/pw_kvs/BUILD.gn
+++ b/pw_kvs/BUILD.gn
@@ -30,6 +30,7 @@
   sources = [
     "checksum.cc",
     "flash_memory.cc",
+    "format.cc",
     "key_value_store.cc",
     "pw_kvs_private/format.h",
     "pw_kvs_private/macros.h",
diff --git a/pw_kvs/checksum.cc b/pw_kvs/checksum.cc
index 9f14c90..f5db069 100644
--- a/pw_kvs/checksum.cc
+++ b/pw_kvs/checksum.cc
@@ -21,14 +21,12 @@
 using std::byte;
 
 Status ChecksumAlgorithm::Verify(span<const byte> checksum) const {
-  if (checksum.size() != size_bytes()) {
+  if (checksum.size() < size_bytes()) {
     return Status::INVALID_ARGUMENT;
   }
-
-  if (std::memcmp(state_.data(), checksum.data(), state_.size()) != 0) {
+  if (std::memcmp(state_.data(), checksum.data(), size_bytes()) != 0) {
     return Status::DATA_LOSS;
   }
-
   return Status::OK;
 }
 
diff --git a/pw_kvs/checksum_test.cc b/pw_kvs/checksum_test.cc
index e5333ad..fbf228e 100644
--- a/pw_kvs/checksum_test.cc
+++ b/pw_kvs/checksum_test.cc
@@ -43,13 +43,25 @@
 TEST(Checksum, Verify_InvalidSize) {
   ChecksumCrc16 algo;
   EXPECT_EQ(Status::INVALID_ARGUMENT, algo.Verify({}));
-  EXPECT_EQ(Status::INVALID_ARGUMENT, algo.Verify(as_bytes(span(kString))));
+  EXPECT_EQ(Status::INVALID_ARGUMENT,
+            algo.Verify(as_bytes(span(kString.substr(0, 1)))));
+}
+
+TEST(Checksum, Verify_LargerState_ComparesToTruncatedData) {
+  byte crc[3] = {byte{0x84}, byte{0xC1}, byte{0x33}};
+  ChecksumCrc16 algo;
+  ASSERT_GT(sizeof(crc), algo.size_bytes());
+
+  algo.Update(as_bytes(span(kString)));
+
+  EXPECT_EQ(Status::OK, algo.Verify(crc));
 }
 
 TEST(Checksum, Reset) {
   ChecksumCrc16 crc_algo;
   crc_algo.Update(as_bytes(span(kString)));
   crc_algo.Reset();
+
   EXPECT_EQ(crc_algo.state()[0], byte{0xFF});
   EXPECT_EQ(crc_algo.state()[1], byte{0xFF});
 }
diff --git a/pw_kvs/format.cc b/pw_kvs/format.cc
new file mode 100644
index 0000000..739783d
--- /dev/null
+++ b/pw_kvs/format.cc
@@ -0,0 +1,93 @@
+// Copyright 2020 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include "pw_kvs_private/format.h"
+
+#include "pw_kvs_private/macros.h"
+
+namespace pw::kvs {
+
+using std::byte;
+using std::string_view;
+
+EntryHeader::EntryHeader(uint32_t magic,
+                         ChecksumAlgorithm* algorithm,
+                         string_view key,
+                         span<const byte> value,
+                         uint32_t key_version)
+    : magic_(magic),
+      checksum_(kNoChecksum),
+      key_value_length_(value.size() << kValueLengthShift |
+                        (key.size() & kKeyLengthMask)),
+      key_version_(key_version) {
+  if (algorithm != nullptr) {
+    CalculateChecksum(algorithm, key, value);
+    std::memcpy(&checksum_,
+                algorithm->state().data(),
+                std::min(algorithm->size_bytes(), sizeof(checksum_)));
+  }
+}
+
+Status EntryHeader::VerifyChecksum(ChecksumAlgorithm* algorithm,
+                                   string_view key,
+                                   span<const byte> value) const {
+  if (algorithm == nullptr) {
+    return checksum() == kNoChecksum ? Status::OK : Status::DATA_LOSS;
+  }
+  CalculateChecksum(algorithm, key, value);
+  return algorithm->Verify(checksum_bytes());
+}
+
+Status EntryHeader::VerifyChecksumInFlash(
+    FlashPartition* partition,
+    FlashPartition::Address header_address,
+    ChecksumAlgorithm* algorithm,
+    string_view key) const {
+  if (algorithm == nullptr) {
+    return checksum() == kNoChecksum ? Status::OK : Status::DATA_LOSS;
+  }
+
+  CalculateChecksum(algorithm, key);
+
+  // Read the value piece-by-piece into a small buffer.
+  // TODO: This read may be unaligned. The partition can handle this, but
+  // consider creating a API that skips the intermediate buffering.
+  byte buffer[32];
+
+  size_t bytes_to_read = value_length();
+  FlashPartition::Address address =
+      header_address + sizeof(*this) + key_length();
+
+  while (bytes_to_read > 0u) {
+    const size_t read_size = std::min(sizeof(buffer), bytes_to_read);
+    TRY(partition->Read(address, read_size, buffer));
+    address += read_size;
+    algorithm->Update(buffer, read_size);
+  }
+
+  return algorithm->Verify(checksum_bytes());
+}
+
+void EntryHeader::CalculateChecksum(ChecksumAlgorithm* algorithm,
+                                    const string_view key,
+                                    span<const byte> value) const {
+  algorithm->Reset();
+  algorithm->Update(reinterpret_cast<const byte*>(this) +
+                        offsetof(EntryHeader, key_value_length_),
+                    sizeof(*this) - offsetof(EntryHeader, key_value_length_));
+  algorithm->Update(as_bytes(span(key)));
+  algorithm->Update(value);
+}
+
+}  // namespace pw::kvs
diff --git a/pw_kvs/key_value_store.cc b/pw_kvs/key_value_store.cc
index fdf5e14..0b6a6a3 100644
--- a/pw_kvs/key_value_store.cc
+++ b/pw_kvs/key_value_store.cc
@@ -32,11 +32,6 @@
 
 using Address = FlashPartition::Address;
 
-constexpr union {
-  byte bytes[4];
-  uint32_t value;
-} kNoChecksum{};
-
 // constexpr uint32_t SixFiveFiveNineNine(std::string_view string) {
 constexpr uint32_t HashKey(std::string_view string) {
   uint32_t hash = 0;
@@ -144,7 +139,7 @@
   DBG("Header: ");
   DBG("   Address      = 0x%zx", size_t(entry_address));
   DBG("   Magic        = 0x%zx", size_t(header.magic()));
-  DBG("   Checksum     = 0x%zx", size_t(header.checksum_as_uint32()));
+  DBG("   Checksum     = 0x%zx", size_t(header.checksum()));
   DBG("   Key length   = 0x%zx", size_t(header.key_length()));
   DBG("   Value length = 0x%zx", size_t(header.value_length()));
   DBG("   Entry size   = 0x%zx", size_t(header.entry_size()));
@@ -171,7 +166,8 @@
   TRY(ReadEntryKey(key_descriptor, header.key_length(), key_buffer.data()));
   const string_view key(key_buffer.data(), header.key_length());
 
-  TRY(ValidateEntryChecksumInFlash(header, key, key_descriptor));
+  TRY(header.VerifyChecksumInFlash(
+      &partition_, key_descriptor.address, entry_header_format_.checksum, key));
   key_descriptor.key_hash = HashKey(key);
 
   DBG("Key hash: %zx (%zu)",
@@ -257,7 +253,9 @@
 
   StatusWithSize result = ReadEntryValue(*key_descriptor, header, value_buffer);
   if (result.ok() && options_.verify_on_read) {
-    return ValidateEntryChecksum(header, key, value_buffer);
+    return header.VerifyChecksum(entry_header_format_.checksum,
+                                 key,
+                                 value_buffer.subspan(0, result.size()));
   }
   return result;
 }
@@ -290,7 +288,7 @@
 const KeyValueStore::Entry& KeyValueStore::Iterator::operator*() {
   const KeyDescriptor& descriptor = entry_.kvs_.key_descriptor_list_[index_];
 
-  std::memset(entry_.key_buffer_.data(), 0, sizeof(entry_.key_buffer_));
+  std::memset(entry_.key_buffer_.data(), 0, entry_.key_buffer_.size());
 
   EntryHeader header;
   if (entry_.kvs_.ReadEntryHeader(descriptor, &header).ok()) {
@@ -313,35 +311,19 @@
   return StatusWithSize(header.value_length());
 }
 
-Status KeyValueStore::ValidateEntryChecksumInFlash(
-    const EntryHeader& header,
-    const string_view key,
-    const KeyDescriptor& entry) const {
-  if (entry_header_format_.checksum == nullptr) {
-    return header.checksum_as_uint32() == 0 ? Status::OK : Status::DATA_LOSS;
+Status KeyValueStore::FixedSizeGet(std::string_view key,
+                                   byte* value,
+                                   size_t size_bytes) const {
+  // Ensure that the size of the stored value matches the size of the type.
+  // Otherwise, report error. This check avoids potential memory corruption.
+  StatusWithSize result = ValueSize(key);
+  if (!result.ok()) {
+    return result.status();
   }
-
-  auto& checksum = *entry_header_format_.checksum;
-  checksum.Reset();
-  checksum.Update(header.DataForChecksum());
-  checksum.Update(as_bytes(span(key)));
-
-  // Read the value piece-by-piece into a small buffer.
-  // TODO: This read may be unaligned. The partition can handle this, but
-  // consider creating a API that skips the intermediate buffering.
-  byte buffer[32];
-
-  size_t bytes_to_read = header.value_length();
-  Address address = entry.address + sizeof(header) + header.key_length();
-
-  while (bytes_to_read > 0u) {
-    const size_t read_size = std::min(sizeof(buffer), bytes_to_read);
-    TRY(partition_.Read(address, read_size, buffer));
-    address += read_size;
-    checksum.Update(buffer, read_size);
+  if (result.size() != size_bytes) {
+    return Status::INVALID_ARGUMENT;
   }
-
-  return Status::OK;
+  return Get(key, span(value, size_bytes)).status();
 }
 
 Status KeyValueStore::InvalidOperation(string_view key) const {
@@ -412,18 +394,6 @@
   return StatusWithSize(read_size);
 }
 
-Status KeyValueStore::ValidateEntryChecksum(const EntryHeader& header,
-                                            string_view key,
-                                            span<const byte> value) const {
-  if (entry_header_format_.checksum == nullptr) {
-    return header.checksum_as_uint32() == kNoChecksum.value ? Status::OK
-                                                            : Status::DATA_LOSS;
-  }
-
-  CalculateEntryChecksum(header, key, value);
-  return entry_header_format_.checksum->Verify(header.checksum());
-}
-
 Status KeyValueStore::WriteEntryForExistingKey(KeyDescriptor* key_descriptor,
                                                string_view key,
                                                span<const byte> value) {
@@ -593,9 +563,9 @@
                                   span<const byte> value) {
   // write header, key, and value
   const EntryHeader header(entry_header_format_.magic,
-                           CalculateEntryChecksum(header, key, value),
-                           key.size(),
-                           value.size(),
+                           entry_header_format_.checksum,
+                           key,
+                           value,
                            key_descriptor->key_version + 1);
   DBG("Appending entry with key version: %zx", size_t(header.key_version()));
 
@@ -635,22 +605,6 @@
   return Status::UNIMPLEMENTED;
 }
 
-span<const byte> KeyValueStore::CalculateEntryChecksum(
-    const EntryHeader& header,
-    const string_view key,
-    span<const byte> value) const {
-  if (entry_header_format_.checksum == nullptr) {
-    return kNoChecksum.bytes;
-  }
-
-  auto& checksum = *entry_header_format_.checksum;
-  checksum.Reset();
-  checksum.Update(header.DataForChecksum());
-  checksum.Update(as_bytes(span(key)));
-  checksum.Update(value.data(), value.size_bytes());
-  return checksum.state();
-}
-
 void KeyValueStore::LogDebugInfo() {
   const size_t sector_count = partition_.sector_count();
   const size_t sector_size_bytes = partition_.sector_size_bytes();
diff --git a/pw_kvs/key_value_store_test.cc b/pw_kvs/key_value_store_test.cc
index 8d979fa..ed2ccc8 100644
--- a/pw_kvs/key_value_store_test.cc
+++ b/pw_kvs/key_value_store_test.cc
@@ -390,8 +390,6 @@
 #define ASSERT_OK(expr) ASSERT_EQ(Status::OK, expr)
 #define EXPECT_OK(expr) EXPECT_EQ(Status::OK, expr)
 
-#define AS_SIZE(x) static_cast<size_t>(x)
-
 TEST(InMemoryKvs, DISABLED_WriteOneKeyMultipleTimes) {
   // Create and erase the fake flash. It will persist across reloads.
   Flash flash;
@@ -417,7 +415,7 @@
     uint32_t written_value;
     EXPECT_EQ(kvs.size(), (reload == 0) ? 0 : 1u);
     for (uint32_t i = 0; i < num_writes; ++i) {
-      INF("PUT #%zu for key %s with value %zu", AS_SIZE(i), key, AS_SIZE(i));
+      INF("PUT #%zu for key %s with value %zu", size_t(i), key, size_t(i));
 
       written_value = i + 0xfc;  // Prevent accidental pass with zero.
       EXPECT_OK(kvs.Put(key, written_value));
@@ -1196,7 +1194,7 @@
 }
 #endif
 
-TEST_F(KeyValueStoreTest, DISABLED_DifferentValueSameCrc16) {
+TEST_F(KeyValueStoreTest, DifferentValueSameCrc16) {
   const char kKey[] = "k";
   // With the key and our CRC16 algorithm these both have CRC of 0x82AE
   // Given they are the same size and same key, the KVS will need to check
@@ -1214,7 +1212,7 @@
   ASSERT_EQ(Status::OK, kvs_.Put(kKey, kValue2));
 
   // Read it back and check it is correct
-  char value[3];
+  char value[3] = {};
   ASSERT_EQ(Status::OK, kvs_.Get(kKey, &value));
   ASSERT_EQ(std::memcmp(value, kValue2, sizeof(value)), 0);
 }
diff --git a/pw_kvs/public/pw_kvs/checksum.h b/pw_kvs/public/pw_kvs/checksum.h
index 9f974b3..b1f1658 100644
--- a/pw_kvs/public/pw_kvs/checksum.h
+++ b/pw_kvs/public/pw_kvs/checksum.h
@@ -39,7 +39,9 @@
   // Returns the size of the checksum state.
   constexpr size_t size_bytes() const { return state_.size(); }
 
-  // Compares a calculated checksum to this checksum's current state.
+  // Compares a calculated checksum to this checksum's current state. The
+  // checksum must be at least as large as size_bytes(). If it is larger, bytes
+  // beyond size_bytes() are ignored.
   Status Verify(span<const std::byte> checksum) const;
 
  protected:
diff --git a/pw_kvs/public/pw_kvs/key_value_store.h b/pw_kvs/public/pw_kvs/key_value_store.h
index 2b17a97..89ae31c 100644
--- a/pw_kvs/public/pw_kvs/key_value_store.h
+++ b/pw_kvs/public/pw_kvs/key_value_store.h
@@ -49,7 +49,7 @@
     std::bool_constant<internal::ConvertsToSpan<std::remove_reference_t<T>>(0)>;
 
 // Internal-only persistent storage header format.
-struct EntryHeader;
+class EntryHeader;
 
 struct EntryHeaderFormat {
   uint32_t magic;  // unique identifier
@@ -91,21 +91,19 @@
 
   StatusWithSize Get(std::string_view key, span<std::byte> value) const;
 
-  template <typename T>
-  Status Get(const std::string_view& key, T* value) {
-    static_assert(std::is_trivially_copyable<T>(), "KVS values must copyable");
-    static_assert(!std::is_pointer<T>(), "KVS values cannot be pointers");
+  // This overload of Get accepts a pointer to a trivially copyable object.
+  // const T& is used instead of T* to prevent arrays from satisfying this
+  // overload. To call Get with an array, pass as_writable_bytes(span(array)),
+  // or pass a pointer to the array instead of the array itself.
+  template <typename Pointer,
+            typename = std::enable_if_t<std::is_pointer_v<Pointer>>>
+  Status Get(const std::string_view& key, const Pointer& pointer) const {
+    using T = std::remove_reference_t<std::remove_pointer_t<Pointer>>;
 
-    // Ensure that the size of the stored value matches the size of the type.
-    // Otherwise, report error. This check avoids potential memory corruption.
-    StatusWithSize result = ValueSize(key);
-    if (!result.ok()) {
-      return result.status();
-    }
-    if (result.size() != sizeof(T)) {
-      return Status::INVALID_ARGUMENT;
-    }
-    return Get(key, as_writable_bytes(span(value, 1))).status();
+    static_assert(std::is_trivially_copyable<T>(), "Values must be copyable");
+    static_assert(!std::is_pointer<T>(), "Values cannot be pointers");
+
+    return FixedSizeGet(key, reinterpret_cast<std::byte*>(pointer), sizeof(T));
   }
 
   Status Put(std::string_view key, span<const std::byte> value);
@@ -136,9 +134,10 @@
       return kvs_.Get(key(), value_buffer).status();
     }
 
-    template <typename T>
-    Status Get(T* value) const {
-      return kvs_.Get(key(), value);
+    template <typename Pointer,
+              typename = std::enable_if_t<std::is_pointer_v<Pointer>>>
+    Status Get(const Pointer& pointer) const {
+      return kvs_.Get(key(), pointer);
     }
 
     StatusWithSize ValueSize() const { return kvs_.ValueSize(key()); }
@@ -219,6 +218,10 @@
     }
   };
 
+  Status FixedSizeGet(std::string_view key,
+                      std::byte* value,
+                      size_t size_bytes) const;
+
   Status InvalidOperation(std::string_view key) const;
 
   static constexpr bool InvalidKey(std::string_view key) {
@@ -244,10 +247,6 @@
                                 const EntryHeader& header,
                                 span<std::byte> value) const;
 
-  Status ValidateEntryChecksum(const EntryHeader& header,
-                               std::string_view key,
-                               span<const std::byte> value) const;
-
   Status LoadEntry(Address entry_address, Address* next_entry_address);
   Status AppendNewOrOverwriteStaleExistingDescriptor(
       const KeyDescriptor& key_descriptor);
@@ -287,11 +286,6 @@
 
   Status VerifyEntry(SectorDescriptor* sector, KeyDescriptor* key_descriptor);
 
-  span<const std::byte> CalculateEntryChecksum(
-      const EntryHeader& header,
-      std::string_view key,
-      span<const std::byte> value) const;
-
   bool AddressInSector(const SectorDescriptor& sector, Address address) const {
     const Address sector_base = SectorBaseAddress(&sector);
     const Address sector_end = sector_base + partition_.sector_size_bytes();
diff --git a/pw_kvs/pw_kvs_private/format.h b/pw_kvs/pw_kvs_private/format.h
index 9cd470c..a1867e4 100644
--- a/pw_kvs/pw_kvs_private/format.h
+++ b/pw_kvs/pw_kvs_private/format.h
@@ -11,40 +11,40 @@
 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 // License for the specific language governing permissions and limitations under
 // the License.
+
+// This file defines classes for managing the in-flash format for KVS entires.
 #pragma once
 
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
+#include <string_view>
 
+#include "pw_kvs/checksum.h"
+#include "pw_kvs/flash_memory.h"
 #include "pw_span/span.h"
 
 namespace pw::kvs {
 
-// In-flash header format.
-struct EntryHeader {
-  EntryHeader() : key_value_length_(0) {}
+// EntryHeader represents a key-value entry as stored in flash.
+class EntryHeader {
+ public:
+  EntryHeader() = default;
 
   EntryHeader(uint32_t magic,
-              span<const std::byte> checksum,
-              size_t key_length,
-              size_t value_length,
-              uint32_t key_version)
-      : magic_(magic),
-        checksum_(0),
-        key_value_length_(value_length << kValueLengthShift |
-                          (key_length & kKeyLengthMask)),
-        key_version_(key_version) {
-    std::memcpy(&checksum_,
-                checksum.data(),
-                std::min(checksum.size(), sizeof(checksum_)));
-  }
+              ChecksumAlgorithm* algorithm,
+              std::string_view key,
+              span<const std::byte> value,
+              uint32_t key_version);
 
-  span<const std::byte> DataForChecksum() const {
-    return span(reinterpret_cast<const std::byte*>(this) +
-                    offsetof(EntryHeader, key_value_length_),
-                sizeof(*this) - offsetof(EntryHeader, key_value_length_));
-  }
+  Status VerifyChecksum(ChecksumAlgorithm* algorithm,
+                        std::string_view key,
+                        span<const std::byte> value) const;
+
+  Status VerifyChecksumInFlash(FlashPartition* partition,
+                               FlashPartition::Address header_address,
+                               ChecksumAlgorithm* algorithm,
+                               std::string_view key) const;
 
   size_t entry_size() const {
     return sizeof(*this) + key_length() + value_length();
@@ -52,11 +52,7 @@
 
   uint32_t magic() const { return magic_; }
 
-  span<const std::byte> checksum() const {
-    return as_bytes(span(&checksum_, 1));
-  }
-
-  uint32_t checksum_as_uint32() const { return checksum_; }
+  uint32_t checksum() const { return checksum_; }
 
   size_t key_length() const { return key_value_length_ & kKeyLengthMask; }
   void set_key_length(uint32_t key_length) {
@@ -72,9 +68,18 @@
   uint32_t key_version() const { return key_version_; }
 
  private:
+  static constexpr uint32_t kNoChecksum = 0;
   static constexpr uint32_t kKeyLengthMask = 0b111111;
   static constexpr uint32_t kValueLengthShift = 8;
 
+  span<const std::byte> checksum_bytes() const {
+    return as_bytes(span(&checksum_, 1));
+  }
+
+  void CalculateChecksum(ChecksumAlgorithm* algorithm,
+                         std::string_view key,
+                         span<const std::byte> value = {}) const;
+
   uint32_t magic_;
   uint32_t checksum_;
   //  6 bits, 0: 5 - key - maximum 64 characters
