[Infineon] Trust M Code clean up and improve crypto performance (#34310)

Details :
- Code clean up
- Improve crypto performance
- Minor bug fixes
diff --git a/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_P256_trustm.cpp b/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_P256_trustm.cpp
index 895b532..23856be 100644
--- a/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_P256_trustm.cpp
+++ b/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_P256_trustm.cpp
@@ -277,8 +277,7 @@
     size_t signature_trustm_len                               = sizeof(signature_trustm);
     MutableByteSpan out_der_sig_span(signature_trustm, signature_trustm_len);
 
-    uint8_t hash_length_u8            = static_cast<uint8_t>(hash_length);
-    uint16_t signature_trustm_len_u16 = static_cast<uint16_t>(signature_trustm_len);
+    uint8_t hash_length_u8 = static_cast<uint8_t>(hash_length);
 
     VerifyOrReturnError(hash != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
     VerifyOrReturnError(hash_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
@@ -292,7 +291,7 @@
 
     signature_trustm_len = out_der_sig_span.size();
     // ECC verify
-    return_status = trustm_ecdsa_verify((uint8_t *) hash, hash_length_u8, (uint8_t *) signature_trustm, signature_trustm_len_u16,
+    return_status = trustm_ecdsa_verify((uint8_t *) hash, hash_length_u8, (uint8_t *) signature_trustm, signature_trustm_len,
                                         (uint8_t *) bytes, (uint8_t) kP256_PublicKey_Length);
 
     VerifyOrExit(return_status == OPTIGA_LIB_SUCCESS, error = CHIP_ERROR_INTERNAL);
diff --git a/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_utils_trustm.cpp b/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_utils_trustm.cpp
index be25fd8..4623c3f 100644
--- a/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_utils_trustm.cpp
+++ b/src/platform/Infineon/crypto/trustm/CHIPCryptoPALHsm_utils_trustm.cpp
@@ -36,9 +36,9 @@
 #include "pal_os_timer.h"

 #include <FreeRTOS.h>

 

-optiga_crypt_t * p_local_crypt = NULL;

-optiga_util_t * p_local_util   = NULL;

-static bool trustm_isOpen      = false;

+optiga_crypt_t * me_crypt = NULL;

+optiga_util_t * me_util   = NULL;

+static bool trustm_isOpen = false;

 #define ENABLE_HMAC_MULTI_STEP (0)

 #define OPTIGA_UTIL_DER_BITSTRING_TAG (0x03)

 #define OPTIGA_UTIL_DER_NUM_UNUSED_BITS (0x00)

@@ -55,10 +55,7 @@
 

 void vApplicationTickHook(void);

 

-void vApplicationTickHook(void)

-{

-    pal_os_event_trigger_registered_callback();

-}

+void vApplicationTickHook(void) {}

 

 #define WAIT_FOR_COMPLETION(ret)                                                                                                   \

     if (OPTIGA_LIB_SUCCESS != ret)                                                                                                 \

@@ -67,9 +64,7 @@
     }                                                                                                                              \

     while (optiga_lib_status == OPTIGA_LIB_BUSY)                                                                                   \

     {                                                                                                                              \

-        pal_os_event_trigger_registered_callback();                                                                                \

     }                                                                                                                              \

-                                                                                                                                   \

     if (OPTIGA_LIB_SUCCESS != optiga_lib_status)                                                                                   \

     {                                                                                                                              \

         ret = optiga_lib_status;                                                                                                   \

@@ -113,7 +108,6 @@
 static bool init = false;

 void trustm_Open(void)

 {

-    optiga_lib_status_t xResult;

     uint16_t dOptigaOID = 0xE0C4;

     // Maximum Power, Minimum Current limitation

     uint8_t cCurrentLimit = 15;

@@ -123,75 +117,74 @@
         optiga_lib_status_t return_status;

         do

         {

-            /**

-             * 1. Create OPTIGA Crypt Instance

-             */

-            p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-            if (NULL == p_local_crypt)

+            // Create Optiga crypt instance

+            if (me_crypt == NULL)

             {

-                break;

+                me_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

+                if (NULL == me_crypt)

+                {

+                    break;

+                }

             }

-            // printf("trustm created crypt Instance \r\n");

-            /**

-             * 1. Create OPTIGA Util Instance

-             */

-            p_local_util = optiga_util_create(0, optiga_util_callback, NULL);

-            if (NULL == p_local_util)

+            else

             {

-                break;

+                printf("Error: me_crypt already initialised\n");

             }

-            // printf("trustm created util Instance \r\n");

+            // Create Optiga Util instance

+            if (me_util == NULL)

+            {

+                me_util = optiga_util_create(0, optiga_util_callback, NULL);

+                if (NULL == me_util)

+                {

+                    break;

+                }

+            }

+            else

+            {

+                printf("Error: me_crypt already initialised\n");

+            }

             /**

              * Open the application on OPTIGA which is a precondition to perform any other operations

              * using optiga_util_open_application

              */

             optiga_lib_status = OPTIGA_LIB_BUSY;

-            return_status     = optiga_util_open_application(p_local_util, 0); // skip restore

-            while (optiga_lib_status == OPTIGA_LIB_BUSY)

-

-                // Only run once for initialisation

-                if (init)

-                {

-                    xResult = optiga_util_write_data(p_local_util, dOptigaOID, OPTIGA_UTIL_WRITE_ONLY, 0, &cCurrentLimit, 1);

-

-                    if (OPTIGA_LIB_SUCCESS != xResult)

-                    {

-                        break;

-                    }

-                    while (optiga_lib_status == OPTIGA_LIB_BUSY)

-                        ;

-                    // Set init to true

-                    init = true;

-                }

-

+            return_status     = optiga_util_open_application(me_util, 0); // skip restore

             if (OPTIGA_LIB_SUCCESS != return_status)

             {

-                // optiga_util_open_application api returns error !!!

-                printf("optiga_util_open_application api returns error !!!\n");

+                printf("optiga_util_open_application api returns error %02X\n", return_status);

                 break;

             }

+            // Wait until the optiga_util_open_application is completed

+            WAIT_FOR_COMPLETION(return_status);

 

-            while (optiga_lib_status == OPTIGA_LIB_BUSY)

-                ;

-            if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

+            if (OPTIGA_LIB_SUCCESS != return_status)

             {

                 // optiga_util_open_application failed

                 printf("optiga_util_open_application failed\n");

                 break;

             }

+            trustm_isOpen = true;

 

-            // printf("trustm open application successful \r\n");

-

+            // Only run once for initialisation

+            if (!init)

+            {

+                optiga_lib_status = OPTIGA_LIB_BUSY;

+                return_status     = optiga_util_write_data(me_util, dOptigaOID, OPTIGA_UTIL_ERASE_AND_WRITE, 0, &cCurrentLimit, 1);

+                if (OPTIGA_LIB_SUCCESS != return_status)

+                {

+                    printf("optiga_util_write_data api returns error %02X\n", return_status);

+                    break;

+                }

+                WAIT_FOR_COMPLETION(return_status);

+                if (OPTIGA_LIB_SUCCESS != return_status)

+                {

+                    printf("optiga_util_write_data returns error\n");

+                    break;

+                }

+                // Set init to true

+                init = true;

+            }

         } while (0);

-

-        // p_local_util and p_local_crypt instance can be destroyed

-        // if no close_application w.r.t hibernate is required to be performed

-        if (p_local_util || p_local_crypt)

-        {

-            optiga_util_destroy(p_local_util);

-            optiga_crypt_destroy(p_local_crypt);

-        }

-        trustm_isOpen = true;

     }

 }

 

@@ -206,19 +199,28 @@
          * using optiga_util_close_application

          */

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status     = optiga_util_close_application(p_local_util, 0);

+        return_status     = optiga_util_close_application(me_util, 0);

         if (OPTIGA_LIB_SUCCESS != return_status)

-            break;

-

-        while (optiga_lib_status == OPTIGA_LIB_BUSY)

         {

-            pal_os_event_trigger_registered_callback();

+            printf("optiga_util_close_application api returns error %02X\n", return_status);

+            break;

+        }

+

+        WAIT_FOR_COMPLETION(return_status);

+

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_util_close_application failed

+            printf("optiga_util_close_application failed\n");

+            break;

         }

 

         // destroy util and crypt instances

-        optiga_util_destroy(p_local_util);

-        optiga_crypt_destroy(p_local_crypt);

+        optiga_util_destroy(me_util);

+        optiga_crypt_destroy(me_crypt);

         pal_os_event_destroy(NULL);

+        me_util       = NULL;

+        me_crypt      = NULL;

         trustm_isOpen = false;

         return_status = OPTIGA_LIB_SUCCESS;

     } while (0);

@@ -232,37 +234,25 @@
     uint16_t size_to_copy = 0;

     optiga_lib_status_t return_status;

 

-    optiga_util_t * me_util = NULL;

     uint8_t ifx_cert_hex[1024];

     uint16_t ifx_cert_hex_len = sizeof(ifx_cert_hex);

 

     do

     {

-        // Create an instance of optiga_util to read the certificate from OPTIGA.

-        me_util = optiga_util_create(0, optiga_util_callback, NULL);

-        if (!me_util)

-        {

-            optiga_lib_print_message("optiga_util_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

         optiga_lib_status = OPTIGA_LIB_BUSY;

         return_status     = optiga_util_read_data(me_util, optiga_oid, 0, ifx_cert_hex, &ifx_cert_hex_len);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_util_read_data api returns error !!!

-            optiga_lib_print_message("optiga_util_read_data api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_util_read_data api returns error %02X\n", return_status);

             break;

         }

-

-        while (optiga_lib_status == OPTIGA_LIB_BUSY)

-            ;

-        if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_util_read_data failed

-            optiga_lib_print_message("optiga_util_read_data failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_util_read_data returns error

+            printf("read_certificate_from_optiga failed\n");

             break;

         }

-

         // convert to PEM format

         // If the first byte is TLS Identity Tag, than we need to skip 9 first bytes

         offset_to_read = ifx_cert_hex[0] == 0xc0 ? 9 : 0;

@@ -292,113 +282,52 @@
         *cert_pem_length = offset_to_write + 27;

 

     } while (0);

-

-    // me_util instance to be destroyed

-    if (me_util)

-    {

-        optiga_util_destroy(me_util);

-    }

 }

+

 void write_data(uint16_t optiga_oid, const uint8_t * p_data, uint16_t length)

 {

-    optiga_util_t * me_util = NULL;

     optiga_lib_status_t return_status;

 

     do

     {

-        // Create an instance of optiga_util to open the application on OPTIGA.

-        me_util = optiga_util_create(0, optiga_util_callback, NULL);

-        if (!me_util)

-        {

-            optiga_lib_print_message("optiga_util_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         optiga_lib_status = OPTIGA_LIB_BUSY;

         return_status     = optiga_util_write_data(me_util, optiga_oid, OPTIGA_UTIL_ERASE_AND_WRITE, 0, p_data, length);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            if (OPTIGA_LIB_SUCCESS != return_status)

-            {

-                optiga_lib_print_message("optiga_util_wirte_data api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                         OPTIGA_UTIL_SERVICE_COLOR);

-                break;

-            }

+            printf("optiga_util_write_data api returns error %02X\n", return_status);

+            break;

+        }

+        WAIT_FOR_COMPLETION(return_status);

 

-            while (OPTIGA_LIB_BUSY == optiga_lib_status)

-            {

-                // Wait until the optiga_util_write_data operation is completed

-            }

-

-            if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

-            {

-                optiga_lib_print_message("optiga_util_write_data failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-                return_status = optiga_lib_status;

-                break;

-            }

-            else

-            {

-                optiga_lib_print_message("optiga_util_write_data successful", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            }

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            printf("write_data failed\n");

+            return_status = optiga_lib_status;

+            break;

         }

     } while (0);

-

-    // me_util instance can be destroyed

-    // if no close_application w.r.t hibernate is required to be performed

-    if (me_util)

-    {

-        optiga_util_destroy(me_util);

-    }

 }

 

 void write_metadata(uint16_t optiga_oid, const uint8_t * p_data, uint8_t length)

 {

-    optiga_util_t * me_util = NULL;

     optiga_lib_status_t return_status;

 

     do

     {

-        // Create an instance of optiga_util to open the application on OPTIGA.

-        me_util = optiga_util_create(0, optiga_util_callback, NULL);

-        if (!me_util)

-        {

-            optiga_lib_print_message("optiga_util_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         optiga_lib_status = OPTIGA_LIB_BUSY;

         return_status     = optiga_util_write_metadata(me_util, optiga_oid, p_data, length);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            if (OPTIGA_LIB_SUCCESS != return_status)

-            {

-                optiga_lib_print_message("optiga_util_wirte_data api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                         OPTIGA_UTIL_SERVICE_COLOR);

-                break;

-            }

-

-            while (OPTIGA_LIB_BUSY == optiga_lib_status)

-            {

-                // Wait until the optiga_util_write_metadata operation is completed

-            }

-

-            if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

-            {

-                optiga_lib_print_message("optiga_util_write_metadata failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-                return_status = optiga_lib_status;

-                break;

-            }

-            else

-            {

-                optiga_lib_print_message("optiga_util_write_metadata successful", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            }

+            printf("optiga_util_write_metadata api returns error %02X\n", return_status);

+            break;

+        }

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            printf("optiga_util_write_metadata failed\n");

+            break;

         }

     } while (0);

-

-    // me_util instance can be destroyed

-    // if no close_application w.r.t hibernate is required to be performed

-    if (me_util)

-    {

-        optiga_util_destroy(me_util);

-    }

 }

 

 optiga_lib_status_t deriveKey_HKDF(const uint8_t * salt, uint16_t salt_length, const uint8_t * info, uint16_t info_length,

@@ -408,39 +337,22 @@
 

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status     = optiga_crypt_hkdf(p_local_crypt, OPTIGA_HKDF_SHA_256, TRUSTM_HKDF_OID_KEY, /* Input secret OID */

+        return_status     = optiga_crypt_hkdf(me_crypt, OPTIGA_HKDF_SHA_256, TRUSTM_HKDF_OID_KEY, /* Input secret OID */

                                               salt, salt_length, info, info_length, derived_key_length, TRUE, derived_key);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_hkdf api returns error !!!

-            optiga_lib_print_message("optiga_crypt_hkdf api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_crypt_hkdf api returns error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

-        if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_hkdf failed

-            optiga_lib_print_message("optiga_crypt_hkdf failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_crypt_hkdf failed\n");

             break;

         }

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

 

@@ -451,25 +363,24 @@
 

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

-        return_status = OPTIGA_LIB_BUSY;

+        optiga_lib_status = OPTIGA_LIB_BUSY;

 #if ENABLE_HMAC_MULTI_STEP

         // If the size is less than the max length supported

         if (input_data_length <= MAX_MAC_DATA_LEN)

         {

-            return_status =

-                optiga_crypt_hmac(p_local_crypt, type, TRUSTM_HMAC_OID_KEY, input_data, input_data_length, mac, mac_length);

+            return_status = optiga_crypt_hmac(me_crypt, type, TRUSTM_HMAC_OID_KEY, input_data, input_data_length, mac, mac_length);

             if (OPTIGA_LIB_SUCCESS != return_status)

             {

-                // optiga_crypt_hmac api returns error !!!

-                optiga_lib_print_message("optiga_crypt_hmac api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+                // optiga_crypt_hmac returns error !!!

+                printf("optiga_crypt_hmac api error %02X\n", return_status);

+                break;

+            }

+

+            WAIT_FOR_COMPLETION(return_status);

+            if (OPTIGA_LIB_SUCCESS != return_status)

+            {

+                // optiga_crypt_hmac returns error !!!

+                printf("optiga_crypt_hmac returns error\n");

                 break;

             }

         }

@@ -479,13 +390,18 @@
             uint32_t dataLenTemp  = 0;

             uint32_t remainingLen = input_data_length;

             // Start the HMAC Operation

-            return_status = optiga_crypt_hmac_start(p_local_crypt, type, TRUSTM_HMAC_OID_KEY, input_data, MAX_MAC_DATA_LEN);

-

+            return_status = optiga_crypt_hmac_start(me_crypt, type, TRUSTM_HMAC_OID_KEY, input_data, MAX_MAC_DATA_LEN);

             if (OPTIGA_LIB_SUCCESS != return_status)

             {

-                // optiga_crypt_hmac_start api returns error !!!

-                optiga_lib_print_message("optiga_crypt_hmac_start api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                         OPTIGA_UTIL_SERVICE_COLOR);

+                // optiga_crypt_hmac returns error !!!

+                printf("optiga_crypt_hmac_start api error %02X\n", return_status);

+                break;

+            }

+            WAIT_FOR_COMPLETION(return_status);

+            if (OPTIGA_LIB_SUCCESS != return_status)

+            {

+                // optiga_crypt_hmac_start returns error !!!

+                printf("optiga_crypt_hmac_start returns error\n");

                 break;

             }

             remainingLen = input_data_length - MAX_MAC_DATA_LEN;

@@ -496,18 +412,21 @@
 

                 if (remainingLen > MAX_MAC_DATA_LEN)

                 {

-                    return_status = OPTIGA_LIB_BUSY;

-                    // printf("HMAC Update\n");

-                    // Continue HMAC operation on input data

+                    optiga_lib_status = OPTIGA_LIB_BUSY;

                     return_status =

-                        optiga_crypt_hmac_update(p_local_crypt, (input_data + (input_data_length - remainingLen)), dataLenTemp);

-                    remainingLen = remainingLen - dataLenTemp;

-

+                        optiga_crypt_hmac_update(me_crypt, (input_data + (input_data_length - remainingLen)), dataLenTemp);

                     if (OPTIGA_LIB_SUCCESS != return_status)

                     {

-                        // optiga_crypt_hmac_update api returns error !!!

-                        optiga_lib_print_message("optiga_crypt_hmac_update api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                                 OPTIGA_UTIL_SERVICE_COLOR);

+                        // optiga_crypt_hmac_update returns error !!!

+                        printf("optiga_crypt_hmac_update api error %02X\n", return_status);

+                        break;

+                    }

+                    WAIT_FOR_COMPLETION(return_status);

+                    remainingLen = remainingLen - dataLenTemp;

+                    if (OPTIGA_LIB_SUCCESS != return_status)

+                    {

+                        // optiga_crypt_hmac_update returns error !!!

+                        printf("optiga_crypt_hmac_update returns error\n");

                         break;

                     }

                 }

@@ -515,15 +434,20 @@
                 {

                     // End HMAC sequence and return the MAC generated

                     // printf("HMAC Finalize\n");

-                    return_status = OPTIGA_LIB_BUSY;

-                    return_status = optiga_crypt_hmac_finalize(p_local_crypt, (input_data + (input_data_length - remainingLen)),

-                                                               dataLenTemp, mac, mac_length);

-

+                    optiga_lib_status = OPTIGA_LIB_BUSY;

+                    return_status     = optiga_crypt_hmac_finalize(me_crypt, (input_data + (input_data_length - remainingLen)),

+                                                                   dataLenTemp, mac, mac_length);

                     if (OPTIGA_LIB_SUCCESS != return_status)

                     {

-                        // optiga_crypt_hmac_finalize api returns error !!!

-                        optiga_lib_print_message("optiga_crypt_hmac_finalize api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                                 OPTIGA_UTIL_SERVICE_COLOR);

+                        // optiga_crypt_hmac_finalize returns error !!!

+                        printf("optiga_crypt_hmac_finalize api error %02X\n", return_status);

+                        break;

+                    }

+                    WAIT_FOR_COMPLETION(return_status);

+                    if (OPTIGA_LIB_SUCCESS != return_status)

+                    {

+                        // optiga_crypt_hmac_finalize returns error !!!

+                        printf("optiga_crypt_hmac_finalize returns error\n");

                         break;

                     }

                 }

@@ -531,70 +455,48 @@
         }

 #else

 

-        return_status = optiga_crypt_hmac(p_local_crypt, type, TRUSTM_HMAC_OID_KEY, input_data, input_data_length, mac, mac_length);

-        // printf("Output Length %ld Input Length %ld \n", *mac_length, input_data_length);

+        return_status = optiga_crypt_hmac(me_crypt, type, TRUSTM_HMAC_OID_KEY, input_data, input_data_length, mac, mac_length);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_hmac api returns error !!!

-            optiga_lib_print_message("optiga_crypt_hmac api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_crypt_hmac returns error !!!

+            printf("optiga_crypt_hmac api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

-        if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_hkdf failed

-            optiga_lib_print_message("optiga_crypt_hkdf failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_crypt_hmac returns error !!!

+            printf("optiga_crypt_hmac returns error\n");

             break;

         }

 #endif

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

+

 optiga_lib_status_t optiga_crypt_rng(uint8_t * random_data, uint16_t random_data_length)

 {

     optiga_lib_status_t return_status;

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

-        return_status = OPTIGA_LIB_BUSY;

-        return_status = optiga_crypt_random(p_local_crypt, OPTIGA_RNG_TYPE_DRNG, random_data, random_data_length);

+        optiga_lib_status = OPTIGA_LIB_BUSY;

+        return_status     = optiga_crypt_random(me_crypt, OPTIGA_RNG_TYPE_DRNG, random_data, random_data_length);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_random api returns error !!!

-            optiga_lib_print_message("optiga_crypt_random api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_crypt_random returns error !!!

+            printf("optiga_crypt_random api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

-        if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

             // optiga_crypt_random failed

-            optiga_lib_print_message("optiga_crypt_random failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_crypt_random returns error\n");

             break;

         }

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

 optiga_lib_status_t trustm_ecc_keygen(uint16_t optiga_key_id, uint8_t key_type, optiga_ecc_curve_t curve_id, uint8_t * pubkey,

@@ -610,35 +512,24 @@
     }

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status = optiga_crypt_ecc_generate_keypair(p_local_crypt, curve_id, key_type, FALSE, &optiga_key_id, (pubkey + i),

-                                                          pubkey_length);

+        return_status =

+            optiga_crypt_ecc_generate_keypair(me_crypt, curve_id, key_type, FALSE, &optiga_key_id, (pubkey + i), pubkey_length);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

             // optiga_crypt_ecc_generate_keypair api returns error !!!

-            optiga_lib_print_message("optiga_crypt_ecc_generate_keypair api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                     OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_crypt_ecc_generate_keypair api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_crypt_ecc_generate_keypair returns error !!!

+            printf("optiga_crypt_ecc_generate_keypair returns error\n");

+            break;

+        }

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

-

     *pubkey_length += sizeof(header256);

     return return_status;

 }

@@ -648,32 +539,22 @@
     uint16_t offset = 0;

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_util = optiga_util_create(0, optiga_util_callback, NULL);

-        if (NULL == p_local_util)

-        {

-            optiga_lib_print_message("optiga_util_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status     = optiga_util_read_data(p_local_util, optiga_oid, offset, pubkey, pubkeyLen);

+        return_status     = optiga_util_read_data(me_util, optiga_oid, offset, pubkey, pubkeyLen);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_util_read_pubkey api returns error !!!

-            optiga_lib_print_message("optiga_util_read_pubkey returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_util_read_data api returns error !!!

+            printf("optiga_util_read_data api error %02X\n", return_status);

             break;

         }

-

-        while (optiga_lib_status == OPTIGA_LIB_BUSY)

-            ;

-

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_util_read_pubkey returns error !!!

+            printf("optiga_util_read_pubkey returns error\n");

+            break;

+        }

     } while (0);

-

-    if (p_local_util)

-    {

-        optiga_util_destroy(p_local_util);

-    }

 }

 optiga_lib_status_t trustm_hash(uint8_t * msg, uint16_t msg_length, uint8_t * digest, uint8_t digest_length)

 {

@@ -681,34 +562,25 @@
     hash_data_from_host_t hash_data_host;

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

         hash_data_host.buffer = msg;

         hash_data_host.length = msg_length;

         optiga_lib_status     = OPTIGA_LIB_BUSY;

-        return_status = optiga_crypt_hash(p_local_crypt, OPTIGA_HASH_TYPE_SHA_256, OPTIGA_CRYPT_HOST_DATA, &hash_data_host, digest);

-

+        return_status = optiga_crypt_hash(me_crypt, OPTIGA_HASH_TYPE_SHA_256, OPTIGA_CRYPT_HOST_DATA, &hash_data_host, digest);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_ecdsa_sign api returns error !!!

-            optiga_lib_print_message("optiga_crypt_hash api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_crypt_hash api returns error !!!

+            printf("optiga_crypt_hash api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_crypt_hash api returns error !!!

+            printf("optiga_crypt_hash returns error\n");

+            break;

+        }

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

 optiga_lib_status_t trustm_ecdsa_sign(optiga_key_id_t optiga_key_id, uint8_t * digest, uint8_t digest_length, uint8_t * signature,

@@ -718,26 +590,21 @@
     int i;

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status = optiga_crypt_ecdsa_sign(p_local_crypt, digest, digest_length, optiga_key_id, signature, signature_length);

+        return_status     = optiga_crypt_ecdsa_sign(me_crypt, digest, digest_length, optiga_key_id, signature, signature_length);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

             // optiga_crypt_ecdsa_sign api returns error !!!

-            optiga_lib_print_message("optiga_crypt_ecdsa_sign api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                     OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_crypt_ecdsa_sign api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_crypt_ecdsa_sign returns error !!!

+            printf("optiga_crypt_ecdsa_sign returns error\n");

+            break;

+        }

         for (i = (*signature_length - 1); i >= 0; i--)

         {

             signature[i + 2] = signature[i];

@@ -749,23 +616,18 @@
 

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

+

 void ecc_pub_key_bit(uint8_t * q_buffer, uint8_t q_length, uint8_t * pub_key_buffer, uint16_t * pub_key_length)

 {

-#define OPTIGA_UTIL_ECC_DER_ADDITIONAL_LENGTH (0x02)

+#define OPTIGA_UTIL_ECC_DER_ADDITIONAL_LENGTH (0x01)

 

     uint16_t index = 0;

 

     pub_key_buffer[index++] = OPTIGA_UTIL_DER_BITSTRING_TAG;

     pub_key_buffer[index++] = q_length + OPTIGA_UTIL_ECC_DER_ADDITIONAL_LENGTH;

     pub_key_buffer[index++] = OPTIGA_UTIL_DER_NUM_UNUSED_BITS;

-    // Compression format. Supports only 04 [uncompressed]

-    pub_key_buffer[index++] = 0x04;

 

     pal_os_memcpy(&pub_key_buffer[index], q_buffer, q_length);

     index += q_length;

@@ -781,44 +643,36 @@
     uint8_t ecc_public_key[70] = { 0x00 };

     uint16_t i;

     uint16_t ecc_public_key_length = 0;

+

     ecc_pub_key_bit(ecc_pubkey, ecc_pubkey_length, ecc_public_key, &ecc_public_key_length);

 

     public_key_from_host_t public_key_details = { ecc_public_key, ecc_public_key_length, (uint8_t) OPTIGA_ECC_CURVE_NIST_P_256 };

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

         signature_length = signature[1];

         for (i = 0; i < signature_length; i++)

         {

             signature[i] = signature[i + 2];

         }

-        return_status = OPTIGA_LIB_BUSY;

-        return_status = optiga_crypt_ecdsa_verify(p_local_crypt, digest, digest_length, signature, signature_length,

-                                                  OPTIGA_CRYPT_HOST_DATA, &public_key_details);

+

+        optiga_lib_status = OPTIGA_LIB_BUSY;

+        return_status     = optiga_crypt_ecdsa_verify(me_crypt, digest, digest_length, signature, signature_length,

+                                                      OPTIGA_CRYPT_HOST_DATA, &public_key_details);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

             // optiga_crypt_ecdsa_verify api returns error !!!

-            optiga_lib_print_message("optiga_crypt_ecdsa_verify api returns error !!!", OPTIGA_UTIL_SERVICE,

-                                     OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_crypt_ecdsa_verify api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_crypt_ecdsa_verify returns error !!!

+            printf("optiga_crypt_ecdsa_verify returns error\n");

+            break;

+        }

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

 

@@ -834,40 +688,35 @@
     trustm_Open();

     do

     {

-        // Create an instance of optiga_util to read the certificate from OPTIGA.

-        p_local_util = optiga_util_create(0, optiga_util_callback, NULL);

-        if (!p_local_util)

-        {

-            optiga_lib_print_message("optiga_util_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status     = optiga_util_read_data(p_local_util, optiga_oid, 0, ifx_cert_hex, &ifx_cert_hex_len);

+        return_status     = optiga_util_read_data(me_util, optiga_oid, 0, ifx_cert_hex, &ifx_cert_hex_len);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

             // optiga_util_read_data api returns error !!!

-            optiga_lib_print_message("optiga_util_read_data api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            printf("optiga_util_read_data api error %02X\n", return_status);

             break;

         }

-        while (optiga_lib_status == OPTIGA_LIB_BUSY)

-            ;

-        if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

         {

             // optiga_util_read_data failed

-            optiga_lib_print_message("optiga_util_read_data failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            printf("trustmGetCertificate failed\n");

             break;

         }

-

         memcpy(buf, ifx_cert_hex, ifx_cert_hex_len);

         *buflen = ifx_cert_hex_len;

     } while (0);

 

-    if (p_local_util)

+    if (return_status == OPTIGA_LIB_SUCCESS)

     {

-        optiga_util_destroy(p_local_util);

+        return CHIP_NO_ERROR;

     }

-    return CHIP_NO_ERROR;

+    else

+    {

+        return CHIP_ERROR_INTERNAL;

+    }

 }

+

 optiga_lib_status_t trustm_ecdh_derive_secret(optiga_key_id_t optiga_key_id, uint8_t * public_key, uint16_t public_key_length,

                                               uint8_t * shared_secret, uint8_t shared_secret_length)

 {

@@ -879,33 +728,23 @@
     };

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         optiga_lib_status = OPTIGA_LIB_BUSY;

-        return_status     = optiga_crypt_ecdh(p_local_crypt, optiga_key_id, &public_key_details, TRUE, shared_secret);

+        return_status     = optiga_crypt_ecdh(me_crypt, optiga_key_id, &public_key_details, TRUE, shared_secret);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            // optiga_crypt_ecdh api returns error !!!

-            optiga_lib_print_message("optiga_crypt_ecdh api returns error !!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_util_read_data api returns error !!!

+            printf("optiga_crypt_ecdh api error %02X\n", return_status);

             break;

         }

-

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            // optiga_crypt_ecdh returns error !!!

+            printf("optiga_crypt_ecdh returns error\n");

+            break;

+        }

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }

 

@@ -921,37 +760,40 @@
     unsigned char * out_p = output;

     do

     {

-        // Create an instance of optiga_crypt_t

-        p_local_crypt = optiga_crypt_create(0, optiga_crypt_callback, NULL);

-        if (NULL == p_local_crypt)

-        {

-            optiga_lib_print_message("optiga_crypt_create failed!!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-            break;

-        }

-

         // Calculate U1, U1 ends up in work

+        optiga_lib_status = OPTIGA_LIB_BUSY;

         return_status =

-            optiga_crypt_hmac(p_local_crypt, OPTIGA_HMAC_SHA_256, TRUSTM_HMAC_OID_KEY, salt, (uint32_t) slen, work, &work_len);

-

+            optiga_crypt_hmac(me_crypt, OPTIGA_HMAC_SHA_256, TRUSTM_HMAC_OID_KEY, salt, (uint32_t) slen, work, &work_len);

         if (OPTIGA_LIB_SUCCESS != return_status)

         {

-            optiga_lib_print_message("optiga_crypt_hmac api returns error!!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+            // optiga_crypt_hmac api returns error !!!

+            printf("optiga_crypt_hmac api 1 error %02X\n", return_status);

             break;

         }

-        return_status = OPTIGA_LIB_BUSY;

+        WAIT_FOR_COMPLETION(return_status);

+        if (OPTIGA_LIB_SUCCESS != return_status)

+        {

+            printf("optiga_crypt_hmac 1 returns error\n");

+            break;

+        }

         memcpy(md1, work, md1_len);

         for (unsigned int i = 1; i < iteration_count; i++)

         {

+            optiga_lib_status = OPTIGA_LIB_BUSY;

             // Calculated subsequent U, which ends up in md1

-            return_status = optiga_crypt_hmac(p_local_crypt, OPTIGA_HMAC_SHA_256, TRUSTM_HMAC_OID_KEY, md1, md1_len, md1, &md1_len);

-

+            return_status = optiga_crypt_hmac(me_crypt, OPTIGA_HMAC_SHA_256, TRUSTM_HMAC_OID_KEY, md1, md1_len, md1, &md1_len);

             if (OPTIGA_LIB_SUCCESS != return_status)

             {

-                optiga_lib_print_message("optiga_crypt_hmac api returns error!!!", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

+                // optiga_crypt_hmac api returns error !!!

+                printf("optiga_crypt_hmac api 2 error %02X\n", return_status);

                 break;

             }

-            return_status = OPTIGA_LIB_BUSY;

-

+            WAIT_FOR_COMPLETION(return_status);

+            if (OPTIGA_LIB_SUCCESS != return_status)

+            {

+                printf("optiga_crypt_hmac 2 returns error\n");

+                break;

+            }

             // U1 xor U2

             for (int j = 0; j < (int) md1_len; j++)

             {

@@ -959,25 +801,8 @@
             }

         }

 

-        while (p_local_crypt->instance_state != OPTIGA_LIB_INSTANCE_FREE)

-            ;

-

-        if (OPTIGA_LIB_SUCCESS != optiga_lib_status)

-

-        {

-

-            // optiga_crypt_hkdf failed

-

-            optiga_lib_print_message("optiga_crypt_pbkdf_hmac failed failed", OPTIGA_UTIL_SERVICE, OPTIGA_UTIL_SERVICE_COLOR);

-

-            break;

-        }

         memcpy(out_p, work, key_length);

     } while (0);

 

-    if (p_local_crypt)

-    {

-        optiga_crypt_destroy(p_local_crypt);

-    }

     return return_status;

 }