Procházet zdrojové kódy

update: luat_crypto_trng改成池化实现, 提高随机数生成速度, 从而提高https等加密连接的速度

Wendal Chen před 2 roky
rodič
revize
db5a42bd57
4 změnil soubory, kde provedl 60 přidání a 16 odebrání
  1. 6 1
      app/port/luat_base_air101.c
  2. 4 1
      app/port/luat_conf_bsp.h
  3. 38 12
      app/port/luat_crypto_air101.c
  4. 12 2
      xmake.lua

+ 6 - 1
app/port/luat_base_air101.c

@@ -257,7 +257,12 @@ static const luaL_Reg loadedlibs[] = {
 #ifdef LUAT_USE_USERNET
   {"usernet", luaopen_usernet},
 #endif
-
+#ifdef LUAT_USE_SQLITE3
+  {"sqlite3", luaopen_sqlite3},
+#endif
+#ifdef LUAT_USE_WS2812
+  {"ws2812", luaopen_ws2812},
+#endif
   // {"opus", luaopen_opus},
   {NULL, NULL}
 };

+ 4 - 1
app/port/luat_conf_bsp.h

@@ -102,7 +102,10 @@
 #define LUAT_USE_RSA 1
 
 // 国密算法 SM2/SM3/SM4
-#define LUAT_USE_GMSSL 1
+// #define LUAT_USE_GMSSL 1
+
+// #define LUAT_USE_SQLITE3 1
+// #define LUAT_USE_WS2812 1
 
 
 // // 使用 TLSF 内存池, 实验性, 内存利用率更高一些

+ 38 - 12
app/port/luat_crypto_air101.c

@@ -4,6 +4,11 @@
 #include "wm_crypto_hard.h"
 #include "aes.h"
 #include "wm_osal.h"
+#include "wm_regs.h"
+#include "wm_debug.h"
+#include "wm_crypto_hard.h"
+#include "wm_internal_flash.h"
+#include "wm_pmu.h"
 
 #include "luat_base.h"
 #include "luat_crypto.h"
@@ -13,22 +18,43 @@
 #include "FreeRTOS.h"
 #include "task.h"
 
-int tls_crypto_random_bytes_range(unsigned char *out, u32 len, u32 range);
 
-int luat_crypto_trng(char* buff, size_t len) {
-    #define TMP_LEN (8)
-    char tmp[TMP_LEN];
+static unsigned char trng_wait;
+static unsigned char trng_pool[24];
+
+void rngGenRandom() {
+    uint32_t ret;
     tls_crypto_random_init(tls_os_get_time(), CRYPTO_RNG_SWITCH_32);
-    vTaskDelay(1);
-    tls_crypto_random_bytes_range(tmp, TMP_LEN, 255);
+    for (size_t i = 0; i < sizeof(trng_pool) / sizeof(uint32_t); i++)
+    {
+        vTaskDelay(1);
+        tls_reg_read32(HR_CRYPTO_SEC_CFG);
+        ret = tls_reg_read32(HR_CRYPTO_RNG_RESULT);
+        memcpy(trng_pool + i * sizeof(uint32_t), &ret, sizeof(uint32_t));
+    }
     tls_crypto_random_stop();
+}
 
-    extern int random_get_bytes(void *buf, size_t len);
-	random_get_bytes(buff, len);
-    for (size_t i = 0; i < len; i++)
-    {
-        buff[i] ^= tmp[i % TMP_LEN];
+int luat_crypto_trng(char* buff, size_t len)  {
+    char* dst = buff;
+    while (len > 0) {
+        // 池内没有剩余的随机值? 生成一次
+        if (trng_wait == 0) {
+            // LLOGD("生成一次随机数 24字节,放入池中");
+            rngGenRandom();
+            trng_wait = 24;
+        }
+        // 剩余随机值够用, 直接拷贝
+        if (len <= trng_wait) {
+            memcpy(dst, trng_pool + (24 - trng_wait), len);
+            trng_wait -= len;
+            return 0;
+        }
+        // 不够用, 先把现有的用完, 然后下一个循环
+        memcpy(dst, trng_pool + (24 - trng_wait), trng_wait);
+        dst += trng_wait;
+        len -= trng_wait;
+        trng_wait = 0;
     }
     return 0;
 }
-

+ 12 - 2
xmake.lua

@@ -133,8 +133,6 @@ target("app")
     add_includedirs(os.dirs(path.join(os.scriptdir(),"src/app/**")))
     add_includedirs(os.dirs(path.join(os.scriptdir(),"src/bt/blehost/**")))
 
-    -- mbedtls
-    add_files(luatos.."components/mbedtls/library/*.c")
 
 target_end()
 
@@ -387,6 +385,7 @@ target("network")
     add_includedirs(luatos.."components/network/ercoap/include",{public = true})
     add_files(luatos.."components/network/ercoap/src/*.c")
     add_files(luatos.."components/network/ercoap/binding/*.c")
+
 target_end()
 
 target("nes")
@@ -403,6 +402,8 @@ target("nes")
     add_includedirs(luatos.."components/nes/inc")
     add_includedirs(luatos.."components/nes/port")
     add_files(luatos.."components/nes/**.c")
+    -- mbedtls
+    add_files(luatos.."components/mbedtls/library/*.c")
 target_end()
 
 target("luatfonts")
@@ -674,6 +675,15 @@ target("air10x")
     -- repl
     add_files(luatos.."components/repl/**.c")
     add_includedirs(luatos.."components/repl/")
+
+    -- sqlite3
+    add_includedirs(luatos.."components/sqlite3/include",{public = true})
+    add_files(luatos.."components/sqlite3/src/*.c")
+    add_files(luatos.."components/sqlite3/binding/*.c")
+
+    add_includedirs(luatos.."components/ws2812/include",{public = true})
+    add_files(luatos.."components/ws2812/src/*.c")
+    add_files(luatos.."components/ws2812/binding/*.c")
     
     -- local opus_dir = luatos .. "components/opus/"
     -- add_includedirs(opus_dir .. "opus-1.3.1/src",