diff --git "a/sig/Hygon Arch/content/3-HCT\346\265\213\350\257\225\346\226\207\346\241\243/1-HCT\347\224\250\346\210\267\346\211\213\345\206\214.md" "b/sig/Hygon Arch/content/3-HCT\346\265\213\350\257\225\346\226\207\346\241\243/1-HCT\347\224\250\346\210\267\346\211\213\345\206\214.md" index fc9dbd64834602eff9b9dd1a0b1628554467628f..2764937c18bba877cae63cf17454c7d7f30b2533 100644 --- "a/sig/Hygon Arch/content/3-HCT\346\265\213\350\257\225\346\226\207\346\241\243/1-HCT\347\224\250\346\210\267\346\211\213\345\206\214.md" +++ "b/sig/Hygon Arch/content/3-HCT\346\265\213\350\257\225\346\226\207\346\241\243/1-HCT\347\224\250\346\210\267\346\211\213\345\206\214.md" @@ -2,7 +2,7 @@ ## **1.1. HCT简介** -HCT是基于密码协处理器和密码指令集自主设计和研发的一套密码算法加速技术软件开发套件。HCT利用密码协处理器和密码指令集,以openssl标准接口为系统应用提供标准密码算法接口,极大提升传统密码算法性能。现有HCT版本(HCT 1.0)对密码协处理器处理采用同步处理方式,在密码协处理器执行密码算法运算的同时,C86侧处理器采用轮询方式查询密码协处理器状态,当C86侧查询到协处理器处理完成,继续后续数据处理。由于密码协处理器和C86独立运行,当协处理器执行密码运算时,采用异步处理模式,C86侧则可以释放计算资源,用以处理其他事务(如准备待加密数据等),以节约CPU计算资源,提升密码协处理器吞吐量(throughput),后续HCT版本(HCT 2.0)将支持异步模式。 +海光密码技术(HCT, Hygon Cryptographic Technology)是基于海光密码协处理器和密码指令集自主设计研发的一套密码算法加速软件开发套件。HCT充分利用海光平台密码加速特性,整合底层海光密码计算资源,为用户上层应用提供高性能密码计算能力。用户无需了解底层细节就可以轻松使用海光平台高性能密码计算能力,显著提升密码应用的性能。此外,HCT通过OpenSSL标准接口对外提供密码计算能力,完美兼容OpenSSL生态,具有良好的易用性和可移植性。用户可以方便的将已有项目代码迁移到海光平台,从而大幅缩短项目开发时间。 ## **1.2. 主要内容** @@ -19,7 +19,7 @@ HCT是基于密码协处理器和密码指令集自主设计和研发的一套 | gcc | 9.3.0 | | OpenSSL | 1.1.1c | | numa | 2.0.12 | -| HCT套件 | hct_1.1.0.20230730_rc | +| HCT套件 | hct_2.0.0.20240430_release | # **2. HCT下载和环境配置** @@ -28,108 +28,114 @@ HCT是基于密码协处理器和密码指令集自主设计和研发的一套 官方发布的HCT密码计算套件位于gitee的hygon-devkit仓库: ``` -$ git clone "https://gitee.com/anolis/hygon-devkit.git" +git clone "https://gitee.com/anolis/hygon-devkit.git" ``` HCT密码计算套件的目录结构如下: - +``` hygon-devkit/ +├─ hct + ├──pkg + │ ├── hct_1.0.0.20230224_rc + │ ├── hct_1.0.1.20230512_rc + │ ├── hct_1.1.0.20230730_rc + │ ├── hct_1.1.1.20230930_rc + │ └── hct_2.0.0.20240430_release + │ + └── README.md +``` - ├─ hct - ├──pkg - │ ├── hct_1.0.0.20230224_rc - │ ├── hct_1.0.1.20230512_rc - │ └── hct_1.1.0.20230730_rc - │ - └── README.md - -\* pkg目录:内含各版本hct密码计算套件。 +- pkg目录:内含各版本hct密码计算套件。 -\* README.md文件:有关HCT的简单情况。 +- README.md文件:有关HCT的简单情况。 ## **2.2. 环境配置** -1\. 安装支持HCT的内核 - -请参考:https://openanolis.cn/sig/Hygon-Arch/doc/824231181808631655 中的步骤进行安装。 - -*Tips:如果选择在自己的内核(需要4.10以上版本)上使用hct, 那么请使用hct_1.1.0.20230730_rc目录下的Makefile文件在线下载驱动源码并编译安装hct.ko驱动模块。* - -*使用方法:make && make install。* - -2\. 监测并安装必须的内核模块 - -``` -$ sudo modprobe vfio vfio-pci vfio_iommu_type1 mdev vfio_mdev hct -``` -注意:modprobe前请确保系统内只有一份hct内核模块 - -3\. 安装需要依赖的软件库 +1\. 安装需要依赖的软件库 1) numa库 Ubuntu: ``` -$ sudo apt install libnuma-dev +sudo apt install libnuma-dev ``` Centos: ``` -$ sudo yum install numactl -y +sudo yum install numactl -y ``` 2) openssl库 +系统中如果存在支持国密的openssl-1.1.xx,无需特地安装openssl-1.1.1c。 + ``` -$ wget "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1c.tar.gz" -$ tar –zxvf openssl-1.1.1c.tar.gz -$ cd openssl-1.1.1c -$ ./config --prefix=/usr -$ make -$ sudo make install +wget "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1c.tar.gz" +tar –zxvf openssl-1.1.1c.tar.gz +cd openssl-1.1.1c +./config --prefix=/usr +make +sudo make install ``` -*注意!--prefix=/usr会将openssl-1.1.1c安装到系统库路径。* - *如果系统中已有其他版本的openssl-1.1.xx库,且被其他程序依赖,替换openssl库可能会导致系统故障。* - *指定--prefix=/usr/local或其它自定义路径则不受影响,只需重新软连接hct套件并设好环境变量即可。* - *系统中如果存在支持国密的openssl-1.1.xx,无需特地安装openssl-1.1.1c。* +**注意:** `--prefix=/usr`会将openssl-1.1.1c安装到系统库路径。如果系统中已有其他版本的openssl-1.1.xx库,且被其他程序依赖,替换openssl库可能会导致系统故障。指定`--prefix=/usr/local`或其它自定义路径则不受影响,只需重新软连接hct套件并设好环境变量即可。 3) uuid库 Ubuntu: ``` -$ sudo apt install uuid-dev +sudo apt install uuid-dev ``` Centos: ``` -$ sudo yum install libuuid-devel -y +sudo yum install libuuid-devel -y ``` -4\. 安装HCT开发套件 +2\. 安装HCT开发套件 Centos: ``` -$ cd hct/pkg/hct_1.1.0.20230730_rc -$ sudo rpm -ivh --nodeps hct-1.1.0-2023-0730-rc.x86_64.rpm +cd hct/pkg/hct_2.0.0.20240430_release +sudo rpm -ivh --nodeps hct_2.0.0.20240430_release.x86_64.rpm ``` +**注意:** 安装时必须加上`--nodeps`选项。 + Ubuntu: ``` -$ cd hct/pkg/hct_1.1.0.20230730_rc -$ sudo dpkg -i hct-1.1.0-2023-0730-rc.x86_64.deb +cd hct/pkg/hct_2.0.0.20240430_release +sudo dpkg -i hct_2.0.0.20240430_release.x86_64.deb +``` + +3\. 安装hct内核模块 + +**编译安装hct内核模块要求内核版本在4.10及以上。** + +请将hct_2.0.0.20240430_release目录(如果使用其他版本HCT,请找到对应版本目录)下的Makefile文件下载到任意空目录中,并在该目录下执行以下命令编译并安装hct内核模块。 + +``` +make +sudo make install ``` +4\. 检测并加载必须的内核模块 + +``` +sudo modprobe vfio vfio-pci vfio_iommu_type1 mdev vfio_mdev hct +``` +**注意:** modprobe前请确保系统内只有一份hct内核模块 + 5\. 执行配置,绑定CCP ``` -$ sudo /opt/hygon/hct/hct/script/hctconfig start +sudo /opt/hygon/hct/hct/script/hctconfig start ``` @@ -139,33 +145,49 @@ $ sudo /opt/hygon/hct/hct/script/hctconfig start ## **3.1. 功能测试** ``` -$ cd /opt/hygon/hct/bin -$ sudo ./hct_test +cd /opt/hygon/hct/bin +./hct_test ``` ## **3.2. 性能测试** ``` -$ cd /opt/hygon/hct/bin -$ sudo ./hct_speed -elapsed -engine hct –multi 128 –seconds 60 sm2enc -$ sudo ./hct_speed -elapsed -engine hct –multi 128 –seconds 60 sm2sign -$ sudo ./hct_speed -elapsed -engine hct –multi 128 –seconds 60 –bytes 1024 -evp sm3 -$ sudo ./hct_speed -elapsed -engine hct –multi 128 –seconds 60 –bytes 1024 -evp sm4 -$ sudo ./hct_speed -elapsed -engine hct -async_jobs 256 -seconds 60 sm2enc -$ sudo ./hct_speed -elapsed -engine hct -async_jobs 256 -seconds 60 sm2sign -$ sudo ./hct_speed -elapsed -engine hct -async_jobs 256 -seconds 60 -bytes 1024 -evp sm3 -$ sudo ./hct_speed -elapsed -engine hct -async_jobs 256 -seconds 60 -bytes 1024 -evp sm4 -``` +cd /opt/hygon/hct/bin + +#同步多进程CCP硬件计算测试 +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd ccp sm2enc +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd ccp sm2sign +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd ccp -bytes 1024 -evp sm3 +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd ccp -bytes 1024 -evp sm4 + +#同步多进程CPU软件计算测试 +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd sw_avx sm2enc +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd sw_avx sm2sign +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd sw_avx -bytes 1024 -evp sm3 +./hct_speed -elapsed -engine hct -multi 128 -seconds 60 -cmd sw_avx -bytes 1024 -evp sm4 +# 异步多进程CCP硬件计算测试 +./hct_speed -elapsed -engine hct -multi 128 -async_jobs 512 -seconds 60 -cmd ccp sm2enc +./hct_speed -elapsed -engine hct -multi 128 -async_jobs 512 -seconds 60 -cmd ccp sm2sign +./hct_speed -elapsed -engine hct -multi 128 -async_jobs 512 -seconds 60 -cmd ccp -bytes 1024 -evp sm3 +./hct_speed -elapsed -engine hct -multi 128 -async_jobs 512 -seconds 60 -cmd ccp -bytes 1024 -evp sm4 +#同步多线程CCP硬件计算测试 +./hct_speed -elapsed -engine hct -multi-thread -multi 128 -seconds 60 -cmd ccp sm2enc +./hct_speed -elapsed -engine hct -multi-thread -multi 128 -seconds 60 -cmd ccp sm2sign +./hct_speed -elapsed -engine hct -multi-thread -multi 128 -seconds 60 -cmd ccp -bytes 1024 -evp sm3 +./hct_speed -elapsed -engine hct -multi-thread -multi 128 -seconds 60 -cmd ccp -bytes 1024 -evp sm4 +``` + +**Tips:** hct_speed各个参数说明以及所有用法均可通过`./hct_speed --help`进行查询 # **4. 利用hct套件开发** -HCT通过 openssl 标准接口(EVP)向应用提供接口,使用HCT套件时,通过e=ENGINE_by_id("hct")选择密码引擎为hct,然后直接通过openssl标准(EVP)接口即可完成对hct密码计算套件的调用。 +HCT通过 openssl 标准接口(EVP)向应用提供接口,使用HCT套件时,通过`e=ENGINE_by_id("hct")`选择密码引擎为hct,然后直接通过openssl标准(EVP)接口即可完成对hct密码计算套件的调用。 # **5. 注意事项** -1\. hct_1.1.0.20230730_rc版本优化了证书检查机制(海光3号系列芯片),可以在非sudo权限下使用HCT。该功能需要BIOS支持,故在3号芯片上需升级BIOS到支持新证书检查功能的版本。 +1\. HCT在hct_1.1.0.20230730_rc之后(包括该版本)的版本中,优化了证书检查机制(海光3号系列芯片),可以在非sudo权限下使用HCT。该功能需要BIOS支持,故在3号芯片上需升级BIOS到支持新证书检查功能的版本。 __另外部分旧有的BIOS也可以采用在线升级的方式更新BIOS,详情如下:__ ``` 操作提示: @@ -174,3 +196,22 @@ __另外部分旧有的BIOS也可以采用在线升级的方式更新BIOS,详 Ⅲ. 从 https://gitee.com/anolis/hygon-devkit.git 仓库中的bin目录中获得hag程序 Ⅳ. 运行./hag general download_firmware ``` + +2\. 如果BIOS支持,可以将PSP CCP配置给C86使用,BIOS设置步骤如下: +``` + Ⅰ. 进入BIOS,选择“HYGON CBS”,进入“Moksha Common Options” + Ⅱ. 在“Available PSP CCP VQ Count”中输入4 +``` +**说明:CPU芯片中包含两类CCP协处理器,一类为PSP CCP,一类为NTB CCP,通常BIOS只会将NTB CCP配置给用户使用,PSP CCP一般用于可信计算场景。如果BIOS支持将PSP CCP配置给用户(C86)使用,那么HCT就可以获得更多的协处理器资源,表现出更高的性能。** + +3\. hct_2.0.0.20240430_release版本支持noiommu使用场景,支持2M大页和1G大页两种模式,可参考如下提示使用 +``` +提示: + Ⅰ. 确保内核CONFIG_VFIO_NOIOMMU配置为打开状态 + Ⅱ. 需要关闭iommu及配置2M大页(如要使用1G大页模式,把配置中'2M'对应地改为'1G'即可): mem_encrypt=off amd_iommu=off default_hugepagesz=2M hugepagesz=2M hugepages=2048 + Ⅲ. 打开noiommu模式: echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode + Ⅳ. 以vfio-pci模式绑定ccp: ./hctconfig start -m vfio-pci + Ⅴ. 若开启了内存加密,即在grub中配置了sme=on,则需要加载hct.ko,否则该功能无法正常使用 +``` + +4\. hct_2.0.0.20240430_release版本相较于以往版本,在用户态代码(hct.so和libhcts.so)和内核模块代码(hct.c)均有较多改动,建议这两部分同步进行更新,若升级此版本时,只更新用户态代码或只更新内核模块代码,则可能出现异常