我正在尝试弄清楚下面的代码是否应该在我测量的时间内执行完毕,或者我的设置是否出错导致它运行速度非常慢。这段代码是使用 kCASPER_ECC_P256 从给定的私钥生成公钥的函数的一部分。
以下代码使用 GPIO 开关来测量执行时间。设置和清除 GPIO 调用之间需要 337 毫秒。对于这种硬件加速的数学运算来说,这个速度似乎太慢了。这是预期之内的吗?我的MCU核心时钟频率为148MHz。有没有办法选择 CASPER 引擎的时钟源来加快速度?
/* Base Generator Point G(x, y) for secp256r1 in 32-bit Little-Endian word arrays */
static const uint32_t G_x_le[8] = {
0xD898C296, 0xF4A13945, 0x2DEB33A0, 0x77037D81,
0x63A440F2, 0xF8BCE6E5, 0xE12C4247, 0x6B17D1F2
};
static const uint32_t G_y_le[8] = {
0x37BF51F5, 0xCBB64068, 0x6B315ECE, 0x2BCE3357,
0x7C0F9E16, 0x8EE7EB4A, 0xFE1A7F9B, 0x4FE342E2
};
uint32_t scalar_le[8];
uint32_t Q_x_le[8];
uint32_t Q_y_le[8];
/* Copy Big-Endian private scalar and convert to Little-Endian for CASPER */
memcpy(scalar_le, key_buffer, 32);
swap_endian_32((uint8_t *)scalar_le);
/* 1. Initialize CASPER coprocessor */
CASPER_Init(CASPER);
CASPER_ecc_init(kCASPER_ECC_P256);
HW_DB_PinSet();
/* 2. Compute Q = d * G using CASPER hardware */
CASPER_ECC_SECP256R1_Mul(
CASPER,
Q_x_le, Q_y_le,
G_x_le, G_y_le,
scalar_le
);
HW_DB_PinClear();我们使用 MCUXpresso SDK CASPER 示例在运行频率为 150 MHz 的 LPC55S28 EVK 上测量了相同的操作。对 CASPER_ECC_SECP256R1_Mul() 的一次调用大约需要 2410 万个 CPU 周期,相当于大约 160 毫秒的执行时间。
根据这一结果,您应用程序中测得的 337 毫秒似乎并不算不合理,特别是如果考虑到额外的密钥格式化、数据转换、初始化或调试版本开销的话。
CASPER 不提供单独的用户可配置时钟源。执行时间主要取决于使用 CASPER 加速器的 ECC 软件实现。
BR
哈里
你可以做以下几件事。但是,我没有在这个MCU上看到CASPER引擎的任何可配置时钟选项。
1. 使用 O2 优化来提高速度
2.启用 Flash 加速器预取和等待状态优化。