diff --git a/platform/ext/target/rpi/rp2350/CMakeLists.txt b/platform/ext/target/rpi/rp2350/CMakeLists.txt
index 68410a8f0..3027e78d4 100644
--- a/platform/ext/target/rpi/rp2350/CMakeLists.txt
+++ b/platform/ext/target/rpi/rp2350/CMakeLists.txt
@@ -167,6 +167,8 @@ target_link_libraries(platform_s
         pico_crt0
         pico_rand
         pico_multicore
+        $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_ATTEST_HAL}>>:pico_bootrom>
+        $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_ATTEST_HAL}>>:pico_sha256>
         hardware_regs
         hardware_flash
         hardware_uart
@@ -185,6 +187,7 @@ target_sources(platform_s
 
         rpi_trng.c
 
+        $<$<NOT:$<BOOL:${PLATFORM_DEFAULT_ATTEST_HAL}>>:${CMAKE_CURRENT_SOURCE_DIR}/attest_hal.c>
         $<$<OR:$<BOOL:${TFM_S_REG_TEST}>,$<BOOL:${TFM_NS_REG_TEST}>>:${CMAKE_CURRENT_SOURCE_DIR}/plat_test.c>
         $<$<BOOL:${TFM_PARTITION_PLATFORM}>:${CMAKE_CURRENT_SOURCE_DIR}/services/src/tfm_platform_system.c>
         $<$<AND:$<BOOL:${ITS_ENCRYPTION}>,$<BOOL:${TFM_PARTITION_INTERNAL_TRUSTED_STORAGE}>>:${PLATFORM_DIR}/ext/common/template/tfm_hal_its_encryption.c>
diff --git a/platform/ext/target/rpi/rp2350/attest_hal.c b/platform/ext/target/rpi/rp2350/attest_hal.c
new file mode 100644
index 000000000..a26681ae3
--- /dev/null
+++ b/platform/ext/target/rpi/rp2350/attest_hal.c
@@ -0,0 +1,201 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include "tfm_attest_hal.h"
+#include "tfm_plat_boot_seed.h"
+#include "tfm_plat_device_id.h"
+#include "tfm_plat_otp.h"
+#include "tfm_strnlen.h"
+#include "pico/bootrom.h"
+#include "pico/sha256.h"
+
+static enum tfm_security_lifecycle_t map_otp_lcs_to_tfm_slc(enum plat_otp_lcs_t lcs) {
+    switch (lcs) {
+        case PLAT_OTP_LCS_ASSEMBLY_AND_TEST:
+            return TFM_SLC_ASSEMBLY_AND_TEST;
+        case PLAT_OTP_LCS_PSA_ROT_PROVISIONING:
+            return TFM_SLC_PSA_ROT_PROVISIONING;
+        case PLAT_OTP_LCS_SECURED:
+            return TFM_SLC_SECURED;
+        case PLAT_OTP_LCS_DECOMMISSIONED:
+            return TFM_SLC_DECOMMISSIONED;
+        case PLAT_OTP_LCS_UNKNOWN:
+        default:
+            return TFM_SLC_UNKNOWN;
+    }
+}
+
+enum tfm_security_lifecycle_t tfm_attest_hal_get_security_lifecycle(void)
+{
+    enum plat_otp_lcs_t otp_lcs;
+    enum tfm_plat_err_t err;
+
+    err = tfm_plat_otp_read(PLAT_OTP_ID_LCS, sizeof(otp_lcs), (uint8_t*)&otp_lcs);
+    if (err != TFM_PLAT_ERR_SUCCESS) {
+        return TFM_SLC_UNKNOWN;
+    }
+
+    return map_otp_lcs_to_tfm_slc(otp_lcs);
+}
+
+enum tfm_plat_err_t
+tfm_attest_hal_get_verification_service(uint32_t *size, uint8_t *buf)
+{
+    enum tfm_plat_err_t err;
+    size_t otp_size;
+    size_t copy_size;
+
+    err = tfm_plat_otp_read(PLAT_OTP_ID_VERIFICATION_SERVICE_URL, *size, buf);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    err =  tfm_plat_otp_get_size(PLAT_OTP_ID_VERIFICATION_SERVICE_URL, &otp_size);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    /* Actually copied data is always the smaller */
+    copy_size = (*size < otp_size) ? *size : otp_size;
+    /* String content */
+    *size = tfm_strnlen((char*)buf, copy_size);
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
+
+enum tfm_plat_err_t
+tfm_attest_hal_get_profile_definition(uint32_t *size, uint8_t *buf)
+{
+    enum tfm_plat_err_t err;
+    size_t otp_size;
+    size_t copy_size;
+
+    err = tfm_plat_otp_read(PLAT_OTP_ID_PROFILE_DEFINITION, *size, buf);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    err =  tfm_plat_otp_get_size(PLAT_OTP_ID_PROFILE_DEFINITION, &otp_size);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    /* Actually copied data is always the smaller */
+    copy_size = (*size < otp_size) ? *size : otp_size;
+    /* String content */
+    *size = tfm_strnlen((char*)buf, copy_size);
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
+
+#if BOOT_SEED_SIZE != SHA256_RESULT_BYTES
+#error "boot seed size not equal to SHA256_RESULT_BYTES"
+#endif
+
+enum tfm_plat_err_t tfm_plat_get_boot_seed(uint32_t size, uint8_t *buf)
+{
+    uint32_t out[4];
+    if (!rom_get_boot_random(out)) {
+        return TFM_PLAT_ERR_SYSTEM_ERR;
+    }
+    pico_sha256_state_t state;
+    if (pico_sha256_start_blocking(&state, SHA256_BIG_ENDIAN, false) != PICO_OK) {
+        return TFM_PLAT_ERR_SYSTEM_ERR;
+    }
+    pico_sha256_update_blocking(&state, (const uint8_t*)out, sizeof(out));
+    sha256_result_t result;
+    pico_sha256_finish(&state, &result);
+
+    memcpy(buf, result.bytes, size);
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
+
+enum tfm_plat_err_t tfm_plat_get_implementation_id(uint32_t *size,
+                                                   uint8_t  *buf)
+{
+    enum tfm_plat_err_t err;
+    size_t otp_size;
+    size_t copy_size;
+
+    err = tfm_plat_otp_read(PLAT_OTP_ID_IMPLEMENTATION_ID, *size, buf);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    err =  tfm_plat_otp_get_size(PLAT_OTP_ID_IMPLEMENTATION_ID, &otp_size);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    /* Actually copied data is always the smaller */
+    copy_size = (*size < otp_size) ? *size : otp_size;
+    /* Binary data */
+    *size = copy_size;
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
+
+enum tfm_plat_err_t tfm_plat_get_cert_ref(uint32_t *size, uint8_t *buf)
+{
+    enum tfm_plat_err_t err;
+    size_t otp_size;
+    size_t copy_size;
+
+    err = tfm_plat_otp_read(PLAT_OTP_ID_CERT_REF, *size, buf);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    err =  tfm_plat_otp_get_size(PLAT_OTP_ID_CERT_REF, &otp_size);
+    if(err != TFM_PLAT_ERR_SUCCESS) {
+        return err;
+    }
+
+    /* Actually copied data is always the smaller */
+    copy_size = (*size < otp_size) ? *size : otp_size;
+    /* String content */
+    *size = tfm_strnlen((char*)buf, copy_size);
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
+
+enum tfm_plat_err_t tfm_attest_hal_get_platform_config(uint32_t *size,
+                                                       uint8_t  *buf)
+{
+    uint32_t dummy_plat_config = 0xDEADBEEF;
+
+    if (*size < sizeof(dummy_plat_config)) {
+        return TFM_PLAT_ERR_SYSTEM_ERR;
+    }
+
+     memcpy(buf, &dummy_plat_config, sizeof(dummy_plat_config));
+     *size = sizeof(dummy_plat_config);
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
+
+enum tfm_plat_err_t tfm_attest_hal_get_platform_hash_algo(uint32_t *size,
+                                                          uint8_t *buf)
+{
+#ifdef MEASUREMENT_HASH_ALGO_NAME
+    const char hash_algo[] = MEASUREMENT_HASH_ALGO_NAME;
+#else
+    const char hash_algo[] = "not-hash-extended";
+#endif
+
+    if (*size < (sizeof(hash_algo) - 1)) {
+        return TFM_PLAT_ERR_SYSTEM_ERR;
+    }
+
+    /* Not including the null-terminator. */
+     memcpy(buf, hash_algo, sizeof(hash_algo) - 1);
+    *size = sizeof(hash_algo) - 1;
+
+    return TFM_PLAT_ERR_SUCCESS;
+}
\ No newline at end of file
diff --git a/platform/ext/target/rpi/rp2350/config.cmake b/platform/ext/target/rpi/rp2350/config.cmake
index c9f3a15aa..db458f6ce 100644
--- a/platform/ext/target/rpi/rp2350/config.cmake
+++ b/platform/ext/target/rpi/rp2350/config.cmake
@@ -44,6 +44,7 @@ set(ITS_ENCRYPTION                      ON           CACHE BOOL      "Enable aut
 set(PLATFORM_DEFAULT_NV_SEED            OFF          CACHE BOOL      "Use default NV seed implementation.")
 set(PLATFORM_DEFAULT_OTP                OFF          CACHE BOOL      "Use trusted on-chip flash to implement OTP memory")
 set(PLATFORM_DEFAULT_NV_COUNTERS        OFF          CACHE BOOL      "Use default nv counter implementation.")
+set(PLATFORM_DEFAULT_ATTEST_HAL         OFF          CACHE BOOL      "Use default attest hal implementation.")
 
 set(PLATFORM_DEFAULT_CRYPTO_KEYS        OFF          CACHE BOOL      "Use default crypto keys implementation.")
 
