目前在 AMD Versal™ 自适应 SoC 上运行椭圆曲线数字签名验证的 Example 可参考以下源码:
https://github.com/Xilinx/embeddedsw/blob/master/lib/sw_services/xilsecure/examples/xilsecure_versal_ecdsa_server_example.c
有时候,为了检验 Versal 上椭圆曲线算法的正确性,可能会用 Openssl 来验证 Versal上椭圆曲线的数字签名。但是由于方法不得当,会导致验证不通过,或者走入一些误区,为此,我们写下这篇文章帮助大家避开这些问题。
这个 Example 的流程如下:
首先,根据私钥来生成一个 Key;然后再用私钥和临时私钥对一段 Hash 值进行数字签名,生成的数字签名由 R 和 S 这两个部分来组成;验证 Key,并用 Hash 值和 Key 来验证之前的数字签名;最后 Example 在 Versal 上验证成功。
下面是在 Openssl 下进行椭圆曲线数字签名验证的流程:
解决这个问题需要注意大小端,Openssl 用的是大端,而 Versal 上用的是小端。另外还要注意验证程序的流程问题。
下面 Example 用 Openssl 创建一个签名,并用上文所说的
xilsecure_versal_ecdsa_server_example.c 来验证这个签名,这个 Example 用到了一个 Makefile 内容如下:
用 Openssl 指令生成 Privkey,创建了一个文件 abc.txt,文件中包含 abc 三个字母。然后用 Openssl 指令对 abc.txt 文件进行签名,并生成 Hash。
执行一个 Python 脚本,该脚本用于将上述生成的 Hash 转化成 C 语言数组,以便于 Copy 到 xilsecure_versal_ecdsa_server_example.c 来验证这个签名。
上述 Python 脚本内容如下:
需要注意的是,每次运行这个 Makefile 的时候,生成的 Key 和签名可能都不一样,这是因为是 Openssl 随机生成的。
另外,
xilsecure_versal_ecdsa_server_example.c 中没有展示整个签名的过程,openssl dgst指令(1) hashing “abc”, (2) performing ECC math on the resulting hash。而 Ecdsa example 仅仅展示了第二步,所以您需要用 Xilsecure SHA3 的函数去执行第一步,即 Hashing “abc”。
AMD 自适应 SOC 及 FPGA 中文技术支持社区