diff --git a/api-tests/CMakeLists.txt b/api-tests/CMakeLists.txt
index a43c3ae..625fb62 100644
--- a/api-tests/CMakeLists.txt
+++ b/api-tests/CMakeLists.txt
@@ -365,6 +365,7 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 add_dependencies(${PSA_TARGET_QCBOR}			${PSA_TARGET_GENERATE_DATABASE_POST})
 add_dependencies(${PSA_TARGET_PAL_NSPE_LIB}		${PSA_TARGET_QCBOR})
+add_dependencies(${PSA_TARGET_VAL_NSPE_LIB}		${PSA_TARGET_QCBOR})
 else()
 add_dependencies(${PSA_TARGET_PAL_NSPE_LIB} 		${PSA_TARGET_GENERATE_DATABASE_POST})
 endif()
diff --git a/api-tests/dev_apis/crypto/test_c002/test_c002.c b/api-tests/dev_apis/crypto/test_c002/test_c002.c
index 3cee88c..a23a797 100644
--- a/api-tests/dev_apis/crypto/test_c002/test_c002.c
+++ b/api-tests/dev_apis/crypto/test_c002/test_c002.c
@@ -146,7 +146,7 @@
 
         status = val->crypto_function(VAL_CRYPTO_IMPORT_KEY, &attributes, key_data,
                  check1[i].key_length, &check1[i].key_handle);
-        TEST_ASSERT_EQUAL(status, PSA_ERROR_INVALID_ARGUMENT, TEST_CHECKPOINT_NUM(12));
+        TEST_ASSERT_NOT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(12));
 
         TEST_ASSERT_EQUAL(check1[i].key_handle, 0, TEST_CHECKPOINT_NUM(13));
     }
diff --git a/api-tests/dev_apis/crypto/test_c009/test_data.h b/api-tests/dev_apis/crypto/test_c009/test_data.h
index 647537b..d485067 100644
--- a/api-tests/dev_apis/crypto/test_c009/test_data.h
+++ b/api-tests/dev_apis/crypto/test_c009/test_data.h
@@ -52,14 +52,14 @@
  PSA_ALG_KEY_AGREEMENT(PSA_ALG_ECDH, PSA_ALG_HKDF(PSA_ALG_SHA_256)),
  "abcdefghijklmnop", 16,
  PSA_KEY_DERIVATION_INPUT_LABEL,
- PSA_SUCCESS,
+ PSA_ERROR_INVALID_ARGUMENT,
 },
 
 {"Test psa_key_derivation_input_bytes - Step as seed\n",
  PSA_ALG_KEY_AGREEMENT(PSA_ALG_ECDH, PSA_ALG_HKDF(PSA_ALG_SHA_256)),
  "abcdefghijklmnop", 16,
  PSA_KEY_DERIVATION_INPUT_SEED,
- PSA_SUCCESS,
+ PSA_ERROR_INVALID_ARGUMENT,
 },
 
 {"Test psa_key_derivation_input_bytes - Invalid step\n",
diff --git a/api-tests/dev_apis/crypto/test_c032/test_c032.c b/api-tests/dev_apis/crypto/test_c032/test_c032.c
index c246c0c..aa35e30 100644
--- a/api-tests/dev_apis/crypto/test_c032/test_c032.c
+++ b/api-tests/dev_apis/crypto/test_c032/test_c032.c
@@ -116,11 +116,14 @@
             status = val->crypto_function(VAL_CRYPTO_CIPHER_ENCRYPT_SETUP, &operation,
                         check1[i].key_handle, check1[i].key_alg);
             TEST_ASSERT_EQUAL(status, check1[i].expected_status, TEST_CHECKPOINT_NUM(6));
+
+            status = val->crypto_function(VAL_CRYPTO_CIPHER_ABORT, &operation);
+            TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(7));
         }
 
         /* Destroy the key */
         status = val->crypto_function(VAL_CRYPTO_DESTROY_KEY, check1[i].key_handle);
-        TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(7));
+        TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(8));
 
         /* Reset the key attributes and check if psa_import_key fails */
         val->crypto_function(VAL_CRYPTO_RESET_KEY_ATTRIBUTES, &attributes);
@@ -157,6 +160,9 @@
         status = val->crypto_function(VAL_CRYPTO_CIPHER_ENCRYPT_SETUP, &operation,
                     0, check2[i].key_alg);
         TEST_ASSERT_EQUAL(status, PSA_ERROR_INVALID_HANDLE, TEST_CHECKPOINT_NUM(4));
+
+        status = val->crypto_function(VAL_CRYPTO_CIPHER_ABORT, &operation);
+        TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(5));
     }
 
     return VAL_STATUS_SUCCESS;
diff --git a/api-tests/dev_apis/crypto/test_c033/test_c033.c b/api-tests/dev_apis/crypto/test_c033/test_c033.c
index c44e115..4899f10 100644
--- a/api-tests/dev_apis/crypto/test_c033/test_c033.c
+++ b/api-tests/dev_apis/crypto/test_c033/test_c033.c
@@ -115,11 +115,15 @@
             status = val->crypto_function(VAL_CRYPTO_CIPHER_DECRYPT_SETUP, &operation,
                         check1[i].key_handle, check1[i].key_alg);
             TEST_ASSERT_EQUAL(status, check1[i].expected_status, TEST_CHECKPOINT_NUM(6));
+
+            /* Abort a cipher operation */
+            status = val->crypto_function(VAL_CRYPTO_CIPHER_ABORT, &operation);
+            TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(7));
         }
 
         /* Destroy the key */
         status = val->crypto_function(VAL_CRYPTO_DESTROY_KEY, check1[i].key_handle);
-        TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(7));
+        TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(8));
 
          /* Reset the key attributes and check if psa_import_key fails */
         val->crypto_function(VAL_CRYPTO_RESET_KEY_ATTRIBUTES, &attributes);
@@ -157,6 +161,8 @@
                     0, check2[i].key_alg);
         TEST_ASSERT_EQUAL(status, PSA_ERROR_INVALID_HANDLE, TEST_CHECKPOINT_NUM(4));
 
+        status = val->crypto_function(VAL_CRYPTO_CIPHER_ABORT, &operation);
+        TEST_ASSERT_EQUAL(status, PSA_SUCCESS, TEST_CHECKPOINT_NUM(5));
     }
 
     return VAL_STATUS_SUCCESS;
diff --git a/api-tests/dev_apis/crypto/test_c037/test_c037.c b/api-tests/dev_apis/crypto/test_c037/test_c037.c
index 40ee54b..86c2931 100644
--- a/api-tests/dev_apis/crypto/test_c037/test_c037.c
+++ b/api-tests/dev_apis/crypto/test_c037/test_c037.c
@@ -56,6 +56,7 @@
         val->print(PRINT_TEST, "[Check %d] ", g_test_count++);
         val->print(PRINT_TEST, check1[i].test_desc, 0);
         memset(&operation, 0, sizeof(operation));
+        memset(&invalid_operation, 0, sizeof(invalid_operation));
 
         /* Setting up the watchdog timer for each check */
         status = val->wd_reprogram_timer(WD_CRYPTO_TIMEOUT);
diff --git a/api-tests/dev_apis/crypto/test_c050/test_c050.c b/api-tests/dev_apis/crypto/test_c050/test_c050.c
index 3d91281..8499fc1 100644
--- a/api-tests/dev_apis/crypto/test_c050/test_c050.c
+++ b/api-tests/dev_apis/crypto/test_c050/test_c050.c
@@ -27,12 +27,12 @@
     NULL,
 };
 
-static int g_test_count = 1;
+static int      g_test_count = 1;
+static uint8_t  data[BUFFER_SIZE];
 
 int32_t psa_open_key_test(caller_security_t caller)
 {
     int32_t               status, i = 0;
-    uint8_t               data[BUFFER_SIZE];
     size_t                length, get_key_bits;
     const uint8_t        *key_data;
     psa_key_type_t        get_key_type;
diff --git a/api-tests/dev_apis/crypto/test_c059/test_c059.c b/api-tests/dev_apis/crypto/test_c059/test_c059.c
index ce94a95..86f3fb7 100644
--- a/api-tests/dev_apis/crypto/test_c059/test_c059.c
+++ b/api-tests/dev_apis/crypto/test_c059/test_c059.c
@@ -26,12 +26,12 @@
     NULL,
 };
 
-static int g_test_count = 1;
+static int      g_test_count = 1;
+static uint8_t  output[BUFFER_SIZE], tag[SIZE_128B];
 
 int32_t psa_aead_finish_test(caller_security_t caller)
 {
     int32_t               i, status;
-    uint8_t               output[BUFFER_SIZE], tag[SIZE_128B];
     size_t                length,  tag_length;
     int                   num_checks = sizeof(check1)/sizeof(check1[0]);
     psa_key_attributes_t  attributes = PSA_KEY_ATTRIBUTES_INIT;
diff --git a/api-tests/dev_apis/crypto/test_c061/test_c061.c b/api-tests/dev_apis/crypto/test_c061/test_c061.c
index d1bbe39..4b6bec9 100644
--- a/api-tests/dev_apis/crypto/test_c061/test_c061.c
+++ b/api-tests/dev_apis/crypto/test_c061/test_c061.c
@@ -26,12 +26,12 @@
     NULL,
 };
 
-static int g_test_count = 1;
+static int      g_test_count = 1;
+static uint8_t  output[BUFFER_SIZE], tag[SIZE_128B];
 
 int32_t psa_aead_verify_test(caller_security_t caller)
 {
     int32_t               i, status;
-    uint8_t               output[BUFFER_SIZE], tag[SIZE_128B];
     size_t                length;
     int                   num_checks = sizeof(check1)/sizeof(check1[0]);
     psa_key_attributes_t  attributes = PSA_KEY_ATTRIBUTES_INIT;
diff --git a/api-tests/dev_apis/initial_attestation/suite.cmake b/api-tests/dev_apis/initial_attestation/suite.cmake
index ddb3128..913f7a4 100644
--- a/api-tests/dev_apis/initial_attestation/suite.cmake
+++ b/api-tests/dev_apis/initial_attestation/suite.cmake
@@ -35,6 +35,12 @@
 add_definitions(${AS_OPTIONS})
 add_library(${PSA_TARGET_TEST_COMBINE_LIB} STATIC ${SUITE_CC_SOURCE} ${SUITE_AS_SOURCE})
 
+if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
+target_include_directories(${PSA_TARGET_TEST_COMBINE_LIB} PRIVATE
+    ${PSA_QCBOR_INCLUDE_PATH}
+)
+endif()
+
 # Test related Include directories
 foreach(test ${PSA_TEST_LIST})
 	target_include_directories(${PSA_TARGET_TEST_COMBINE_LIB} PRIVATE ${PSA_SUITE_DIR}/${test})
diff --git a/api-tests/docs/psa_attestation_testlist.md b/api-tests/docs/psa_attestation_testlist.md
index 12153ad..c43cbe4 100644
--- a/api-tests/docs/psa_attestation_testlist.md
+++ b/api-tests/docs/psa_attestation_testlist.md
@@ -12,7 +12,9 @@
 
 1. In verifying the token, only the data type of claims and presence of the mandatory claims are checked and the values of the claims are not checked. <br />
 2. Specify the version of underlying PSA crypto in  <psa-arch-tests>/api-tests/platform/targets/<target_name>/nspe/common/pal_config.h <br />
-3. Supported crypto versions are CRYPTO_VERSION_BETA1, CRYPTO_VERSION_BETA2 and CRYPTO_VERSION_BETA3
+3. Supported crypto versions are CRYPTO_VERSION_BETA1, CRYPTO_VERSION_BETA2 and CRYPTO_VERSION_BETA3 <br />
+4. Signer ID and Version fields of the software component must be present to be compliant with the PSA-SM <br />
+5. Define the macro PLATFORM_OVERRIDE_ATTEST_PK in <psa-arch-tests>/api-tests/platform/targets/<target_name>/nspe/common/pal_config.h to use hardcoded public key <br />
 
 # License
 Arm PSA test suite is distributed under Apache v2.0 License.
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/common/pal_config.h
index 2871339..61db8d8 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/common/pal_config.h
@@ -43,6 +43,9 @@
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c
index 2da03fa..04fe5ef 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c
@@ -19,29 +19,13 @@
 
 static uint32_t         public_key_registered;
 static psa_key_handle_t public_key_handle;
+
 static inline struct q_useful_buf_c useful_buf_head(struct q_useful_buf_c buf,
                                                   size_t amount)
 {
     return UsefulBuf_Head(buf, amount);
 }
 
-static psa_ecc_curve_t attest_map_elliptic_curve_type(int32_t cose_curve)
-{
-    psa_ecc_curve_t psa_curve;
-
-    /*FixMe: Mapping is not complete, missing ones: P384, P521, ED25519, ED448 */
-    switch (cose_curve)
-    {
-    case P_256:
-        psa_curve = PSA_ECC_CURVE_SECP256R1;
-        break;
-    default:
-        psa_curve = USHRT_MAX;
-    }
-
-    return psa_curve;
-}
-
 static psa_algorithm_t cose_hash_alg_id_to_psa(int32_t cose_hash_alg_id)
 {
     psa_algorithm_t status;
@@ -137,6 +121,15 @@
     return status;
 }
 
+/**
+    @brief           - Computes hash for the requested data
+    @param           - cose_alg_id       : Algorithm ID
+                     - buffer_for_hash   : Temp buffer for calculating hash
+                     - hash              : Pointer to store the hash
+                     - protected_headers : Buffer containing protected data
+                     - payload           : payload data
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_compute_hash(int32_t cose_alg_id, struct q_useful_buf buffer_for_hash,
                           struct q_useful_buf_c *hash, struct q_useful_buf_c protected_headers,
                           struct q_useful_buf_c payload)
@@ -203,22 +196,56 @@
     return status;
 }
 
+static int32_t pal_attest_get_public_key(uint8_t *public_key_buff, size_t public_key_buf_size,
+                                       size_t *public_key_len, psa_ecc_curve_t *elliptic_curve_type)
+{
+    int32_t     status = PAL_ATTEST_ERROR;
+
+#ifdef PLATFORM_OVERRIDE_ATTEST_PK
+    if (public_key_buf_size < (attest_key.pubx_key_size + attest_key.puby_key_size + 1))
+        return PAL_ATTEST_ERR_SMALL_BUFFER;
+
+    *public_key_len = (attest_key.pubx_key_size + attest_key.puby_key_size + 1);
+    *elliptic_curve_type = PSA_ECC_CURVE_SECP256R1;
+    memcpy(public_key_buff, (void *)&attest_public_key, *public_key_len);
+    status = PSA_SUCCESS;
+#else
+    status = tfm_initial_attest_get_public_key(public_key_buff,
+                                               public_key_buf_size,
+                                               public_key_len,
+                                               elliptic_curve_type);
+#endif
+
+    return status;
+}
+
 static uint32_t pal_import_attest_key(psa_algorithm_t key_alg)
 {
     psa_status_t     status             = PAL_ATTEST_ERROR;
     psa_key_usage_t  usage              = PSA_KEY_USAGE_VERIFY;
-    psa_ecc_curve_t  psa_curve          = attest_map_elliptic_curve_type(P_256);
-    psa_key_type_t   attest_key_type    = PSA_KEY_TYPE_ECC_PUBLIC_KEY(psa_curve);
-    size_t           public_key_size    = attest_key.pubx_key_size + attest_key.puby_key_size;
+    psa_ecc_curve_t  ecc_curve;
+    psa_key_type_t   attest_key_type;
+    size_t           public_key_size;
+    uint8_t          public_key_buff[ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH] = {0};
 
 #if defined(CRYPTO_VERSION_BETA1) || defined(CRYPTO_VERSION_BETA2)
     psa_key_policy_t policy;
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Setup the key policy for public key */
         policy = psa_key_policy_init();
         psa_key_policy_set_usage(&policy, usage, key_alg);
@@ -234,8 +261,8 @@
         /* Import the public key */
         status = psa_import_key(public_key_handle,
                                 attest_key_type,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1);
+                                public_key_buff,
+                                public_key_size);
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -247,21 +274,30 @@
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Set the attributes for the public key */
         psa_set_key_type(&attributes, attest_key_type);
-        psa_set_key_bits(&attributes, public_key_size + 1);
+        psa_set_key_bits(&attributes, public_key_size);
         psa_set_key_usage_flags(&attributes, usage);
         psa_set_key_algorithm(&attributes, key_alg);
 
         /* Import the public key */
         status = psa_import_key(&attributes,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1,
+                                public_key_buff,
+                                public_key_size,
                                 &public_key_handle);
-
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -288,6 +324,13 @@
     return PAL_ATTEST_SUCCESS;
 }
 
+/**
+    @brief           - Verify the signature using the public key
+    @param           - cose_algorithm_id : Algorithm ID
+                     - token_hash        : Data that needs to be verified
+                     - signature         : Signature to be verified against
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id,
                                    struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature)
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h
index bd47990..559a24c 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h
@@ -15,12 +15,15 @@
  * limitations under the License.
 **/
 
-#include "pal_common.h"
+#ifndef _PAL_ATTESTATION_CRYPTO_H_
+#define _PAL_ATTESTATION_CRYPTO_H_
+
 #include "pal_attestation_eat.h"
 
-#define ATTEST_PUBLIC_KEY_SLOT            4
+#define ATTEST_PUBLIC_KEY_SLOT                  4
+#define ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH   (1 + 2 * PSA_BITS_TO_BYTES(256))
 
-typedef struct{
+typedef struct {
     uint8_t  *pubx_key;
     size_t    pubx_key_size;
     uint8_t  *puby_key;
@@ -47,16 +50,14 @@
       0x0F, 0x34, 0x11, 0x7D, 0x97, 0x1D, 0x68, 0x64},
 };
 
-static const uint8_t initial_attestation_public_x_key[] =
-{
+static const uint8_t initial_attestation_public_x_key[] = {
     0x79, 0xEB, 0xA9, 0x0E, 0x8B, 0xF4, 0x50, 0xA6,
     0x75, 0x15, 0x76, 0xAD, 0x45, 0x99, 0xB0, 0x7A,
     0xDF, 0x93, 0x8D, 0xA3, 0xBB, 0x0B, 0xD1, 0x7D,
     0x00, 0x36, 0xED, 0x49, 0xA2, 0xD0, 0xFC, 0x3F
 };
 
-static const uint8_t initial_attestation_public_y_key[] =
-{
+static const uint8_t initial_attestation_public_y_key[] = {
     0xBF, 0xCD, 0xFA, 0x89, 0x56, 0xB5, 0x68, 0xBF,
     0xDB, 0x86, 0x73, 0xE6, 0x48, 0xD8, 0xB5, 0x8D,
     0x92, 0x99, 0x55, 0xB1, 0x4A, 0x26, 0xC3, 0x08,
@@ -84,5 +85,4 @@
                           struct q_useful_buf_c payload);
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature);
-
-
+#endif /* _PAL_ATTESTATION_CRYPTO_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.c b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.c
deleted file mode 100644
index 68c4312..0000000
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/** @file
- * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
- * SPDX-License-Identifier : Apache-2.0
- *
- * 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
- *
- *  http://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 "pal_attestation_crypto.h"
-
-uint32_t    mandatory_claims = 0;
-uint32_t    mandaroty_sw_components = 0;
-bool_t      sw_component_present = 0;
-
-int pal_encode_cose_key(struct q_useful_buf_c *cose_key,
-                               struct q_useful_buf buffer_for_cose_key,
-                               struct q_useful_buf_c x_cord, struct q_useful_buf_c y_cord)
-{
-    uint32_t                  return_value;
-    QCBORError                qcbor_result;
-    QCBOREncodeContext        cbor_encode_ctx;
-    int32_t                   cose_curve_id = P_256;
-    struct q_useful_buf_c     encoded_key_id;
-
-    /* Get the public key x and y */
-    /* Encode it into a COSE_Key structure */
-    QCBOREncode_Init(&cbor_encode_ctx, buffer_for_cose_key);
-    QCBOREncode_OpenMap(&cbor_encode_ctx);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_COMMON_KTY,
-                               COSE_KEY_TYPE_EC2);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_CRV,
-                               cose_curve_id);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_X_COORDINATE,
-                               x_cord);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_Y_COORDINATE,
-                               y_cord);
-    QCBOREncode_CloseMap(&cbor_encode_ctx);
-
-    qcbor_result = QCBOREncode_Finish(&cbor_encode_ctx, &encoded_key_id);
-    if (qcbor_result != QCBOR_SUCCESS)
-    {
-        /* Mainly means that the COSE_Key was too big for buffer_for_cose_key */
-        return_value = PAL_ATTEST_ERR_PROTECTED_HEADERS;
-        goto Done;
-    }
-
-    /* Finish up and return */
-    *cose_key = encoded_key_id;
-    return_value = PAL_ATTEST_SUCCESS;
-
-Done:
-    return return_value;
-}
-
-
-static int get_items_in_map(QCBORDecodeContext *decode_context,
-                            struct items_to_get_t *item_list)
-{
-    int                     item_index;
-    QCBORItem               item;
-    struct items_to_get_t  *item_ptr = item_list;
-
-    /* initialize the data type of all items in the list */
-    while (item_ptr->label != 0)
-    {
-        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
-        item_ptr++;
-    }
-
-    QCBORDecode_GetNext(decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_MAP)
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    for (item_index = item.val.uCount; item_index != 0; item_index--)
-    {
-        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
-        {
-            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-        }
-        if (item.uLabelType != QCBOR_TYPE_INT64)
-        {
-            continue;
-        }
-
-        item_ptr = item_list;
-        while (item_ptr->label != 0)
-        {
-            if (item.label.int64 == item_ptr->label)
-            {
-                item_ptr->item = item;
-            }
-            item_ptr++;
-        }
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int get_item_in_map(QCBORDecodeContext *decode_context,
-                           int32_t label,
-                           QCBORItem *item)
-{
-    struct items_to_get_t   item_list[2];
-
-    item_list[0].label = label;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
-    {
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-    }
-
-    *item = item_list[0].item;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
-                                     struct q_useful_buf_c *child)
-{
-    struct items_to_get_t   item_list[3];
-
-    item_list[0].label = COSE_HEADER_PARAM_KID;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERR_CBOR_STRUCTURE;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_protected_headers(struct q_useful_buf_c protected_headers,
-                                   int32_t *alg_id)
-{
-    QCBORDecodeContext  decode_context;
-    QCBORItem           item;
-
-    QCBORDecode_Init(&decode_context, protected_headers, 0);
-
-    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (QCBORDecode_Finish(&decode_context))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    *alg_id = (int32_t)item.val.int64;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-/**
-    @brief    - This API will verify the claims
-    @param    - decode_context      : The buffer containing the challenge
-                item                : context for decoding the data items
-                completed_challenge : Buffer containing the challenge
-    @return   - error status
-**/
-static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
-                                   struct q_useful_buf_c completed_challenge)
-{
-    int i, count = 0;
-    int status = PAL_ATTEST_SUCCESS;
-
-    /* Parse each claim and validate their data type */
-    while (status == PAL_ATTEST_SUCCESS)
-    {
-        status = QCBORDecode_GetNext(decode_context, &item);
-        if (status != PAL_ATTEST_SUCCESS)
-            break;
-
-        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
-        if (item.uLabelType == QCBOR_TYPE_INT64)
-        {
-            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
-            {
-                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
-                {
-                    /* Given challenge vs challenge in token */
-                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
-                        return PAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
-                }
-                else
-                    return PAL_ATTEST_TOKEN_NOT_SUPPORTED;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
-            {
-                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
-            {
-                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
-            {
-                if (item.uDataType != QCBOR_TYPE_INT64)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
-            {
-                if (item.uDataType != QCBOR_TYPE_ARRAY)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-                sw_component_present = 1;
-                status = QCBORDecode_GetNext(decode_context, &item);
-                if (status != PAL_ATTEST_SUCCESS)
-                    continue;
-
-                count = item.val.uCount;
-                for (i = 0; i <= count; i++)
-                {
-                    mandaroty_sw_components |= 1 << item.label.int64;
-
-                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
-                    {
-                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_INT64)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-
-                    if (i < count)
-                    {
-                        status = QCBORDecode_GetNext(decode_context, &item);
-                        if (status != PAL_ATTEST_SUCCESS)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                }
-
-            }
-        }
-        else
-        {
-            /* ToDo: Add other claim types */
-        }
-    }
-
-    if (status == QCBOR_ERR_HIT_END)
-        return PAL_ATTEST_SUCCESS;
-    else
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-}
-
-/**
-    @brief    - This API will verify the attestation token
-    @param    - challenge       : The buffer containing the challenge
-                challenge_size  : Size of the challenge buffer
-                token           : The buffer containing the attestation token
-                token_size      : Size of the token buffer
-    @return   - error status
-**/
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size)
-{
-    int32_t             status = PAL_ATTEST_SUCCESS;
-    int32_t             cose_algorithm_id;
-    QCBORItem           item;
-    QCBORDecodeContext  decode_context;
-    struct q_useful_buf_c completed_challenge;
-    struct q_useful_buf_c completed_token;
-    struct q_useful_buf_c payload;
-    struct q_useful_buf_c signature;
-    struct q_useful_buf_c protected_headers;
-    struct q_useful_buf_c kid;
-    struct q_useful_buf_c token_hash;
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_x_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_y_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
-
-    kid.ptr = buffer_for_encoded_key.ptr;
-
-    memcpy(buf_to_hold_x_coord.ptr, (const void *)attest_key.pubx_key, attest_key.pubx_key_size);
-    memcpy(buf_to_hold_y_coord.ptr, (const void *)attest_key.puby_key, attest_key.puby_key_size);
-
-    /* Update size */
-    buf_to_hold_x_coord.len = attest_key.pubx_key_size;
-    buf_to_hold_y_coord.len = attest_key.puby_key_size;
-
-    /* Construct the token buffer for validation */
-    completed_token.ptr = token;
-    completed_token.len = token_size;
-
-    /* Construct the challenge buffer for validation */
-    completed_challenge.ptr = challenge;
-    completed_challenge.len = challenge_size;
-
-/*
-    -------------------------
-    |  CBOR Array Type      |
-    -------------------------
-    |  Protected Headers    |
-    -------------------------
-    |  Unprotected Headers  |
-    -------------------------
-    |  Payload              |
-    -------------------------
-    |  Signature            |
-    -------------------------
-*/
-
-    /* Initialize the decorder */
-    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
-
-    /* Get the Header */
-    QCBORDecode_GetNext(&decode_context, &item);
-
-    /* Check the CBOR Array type. Check if the count is 4.
-     * Only COSE_SIGN1 is supported now.
-     */
-    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
-       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Get the next headers */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    protected_headers = item.val.string;
-
-    /* Parse the protected headers and check the data type and value*/
-    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Parse the unprotected headers and check the data type and value */
-    status = parse_unprotected_headers(&decode_context, &kid);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Get the payload */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    payload = item.val.string;
-
-    /* Get the digital signature */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    signature = item.val.string;
-
-    /* Compute the hash from the token */
-    status = pal_compute_hash(cose_algorithm_id, buffer_for_token_hash, &token_hash,
-                              protected_headers, payload);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Verify the signature */
-    status = pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Initialize the Decoder and validate the payload format */
-    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
-    status = QCBORDecode_GetNext(&decode_context, &item);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if (item.uDataType != QCBOR_TYPE_MAP)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Parse the payload and check the data type of each claim */
-    status = parse_claims(&decode_context, item, completed_challenge);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
-    {
-        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
-            return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
-    {
-        return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h
index df24c89..fae5434 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h
@@ -15,43 +15,17 @@
  * limitations under the License.
 **/
 
+#ifndef _PAL_ATTESTATION_EAT_H_
+#define _PAL_ATTESTATION_EAT_H_
+
 #include "qcbor.h"
 #include "pal_common.h"
-#include "psa/crypto.h"
 
 #define PAL_ATTEST_MIN_ERROR              30
 
-/* NIST P-256 also known as secp256r1 */
-#define P_256                             1
-
-#define COSE_HEADER_PARAM_ALG             1
-#define COSE_HEADER_PARAM_KID             4
-
-#define COSE_KEY_COMMON_KTY               1
-#define COSE_KEY_TYPE_EC2                 2
-#define COSE_KEY_PARAM_CRV               -1
-#define COSE_KEY_PARAM_X_COORDINATE      -2
-#define COSE_KEY_PARAM_Y_COORDINATE      -3
 #define COSE_ALGORITHM_ES256             -7
 #define COSE_ALG_SHA256_PROPRIETARY      -72000
 
-/**
- * The size of X and Y coordinate in 2 parameter style EC public
- * key. Format is as defined in [COSE (RFC 8152)]
- * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
- * Cryptography](http://www.secg.org/sec1-v2.pdf).
- *
- * This size is well-known and documented in public standards.
- */
-#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
-#define T_COSE_CRYPTO_SHA256_SIZE         32
-
-#define MAX_ENCODED_COSE_KEY_SIZE \
-    1 + /* 1 byte to encode map */ \
-    2 + /* 2 bytes to encode key type */ \
-    2 + /* 2 bytes to encode curve */ \
-    2 * /* the X and Y coordinates at 32 bytes each */ \
-        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2)
 #define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
 
 #define COSE_SIG_CONTEXT_STRING_SIGNATURE1 "Signature1"
@@ -78,71 +52,9 @@
     sizeof(COSE_SIG_CONTEXT_STRING_SIGNATURE1) + /* "Signature1" */ \
     2 + /* Overhead for encoding string */ \
     T_COSE_SIGN1_MAX_PROT_HEADER + /* entire protected headers */ \
-    3 * ( /* 3 NULL bstrs for fields not used */ \
+    3 * (/* 3 NULL bstrs for fields not used */ \
         1 /* size of a NULL bstr */  \
     )
-
-/*
- CBOR Label for proprietary header indicating short-circuit
- signing was used. Just a random number in the proprietary
- label space */
-#define T_COSE_SHORT_CIRCUIT_LABEL              (-8675309)
-
-#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
-#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
-#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
-#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
-#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
-#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
-#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
-#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
-#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
-#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
-#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
-#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
-
-#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
-
-#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
-#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
-#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
-#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
-
-#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
-
-#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
-
-#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
-                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-
 #define NULL_USEFUL_BUF_C  NULLUsefulBufC
 
 enum attestation_error_code {
@@ -161,13 +73,8 @@
     PAL_ATTEST_ERR_KEY_FAIL,
     PAL_ATTEST_ERR_SIGNATURE_FAIL,
     PAL_ATTEST_ERR_CBOR_STRUCTURE,
+    PAL_ATTEST_ERR_SMALL_BUFFER,
     PAL_ATTEST_ERROR,
 };
 
-struct items_to_get_t {
-    int64_t label;
-    QCBORItem item;
-};
-
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size);
+#endif /* _PAL_ATTESTATION_EAT_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h
index 12f6ee9..3ab7ebb 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_INITIAL_ATTESTATION_H_
-#define _PAL_INITIAL_ATTESTATION_H_
+#ifndef _PAL_ATTESTATION_INTF_H_
+#define _PAL_ATTESTATION_INTF_H_
 
 #include "pal_attestation_crypto.h"
 
@@ -24,7 +24,9 @@
     PAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     PAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     PAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    PAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    PAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
 int32_t pal_attestation_function(int type, va_list valist);
-#endif /* _PAL_INITIAL_ATTESTATION_H_ */
+#endif /* _PAL_ATTESTATION_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/target.cmake b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/target.cmake
index 5c5c942..db9a4fa 100644
--- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/target.cmake
+++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/target.cmake
@@ -71,7 +71,6 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	list(APPEND PAL_SRC_C_NSPE
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_intf.c
-		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_eat.c
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_crypto.c
 	)
 endif()
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_common.h b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_common.h
index 0076891..8a8f064 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_common.h
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_common.h
@@ -37,8 +37,7 @@
 
 #define PAL_STATUS_UNSUPPORTED_FUNC      0xFF
 
-typedef enum
-{
+typedef enum {
     PAL_STATUS_SUCCESS = 0x0,
     PAL_STATUS_ERROR   = 0x80
 } pal_status_t;
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_config.h
index 2871339..640f56f 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_config.h
@@ -38,11 +38,17 @@
 
 /* Are Dynamic memory APIs available to secure partition? */
 #define SP_HEAP_MEM_SUPP
+
+/* PSA Isolation level supported by platform */
+#define PLATFORM_PSA_ISOLATION_LEVEL 3
 #endif /* PSA_CMAKE_BUILD */
 
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_driver_ns_intf.c b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_driver_ns_intf.c
index 204adfb..2bbaad7 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_driver_ns_intf.c
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/common/pal_driver_ns_intf.c
@@ -31,7 +31,7 @@
 
 /* Using zero as NVMEM_BASE is a bit arbitrary - we don't actually need callers
  * to specify a base address but the nvmem function signatures have "base" params.
- * Zero is the value used in our target.cfg file so that's what we should recieve.
+ * Zero is the value used in our target.cfg file so that's what we should receive.
  */
 #define NVMEM_BASE 0
 
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/target.cmake b/api-tests/platform/targets/tgt_dev_apis_stdc/target.cmake
index 38e4db2..e46fe21 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/target.cmake
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/target.cmake
@@ -44,10 +44,14 @@
 	)
 endif()
 if(${SUITE} STREQUAL "PROTECTED_STORAGE")
-	message(FATAL_ERROR "Protected Storage not supported")
+	list(APPEND PAL_SRC_C_NSPE
+    ${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/protected_storage/pal_protected_storage_intf.c
+    )
 endif()
 if(${SUITE} STREQUAL "INTERNAL_TRUSTED_STORAGE")
-	message(FATAL_ERROR "Internal Trusted Storage not support")
+	list(APPEND PAL_SRC_C_NSPE
+    ${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/internal_trusted_storage/pal_internal_trusted_storage_intf.c
+    )
 endif()
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	message(FATAL_ERROR "Initial attestation not supported")
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/common/pal_config.h
index 2871339..61db8d8 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/common/pal_config.h
@@ -43,6 +43,9 @@
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.c b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.c
index 2da03fa..eec2619 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.c
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.c
@@ -19,29 +19,13 @@
 
 static uint32_t         public_key_registered;
 static psa_key_handle_t public_key_handle;
+
 static inline struct q_useful_buf_c useful_buf_head(struct q_useful_buf_c buf,
                                                   size_t amount)
 {
     return UsefulBuf_Head(buf, amount);
 }
 
-static psa_ecc_curve_t attest_map_elliptic_curve_type(int32_t cose_curve)
-{
-    psa_ecc_curve_t psa_curve;
-
-    /*FixMe: Mapping is not complete, missing ones: P384, P521, ED25519, ED448 */
-    switch (cose_curve)
-    {
-    case P_256:
-        psa_curve = PSA_ECC_CURVE_SECP256R1;
-        break;
-    default:
-        psa_curve = USHRT_MAX;
-    }
-
-    return psa_curve;
-}
-
 static psa_algorithm_t cose_hash_alg_id_to_psa(int32_t cose_hash_alg_id)
 {
     psa_algorithm_t status;
@@ -137,6 +121,15 @@
     return status;
 }
 
+/**
+    @brief           - Computes hash for the requested data
+    @param           - cose_alg_id       : Algorithm ID
+                     - buffer_for_hash   : Temp buffer for calculating hash
+                     - hash              : Pointer to store the hash
+                     - protected_headers : Buffer containing protected data
+                     - payload           : payload data
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_compute_hash(int32_t cose_alg_id, struct q_useful_buf buffer_for_hash,
                           struct q_useful_buf_c *hash, struct q_useful_buf_c protected_headers,
                           struct q_useful_buf_c payload)
@@ -203,22 +196,56 @@
     return status;
 }
 
+static int32_t pal_attest_get_public_key(uint8_t *public_key_buff, size_t public_key_buf_size,
+                                       size_t *public_key_len, psa_ecc_curve_t *elliptic_curve_type)
+{
+    int32_t     status = PAL_ATTEST_ERROR;
+
+#ifdef PLATFORM_OVERRIDE_ATTEST_PK
+    if (public_key_buf_size < (attest_key.pubx_key_size + attest_key.puby_key_size + 1))
+        return PAL_ATTEST_ERR_SMALL_BUFFER;
+
+    *public_key_len = (attest_key.pubx_key_size + attest_key.puby_key_size + 1);
+    *elliptic_curve_type = PSA_ECC_CURVE_SECP256R1;
+    memcpy(public_key_buff, (void *)&attest_public_key, *public_key_len);
+    status = PSA_SUCCESS;
+#else
+    status = tfm_initial_attest_get_public_key(public_key_buff,
+                                               public_key_buf_size,
+                                               public_key_len,
+                                               elliptic_curve_type);
+#endif
+
+    return status;
+}
+
 static uint32_t pal_import_attest_key(psa_algorithm_t key_alg)
 {
     psa_status_t     status             = PAL_ATTEST_ERROR;
     psa_key_usage_t  usage              = PSA_KEY_USAGE_VERIFY;
-    psa_ecc_curve_t  psa_curve          = attest_map_elliptic_curve_type(P_256);
-    psa_key_type_t   attest_key_type    = PSA_KEY_TYPE_ECC_PUBLIC_KEY(psa_curve);
-    size_t           public_key_size    = attest_key.pubx_key_size + attest_key.puby_key_size;
+    psa_ecc_curve_t  ecc_curve;
+    psa_key_type_t   attest_key_type;
+    size_t           public_key_size;
+    uint8_t          public_key_buff[ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH] = {0};
 
 #if defined(CRYPTO_VERSION_BETA1) || defined(CRYPTO_VERSION_BETA2)
     psa_key_policy_t policy;
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Setup the key policy for public key */
         policy = psa_key_policy_init();
         psa_key_policy_set_usage(&policy, usage, key_alg);
@@ -234,8 +261,8 @@
         /* Import the public key */
         status = psa_import_key(public_key_handle,
                                 attest_key_type,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1);
+                                public_key_buff,
+                                public_key_size);
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -247,21 +274,30 @@
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Set the attributes for the public key */
         psa_set_key_type(&attributes, attest_key_type);
-        psa_set_key_bits(&attributes, public_key_size + 1);
+        psa_set_key_bits(&attributes, public_key_size);
         psa_set_key_usage_flags(&attributes, usage);
         psa_set_key_algorithm(&attributes, key_alg);
 
         /* Import the public key */
         status = psa_import_key(&attributes,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1,
+                                public_key_buff,
+                                public_key_size,
                                 &public_key_handle);
-
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -272,6 +308,7 @@
     return status;
 }
 
+
 static uint32_t pal_destroy_attest_key(void)
 {
     psa_status_t     status;
@@ -288,6 +325,13 @@
     return PAL_ATTEST_SUCCESS;
 }
 
+/**
+    @brief           - Verify the signature using the public key
+    @param           - cose_algorithm_id : Algorithm ID
+                     - token_hash        : Data that needs to be verified
+                     - signature         : Signature to be verified against
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id,
                                    struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature)
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.h
index bd47990..559a24c 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_crypto.h
@@ -15,12 +15,15 @@
  * limitations under the License.
 **/
 
-#include "pal_common.h"
+#ifndef _PAL_ATTESTATION_CRYPTO_H_
+#define _PAL_ATTESTATION_CRYPTO_H_
+
 #include "pal_attestation_eat.h"
 
-#define ATTEST_PUBLIC_KEY_SLOT            4
+#define ATTEST_PUBLIC_KEY_SLOT                  4
+#define ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH   (1 + 2 * PSA_BITS_TO_BYTES(256))
 
-typedef struct{
+typedef struct {
     uint8_t  *pubx_key;
     size_t    pubx_key_size;
     uint8_t  *puby_key;
@@ -47,16 +50,14 @@
       0x0F, 0x34, 0x11, 0x7D, 0x97, 0x1D, 0x68, 0x64},
 };
 
-static const uint8_t initial_attestation_public_x_key[] =
-{
+static const uint8_t initial_attestation_public_x_key[] = {
     0x79, 0xEB, 0xA9, 0x0E, 0x8B, 0xF4, 0x50, 0xA6,
     0x75, 0x15, 0x76, 0xAD, 0x45, 0x99, 0xB0, 0x7A,
     0xDF, 0x93, 0x8D, 0xA3, 0xBB, 0x0B, 0xD1, 0x7D,
     0x00, 0x36, 0xED, 0x49, 0xA2, 0xD0, 0xFC, 0x3F
 };
 
-static const uint8_t initial_attestation_public_y_key[] =
-{
+static const uint8_t initial_attestation_public_y_key[] = {
     0xBF, 0xCD, 0xFA, 0x89, 0x56, 0xB5, 0x68, 0xBF,
     0xDB, 0x86, 0x73, 0xE6, 0x48, 0xD8, 0xB5, 0x8D,
     0x92, 0x99, 0x55, 0xB1, 0x4A, 0x26, 0xC3, 0x08,
@@ -84,5 +85,4 @@
                           struct q_useful_buf_c payload);
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature);
-
-
+#endif /* _PAL_ATTESTATION_CRYPTO_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.c b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.c
deleted file mode 100644
index 68c4312..0000000
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/** @file
- * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
- * SPDX-License-Identifier : Apache-2.0
- *
- * 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
- *
- *  http://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 "pal_attestation_crypto.h"
-
-uint32_t    mandatory_claims = 0;
-uint32_t    mandaroty_sw_components = 0;
-bool_t      sw_component_present = 0;
-
-int pal_encode_cose_key(struct q_useful_buf_c *cose_key,
-                               struct q_useful_buf buffer_for_cose_key,
-                               struct q_useful_buf_c x_cord, struct q_useful_buf_c y_cord)
-{
-    uint32_t                  return_value;
-    QCBORError                qcbor_result;
-    QCBOREncodeContext        cbor_encode_ctx;
-    int32_t                   cose_curve_id = P_256;
-    struct q_useful_buf_c     encoded_key_id;
-
-    /* Get the public key x and y */
-    /* Encode it into a COSE_Key structure */
-    QCBOREncode_Init(&cbor_encode_ctx, buffer_for_cose_key);
-    QCBOREncode_OpenMap(&cbor_encode_ctx);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_COMMON_KTY,
-                               COSE_KEY_TYPE_EC2);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_CRV,
-                               cose_curve_id);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_X_COORDINATE,
-                               x_cord);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_Y_COORDINATE,
-                               y_cord);
-    QCBOREncode_CloseMap(&cbor_encode_ctx);
-
-    qcbor_result = QCBOREncode_Finish(&cbor_encode_ctx, &encoded_key_id);
-    if (qcbor_result != QCBOR_SUCCESS)
-    {
-        /* Mainly means that the COSE_Key was too big for buffer_for_cose_key */
-        return_value = PAL_ATTEST_ERR_PROTECTED_HEADERS;
-        goto Done;
-    }
-
-    /* Finish up and return */
-    *cose_key = encoded_key_id;
-    return_value = PAL_ATTEST_SUCCESS;
-
-Done:
-    return return_value;
-}
-
-
-static int get_items_in_map(QCBORDecodeContext *decode_context,
-                            struct items_to_get_t *item_list)
-{
-    int                     item_index;
-    QCBORItem               item;
-    struct items_to_get_t  *item_ptr = item_list;
-
-    /* initialize the data type of all items in the list */
-    while (item_ptr->label != 0)
-    {
-        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
-        item_ptr++;
-    }
-
-    QCBORDecode_GetNext(decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_MAP)
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    for (item_index = item.val.uCount; item_index != 0; item_index--)
-    {
-        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
-        {
-            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-        }
-        if (item.uLabelType != QCBOR_TYPE_INT64)
-        {
-            continue;
-        }
-
-        item_ptr = item_list;
-        while (item_ptr->label != 0)
-        {
-            if (item.label.int64 == item_ptr->label)
-            {
-                item_ptr->item = item;
-            }
-            item_ptr++;
-        }
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int get_item_in_map(QCBORDecodeContext *decode_context,
-                           int32_t label,
-                           QCBORItem *item)
-{
-    struct items_to_get_t   item_list[2];
-
-    item_list[0].label = label;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
-    {
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-    }
-
-    *item = item_list[0].item;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
-                                     struct q_useful_buf_c *child)
-{
-    struct items_to_get_t   item_list[3];
-
-    item_list[0].label = COSE_HEADER_PARAM_KID;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERR_CBOR_STRUCTURE;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_protected_headers(struct q_useful_buf_c protected_headers,
-                                   int32_t *alg_id)
-{
-    QCBORDecodeContext  decode_context;
-    QCBORItem           item;
-
-    QCBORDecode_Init(&decode_context, protected_headers, 0);
-
-    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (QCBORDecode_Finish(&decode_context))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    *alg_id = (int32_t)item.val.int64;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-/**
-    @brief    - This API will verify the claims
-    @param    - decode_context      : The buffer containing the challenge
-                item                : context for decoding the data items
-                completed_challenge : Buffer containing the challenge
-    @return   - error status
-**/
-static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
-                                   struct q_useful_buf_c completed_challenge)
-{
-    int i, count = 0;
-    int status = PAL_ATTEST_SUCCESS;
-
-    /* Parse each claim and validate their data type */
-    while (status == PAL_ATTEST_SUCCESS)
-    {
-        status = QCBORDecode_GetNext(decode_context, &item);
-        if (status != PAL_ATTEST_SUCCESS)
-            break;
-
-        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
-        if (item.uLabelType == QCBOR_TYPE_INT64)
-        {
-            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
-            {
-                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
-                {
-                    /* Given challenge vs challenge in token */
-                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
-                        return PAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
-                }
-                else
-                    return PAL_ATTEST_TOKEN_NOT_SUPPORTED;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
-            {
-                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
-            {
-                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
-            {
-                if (item.uDataType != QCBOR_TYPE_INT64)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
-            {
-                if (item.uDataType != QCBOR_TYPE_ARRAY)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-                sw_component_present = 1;
-                status = QCBORDecode_GetNext(decode_context, &item);
-                if (status != PAL_ATTEST_SUCCESS)
-                    continue;
-
-                count = item.val.uCount;
-                for (i = 0; i <= count; i++)
-                {
-                    mandaroty_sw_components |= 1 << item.label.int64;
-
-                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
-                    {
-                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_INT64)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-
-                    if (i < count)
-                    {
-                        status = QCBORDecode_GetNext(decode_context, &item);
-                        if (status != PAL_ATTEST_SUCCESS)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                }
-
-            }
-        }
-        else
-        {
-            /* ToDo: Add other claim types */
-        }
-    }
-
-    if (status == QCBOR_ERR_HIT_END)
-        return PAL_ATTEST_SUCCESS;
-    else
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-}
-
-/**
-    @brief    - This API will verify the attestation token
-    @param    - challenge       : The buffer containing the challenge
-                challenge_size  : Size of the challenge buffer
-                token           : The buffer containing the attestation token
-                token_size      : Size of the token buffer
-    @return   - error status
-**/
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size)
-{
-    int32_t             status = PAL_ATTEST_SUCCESS;
-    int32_t             cose_algorithm_id;
-    QCBORItem           item;
-    QCBORDecodeContext  decode_context;
-    struct q_useful_buf_c completed_challenge;
-    struct q_useful_buf_c completed_token;
-    struct q_useful_buf_c payload;
-    struct q_useful_buf_c signature;
-    struct q_useful_buf_c protected_headers;
-    struct q_useful_buf_c kid;
-    struct q_useful_buf_c token_hash;
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_x_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_y_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
-
-    kid.ptr = buffer_for_encoded_key.ptr;
-
-    memcpy(buf_to_hold_x_coord.ptr, (const void *)attest_key.pubx_key, attest_key.pubx_key_size);
-    memcpy(buf_to_hold_y_coord.ptr, (const void *)attest_key.puby_key, attest_key.puby_key_size);
-
-    /* Update size */
-    buf_to_hold_x_coord.len = attest_key.pubx_key_size;
-    buf_to_hold_y_coord.len = attest_key.puby_key_size;
-
-    /* Construct the token buffer for validation */
-    completed_token.ptr = token;
-    completed_token.len = token_size;
-
-    /* Construct the challenge buffer for validation */
-    completed_challenge.ptr = challenge;
-    completed_challenge.len = challenge_size;
-
-/*
-    -------------------------
-    |  CBOR Array Type      |
-    -------------------------
-    |  Protected Headers    |
-    -------------------------
-    |  Unprotected Headers  |
-    -------------------------
-    |  Payload              |
-    -------------------------
-    |  Signature            |
-    -------------------------
-*/
-
-    /* Initialize the decorder */
-    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
-
-    /* Get the Header */
-    QCBORDecode_GetNext(&decode_context, &item);
-
-    /* Check the CBOR Array type. Check if the count is 4.
-     * Only COSE_SIGN1 is supported now.
-     */
-    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
-       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Get the next headers */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    protected_headers = item.val.string;
-
-    /* Parse the protected headers and check the data type and value*/
-    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Parse the unprotected headers and check the data type and value */
-    status = parse_unprotected_headers(&decode_context, &kid);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Get the payload */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    payload = item.val.string;
-
-    /* Get the digital signature */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    signature = item.val.string;
-
-    /* Compute the hash from the token */
-    status = pal_compute_hash(cose_algorithm_id, buffer_for_token_hash, &token_hash,
-                              protected_headers, payload);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Verify the signature */
-    status = pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Initialize the Decoder and validate the payload format */
-    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
-    status = QCBORDecode_GetNext(&decode_context, &item);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if (item.uDataType != QCBOR_TYPE_MAP)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Parse the payload and check the data type of each claim */
-    status = parse_claims(&decode_context, item, completed_challenge);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
-    {
-        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
-            return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
-    {
-        return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.h
index df24c89..fae5434 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_eat.h
@@ -15,43 +15,17 @@
  * limitations under the License.
 **/
 
+#ifndef _PAL_ATTESTATION_EAT_H_
+#define _PAL_ATTESTATION_EAT_H_
+
 #include "qcbor.h"
 #include "pal_common.h"
-#include "psa/crypto.h"
 
 #define PAL_ATTEST_MIN_ERROR              30
 
-/* NIST P-256 also known as secp256r1 */
-#define P_256                             1
-
-#define COSE_HEADER_PARAM_ALG             1
-#define COSE_HEADER_PARAM_KID             4
-
-#define COSE_KEY_COMMON_KTY               1
-#define COSE_KEY_TYPE_EC2                 2
-#define COSE_KEY_PARAM_CRV               -1
-#define COSE_KEY_PARAM_X_COORDINATE      -2
-#define COSE_KEY_PARAM_Y_COORDINATE      -3
 #define COSE_ALGORITHM_ES256             -7
 #define COSE_ALG_SHA256_PROPRIETARY      -72000
 
-/**
- * The size of X and Y coordinate in 2 parameter style EC public
- * key. Format is as defined in [COSE (RFC 8152)]
- * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
- * Cryptography](http://www.secg.org/sec1-v2.pdf).
- *
- * This size is well-known and documented in public standards.
- */
-#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
-#define T_COSE_CRYPTO_SHA256_SIZE         32
-
-#define MAX_ENCODED_COSE_KEY_SIZE \
-    1 + /* 1 byte to encode map */ \
-    2 + /* 2 bytes to encode key type */ \
-    2 + /* 2 bytes to encode curve */ \
-    2 * /* the X and Y coordinates at 32 bytes each */ \
-        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2)
 #define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
 
 #define COSE_SIG_CONTEXT_STRING_SIGNATURE1 "Signature1"
@@ -78,71 +52,9 @@
     sizeof(COSE_SIG_CONTEXT_STRING_SIGNATURE1) + /* "Signature1" */ \
     2 + /* Overhead for encoding string */ \
     T_COSE_SIGN1_MAX_PROT_HEADER + /* entire protected headers */ \
-    3 * ( /* 3 NULL bstrs for fields not used */ \
+    3 * (/* 3 NULL bstrs for fields not used */ \
         1 /* size of a NULL bstr */  \
     )
-
-/*
- CBOR Label for proprietary header indicating short-circuit
- signing was used. Just a random number in the proprietary
- label space */
-#define T_COSE_SHORT_CIRCUIT_LABEL              (-8675309)
-
-#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
-#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
-#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
-#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
-#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
-#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
-#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
-#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
-#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
-#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
-#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
-#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
-
-#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
-
-#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
-#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
-#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
-#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
-
-#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
-
-#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
-
-#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
-                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-
 #define NULL_USEFUL_BUF_C  NULLUsefulBufC
 
 enum attestation_error_code {
@@ -161,13 +73,8 @@
     PAL_ATTEST_ERR_KEY_FAIL,
     PAL_ATTEST_ERR_SIGNATURE_FAIL,
     PAL_ATTEST_ERR_CBOR_STRUCTURE,
+    PAL_ATTEST_ERR_SMALL_BUFFER,
     PAL_ATTEST_ERROR,
 };
 
-struct items_to_get_t {
-    int64_t label;
-    QCBORItem item;
-};
-
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size);
+#endif /* _PAL_ATTESTATION_EAT_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.c b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.c
index 83c1ebd..8dc9406 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.c
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.c
@@ -26,8 +26,11 @@
 **/
 int32_t pal_attestation_function(int type, va_list valist)
 {
-    uint8_t     *challenge, *token;
-    size_t       challenge_size, *token_size, verify_token_size, token_buffer_size;
+    uint8_t                *challenge, *token;
+    size_t                  challenge_size, *token_size, token_buffer_size;
+    int32_t                 cose_algorithm_id;
+    struct q_useful_buf     buffer_for_hash;
+    struct q_useful_buf_c  *hash, payload, protected_headers, token_hash, signature;
 
     switch (type)
     {
@@ -43,13 +46,19 @@
             challenge_size = va_arg(valist, size_t);
             token_size = va_arg(valist, size_t*);
             return psa_initial_attest_get_token_size(challenge_size, token_size);
-        case PAL_INITIAL_ATTEST_VERIFY_TOKEN:
-            challenge = va_arg(valist, uint8_t*);
-            challenge_size = va_arg(valist, size_t);
-            token = va_arg(valist, uint8_t*);
-            verify_token_size = va_arg(valist, size_t);
-            return pal_initial_attest_verify_token(challenge, challenge_size,
-                                                   token, verify_token_size);
+        case PAL_INITIAL_ATTEST_COMPUTE_HASH:
+            cose_algorithm_id = va_arg(valist, int32_t);
+            buffer_for_hash = va_arg(valist, struct q_useful_buf);
+            hash = va_arg(valist, struct q_useful_buf_c*);
+            protected_headers = va_arg(valist, struct q_useful_buf_c);
+            payload = va_arg(valist, struct q_useful_buf_c);
+            return pal_compute_hash(cose_algorithm_id, buffer_for_hash, hash,
+                                    protected_headers, payload);
+        case PAL_INITIAL_ATTEST_VERIFY_WITH_PK:
+            cose_algorithm_id = va_arg(valist, int32_t);
+            token_hash = va_arg(valist, struct q_useful_buf_c);
+            signature = va_arg(valist, struct q_useful_buf_c);
+            return pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
         default:
             return PAL_STATUS_UNSUPPORTED_FUNC;
     }
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.h
index 12f6ee9..3ab7ebb 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/initial_attestation/pal_attestation_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_INITIAL_ATTESTATION_H_
-#define _PAL_INITIAL_ATTESTATION_H_
+#ifndef _PAL_ATTESTATION_INTF_H_
+#define _PAL_ATTESTATION_INTF_H_
 
 #include "pal_attestation_crypto.h"
 
@@ -24,7 +24,9 @@
     PAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     PAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     PAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    PAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    PAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
 int32_t pal_attestation_function(int type, va_list valist);
-#endif /* _PAL_INITIAL_ATTESTATION_H_ */
+#endif /* _PAL_ATTESTATION_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/target.cmake b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/target.cmake
index 5c5c942..db9a4fa 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/target.cmake
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/target.cmake
@@ -71,7 +71,6 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	list(APPEND PAL_SRC_C_NSPE
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_intf.c
-		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_eat.c
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_crypto.c
 	)
 endif()
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_common.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_common.h
index 0a63b02..a03cd8d 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_common.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_common.h
@@ -37,8 +37,7 @@
 
 #define PAL_STATUS_UNSUPPORTED_FUNC      0xFF
 
-typedef enum
-{
+typedef enum {
     PAL_STATUS_SUCCESS = 0x0,
     PAL_STATUS_ERROR   = 0x80
 } pal_status_t;
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_config.h
index 2871339..61db8d8 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/common/pal_config.h
@@ -43,6 +43,9 @@
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.c b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.c
index 2da03fa..04fe5ef 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.c
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.c
@@ -19,29 +19,13 @@
 
 static uint32_t         public_key_registered;
 static psa_key_handle_t public_key_handle;
+
 static inline struct q_useful_buf_c useful_buf_head(struct q_useful_buf_c buf,
                                                   size_t amount)
 {
     return UsefulBuf_Head(buf, amount);
 }
 
-static psa_ecc_curve_t attest_map_elliptic_curve_type(int32_t cose_curve)
-{
-    psa_ecc_curve_t psa_curve;
-
-    /*FixMe: Mapping is not complete, missing ones: P384, P521, ED25519, ED448 */
-    switch (cose_curve)
-    {
-    case P_256:
-        psa_curve = PSA_ECC_CURVE_SECP256R1;
-        break;
-    default:
-        psa_curve = USHRT_MAX;
-    }
-
-    return psa_curve;
-}
-
 static psa_algorithm_t cose_hash_alg_id_to_psa(int32_t cose_hash_alg_id)
 {
     psa_algorithm_t status;
@@ -137,6 +121,15 @@
     return status;
 }
 
+/**
+    @brief           - Computes hash for the requested data
+    @param           - cose_alg_id       : Algorithm ID
+                     - buffer_for_hash   : Temp buffer for calculating hash
+                     - hash              : Pointer to store the hash
+                     - protected_headers : Buffer containing protected data
+                     - payload           : payload data
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_compute_hash(int32_t cose_alg_id, struct q_useful_buf buffer_for_hash,
                           struct q_useful_buf_c *hash, struct q_useful_buf_c protected_headers,
                           struct q_useful_buf_c payload)
@@ -203,22 +196,56 @@
     return status;
 }
 
+static int32_t pal_attest_get_public_key(uint8_t *public_key_buff, size_t public_key_buf_size,
+                                       size_t *public_key_len, psa_ecc_curve_t *elliptic_curve_type)
+{
+    int32_t     status = PAL_ATTEST_ERROR;
+
+#ifdef PLATFORM_OVERRIDE_ATTEST_PK
+    if (public_key_buf_size < (attest_key.pubx_key_size + attest_key.puby_key_size + 1))
+        return PAL_ATTEST_ERR_SMALL_BUFFER;
+
+    *public_key_len = (attest_key.pubx_key_size + attest_key.puby_key_size + 1);
+    *elliptic_curve_type = PSA_ECC_CURVE_SECP256R1;
+    memcpy(public_key_buff, (void *)&attest_public_key, *public_key_len);
+    status = PSA_SUCCESS;
+#else
+    status = tfm_initial_attest_get_public_key(public_key_buff,
+                                               public_key_buf_size,
+                                               public_key_len,
+                                               elliptic_curve_type);
+#endif
+
+    return status;
+}
+
 static uint32_t pal_import_attest_key(psa_algorithm_t key_alg)
 {
     psa_status_t     status             = PAL_ATTEST_ERROR;
     psa_key_usage_t  usage              = PSA_KEY_USAGE_VERIFY;
-    psa_ecc_curve_t  psa_curve          = attest_map_elliptic_curve_type(P_256);
-    psa_key_type_t   attest_key_type    = PSA_KEY_TYPE_ECC_PUBLIC_KEY(psa_curve);
-    size_t           public_key_size    = attest_key.pubx_key_size + attest_key.puby_key_size;
+    psa_ecc_curve_t  ecc_curve;
+    psa_key_type_t   attest_key_type;
+    size_t           public_key_size;
+    uint8_t          public_key_buff[ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH] = {0};
 
 #if defined(CRYPTO_VERSION_BETA1) || defined(CRYPTO_VERSION_BETA2)
     psa_key_policy_t policy;
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Setup the key policy for public key */
         policy = psa_key_policy_init();
         psa_key_policy_set_usage(&policy, usage, key_alg);
@@ -234,8 +261,8 @@
         /* Import the public key */
         status = psa_import_key(public_key_handle,
                                 attest_key_type,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1);
+                                public_key_buff,
+                                public_key_size);
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -247,21 +274,30 @@
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Set the attributes for the public key */
         psa_set_key_type(&attributes, attest_key_type);
-        psa_set_key_bits(&attributes, public_key_size + 1);
+        psa_set_key_bits(&attributes, public_key_size);
         psa_set_key_usage_flags(&attributes, usage);
         psa_set_key_algorithm(&attributes, key_alg);
 
         /* Import the public key */
         status = psa_import_key(&attributes,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1,
+                                public_key_buff,
+                                public_key_size,
                                 &public_key_handle);
-
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -288,6 +324,13 @@
     return PAL_ATTEST_SUCCESS;
 }
 
+/**
+    @brief           - Verify the signature using the public key
+    @param           - cose_algorithm_id : Algorithm ID
+                     - token_hash        : Data that needs to be verified
+                     - signature         : Signature to be verified against
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id,
                                    struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature)
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.h
index bd47990..559a24c 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_crypto.h
@@ -15,12 +15,15 @@
  * limitations under the License.
 **/
 
-#include "pal_common.h"
+#ifndef _PAL_ATTESTATION_CRYPTO_H_
+#define _PAL_ATTESTATION_CRYPTO_H_
+
 #include "pal_attestation_eat.h"
 
-#define ATTEST_PUBLIC_KEY_SLOT            4
+#define ATTEST_PUBLIC_KEY_SLOT                  4
+#define ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH   (1 + 2 * PSA_BITS_TO_BYTES(256))
 
-typedef struct{
+typedef struct {
     uint8_t  *pubx_key;
     size_t    pubx_key_size;
     uint8_t  *puby_key;
@@ -47,16 +50,14 @@
       0x0F, 0x34, 0x11, 0x7D, 0x97, 0x1D, 0x68, 0x64},
 };
 
-static const uint8_t initial_attestation_public_x_key[] =
-{
+static const uint8_t initial_attestation_public_x_key[] = {
     0x79, 0xEB, 0xA9, 0x0E, 0x8B, 0xF4, 0x50, 0xA6,
     0x75, 0x15, 0x76, 0xAD, 0x45, 0x99, 0xB0, 0x7A,
     0xDF, 0x93, 0x8D, 0xA3, 0xBB, 0x0B, 0xD1, 0x7D,
     0x00, 0x36, 0xED, 0x49, 0xA2, 0xD0, 0xFC, 0x3F
 };
 
-static const uint8_t initial_attestation_public_y_key[] =
-{
+static const uint8_t initial_attestation_public_y_key[] = {
     0xBF, 0xCD, 0xFA, 0x89, 0x56, 0xB5, 0x68, 0xBF,
     0xDB, 0x86, 0x73, 0xE6, 0x48, 0xD8, 0xB5, 0x8D,
     0x92, 0x99, 0x55, 0xB1, 0x4A, 0x26, 0xC3, 0x08,
@@ -84,5 +85,4 @@
                           struct q_useful_buf_c payload);
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature);
-
-
+#endif /* _PAL_ATTESTATION_CRYPTO_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.c b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.c
deleted file mode 100644
index 68c4312..0000000
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/** @file
- * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
- * SPDX-License-Identifier : Apache-2.0
- *
- * 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
- *
- *  http://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 "pal_attestation_crypto.h"
-
-uint32_t    mandatory_claims = 0;
-uint32_t    mandaroty_sw_components = 0;
-bool_t      sw_component_present = 0;
-
-int pal_encode_cose_key(struct q_useful_buf_c *cose_key,
-                               struct q_useful_buf buffer_for_cose_key,
-                               struct q_useful_buf_c x_cord, struct q_useful_buf_c y_cord)
-{
-    uint32_t                  return_value;
-    QCBORError                qcbor_result;
-    QCBOREncodeContext        cbor_encode_ctx;
-    int32_t                   cose_curve_id = P_256;
-    struct q_useful_buf_c     encoded_key_id;
-
-    /* Get the public key x and y */
-    /* Encode it into a COSE_Key structure */
-    QCBOREncode_Init(&cbor_encode_ctx, buffer_for_cose_key);
-    QCBOREncode_OpenMap(&cbor_encode_ctx);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_COMMON_KTY,
-                               COSE_KEY_TYPE_EC2);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_CRV,
-                               cose_curve_id);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_X_COORDINATE,
-                               x_cord);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_Y_COORDINATE,
-                               y_cord);
-    QCBOREncode_CloseMap(&cbor_encode_ctx);
-
-    qcbor_result = QCBOREncode_Finish(&cbor_encode_ctx, &encoded_key_id);
-    if (qcbor_result != QCBOR_SUCCESS)
-    {
-        /* Mainly means that the COSE_Key was too big for buffer_for_cose_key */
-        return_value = PAL_ATTEST_ERR_PROTECTED_HEADERS;
-        goto Done;
-    }
-
-    /* Finish up and return */
-    *cose_key = encoded_key_id;
-    return_value = PAL_ATTEST_SUCCESS;
-
-Done:
-    return return_value;
-}
-
-
-static int get_items_in_map(QCBORDecodeContext *decode_context,
-                            struct items_to_get_t *item_list)
-{
-    int                     item_index;
-    QCBORItem               item;
-    struct items_to_get_t  *item_ptr = item_list;
-
-    /* initialize the data type of all items in the list */
-    while (item_ptr->label != 0)
-    {
-        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
-        item_ptr++;
-    }
-
-    QCBORDecode_GetNext(decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_MAP)
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    for (item_index = item.val.uCount; item_index != 0; item_index--)
-    {
-        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
-        {
-            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-        }
-        if (item.uLabelType != QCBOR_TYPE_INT64)
-        {
-            continue;
-        }
-
-        item_ptr = item_list;
-        while (item_ptr->label != 0)
-        {
-            if (item.label.int64 == item_ptr->label)
-            {
-                item_ptr->item = item;
-            }
-            item_ptr++;
-        }
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int get_item_in_map(QCBORDecodeContext *decode_context,
-                           int32_t label,
-                           QCBORItem *item)
-{
-    struct items_to_get_t   item_list[2];
-
-    item_list[0].label = label;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
-    {
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-    }
-
-    *item = item_list[0].item;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
-                                     struct q_useful_buf_c *child)
-{
-    struct items_to_get_t   item_list[3];
-
-    item_list[0].label = COSE_HEADER_PARAM_KID;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERR_CBOR_STRUCTURE;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_protected_headers(struct q_useful_buf_c protected_headers,
-                                   int32_t *alg_id)
-{
-    QCBORDecodeContext  decode_context;
-    QCBORItem           item;
-
-    QCBORDecode_Init(&decode_context, protected_headers, 0);
-
-    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (QCBORDecode_Finish(&decode_context))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    *alg_id = (int32_t)item.val.int64;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-/**
-    @brief    - This API will verify the claims
-    @param    - decode_context      : The buffer containing the challenge
-                item                : context for decoding the data items
-                completed_challenge : Buffer containing the challenge
-    @return   - error status
-**/
-static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
-                                   struct q_useful_buf_c completed_challenge)
-{
-    int i, count = 0;
-    int status = PAL_ATTEST_SUCCESS;
-
-    /* Parse each claim and validate their data type */
-    while (status == PAL_ATTEST_SUCCESS)
-    {
-        status = QCBORDecode_GetNext(decode_context, &item);
-        if (status != PAL_ATTEST_SUCCESS)
-            break;
-
-        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
-        if (item.uLabelType == QCBOR_TYPE_INT64)
-        {
-            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
-            {
-                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
-                {
-                    /* Given challenge vs challenge in token */
-                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
-                        return PAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
-                }
-                else
-                    return PAL_ATTEST_TOKEN_NOT_SUPPORTED;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
-            {
-                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
-            {
-                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
-            {
-                if (item.uDataType != QCBOR_TYPE_INT64)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
-            {
-                if (item.uDataType != QCBOR_TYPE_ARRAY)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-                sw_component_present = 1;
-                status = QCBORDecode_GetNext(decode_context, &item);
-                if (status != PAL_ATTEST_SUCCESS)
-                    continue;
-
-                count = item.val.uCount;
-                for (i = 0; i <= count; i++)
-                {
-                    mandaroty_sw_components |= 1 << item.label.int64;
-
-                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
-                    {
-                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_INT64)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-
-                    if (i < count)
-                    {
-                        status = QCBORDecode_GetNext(decode_context, &item);
-                        if (status != PAL_ATTEST_SUCCESS)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                }
-
-            }
-        }
-        else
-        {
-            /* ToDo: Add other claim types */
-        }
-    }
-
-    if (status == QCBOR_ERR_HIT_END)
-        return PAL_ATTEST_SUCCESS;
-    else
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-}
-
-/**
-    @brief    - This API will verify the attestation token
-    @param    - challenge       : The buffer containing the challenge
-                challenge_size  : Size of the challenge buffer
-                token           : The buffer containing the attestation token
-                token_size      : Size of the token buffer
-    @return   - error status
-**/
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size)
-{
-    int32_t             status = PAL_ATTEST_SUCCESS;
-    int32_t             cose_algorithm_id;
-    QCBORItem           item;
-    QCBORDecodeContext  decode_context;
-    struct q_useful_buf_c completed_challenge;
-    struct q_useful_buf_c completed_token;
-    struct q_useful_buf_c payload;
-    struct q_useful_buf_c signature;
-    struct q_useful_buf_c protected_headers;
-    struct q_useful_buf_c kid;
-    struct q_useful_buf_c token_hash;
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_x_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_y_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
-
-    kid.ptr = buffer_for_encoded_key.ptr;
-
-    memcpy(buf_to_hold_x_coord.ptr, (const void *)attest_key.pubx_key, attest_key.pubx_key_size);
-    memcpy(buf_to_hold_y_coord.ptr, (const void *)attest_key.puby_key, attest_key.puby_key_size);
-
-    /* Update size */
-    buf_to_hold_x_coord.len = attest_key.pubx_key_size;
-    buf_to_hold_y_coord.len = attest_key.puby_key_size;
-
-    /* Construct the token buffer for validation */
-    completed_token.ptr = token;
-    completed_token.len = token_size;
-
-    /* Construct the challenge buffer for validation */
-    completed_challenge.ptr = challenge;
-    completed_challenge.len = challenge_size;
-
-/*
-    -------------------------
-    |  CBOR Array Type      |
-    -------------------------
-    |  Protected Headers    |
-    -------------------------
-    |  Unprotected Headers  |
-    -------------------------
-    |  Payload              |
-    -------------------------
-    |  Signature            |
-    -------------------------
-*/
-
-    /* Initialize the decorder */
-    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
-
-    /* Get the Header */
-    QCBORDecode_GetNext(&decode_context, &item);
-
-    /* Check the CBOR Array type. Check if the count is 4.
-     * Only COSE_SIGN1 is supported now.
-     */
-    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
-       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Get the next headers */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    protected_headers = item.val.string;
-
-    /* Parse the protected headers and check the data type and value*/
-    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Parse the unprotected headers and check the data type and value */
-    status = parse_unprotected_headers(&decode_context, &kid);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Get the payload */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    payload = item.val.string;
-
-    /* Get the digital signature */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    signature = item.val.string;
-
-    /* Compute the hash from the token */
-    status = pal_compute_hash(cose_algorithm_id, buffer_for_token_hash, &token_hash,
-                              protected_headers, payload);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Verify the signature */
-    status = pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Initialize the Decoder and validate the payload format */
-    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
-    status = QCBORDecode_GetNext(&decode_context, &item);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if (item.uDataType != QCBOR_TYPE_MAP)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Parse the payload and check the data type of each claim */
-    status = parse_claims(&decode_context, item, completed_challenge);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
-    {
-        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
-            return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
-    {
-        return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.h
index df24c89..fae5434 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_eat.h
@@ -15,43 +15,17 @@
  * limitations under the License.
 **/
 
+#ifndef _PAL_ATTESTATION_EAT_H_
+#define _PAL_ATTESTATION_EAT_H_
+
 #include "qcbor.h"
 #include "pal_common.h"
-#include "psa/crypto.h"
 
 #define PAL_ATTEST_MIN_ERROR              30
 
-/* NIST P-256 also known as secp256r1 */
-#define P_256                             1
-
-#define COSE_HEADER_PARAM_ALG             1
-#define COSE_HEADER_PARAM_KID             4
-
-#define COSE_KEY_COMMON_KTY               1
-#define COSE_KEY_TYPE_EC2                 2
-#define COSE_KEY_PARAM_CRV               -1
-#define COSE_KEY_PARAM_X_COORDINATE      -2
-#define COSE_KEY_PARAM_Y_COORDINATE      -3
 #define COSE_ALGORITHM_ES256             -7
 #define COSE_ALG_SHA256_PROPRIETARY      -72000
 
-/**
- * The size of X and Y coordinate in 2 parameter style EC public
- * key. Format is as defined in [COSE (RFC 8152)]
- * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
- * Cryptography](http://www.secg.org/sec1-v2.pdf).
- *
- * This size is well-known and documented in public standards.
- */
-#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
-#define T_COSE_CRYPTO_SHA256_SIZE         32
-
-#define MAX_ENCODED_COSE_KEY_SIZE \
-    1 + /* 1 byte to encode map */ \
-    2 + /* 2 bytes to encode key type */ \
-    2 + /* 2 bytes to encode curve */ \
-    2 * /* the X and Y coordinates at 32 bytes each */ \
-        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2)
 #define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
 
 #define COSE_SIG_CONTEXT_STRING_SIGNATURE1 "Signature1"
@@ -78,71 +52,9 @@
     sizeof(COSE_SIG_CONTEXT_STRING_SIGNATURE1) + /* "Signature1" */ \
     2 + /* Overhead for encoding string */ \
     T_COSE_SIGN1_MAX_PROT_HEADER + /* entire protected headers */ \
-    3 * ( /* 3 NULL bstrs for fields not used */ \
+    3 * (/* 3 NULL bstrs for fields not used */ \
         1 /* size of a NULL bstr */  \
     )
-
-/*
- CBOR Label for proprietary header indicating short-circuit
- signing was used. Just a random number in the proprietary
- label space */
-#define T_COSE_SHORT_CIRCUIT_LABEL              (-8675309)
-
-#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
-#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
-#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
-#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
-#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
-#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
-#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
-#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
-#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
-#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
-#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
-#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
-
-#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
-
-#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
-#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
-#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
-#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
-
-#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
-
-#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
-
-#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
-                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-
 #define NULL_USEFUL_BUF_C  NULLUsefulBufC
 
 enum attestation_error_code {
@@ -161,13 +73,8 @@
     PAL_ATTEST_ERR_KEY_FAIL,
     PAL_ATTEST_ERR_SIGNATURE_FAIL,
     PAL_ATTEST_ERR_CBOR_STRUCTURE,
+    PAL_ATTEST_ERR_SMALL_BUFFER,
     PAL_ATTEST_ERROR,
 };
 
-struct items_to_get_t {
-    int64_t label;
-    QCBORItem item;
-};
-
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size);
+#endif /* _PAL_ATTESTATION_EAT_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_intf.h
index 12f6ee9..3ab7ebb 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/initial_attestation/pal_attestation_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_INITIAL_ATTESTATION_H_
-#define _PAL_INITIAL_ATTESTATION_H_
+#ifndef _PAL_ATTESTATION_INTF_H_
+#define _PAL_ATTESTATION_INTF_H_
 
 #include "pal_attestation_crypto.h"
 
@@ -24,7 +24,9 @@
     PAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     PAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     PAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    PAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    PAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
 int32_t pal_attestation_function(int type, va_list valist);
-#endif /* _PAL_INITIAL_ATTESTATION_H_ */
+#endif /* _PAL_ATTESTATION_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/target.cmake b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/target.cmake
index 5c5c942..db9a4fa 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/target.cmake
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/target.cmake
@@ -71,7 +71,6 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	list(APPEND PAL_SRC_C_NSPE
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_intf.c
-		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_eat.c
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_crypto.c
 	)
 endif()
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/common/pal_config.h
index 2871339..61db8d8 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/common/pal_config.h
@@ -43,6 +43,9 @@
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.c b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.c
index 2da03fa..04fe5ef 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.c
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.c
@@ -19,29 +19,13 @@
 
 static uint32_t         public_key_registered;
 static psa_key_handle_t public_key_handle;
+
 static inline struct q_useful_buf_c useful_buf_head(struct q_useful_buf_c buf,
                                                   size_t amount)
 {
     return UsefulBuf_Head(buf, amount);
 }
 
-static psa_ecc_curve_t attest_map_elliptic_curve_type(int32_t cose_curve)
-{
-    psa_ecc_curve_t psa_curve;
-
-    /*FixMe: Mapping is not complete, missing ones: P384, P521, ED25519, ED448 */
-    switch (cose_curve)
-    {
-    case P_256:
-        psa_curve = PSA_ECC_CURVE_SECP256R1;
-        break;
-    default:
-        psa_curve = USHRT_MAX;
-    }
-
-    return psa_curve;
-}
-
 static psa_algorithm_t cose_hash_alg_id_to_psa(int32_t cose_hash_alg_id)
 {
     psa_algorithm_t status;
@@ -137,6 +121,15 @@
     return status;
 }
 
+/**
+    @brief           - Computes hash for the requested data
+    @param           - cose_alg_id       : Algorithm ID
+                     - buffer_for_hash   : Temp buffer for calculating hash
+                     - hash              : Pointer to store the hash
+                     - protected_headers : Buffer containing protected data
+                     - payload           : payload data
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_compute_hash(int32_t cose_alg_id, struct q_useful_buf buffer_for_hash,
                           struct q_useful_buf_c *hash, struct q_useful_buf_c protected_headers,
                           struct q_useful_buf_c payload)
@@ -203,22 +196,56 @@
     return status;
 }
 
+static int32_t pal_attest_get_public_key(uint8_t *public_key_buff, size_t public_key_buf_size,
+                                       size_t *public_key_len, psa_ecc_curve_t *elliptic_curve_type)
+{
+    int32_t     status = PAL_ATTEST_ERROR;
+
+#ifdef PLATFORM_OVERRIDE_ATTEST_PK
+    if (public_key_buf_size < (attest_key.pubx_key_size + attest_key.puby_key_size + 1))
+        return PAL_ATTEST_ERR_SMALL_BUFFER;
+
+    *public_key_len = (attest_key.pubx_key_size + attest_key.puby_key_size + 1);
+    *elliptic_curve_type = PSA_ECC_CURVE_SECP256R1;
+    memcpy(public_key_buff, (void *)&attest_public_key, *public_key_len);
+    status = PSA_SUCCESS;
+#else
+    status = tfm_initial_attest_get_public_key(public_key_buff,
+                                               public_key_buf_size,
+                                               public_key_len,
+                                               elliptic_curve_type);
+#endif
+
+    return status;
+}
+
 static uint32_t pal_import_attest_key(psa_algorithm_t key_alg)
 {
     psa_status_t     status             = PAL_ATTEST_ERROR;
     psa_key_usage_t  usage              = PSA_KEY_USAGE_VERIFY;
-    psa_ecc_curve_t  psa_curve          = attest_map_elliptic_curve_type(P_256);
-    psa_key_type_t   attest_key_type    = PSA_KEY_TYPE_ECC_PUBLIC_KEY(psa_curve);
-    size_t           public_key_size    = attest_key.pubx_key_size + attest_key.puby_key_size;
+    psa_ecc_curve_t  ecc_curve;
+    psa_key_type_t   attest_key_type;
+    size_t           public_key_size;
+    uint8_t          public_key_buff[ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH] = {0};
 
 #if defined(CRYPTO_VERSION_BETA1) || defined(CRYPTO_VERSION_BETA2)
     psa_key_policy_t policy;
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Setup the key policy for public key */
         policy = psa_key_policy_init();
         psa_key_policy_set_usage(&policy, usage, key_alg);
@@ -234,8 +261,8 @@
         /* Import the public key */
         status = psa_import_key(public_key_handle,
                                 attest_key_type,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1);
+                                public_key_buff,
+                                public_key_size);
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -247,21 +274,30 @@
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Set the attributes for the public key */
         psa_set_key_type(&attributes, attest_key_type);
-        psa_set_key_bits(&attributes, public_key_size + 1);
+        psa_set_key_bits(&attributes, public_key_size);
         psa_set_key_usage_flags(&attributes, usage);
         psa_set_key_algorithm(&attributes, key_alg);
 
         /* Import the public key */
         status = psa_import_key(&attributes,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1,
+                                public_key_buff,
+                                public_key_size,
                                 &public_key_handle);
-
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -288,6 +324,13 @@
     return PAL_ATTEST_SUCCESS;
 }
 
+/**
+    @brief           - Verify the signature using the public key
+    @param           - cose_algorithm_id : Algorithm ID
+                     - token_hash        : Data that needs to be verified
+                     - signature         : Signature to be verified against
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id,
                                    struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature)
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.h
index bd47990..559a24c 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_crypto.h
@@ -15,12 +15,15 @@
  * limitations under the License.
 **/
 
-#include "pal_common.h"
+#ifndef _PAL_ATTESTATION_CRYPTO_H_
+#define _PAL_ATTESTATION_CRYPTO_H_
+
 #include "pal_attestation_eat.h"
 
-#define ATTEST_PUBLIC_KEY_SLOT            4
+#define ATTEST_PUBLIC_KEY_SLOT                  4
+#define ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH   (1 + 2 * PSA_BITS_TO_BYTES(256))
 
-typedef struct{
+typedef struct {
     uint8_t  *pubx_key;
     size_t    pubx_key_size;
     uint8_t  *puby_key;
@@ -47,16 +50,14 @@
       0x0F, 0x34, 0x11, 0x7D, 0x97, 0x1D, 0x68, 0x64},
 };
 
-static const uint8_t initial_attestation_public_x_key[] =
-{
+static const uint8_t initial_attestation_public_x_key[] = {
     0x79, 0xEB, 0xA9, 0x0E, 0x8B, 0xF4, 0x50, 0xA6,
     0x75, 0x15, 0x76, 0xAD, 0x45, 0x99, 0xB0, 0x7A,
     0xDF, 0x93, 0x8D, 0xA3, 0xBB, 0x0B, 0xD1, 0x7D,
     0x00, 0x36, 0xED, 0x49, 0xA2, 0xD0, 0xFC, 0x3F
 };
 
-static const uint8_t initial_attestation_public_y_key[] =
-{
+static const uint8_t initial_attestation_public_y_key[] = {
     0xBF, 0xCD, 0xFA, 0x89, 0x56, 0xB5, 0x68, 0xBF,
     0xDB, 0x86, 0x73, 0xE6, 0x48, 0xD8, 0xB5, 0x8D,
     0x92, 0x99, 0x55, 0xB1, 0x4A, 0x26, 0xC3, 0x08,
@@ -84,5 +85,4 @@
                           struct q_useful_buf_c payload);
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature);
-
-
+#endif /* _PAL_ATTESTATION_CRYPTO_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.c b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.c
deleted file mode 100644
index 68c4312..0000000
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/** @file
- * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
- * SPDX-License-Identifier : Apache-2.0
- *
- * 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
- *
- *  http://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 "pal_attestation_crypto.h"
-
-uint32_t    mandatory_claims = 0;
-uint32_t    mandaroty_sw_components = 0;
-bool_t      sw_component_present = 0;
-
-int pal_encode_cose_key(struct q_useful_buf_c *cose_key,
-                               struct q_useful_buf buffer_for_cose_key,
-                               struct q_useful_buf_c x_cord, struct q_useful_buf_c y_cord)
-{
-    uint32_t                  return_value;
-    QCBORError                qcbor_result;
-    QCBOREncodeContext        cbor_encode_ctx;
-    int32_t                   cose_curve_id = P_256;
-    struct q_useful_buf_c     encoded_key_id;
-
-    /* Get the public key x and y */
-    /* Encode it into a COSE_Key structure */
-    QCBOREncode_Init(&cbor_encode_ctx, buffer_for_cose_key);
-    QCBOREncode_OpenMap(&cbor_encode_ctx);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_COMMON_KTY,
-                               COSE_KEY_TYPE_EC2);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_CRV,
-                               cose_curve_id);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_X_COORDINATE,
-                               x_cord);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_Y_COORDINATE,
-                               y_cord);
-    QCBOREncode_CloseMap(&cbor_encode_ctx);
-
-    qcbor_result = QCBOREncode_Finish(&cbor_encode_ctx, &encoded_key_id);
-    if (qcbor_result != QCBOR_SUCCESS)
-    {
-        /* Mainly means that the COSE_Key was too big for buffer_for_cose_key */
-        return_value = PAL_ATTEST_ERR_PROTECTED_HEADERS;
-        goto Done;
-    }
-
-    /* Finish up and return */
-    *cose_key = encoded_key_id;
-    return_value = PAL_ATTEST_SUCCESS;
-
-Done:
-    return return_value;
-}
-
-
-static int get_items_in_map(QCBORDecodeContext *decode_context,
-                            struct items_to_get_t *item_list)
-{
-    int                     item_index;
-    QCBORItem               item;
-    struct items_to_get_t  *item_ptr = item_list;
-
-    /* initialize the data type of all items in the list */
-    while (item_ptr->label != 0)
-    {
-        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
-        item_ptr++;
-    }
-
-    QCBORDecode_GetNext(decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_MAP)
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    for (item_index = item.val.uCount; item_index != 0; item_index--)
-    {
-        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
-        {
-            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-        }
-        if (item.uLabelType != QCBOR_TYPE_INT64)
-        {
-            continue;
-        }
-
-        item_ptr = item_list;
-        while (item_ptr->label != 0)
-        {
-            if (item.label.int64 == item_ptr->label)
-            {
-                item_ptr->item = item;
-            }
-            item_ptr++;
-        }
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int get_item_in_map(QCBORDecodeContext *decode_context,
-                           int32_t label,
-                           QCBORItem *item)
-{
-    struct items_to_get_t   item_list[2];
-
-    item_list[0].label = label;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
-    {
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-    }
-
-    *item = item_list[0].item;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
-                                     struct q_useful_buf_c *child)
-{
-    struct items_to_get_t   item_list[3];
-
-    item_list[0].label = COSE_HEADER_PARAM_KID;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERR_CBOR_STRUCTURE;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_protected_headers(struct q_useful_buf_c protected_headers,
-                                   int32_t *alg_id)
-{
-    QCBORDecodeContext  decode_context;
-    QCBORItem           item;
-
-    QCBORDecode_Init(&decode_context, protected_headers, 0);
-
-    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (QCBORDecode_Finish(&decode_context))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    *alg_id = (int32_t)item.val.int64;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-/**
-    @brief    - This API will verify the claims
-    @param    - decode_context      : The buffer containing the challenge
-                item                : context for decoding the data items
-                completed_challenge : Buffer containing the challenge
-    @return   - error status
-**/
-static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
-                                   struct q_useful_buf_c completed_challenge)
-{
-    int i, count = 0;
-    int status = PAL_ATTEST_SUCCESS;
-
-    /* Parse each claim and validate their data type */
-    while (status == PAL_ATTEST_SUCCESS)
-    {
-        status = QCBORDecode_GetNext(decode_context, &item);
-        if (status != PAL_ATTEST_SUCCESS)
-            break;
-
-        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
-        if (item.uLabelType == QCBOR_TYPE_INT64)
-        {
-            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
-            {
-                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
-                {
-                    /* Given challenge vs challenge in token */
-                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
-                        return PAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
-                }
-                else
-                    return PAL_ATTEST_TOKEN_NOT_SUPPORTED;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
-            {
-                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
-            {
-                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
-            {
-                if (item.uDataType != QCBOR_TYPE_INT64)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
-            {
-                if (item.uDataType != QCBOR_TYPE_ARRAY)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-                sw_component_present = 1;
-                status = QCBORDecode_GetNext(decode_context, &item);
-                if (status != PAL_ATTEST_SUCCESS)
-                    continue;
-
-                count = item.val.uCount;
-                for (i = 0; i <= count; i++)
-                {
-                    mandaroty_sw_components |= 1 << item.label.int64;
-
-                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
-                    {
-                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_INT64)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-
-                    if (i < count)
-                    {
-                        status = QCBORDecode_GetNext(decode_context, &item);
-                        if (status != PAL_ATTEST_SUCCESS)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                }
-
-            }
-        }
-        else
-        {
-            /* ToDo: Add other claim types */
-        }
-    }
-
-    if (status == QCBOR_ERR_HIT_END)
-        return PAL_ATTEST_SUCCESS;
-    else
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-}
-
-/**
-    @brief    - This API will verify the attestation token
-    @param    - challenge       : The buffer containing the challenge
-                challenge_size  : Size of the challenge buffer
-                token           : The buffer containing the attestation token
-                token_size      : Size of the token buffer
-    @return   - error status
-**/
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size)
-{
-    int32_t             status = PAL_ATTEST_SUCCESS;
-    int32_t             cose_algorithm_id;
-    QCBORItem           item;
-    QCBORDecodeContext  decode_context;
-    struct q_useful_buf_c completed_challenge;
-    struct q_useful_buf_c completed_token;
-    struct q_useful_buf_c payload;
-    struct q_useful_buf_c signature;
-    struct q_useful_buf_c protected_headers;
-    struct q_useful_buf_c kid;
-    struct q_useful_buf_c token_hash;
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_x_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_y_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
-
-    kid.ptr = buffer_for_encoded_key.ptr;
-
-    memcpy(buf_to_hold_x_coord.ptr, (const void *)attest_key.pubx_key, attest_key.pubx_key_size);
-    memcpy(buf_to_hold_y_coord.ptr, (const void *)attest_key.puby_key, attest_key.puby_key_size);
-
-    /* Update size */
-    buf_to_hold_x_coord.len = attest_key.pubx_key_size;
-    buf_to_hold_y_coord.len = attest_key.puby_key_size;
-
-    /* Construct the token buffer for validation */
-    completed_token.ptr = token;
-    completed_token.len = token_size;
-
-    /* Construct the challenge buffer for validation */
-    completed_challenge.ptr = challenge;
-    completed_challenge.len = challenge_size;
-
-/*
-    -------------------------
-    |  CBOR Array Type      |
-    -------------------------
-    |  Protected Headers    |
-    -------------------------
-    |  Unprotected Headers  |
-    -------------------------
-    |  Payload              |
-    -------------------------
-    |  Signature            |
-    -------------------------
-*/
-
-    /* Initialize the decorder */
-    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
-
-    /* Get the Header */
-    QCBORDecode_GetNext(&decode_context, &item);
-
-    /* Check the CBOR Array type. Check if the count is 4.
-     * Only COSE_SIGN1 is supported now.
-     */
-    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
-       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Get the next headers */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    protected_headers = item.val.string;
-
-    /* Parse the protected headers and check the data type and value*/
-    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Parse the unprotected headers and check the data type and value */
-    status = parse_unprotected_headers(&decode_context, &kid);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Get the payload */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    payload = item.val.string;
-
-    /* Get the digital signature */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    signature = item.val.string;
-
-    /* Compute the hash from the token */
-    status = pal_compute_hash(cose_algorithm_id, buffer_for_token_hash, &token_hash,
-                              protected_headers, payload);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Verify the signature */
-    status = pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Initialize the Decoder and validate the payload format */
-    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
-    status = QCBORDecode_GetNext(&decode_context, &item);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if (item.uDataType != QCBOR_TYPE_MAP)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Parse the payload and check the data type of each claim */
-    status = parse_claims(&decode_context, item, completed_challenge);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
-    {
-        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
-            return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
-    {
-        return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.h
index df24c89..fae5434 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_eat.h
@@ -15,43 +15,17 @@
  * limitations under the License.
 **/
 
+#ifndef _PAL_ATTESTATION_EAT_H_
+#define _PAL_ATTESTATION_EAT_H_
+
 #include "qcbor.h"
 #include "pal_common.h"
-#include "psa/crypto.h"
 
 #define PAL_ATTEST_MIN_ERROR              30
 
-/* NIST P-256 also known as secp256r1 */
-#define P_256                             1
-
-#define COSE_HEADER_PARAM_ALG             1
-#define COSE_HEADER_PARAM_KID             4
-
-#define COSE_KEY_COMMON_KTY               1
-#define COSE_KEY_TYPE_EC2                 2
-#define COSE_KEY_PARAM_CRV               -1
-#define COSE_KEY_PARAM_X_COORDINATE      -2
-#define COSE_KEY_PARAM_Y_COORDINATE      -3
 #define COSE_ALGORITHM_ES256             -7
 #define COSE_ALG_SHA256_PROPRIETARY      -72000
 
-/**
- * The size of X and Y coordinate in 2 parameter style EC public
- * key. Format is as defined in [COSE (RFC 8152)]
- * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
- * Cryptography](http://www.secg.org/sec1-v2.pdf).
- *
- * This size is well-known and documented in public standards.
- */
-#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
-#define T_COSE_CRYPTO_SHA256_SIZE         32
-
-#define MAX_ENCODED_COSE_KEY_SIZE \
-    1 + /* 1 byte to encode map */ \
-    2 + /* 2 bytes to encode key type */ \
-    2 + /* 2 bytes to encode curve */ \
-    2 * /* the X and Y coordinates at 32 bytes each */ \
-        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2)
 #define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
 
 #define COSE_SIG_CONTEXT_STRING_SIGNATURE1 "Signature1"
@@ -78,71 +52,9 @@
     sizeof(COSE_SIG_CONTEXT_STRING_SIGNATURE1) + /* "Signature1" */ \
     2 + /* Overhead for encoding string */ \
     T_COSE_SIGN1_MAX_PROT_HEADER + /* entire protected headers */ \
-    3 * ( /* 3 NULL bstrs for fields not used */ \
+    3 * (/* 3 NULL bstrs for fields not used */ \
         1 /* size of a NULL bstr */  \
     )
-
-/*
- CBOR Label for proprietary header indicating short-circuit
- signing was used. Just a random number in the proprietary
- label space */
-#define T_COSE_SHORT_CIRCUIT_LABEL              (-8675309)
-
-#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
-#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
-#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
-#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
-#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
-#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
-#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
-#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
-#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
-#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
-#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
-#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
-
-#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
-
-#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
-#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
-#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
-#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
-
-#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
-
-#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
-
-#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
-                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-
 #define NULL_USEFUL_BUF_C  NULLUsefulBufC
 
 enum attestation_error_code {
@@ -161,13 +73,8 @@
     PAL_ATTEST_ERR_KEY_FAIL,
     PAL_ATTEST_ERR_SIGNATURE_FAIL,
     PAL_ATTEST_ERR_CBOR_STRUCTURE,
+    PAL_ATTEST_ERR_SMALL_BUFFER,
     PAL_ATTEST_ERROR,
 };
 
-struct items_to_get_t {
-    int64_t label;
-    QCBORItem item;
-};
-
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size);
+#endif /* _PAL_ATTESTATION_EAT_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_intf.h
index 12f6ee9..3ab7ebb 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/initial_attestation/pal_attestation_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_INITIAL_ATTESTATION_H_
-#define _PAL_INITIAL_ATTESTATION_H_
+#ifndef _PAL_ATTESTATION_INTF_H_
+#define _PAL_ATTESTATION_INTF_H_
 
 #include "pal_attestation_crypto.h"
 
@@ -24,7 +24,9 @@
     PAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     PAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     PAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    PAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    PAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
 int32_t pal_attestation_function(int type, va_list valist);
-#endif /* _PAL_INITIAL_ATTESTATION_H_ */
+#endif /* _PAL_ATTESTATION_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/target.cmake b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/target.cmake
index 7c6628a..756a0b4 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/target.cmake
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/target.cmake
@@ -71,7 +71,6 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	list(APPEND PAL_SRC_C_NSPE
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_intf.c
-		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_eat.c
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_crypto.c
 	)
 endif()
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/common/pal_config.h
index 2871339..61db8d8 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/common/pal_config.h
@@ -43,6 +43,9 @@
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.c b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.c
index 2da03fa..04fe5ef 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.c
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.c
@@ -19,29 +19,13 @@
 
 static uint32_t         public_key_registered;
 static psa_key_handle_t public_key_handle;
+
 static inline struct q_useful_buf_c useful_buf_head(struct q_useful_buf_c buf,
                                                   size_t amount)
 {
     return UsefulBuf_Head(buf, amount);
 }
 
-static psa_ecc_curve_t attest_map_elliptic_curve_type(int32_t cose_curve)
-{
-    psa_ecc_curve_t psa_curve;
-
-    /*FixMe: Mapping is not complete, missing ones: P384, P521, ED25519, ED448 */
-    switch (cose_curve)
-    {
-    case P_256:
-        psa_curve = PSA_ECC_CURVE_SECP256R1;
-        break;
-    default:
-        psa_curve = USHRT_MAX;
-    }
-
-    return psa_curve;
-}
-
 static psa_algorithm_t cose_hash_alg_id_to_psa(int32_t cose_hash_alg_id)
 {
     psa_algorithm_t status;
@@ -137,6 +121,15 @@
     return status;
 }
 
+/**
+    @brief           - Computes hash for the requested data
+    @param           - cose_alg_id       : Algorithm ID
+                     - buffer_for_hash   : Temp buffer for calculating hash
+                     - hash              : Pointer to store the hash
+                     - protected_headers : Buffer containing protected data
+                     - payload           : payload data
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_compute_hash(int32_t cose_alg_id, struct q_useful_buf buffer_for_hash,
                           struct q_useful_buf_c *hash, struct q_useful_buf_c protected_headers,
                           struct q_useful_buf_c payload)
@@ -203,22 +196,56 @@
     return status;
 }
 
+static int32_t pal_attest_get_public_key(uint8_t *public_key_buff, size_t public_key_buf_size,
+                                       size_t *public_key_len, psa_ecc_curve_t *elliptic_curve_type)
+{
+    int32_t     status = PAL_ATTEST_ERROR;
+
+#ifdef PLATFORM_OVERRIDE_ATTEST_PK
+    if (public_key_buf_size < (attest_key.pubx_key_size + attest_key.puby_key_size + 1))
+        return PAL_ATTEST_ERR_SMALL_BUFFER;
+
+    *public_key_len = (attest_key.pubx_key_size + attest_key.puby_key_size + 1);
+    *elliptic_curve_type = PSA_ECC_CURVE_SECP256R1;
+    memcpy(public_key_buff, (void *)&attest_public_key, *public_key_len);
+    status = PSA_SUCCESS;
+#else
+    status = tfm_initial_attest_get_public_key(public_key_buff,
+                                               public_key_buf_size,
+                                               public_key_len,
+                                               elliptic_curve_type);
+#endif
+
+    return status;
+}
+
 static uint32_t pal_import_attest_key(psa_algorithm_t key_alg)
 {
     psa_status_t     status             = PAL_ATTEST_ERROR;
     psa_key_usage_t  usage              = PSA_KEY_USAGE_VERIFY;
-    psa_ecc_curve_t  psa_curve          = attest_map_elliptic_curve_type(P_256);
-    psa_key_type_t   attest_key_type    = PSA_KEY_TYPE_ECC_PUBLIC_KEY(psa_curve);
-    size_t           public_key_size    = attest_key.pubx_key_size + attest_key.puby_key_size;
+    psa_ecc_curve_t  ecc_curve;
+    psa_key_type_t   attest_key_type;
+    size_t           public_key_size;
+    uint8_t          public_key_buff[ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH] = {0};
 
 #if defined(CRYPTO_VERSION_BETA1) || defined(CRYPTO_VERSION_BETA2)
     psa_key_policy_t policy;
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Setup the key policy for public key */
         policy = psa_key_policy_init();
         psa_key_policy_set_usage(&policy, usage, key_alg);
@@ -234,8 +261,8 @@
         /* Import the public key */
         status = psa_import_key(public_key_handle,
                                 attest_key_type,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1);
+                                public_key_buff,
+                                public_key_size);
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -247,21 +274,30 @@
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Set the attributes for the public key */
         psa_set_key_type(&attributes, attest_key_type);
-        psa_set_key_bits(&attributes, public_key_size + 1);
+        psa_set_key_bits(&attributes, public_key_size);
         psa_set_key_usage_flags(&attributes, usage);
         psa_set_key_algorithm(&attributes, key_alg);
 
         /* Import the public key */
         status = psa_import_key(&attributes,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1,
+                                public_key_buff,
+                                public_key_size,
                                 &public_key_handle);
-
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -288,6 +324,13 @@
     return PAL_ATTEST_SUCCESS;
 }
 
+/**
+    @brief           - Verify the signature using the public key
+    @param           - cose_algorithm_id : Algorithm ID
+                     - token_hash        : Data that needs to be verified
+                     - signature         : Signature to be verified against
+    @return          - SUCCESS/ERROR CODE
+**/
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id,
                                    struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature)
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.h
index bd47990..559a24c 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_crypto.h
@@ -15,12 +15,15 @@
  * limitations under the License.
 **/
 
-#include "pal_common.h"
+#ifndef _PAL_ATTESTATION_CRYPTO_H_
+#define _PAL_ATTESTATION_CRYPTO_H_
+
 #include "pal_attestation_eat.h"
 
-#define ATTEST_PUBLIC_KEY_SLOT            4
+#define ATTEST_PUBLIC_KEY_SLOT                  4
+#define ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH   (1 + 2 * PSA_BITS_TO_BYTES(256))
 
-typedef struct{
+typedef struct {
     uint8_t  *pubx_key;
     size_t    pubx_key_size;
     uint8_t  *puby_key;
@@ -47,16 +50,14 @@
       0x0F, 0x34, 0x11, 0x7D, 0x97, 0x1D, 0x68, 0x64},
 };
 
-static const uint8_t initial_attestation_public_x_key[] =
-{
+static const uint8_t initial_attestation_public_x_key[] = {
     0x79, 0xEB, 0xA9, 0x0E, 0x8B, 0xF4, 0x50, 0xA6,
     0x75, 0x15, 0x76, 0xAD, 0x45, 0x99, 0xB0, 0x7A,
     0xDF, 0x93, 0x8D, 0xA3, 0xBB, 0x0B, 0xD1, 0x7D,
     0x00, 0x36, 0xED, 0x49, 0xA2, 0xD0, 0xFC, 0x3F
 };
 
-static const uint8_t initial_attestation_public_y_key[] =
-{
+static const uint8_t initial_attestation_public_y_key[] = {
     0xBF, 0xCD, 0xFA, 0x89, 0x56, 0xB5, 0x68, 0xBF,
     0xDB, 0x86, 0x73, 0xE6, 0x48, 0xD8, 0xB5, 0x8D,
     0x92, 0x99, 0x55, 0xB1, 0x4A, 0x26, 0xC3, 0x08,
@@ -84,5 +85,4 @@
                           struct q_useful_buf_c payload);
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature);
-
-
+#endif /* _PAL_ATTESTATION_CRYPTO_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.c b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.c
deleted file mode 100644
index 68c4312..0000000
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/** @file
- * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
- * SPDX-License-Identifier : Apache-2.0
- *
- * 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
- *
- *  http://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 "pal_attestation_crypto.h"
-
-uint32_t    mandatory_claims = 0;
-uint32_t    mandaroty_sw_components = 0;
-bool_t      sw_component_present = 0;
-
-int pal_encode_cose_key(struct q_useful_buf_c *cose_key,
-                               struct q_useful_buf buffer_for_cose_key,
-                               struct q_useful_buf_c x_cord, struct q_useful_buf_c y_cord)
-{
-    uint32_t                  return_value;
-    QCBORError                qcbor_result;
-    QCBOREncodeContext        cbor_encode_ctx;
-    int32_t                   cose_curve_id = P_256;
-    struct q_useful_buf_c     encoded_key_id;
-
-    /* Get the public key x and y */
-    /* Encode it into a COSE_Key structure */
-    QCBOREncode_Init(&cbor_encode_ctx, buffer_for_cose_key);
-    QCBOREncode_OpenMap(&cbor_encode_ctx);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_COMMON_KTY,
-                               COSE_KEY_TYPE_EC2);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_CRV,
-                               cose_curve_id);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_X_COORDINATE,
-                               x_cord);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_Y_COORDINATE,
-                               y_cord);
-    QCBOREncode_CloseMap(&cbor_encode_ctx);
-
-    qcbor_result = QCBOREncode_Finish(&cbor_encode_ctx, &encoded_key_id);
-    if (qcbor_result != QCBOR_SUCCESS)
-    {
-        /* Mainly means that the COSE_Key was too big for buffer_for_cose_key */
-        return_value = PAL_ATTEST_ERR_PROTECTED_HEADERS;
-        goto Done;
-    }
-
-    /* Finish up and return */
-    *cose_key = encoded_key_id;
-    return_value = PAL_ATTEST_SUCCESS;
-
-Done:
-    return return_value;
-}
-
-
-static int get_items_in_map(QCBORDecodeContext *decode_context,
-                            struct items_to_get_t *item_list)
-{
-    int                     item_index;
-    QCBORItem               item;
-    struct items_to_get_t  *item_ptr = item_list;
-
-    /* initialize the data type of all items in the list */
-    while (item_ptr->label != 0)
-    {
-        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
-        item_ptr++;
-    }
-
-    QCBORDecode_GetNext(decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_MAP)
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    for (item_index = item.val.uCount; item_index != 0; item_index--)
-    {
-        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
-        {
-            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-        }
-        if (item.uLabelType != QCBOR_TYPE_INT64)
-        {
-            continue;
-        }
-
-        item_ptr = item_list;
-        while (item_ptr->label != 0)
-        {
-            if (item.label.int64 == item_ptr->label)
-            {
-                item_ptr->item = item;
-            }
-            item_ptr++;
-        }
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int get_item_in_map(QCBORDecodeContext *decode_context,
-                           int32_t label,
-                           QCBORItem *item)
-{
-    struct items_to_get_t   item_list[2];
-
-    item_list[0].label = label;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
-    {
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-    }
-
-    *item = item_list[0].item;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
-                                     struct q_useful_buf_c *child)
-{
-    struct items_to_get_t   item_list[3];
-
-    item_list[0].label = COSE_HEADER_PARAM_KID;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERR_CBOR_STRUCTURE;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_protected_headers(struct q_useful_buf_c protected_headers,
-                                   int32_t *alg_id)
-{
-    QCBORDecodeContext  decode_context;
-    QCBORItem           item;
-
-    QCBORDecode_Init(&decode_context, protected_headers, 0);
-
-    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (QCBORDecode_Finish(&decode_context))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    *alg_id = (int32_t)item.val.int64;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-/**
-    @brief    - This API will verify the claims
-    @param    - decode_context      : The buffer containing the challenge
-                item                : context for decoding the data items
-                completed_challenge : Buffer containing the challenge
-    @return   - error status
-**/
-static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
-                                   struct q_useful_buf_c completed_challenge)
-{
-    int i, count = 0;
-    int status = PAL_ATTEST_SUCCESS;
-
-    /* Parse each claim and validate their data type */
-    while (status == PAL_ATTEST_SUCCESS)
-    {
-        status = QCBORDecode_GetNext(decode_context, &item);
-        if (status != PAL_ATTEST_SUCCESS)
-            break;
-
-        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
-        if (item.uLabelType == QCBOR_TYPE_INT64)
-        {
-            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
-            {
-                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
-                {
-                    /* Given challenge vs challenge in token */
-                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
-                        return PAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
-                }
-                else
-                    return PAL_ATTEST_TOKEN_NOT_SUPPORTED;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
-            {
-                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
-            {
-                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
-            {
-                if (item.uDataType != QCBOR_TYPE_INT64)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
-            {
-                if (item.uDataType != QCBOR_TYPE_ARRAY)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-                sw_component_present = 1;
-                status = QCBORDecode_GetNext(decode_context, &item);
-                if (status != PAL_ATTEST_SUCCESS)
-                    continue;
-
-                count = item.val.uCount;
-                for (i = 0; i <= count; i++)
-                {
-                    mandaroty_sw_components |= 1 << item.label.int64;
-
-                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
-                    {
-                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_INT64)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-
-                    if (i < count)
-                    {
-                        status = QCBORDecode_GetNext(decode_context, &item);
-                        if (status != PAL_ATTEST_SUCCESS)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                }
-
-            }
-        }
-        else
-        {
-            /* ToDo: Add other claim types */
-        }
-    }
-
-    if (status == QCBOR_ERR_HIT_END)
-        return PAL_ATTEST_SUCCESS;
-    else
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-}
-
-/**
-    @brief    - This API will verify the attestation token
-    @param    - challenge       : The buffer containing the challenge
-                challenge_size  : Size of the challenge buffer
-                token           : The buffer containing the attestation token
-                token_size      : Size of the token buffer
-    @return   - error status
-**/
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size)
-{
-    int32_t             status = PAL_ATTEST_SUCCESS;
-    int32_t             cose_algorithm_id;
-    QCBORItem           item;
-    QCBORDecodeContext  decode_context;
-    struct q_useful_buf_c completed_challenge;
-    struct q_useful_buf_c completed_token;
-    struct q_useful_buf_c payload;
-    struct q_useful_buf_c signature;
-    struct q_useful_buf_c protected_headers;
-    struct q_useful_buf_c kid;
-    struct q_useful_buf_c token_hash;
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_x_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_y_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
-
-    kid.ptr = buffer_for_encoded_key.ptr;
-
-    memcpy(buf_to_hold_x_coord.ptr, (const void *)attest_key.pubx_key, attest_key.pubx_key_size);
-    memcpy(buf_to_hold_y_coord.ptr, (const void *)attest_key.puby_key, attest_key.puby_key_size);
-
-    /* Update size */
-    buf_to_hold_x_coord.len = attest_key.pubx_key_size;
-    buf_to_hold_y_coord.len = attest_key.puby_key_size;
-
-    /* Construct the token buffer for validation */
-    completed_token.ptr = token;
-    completed_token.len = token_size;
-
-    /* Construct the challenge buffer for validation */
-    completed_challenge.ptr = challenge;
-    completed_challenge.len = challenge_size;
-
-/*
-    -------------------------
-    |  CBOR Array Type      |
-    -------------------------
-    |  Protected Headers    |
-    -------------------------
-    |  Unprotected Headers  |
-    -------------------------
-    |  Payload              |
-    -------------------------
-    |  Signature            |
-    -------------------------
-*/
-
-    /* Initialize the decorder */
-    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
-
-    /* Get the Header */
-    QCBORDecode_GetNext(&decode_context, &item);
-
-    /* Check the CBOR Array type. Check if the count is 4.
-     * Only COSE_SIGN1 is supported now.
-     */
-    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
-       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Get the next headers */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    protected_headers = item.val.string;
-
-    /* Parse the protected headers and check the data type and value*/
-    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Parse the unprotected headers and check the data type and value */
-    status = parse_unprotected_headers(&decode_context, &kid);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Get the payload */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    payload = item.val.string;
-
-    /* Get the digital signature */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    signature = item.val.string;
-
-    /* Compute the hash from the token */
-    status = pal_compute_hash(cose_algorithm_id, buffer_for_token_hash, &token_hash,
-                              protected_headers, payload);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Verify the signature */
-    status = pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Initialize the Decoder and validate the payload format */
-    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
-    status = QCBORDecode_GetNext(&decode_context, &item);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if (item.uDataType != QCBOR_TYPE_MAP)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Parse the payload and check the data type of each claim */
-    status = parse_claims(&decode_context, item, completed_challenge);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
-    {
-        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
-            return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
-    {
-        return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.h
index df24c89..fae5434 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_eat.h
@@ -15,43 +15,17 @@
  * limitations under the License.
 **/
 
+#ifndef _PAL_ATTESTATION_EAT_H_
+#define _PAL_ATTESTATION_EAT_H_
+
 #include "qcbor.h"
 #include "pal_common.h"
-#include "psa/crypto.h"
 
 #define PAL_ATTEST_MIN_ERROR              30
 
-/* NIST P-256 also known as secp256r1 */
-#define P_256                             1
-
-#define COSE_HEADER_PARAM_ALG             1
-#define COSE_HEADER_PARAM_KID             4
-
-#define COSE_KEY_COMMON_KTY               1
-#define COSE_KEY_TYPE_EC2                 2
-#define COSE_KEY_PARAM_CRV               -1
-#define COSE_KEY_PARAM_X_COORDINATE      -2
-#define COSE_KEY_PARAM_Y_COORDINATE      -3
 #define COSE_ALGORITHM_ES256             -7
 #define COSE_ALG_SHA256_PROPRIETARY      -72000
 
-/**
- * The size of X and Y coordinate in 2 parameter style EC public
- * key. Format is as defined in [COSE (RFC 8152)]
- * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
- * Cryptography](http://www.secg.org/sec1-v2.pdf).
- *
- * This size is well-known and documented in public standards.
- */
-#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
-#define T_COSE_CRYPTO_SHA256_SIZE         32
-
-#define MAX_ENCODED_COSE_KEY_SIZE \
-    1 + /* 1 byte to encode map */ \
-    2 + /* 2 bytes to encode key type */ \
-    2 + /* 2 bytes to encode curve */ \
-    2 * /* the X and Y coordinates at 32 bytes each */ \
-        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2)
 #define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
 
 #define COSE_SIG_CONTEXT_STRING_SIGNATURE1 "Signature1"
@@ -78,71 +52,9 @@
     sizeof(COSE_SIG_CONTEXT_STRING_SIGNATURE1) + /* "Signature1" */ \
     2 + /* Overhead for encoding string */ \
     T_COSE_SIGN1_MAX_PROT_HEADER + /* entire protected headers */ \
-    3 * ( /* 3 NULL bstrs for fields not used */ \
+    3 * (/* 3 NULL bstrs for fields not used */ \
         1 /* size of a NULL bstr */  \
     )
-
-/*
- CBOR Label for proprietary header indicating short-circuit
- signing was used. Just a random number in the proprietary
- label space */
-#define T_COSE_SHORT_CIRCUIT_LABEL              (-8675309)
-
-#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
-#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
-#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
-#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
-#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
-#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
-#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
-#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
-#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
-#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
-#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
-#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
-
-#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
-
-#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
-#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
-#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
-#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
-
-#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
-
-#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
-
-#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
-                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-
 #define NULL_USEFUL_BUF_C  NULLUsefulBufC
 
 enum attestation_error_code {
@@ -161,13 +73,8 @@
     PAL_ATTEST_ERR_KEY_FAIL,
     PAL_ATTEST_ERR_SIGNATURE_FAIL,
     PAL_ATTEST_ERR_CBOR_STRUCTURE,
+    PAL_ATTEST_ERR_SMALL_BUFFER,
     PAL_ATTEST_ERROR,
 };
 
-struct items_to_get_t {
-    int64_t label;
-    QCBORItem item;
-};
-
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size);
+#endif /* _PAL_ATTESTATION_EAT_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_intf.h
index 12f6ee9..3ab7ebb 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_intf.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/initial_attestation/pal_attestation_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_INITIAL_ATTESTATION_H_
-#define _PAL_INITIAL_ATTESTATION_H_
+#ifndef _PAL_ATTESTATION_INTF_H_
+#define _PAL_ATTESTATION_INTF_H_
 
 #include "pal_attestation_crypto.h"
 
@@ -24,7 +24,9 @@
     PAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     PAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     PAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    PAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    PAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
 int32_t pal_attestation_function(int type, va_list valist);
-#endif /* _PAL_INITIAL_ATTESTATION_H_ */
+#endif /* _PAL_ATTESTATION_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/target.cmake b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/target.cmake
index 7c6628a..756a0b4 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/target.cmake
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/target.cmake
@@ -71,7 +71,6 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	list(APPEND PAL_SRC_C_NSPE
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_intf.c
-		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_eat.c
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_crypto.c
 	)
 endif()
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/common/pal_config.h b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/common/pal_config.h
index 2871339..61db8d8 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/common/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/common/pal_config.h
@@ -43,6 +43,9 @@
 /* Version of crypto spec used in attestation */
 #define CRYPTO_VERSION_BETA2
 
+/* Use hardcoded public key */
+//#define PLATFORM_OVERRIDE_ATTEST_PK
+
 /*
  * Include of PSA defined Header files
  */
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h
index 486f793..671dfa0 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/crypto/pal_crypto_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_CRYPTO_H_
-#define _PAL_CRYPTO_H_
+#ifndef _PAL_CRYPTO_INTF_H_
+#define _PAL_CRYPTO_INTF_H_
 
 #include "pal_common.h"
 
@@ -100,4 +100,4 @@
 };
 
 int32_t pal_crypto_function(int type, va_list valist);
-#endif /* _PAL_CRYPTO_H_ */
+#endif /* _PAL_CRYPTO_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c
index 2da03fa..488c96b 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.c
@@ -19,29 +19,13 @@
 
 static uint32_t         public_key_registered;
 static psa_key_handle_t public_key_handle;
+
 static inline struct q_useful_buf_c useful_buf_head(struct q_useful_buf_c buf,
                                                   size_t amount)
 {
     return UsefulBuf_Head(buf, amount);
 }
 
-static psa_ecc_curve_t attest_map_elliptic_curve_type(int32_t cose_curve)
-{
-    psa_ecc_curve_t psa_curve;
-
-    /*FixMe: Mapping is not complete, missing ones: P384, P521, ED25519, ED448 */
-    switch (cose_curve)
-    {
-    case P_256:
-        psa_curve = PSA_ECC_CURVE_SECP256R1;
-        break;
-    default:
-        psa_curve = USHRT_MAX;
-    }
-
-    return psa_curve;
-}
-
 static psa_algorithm_t cose_hash_alg_id_to_psa(int32_t cose_hash_alg_id)
 {
     psa_algorithm_t status;
@@ -203,22 +187,56 @@
     return status;
 }
 
+static int32_t pal_attest_get_public_key(uint8_t *public_key_buff, size_t public_key_buf_size,
+                                       size_t *public_key_len, psa_ecc_curve_t *elliptic_curve_type)
+{
+    int32_t     status = PAL_ATTEST_ERROR;
+
+#ifdef PLATFORM_OVERRIDE_ATTEST_PK
+    if (public_key_buf_size < (attest_key.pubx_key_size + attest_key.puby_key_size + 1))
+        return PAL_ATTEST_ERR_SMALL_BUFFER;
+
+    *public_key_len = (attest_key.pubx_key_size + attest_key.puby_key_size + 1);
+    *elliptic_curve_type = PSA_ECC_CURVE_SECP256R1;
+    memcpy(public_key_buff, (void *)&attest_public_key, *public_key_len);
+    status = PSA_SUCCESS;
+#else
+    status = tfm_initial_attest_get_public_key(public_key_buff,
+                                               public_key_buf_size,
+                                               public_key_len,
+                                               elliptic_curve_type);
+#endif
+
+    return status;
+}
+
 static uint32_t pal_import_attest_key(psa_algorithm_t key_alg)
 {
     psa_status_t     status             = PAL_ATTEST_ERROR;
     psa_key_usage_t  usage              = PSA_KEY_USAGE_VERIFY;
-    psa_ecc_curve_t  psa_curve          = attest_map_elliptic_curve_type(P_256);
-    psa_key_type_t   attest_key_type    = PSA_KEY_TYPE_ECC_PUBLIC_KEY(psa_curve);
-    size_t           public_key_size    = attest_key.pubx_key_size + attest_key.puby_key_size;
+    psa_ecc_curve_t  ecc_curve;
+    psa_key_type_t   attest_key_type;
+    size_t           public_key_size;
+    uint8_t          public_key_buff[ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH] = {0};
 
 #if defined(CRYPTO_VERSION_BETA1) || defined(CRYPTO_VERSION_BETA2)
     psa_key_policy_t policy;
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Setup the key policy for public key */
         policy = psa_key_policy_init();
         psa_key_policy_set_usage(&policy, usage, key_alg);
@@ -234,8 +252,8 @@
         /* Import the public key */
         status = psa_import_key(public_key_handle,
                                 attest_key_type,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1);
+                                public_key_buff,
+                                public_key_size);
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
@@ -247,21 +265,30 @@
 
     if (!public_key_registered)
     {
-        if (psa_curve == USHRT_MAX)
+        status = pal_attest_get_public_key(public_key_buff,
+                                           sizeof(public_key_buff),
+                                           &public_key_size,
+                                           &ecc_curve);
+        if (status != PSA_SUCCESS)
+            return PAL_ATTEST_ERR_KEY_FAIL;
+
+        if (ecc_curve == USHRT_MAX)
             return PAL_ATTEST_ERROR;
 
+        /* Set key type for public key */
+        attest_key_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(ecc_curve);
+
         /* Set the attributes for the public key */
         psa_set_key_type(&attributes, attest_key_type);
-        psa_set_key_bits(&attributes, public_key_size + 1);
+        psa_set_key_bits(&attributes, public_key_size);
         psa_set_key_usage_flags(&attributes, usage);
         psa_set_key_algorithm(&attributes, key_alg);
 
         /* Import the public key */
         status = psa_import_key(&attributes,
-                               (const uint8_t *)&attest_public_key,
-                                public_key_size + 1,
+                                public_key_buff,
+                                public_key_size,
                                 &public_key_handle);
-
         if (status != PSA_SUCCESS)
             return PAL_ATTEST_ERR_KEY_FAIL;
 
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h
index bd47990..559a24c 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_crypto.h
@@ -15,12 +15,15 @@
  * limitations under the License.
 **/
 
-#include "pal_common.h"
+#ifndef _PAL_ATTESTATION_CRYPTO_H_
+#define _PAL_ATTESTATION_CRYPTO_H_
+
 #include "pal_attestation_eat.h"
 
-#define ATTEST_PUBLIC_KEY_SLOT            4
+#define ATTEST_PUBLIC_KEY_SLOT                  4
+#define ECC_CURVE_SECP256R1_PULBIC_KEY_LENGTH   (1 + 2 * PSA_BITS_TO_BYTES(256))
 
-typedef struct{
+typedef struct {
     uint8_t  *pubx_key;
     size_t    pubx_key_size;
     uint8_t  *puby_key;
@@ -47,16 +50,14 @@
       0x0F, 0x34, 0x11, 0x7D, 0x97, 0x1D, 0x68, 0x64},
 };
 
-static const uint8_t initial_attestation_public_x_key[] =
-{
+static const uint8_t initial_attestation_public_x_key[] = {
     0x79, 0xEB, 0xA9, 0x0E, 0x8B, 0xF4, 0x50, 0xA6,
     0x75, 0x15, 0x76, 0xAD, 0x45, 0x99, 0xB0, 0x7A,
     0xDF, 0x93, 0x8D, 0xA3, 0xBB, 0x0B, 0xD1, 0x7D,
     0x00, 0x36, 0xED, 0x49, 0xA2, 0xD0, 0xFC, 0x3F
 };
 
-static const uint8_t initial_attestation_public_y_key[] =
-{
+static const uint8_t initial_attestation_public_y_key[] = {
     0xBF, 0xCD, 0xFA, 0x89, 0x56, 0xB5, 0x68, 0xBF,
     0xDB, 0x86, 0x73, 0xE6, 0x48, 0xD8, 0xB5, 0x8D,
     0x92, 0x99, 0x55, 0xB1, 0x4A, 0x26, 0xC3, 0x08,
@@ -84,5 +85,4 @@
                           struct q_useful_buf_c payload);
 uint32_t pal_crypto_pub_key_verify(int32_t cose_algorithm_id, struct q_useful_buf_c token_hash,
                                    struct q_useful_buf_c signature);
-
-
+#endif /* _PAL_ATTESTATION_CRYPTO_H_ */
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.c b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.c
deleted file mode 100644
index 68c4312..0000000
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/** @file
- * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
- * SPDX-License-Identifier : Apache-2.0
- *
- * 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
- *
- *  http://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 "pal_attestation_crypto.h"
-
-uint32_t    mandatory_claims = 0;
-uint32_t    mandaroty_sw_components = 0;
-bool_t      sw_component_present = 0;
-
-int pal_encode_cose_key(struct q_useful_buf_c *cose_key,
-                               struct q_useful_buf buffer_for_cose_key,
-                               struct q_useful_buf_c x_cord, struct q_useful_buf_c y_cord)
-{
-    uint32_t                  return_value;
-    QCBORError                qcbor_result;
-    QCBOREncodeContext        cbor_encode_ctx;
-    int32_t                   cose_curve_id = P_256;
-    struct q_useful_buf_c     encoded_key_id;
-
-    /* Get the public key x and y */
-    /* Encode it into a COSE_Key structure */
-    QCBOREncode_Init(&cbor_encode_ctx, buffer_for_cose_key);
-    QCBOREncode_OpenMap(&cbor_encode_ctx);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_COMMON_KTY,
-                               COSE_KEY_TYPE_EC2);
-    QCBOREncode_AddInt64ToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_CRV,
-                               cose_curve_id);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_X_COORDINATE,
-                               x_cord);
-    QCBOREncode_AddBytesToMapN(&cbor_encode_ctx,
-                               COSE_KEY_PARAM_Y_COORDINATE,
-                               y_cord);
-    QCBOREncode_CloseMap(&cbor_encode_ctx);
-
-    qcbor_result = QCBOREncode_Finish(&cbor_encode_ctx, &encoded_key_id);
-    if (qcbor_result != QCBOR_SUCCESS)
-    {
-        /* Mainly means that the COSE_Key was too big for buffer_for_cose_key */
-        return_value = PAL_ATTEST_ERR_PROTECTED_HEADERS;
-        goto Done;
-    }
-
-    /* Finish up and return */
-    *cose_key = encoded_key_id;
-    return_value = PAL_ATTEST_SUCCESS;
-
-Done:
-    return return_value;
-}
-
-
-static int get_items_in_map(QCBORDecodeContext *decode_context,
-                            struct items_to_get_t *item_list)
-{
-    int                     item_index;
-    QCBORItem               item;
-    struct items_to_get_t  *item_ptr = item_list;
-
-    /* initialize the data type of all items in the list */
-    while (item_ptr->label != 0)
-    {
-        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
-        item_ptr++;
-    }
-
-    QCBORDecode_GetNext(decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_MAP)
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    for (item_index = item.val.uCount; item_index != 0; item_index--)
-    {
-        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
-        {
-            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-        }
-        if (item.uLabelType != QCBOR_TYPE_INT64)
-        {
-            continue;
-        }
-
-        item_ptr = item_list;
-        while (item_ptr->label != 0)
-        {
-            if (item.label.int64 == item_ptr->label)
-            {
-                item_ptr->item = item;
-            }
-            item_ptr++;
-        }
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int get_item_in_map(QCBORDecodeContext *decode_context,
-                           int32_t label,
-                           QCBORItem *item)
-{
-    struct items_to_get_t   item_list[2];
-
-    item_list[0].label = label;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
-    {
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-    }
-
-    *item = item_list[0].item;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
-                                     struct q_useful_buf_c *child)
-{
-    struct items_to_get_t   item_list[3];
-
-    item_list[0].label = COSE_HEADER_PARAM_KID;
-    item_list[1].label = 0;
-
-    if (get_items_in_map(decode_context, item_list))
-    {
-        return PAL_ATTEST_ERR_CBOR_STRUCTURE;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-static int parse_protected_headers(struct q_useful_buf_c protected_headers,
-                                   int32_t *alg_id)
-{
-    QCBORDecodeContext  decode_context;
-    QCBORItem           item;
-
-    QCBORDecode_Init(&decode_context, protected_headers, 0);
-
-    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if (QCBORDecode_Finish(&decode_context))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
-    {
-        return PAL_ATTEST_ERROR;
-    }
-
-    *alg_id = (int32_t)item.val.int64;
-
-    return PAL_ATTEST_SUCCESS;
-}
-
-/**
-    @brief    - This API will verify the claims
-    @param    - decode_context      : The buffer containing the challenge
-                item                : context for decoding the data items
-                completed_challenge : Buffer containing the challenge
-    @return   - error status
-**/
-static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
-                                   struct q_useful_buf_c completed_challenge)
-{
-    int i, count = 0;
-    int status = PAL_ATTEST_SUCCESS;
-
-    /* Parse each claim and validate their data type */
-    while (status == PAL_ATTEST_SUCCESS)
-    {
-        status = QCBORDecode_GetNext(decode_context, &item);
-        if (status != PAL_ATTEST_SUCCESS)
-            break;
-
-        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
-        if (item.uLabelType == QCBOR_TYPE_INT64)
-        {
-            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
-            {
-                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
-                {
-                    /* Given challenge vs challenge in token */
-                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
-                        return PAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
-                }
-                else
-                    return PAL_ATTEST_TOKEN_NOT_SUPPORTED;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
-            {
-                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
-            {
-                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
-                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
-            {
-                if (item.uDataType != QCBOR_TYPE_INT64)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-            }
-            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
-            {
-                if (item.uDataType != QCBOR_TYPE_ARRAY)
-                    return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-                sw_component_present = 1;
-                status = QCBORDecode_GetNext(decode_context, &item);
-                if (status != PAL_ATTEST_SUCCESS)
-                    continue;
-
-                count = item.val.uCount;
-                for (i = 0; i <= count; i++)
-                {
-                    mandaroty_sw_components |= 1 << item.label.int64;
-
-                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
-                    {
-                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_INT64)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
-                    {
-                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-
-                    if (i < count)
-                    {
-                        status = QCBORDecode_GetNext(decode_context, &item);
-                        if (status != PAL_ATTEST_SUCCESS)
-                            return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-                    }
-                }
-
-            }
-        }
-        else
-        {
-            /* ToDo: Add other claim types */
-        }
-    }
-
-    if (status == QCBOR_ERR_HIT_END)
-        return PAL_ATTEST_SUCCESS;
-    else
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-}
-
-/**
-    @brief    - This API will verify the attestation token
-    @param    - challenge       : The buffer containing the challenge
-                challenge_size  : Size of the challenge buffer
-                token           : The buffer containing the attestation token
-                token_size      : Size of the token buffer
-    @return   - error status
-**/
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size)
-{
-    int32_t             status = PAL_ATTEST_SUCCESS;
-    int32_t             cose_algorithm_id;
-    QCBORItem           item;
-    QCBORDecodeContext  decode_context;
-    struct q_useful_buf_c completed_challenge;
-    struct q_useful_buf_c completed_token;
-    struct q_useful_buf_c payload;
-    struct q_useful_buf_c signature;
-    struct q_useful_buf_c protected_headers;
-    struct q_useful_buf_c kid;
-    struct q_useful_buf_c token_hash;
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_x_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buf_to_hold_y_coord, T_COSE_CRYPTO_EC_P256_COORD_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
-    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
-
-    kid.ptr = buffer_for_encoded_key.ptr;
-
-    memcpy(buf_to_hold_x_coord.ptr, (const void *)attest_key.pubx_key, attest_key.pubx_key_size);
-    memcpy(buf_to_hold_y_coord.ptr, (const void *)attest_key.puby_key, attest_key.puby_key_size);
-
-    /* Update size */
-    buf_to_hold_x_coord.len = attest_key.pubx_key_size;
-    buf_to_hold_y_coord.len = attest_key.puby_key_size;
-
-    /* Construct the token buffer for validation */
-    completed_token.ptr = token;
-    completed_token.len = token_size;
-
-    /* Construct the challenge buffer for validation */
-    completed_challenge.ptr = challenge;
-    completed_challenge.len = challenge_size;
-
-/*
-    -------------------------
-    |  CBOR Array Type      |
-    -------------------------
-    |  Protected Headers    |
-    -------------------------
-    |  Unprotected Headers  |
-    -------------------------
-    |  Payload              |
-    -------------------------
-    |  Signature            |
-    -------------------------
-*/
-
-    /* Initialize the decorder */
-    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
-
-    /* Get the Header */
-    QCBORDecode_GetNext(&decode_context, &item);
-
-    /* Check the CBOR Array type. Check if the count is 4.
-     * Only COSE_SIGN1 is supported now.
-     */
-    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
-       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Get the next headers */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    protected_headers = item.val.string;
-
-    /* Parse the protected headers and check the data type and value*/
-    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Parse the unprotected headers and check the data type and value */
-    status = parse_unprotected_headers(&decode_context, &kid);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Get the payload */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    payload = item.val.string;
-
-    /* Get the digital signature */
-    QCBORDecode_GetNext(&decode_context, &item);
-    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    signature = item.val.string;
-
-    /* Compute the hash from the token */
-    status = pal_compute_hash(cose_algorithm_id, buffer_for_token_hash, &token_hash,
-                              protected_headers, payload);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Verify the signature */
-    status = pal_crypto_pub_key_verify(cose_algorithm_id, token_hash, signature);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    /* Initialize the Decoder and validate the payload format */
-    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
-    status = QCBORDecode_GetNext(&decode_context, &item);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if (item.uDataType != QCBOR_TYPE_MAP)
-        return PAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
-
-    /* Parse the payload and check the data type of each claim */
-    status = parse_claims(&decode_context, item, completed_challenge);
-    if (status != PAL_ATTEST_SUCCESS)
-        return status;
-
-    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
-    {
-        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
-            return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
-    {
-        return PAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
-    }
-
-    return PAL_ATTEST_SUCCESS;
-}
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h
index df24c89..56d624e 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_eat.h
@@ -15,43 +15,17 @@
  * limitations under the License.
 **/
 
+#ifndef _PAL_ATTESTATION_EAT_H_
+#define _PAL_ATTESTATION_EAT_H_
+
 #include "qcbor.h"
 #include "pal_common.h"
-#include "psa/crypto.h"
 
 #define PAL_ATTEST_MIN_ERROR              30
 
-/* NIST P-256 also known as secp256r1 */
-#define P_256                             1
-
-#define COSE_HEADER_PARAM_ALG             1
-#define COSE_HEADER_PARAM_KID             4
-
-#define COSE_KEY_COMMON_KTY               1
-#define COSE_KEY_TYPE_EC2                 2
-#define COSE_KEY_PARAM_CRV               -1
-#define COSE_KEY_PARAM_X_COORDINATE      -2
-#define COSE_KEY_PARAM_Y_COORDINATE      -3
 #define COSE_ALGORITHM_ES256             -7
 #define COSE_ALG_SHA256_PROPRIETARY      -72000
 
-/**
- * The size of X and Y coordinate in 2 parameter style EC public
- * key. Format is as defined in [COSE (RFC 8152)]
- * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
- * Cryptography](http://www.secg.org/sec1-v2.pdf).
- *
- * This size is well-known and documented in public standards.
- */
-#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
-#define T_COSE_CRYPTO_SHA256_SIZE         32
-
-#define MAX_ENCODED_COSE_KEY_SIZE \
-    1 + /* 1 byte to encode map */ \
-    2 + /* 2 bytes to encode key type */ \
-    2 + /* 2 bytes to encode curve */ \
-    2 * /* the X and Y coordinates at 32 bytes each */ \
-        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2)
 #define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
 
 #define COSE_SIG_CONTEXT_STRING_SIGNATURE1 "Signature1"
@@ -81,68 +55,6 @@
     3 * ( /* 3 NULL bstrs for fields not used */ \
         1 /* size of a NULL bstr */  \
     )
-
-/*
- CBOR Label for proprietary header indicating short-circuit
- signing was used. Just a random number in the proprietary
- label space */
-#define T_COSE_SHORT_CIRCUIT_LABEL              (-8675309)
-
-#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
-#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
-#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
-#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
-#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
-#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
-#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
-#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
-#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
-#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
-#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
-#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
-
-#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
-
-#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
-#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
-#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
-#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
-#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
-
-#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
-
-#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
-                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
-                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
-
-#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
-                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
-
 #define NULL_USEFUL_BUF_C  NULLUsefulBufC
 
 enum attestation_error_code {
@@ -161,13 +73,8 @@
     PAL_ATTEST_ERR_KEY_FAIL,
     PAL_ATTEST_ERR_SIGNATURE_FAIL,
     PAL_ATTEST_ERR_CBOR_STRUCTURE,
+    PAL_ATTEST_ERR_SMALL_BUFFER,
     PAL_ATTEST_ERROR,
 };
 
-struct items_to_get_t {
-    int64_t label;
-    QCBORItem item;
-};
-
-int32_t pal_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
-                                        uint8_t *token, size_t token_size);
+#endif /* _PAL_ATTESTATION_EAT_H_ */
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h
index 12f6ee9..3ab7ebb 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/initial_attestation/pal_attestation_intf.h
@@ -15,8 +15,8 @@
  * limitations under the License.
 **/
 
-#ifndef _PAL_INITIAL_ATTESTATION_H_
-#define _PAL_INITIAL_ATTESTATION_H_
+#ifndef _PAL_ATTESTATION_INTF_H_
+#define _PAL_ATTESTATION_INTF_H_
 
 #include "pal_attestation_crypto.h"
 
@@ -24,7 +24,9 @@
     PAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     PAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     PAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    PAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    PAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
 int32_t pal_attestation_function(int type, va_list valist);
-#endif /* _PAL_INITIAL_ATTESTATION_H_ */
+#endif /* _PAL_ATTESTATION_INTF_H_ */
diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/target.cmake b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/target.cmake
index 5c5c942..db9a4fa 100644
--- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/target.cmake
+++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/target.cmake
@@ -71,7 +71,6 @@
 if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
 	list(APPEND PAL_SRC_C_NSPE
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_intf.c
-		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_eat.c
 		${PSA_ROOT_DIR}/platform/targets/${TARGET}/nspe/initial_attestation/pal_attestation_crypto.c
 	)
 endif()
diff --git a/api-tests/val/nspe/val_attestation.c b/api-tests/val/nspe/val_attestation.c
index 82d7191..50e400a 100644
--- a/api-tests/val/nspe/val_attestation.c
+++ b/api-tests/val/nspe/val_attestation.c
@@ -21,24 +21,415 @@
 #include "val_client_defs.h"
 #include "val_attestation.h"
 
+#ifdef INITIAL_ATTESTATION
+
+uint32_t    mandatory_claims = 0;
+uint32_t    mandaroty_sw_components = 0;
+bool_t      sw_component_present = 0;
+
+static int get_items_in_map(QCBORDecodeContext *decode_context,
+                            struct items_to_get_t *item_list)
+{
+    int                     item_index;
+    QCBORItem               item;
+    struct items_to_get_t  *item_ptr = item_list;
+
+    /* initialize the data type of all items in the list */
+    while (item_ptr->label != 0)
+    {
+        item_ptr->item.uDataType = QCBOR_TYPE_NONE;
+        item_ptr++;
+    }
+
+    QCBORDecode_GetNext(decode_context, &item);
+    if (item.uDataType != QCBOR_TYPE_MAP)
+    {
+        return VAL_ATTEST_ERROR;
+    }
+
+    for (item_index = item.val.uCount; item_index != 0; item_index--)
+    {
+        if (QCBORDecode_GetNext(decode_context, &item) != QCBOR_SUCCESS)
+        {
+            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+        }
+        if (item.uLabelType != QCBOR_TYPE_INT64)
+        {
+            continue;
+        }
+
+        item_ptr = item_list;
+        while (item_ptr->label != 0)
+        {
+            if (item.label.int64 == item_ptr->label)
+            {
+                item_ptr->item = item;
+            }
+            item_ptr++;
+        }
+    }
+
+    return VAL_ATTEST_SUCCESS;
+}
+
+static int get_item_in_map(QCBORDecodeContext *decode_context,
+                           int32_t label,
+                           QCBORItem *item)
+{
+    struct items_to_get_t   item_list[2];
+
+    item_list[0].label = label;
+    item_list[1].label = 0;
+
+    if (get_items_in_map(decode_context, item_list))
+    {
+        return VAL_ATTEST_ERROR;
+    }
+
+    if (item_list[0].item.uDataType == QCBOR_TYPE_NONE)
+    {
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+    }
+
+    *item = item_list[0].item;
+
+    return VAL_ATTEST_SUCCESS;
+}
+
+static int parse_unprotected_headers(QCBORDecodeContext *decode_context,
+                                     struct q_useful_buf_c *child)
+{
+    struct items_to_get_t   item_list[3];
+
+    item_list[0].label = COSE_HEADER_PARAM_KID;
+    item_list[1].label = 0;
+
+    if (get_items_in_map(decode_context, item_list))
+    {
+        return VAL_ATTEST_ERR_CBOR_STRUCTURE;
+    }
+
+    return VAL_ATTEST_SUCCESS;
+}
+
+static int parse_protected_headers(struct q_useful_buf_c protected_headers,
+                                   int32_t *alg_id)
+{
+    QCBORDecodeContext  decode_context;
+    QCBORItem           item;
+
+    QCBORDecode_Init(&decode_context, protected_headers, 0);
+
+    if (get_item_in_map(&decode_context, COSE_HEADER_PARAM_ALG, &item))
+    {
+        return VAL_ATTEST_ERROR;
+    }
+
+    if (QCBORDecode_Finish(&decode_context))
+    {
+        return VAL_ATTEST_ERROR;
+    }
+
+    if ((item.uDataType != QCBOR_TYPE_INT64) || (item.val.int64 > INT32_MAX))
+    {
+        return VAL_ATTEST_ERROR;
+    }
+
+    *alg_id = (int32_t)item.val.int64;
+
+    return VAL_ATTEST_SUCCESS;
+}
+
+/**
+    @brief    - This API will verify the claims
+    @param    - decode_context      : The buffer containing the challenge
+                item                : context for decoding the data items
+                completed_challenge : Buffer containing the challenge
+    @return   - error status
+**/
+static int parse_claims(QCBORDecodeContext *decode_context, QCBORItem item,
+                                   struct q_useful_buf_c completed_challenge)
+{
+    int i, count = 0;
+    int status = VAL_ATTEST_SUCCESS;
+
+    /* Parse each claim and validate their data type */
+    while (status == VAL_ATTEST_SUCCESS)
+    {
+        status = QCBORDecode_GetNext(decode_context, &item);
+        if (status != VAL_ATTEST_SUCCESS)
+            break;
+
+        mandatory_claims |= 1 << (EAT_CBOR_ARM_RANGE_BASE - item.label.int64);
+        if (item.uLabelType == QCBOR_TYPE_INT64)
+        {
+            if (item.label.int64 == EAT_CBOR_ARM_LABEL_NONCE)
+            {
+                if (item.uDataType == QCBOR_TYPE_BYTE_STRING)
+                {
+                    /* Given challenge vs challenge in token */
+                    if (UsefulBuf_Compare(item.val.string, completed_challenge))
+                        return VAL_ATTEST_TOKEN_CHALLENGE_MISMATCH;
+                }
+                else
+                    return VAL_ATTEST_TOKEN_NOT_SUPPORTED;
+            }
+            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_BOOT_SEED ||
+                     item.label.int64 == EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID ||
+                     item.label.int64 == EAT_CBOR_ARM_LABEL_UEID)
+            {
+                if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
+                    return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+            }
+            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_ORIGINATION ||
+                     item.label.int64 == EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION ||
+                     item.label.int64 == EAT_CBOR_ARM_LABEL_HW_VERSION)
+            {
+                if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
+                    return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+            }
+            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_CLIENT_ID ||
+                     item.label.int64 == EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE)
+            {
+                if (item.uDataType != QCBOR_TYPE_INT64)
+                    return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+            }
+            else if (item.label.int64 == EAT_CBOR_ARM_LABEL_SW_COMPONENTS)
+            {
+                if (item.uDataType != QCBOR_TYPE_ARRAY)
+                    return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+
+                sw_component_present = 1;
+                status = QCBORDecode_GetNext(decode_context, &item);
+                if (status != VAL_ATTEST_SUCCESS)
+                    continue;
+
+                count = item.val.uCount;
+                for (i = 0; i <= count; i++)
+                {
+                    mandaroty_sw_components |= 1 << item.label.int64;
+
+                    if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT)
+                    {
+                         if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC)
+                    {
+                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_VERSION)
+                    {
+                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_SIGNER_ID)
+                    {
+                        if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_EPOCH)
+                    {
+                        if (item.uDataType != QCBOR_TYPE_INT64)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+                    else if (item.label.int64 == EAT_CBOR_SW_COMPONENT_TYPE)
+                    {
+                        if (item.uDataType != QCBOR_TYPE_TEXT_STRING)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+
+                    if (i < count)
+                    {
+                        status = QCBORDecode_GetNext(decode_context, &item);
+                        if (status != VAL_ATTEST_SUCCESS)
+                            return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+                    }
+                }
+
+            }
+        }
+        else
+        {
+            /* For other claim types */
+        }
+    }
+
+    if (status == QCBOR_ERR_HIT_END)
+        return VAL_ATTEST_SUCCESS;
+    else
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+}
+
+/**
+    @brief    - This API will verify the attestation token
+    @param    - challenge       : The buffer containing the challenge
+                challenge_size  : Size of the challenge buffer
+                token           : The buffer containing the attestation token
+                token_size      : Size of the token buffer
+    @return   - error status
+**/
+int32_t val_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
+                                        uint8_t *token, size_t token_size)
+{
+    int32_t               status = VAL_ATTEST_SUCCESS;
+    int32_t               cose_algorithm_id;
+    QCBORItem             item;
+    QCBORDecodeContext    decode_context;
+    struct q_useful_buf_c completed_challenge;
+    struct q_useful_buf_c completed_token;
+    struct q_useful_buf_c payload;
+    struct q_useful_buf_c signature;
+    struct q_useful_buf_c protected_headers;
+    struct q_useful_buf_c kid;
+    struct q_useful_buf_c token_hash;
+
+    USEFUL_BUF_MAKE_STACK_UB(buffer_for_encoded_key, MAX_ENCODED_COSE_KEY_SIZE);
+    USEFUL_BUF_MAKE_STACK_UB(buffer_for_token_hash, T_COSE_CRYPTO_SHA256_SIZE);
+
+    kid.ptr = buffer_for_encoded_key.ptr;
+
+    /* Construct the token buffer for validation */
+    completed_token.ptr = token;
+    completed_token.len = token_size;
+
+    /* Construct the challenge buffer for validation */
+    completed_challenge.ptr = challenge;
+    completed_challenge.len = challenge_size;
+
+/*
+    -------------------------
+    |  CBOR Array Type      |
+    -------------------------
+    |  Protected Headers    |
+    -------------------------
+    |  Unprotected Headers  |
+    -------------------------
+    |  Payload              |
+    -------------------------
+    |  Signature            |
+    -------------------------
+*/
+
+    /* Initialize the decorder */
+    QCBORDecode_Init(&decode_context, completed_token, QCBOR_DECODE_MODE_NORMAL);
+
+    /* Get the Header */
+    QCBORDecode_GetNext(&decode_context, &item);
+
+    /* Check the CBOR Array type. Check if the count is 4.
+     * Only COSE_SIGN1 is supported now.
+     */
+    if (item.uDataType != QCBOR_TYPE_ARRAY || item.val.uCount != 4 ||
+       !QCBORDecode_IsTagged(&decode_context, &item, CBOR_TAG_COSE_SIGN1))
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+
+    /* Get the next headers */
+    QCBORDecode_GetNext(&decode_context, &item);
+    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+
+    protected_headers = item.val.string;
+
+    /* Parse the protected headers and check the data type and value*/
+    status = parse_protected_headers(protected_headers, &cose_algorithm_id);
+    if (status != VAL_ATTEST_SUCCESS)
+        return status;
+
+    /* Parse the unprotected headers and check the data type and value */
+    status = parse_unprotected_headers(&decode_context, &kid);
+    if (status != VAL_ATTEST_SUCCESS)
+        return status;
+
+    /* Get the payload */
+    QCBORDecode_GetNext(&decode_context, &item);
+    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+
+    payload = item.val.string;
+
+    /* Get the digital signature */
+    QCBORDecode_GetNext(&decode_context, &item);
+    if (item.uDataType != QCBOR_TYPE_BYTE_STRING)
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+
+    signature = item.val.string;
+
+    /* Compute the hash from the token */
+    status = val_attestation_function(VAL_INITIAL_ATTEST_COMPUTE_HASH, cose_algorithm_id,
+                                      buffer_for_token_hash, &token_hash,
+                                      protected_headers, payload);
+    if (status != VAL_ATTEST_SUCCESS)
+        return status;
+
+    /* Verify the signature */
+    status = val_attestation_function(VAL_INITIAL_ATTEST_VERIFY_WITH_PK, cose_algorithm_id,
+                                      token_hash, signature);
+    if (status != VAL_ATTEST_SUCCESS)
+        return status;
+
+    /* Initialize the Decoder and validate the payload format */
+    QCBORDecode_Init(&decode_context, payload, QCBOR_DECODE_MODE_NORMAL);
+    status = QCBORDecode_GetNext(&decode_context, &item);
+    if (status != VAL_ATTEST_SUCCESS)
+        return status;
+
+    if (item.uDataType != QCBOR_TYPE_MAP)
+        return VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING;
+
+    /* Parse the payload and check the data type of each claim */
+    status = parse_claims(&decode_context, item, completed_challenge);
+    if (status != VAL_ATTEST_SUCCESS)
+        return status;
+
+    if ((mandatory_claims & MANDATORY_CLAIM_WITH_SW_COMP) == MANDATORY_CLAIM_WITH_SW_COMP)
+    {
+        if ((mandaroty_sw_components & MANDATORY_SW_COMP) != MANDATORY_SW_COMP)
+            return VAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
+    }
+    else if ((mandatory_claims & MANDATORY_CLAIM_NO_SW_COMP) != MANDATORY_CLAIM_NO_SW_COMP)
+    {
+        return VAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS;
+    }
+
+    return VAL_ATTEST_SUCCESS;
+}
+#endif /* INITIAL_ATTESTATION */
+
 /**
     @brief    - This API will call the requested attestation function
     @param    - type : function code
                 ...  : variable number of arguments
     @return   - Error status
 **/
-
 int32_t val_attestation_function(int type, ...)
 {
 #ifdef INITIAL_ATTESTATION
     va_list      valist;
     val_status_t status;
+    uint8_t      *challenge, *token;
+    size_t       challenge_size, verify_token_size;
 
     va_start(valist, type);
-    status = pal_attestation_function(type, valist);
+    switch (type)
+    {
+        case VAL_INITIAL_ATTEST_VERIFY_TOKEN:
+            challenge = va_arg(valist, uint8_t*);
+            challenge_size = va_arg(valist, size_t);
+            token = va_arg(valist, uint8_t*);
+            verify_token_size = va_arg(valist, size_t);
+            status = val_initial_attest_verify_token(challenge, challenge_size,
+                                                   token, verify_token_size);
+            break;
+        default:
+            status = pal_attestation_function(type, valist);
+            break;
+    }
+
     va_end(valist);
     return status;
 #else
     return VAL_STATUS_ERROR;
-#endif
+#endif /* INITIAL_ATTESTATION */
 }
diff --git a/api-tests/val/nspe/val_attestation.h b/api-tests/val/nspe/val_attestation.h
index 58ea59c..f810fcc 100644
--- a/api-tests/val/nspe/val_attestation.h
+++ b/api-tests/val/nspe/val_attestation.h
@@ -18,14 +18,130 @@
 #ifndef _VAL_INITIAL_ATTESTATION_H_
 #define _VAL_INITIAL_ATTESTATION_H_
 
+#ifdef INITIAL_ATTESTATION
+
 #include "val.h"
+#include "qcbor.h"
+
+#define COSE_HEADER_PARAM_ALG             1
+#define COSE_HEADER_PARAM_KID             4
+
+/**
+ * The size of X and Y coordinate in 2 parameter style EC public
+ * key. Format is as defined in [COSE (RFC 8152)]
+ * (https://tools.ietf.org/html/rfc8152) and [SEC 1: Elliptic Curve
+ * Cryptography](http://www.secg.org/sec1-v2.pdf).
+ *
+ * This size is well-known and documented in public standards.
+ */
+#define T_COSE_CRYPTO_EC_P256_COORD_SIZE  32
+#define T_COSE_CRYPTO_SHA256_SIZE         32
+
+#define MAX_ENCODED_COSE_KEY_SIZE \
+   (1 + /* 1 byte to encode map */ \
+    2 + /* 2 bytes to encode key type */ \
+    2 + /* 2 bytes to encode curve */ \
+    2 * /* the X and Y coordinates at 32 bytes each */ \
+        (T_COSE_CRYPTO_EC_P256_COORD_SIZE + 1 + 2))
+
+#define USEFUL_BUF_MAKE_STACK_UB UsefulBuf_MAKE_STACK_UB
+
 #define MAX_CHALLENGE_SIZE      PSA_INITIAL_ATTEST_CHALLENGE_SIZE_64
 
+#define EAT_CBOR_ARM_RANGE_BASE                 (-75000)
+#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION   (EAT_CBOR_ARM_RANGE_BASE - 0)
+#define EAT_CBOR_ARM_LABEL_CLIENT_ID            (EAT_CBOR_ARM_RANGE_BASE - 1)
+#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE   (EAT_CBOR_ARM_RANGE_BASE - 2)
+#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID    (EAT_CBOR_ARM_RANGE_BASE - 3)
+#define EAT_CBOR_ARM_LABEL_BOOT_SEED            (EAT_CBOR_ARM_RANGE_BASE - 4)
+#define EAT_CBOR_ARM_LABEL_HW_VERSION           (EAT_CBOR_ARM_RANGE_BASE - 5)
+#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS        (EAT_CBOR_ARM_RANGE_BASE - 6)
+#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS     (EAT_CBOR_ARM_RANGE_BASE - 7)
+#define EAT_CBOR_ARM_LABEL_NONCE                (EAT_CBOR_ARM_RANGE_BASE - 8)
+#define EAT_CBOR_ARM_LABEL_UEID                 (EAT_CBOR_ARM_RANGE_BASE - 9)
+#define EAT_CBOR_ARM_LABEL_ORIGINATION          (EAT_CBOR_ARM_RANGE_BASE - 10)
+
+#define CBOR_ARM_TOTAL_CLAIM_INSTANCE           10
+
+#define EAT_CBOR_SW_COMPONENT_TYPE              (1u)
+#define EAT_CBOR_SW_COMPONENT_MEASUREMENT       (2u)
+#define EAT_CBOR_SW_COMPONENT_EPOCH             (3u)
+#define EAT_CBOR_SW_COMPONENT_VERSION           (4u)
+#define EAT_CBOR_SW_COMPONENT_SIGNER_ID         (5u)
+#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC  (6u)
+
+#define MANDATORY_CLAIM_WITH_SW_COMP           (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_SW_COMPONENTS))
+
+#define MANDATORY_CLAIM_NO_SW_COMP             (1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_NONCE)              |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_UEID)               |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID)  |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_CLIENT_ID)          |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE) |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_BOOT_SEED)          |     \
+                                                1 << (EAT_CBOR_ARM_RANGE_BASE                      \
+                                                    - EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS))
+
+#define MANDATORY_SW_COMP                      (1 << EAT_CBOR_SW_COMPONENT_MEASUREMENT      |     \
+                                                1 << EAT_CBOR_SW_COMPONENT_VERSION          |     \
+                                                1 << EAT_CBOR_SW_COMPONENT_SIGNER_ID)
+
+#define VAL_ATTEST_MIN_ERROR                    70
+
+enum attestation_error_code {
+    VAL_ATTEST_SUCCESS = 0,
+    VAL_ATTEST_TOKEN_ERR_CBOR_FORMATTING = VAL_ATTEST_MIN_ERROR,
+    VAL_ATTEST_TOKEN_CHALLENGE_MISMATCH,
+    VAL_ATTEST_TOKEN_NOT_SUPPORTED,
+    VAL_ATTEST_TOKEN_NOT_ALL_MANDATORY_CLAIMS,
+    VAL_ATTEST_HASH_LENGTH_MISMATCH,
+    VAL_ATTEST_HASH_MISMATCH,
+    VAL_ATTEST_HASH_FAIL,
+    VAL_ATTEST_HASH_UNSUPPORTED,
+    VAL_ATTEST_HASH_BUFFER_SIZE,
+    VAL_ATTEST_ERR_PROTECTED_HEADERS,
+    VAL_ATTEST_ERR_SIGN_STRUCT,
+    VAL_ATTEST_ERR_KEY_FAIL,
+    VAL_ATTEST_ERR_SIGNATURE_FAIL,
+    VAL_ATTEST_ERR_CBOR_STRUCTURE,
+    VAL_ATTEST_ERR_SMALL_BUFFER,
+    VAL_ATTEST_ERROR,
+};
+
+struct items_to_get_t {
+    int64_t label;
+    QCBORItem item;
+};
+
 enum attestation_function_code {
     VAL_INITIAL_ATTEST_GET_TOKEN        = 0x1,
     VAL_INITIAL_ATTEST_GET_TOKEN_SIZE   = 0x2,
     VAL_INITIAL_ATTEST_VERIFY_TOKEN     = 0x3,
+    VAL_INITIAL_ATTEST_COMPUTE_HASH     = 0x4,
+    VAL_INITIAL_ATTEST_VERIFY_WITH_PK   = 0x5,
 };
 
+int32_t val_initial_attest_verify_token(uint8_t *challenge, size_t challenge_size,
+                                        uint8_t *token, size_t token_size);
+#endif /* INITIAL_ATTESTATION */
+
 int32_t val_attestation_function(int type, ...);
 #endif /* _VAL_INITIAL_ATTESTATION_H_ */
diff --git a/api-tests/val/val_nspe.cmake b/api-tests/val/val_nspe.cmake
index 91113b0..4494ed2 100644
--- a/api-tests/val/val_nspe.cmake
+++ b/api-tests/val/val_nspe.cmake
@@ -38,6 +38,12 @@
         target_include_directories(${PSA_TARGET_VAL_NSPE_LIB} PRIVATE ${psa_inc_path})
 endforeach()
 
+if(${SUITE} STREQUAL "INITIAL_ATTESTATION")
+target_include_directories(${PSA_TARGET_VAL_NSPE_LIB} PRIVATE
+    ${PSA_QCBOR_INCLUDE_PATH}
+)
+endif()
+
 target_include_directories(${PSA_TARGET_VAL_NSPE_LIB} PRIVATE
 	${CMAKE_CURRENT_BINARY_DIR}
 	${PSA_ROOT_DIR}/val/common
