diff --git a/sig/Hygon Arch/assets/sealing-key.png b/sig/Hygon Arch/assets/sealing-key.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8df726655c4c27a451f0871546f9d5d11b673e Binary files /dev/null and b/sig/Hygon Arch/assets/sealing-key.png differ diff --git "a/sig/Hygon Arch/content/1-\345\256\211\345\205\250\345\212\237\350\203\275\347\216\257\345\242\203\351\205\215\347\275\256/1-\345\256\211\350\243\205\346\223\215\344\275\234\347\263\273\347\273\237\345\222\214\345\206\205\346\240\270.md" "b/sig/Hygon Arch/content/1-\345\256\211\345\205\250\345\212\237\350\203\275\347\216\257\345\242\203\351\205\215\347\275\256/1-\345\256\211\350\243\205\346\223\215\344\275\234\347\263\273\347\273\237\345\222\214\345\206\205\346\240\270.md" index 7d709629c7e76e3a4264ade7ca8e071b71a68f41..b43b034ffcb00dc2e60837be8509eba3b4f7cea1 100644 --- "a/sig/Hygon Arch/content/1-\345\256\211\345\205\250\345\212\237\350\203\275\347\216\257\345\242\203\351\205\215\347\275\256/1-\345\256\211\350\243\205\346\223\215\344\275\234\347\263\273\347\273\237\345\222\214\345\206\205\346\240\270.md" +++ "b/sig/Hygon Arch/content/1-\345\256\211\345\205\250\345\212\237\350\203\275\347\216\257\345\242\203\351\205\215\347\275\256/1-\345\256\211\350\243\205\346\223\215\344\275\234\347\263\273\347\273\237\345\222\214\345\206\205\346\240\270.md" @@ -12,6 +12,9 @@ **注:不同版本可能存在差异,可以根据实际情况调整。** ## 下载测试代码仓库 +如果仓库较大clone困难,可以加参数 --depth 1 进行精简clone 。 +**如果客户将仓库作为zip压缩包下载下来,要将zip包传输到目标机器上再解压,不要解压后再传到目标机器,容易出现文件丢失。** + ``` $ sudo chmod a+w /opt $ cd /opt/ diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\347\247\230\351\222\245\345\260\201\345\215\260\346\212\200\346\234\257\344\273\213\347\273\215.md" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\347\247\230\351\222\245\345\260\201\345\215\260\346\212\200\346\234\257\344\273\213\347\273\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..0ba6236644f2804e37512925bd29b1fff86d9e69 --- /dev/null +++ "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\347\247\230\351\222\245\345\260\201\345\215\260\346\212\200\346\234\257\344\273\213\347\273\215.md" @@ -0,0 +1,65 @@ +测试之前,请参考[2-1-安装CSV软件](https://openanolis.cn/sig/Hygon-Arch/doc/865622260278236994?lang=zh)准备软件环境。 + +## 概要 +CSV虚拟机可以从海光安全固件中获取由机器根密钥和虚拟机相关信息派生出的密钥。该密钥可以被客户用于任何目的,例如秘钥封印或与外部实体通信。 + +## 原理介绍 +![](../../../assets/sealing-key.png) + +1、海光安全固件通过硬件派生出的root-key 、固件中csv-sealing-key 字符串、虚拟机| policy | user_pubkey_digest | user_vm_digest | vm_id | vm_version | 内容派生出sealing key,该key 只能从虚拟机内部获取,key在虚拟机生命周期不变。 + +2、虚拟机通过相应的接口获取海光安全固件中产生的sealing key。 + +3、虚拟机中用户应用程序使用获取的sealing key 进行一定场景的业务应用。 + +### 派生sealing key组件描述 + +| 组件 | 描述 | +|----- |-------| +|root-key|海光安全固件通过硬件派生出的root-key,每台机器唯一且固定不变。| +|csv-sealing-key|海光安全固件提供的字符串,固定不变,作为派生秘钥的参数之一。| +|policy|csv虚拟机的启动策略,用户通过 hag csv generate_policy --nodebug 生成默认的配置,csv generate_policy --help 可以查看详细配置说明,qemu 启动虚拟机的policy 参数配置需要和hag 设置的一致。| +|user_pubkey_digest|DH公钥的SM3摘要值,用于确认启动虚拟机的用户身份。DH密钥由虚拟机用户生成,用于对虚拟机启动参数进行签名。DH公钥在使用hag csv generate_launch_blob -build $build_id -bios OVMF.fd -kernel vmlinuz -initrd initramfs.img 计算虚拟机组件摘要时候自动生成,DH证书文件为guest_owner_dh.cert,作为qemu的参数传入。| +|user_vm_digest|虚拟机组件启动摘要,通常由ovmf,内核image,文件系统initrd组成,通过hag csv generate_launch_blob -build $build_id -bios OVMF.fd -kernel vmlinuz -initrd initramfs.img 命令生成launch_blob.bin文件,该文件中包含虚拟机启动摘要,文件作为qemu 启动参数传入。| +|vm_id|虚拟机id,用户自己定义,hag csv generate_launch_blob --help 中 通过-id 参数传入,字段默认都为0。| +|vm_version|虚拟机版本号,用户自己定义,hag csv generate_launch_blob --help 中 通过-version 参数传入,字段默认都为0。| + +### sealing key qemu启动参数介绍 + +1、获取安全固件build_id +``` +build_id=`sudo hag csv platform_status |grep "build id"` +``` +2、导出证书链 +``` +hag csv export_cert_chain +``` +3、生成 policy 文件 +``` +hag csv generate_policy --nodebug +``` +4、生成launch_blob.bin、guest_owner_dh.cert +``` +hag csv generate_launch_blob -build $build_id -bios OVMF.fd -kernel vmlinuz -initrd initramfs.img +``` +guest_owner_dh.cert 为用户dh证书,对应的私钥对launch_blob.bin中的字段进行签名,guest_owner_dh.cert 作为qemu的参数传入,海光安全固件获取证书中的公钥,对launch_blob.bin 中的内容进行验签。 +launch_blob.bin作为qemu启动参数传入,launch_blob.bin内容对应为SESSION的数据结构,内容如下: + + +| 偏移 | 比特位 | 输入/输出 | 名称 | 描述 | +|----- |-------| ---------|---------|------| +|00h | 127:0| In | NONCE| 一次性随机数,用户随机生成 | +|10h | 255:0| In | WRAP_TK | KEK对 TEKTIK 加密形成WRAP_TK,TEKTIK 用户随机生成 ,KEK 由主密钥派生出来| +|30h | 127:0| In | WRAP_IV |加密TEKTIK使用的IV,加密参数之一| +|40h | 255:0| In | WRAP_MAC |使用KIK作为key 对WRAP_TK,WRAP_IV 进行hmac计算生成WRAP_MAC进行完整性保护,KIK 由主密钥派生出来| +|60h | 255:0| In | SESSION_MAC |使用TIK对policy\|\|session data(0x124 - 0x2C3)进行hmac计算生成SESSION_MAC对数据进行完整性保护| +|80h | 1311:0| In | - |保留字段,0| +|124h | 2047:0| In | Menc |主密钥,用户随机生成,被PDH公钥加密后为Menc,KEKKIK 由主密钥派生,海光安全固件中使用PDH私钥对Menc进行解密得到主密钥,使用主密钥派生出KEKKIK,使用KIK对WRAP_TK、WRAP_IV 进行完整性验证,KEK解密WRAP_TK 得到TEKTIK,使用KIK对policy\|\|session data(0x124 - 0x2C3)重新进行hmac计算和SESSION_MAC进行对比,实现数据完整性保护| +|224h | 255:0| In | DIGEST |虚拟机摘要,使用虚拟机组件计算生成,虚拟机组件如 OVMF.fd、 vmlinuz 、initramfs.img,安全固件中会对其进行重新计算和用户计算出的DIGEST进行对比,从而实现可信度量启动| +|244h | 255:0| In | - |保留字段,0| +|264h | 127:0| In | VM_ID |虚拟机id,用户自己定义,hag csv generate_launch_blob --help 中 通过-id 参数传入| +|274h | 127:0| In | VM_VERSION |虚拟机版本号,用户自己定义,hag csv generate_launch_blob --help 中 通过-version 参数传入| +|284h | 511:0| In | USERDATA |用户自定义数据| +|2C4h | 511:0| In | SIG |用户DH私钥对SESSION数据的签名| + +### 测试用例参考 [2-3-2-测试密钥封印](https://openanolis.cn/sig/Hygon-Arch/doc/865622217613776670?lang=zh) diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\350\277\234\347\250\213\350\256\244\350\257\201\346\212\200\346\234\257\344\273\213\347\273\215.md" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\350\277\234\347\250\213\350\256\244\350\257\201\346\212\200\346\234\257\344\273\213\347\273\215.md" index 0889458a04061ba5887a0b3c477448c928630e49..2a238823568288556188f12569936d1d83f2f939 100644 --- "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\350\277\234\347\250\213\350\256\244\350\257\201\346\212\200\346\234\257\344\273\213\347\273\215.md" +++ "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/2-CSV\350\277\234\347\250\213\350\256\244\350\257\201\346\212\200\346\234\257\344\273\213\347\273\215.md" @@ -43,9 +43,9 @@ CSV 固件利用芯片密钥CEK对PEK证书进行再次签名。此时PEK证书 ![](../../../assets/attestation_1.png) ### 远程认证报告生成 #### 虚拟机摘要值生成 -为了保证系统程序及其运行环境的完整性,虚拟机启动过程中,安全处理器需要对OVMF_CODE.fd、虚拟机内核文件和虚拟机内存文件(initrd)进行度量。
+为了保证系统程序及其运行环境的完整性,虚拟机启动过程中,安全处理器需要对OVMF.fd、虚拟机内核文件和虚拟机内存文件(initrd)进行度量。
1、将服务程序放入initrd文件中。
-2、对initrd文件、OVMF_CODE.fd和虚拟机内核镜像文件,利用SM3算法计算虚拟机文件摘要值。
+2、对initrd文件、OVMF.fd和虚拟机内核镜像文件,利用SM3算法计算虚拟机文件摘要值。
3、在虚拟机启动时提供虚拟机文件和摘要值,CPU中的安全处理器利用 SM3 算法计算虚拟机文件的摘要并进行完整性检验。
4、完整性信息校验通过,虚拟机成功启动,在生成认证报告时将此摘要值作为虚拟机摘要值写入认证报告中。
#### 生成认证报告 @@ -91,7 +91,7 @@ CEK签名证书链校验流程:
|30h |127:0 | Out |Version |虚拟机版本号,虚拟机用户自定义。| |40h |511:0 | Out |USERDATA |用户自定义数据| |80h |127:0 | Out |MNONCE |一次性随机数,用于区别报告内容防重放攻击,由虚拟机用户生成。| -|90h |255:0 | Out |DIGEST |虚拟机的启动摘要,虚拟机initrd文件、OVMF_CODE.fd和虚拟机内核
镜像文件的SM3摘要值。| +|90h |255:0 | Out |DIGEST |虚拟机的启动摘要,虚拟机initrd文件、OVMF.fd和虚拟机内核
镜像文件的SM3摘要值。| |B0h |31:0 | Out |POLICY |虚拟机规则| |B4h |31:0 | Out |SIG_USAGE |签名密钥用途 PEK| |B8h |31:0 | Out |SIG_ALGO |签名算法 SM2|