Cryptographic Co-Processor(CCP)
在《海光处理器与AMD Zen1的指令差异-CSDN博客》 中,发现海光缺少AES、pclmulqdq、sha_ni指令集,加解密的性能先天不足。例如通过命令行使用 OpenSSL 的 EVP 接口来加速 AES 加密,可以使用 openssl enc
命令,并指定所需的 AES 加密算法。以下是一个示例命令:
openssl enc -aes-256-cbc -in plaintext.txt -out encrypted.bin -pass pass:yourpassword -engine aesni
在这个命令中:
-aes-256-cbc
指定使用 AES-256-CBC 加密。-in
和-out
分别指定输入和输出文件。-pass
用于指定密码。-engine aesni
(如果可用)指明使用 AES-NI 加速。
上述openssl调用AES指令的方式,在海光上是不行的。指令不足,硬件来补,海光内置了硬件引擎CCP来加速加解密。
CCP即Cryptographic Co-Processor (CCP)不是海光发明的,也是来自于AMD,类似于Intel的QAT(Intel QuickAssist Technology)。例如DPDK支持AMD CCP: 7. AMD CCP Poll Mode Driver — Data Plane Development Kit 24.11.0-rc0 documentation (dpdk.org)
Hygon CPU芯片中包含两类CCP协处理器,一类为PSP CCP(Platform Secure Processor and Cryptographic Co-Processor),一类为NTB CCP(Cryptographic Co-Processor)。
内核驱动是否支持CCP
有了加解密的硬件,Linux内核是否支持?关注一下Linux kernel及国产openEuler和OpenAnolis。
- upstrem Linux kernel
截止当前,在upstream社区最新的Linux kernel 6.11,驱动drivers/crypto/ccp并没有包含对Hygon CCP的支持:
sp-pci.c « ccp « crypto « drivers - kernel/git/torvalds/linux.git - Linux kernel source tree
drivers/crypto/ccp/sp-pci.c:
static const struct pci_device_id sp_pci_table[] = {
{ PCI_VDEVICE(AMD, 0x1537), (kernel_ulong_t)&dev_vdata[0] },
{ PCI_VDEVICE(AMD, 0x1456), (kernel_ulong_t)&dev_vdata[1] },
{ PCI_VDEVICE(AMD, 0x1468), (kernel_ulong_t)&dev_vdata[2] },
{ PCI_VDEVICE(AMD, 0x1486), (kernel_ulong_t)&dev_vdata[3] },
{ PCI_VDEVICE(AMD, 0x15DF), (kernel_ulong_t)&dev_vdata[4] },
{ PCI_VDEVICE(AMD, 0x14CA), (kernel_ulong_t)&dev_vdata[5] },
{ PCI_VDEVICE(AMD, 0x15C7), (kernel_ulong_t)&dev_vdata[6] },
{ PCI_VDEVICE(AMD, 0x1649), (kernel_ulong_t)&dev_vdata[6] },
{ PCI_VDEVICE(AMD, 0x17E0), (kernel_ulong_t)&dev_vdata[7] },
{ PCI_VDEVICE(AMD, 0x156E), (kernel_ulong_t)&dev_vdata[8] },
/* Last entry must be zero */
{ 0, }
};
MODULE_DEVICE_TABLE(pci, sp_pci_table);
- openEuler
openEuler的最新的版本是openEuler 24.03 LTS ,是基于6.6内核的长周期版本。从openEuler Long-term support Kernel OLK-6.6 分支,已经看到了对Hygon的支持:
drivers/crypto/ccp/sp-pci.c · openEuler/kernel - 码云 - 开源中国 (gitee.com)
static const struct pci_device_id sp_pci_table[] = {
{ PCI_VDEVICE(AMD, 0x1537), (kernel_ulong_t)&dev_vdata[0] },
{ PCI_VDEVICE(AMD, 0x1456), (kernel_ulong_t)&dev_vdata[1] },
{ PCI_VDEVICE(AMD, 0x1468), (kernel_ulong_t)&dev_vdata[2] },
{ PCI_VDEVICE(AMD, 0x1486), (kernel_ulong_t)&dev_vdata[3] },
{ PCI_VDEVICE(AMD, 0x15DF), (kernel_ulong_t)&dev_vdata[4] },
{ PCI_VDEVICE(AMD, 0x14CA), (kernel_ulong_t)&dev_vdata[5] },
{ PCI_VDEVICE(AMD, 0x15C7), (kernel_ulong_t)&dev_vdata[6] },
{ PCI_VDEVICE(AMD, 0x1649), (kernel_ulong_t)&dev_vdata[6] },
{ PCI_VDEVICE(AMD, 0x17E0), (kernel_ulong_t)&dev_vdata[7] },
{ PCI_VDEVICE(AMD, 0x156E), (kernel_ulong_t)&dev_vdata[8] },
{ PCI_VDEVICE(HYGON, 0x1456), (kernel_ulong_t)&hygon_dev_vdata[0] },
{ PCI_VDEVICE(HYGON, 0x1468), (kernel_ulong_t)&hygon_dev_vdata[1] },
{ PCI_VDEVICE(HYGON, 0x1486), (kernel_ulong_t)&hygon_dev_vdata[2] },
{ PCI_VDEVICE(HYGON, 0x14b8), (kernel_ulong_t)&hygon_dev_vdata[1] },
{ PCI_VDEVICE(HYGON, 0x14a6), (kernel_ulong_t)&hygon_dev_vdata[2] },
/* Last entry must be zero */
{ 0, }
};
MODULE_DEVICE_TABLE(pci, sp_pci_table);
- OpenAnolis
龙蜥操作系统 Anolis OS 23 是 OpenAnolis 龙蜥社区基于操作系统分层分类理论,面向上游原生社区独立选型,拉齐软硬件兼容性软件包的首款国产操作系统。当前 Anolis OS 23 最新的版本号为 Anolis OS 23.1(GA)。Anolis OS 23.1 现提供 5.10/6.6 两种内核可供使用,6.6 为默认内核,ISO 中默认只携带 6.6 版本内核.
在6.6内核分支中,可以看到对Hygon CCP的支持:
static const struct pci_device_id sp_pci_table[] = {
{ PCI_VDEVICE(AMD, 0x1537), (kernel_ulong_t)&dev_vdata[0] },
{ PCI_VDEVICE(AMD, 0x1456), (kernel_ulong_t)&dev_vdata[1] },
{ PCI_VDEVICE(AMD, 0x1468), (kernel_ulong_t)&dev_vdata[2] },
{ PCI_VDEVICE(AMD, 0x1486), (kernel_ulong_t)&dev_vdata[3] },
{ PCI_VDEVICE(AMD, 0x15DF), (kernel_ulong_t)&dev_vdata[4] },
{ PCI_VDEVICE(AMD, 0x14CA), (kernel_ulong_t)&dev_vdata[5] },
{ PCI_VDEVICE(AMD, 0x15C7), (kernel_ulong_t)&dev_vdata[6] },
{ PCI_VDEVICE(AMD, 0x1649), (kernel_ulong_t)&dev_vdata[6] },
{ PCI_VDEVICE(AMD, 0x17E0), (kernel_ulong_t)&dev_vdata[7] },
{ PCI_VDEVICE(AMD, 0x156E), (kernel_ulong_t)&dev_vdata[8] },
{ PCI_VDEVICE(HYGON, 0x1456), (kernel_ulong_t)&dev_vdata[9] },
{ PCI_VDEVICE(HYGON, 0x1468), (kernel_ulong_t)&dev_vdata[10] },
{ PCI_VDEVICE(HYGON, 0x1486), (kernel_ulong_t)&dev_vdata[11] },
{ PCI_VDEVICE(HYGON, 0x14b8), (kernel_ulong_t)&dev_vdata[10] },
{ PCI_VDEVICE(HYGON, 0x14a6), (kernel_ulong_t)&dev_vdata[11] },
/* Last entry must be zero */
{ 0, }
};
MODULE_DEVICE_TABLE(pci, sp_pci_table);
海光专属:密码算法加速软件开发套件HCT
在OpenAnolis龙蜥操作系统社区,找到了一篇文章。重点是可以和openssl对接,这样原来的应用程序只要保持和openssl的兼容即可,基本不需要改动。
HCT通过 openssl 标准接口(EVP)向应用提供接口,使用HCT套件时,通过e=ENGINE_by_id("hct")
选择密码引擎为hct,然后直接通过openssl标准(EVP)接口即可完成对HCT密码计算套件的调用。
参考:
1-HCT用户手册 - OpenAnolis龙蜥操作系统开源社区
感谢大家点赞关注收藏!