如何定位OpenSSL库中TLS 1.3握手消息哈希的调用代码?
定位OpenSSL中TLS 1.3握手消息哈希的调用代码
以下是几个精准定位的方法,避开底层摘要函数的无关调用干扰:
直接在TLS 1.3专属哈希更新函数设断点
OpenSSL为TLS 1.3握手哈希封装了专用处理函数,直接断点该函数可过滤掉其他哈希操作:void tls13_update_handshake_hash(SSL *s, const unsigned char *data, size_t len)该函数定义在
ssl/tls13_handshake.c中,所有握手消息(包括ClientHello、ServerHello)的哈希更新都会经过它。断点命中后查看调用栈,就能直接定位到对应握手消息的处理代码。追踪握手消息的核心处理流程
每个握手消息在接收或发送后都会触发哈希更新,可在以下关键处理函数设断点:- ClientHello处理:
tls13_process_client_hello(位于ssl/tls13_handshake.c) - ServerHello处理:
tls13_process_server_hello(位于ssl/tls13_handshake.c)
在这些函数中查找调用tls13_update_handshake_hash的代码行,就是对应消息的哈希更新触发点。
- ClientHello处理:
过滤底层EVP_DigestUpdate的无效命中
若仍想使用EVP_DigestUpdate断点,可在断点处判断当前上下文是否为握手哈希:- 打印当前
ctx的内存地址 - 查看SSL结构体的
handshake_hash字段(定义在ssl/ssl_local.h),该字段就是握手哈希的EVP_MD_CTX指针 - 对比
ctx与s->handshake_hash的地址,一致则为握手哈希更新操作,此时查看调用栈即可定位来源
- 打印当前
借助调试编译的OpenSSL日志
重新编译OpenSSL时开启调试选项:./config enable-debug make运行
s_client时添加-trace参数,日志会输出握手哈希更新的细节,结合日志中的函数调用信息,可对应到代码具体位置。
内容的提问来源于stack exchange,提问作者Tobic
相关产品推荐
相关产品推荐

