You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LPC55s69板上测试Kyber密钥生成运行时间的代码是否有效?

LPC55S69上Kyber密钥生成计时代码验证与修正

原代码存在的问题

  1. 语法错误

    • test_keys函数中多了一个闭合大括号,导致函数结构非法
    • main中调用test_keys(void)语法错误,函数调用无需指定参数类型
    • main中重复定义start_time变量,且初始的start_time未声明类型
    • main中错误使用return;(main为int类型返回值,需返回整数)
    • 未调用DWT_Init()初始化循环计数器,计时功能完全失效
  2. 计时逻辑缺陷

    • 仅单次测试密钥生成,结果受偶然因素影响大,无统计参考价值
    • 未处理编译器优化问题,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:53:13