# openssl engine

## 概述

openssl 硬件引擎(Engine）能够使用户比较容易地将自己的硬件加入到 openssl 中去，替换其提供的软件算法。

**openssl engine 的实现原理**

Openssl 中的许多数据结构不仅包含数据本身，还包含各种操作，并且这些操作是可替换的，这类操作集合命名一般是 `XXX_METHOD`，例如：DSA_METHOD、ECDH_METHOD、DH_METHOD、RSA_METHOD 等。openssl 对各种类型都提供了默认的计算方法(软算法)。如果用户实现了自己的 `XXX_METHOD`，那么就能替换 openssl 提供的方法，通过硬件实现加密算法。

## 使用说明

X5 security 系统利用 openssl 的 engine 机制，支持通过 openssl 接口调用 REE 中的加解密模块，以执行加解密相关操作。
目前 openssl engine 仅支持对称加密和 HASH 算法的调用，支持的算法列表请见 [算法列表](1-Cryptographic_algorithms.html#span-id-algorithms-list)

- 代码所在路径 : `hbre/openssl-engine/src`
- engine 板端路径: `/lib/engines-1.1/te600.so`
- 使用示例请参考 : [openssl 使用示例](1-Cryptographic_algorithms.html#span-id-opessl-engine-sample-code)

**注意**
X5 平台使用 openssl engine 依赖于硬件安全模块 TE600。需先加载 TE600 驱动 `modprobe te_crypto`  
关于硬件安全模块，请参考[安全硬件介绍](../security_ip/security_ip.html)

## <span id="opessl-engine-sample-code"/> openssl 使用示例

## 对称加解密算法示例

使用 aes-128-cbc 分别加密解密 `plain.data`

**加密操作**

```
openssl enc -engine te600 -aes-128-cbc -in plain.data -out encrypt.data -K 12345678901234567890123456789012 -iv 0123456789abcdef0123456789abcdef
```

**解密操作**

```
openssl enc -engine te600 -d -aes-128-cbc -in encrypt.data -out decrypt.data -K 12345678901234567890123456789012 -iv 0123456789abcdef0123456789abcdef
```

**验证对比**

对比源文件`plain.data` 和 解密文件 `decrypt.data` 一致，说明 openssl engine 运行正常

```

~# md5sum decrypt.data  plain.data
7572d7b68b5f11e2c5152d9a112372be  decrypt.data
7572d7b68b5f11e2c5152d9a112372be  plain.data
```

## HASH算法示例

**硬件计算**

使用 md5 计算文件 `decrypt.data`

```
~# openssl dgst -engine te600 -md5 plain.data
engine "te600" set.
MD5(plain.data)= 7572d7b68b5f11e2c5152d9a112372be
```

从上得到，使用 te600 硬件计算 md5 值为 `7572d7b68b5f11e2c5152d9a112372be`

**软件计算**

使用软件算法计算 md5 值

```
~# md5sum  plain.data
7572d7b68b5f11e2c5152d9a112372be  plain.data
```

**验证对比**

对比二者 md5 值一致，说明 openssl engine 运行正常
