-
Notifications
You must be signed in to change notification settings - Fork 11
/
protocol.txt
91 lines (68 loc) · 3.19 KB
/
protocol.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Fakio 安全传输协议
Author:Serho Liu <serholiu@gmail.com>
Date: 2017-07-11
Version: V3
一 整体结构图
Response Buffer
/ | \
Remote Server Client
\ | /
Request Buffer
说明如下:
1. Client: 发起请求的一方
2. Remote: Client 请求的真实地址(主机)
二 密码套件
支持如下 AEAD ciphers
* 0x01 aes-128-gcm: AES-128-GCM
* 0x02 aes-256-gcm: AES-256-GCM
* 0x03 chacha20-poly1305: CHACHA20-POLY1305
三 握手协议
1. Client 请求
根据 SOCKS5 协议的 Request 部分修改得到握手协议的 Client 请求部分, 协议格式如下所示:
+---------------+------+--------------------------------------------------+
| Header | Plain| Data |
+-----+---------+------+---------+-----+------+-----+----------+----------+
| LEN | LEN TAG | USER | PADDING | VER | CTYP |ATYP | DST.ADDR | DST.PORT |
+-----+---------+------+---------+-----+------+----------------+----------+
| 2 | Var. | 32 | Var. | 1 | 1 | 1 | Var. | 2 |
+-----+---------+------+---------+-----+------+-----+----------+----------+
其中:
+. 下面涉及加密的使用 aes-256-gcm, 密钥为预留 key SHA2 摘要
+. Header LEN 为 Plain + (Data加密) 的长度, 并加密
+. USER 为预留用户名 SHA2 摘要
+. PADDING 为随机字符, 长度范围 1~255, 第一个字节表示长度
+. VER 0x03
+. CTYP 后续使用的密码套件, 编号见 <二>
+. 后续地址跟 SOCKS5 协议一样
+. Data 同 LEN 字段一样加密
2. Server 响应
响应 Client 客户端请求, 格式如下所示:
+---------------+--------------------------------+
| Header | Data |
+-----+---------+---------+-------+-------+------+
| LEN | LEN TAG | PADDING | RESP | EKEY | DKEY |
+-----+---------+---------+-------+-------+------+
| 2 | Var. | Var. | 1 | Var. | Var. |
+-----+---------+---------+-------+-------+------+
其中:
+. 下面涉及加密的使用 aes-256-gcm, 密钥为预留 key SHA2 摘要
+. Header LEN 为 Plain + (Data加密) 的长度, 并加密
+. PADDING 为随机字符, 长度范围 1~255, 第一个字节表示长度
+. RESP 为服务器响应结果:
0x00 - 成功
0x01 - Cipher 不支持
0x02 - 服务器内部错误
0x03 - 请求 Remote 无法访问
+. 在 RESP 为 0x00 的情况下 (第一个字节表示长度):
EKEY - 客户端加密 Key
DKEY - 客户端解密 Key
3. 数据传输
使用握手时协商的算法和获取到的 Key, 数据包格式如下:
+-----+---------+---------+----------+
| LEN | LEN TAG | DATA | DATA TAG |
+-----+---------+---------+----------+
| 2 | Var. | Var. | Var. |
+-----+---------+---------+----------+
其中:
+. LEN 为 DATA + DATA TAG 长度
+. LEN 和 DATA 加密