我正在研究DTLS的Golang实现,并且无法为VerifyData生成有效值。我有一个有效的示例here,该示例显示了我的代码(以及如何获得与OpenSSL不同的内容)
printf调试OpenSSL时,握手主体的哈希值看起来与我的不同。似乎真的不太可能,我会认为我收集的数据包有误。但是将printf语句放在
之前密码套件为TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
,您可以在https://github.com/pions/dtls上查看整个代码库
答案 0 :(得分:1)
VerifyData(已完成)始终使用TLS定义的PRF,对于TLS1.2(和DTLS1.2),PRF是使用可以取决于密码套件的哈希值的两倍HMAC。对于所有先前存在的密码套件,D / TLS1.2 PRF使用SHA256,而您标识的TLS1.2新套件也使用SHA256。 (事实上,它对PRF使用SHA256 仅,因为GCM套件不对数据使用HMAC。)其他一些TLS1.2新套件使用SHA384。同样,1.2中的VerifyData的 length 正式取决于密码套件,但是所有1.2版之前的套件都必须使用12版之前的协议大小,并且1.2版中的所有新套件也都使用12位。 ,因此在实践中没有区别。
但是,根据您的要旨,您的问题是您包括了最初的ClientHello和HelloVerifyRequest ,但您不应该这样做。请参阅第page 18 in rfc6347和section 4.2.6顶部附近的第4.2.1节的倒数第二(倒数第二个,我不常使用的单词!)段落,尽管这不是在您的示例中,问题不在于,如果使用分段进行传输,您仍然必须对未分段消息进行哈希处理。