作者:Davis Zhang,AMD工程师;来源:AMD开发者社区
Versal器件里包含多种加密引擎,包括SHA-3/384 engine、AES-GCM engine、RSA engine和ECC engine。Xilsecure library提供这些引擎的API,其中ECDSA(Elliptic Curve Digital Signature Algorithm)相关驱动是ECC(Elliptic-curve cryptography) engine的API,它提供server mode和client mode两种API。Xilsecure library的example里提供了server端和client端两种example,它们分别调用server API和client API。PLM中运行的xilsecure API是server mode,A72、R5或者PL里其他处理器上运行的client mode application可以通过IPI来发送请求到PLM,然后PLM会用server API处理这些请求,最后通过IPI把处理结果返回到client mode application。通常会建议在A72、R5上执行client mode API,但不禁止server mode API。Xilsecure library的example里提供了server端和client端两种ECDSA example,它们分别调用server API和client API。
如果要在A72或者R5上运行server mode application,需要在BSP里把xilsecure设置为server mode。
“xilsecure_versal_ecdsa_server_example.c”里预定义了private key 数组D[]和hash数组Hash[],然后用XSecure_EllipticGenerateKey生成了private key的public key,在XSecure_EllipticGenerateSignature里用private key生成了Hash的签名,最后在XSecure_EllipticVerifySign里用public key校验了Hash的签名。
为了验证ECDSA API与openssl的兼容性,我们可以用openssl生成private key,把它替换到example code里的D[],用openssl和生成的private key对example code里预定义的Hash生成签名,然后把生成的签名替换到example code里去,这样example code会在XSecure_EllipticGenerateKey里对openssl生成的private key生成public key,最后在example code里用XSecure_EllipticVerifySign校验openssl生成的签名。大概步骤如下:
/**用openssl生成private key**/
openssl ecparam -genkey -name P-384 -out privkey.pem
/**用openssl命令打印出private key数据和里面包含的public key数据,把private key数据替换到example code里的D[]数组,需要注意openssl使用big endian数据,而xilsecure library默认使用little endian,所以数据转换时需要注意大小端转换,server mode xilsecure可以在bsp里设置为big endian。打印出的public key数据可以用来和稍后执行example生成的public key作比较,以验证public key是否在example里正确生成**/
openssl ec -text -in privkey.pem
/**把example code里的Hash[]数组数据拷贝到“hash.bin”,同样要注意大小端转换,然后用openssl命令和private key生成“hash.bin”的签名。不要使用“openssl dgst -sha3-384 -sign privkey.pem -out sign.sha3-384 hash.bin”命令,它会先生成“hash.bin”的dgst,然后对dgst生成签名,这与example code流程不一致**/
openssl pkeyutl -sign -inkey privkey.pem -pkeyopt digest:sha3-384 -in hash.bin -out sign.sha3-384
/**用openssl命令把签名的R、S两部分数据打印出来,然后替换到example code里GeneratedSign.SignR和GeneratedSign.SignS,同样要注意大小端转换**/
openssl asn1parse -inform der -in sign.sha3-384
最后就可以运行example application来验证openssl生成的签名是否可以通过ECDSA API的校验。