# 概述
## 简介
X5 芯片上的 Crypto IP 使用的是 ARM TE600，ARM TE600 是一款由 ARM 公司设计的 安全加密处理单元（Secure Crypto Engine），集成在 ARM 生态系统中，能够为嵌入式设备提供硬件加速的加密功能，并且作为加密硬件模块，与 ARM TrustZone 技术配合工作，旨在提供高性能、安全的加密操作。


## 安全算法

以下是硬件支持的算法列表：

| 算法   | 描述 |
|-----------|---------------------|
| AES | 支持 ECB / CBC / CTR / OFB / XTS / CBC-MAC / CMAC / CCM / GCM，支持 128/192/256 三种密钥长度 </br>XTS 仅支持 128/256 |
| DES / TDES | 支持 ECB / CBC / CBC-MAC / CMAC |
| HASH | 支持 SHA1 / 224 / 256 / 384 / 512 / SM3 / MD5, </br>支持 HMAC-SHA1 / 224 / 256 / 384 / 512 / SM3 / MD5 |
| RSA | 支持 1024 / 2048 / 3072 / 4096 / 8192 等密钥规格 |
| ECC | 支持 NIST 标准曲线 P-192 / 224 / 256 / 384 / 512 / 521 |
| SM2 | 256位密钥长度 |
| TRNG | 真随机数 |

# 硬件安全驱动

## 驱动源码
驱动相关文件位于：`kernel/drivers/crypto/te`

## 开启硬件安全

### 内核配置
在 menuconfig 配置中使能 te600 加解密驱动支持

![te600_menuconfig](_static/_image/te600_menuconfig.png)

**注意: 如果用户使用了其他配置文件，请确保 te600 配置选项 `CONFIG_CRYPTO_DEV_TE` 开启**

### dts 配置

X5 dts 中默认已开启了 te600 节点，路径 `kernel/arch/arm64/boot/dts/hobot/x5.dtsi`
```C
te600: te600@20300000 {
    compatible = "armchina,trust-engine-600";
    status = "okay";
    reg = <0x20300000 0x00100000>;
    interrupt-parent = <&gic>;
    interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
    host-number = <1>;
    clocks = <&hpsclks X5_SEC_AXI_CLK>,
            <&hpsclks X5_SEC_APB_CLK>;
    clock-names = "axi_clk", "merak_clk";
};
```

**注意: 如果用户使用了其他板级dtb，需要引用 `x5.dtsi`**


### 加载驱动
```shell
modprobe te_crypto
```

通过命令` cat /proc/crypto | grep "driver" | grep "\-te" `,可以查看当前系统 TE600 硬件支持的 crypto算法。

```
driver       : ecdh-nist-p256-te
driver       : ecdh-nist-p192-te
driver       : dh-te
driver       : rsa-te
driver       : gcm-sm4-te
driver       : gcm-aes-te
driver       : ccm-sm4-te
driver       : ccm-aes-te
driver       : cbcmac-3des-te
driver       : cbcmac-des-te
driver       : cbcmac-sm4-te
driver       : cbcmac-aes-te
driver       : cmac-3des-te
driver       : cmac-des-te
driver       : cmac-sm4-te
driver       : cmac-aes-te
driver       : sm3-te
driver       : hmac-sm3-te
driver       : sha512-te
driver       : hmac-sha512-te
driver       : sha384-te
driver       : hmac-sha384-te
driver       : sha256-te
driver       : hmac-sha256-te
driver       : sha224-te
driver       : hmac-sha224-te
driver       : sha1-te
driver       : hmac-sha1-te
driver       : md5-te
driver       : hmac-md5-te
driver       : ecb-3des-te
driver       : ecb-des-te
driver       : cbc-3des-te
driver       : cbc-des-te
driver       : ecb-sm4-te
driver       : ecb-aes-te
driver       : cbc-sm4-te
driver       : cbc-aes-te
driver       : ofb-sm4-te
driver       : ofb-aes-te
driver       : ctr-sm4-te
driver       : ctr-aes-te
driver       : xts-sm4-te
driver       : xts-aes-te
```

# 注意事项
硬件安全的使用方法通常是通过 libkcapi 和  openssl engine 提供的用户空间接口库。
