OPENSSL研究,Client Key Exchange的疑问
wyly 2009-03-03 02:02:45 按照原理是:客户端生成随机 pre master secret,用服务器送过来的公钥加密,然后
用 Client Key Exchange发给服务器。
跟踪openssl,过程发现一个问题:
下面是ssl的ssl3_send_client_key_exchange函数的一个节选:
/* Fix buf for TLS and beyond */
if (s->version > SSL3_VERSION)
p+=2;
//pre master cecret 存在变量tmp_buf里
//把pre master secret 加密结果,存在缓冲区p里
//问题:这个p再也没有用过,并且网络抓包发现的数据和这个p里的数据完全无关
//而理论上应该把p里的数据发出去的
n=RSA_public_encrypt(sizeof tmp_buf, tmp_buf,p,rsa,RSA_PKCS1_PADDING);
#ifdef PKCS1_CHECK
if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
#endif
if (n <= 0)
{
SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
goto err;
}
/* Fix buf for TLS and beyond */
if (s->version > SSL3_VERSION)
{
s2n(n,q);
n+=2;
}
s->session->master_key_length=
s->method->ssl3_enc->generate_master_secret(s,
s->session->master_key,
tmp_buf,sizeof tmp_buf);
OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);