我正在尝试将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中没有看到任何建议这样做的内容。
<--编辑-->
以下是我的更改补丁: