<?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>Secure Authentication中的主题 Re: How to Store KEK and Use Wrapped DEK using SSS API on SE051</title>
    <link>https://community.nxp.com/t5/Secure-Authentication/How-to-Store-KEK-and-Use-Wrapped-DEK-using-SSS-API-on-SE051/m-p/2409114#M2134</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/265995"&gt;@Fjk&lt;/a&gt;&amp;nbsp;,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for the reaching out! Please have my comments as below:&lt;/P&gt;
&lt;P&gt;Q1: Implementation Method &amp;amp; API Guidance:&lt;/P&gt;
&lt;P&gt;What is the recommended SSS API implementation method to execute this end-to-end workflow without revealing the plain DEK to the host?&lt;/P&gt;
&lt;P class="p8i6j01 paragraph"&gt;The correct approach uses a two-layer API strategy:&lt;/P&gt;
&lt;UL class="p8i6j07 p8i6j02"&gt;
&lt;LI class="p8i6j0a"&gt;&lt;STRONG&gt;Key management&lt;/STRONG&gt; (KEK store, DEK wrap/unwrap): Use &lt;CODE class="p8i6j0f"&gt;Se05x_API_ExportObject()&lt;/CODE&gt; / &lt;CODE class="p8i6j0f"&gt;Se05x_API_ImportObject()&lt;/CODE&gt; from &lt;CODE class="p8i6j0f"&gt;se05x_APDU_apis.h&lt;/CODE&gt;. These operate entirely inside the SE051 and are the only way to wrap/unwrap a key using another key stored in SE051 without ever revealing plaintext to the host.&lt;/LI&gt;
&lt;LI class="p8i6j0a"&gt;&lt;STRONG&gt;File encryption/decryption&lt;/STRONG&gt;: Use &lt;CODE class="p8i6j0f"&gt;sss_cipher_one_go()&lt;/CODE&gt; (or &lt;CODE class="p8i6j0f"&gt;sss_cipher_init&lt;/CODE&gt; + &lt;CODE class="p8i6j0f"&gt;sss_cipher_update&lt;/CODE&gt; + &lt;CODE class="p8i6j0f"&gt;sss_cipher_finish&lt;/CODE&gt; for large files) against the transient DEK object created by the import step above.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="p8i6j01 paragraph"&gt;The SSS high-level layer (&lt;CODE class="p8i6j0f"&gt;sss_key_store_set_key&lt;/CODE&gt;) &lt;STRONG&gt;cannot&lt;/STRONG&gt; be used for DEK import-from-wrapped, because it always requires the key in plaintext on the host side. The APDU-level &lt;CODE class="p8i6j0f"&gt;Se05x_API_ImportObject&lt;/CODE&gt; is required for the unwrap step to remain fully inside SE051.&lt;/P&gt;
&lt;P class="p8i6j01 paragraph"&gt;Q2 : Key Unwrapping &amp;amp; Transient Objects:&lt;/P&gt;
&lt;P class="p8i6j01 paragraph"&gt;What specific SSS APIs and policies are required to import a Wrapped DEK, unwrap it within SE051, and hold it as a transient key object for immediate file encryption/decryption?&lt;/P&gt;
&lt;H4 class="_9k2iva0 p8i6j0c _1ibi0s314 heading4 _9k2iva1"&gt;Phase 1: Key Provisioning &amp;amp; Wrapping&lt;/H4&gt;
&lt;P class="p8i6j01 paragraph"&gt;&lt;STRONG&gt;Step 1 — Store the KEK as a persistent object:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Policy for KEK: allow ENC/DEC and IMPORT_EXPORT (for use as wrapping key)&lt;BR /&gt;sss_policy_u kekPolicyList[] = {&lt;BR /&gt;{ .type = KPolicy_Sym_Key,&lt;BR /&gt;.policy = { .symmkey = { .can_Encrypt = 1, .can_Decrypt = 1,&lt;BR /&gt;.can_Import_Export = 1 } } }&lt;BR /&gt;};&lt;BR /&gt;sss_policy_t kekPolicy = { .nPolicies = 1, .policies = kekPolicyList };&lt;/P&gt;
&lt;P&gt;sss_object_t kekObject = {0};&lt;BR /&gt;sss_key_object_init(&amp;amp;kekObject, &amp;amp;pCtx-&amp;gt;ks);&lt;BR /&gt;sss_key_object_allocate_handle(&amp;amp;kekObject, KEK_KEY_ID,&lt;BR /&gt;kSSS_KeyPart_Default, kSSS_CipherType_AES,&lt;BR /&gt;AES256_KEY_BYTES, kKeyObject_Mode_Persistent);&lt;BR /&gt;sss_key_store_set_key(&amp;amp;pCtx-&amp;gt;ks, &amp;amp;kekObject,&lt;BR /&gt;kekData, kekLen, kekLen * 8, &amp;amp;kekPolicy, sizeof(kekPolicy));&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 2 — Import the plain DEK into SE051 as a transient object:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Policy for DEK: allow ENC/DEC and IMPORT_EXPORT (so it can be wrapped for export)&lt;BR /&gt;sss_policy_u dekPolicyList[] = {&lt;BR /&gt;{ .type = KPolicy_Sym_Key,&lt;BR /&gt;.policy = { .symmkey = { .can_Encrypt = 1, .can_Decrypt = 1,&lt;BR /&gt;.can_Import_Export = 1 } } }&lt;BR /&gt;};&lt;BR /&gt;sss_policy_t dekPolicy = { .nPolicies = 1, .policies = dekPolicyList };&lt;/P&gt;
&lt;P&gt;sss_object_t dekObject = {0};&lt;BR /&gt;sss_key_object_init(&amp;amp;dekObject, &amp;amp;pCtx-&amp;gt;ks);&lt;BR /&gt;sss_key_object_allocate_handle(&amp;amp;dekObject, DEK_TEMP_ID,&lt;BR /&gt;kSSS_KeyPart_Default, kSSS_CipherType_AES,&lt;BR /&gt;AES256_KEY_BYTES, kKeyObject_Mode_Transient);&lt;BR /&gt;sss_key_store_set_key(&amp;amp;pCtx-&amp;gt;ks, &amp;amp;dekObject,&lt;BR /&gt;plainDEK, dekLen, dekLen * 8, &amp;amp;dekPolicy, sizeof(dekPolicy));&lt;BR /&gt;// plainDEK is the ONLY moment the DEK appears on the host — during initial provisioning only&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 3 — Export the DEK wrapped by the KEK (entirely inside SE051):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Se05x_API_ExportObject wraps DEK_TEMP_ID using KEK_KEY_ID — no plaintext leaves SE051&lt;BR /&gt;uint8_t wrappedDEK[AES256_KEY_BYTES + 8]; // RFC 3394 adds 8 bytes overhead&lt;BR /&gt;size_t wrappedDEKLen = sizeof(wrappedDEK);&lt;/P&gt;
&lt;P&gt;pSe05xSession_t se05xSession =&lt;BR /&gt;&amp;amp;((sss_se05x_session_t *)&amp;amp;pCtx-&amp;gt;session)-&amp;gt;s_ctx;&lt;/P&gt;
&lt;P&gt;Se05x_API_ExportObject(se05xSession,&lt;BR /&gt;DEK_TEMP_ID, // Object to wrap (the transient DEK)&lt;BR /&gt;kSE05x_TransientIndicator_TRANSIENT,&lt;BR /&gt;wrappedDEK,&lt;BR /&gt;&amp;amp;wrappedDEKLen);&lt;BR /&gt;// Store wrappedDEK to host persistent storage — safe, never reveals plaintext DEK&lt;/P&gt;
&lt;P&gt;//Please note&amp;nbsp;The transient &lt;CODE class="p8i6j0f"&gt;DEK_TEMP_ID&lt;/CODE&gt; object is automatically deleted when the session closes. After exporting the wrapped DEK, the plain DEK is gone from SE051.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 2: Runtime File Protection:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 4 — Import wrapped DEK: SE051 unwraps internally using KEK, stores as transient:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Se05x_API_ImportObject unwraps the wrapped DEK using KEK_KEY_ID INSIDE SE051&lt;BR /&gt;// The DEK never appears in plaintext on the host — this is the key security guarantee&lt;BR /&gt;Se05x_API_ImportObject(se05xSession,&lt;BR /&gt;DEK_RUNTIME_ID, // Target object ID for the unwrapped DEK&lt;BR /&gt;kSE05x_RSAKeyComponent_NA, // N/A for symmetric keys&lt;BR /&gt;NULL, // Use default policy&lt;BR /&gt;0,&lt;BR /&gt;wrappedDEK, // Wrapped DEK from host storage&lt;BR /&gt;wrappedDEKLen,&lt;BR /&gt;kSE05x_TransientIndicator_TRANSIENT, // Store as transient — clears on session end&lt;BR /&gt;KEK_KEY_ID); // SE051 uses this key to unwrap internally&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 5 — Encrypt/Decrypt the file using the transient DEK:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Get handle to the now-unwrapped transient DEK&lt;BR /&gt;sss_object_t dekTransient = {0};&lt;BR /&gt;sss_key_object_init(&amp;amp;dekTransient, &amp;amp;pCtx-&amp;gt;ks);&lt;BR /&gt;sss_key_object_get_handle(&amp;amp;dekTransient, DEK_RUNTIME_ID);&lt;/P&gt;
&lt;P&gt;// Encrypt&lt;BR /&gt;sss_symmetric_t ctxEncrypt = {0};&lt;BR /&gt;sss_symmetric_context_init(&amp;amp;ctxEncrypt, &amp;amp;pCtx-&amp;gt;session, &amp;amp;dekTransient,&lt;BR /&gt;kAlgorithm_SSS_AES_CBC, kMode_SSS_Encrypt);&lt;BR /&gt;sss_cipher_one_go(&amp;amp;ctxEncrypt, iv, ivLen,&lt;BR /&gt;plainFileData, encryptedFileData, dataLen);&lt;BR /&gt;sss_symmetric_context_free(&amp;amp;ctxEncrypt);&lt;/P&gt;
&lt;P&gt;// Decrypt (same pattern, change mode to kMode_SSS_Decrypt)&lt;BR /&gt;sss_symmetric_t ctxDecrypt = {0};&lt;BR /&gt;sss_symmetric_context_init(&amp;amp;ctxDecrypt, &amp;amp;pCtx-&amp;gt;session, &amp;amp;dekTransient,&lt;BR /&gt;kAlgorithm_SSS_AES_CBC, kMode_SSS_Decrypt);&lt;BR /&gt;sss_cipher_one_go(&amp;amp;ctxDecrypt, iv, ivLen,&lt;BR /&gt;encryptedFileData, decryptedFileData, dataLen);&lt;BR /&gt;sss_symmetric_context_free(&amp;amp;ctxDecrypt);&lt;/P&gt;
&lt;P&gt;// Explicitly erase transient DEK after use (optional, also cleared on session close)&lt;BR /&gt;sss_key_store_erase_key(&amp;amp;pCtx-&amp;gt;ks, &amp;amp;dekTransient);&lt;BR /&gt;sss_key_object_free(&amp;amp;dekTransient);&lt;/P&gt;
&lt;P&gt;Q3: Reference Code:&lt;/P&gt;
&lt;P&gt;Are there any code samples in Plug &amp;amp; Trust MW v04.00.00 that demonstrate key wrapping/unwrapping combined with symmetric encryption operations inside SE051?&lt;/P&gt;
&lt;P&gt;There is no single example that combines key wrapping + symmetric encryption end-to-end, but the following examples should be helpful.&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH scope="col"&gt;Purpose&lt;/TH&gt;
&lt;TH scope="col"&gt;Path in simw-top/&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;AES symmetric encrypt/decrypt&lt;/TD&gt;
&lt;TD&gt;sss/ex/symmetric/ex_sss_symmetric.c&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Using object policies&lt;/TD&gt;
&lt;TD&gt;demos/se05x/se05x_policy/&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Key export/import at APDU level&lt;/TD&gt;
&lt;TD&gt;hostlib/hostLib/se05x/src/se05x_APDU_apis.c&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hope that helps,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Have a great day,&lt;BR /&gt;Kan&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;-------------------------------------------------------------------------------&lt;BR /&gt;Note:&lt;BR /&gt;- If this post answers your question, please click the "Mark Correct" button. Thank you!&lt;BR /&gt;- We are following threads for 7 weeks after the last post, later replies are ignored&lt;BR /&gt;Please open a new thread and refer to the closed one, if you have a related question at a later point in time.&lt;BR /&gt;-------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 28 Aug 2026 08:51:52 GMT</pubDate>
    <dc:creator>Kan_Li</dc:creator>
    <dc:date>2026-08-28T08:51:52Z</dc:date>
    <item>
      <title>How to Store KEK and Use Wrapped DEK using SSS API on SE051</title>
      <link>https://community.nxp.com/t5/Secure-Authentication/How-to-Store-KEK-and-Use-Wrapped-DEK-using-SSS-API-on-SE051/m-p/2409030#M2133</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I am currently evaluating the SE051 using the SSS API tool from the Plug &amp;amp; Trust Middleware, and I would appreciate your guidance on the correct implementation method for my use case.&lt;/P&gt;&lt;P&gt;Security Requirement &amp;amp; Goal:&lt;BR /&gt;To prevent key exposure on host memory, the Plain Data Encryption Key (DEK) must never be handled in plaintext on the Host (i.MX 8M) once it has been wrapped.&lt;BR /&gt;Therefore, my goal is to ensure that after initial wrapping, all key unwrapping and file encryption/decryption operations are executed entirely inside the SE051 without ever revealing the plain DEK to the host.&lt;/P&gt;&lt;P&gt;Target Workflow:&lt;BR /&gt;[ Phase 1: Key Provisioning &amp;amp; Wrapping ]&lt;BR /&gt;1. Store the Key Encryption Key (KEK) into SE051.&lt;BR /&gt;2. Import the Plain DEK to SE051, wrap it using KEK inside SE051, and export the Wrapped DEK to Host Storage.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1_Key_Provisioning_and_Wrapping.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/395469i727A83B2C66D0D78/image-size/medium?v=v2&amp;amp;px=400" role="button" title="1_Key_Provisioning_and_Wrapping.png" alt="1_Key_Provisioning_and_Wrapping.png" /&gt;&lt;span class="lia-inline-image-caption" onclick="event.preventDefault();"&gt;1_Key_Provisioning_and_Wrapping.png&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;[ Phase 2: Runtime File Protection ]&lt;BR /&gt;3. Send the Plain File and Wrapped DEK to SE051 -&amp;gt; SE051 unwraps the DEK internally and encrypts the file -&amp;gt; Output Encrypted File to Host.&lt;BR /&gt;4. Send the Encrypted File and Wrapped DEK to SE051 -&amp;gt; SE051 unwraps the DEK internally and decrypts the file -&amp;gt; Output Plain File to Host.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2_Runtime_File_Protection.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/395470iBE41B1A9B3F3B463/image-size/medium?v=v2&amp;amp;px=400" role="button" title="2_Runtime_File_Protection.png" alt="2_Runtime_File_Protection.png" /&gt;&lt;span class="lia-inline-image-caption" onclick="event.preventDefault();"&gt;2_Runtime_File_Protection.png&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;(Please refer to the attached sequence diagram for details).&lt;/P&gt;&lt;P&gt;Questions:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Implementation Method &amp;amp; API Guidance:&lt;BR /&gt;What is the recommended SSS API implementation method to execute this end-to-end workflow without revealing the plain DEK to the host?&lt;/LI&gt;&lt;LI&gt;Key Unwrapping &amp;amp; Transient Objects:&lt;BR /&gt;What specific SSS APIs and policies are required to import a Wrapped DEK, unwrap it within SE051, and hold it as a transient key object for immediate file encryption/decryption?&lt;/LI&gt;&lt;LI&gt;Reference Code:&lt;BR /&gt;Are there any code samples in Plug &amp;amp; Trust MW v04.00.00 that demonstrate key wrapping/unwrapping combined with symmetric encryption operations inside SE051?&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Environment:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Board: MCIMX8M-WEVK and OM-SE051ARD&lt;/LI&gt;&lt;LI&gt;Linux version: 5.4.70-2.3.2+g8c73bc625c4d (SE-PLUG-TRUST-SD-CARD-IMAGE-IMX8M-NEW)&lt;/LI&gt;&lt;LI&gt;Plug &amp;amp; Trust MW version: v04.00.00&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Any guidance or example code snippets would be greatly appreciated.&lt;/P&gt;</description>
      <pubDate>Fri, 28 Aug 2026 00:38:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Secure-Authentication/How-to-Store-KEK-and-Use-Wrapped-DEK-using-SSS-API-on-SE051/m-p/2409030#M2133</guid>
      <dc:creator>Fjk</dc:creator>
      <dc:date>2026-08-28T00:38:38Z</dc:date>
    </item>
    <item>
      <title>Re: How to Store KEK and Use Wrapped DEK using SSS API on SE051</title>
      <link>https://community.nxp.com/t5/Secure-Authentication/How-to-Store-KEK-and-Use-Wrapped-DEK-using-SSS-API-on-SE051/m-p/2409114#M2134</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/265995"&gt;@Fjk&lt;/a&gt;&amp;nbsp;,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for the reaching out! Please have my comments as below:&lt;/P&gt;
&lt;P&gt;Q1: Implementation Method &amp;amp; API Guidance:&lt;/P&gt;
&lt;P&gt;What is the recommended SSS API implementation method to execute this end-to-end workflow without revealing the plain DEK to the host?&lt;/P&gt;
&lt;P class="p8i6j01 paragraph"&gt;The correct approach uses a two-layer API strategy:&lt;/P&gt;
&lt;UL class="p8i6j07 p8i6j02"&gt;
&lt;LI class="p8i6j0a"&gt;&lt;STRONG&gt;Key management&lt;/STRONG&gt; (KEK store, DEK wrap/unwrap): Use &lt;CODE class="p8i6j0f"&gt;Se05x_API_ExportObject()&lt;/CODE&gt; / &lt;CODE class="p8i6j0f"&gt;Se05x_API_ImportObject()&lt;/CODE&gt; from &lt;CODE class="p8i6j0f"&gt;se05x_APDU_apis.h&lt;/CODE&gt;. These operate entirely inside the SE051 and are the only way to wrap/unwrap a key using another key stored in SE051 without ever revealing plaintext to the host.&lt;/LI&gt;
&lt;LI class="p8i6j0a"&gt;&lt;STRONG&gt;File encryption/decryption&lt;/STRONG&gt;: Use &lt;CODE class="p8i6j0f"&gt;sss_cipher_one_go()&lt;/CODE&gt; (or &lt;CODE class="p8i6j0f"&gt;sss_cipher_init&lt;/CODE&gt; + &lt;CODE class="p8i6j0f"&gt;sss_cipher_update&lt;/CODE&gt; + &lt;CODE class="p8i6j0f"&gt;sss_cipher_finish&lt;/CODE&gt; for large files) against the transient DEK object created by the import step above.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="p8i6j01 paragraph"&gt;The SSS high-level layer (&lt;CODE class="p8i6j0f"&gt;sss_key_store_set_key&lt;/CODE&gt;) &lt;STRONG&gt;cannot&lt;/STRONG&gt; be used for DEK import-from-wrapped, because it always requires the key in plaintext on the host side. The APDU-level &lt;CODE class="p8i6j0f"&gt;Se05x_API_ImportObject&lt;/CODE&gt; is required for the unwrap step to remain fully inside SE051.&lt;/P&gt;
&lt;P class="p8i6j01 paragraph"&gt;Q2 : Key Unwrapping &amp;amp; Transient Objects:&lt;/P&gt;
&lt;P class="p8i6j01 paragraph"&gt;What specific SSS APIs and policies are required to import a Wrapped DEK, unwrap it within SE051, and hold it as a transient key object for immediate file encryption/decryption?&lt;/P&gt;
&lt;H4 class="_9k2iva0 p8i6j0c _1ibi0s314 heading4 _9k2iva1"&gt;Phase 1: Key Provisioning &amp;amp; Wrapping&lt;/H4&gt;
&lt;P class="p8i6j01 paragraph"&gt;&lt;STRONG&gt;Step 1 — Store the KEK as a persistent object:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Policy for KEK: allow ENC/DEC and IMPORT_EXPORT (for use as wrapping key)&lt;BR /&gt;sss_policy_u kekPolicyList[] = {&lt;BR /&gt;{ .type = KPolicy_Sym_Key,&lt;BR /&gt;.policy = { .symmkey = { .can_Encrypt = 1, .can_Decrypt = 1,&lt;BR /&gt;.can_Import_Export = 1 } } }&lt;BR /&gt;};&lt;BR /&gt;sss_policy_t kekPolicy = { .nPolicies = 1, .policies = kekPolicyList };&lt;/P&gt;
&lt;P&gt;sss_object_t kekObject = {0};&lt;BR /&gt;sss_key_object_init(&amp;amp;kekObject, &amp;amp;pCtx-&amp;gt;ks);&lt;BR /&gt;sss_key_object_allocate_handle(&amp;amp;kekObject, KEK_KEY_ID,&lt;BR /&gt;kSSS_KeyPart_Default, kSSS_CipherType_AES,&lt;BR /&gt;AES256_KEY_BYTES, kKeyObject_Mode_Persistent);&lt;BR /&gt;sss_key_store_set_key(&amp;amp;pCtx-&amp;gt;ks, &amp;amp;kekObject,&lt;BR /&gt;kekData, kekLen, kekLen * 8, &amp;amp;kekPolicy, sizeof(kekPolicy));&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 2 — Import the plain DEK into SE051 as a transient object:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Policy for DEK: allow ENC/DEC and IMPORT_EXPORT (so it can be wrapped for export)&lt;BR /&gt;sss_policy_u dekPolicyList[] = {&lt;BR /&gt;{ .type = KPolicy_Sym_Key,&lt;BR /&gt;.policy = { .symmkey = { .can_Encrypt = 1, .can_Decrypt = 1,&lt;BR /&gt;.can_Import_Export = 1 } } }&lt;BR /&gt;};&lt;BR /&gt;sss_policy_t dekPolicy = { .nPolicies = 1, .policies = dekPolicyList };&lt;/P&gt;
&lt;P&gt;sss_object_t dekObject = {0};&lt;BR /&gt;sss_key_object_init(&amp;amp;dekObject, &amp;amp;pCtx-&amp;gt;ks);&lt;BR /&gt;sss_key_object_allocate_handle(&amp;amp;dekObject, DEK_TEMP_ID,&lt;BR /&gt;kSSS_KeyPart_Default, kSSS_CipherType_AES,&lt;BR /&gt;AES256_KEY_BYTES, kKeyObject_Mode_Transient);&lt;BR /&gt;sss_key_store_set_key(&amp;amp;pCtx-&amp;gt;ks, &amp;amp;dekObject,&lt;BR /&gt;plainDEK, dekLen, dekLen * 8, &amp;amp;dekPolicy, sizeof(dekPolicy));&lt;BR /&gt;// plainDEK is the ONLY moment the DEK appears on the host — during initial provisioning only&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 3 — Export the DEK wrapped by the KEK (entirely inside SE051):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Se05x_API_ExportObject wraps DEK_TEMP_ID using KEK_KEY_ID — no plaintext leaves SE051&lt;BR /&gt;uint8_t wrappedDEK[AES256_KEY_BYTES + 8]; // RFC 3394 adds 8 bytes overhead&lt;BR /&gt;size_t wrappedDEKLen = sizeof(wrappedDEK);&lt;/P&gt;
&lt;P&gt;pSe05xSession_t se05xSession =&lt;BR /&gt;&amp;amp;((sss_se05x_session_t *)&amp;amp;pCtx-&amp;gt;session)-&amp;gt;s_ctx;&lt;/P&gt;
&lt;P&gt;Se05x_API_ExportObject(se05xSession,&lt;BR /&gt;DEK_TEMP_ID, // Object to wrap (the transient DEK)&lt;BR /&gt;kSE05x_TransientIndicator_TRANSIENT,&lt;BR /&gt;wrappedDEK,&lt;BR /&gt;&amp;amp;wrappedDEKLen);&lt;BR /&gt;// Store wrappedDEK to host persistent storage — safe, never reveals plaintext DEK&lt;/P&gt;
&lt;P&gt;//Please note&amp;nbsp;The transient &lt;CODE class="p8i6j0f"&gt;DEK_TEMP_ID&lt;/CODE&gt; object is automatically deleted when the session closes. After exporting the wrapped DEK, the plain DEK is gone from SE051.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 2: Runtime File Protection:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 4 — Import wrapped DEK: SE051 unwraps internally using KEK, stores as transient:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Se05x_API_ImportObject unwraps the wrapped DEK using KEK_KEY_ID INSIDE SE051&lt;BR /&gt;// The DEK never appears in plaintext on the host — this is the key security guarantee&lt;BR /&gt;Se05x_API_ImportObject(se05xSession,&lt;BR /&gt;DEK_RUNTIME_ID, // Target object ID for the unwrapped DEK&lt;BR /&gt;kSE05x_RSAKeyComponent_NA, // N/A for symmetric keys&lt;BR /&gt;NULL, // Use default policy&lt;BR /&gt;0,&lt;BR /&gt;wrappedDEK, // Wrapped DEK from host storage&lt;BR /&gt;wrappedDEKLen,&lt;BR /&gt;kSE05x_TransientIndicator_TRANSIENT, // Store as transient — clears on session end&lt;BR /&gt;KEK_KEY_ID); // SE051 uses this key to unwrap internally&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 5 — Encrypt/Decrypt the file using the transient DEK:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;// Get handle to the now-unwrapped transient DEK&lt;BR /&gt;sss_object_t dekTransient = {0};&lt;BR /&gt;sss_key_object_init(&amp;amp;dekTransient, &amp;amp;pCtx-&amp;gt;ks);&lt;BR /&gt;sss_key_object_get_handle(&amp;amp;dekTransient, DEK_RUNTIME_ID);&lt;/P&gt;
&lt;P&gt;// Encrypt&lt;BR /&gt;sss_symmetric_t ctxEncrypt = {0};&lt;BR /&gt;sss_symmetric_context_init(&amp;amp;ctxEncrypt, &amp;amp;pCtx-&amp;gt;session, &amp;amp;dekTransient,&lt;BR /&gt;kAlgorithm_SSS_AES_CBC, kMode_SSS_Encrypt);&lt;BR /&gt;sss_cipher_one_go(&amp;amp;ctxEncrypt, iv, ivLen,&lt;BR /&gt;plainFileData, encryptedFileData, dataLen);&lt;BR /&gt;sss_symmetric_context_free(&amp;amp;ctxEncrypt);&lt;/P&gt;
&lt;P&gt;// Decrypt (same pattern, change mode to kMode_SSS_Decrypt)&lt;BR /&gt;sss_symmetric_t ctxDecrypt = {0};&lt;BR /&gt;sss_symmetric_context_init(&amp;amp;ctxDecrypt, &amp;amp;pCtx-&amp;gt;session, &amp;amp;dekTransient,&lt;BR /&gt;kAlgorithm_SSS_AES_CBC, kMode_SSS_Decrypt);&lt;BR /&gt;sss_cipher_one_go(&amp;amp;ctxDecrypt, iv, ivLen,&lt;BR /&gt;encryptedFileData, decryptedFileData, dataLen);&lt;BR /&gt;sss_symmetric_context_free(&amp;amp;ctxDecrypt);&lt;/P&gt;
&lt;P&gt;// Explicitly erase transient DEK after use (optional, also cleared on session close)&lt;BR /&gt;sss_key_store_erase_key(&amp;amp;pCtx-&amp;gt;ks, &amp;amp;dekTransient);&lt;BR /&gt;sss_key_object_free(&amp;amp;dekTransient);&lt;/P&gt;
&lt;P&gt;Q3: Reference Code:&lt;/P&gt;
&lt;P&gt;Are there any code samples in Plug &amp;amp; Trust MW v04.00.00 that demonstrate key wrapping/unwrapping combined with symmetric encryption operations inside SE051?&lt;/P&gt;
&lt;P&gt;There is no single example that combines key wrapping + symmetric encryption end-to-end, but the following examples should be helpful.&lt;/P&gt;
&lt;TABLE&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH scope="col"&gt;Purpose&lt;/TH&gt;
&lt;TH scope="col"&gt;Path in simw-top/&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;AES symmetric encrypt/decrypt&lt;/TD&gt;
&lt;TD&gt;sss/ex/symmetric/ex_sss_symmetric.c&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Using object policies&lt;/TD&gt;
&lt;TD&gt;demos/se05x/se05x_policy/&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Key export/import at APDU level&lt;/TD&gt;
&lt;TD&gt;hostlib/hostLib/se05x/src/se05x_APDU_apis.c&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hope that helps,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Have a great day,&lt;BR /&gt;Kan&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;-------------------------------------------------------------------------------&lt;BR /&gt;Note:&lt;BR /&gt;- If this post answers your question, please click the "Mark Correct" button. Thank you!&lt;BR /&gt;- We are following threads for 7 weeks after the last post, later replies are ignored&lt;BR /&gt;Please open a new thread and refer to the closed one, if you have a related question at a later point in time.&lt;BR /&gt;-------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 28 Aug 2026 08:51:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Secure-Authentication/How-to-Store-KEK-and-Use-Wrapped-DEK-using-SSS-API-on-SE051/m-p/2409114#M2134</guid>
      <dc:creator>Kan_Li</dc:creator>
      <dc:date>2026-08-28T08:51:52Z</dc:date>
    </item>
  </channel>
</rss>

