From 7bc11c65cf2f7a9ba5dc06e3075d39e7f74a9f6e Mon Sep 17 00:00:00 2001
From: "Ruslan (The BadAss SysMan) Laishev" <ruslan.laishev@demlabs.net>
Date: Mon, 28 Feb 2022 22:01:19 +0300
Subject: [PATCH] bugfix-5737 - Improved UUID generation by using GCC atomic.

---
 dap-sdk/crypto/src/dap_uuid.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/dap-sdk/crypto/src/dap_uuid.c b/dap-sdk/crypto/src/dap_uuid.c
index 0a9138563e..ac4a130496 100644
--- a/dap-sdk/crypto/src/dap_uuid.c
+++ b/dap-sdk/crypto/src/dap_uuid.c
@@ -22,6 +22,7 @@
 */
 #include <time.h>
 #include <stdatomic.h>
+
 #include "KeccakHash.h"
 #include "SimpleFIPS202.h"
 #include "dap_uuid.h"
@@ -30,8 +31,7 @@
 
 #define LOG_TAG "dap_uuid"
 
-atomic_uint_fast32_t s_global_counter32=0;
-atomic_uint_fast16_t s_global_counter16=0;
+static atomic_uint_fast32_t s_global_counter = 0;
 
 /**
  * @brief dap_uuid_generate_ui64
@@ -41,10 +41,10 @@ atomic_uint_fast16_t s_global_counter16=0;
 uint128_t dap_uuid_generate_uint128()
 {
     uint32_t l_input[4] ={
-        [0]=random_uint32_t(UINT32_MAX),
-        [1]=time(NULL),
-        [2]=s_global_counter32++,
-        [3]=random_uint32_t(UINT32_MAX)
+        [0] = random_uint32_t(UINT32_MAX),
+        [1] = time(NULL),
+        [2] = atomic_fetch_add(&s_global_counter, 1),
+        [3] = random_uint32_t(UINT32_MAX)
     };
     uint128_t l_output;
     SHAKE128((unsigned char *) &l_output,sizeof (l_output), (unsigned char*) &l_input,sizeof (l_input));
@@ -61,11 +61,11 @@ uint128_t dap_uuid_generate_uint128()
 uint64_t dap_uuid_generate_uint64()
 {
     uint32_t l_ts = (uint32_t) time(NULL);
-    uint16_t l_input[4] ={
-        [0]=dap_random_uint16(),
-        [1]= l_ts % UINT16_MAX,
-        [2]= s_global_counter16++,
-        [3]= dap_random_uint16()
+    uint16_t l_input[4] = {
+        [0] = dap_random_uint16(),
+        [1] = time(NULL) & UINT16_MAX,      /*  time(NULL) % UINT16_MAX */
+        [2] = (uint16_t) atomic_fetch_add(&s_global_counter, 1),
+        [3] = dap_random_uint16()
     };
     uint64_t l_output;
     SHAKE128((unsigned char *) &l_output,sizeof (l_output), (unsigned char*) &l_input,sizeof (l_input));
-- 
GitLab