我试图在屏幕上显示一些证书信息,用于密钥生成的曲线给我带来麻烦。在使用的certificate example曲线中,正确识别为prime256v1。但是,我想使用OpenSsl api获取此信息。什么功能可以实现这个目标?
我正在使用ManagedOpenSsl,但这并不重要。问题是我可以在C中找到我遇到的每一个问题的例子,但不适用于这个问题。
答案 0 :(得分:2)
OpenSSL wiki在Elliptic Curve Cryptography有一个包含其中一些内容的页面。您需要的大部分EC功能都在<openssl src dir>/crypto/ec/ec.h
。
您必须使用EVP_PKEY* pkey=X509_get_pubkey(x509)
从证书中提取公钥。
使用EVP_PKEY_get_type(pkey)
检查密钥类型。它应该返回EVP_PKEY_EC
。你需要写EVP_PKEY_get_type
。这是:
int EVP_PKEY_get_type(EVP_PKEY *pkey)
{
ASSERT(pkey);
if (!pkey)
return NID_undef;
return EVP_PKEY_type(pkey->type);
}
您使用EC_KEY* key = EVP_PKEY_get1_EC_KEY(pkey)
获取密钥。由于其为get1
,因此会在EC_KEY*
上突破引用计数。务必致电EC_KEY_free
。 (get0
不要求免费)。
如果设置了 OPENSSL_EC_NAMED_CURVE
,则可以使用EC_GROUP_get_curve_name
。对于所使用的曲线,它将返回 NID (更准确地说,是域参数)。例如,prime256v1
将返回NID_X9_62_prime256v1
。
否则,您需要使用curve
(或G
一个接一个地获取h
,EC_GROUP_get_curve_GFp
,EC_GROUP_get_curve_GF2m
等域信息参数),EC_GROUP_get_order
和朋友。
OPENSSL_EC_NAMED_CURVE
是一面旗帜。您可以使用EC_GROUP_get_asn1_flag
获取标记,然后使用flag & OPENSSL_EC_NAMED_CURVE
进行测试。
您可以在Named Curves看到命名曲线和非命名曲线的示例。更有可能的是,您将拥有一条命名曲线。对于OpenSSL,省略OPENSSL_EC_NAMED_CURVE
标志会导致握手失败。