参考资料:https://github.com/Yawning/obfs4/blob/master/doc/obfs4-spec.txt
obfs4网桥协议规范
重点看第四节和第五节,分别是握手阶段和传输阶段,整个过程类似TLS1.3协议,我不再啰嗦了
大致过程讲下,
客户端和服务端通过curve25519椭圆曲线算法,计算PSK得到对称密钥secretInput,
通过HKDF 算法计算secretInput, 得到对称加密的密钥 记作sec_key,
数据传输阶段,使用了secretbox加密,使用密钥 sec_key
只需要看代码 https://github.com/Yawning/obfs4/blob/master/transports/obfs4/obfs4.go 就可以了
从 newObfs4ClientConn函数看起,clientHandshake函数会发起握手
hs.generateHandshake()生成握手请求,发送给服务端
服务端收到请求hs.parseClientHandshake得到PSK 也就是seed
okm := ntor.Kdf(seed, framing.KeyLength*2) 根据seed 计算HKDF,作为对称加密的密钥
返回severhello,客户端解析n, seed, err := hs.parseServerHandshake(conn.receiveBuffer.Bytes()) 得到相同的seed,并和上面一样计算HKDF,作为对称加密的密钥