diff --git a/interface/include/tfm_sst_api.h b/interface/include/tfm_sst_api.h
index 8447bd4..58d9333 100644
--- a/interface/include/tfm_sst_api.h
+++ b/interface/include/tfm_sst_api.h
@@ -19,40 +19,78 @@
  *        without setting any data in the asset.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] token       Must be set to NULL, reserved for future use.
+ *                        Pointer to the asset token to be used to generate
+ *                        the asset key to encrypt and decrypt the asset
+ *                        data. This is an optional parameter that has to
+ *                        be NULL in case the token is not provied.
+ * \param[in] token_size  Must be set to 0, reserved for future use.
+ *                        Token size. In case the token is not provided
+ *                        the token size has to be 0.
  *
  * \return Returns an TFM_SST_ERR_SUCCESS if asset is created correctly.
  *         Otherwise, error code as specified in \ref tfm_sst_err_t
  */
-enum tfm_sst_err_t  tfm_sst_create(uint32_t asset_uuid);
+enum tfm_sst_err_t  tfm_sst_create(uint32_t asset_uuid,
+                                   const uint8_t* token,
+                                   uint32_t token_size);
 
 /**
  * \brief Gets asset's information referenced by asset UUID.
  *
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  token       Must be set to NULL, reserved for future use.
+ *                         Pointer to the asset token to be used to generate
+ *                         the asset key to encrypt and decrypt the asset
+ *                         data. This is an optional parameter that has to
+ *                         be NULL in case the token is not provied.
+ * \param[in]  token_size  Must be set to 0, reserved for future use.
+ *                         Token size. In case the token is not provided
+ *                         the token size has to be 0.
  * \param[out] info        Pointer to store the asset's information
  *                         \ref tfm_sst_asset_info_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_get_info(uint32_t asset_uuid,
+                                    const uint8_t* token,
+                                    uint32_t token_size,
                                     struct tfm_sst_asset_info_t *info);
 
 /**
  * \brief Gets asset's attributes referenced by asset UUID.
  *
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  token       Must be set to NULL, reserved for future use.
+ *                         Pointer to the asset token to be used to generate
+ *                         the asset key to encrypt and decrypt the asset
+ *                         data. This is an optional parameter that has to
+ *                         be NULL in case the token is not provied.
+ * \param[in]  token_size  Must be set to 0, reserved for future use.
+ *                         Token size. In case the token is not provided
+ *                         the token size has to be 0.
  * \param[out] attrs       Pointer to store the asset's attributes
  *                         \ref tfm_sst_asset_attrs_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_get_attributes(uint32_t asset_uuid,
+                                          const uint8_t* token,
+                                          uint32_t token_size,
                                           struct tfm_sst_asset_attrs_t *attrs);
 
 /**
  * \brief Sets asset's attributes referenced by asset UUID.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] token       Must be set to NULL, reserved for future use.
+ *                        Pointer to the asset token to be used to generate
+ *                        the asset key to encrypt and decrypt the asset
+ *                        data. This is an optional parameter that has to
+ *                        be NULL in case the token is not provied.
+ * \param[in] token_size  Must be set to 0, reserved for future use.
+ *                        Token size. In case the token is not provided
+ *                        the token size has to be 0.
  * \param[in] attrs       Pointer to new the asset's attributes
  *                        \ref tfm_sst_asset_attrs_t
  *
@@ -60,40 +98,72 @@
  */
 enum tfm_sst_err_t tfm_sst_set_attributes(
                                      uint32_t asset_uuid,
+                                     const uint8_t* token,
+                                     uint32_t token_size,
                                      const struct tfm_sst_asset_attrs_t *attrs);
 
 /**
  * \brief Reads asset's data from asset referenced by asset UUID.
  *
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  token       Must be set to NULL, reserved for future use.
+ *                         Pointer to the asset token to be used to generate
+ *                         the asset key to encrypt and decrypt the asset
+ *                         data. This is an optional parameter that has to
+ *                         be NULL in case the token is not provied.
+ * \param[in]  token_size  Must be set to 0, reserved for future use.
+ *                         Token size. In case the token is not provided
+ *                         the token size has to be 0.
  * \param[out] data        Pointer to data vector \ref tfm_sst_buf_t to store
  *                         data, size and offset
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_read(uint32_t asset_uuid,
+                                const uint8_t* token,
+                                uint32_t token_size,
                                 struct tfm_sst_buf_t* data);
 
 /**
  * \brief Writes data into an asset referenced by asset UUID.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] token       Must be set to NULL, reserved for future use.
+ *                        Pointer to the asset token to be used to generate
+ *                        the asset key to encrypt and decrypt the asset
+ *                        data. This is an optional parameter that has to
+ *                        be NULL in case the token is not provied.
+ * \param[in] token_size  Must be set to 0, reserved for future use.
+ *                        Token size. In case the token is not provided
+ *                        the token size has to be 0.
  * \param[in] data        Pointer to data vector \ref tfm_sst_buf_t which
  *                        contains the data to write
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_write(uint32_t asset_uuid,
+                                 const uint8_t* token,
+                                 uint32_t token_size,
                                  struct tfm_sst_buf_t* data);
 
 /**
  * \brief Deletes the asset referenced by the asset UUID.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] token       Must be set to NULL, reserved for future use.
+ *                        Pointer to the asset token to be used to generate
+ *                        the asset key to encrypt and decrypt the asset
+ *                        data. This is an optional parameter that has to
+ *                        be NULL in case the token is not provied.
+ * \param[in] token_size  Must be set to 0, reserved for future use.
+ *                        Token size. In case the token is not provided
+ *                        the token size has to be 0.
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
-enum tfm_sst_err_t tfm_sst_delete(uint32_t asset_uuid);
+enum tfm_sst_err_t tfm_sst_delete(uint32_t asset_uuid,
+                                  const uint8_t* token,
+                                  uint32_t token_size);
 
 #ifdef __cplusplus
 }
diff --git a/interface/include/tfm_sst_defs.h b/interface/include/tfm_sst_defs.h
index 52e41b3..5e1f869 100644
--- a/interface/include/tfm_sst_defs.h
+++ b/interface/include/tfm_sst_defs.h
@@ -54,6 +54,24 @@
 };
 
 /*!
+ * \struct tfm_sst_token_t
+ *
+ * \brief Structure to store the asset's token.
+ *
+ */
+struct tfm_sst_token_t {
+    const uint8_t  *token;  /*!< Pointer to the asset's token to be used to
+                             *   generate the asset key to encrypt and decrypt
+                             *   the asset data. This is an optional parameter
+                             *   that has to be NULL in case the token is not
+                             *   provied.
+                             */
+    uint32_t token_size;    /*!< Token size. In case the token is not provided
+                             *   the token size has to be 0.
+                             */
+};
+
+/*!
  * \struct tfm_sst_buf_t
  *
  * \brief Structure to store data information to read/write from/to asset.
diff --git a/interface/include/tfm_sst_svc_handler.h b/interface/include/tfm_sst_svc_handler.h
index a43e545..0cfb4ed 100644
--- a/interface/include/tfm_sst_svc_handler.h
+++ b/interface/include/tfm_sst_svc_handler.h
@@ -18,80 +18,94 @@
  * \brief SVC funtion to allocate space for the asset, referenced by asset
  *        UUID, without setting any data in the asset.
  *
- * \param[in] asset_uuid  Asset UUID
+ * \param[in] asset_uuid  Asset UUID \ref tfm_sst_asset_id_t
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
  *
  * \return Returns an TFM_SST_ERR_SUCCESS if asset is created correctly.
  *         Otherwise, error code as specified in \ref tfm_sst_err_t
  */
-enum tfm_sst_err_t tfm_sst_svc_create(uint32_t asset_uuid);
+enum tfm_sst_err_t tfm_sst_svc_create(uint32_t asset_uuid,
+                                      const struct tfm_sst_token_t *s_token);
 
 /**
  * \brief SVC funtion to get asset's information referenced by asset UUID.
  *
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[out] info        Pointer to store the asset's information
  *                         \ref tfm_sst_asset_info_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_svc_get_info(uint32_t asset_uuid,
+                                        const struct tfm_sst_token_t *s_token,
                                         struct tfm_sst_asset_info_t *info);
 /**
  * \brief SVC funtion to get asset's attributes referenced by asset UUID.
  *
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[out] attrs       Pointer to store the asset's attributes
  *                         \ref tfm_sst_asset_attrs_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_svc_get_attributes(uint32_t asset_uuid,
-                                           struct tfm_sst_asset_attrs_t *attrs);
+                                          const struct tfm_sst_token_t *s_token,
+                                          struct tfm_sst_asset_attrs_t *attrs);
 
 /**
  * \brief SVC funtion to set asset's attributes referenced by asset UUID.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[in] attrs       Pointer to new the asset's attributes
  *                        \ref tfm_sst_asset_attrs_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_svc_set_attributes(uint32_t asset_uuid,
+                                     const struct tfm_sst_token_t *s_token,
                                      const struct tfm_sst_asset_attrs_t *attrs);
 
 /**
  * \brief SVC funtion to read asset's data from asset referenced by asset UUID.
  *
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[out] data        Pointer to data vector \ref tfm_sst_buf_t to store
  *                         data, size and offset
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_svc_read(uint32_t asset_uuid,
+                                    const struct tfm_sst_token_t *s_token,
                                     struct tfm_sst_buf_t* data);
 
 /**
  * \brief SVC funtion to write data into an asset referenced by asset UUID.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[in] data        Pointer to data vector \ref tfm_sst_buf_t which
  *                        contains the data to write
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_svc_write(uint32_t asset_uuid,
+                                     const struct tfm_sst_token_t *s_token,
                                      struct tfm_sst_buf_t* data);
 
 /**
  * \brief SVC funtion to delete the asset referenced by the asset UUID.
  *
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
-enum tfm_sst_err_t tfm_sst_svc_delete(uint32_t asset_uuid);
+enum tfm_sst_err_t tfm_sst_svc_delete(uint32_t asset_uuid,
+                                      const struct tfm_sst_token_t *s_token);
 
 #ifdef __cplusplus
 }
diff --git a/interface/include/tfm_sst_veneers.h b/interface/include/tfm_sst_veneers.h
index 033f1cb..95a6b17 100644
--- a/interface/include/tfm_sst_veneers.h
+++ b/interface/include/tfm_sst_veneers.h
@@ -19,7 +19,8 @@
  *        without setting any data in the asset.
  *
  * \param[in] app_id      Application ID
- * \param[in] asset_uuid  Asset UUID
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
+ * \param[in] asset_uuid  Asset UUID \ref tfm_sst_asset_id_t
  *
  * \return Returns TFM_SST_ERR_SUCCESS if the asset has been created correctly.
  *         If SST area is not prepared, it returns
@@ -27,47 +28,55 @@
  *         TFM_SST_ERR_STORAGE_SYSTEM_FULL. If application id doesn't have the
  *         write rights, it returns TFM_SST_ERR_PERMS_NOT_ALLOWED.
  */
-enum tfm_sst_err_t tfm_sst_veneer_create(uint32_t app_id, uint32_t asset_uuid);
+enum tfm_sst_err_t tfm_sst_veneer_create(uint32_t app_id, uint32_t asset_uuid,
+                                         const struct tfm_sst_token_t *s_token);
+
 
 /**
  * \brief Gets asset's information referenced by asset UUID.
  *
  * \param[in]  app_id      Application ID
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[out] info        Pointer to store the asset's information
  *                         \ref tfm_sst_asset_info_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_veneer_get_info(uint32_t app_id, uint32_t asset_uuid,
-                                    struct tfm_sst_asset_info_t *info);
+                                          const struct tfm_sst_token_t *s_token,
+                                          struct tfm_sst_asset_info_t *info);
 
 /**
  * \brief Gets asset's attributes referenced by asset UUID.
  *
  * \param[in]  app_id      Application ID
  * \param[in]  asset_uuid  Asset UUID
+ * \param[in]  s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[out] attrs       Pointer to store the asset's attributes
  *                         \ref tfm_sst_asset_attrs_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_veneer_get_attributes(uint32_t app_id,
-                                                 uint32_t asset_uuid,
-                                           struct tfm_sst_asset_attrs_t *attrs);
+                                          uint32_t asset_uuid,
+                                          const struct tfm_sst_token_t *s_token,
+                                          struct tfm_sst_asset_attrs_t *attrs);
 
 /**
  * \brief Sets asset's attributes referenced by asset UUID.
  *
  * \param[in] app_id       Application ID
  * \param[in] asset_uuid   Asset UUID
+ * \param[in] s_token      Pointer to the asset's token \ref tfm_sst_token_t
  * \param[in] attrs        Pointer to new the asset's attributes
  *                         \ref tfm_sst_asset_attrs_t
  *
  * \return Returns error code as specified in \ref tfm_sst_err_t
  */
 enum tfm_sst_err_t tfm_sst_veneer_set_attributes(uint32_t app_id,
-                                                 uint32_t asset_uuid,
+                                     uint32_t asset_uuid,
+                                     const struct tfm_sst_token_t *s_token,
                                      const struct tfm_sst_asset_attrs_t *attrs);
 
 /**
@@ -75,40 +84,46 @@
  *
  * \param[in]     app_id      Application ID
  * \param[in]     asset_uuid  Asset UUID
+ * \param[in]     s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[in/out] data        Pointer to data vector \ref tfm_sst_buf_t to
  *                            store data, size and offset
  *
  * \return Returns the number of bytes written or a castable \ref tfm_sst_err_t
  *         value
  */
-enum tfm_sst_err_t tfm_sst_veneer_read(uint32_t app_id,
-                                       uint32_t asset_uuid,
+enum tfm_sst_err_t tfm_sst_veneer_read(uint32_t app_id, uint32_t asset_uuid,
+                                       const struct tfm_sst_token_t *s_token,
                                        struct tfm_sst_buf_t *data);
+
 /**
  * \brief Writes data into an asset referenced by asset UUID.
  *
  * \param[in] app_id      Application ID
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
  * \param[in] data        Pointer to data vector \ref tfm_sst_buf_t which
  *                        contains the data to write
  *
  * \return Returns the number of bytes written or a castable \ref tfm_sst_err_t
  *         value
  */
-enum tfm_sst_err_t tfm_sst_veneer_write(uint32_t app_id,
-                                        uint32_t asset_uuid,
+enum tfm_sst_err_t tfm_sst_veneer_write(uint32_t app_id, uint32_t asset_uuid,
+                                        const struct tfm_sst_token_t *s_token,
                                         struct tfm_sst_buf_t *data);
+
 /**
  * \brief Deletes the asset referenced by the asset UUID.
  *
  * \param[in] app_id      Application ID
  * \param[in] asset_uuid  Asset UUID
+ * \param[in] s_token     Pointer to the asset's token \ref tfm_sst_token_t
  *
  * \return Returns TFM_SST_ERR_PERMS_NOT_ALLOWED if the asset can't be deleted
  *         to by this app ID. Returns TFM_SST_ERR_ASSET_REF_INVALID, if asset
  *         no longer exists. Otherwise, TFM_SST_ERR_SUCCESS.
  */
-enum tfm_sst_err_t tfm_sst_veneer_delete(uint32_t app_id, uint32_t asset_uuid);
+enum tfm_sst_err_t tfm_sst_veneer_delete(uint32_t app_id, uint32_t asset_uuid,
+                                         const struct tfm_sst_token_t *s_token);
 
 #ifdef __cplusplus
 }
diff --git a/interface/src/tfm_sst_api.c b/interface/src/tfm_sst_api.c
index d363c0a..ab47fd8 100644
--- a/interface/src/tfm_sst_api.c
+++ b/interface/src/tfm_sst_api.c
@@ -8,70 +8,125 @@
 #include "tfm_sst_defs.h"
 #include "tfm_ns_lock.h"
 
-enum tfm_sst_err_t tfm_sst_create(uint32_t asset_uuid)
+enum tfm_sst_err_t tfm_sst_create(uint32_t asset_uuid, const uint8_t* token,
+                                  uint32_t token_size)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_CREATE,
                                     asset_uuid,
-                                    0,
+                                    (uint32_t)&s_token,
                                     0,
                                     0);
 }
 
 enum tfm_sst_err_t tfm_sst_get_info(uint32_t asset_uuid,
+                                    const uint8_t* token,
+                                    uint32_t token_size,
                                     struct tfm_sst_asset_info_t *info)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_GET_INFO,
                                     asset_uuid,
+                                    (uint32_t)&s_token,
                                     (uint32_t)info,
-                                    0,
                                     0);
 }
 
 enum tfm_sst_err_t tfm_sst_get_attributes(uint32_t asset_uuid,
+                                          const uint8_t* token,
+                                          uint32_t token_size,
                                           struct tfm_sst_asset_attrs_t *attrs)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_GET_ATTRIBUTES,
                                     asset_uuid,
+                                    (uint32_t)&s_token,
                                     (uint32_t)attrs,
-                                    0,
                                     0);
 }
 
 enum tfm_sst_err_t tfm_sst_set_attributes(uint32_t asset_uuid,
+                                      const uint8_t* token,
+                                      uint32_t token_size,
                                       const struct tfm_sst_asset_attrs_t *attrs)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_SET_ATTRIBUTES,
                                     asset_uuid,
+                                    (uint32_t)&s_token,
                                     (uint32_t)attrs,
-                                    0,
                                     0);
 }
 
 enum tfm_sst_err_t tfm_sst_read(uint32_t asset_uuid,
+                                const uint8_t* token,
+                                uint32_t token_size,
                                 struct tfm_sst_buf_t* data)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_READ,
                                     asset_uuid,
+                                    (uint32_t)&s_token,
                                     (uint32_t)data,
-                                    0,
                                     0);
 }
 
 enum tfm_sst_err_t tfm_sst_write(uint32_t asset_uuid,
+                                 const uint8_t* token,
+                                 uint32_t token_size,
                                  struct tfm_sst_buf_t* data)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_WRITE,
                                     asset_uuid,
+                                    (uint32_t)&s_token,
                                     (uint32_t)data,
-                                    0,
                                     0);
 }
 
-enum tfm_sst_err_t tfm_sst_delete(uint32_t asset_uuid)
+enum tfm_sst_err_t tfm_sst_delete(uint32_t asset_uuid,
+                                  const uint8_t* token,
+                                  uint32_t token_size)
 {
+    struct tfm_sst_token_t s_token;
+
+    /* Pack the token information in the token structure */
+    s_token.token = token;
+    s_token.token_size = token_size;
+
     return tfm_ns_lock_svc_dispatch(SVC_TFM_SST_DELETE,
                                     asset_uuid,
-                                    0,
+                                    (uint32_t)&s_token,
                                     0,
                                     0);
 }
diff --git a/interface/src/tfm_sst_svc_handler.c b/interface/src/tfm_sst_svc_handler.c
index beab20d..8277169c 100644
--- a/interface/src/tfm_sst_svc_handler.c
+++ b/interface/src/tfm_sst_svc_handler.c
@@ -11,70 +11,77 @@
 #include "tfm_id_mngr.h"
 
 /* SVC function implementations */
-enum tfm_sst_err_t tfm_sst_svc_create(uint32_t asset_uuid)
+enum tfm_sst_err_t tfm_sst_svc_create(uint32_t asset_uuid,
+                                    const struct tfm_sst_token_t *s_token)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_create(app_id, asset_uuid);
+    return tfm_sst_veneer_create(app_id, asset_uuid, s_token);
 }
 
 enum tfm_sst_err_t tfm_sst_svc_get_info(uint32_t asset_uuid,
+                                        const struct tfm_sst_token_t *s_token,
                                         struct tfm_sst_asset_info_t *info)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_get_info(app_id, asset_uuid, info);
+    return tfm_sst_veneer_get_info(app_id, asset_uuid, s_token, info);
 }
 
 enum tfm_sst_err_t tfm_sst_svc_get_attributes(uint32_t asset_uuid,
-                                            struct tfm_sst_asset_attrs_t *attrs)
+                                          const struct tfm_sst_token_t *s_token,
+                                          struct tfm_sst_asset_attrs_t *attrs)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_get_attributes(app_id, asset_uuid, attrs);
+    return tfm_sst_veneer_get_attributes(app_id, asset_uuid, s_token, attrs);
 }
 
 enum tfm_sst_err_t tfm_sst_svc_set_attributes(uint32_t asset_uuid,
+                                      const struct tfm_sst_token_t *s_token,
                                       const struct tfm_sst_asset_attrs_t *attrs)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_set_attributes(app_id, asset_uuid, attrs);
+    return tfm_sst_veneer_set_attributes(app_id, asset_uuid, s_token, attrs);
 }
 
 enum tfm_sst_err_t tfm_sst_svc_read(uint32_t asset_uuid,
+                                    const struct tfm_sst_token_t *s_token,
                                     struct tfm_sst_buf_t* data)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_read(app_id, asset_uuid, data);
+    return tfm_sst_veneer_read(app_id, asset_uuid, s_token, data);
 }
 
 enum tfm_sst_err_t tfm_sst_svc_write(uint32_t asset_uuid,
+                                     const struct tfm_sst_token_t *s_token,
                                      struct tfm_sst_buf_t* data)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_write(app_id, asset_uuid, data);
+    return tfm_sst_veneer_write(app_id, asset_uuid, s_token, data);
 }
 
-enum tfm_sst_err_t tfm_sst_svc_delete(uint32_t asset_uuid)
+enum tfm_sst_err_t tfm_sst_svc_delete(uint32_t asset_uuid,
+                                      const struct tfm_sst_token_t *s_token)
 {
     uint32_t app_id;
 
     app_id = tfm_sst_get_cur_id();
 
-    return tfm_sst_veneer_delete(app_id, asset_uuid);
+    return tfm_sst_veneer_delete(app_id, asset_uuid, s_token);
 }
