diff --git a/test/create_package/component_image_info_area.cpp b/test/create_package/component_image_info_area.cpp
new file mode 100644
index 0000000..52c4cbd
--- /dev/null
+++ b/test/create_package/component_image_info_area.cpp
@@ -0,0 +1,70 @@
+#include <inttypes.h>
+#include <unistd.h>
+
+#include <cstring>
+
+/*
+ * componentLocationOffsetIndex  is for backfilling by the caller
+ */
+ssize_t create_pldm_component_image_info_area_v1_0_0(
+    uint8_t* b, ssize_t i, size_t component_image_size,
+    size_t& componentLocationOffsetIndex)
+{
+    // Component Image Count
+    b[i++] = 0x1;
+    b[i++] = 0x0;
+
+    // ComponentImageInformation (Table 5)
+    // (1 for each image)
+
+    // ComponentClassification
+    b[i++] = 0x1; // this is vendor selected value
+    b[i++] = 0x0;
+
+    // ComponentIdentifier
+    b[i++] = 0x1; // this is vendor selected value
+    b[i++] = 0x0;
+
+    // ComponentComparisonStamp
+    b[i++] = 0xff;
+    b[i++] = 0xff;
+    b[i++] = 0xff;
+    b[i++] = 0xff;
+
+    // ComponentOptions
+    b[i++] = 0x00;
+    b[i++] = 0x00;
+
+    // RequestedComponentActivationMethod
+    b[i++] = 0b100000; // AC Power Cycle
+    b[i++] = 0x0;
+
+    // ComponentLocationOffset
+    // (leave blank for now)
+    componentLocationOffsetIndex = i;
+    b[i++] = 0x0;
+    b[i++] = 0x0;
+    b[i++] = 0x0;
+    b[i++] = 0x0;
+
+    // ComponentSize
+    b[i++] = (component_image_size >> 0) & 0xff;
+    b[i++] = (component_image_size >> 8) & 0xff;
+    b[i++] = (component_image_size >> 16) & 0xff;
+    b[i++] = (component_image_size >> 24) & 0xff;
+
+    // ComponentVersionStringType
+    b[i++] = 0x1; // type = Ascii
+
+    const char* buf = (const char*)"mycompversion";
+    // ComponentVersionStringLength
+    b[i++] = strlen(buf);
+
+    // ComponentVersionString
+    for (ssize_t j = 0; j < (ssize_t)strlen(buf); j++)
+    {
+        b[i++] = buf[j];
+    }
+
+    return i;
+}
diff --git a/test/create_package/component_image_info_area.hpp b/test/create_package/component_image_info_area.hpp
new file mode 100644
index 0000000..3a24c20
--- /dev/null
+++ b/test/create_package/component_image_info_area.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <unistd.h>
+
+#include <cstdint>
+
+/*
+ * componentLocationOffsetIndex  is for backfilling by the caller
+ */
+ssize_t create_pldm_component_image_info_area_v1_0_0(
+    uint8_t* b, ssize_t i, size_t component_image_size,
+    size_t& componentLocationOffsetIndex);
diff --git a/test/create_package/create_pldm_fw_package.cpp b/test/create_package/create_pldm_fw_package.cpp
new file mode 100644
index 0000000..c4353bb
--- /dev/null
+++ b/test/create_package/create_pldm_fw_package.cpp
@@ -0,0 +1,145 @@
+
+#include "component_image_info_area.hpp"
+#include "firmware_device_id_area.hpp"
+#include "phosphor-logging/lg2.hpp"
+
+#include <inttypes.h>
+#include <libpldm/firmware_update.h>
+
+#include <cstring>
+#include <fstream>
+#include <limits>
+#include <random>
+
+std::unique_ptr<uint8_t[]> create_pldm_package_buffer(
+    const uint8_t* component_image, size_t component_image_size,
+    const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible, size_t& size_out)
+{
+    const size_t size = 512 + component_image_size;
+    auto buffer = std::make_unique<uint8_t[]>(size);
+    uint8_t* b = buffer.get();
+    memset(b, 0, size);
+    ssize_t i = 0; // index
+
+    // populate uuid
+    // must be this value to align with
+    // https://github.com/openbmc/pldm/blob/master/fw-update/package_parser.cpp#L294
+    uint8_t uuid[PLDM_FWUP_UUID_LENGTH] = {
+        0xF0, 0x18, 0x87, 0x8C, 0xCB, 0x7D, 0x49, 0x43,
+        0x98, 0x00, 0xA0, 0x2F, 0x05, 0x9A, 0xCA, 0x02};
+    memcpy(b, uuid, PLDM_FWUP_UUID_LENGTH);
+
+    i += PLDM_FWUP_UUID_LENGTH;
+
+    // package header format revision
+    b[i++] = 0x01;
+    // must be 1 to align with
+    // https://github.com/openbmc/pldm/blob/master/fw-update/package_parser.cpp#L294
+
+    // package header size (leave space)
+    ssize_t package_header_size_offset = i;
+    i += 2;
+
+    // package release date time
+    // set timestamp as unknown value
+    b[i + 12] = 15;
+    i += PLDM_TIMESTAMP104_SIZE;
+
+    // component bitmap bit length
+    const uint16_t componentBitmapBitLength = 8;
+    b[i++] = componentBitmapBitLength;
+    b[i++] = 0x00;
+
+    // package_version_string_type
+    b[i++] = 0x01; // type = ASCII
+
+    const char* package_version_str = (const char*)"VersionString1";
+    // package version string length
+    b[i++] = strlen(package_version_str);
+
+    // package version string
+    for (size_t j = 0; j < strlen(package_version_str); j++)
+    {
+        b[i++] = package_version_str[j];
+    }
+
+    // --- Firmware Device Identification Area 1.0.0 ---
+
+    i = create_pldm_firmware_device_identification_area_v1_0_0(
+        b, i, optVendorIANA, optCompatible, componentBitmapBitLength);
+
+    // --- Component Image Information Area 1.0.0 ---
+    size_t componentLocationOffsetIndex;
+    i = create_pldm_component_image_info_area_v1_0_0(
+        b, i, component_image_size, componentLocationOffsetIndex);
+
+    // PackageHeaderChecksum (backfill later)
+    const size_t packageHeaderChecksumOffset = i;
+    i += 4;
+
+    // backfill the PackageHeaderSize
+    b[package_header_size_offset + 0] = (i >> 0) & 0xff;
+    b[package_header_size_offset + 1] = (i >> 8) & 0xff;
+
+    // backfill the ComponentLocationOffset
+    b[componentLocationOffsetIndex + 0] = (i >> 0) & 0xff;
+    b[componentLocationOffsetIndex + 1] = (i >> 8) & 0xff;
+    b[componentLocationOffsetIndex + 2] = (i >> 16) & 0xff;
+    b[componentLocationOffsetIndex + 3] = (i >> 24) & 0xff;
+
+    // backfill PackageHeaderChecksum
+    const uint32_t crc = crc32(b, packageHeaderChecksumOffset);
+    memcpy(b + packageHeaderChecksumOffset, &crc, 4);
+
+    // --- end of the package header ---
+
+    // write the component image
+    for (size_t j = 0; j < component_image_size; j++)
+    {
+        b[i++] = component_image[j];
+    }
+
+    lg2::debug("wrote {NBYTES} bytes for pldm update package", "NBYTES", i);
+
+    size_out = i;
+    return buffer;
+}
+
+static void create_pldm_package_file(std::ofstream& of,
+                                     const uint8_t* component_image,
+                                     size_t component_image_size)
+{
+    size_t size;
+    std::unique_ptr<uint8_t[]> buf =
+        create_pldm_package_buffer(component_image, component_image_size,
+                                   std::nullopt, std::nullopt, size);
+    uint8_t* b = buf.get();
+
+    of.write(reinterpret_cast<char*>(b), (long)size);
+}
+
+std::optional<std::string>
+    create_pldm_package(uint8_t* component_image, size_t component_image_size)
+{
+    std::random_device rd;
+    std::mt19937 gen(rd());
+    std::uniform_int_distribution<> distrib(0, std::numeric_limits<int>::max());
+
+    std::string filename =
+        std::format("/tmp/pldm-package-{}.bin", distrib(gen));
+
+    std::ofstream of(filename, std::ofstream::out);
+
+    if (!of.good())
+    {
+        lg2::error("could not create file: {FILENAME}", "FILENAME", filename);
+        return std::nullopt;
+    }
+
+    create_pldm_package_file(of, component_image, component_image_size);
+
+    of.close();
+
+    return filename;
+}
diff --git a/test/create_package/create_pldm_fw_package.hpp b/test/create_package/create_pldm_fw_package.hpp
new file mode 100644
index 0000000..0d37c6a
--- /dev/null
+++ b/test/create_package/create_pldm_fw_package.hpp
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <inttypes.h>
+
+#include <memory>
+#include <optional>
+#include <string>
+
+std::optional<std::string>
+    create_pldm_package(uint8_t* component_image, size_t component_image_size);
+
+std::unique_ptr<uint8_t[]> create_pldm_package_buffer(
+    const uint8_t* component_image, size_t component_image_size,
+    const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible, size_t& size_out);
diff --git a/test/create_package/firmware_device_id_area.cpp b/test/create_package/firmware_device_id_area.cpp
new file mode 100644
index 0000000..496340c
--- /dev/null
+++ b/test/create_package/firmware_device_id_area.cpp
@@ -0,0 +1,174 @@
+#include <inttypes.h>
+#include <libpldm/firmware_update.h>
+
+#include <cstring>
+#include <optional>
+#include <string>
+#include <vector>
+
+static ssize_t create_pldm_firmware_device_descriptor_v1_0_0(
+    uint8_t* b, ssize_t i, uint16_t descType, std::vector<uint8_t>& data)
+{
+    // DescriptorType, Table 7. (0x0001 == IANA Enterprise ID, 4 bytes)
+    b[i++] = (descType >> 0) & 0xff;
+    b[i++] = (descType >> 8) & 0xff;
+
+    // DescriptorLength
+    b[i++] = (data.size() >> 0) & 0xff;
+    b[i++] = (data.size() >> 8) & 0xff;
+
+    // DescriptorData
+    for (uint8_t v : data)
+    {
+        b[i++] = v;
+    }
+
+    return i;
+}
+
+static ssize_t create_pldm_firmware_device_vendor_defined_descriptor_v1_0_0(
+    uint8_t* b, ssize_t i, std::vector<uint8_t>& data)
+{
+    const uint16_t descType = 0xffff; // vendor defined
+
+    // DescriptorType, Table 7.
+    b[i++] = (descType >> 0) & 0xff;
+    b[i++] = (descType >> 8) & 0xff;
+
+    // DescriptorLength
+    const uint16_t length = data.size() + 3; // data and the additional fields
+    b[i++] = (length >> 0) & 0xff;
+    b[i++] = (length >> 8) & 0xff;
+
+    // VendorDefinedDescriptorTitleStringType
+    b[i++] = 0x1; // type 1 = ascii
+
+    // VendorDefinedDescriptorTitleStringLength
+    b[i++] = data.size();
+
+    // VendorDefinedDescriptorTitleString
+    for (uint8_t v : data)
+    {
+        b[i++] = v;
+    }
+
+    // VendorDefinedDescriptorData
+    b[i++] = 0x00;
+
+    return i;
+}
+
+static ssize_t create_pldm_firmware_device_descriptors_v1_0_0(
+    uint8_t* b, ssize_t i, const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible, size_t* actual_count)
+{
+    // RecordDescriptiors. The initial descriptor is restricted.
+    // In our case we use iana for the first descriptor.
+
+    std::vector<uint8_t> descriptorData = {0xaf, 0xaf, 0xaf, 0xaf};
+
+    if (optVendorIANA.has_value())
+    {
+        uint32_t v = optVendorIANA.value();
+        descriptorData[0] = (v >> 0) & 0xff;
+        descriptorData[1] = (v >> 8) & 0xff;
+        descriptorData[2] = (v >> 16) & 0xff;
+        descriptorData[3] = (v >> 24) & 0xff;
+    }
+
+    i = create_pldm_firmware_device_descriptor_v1_0_0(b, i, 0x1,
+                                                      descriptorData);
+
+    *actual_count = 1;
+
+    if (optCompatible.has_value())
+    {
+        std::string comp = optCompatible.value();
+        std::vector<uint8_t> compatible = {};
+        for (char c : comp)
+        {
+            compatible.push_back((uint8_t)c);
+        }
+        i = create_pldm_firmware_device_vendor_defined_descriptor_v1_0_0(
+            b, i, compatible);
+
+        *actual_count = 2;
+    }
+
+    return i;
+}
+
+ssize_t create_pldm_firmware_device_identification_record(
+    uint8_t* b, ssize_t i, const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible,
+    uint16_t componentBitmapBitLength)
+{
+    const ssize_t startIndex = i;
+    // RecordLength, backfill later
+    const size_t recordLengthOffset = i;
+    b[i++] = 0;
+    b[i++] = 0;
+
+    // DescriptorCount (backfill later)
+    const size_t descriptorCountOffset = i;
+    b[i++] = 0;
+
+    // DeviceUpdateOptionFlags
+    b[i++] = 0;
+    b[i++] = 0;
+    b[i++] = 0;
+    b[i++] = 0;
+
+    // ComponentImageSetVersionStringType
+    b[i++] = 1; // type = Ascii
+
+    const char* str = (const char*)"compimagesetversion1";
+    // ComponentImageSetVersionStringLength
+    b[i++] = strlen(str);
+
+    // FirmwareDevicePackageDataLength
+    b[i++] = 0x0;
+    b[i++] = 0x0;
+
+    // ApplicableComponents
+    for (int j = 0; j < (componentBitmapBitLength / 8); j++)
+    {
+        b[i++] = 0x1;
+        // the first and only component image does apply to this device
+    }
+
+    // ComponentSetVersionString
+    for (size_t j = 0; j < strlen(str); j++)
+    {
+        b[i++] = str[j];
+    }
+
+    // RecordDescriptiors. The initial descriptor is restricted.
+    size_t actual_count = 0;
+    i = create_pldm_firmware_device_descriptors_v1_0_0(
+        b, i, optVendorIANA, optCompatible, &actual_count);
+
+    // backfill DescriptorCount
+    b[descriptorCountOffset] = actual_count;
+
+    // FirmwareDevicePackageData (optional, we make it empty)
+
+    // backfill RecordLength
+    const ssize_t recordLength = i - startIndex;
+    b[recordLengthOffset + 0] = (recordLength >> 0) & 0xff;
+    b[recordLengthOffset + 1] = (recordLength >> 8) & 0xff;
+
+    return i;
+}
+
+ssize_t create_pldm_firmware_device_identification_area_v1_0_0(
+    uint8_t* b, ssize_t i, const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible,
+    uint16_t componentBitmapBitLength)
+{
+    // Device ID Record Count
+    b[i++] = 1;
+
+    return create_pldm_firmware_device_identification_record(
+        b, i, optVendorIANA, optCompatible, componentBitmapBitLength);
+}
diff --git a/test/create_package/firmware_device_id_area.hpp b/test/create_package/firmware_device_id_area.hpp
new file mode 100644
index 0000000..253ca78
--- /dev/null
+++ b/test/create_package/firmware_device_id_area.hpp
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <unistd.h>
+
+#include <cstdint>
+#include <optional>
+#include <string>
+
+ssize_t create_pldm_firmware_device_identification_record(
+    uint8_t* b, ssize_t i, const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible,
+    uint16_t componentBitmapBitLength);
+
+ssize_t create_pldm_firmware_device_identification_area_v1_0_0(
+    uint8_t* b, ssize_t i, const std::optional<uint32_t>& optVendorIANA,
+    const std::optional<std::string>& optCompatible,
+    uint16_t componentBitmapBitLength);
diff --git a/test/create_package/meson.build b/test/create_package/meson.build
new file mode 100644
index 0000000..44cc9fe
--- /dev/null
+++ b/test/create_package/meson.build
@@ -0,0 +1,12 @@
+
+libpldmcreatepkg = static_library('pldmcreatepkg',
+  'create_pldm_fw_package.cpp',
+  'firmware_device_id_area.cpp',
+  'component_image_info_area.cpp',
+  include_directories: ['.'],
+  dependencies: [
+    phosphor_logging_dep,
+    libpldm_dep,
+  ],
+  install: false,
+)
