PKC
PKC的示例工程实现了大数模加、大数模减、大数模乘、大数模对比、大数模逆、大数模移位、大数加、大数乘、大数RSA模幂、大数ECC点乘运算。
本章节以大数模加运算为例,进行PKC示例的代码及测试验证说明。其他运算的相关代码请参考示例工程代码。
PKC示例的源代码和工程文件位于SDK_Folder\projects\peripheral\pkc\pkc,其中工程文件在文件夹Keil_5下。
代码理解
PKC示例工程(大数模加运算)流程图如图 21所示:
- 配置PKC模块。
pkc_modular_add_t PKC_ModularAddStruct = { .p_A = In_a, .p_B = In_b, .p_P = In_n }; PKCHandle.p_instance = PKC; PKCHandle.p_result = Out_c; PKCHandle.init.p_ecc_curve = &ECC_CurveInitStruct; PKCHandle.init.data_bits = 256; PKCHandle.init.secure_mode = PKC_SECURE_MODE_DISABLE; PKCHandle.init.random_func = NULL; hal_pkc_deinit(&PKCHandle); hal_pkc_init(&PKCHandle);- init.p_ecc_curve:椭圆曲线描述指针。
- init.data_bits:数据位数大小。
- init.secure_mode:安全模式设置,可选择PKC_SECURE_MODE_DISABLE、PKC_SECURE_MODE_ENABLE。
- init.random_func:函数指针,指向生成随机数的函数。
- 调用阻塞接口hal_pkc_modular_add()或中断接口hal_pkc_modular_add_it(),进行In_a和In_b大数模加运算,结果输出到Out_c,并与Exc_c进行比较。代码如下:
if (HAL_OK != hal_pkc_modular_add(&PKCHandle, &PKC_ModularAddStruct, 1000)) { printf("\r\n%dth add operation got error\r\n", count++); continue; } if (check_result((uint8_t*)"pkc_modular_add", Out_c, Exc_c, PKCHandle.init.data_bits)) { error++; } if (HAL_OK != hal_pkc_modular_add_it(&PKCHandle, &PKC_ModularAddStruct)) { printf("\r\n%dth add it operation got error\r\n", count++); continue; } while(int_done_flag == 0); if (check_result((uint8_t*)"pkc_modular_add_it", Out_c, Exc_c, PKCHandle.init.data_bits)) { error++; }
测试验证
- 用GProgrammer下载pkc.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将显示PKC的数据执行结果。