<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>S32K中的主题 Re: About HSE Key Export</title>
    <link>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2120924#M50123</link>
    <description>&lt;P&gt;Dear&lt;/P&gt;&lt;P&gt;In the Below above, when using EXPAND(HSE_KDF_ALGO_HKDF_EXPAND) among HSE's KDF Services(HSE_HKDFExpand), why does HSE return HSE_SRV_RSP_INVALID_ID_PARAM?&lt;/P&gt;&lt;P&gt;Could you give me an example program for the case where the KDF algorithm is HSE_KDF_ALGO_HKDF_EXPAND?&lt;/P&gt;&lt;P&gt;Thank you.&lt;/P&gt;&lt;P&gt;Chang&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;hseSrvResponse_t HSE_HKDFExpand&lt;/DIV&gt;&lt;DIV&gt;(&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseHKDF_ExpandScheme_t *pKdfScheme&lt;/DIV&gt;&lt;DIV&gt;)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint8_t u8MuChannel;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvResponse_t srvResponse = HSE_SRV_RSP_GENERAL_ERROR;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Get a free channel on u8MuInstance */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; u8MuChannel = Hse_Ip_GetFreeChannel(APP_MU_INSTANCE_U8);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if(HSE_IP_INVALID_MU_CHANNEL_U8 == u8MuChannel)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto exit;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvDescriptor_t *pHseSrvDesc = &amp;amp;Hse_aSrvDescriptor[u8MuChannel];&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseKeyDeriveSrv_t* pDeriveKeySrv = &amp;amp;(pHseSrvDesc-&amp;gt;hseSrv.keyDeriveReq);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; memset(pHseSrvDesc, 0, sizeof(hseSrvDescriptor_t));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Prepare Descriptor */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pHseSrvDesc-&amp;gt;srvId = HSE_SRV_ID_KEY_DERIVE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;kdfAlgo = HSE_KDF_ALGO_HKDF_EXPAND;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Set KDF common parameters */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.srcKeyHandle = pKdfScheme-&amp;gt;kdfCommon.srcKeyHandle;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.targetKeyHandle = pKdfScheme-&amp;gt;kdfCommon.targetKeyHandle;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.keyMatLen = pKdfScheme-&amp;gt;kdfCommon.keyMatLen;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.kdfPrf = pKdfScheme-&amp;gt;kdfCommon.kdfPrf;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.prfAlgo = pKdfScheme-&amp;gt;kdfCommon.prfAlgo;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.infoLength = pKdfScheme-&amp;gt;kdfCommon.infoLength;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.pInfo = pKdfScheme-&amp;gt;kdfCommon.pInfo;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.pIvOutput = pKdfScheme-&amp;gt;pIvOutput;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Build the request to be sent to Hse Ip layer */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; HseIp_aRequest[u8MuChannel].eReqType = HSE_IP_REQTYPE_SYNC;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; HseIp_aRequest[u8MuChannel].u32Timeout = TIMEOUT_TICKS_U32;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Send request to HSE */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; srvResponse = Hse_Ip_ServiceRequest(APP_MU_INSTANCE_U8, MU_CH1, &amp;amp;HseIp_aRequest[u8MuChannel], pHseSrvDesc);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;exit:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; return srvResponse;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int nxp_hse_tls13_hkdf_expand_label(mbedtls_md_type_t md_type, hseKeyHandle_t secret_key_handle,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const unsigned char *label, size_t label_len, unsigned char *buf, size_t buf_len)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; int ret = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvResponse_t hse_result;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseHmacPrfAlgo_t&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hmacHash;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // HSE HKDF-Expand parameter setting&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseHKDF_ExpandScheme_t hkdf_scheme = {0};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;switch(md_type)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case MBEDTLS_MD_SHA256:&amp;nbsp; &amp;nbsp; /**&amp;lt; The SHA-256 message digest. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hmacHash = HSE_KDF_SHA2_256;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case MBEDTLS_MD_SHA384:&amp;nbsp; &amp;nbsp; /**&amp;lt; The SHA-384 message digest. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hmacHash = HSE_KDF_SHA2_384;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case MBEDTLS_MD_SHA512:&amp;nbsp; &amp;nbsp; /**&amp;lt; The SHA-512 message digest. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hmacHash = HSE_KDF_SHA2_512;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;default:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("HASH algorithm 0x%02x not supported", md_type));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ret = MBEDTLS_ERR_SSL_INVALID_MAC;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;goto exit;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Check if Key handle is valid&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (secret_key_handle == HSE_INVALID_KEY_HANDLE) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid source key handle"));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto exit;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (buf_len == 0 || buf_len &amp;gt; 1024) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid output length: %zu", buf_len));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto exit;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.srcKeyHandle = secret_key_handle;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.targetKeyHandle = HSE_INVALID_KEY_HANDLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.keyMatLen = (uint16_t)buf_len;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.kdfPrf = HSE_KDF_PRF_HMAC;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.prfAlgo.hmacHash = hmacHash;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.infoLength = (uint32_t)label_len;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.pInfo = HSE_PTR_TO_HOST_ADDR(label);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.pIvOutput = HSE_PTR_TO_HOST_ADDR(buf);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hse_result = HSE_HKDFExpand(&amp;amp;hkdf_scheme);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (hse_result != HSE_SRV_RSP_OK) {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("HSE_HKDFExpand is failed 0x%02x", hse_result));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;goto exit;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;exit:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; return ret;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;session_key_exchange()&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;~&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Secret is key handle */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (sizeof(secret) == sizeof(hseKeyHandle_t))&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s secret is key handle(%s) label_len(%d), ctx_len(%d), buf_len(%d)\r\n", __func__, hkdf_label, label_len, ctx_len, buf_len);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* secret should be key handle value */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc = nxp_hse_tls13_hkdf_expand_label(MBEDTLS_MD_SHA512, secret, hkdf_label, hkdf_label_len, buf, buf_len );&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; else /* secret is key value */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s secret is key raw data\n", __func__);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc = mbedtls_hkdf(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NULL, 0,&amp;nbsp; &amp;nbsp; &amp;nbsp;//ctx, ctx_len,&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* salt */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;secret, secret_len, //(32 | KEYLOADED_FLAG),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hkdf_label, hkdf_label_len,&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buf, (int)sizeof(buf));&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // output key&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;~&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;</description>
    <pubDate>Sun, 22 Jun 2025 04:08:06 GMT</pubDate>
    <dc:creator>Changhawn</dc:creator>
    <dc:date>2025-06-22T04:08:06Z</dc:date>
    <item>
      <title>About HSE Key Export</title>
      <link>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2117685#M49971</link>
      <description>&lt;P&gt;Hi.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am implementing TLS 1.3 on NXP S32K314 Platform.&lt;/P&gt;&lt;P&gt;During the TLS handshake process, a SHARED SECRET is generated for hashing through HSE_GenerateDhSharedSecret() using the server's shared key and private key.&lt;/P&gt;&lt;P&gt;Can I extract the shared secret raw data through the created shared secret key handle?&lt;/P&gt;&lt;P&gt;When I export the shared secret key handle through HSE_ExportKey(), an HSE_SRV_RSP_NOT_ALLOWED error occurs. I need the shared secret key, not the key handle.&lt;/P&gt;&lt;P&gt;If it is not possible in HSE, please guide me on how to do this.&lt;/P&gt;&lt;P&gt;Below is debuggin code about this.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;static psa_status_t hse_psa_raw_key_agreement(&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; psa_algorithm_t alg, psa_key_id_t private_key,&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const uint8_t *peer_key, size_t peer_key_length,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint8_t *output, size_t output_size, size_t *output_length)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; int ret = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint8_t hseEccCurveId = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; KeymgmtErrCodeT err;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; key_import_param_t key_import_param_shared;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvResponse_t srvResponse = HSE_SRV_RSP_GENERAL_ERROR;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseKeyHandle_t peerKeyhandle = HSE_INVALID_KEY_HANDLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseKeyHandle_t sharedSecretKeyHandle = HSE_INVALID_KEY_HANDLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; psa_status_t status = PSA_SUCCESS;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hseKeyInfo_t reqKeyInfo = {0};&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Validate input parameters&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (peer_key == NULL || output == NULL || output_length == NULL)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return PSA_ERROR_INVALID_ARGUMENT;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Only support ECDH algorithm for now&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (alg != PSA_ALG_ECDH)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return PSA_ERROR_NOT_SUPPORTED;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Get private key attributes to determine curve&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; status = psa_get_key_attributes(private_key, &amp;amp;key_attributes);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (status != PSA_SUCCESS)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return status;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // PSA Key attribute&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; psa_key_type_t key_type = psa_get_key_type(&amp;amp;key_attributes);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; size_t key_bits = psa_get_key_bits(&amp;amp;key_attributes);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // check the algorithm&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (!PSA_ALG_IS_ECDH(alg))&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return PSA_ERROR_NOT_SUPPORTED;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseEccCurveId = HSE_EC_SEC_SECP521R1;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Import peer Public Key&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; ret = hse_import_psa_public_key(peer_key, peer_key_length,&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hseEccCurveId, &amp;amp;peerKeyhandle);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (ret != 0)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return PSA_ERROR_INVALID_ARGUMENT;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; memset(&amp;amp;key_import_param_shared, 0x00, sizeof(key_import_param_t));&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Allocate the Slot for shared secret Key&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; key_import_param_shared.key_type = HSE_KEY_TYPE_SHARED_SECRET;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; key_import_param_shared.key_catalog = HSE_KEY_CATALOG_ID_RAM;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; key_import_param_shared.key_param.sym_key_param.size = 521; //key_bits;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; //key_import_param_shared.key_flag = HSE_KF_USAGE_SIGN | HSE_KF_USAGE_VERIFY | HSE_KF_USAGE_EXCHANGE | HSE_KF_ACCESS_EXPORTABLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; key_import_param_shared.key_flag = HSE_KF_USAGE_EXCHANGE | HSE_KF_ACCESS_EXPORTABLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* key_import_param_shared.key_param.ecc_pubkey_param.size = key_bits / 8; */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; err = KeystoreMgmt_FindAllocateSlot(&amp;amp;key_import_param_shared, &amp;amp;sharedSecretKeyHandle);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (KEYMGMT_ERR_SUCCESS != err)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status = PSA_ERROR_HARDWARE_FAILURE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto cleanup;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Create EDCH Shared secret key handle&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; srvResponse = HSE_GenerateDhSharedSecret(private_key, peerKeyhandle, sharedSecretKeyHandle);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Check the response */&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;switch(srvResponse)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case HSE_SRV_RSP_OK:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;__printf("\nPrivate keyHandle 0x%02x | Peer KeyHandle : 0x%02x |"&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;" Shared Secret KeyHandle 0x%02x\r\n", private_key, peerKeyhandle, sharedSecretKeyHandle );&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Copy shared secret key handle to Shared secret mpi z */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//ret = mbedtls_mpi_lset(output, (mbedtls_mpi_sint)sharedSecretKeyHandle );&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Copy shared secret key handle to Shared secret mpi z */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srvResponse = HSE_GetKeyInfo(sharedSecretKeyHandle, &amp;amp;reqKeyInfo);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("keyFlags : 0x%x\r\n", reqKeyInfo.keyFlags);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("keyBitLen : 0x%x\r\n", reqKeyInfo.keyBitLen);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("keyCounter : 0x%x\r\n", reqKeyInfo.keyCounter);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("keyType : 0x%x\r\n", reqKeyInfo.keyType);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("eccCurveId : 0x%x\r\n", reqKeyInfo.specific.eccCurveId);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(reqKeyInfo.keyFlags &amp;amp; HSE_KF_ACCESS_EXPORTABLE)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s: target key is exportable\r\n", __func__);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #ifdef GEN2_USING_SRAM_BUFF_FOR_HSE&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uint8_t *output_data;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output_data = pvPortMalloc(output_size);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (output_data)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = HSE_ExportKey(sharedSecretKeyHandle, &amp;amp;reqKeyInfo, output_data, output_size, NULL, 0UL, NULL, 0U);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //ret = HSE_ExportEccPubKey(sharedSecretKeyHandle, HSE_EC_SEC_SECP521R1, output_size, output_data);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(ret == HSE_SRV_RSP_OK)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; memcpy(output, output_data, output_size);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *output_length = output_size;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vPortFree(output_data);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = HSE_SRV_RSP_MEMORY_FAILURE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #else&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = HSE_ExportKey(sharedSecretKeyHandle, NULL, output, output_size, NULL, 0UL, NULL, 0U);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #endif&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if(ret == HSE_SRV_RSP_OK)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s: shared secret output (%d bytes): ", __func__, output_length);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (size_t i = 0; i &amp;lt; output_length &amp;amp;&amp;amp; i &amp;lt; 16; i++) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%02x ", output[i]);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("\n");&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *output_length = key_bits / 8;&amp;nbsp; // Set proper output length&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status = PSA_SUCCESS;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s: Key export failed: 0x%x\r\n", __func__, ret);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status = PSA_ERROR_INVALID_ARGUMENT;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case HSE_SRV_RSP_INVALID_PARAM:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status = PSA_ERROR_INVALID_ARGUMENT;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;default:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status = PSA_ERROR_HARDWARE_FAILURE;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;cleanup:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (peerKeyhandle != HSE_INVALID_KEY_HANDLE) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nxp_hse_ecc_unloadkey(peerKeyhandle);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; return status;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;</description>
      <pubDate>Tue, 17 Jun 2025 10:35:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2117685#M49971</guid>
      <dc:creator>Changhawn</dc:creator>
      <dc:date>2025-06-17T10:35:52Z</dc:date>
    </item>
    <item>
      <title>Re: About HSE Key Export</title>
      <link>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2118502#M50026</link>
      <description>&lt;P&gt;Dear NXP Engineer.&lt;/P&gt;&lt;P&gt;When I get the shared secret, that is, when I get the shared secret handle value,&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;is there a way to know the shared secret string?&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;STRONG&gt;Which key type can export the key?&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&lt;SPAN&gt;HSE_KEY_TYPE_SHARED_SECRET is not possbile.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;HSE_KEY_TYPE_HMAC is also not possible.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;If there is, I think I can export it by deriving and copying the key.&lt;BR /&gt;When I do that with hmac, HSE_SRV_RSP_NOT_ALLOWED is printed.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;It seems like an important technology or something that HSE should support, but I don't know how to implement it.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;thank you.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 18 Jun 2025 10:48:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2118502#M50026</guid>
      <dc:creator>Changhawn</dc:creator>
      <dc:date>2025-06-18T10:48:32Z</dc:date>
    </item>
    <item>
      <title>Re: About HSE Key Export</title>
      <link>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2118566#M50029</link>
      <description>&lt;P&gt;The error HSE_SRV_RSP_NOT_ALLOWED typically indicates that the operation is not permitted by the HSE firmware, even if the key is marked as exportable. This could be due to:&lt;/P&gt;
&lt;P&gt;- HSE policy restrictions on exporting certain key types (e.g., shared secrets).&lt;BR /&gt;- Key usage flags not being sufficient or properly configured.&lt;BR /&gt;- Security level or lifecycle state of the device not allowing export.&lt;/P&gt;</description>
      <pubDate>Wed, 18 Jun 2025 12:37:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2118566#M50029</guid>
      <dc:creator>davidtosenovjan</dc:creator>
      <dc:date>2025-06-18T12:37:12Z</dc:date>
    </item>
    <item>
      <title>Re: About HSE Key Export</title>
      <link>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2120924#M50123</link>
      <description>&lt;P&gt;Dear&lt;/P&gt;&lt;P&gt;In the Below above, when using EXPAND(HSE_KDF_ALGO_HKDF_EXPAND) among HSE's KDF Services(HSE_HKDFExpand), why does HSE return HSE_SRV_RSP_INVALID_ID_PARAM?&lt;/P&gt;&lt;P&gt;Could you give me an example program for the case where the KDF algorithm is HSE_KDF_ALGO_HKDF_EXPAND?&lt;/P&gt;&lt;P&gt;Thank you.&lt;/P&gt;&lt;P&gt;Chang&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;hseSrvResponse_t HSE_HKDFExpand&lt;/DIV&gt;&lt;DIV&gt;(&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseHKDF_ExpandScheme_t *pKdfScheme&lt;/DIV&gt;&lt;DIV&gt;)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint8_t u8MuChannel;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvResponse_t srvResponse = HSE_SRV_RSP_GENERAL_ERROR;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Get a free channel on u8MuInstance */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; u8MuChannel = Hse_Ip_GetFreeChannel(APP_MU_INSTANCE_U8);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if(HSE_IP_INVALID_MU_CHANNEL_U8 == u8MuChannel)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto exit;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvDescriptor_t *pHseSrvDesc = &amp;amp;Hse_aSrvDescriptor[u8MuChannel];&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseKeyDeriveSrv_t* pDeriveKeySrv = &amp;amp;(pHseSrvDesc-&amp;gt;hseSrv.keyDeriveReq);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; memset(pHseSrvDesc, 0, sizeof(hseSrvDescriptor_t));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Prepare Descriptor */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pHseSrvDesc-&amp;gt;srvId = HSE_SRV_ID_KEY_DERIVE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;kdfAlgo = HSE_KDF_ALGO_HKDF_EXPAND;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Set KDF common parameters */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.srcKeyHandle = pKdfScheme-&amp;gt;kdfCommon.srcKeyHandle;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.targetKeyHandle = pKdfScheme-&amp;gt;kdfCommon.targetKeyHandle;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.keyMatLen = pKdfScheme-&amp;gt;kdfCommon.keyMatLen;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.kdfPrf = pKdfScheme-&amp;gt;kdfCommon.kdfPrf;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.prfAlgo = pKdfScheme-&amp;gt;kdfCommon.prfAlgo;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.infoLength = pKdfScheme-&amp;gt;kdfCommon.infoLength;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.kdfCommon.pInfo = pKdfScheme-&amp;gt;kdfCommon.pInfo;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; pDeriveKeySrv-&amp;gt;sch.HKDF_Expand.pIvOutput = pKdfScheme-&amp;gt;pIvOutput;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Build the request to be sent to Hse Ip layer */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; HseIp_aRequest[u8MuChannel].eReqType = HSE_IP_REQTYPE_SYNC;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; HseIp_aRequest[u8MuChannel].u32Timeout = TIMEOUT_TICKS_U32;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Send request to HSE */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; srvResponse = Hse_Ip_ServiceRequest(APP_MU_INSTANCE_U8, MU_CH1, &amp;amp;HseIp_aRequest[u8MuChannel], pHseSrvDesc);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;exit:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; return srvResponse;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int nxp_hse_tls13_hkdf_expand_label(mbedtls_md_type_t md_type, hseKeyHandle_t secret_key_handle,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; const unsigned char *label, size_t label_len, unsigned char *buf, size_t buf_len)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; int ret = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseSrvResponse_t hse_result;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseHmacPrfAlgo_t&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hmacHash;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // HSE HKDF-Expand parameter setting&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hseHKDF_ExpandScheme_t hkdf_scheme = {0};&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;switch(md_type)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case MBEDTLS_MD_SHA256:&amp;nbsp; &amp;nbsp; /**&amp;lt; The SHA-256 message digest. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hmacHash = HSE_KDF_SHA2_256;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case MBEDTLS_MD_SHA384:&amp;nbsp; &amp;nbsp; /**&amp;lt; The SHA-384 message digest. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hmacHash = HSE_KDF_SHA2_384;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;case MBEDTLS_MD_SHA512:&amp;nbsp; &amp;nbsp; /**&amp;lt; The SHA-512 message digest. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;hmacHash = HSE_KDF_SHA2_512;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;default:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("HASH algorithm 0x%02x not supported", md_type));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ret = MBEDTLS_ERR_SSL_INVALID_MAC;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;goto exit;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Check if Key handle is valid&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (secret_key_handle == HSE_INVALID_KEY_HANDLE) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid source key handle"));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto exit;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (buf_len == 0 || buf_len &amp;gt; 1024) {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid output length: %zu", buf_len));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto exit;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.srcKeyHandle = secret_key_handle;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.targetKeyHandle = HSE_INVALID_KEY_HANDLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.keyMatLen = (uint16_t)buf_len;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.kdfPrf = HSE_KDF_PRF_HMAC;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.prfAlgo.hmacHash = hmacHash;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.infoLength = (uint32_t)label_len;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.kdfCommon.pInfo = HSE_PTR_TO_HOST_ADDR(label);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hkdf_scheme.pIvOutput = HSE_PTR_TO_HOST_ADDR(buf);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; hse_result = HSE_HKDFExpand(&amp;amp;hkdf_scheme);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (hse_result != HSE_SRV_RSP_OK) {&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;NXP_HSE_MBEDTLS_SSL_DEBUG_MSG(1, ("HSE_HKDFExpand is failed 0x%02x", hse_result));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;goto exit;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;exit:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; return ret;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;session_key_exchange()&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;~&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Secret is key handle */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if (sizeof(secret) == sizeof(hseKeyHandle_t))&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s secret is key handle(%s) label_len(%d), ctx_len(%d), buf_len(%d)\r\n", __func__, hkdf_label, label_len, ctx_len, buf_len);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* secret should be key handle value */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc = nxp_hse_tls13_hkdf_expand_label(MBEDTLS_MD_SHA512, secret, hkdf_label, hkdf_label_len, buf, buf_len );&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; else /* secret is key value */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; {&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __printf("%s secret is key raw data\n", __func__);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc = mbedtls_hkdf(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NULL, 0,&amp;nbsp; &amp;nbsp; &amp;nbsp;//ctx, ctx_len,&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* salt */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;secret, secret_len, //(32 | KEYLOADED_FLAG),&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hkdf_label, hkdf_label_len,&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buf, (int)sizeof(buf));&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // output key&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;~&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;</description>
      <pubDate>Sun, 22 Jun 2025 04:08:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/About-HSE-Key-Export/m-p/2120924#M50123</guid>
      <dc:creator>Changhawn</dc:creator>
      <dc:date>2025-06-22T04:08:06Z</dc:date>
    </item>
  </channel>
</rss>

