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 でデバッグすると、2 つの PreMasterSecret (Z) が異なります。返された Yc に署名する必要がありますか、それとも別の方法でパックする必要がありますか? RFC 5246には、これを示唆するものは何もありません。
<-- 編集 -->
ここに私の変更のパッチがあります: