LPC55s69板上测试Kyber密钥生成运行时间的代码是否有效?
LPC55S69上Kyber密钥生成计时代码验证与修正
原代码存在的问题
语法错误
test_keys函数中多了一个闭合大括号,导致函数结构非法main中调用test_keys(void)语法错误,函数调用无需指定参数类型main中重复定义start_time变量,且初始的start_time未声明类型main中错误使用return;(main为int类型返回值,需返回整数)- 未调用
DWT_Init()初始化循环计数器,计时功能完全失效
计时逻辑缺陷
- 仅单次测试密钥生成,结果受偶然因素影响大,无统计参考价值
- 未处理编译器优化问题,
crypto_kem_keypair可能被编译器优化剔除 - 冗余的SysTick代码未使用,且存在未声明变量的问题
修正后的代码
#include <stddef.h> #include <stdio.h> #include <string.h> #include "kem.h" #include "randombytes.h" #include "fsl_device_registers.h" #include "fsl_debug_console.h" #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_power.h" #include "fsl_clock.h" #define NTESTS 1000 // 密钥生成测试 static int test_keys(void) { uint8_t pk[CRYPTO_PUBLICKEYBYTES]; uint8_t sk[CRYPTO_SECRETKEYBYTES]; // 用volatile变量避免编译器优化掉密钥生成逻辑 volatile uint8_t dummy_pk = 0; volatile uint8_t dummy_sk = 0; crypto_kem_keypair(pk, sk); // 读取密钥值,强制编译器执行密钥生成流程 dummy_pk = pk[0]; dummy_sk = sk[0]; return 0; } // 初始化DWT循环计数器 void DWT_Init(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } // 获取当前循环计数 uint32_t DWT_GetCycles(void) { return DWT->CYCCNT; } int main(void) { BOARD_InitPins(); BOARD_BootClockPLL150M(); BOARD_InitDebugConsole(); // 获取核心时钟频率 uint32_t coreClockFrequency = CLOCK_GetFreq(kCLOCK_CoreSysClk); PRINTF("Core clock frequency: %u Hz\r\n", coreClockFrequency); if (coreClockFrequency == 0) { PRINTF("Error: Core clock frequency is zero.\r\n"); return -1; } // 初始化DWT计数器 DWT_Init(); // 多次测试取平均,降低偶然误差 uint32_t total_cycles = 0; for(int i = 0; i < NTESTS; i++) { uint32_t start_time = DWT_GetCycles(); test_keys(); uint32_t end_time = DWT_GetCycles(); total_cycles += (end_time - start_time); } uint32_t avg_cycles = total_cycles / NTESTS; PRINTF("Average elapsed cycles per keygen: %u\r\n", avg_cycles); // 计算平均耗时(整数运算) uint32_t time_us = (avg_cycles * 1000000) / coreClockFrequency; PRINTF("Average time in us: %u us\r\n", time_us); float time_ms_float = (float)avg_cycles / coreClockFrequency * 1000.0f; PRINTF("Average time in ms: %.6f ms\r\n", time_ms_float); while (1) {} }
测试注意事项
- 编译器优化:使用和实际部署一致的优化等级(如
-O2),通过volatile变量确保密钥生成函数不被优化 - 中断干扰:测试时可暂时关闭全局中断,避免中断服务程序影响计时精度
- DWT可用性:确认LPC55S69的DWT模块已启用,部分调试配置可能会禁用该模块
- 随机数源:确保
randombytes函数在嵌入式环境下有可靠的真随机数源,否则密钥生成的实际性能可能受影响
内容的提问来源于stack exchange,提问作者Aayush T
相关产品推荐
相关产品推荐

