jntass/TASSL-1.1.1b

ECC_WITH_SM4_SM3服务端验证客户端证书报签名错误

Closed this issue · 1 comments

我在做一个支持ECC_WITH_SM4_SM3的客户端,客户端发送TA生成的双证书,将tassl/gmssl/sm2only.ovssl.cn作为国密的server进行连接调试,发现有个可以与gmssl,sm2only.ovssl.cn成功连接通信的状况下,tassl-1.1.1b会报错tls_process_cert_verify:bad signature:ssl/statem/statem_lib.c
,通过比对发现
在tls_process_cert_verify中497行

    if(s->s3->tmp.new_cipher->id == TLS1_CK_ECC_WITH_SM4_SM3 || s->s3->tmp.new_cipher->id == TLS1_CK_ECDHE_WITH_SM4_SM3){
        md_ctx = EVP_MD_CTX_new();
        EVP_DigestInit(md_ctx, EVP_sm3());
        EVP_DigestUpdate(md_ctx, (const void *)hdata, hdatalen);
        EVP_DigestFinal(md_ctx, cert_verify_md, (unsigned int *)&hdatalen);
        if(md_ctx != NULL)
        	EVP_MD_CTX_free(md_ctx);
        hdata = cert_verify_md;
    }

hdata = cert_verify_md;
这样在hdata就是进行过hash的数据,在568行将hdata作为输入调用EVP_DigestVerify时,会将hdata再次hash一遍,这样最终会导致签名验证失败
我把这个分支跳过则可以验证通过
请问这样hash两次是有什么特殊的设定么

参考《GB/T 38636 2020》 6.4.5.9 Certificate Verify消息