使用openssl api识别证书中的EC曲线

时间:2014-06-16 15:38:18

标签: openssl certificate

我试图在屏幕上显示一些证书信息,用于密钥生成的曲线给我带来麻烦。在使用的certificate example曲线中,正确识别为prime256v1。但是,我想使用OpenSsl api获取此信息。什么功能可以实现这个目标?

我正在使用ManagedOpenSsl,但这并不重要。问题是我可以在C中找到我遇到的每一个问题的例子,但不适用于这个问题。

1 个答案:

答案 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一个接一个地获取hEC_GROUP_get_curve_GFpEC_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标志会导致握手失败。