# CL-TLS
## 基于ASCON的轻量级认证与传输平台设计与实现【我的毕业设计】
## 介绍
在工业互联网等环境中,终端设备计算资源有限、终端设备拓扑变化复杂,为了满足传输安全的需要,在[TLSv1.3](https://datatracker.ietf.org/doc/html/rfc8446)协议的基础之上,设计了轻量级的CL-TLS协议。CL-TLS协议简化了报文结构,引入了轻量级的ASCON-128A加密算法和ASCON-HashA哈希算法,同时使用无证书公钥密码体制(CLPKC)取代PKI机制进行身份认证。
## CL-TLS协议要点
### 应用层协议
使用CL-TLS协议的系统运行时,需要使用到如下应用层协议:
- KGC协议
在本实现中,CL-TLS以MQTT代理服务器的形式运行,使用了下列应用层协议:
- MQTT协议
- CONNCTL协议
KGC协议和CONNCTL协议的详细作用将在后面说明。
### CL-TLS握手流程
```
Client Server
Key ^
Exch | ClientHello
v -------->
^ Key
ServerHello | Exch
v
^ Server
{PublicKeyRequest*} | Params
v
{PublicKey} ^
{PublicKeyVerify} | Auth
<-------- {Finished} v
^ {PublicKey*}
Auth | {PublicKeyVerify*}
v {Finished} -------->
[Application Data] <-------> [Application Data]
* Indicates optional or situation-dependent
messages/extensions that are not always sent.
{} Indicates messages protected using keys
derived from a [sender]_handshake_traffic_secret.
[] Indicates messages protected using keys
derived from [sender]_application_traffic_secret_N.
```
### 身份认证方式
CL-TLS使用基于CLPKC的方案进行身份认证。每个设备均拥有自己的身份ID和密钥对,其中设备密钥对由设备自身和KGC共同生成,使用KGC的私钥和设备ID即可验证设备公钥是否属于该设备。
#### 设备注册流程
- 新服务端设备注册流程
1. 设备选取 $Seed_A\gets\\{0,1\\}^{256}$ ;
2. 设备生成部分密钥 $(PK_A,SK_A):=Ed25519GenKeypair(Seed_A)$ ;
3. 设备将自身身份 $ID$ 和 $PK_A$ 发送给KGC;
4. KGC选取 $Seed_B\gets\\{0,1\\}^{256}$ ;
5. KGC生成部分密钥 $(PK_B,SK_B):=Ed25519GenKeypair(Seed_B)$ ;
6. KGC计算 $S:=Sign_{SK_{KGC}}(ID||PK_A||PK_B)$ ;
7. KGC将 $(PK_B,SK_B,S)$ 发回设备;
8. 设备保存公钥 $PK:=PK_A||PK_B||S$ ,私钥 $SK:=SK_A||SK_B$
- 新客户端设备注册流程
1. 设备选取 $Seed_A\gets\\{0,1\\}^{256}$ ;
2. 设备生成部分密钥 $(PK_A,SK_A):=Ed25519GenKeypair(Seed_A)$ ;
3. 设备将自身身份 $ID$ 和 $PK_A$ 发送给KGC;
4. 设备将自身所属的所有服务端的身份集合 $ID_S$ 发送给KGC;
5. KGC选取 $Seed_B\gets\\{0,1\\}^{256}$ ;
6. KGC生成部分密钥 $(PK_B,SK_B):=Ed25519GenKeypair(Seed_B)$ ;
7. KGC计算 $S:=Sign_{SK_{KGC}}(ID||PK_A||PK_B)$ ;
8. KGC通知 $ID_S$ 中的每一个服务端,添加 $ID$ 到其允许来访的身份列表中;
9. KGC将 $(PK_B,SK_B,S)$ 发回设备;
10. 设备保存公钥 $PK:=PK_A||PK_B||S$ ,私钥 $SK:=SK_A||SK_B$
特别地,当整个系统从零开始部署时,KGC的密钥对通过以下流程生成:
- KGC密钥对初始化生成流程
1. KGC选取 $Seed_A\gets\\{0,1\\}^{256}$ ;
2. KGC生成部分密钥 $(PK_A,SK_A):=Ed25519GenKeypair(Seed_A)$ ;
3. KGC选取 $Seed_B\gets\\{0,1\\}^{256}$ ;
4. KGC生成部分密钥 $(PK_B,SK_B):=Ed25519GenKeypair(Seed_B)$ ;
5. KGC计算 $S:=Sign_{SK_A||SK_B}(ID||PK_A||PK_B)$
6. KGC保存公钥 $PK:=PK_A||PK_B||S$ ,私钥 $SK:=SK_A||SK_B$
#### 签名和验签算法
- $Sign_{SK_A||SK_B}(m)$ : $S_1:=Ed25519Sign_{SK_A}(m),S_2:=Ed25519Sign_{SK_B}(m),输出S:=S_1||S_2$
- $Vrfy_{PK_A||PK_B}(m,S_1||S_2)$ : $输出Ed25519Vrfy_{PK_A}(m,S_1)\wedge Ed25519Vrfy_{SK_B}(m,S_2)$
#### 访问控制
除了KGC以外,每个服务端都维护一个允许对自己进行访问的设备ID列表。属于某个服务器的客户端在进行注册时,KGC将会通知该服务器添加新客户端的设备ID到自己的允许访问列表中。
`ClientHello`消息中包含客户端的ID,服务端可以在收到后立即进行检查。
#### 身份验证
客户端和服务端在`PublicKey`消息中发送自己的公钥 $PK$ ,对方收到后通过计算 $Vrfy_{PK_{KGC}}(ID||PK_A||PK_B,S)$ 来验证公钥属于具有该 $ID$ 的设备。
客户端和服务端在`PublicKeyVerify`消息中发送使用自己的私钥 $SK$ 签名的通信数据摘要 $S_{traffic}:=Sign_{SK}(Hash(traffic))$ ,对方收到后通过计算 $Vrfy_{PK}(Hash(traffic),S_{traffic})$ 来确定对方为公钥的持有者。
除了新设备向KGC注册时不需要发送`PublicKey`和`PublicKeyVerify`以外,其余所有情况下连接握手时都需要验证双方身份。
### 错误处理
在整个通信过程中,如果任意一方出现错误,则向对方发送一个`Error Stop Notify`报文,其中包含错误代码,然后关闭TCP连接。对方收到后,可对错误进行展示和记录,然后终止会话。
## 代理服务器工作模式
在本实现中,CL-TLS以代理服务器的方式工作,传输MQTT应用层协议。
### 编译产物
- `cltls_client`:CL-TLS客户端代理服务器
- `cltls_server`:CL-TLS服务端程序,可以代理服务器模式运行或以KGC模式运行
- `cltls_misc_mqtt_client`:演示用的简单MQTT客户端程序
- `cltls_misc_mqtt_server`:演示用的简单MQTT服务端程序
- `cltls_misc_initializer`:KGC密钥对生成程序
### 模块结构
```
--------------------
| KGC Device |
| |
| -------------- |
-------+->| |<-+-------
| | | KGC Server | | |
| ---+--| |--+--- |
| | | -------------- | | |
| | | IDk PKk SKk | | |
| | -------------------- | |
| | | |
------------------------------+---+--------- ----------+---+-----------------------------
| Client Device | | | | | | Server Device |
| | v | | v | |
| --------------- ----------------- | | ----------------- --------------- |
| | |----->| |--+-----+->| |----->| | |
| | MQTT Client | | CL-TLS Client | | | | CL-TLS Server | | MQTT Server | |
| | |<-----| |<-+-----+--| |<-----| | |
| --------------- ----------------- | | ----------------- --------------- |
| IDc PKc SKc | | IDs PKs SKs PermittedIDs |
-------------------------------------------- --------------------------------------------
```
### 工作流程
下面说明一个最简系统的工作流程,该系统由一个KGC设备、一个客户端设备和一个服务端设备组成。
- KGC设备
- IP地址:`192.168.7.60`
- ID:`ECECECECECECECEC`
- 目录结构(�