我正在尝试将 DHE_DSS 实现到 go 的 crypto/tls 包中。不幸的是,我似乎无法让 PreMasterSecret (Z) 相同,我的基本工作流程是:
接收服务器密钥交换消息
- 提取 P、G、Ys
- 使用提供的数字签名进行验证
准备客户端密钥交换消息
- 创建客户的 Xc
- 生成 Yc (Yc = G^Xc % P)
- 生成 Z (Z = Ys^Xc % P)
- 发回 Yc,包装如下:
ckx := make([]byte, len(yC)+2)
ckx[0] = byte(len(Yc)>>8)
ckx[1] = byte(len(Yc))
copy(ckx[2:], yBytes)
但是,当我使用 gnutls-serv 调试它时,两个 PreMasterSecrets (Z) 是不同的。我是否需要在退回的 Yc 上签名,或者以其他方式打包?我在RFC 5246中看不到任何建议。
<-- 编辑-->
这是我的更改补丁: