正如这个security.SE答案所说,如果证书中的公钥和私钥文件中的公钥相同,那么验证就足够了。这是因为它是他们唯一共同的共享信息。
mbedtls_pk_content
因此,我们需要从和中挖掘出公钥mbedtls_x509_cert
并进行比较。
mbedtls 没有针对此任务的通用 API 调用,但可以通过特定于算法的解决方案来完成。步骤如下。假设我们有
mbedtls_x509_cert crt;
mbedtls_pk_context pk;
哪里crt
有证书,pk
是我们的公私钥对。
我们从两者获得密钥对。在椭圆曲线密码的情况下,它是由mbedtls_pk_ec(...)
宏完成的。在 rsa 的情况下,mbedtls_rsa_context(...)
需要:
mbedtls_ecp_keypair* crt_pair = mbedtls_pk_ec(crt->pk);
mbedtls_ecp_keypair* pk_pair = mbedtls_pk_ec(*pk);
注意,虽然crt_pair
现在是一个密钥对,但只有它的公共部分是非零的,因为证书显然没有私钥部分。mbedtls_pk_ec(...)
对我来说看起来有点像宏,因为它不使用指向结构的指针,而是直接使用结构。
然后,我们比较密钥对中的公钥:
mbedtls_mpi *pk_pub_X = &pk_pair->Q.X;
mbedtls_mpi *pk_pub_Y = &pk_pair->Q.Y;
mbedtls_mpi *crt_pub_X = &crt_pair->Q.X;
mbedtls_mpi *crt_pub_Y = &crt_pair->Q.Y;
在其他算法(RSA)的情况下,这些部分可能会有所不同,但是我们总是需要一组大数(mbedtls_mpi
),并比较这些大数。
然后,我们使用 mbedtls 大数功能来比较它们:
bool does_it_differ = mbedtls_mpi_cmp_mpi(pk_pub_X, crt_pub_X) || mbedtls_mpi_cmp_mpi(pk_pub_Y, crt_pub_Y);
注意:验证证书匹配并不足以验证证书的有效性,它只是需要。证书的验证可以通过已经更加愉快和简单的mbedtls_x509_crt_verify(...)
功能来完成。