在 CMake 中通过 header/define 检查 OpenSSL 是否支持某些曲线

Check whether OpenSSL supports certain curve via header/define in CMake

我需要通过 CMake 检查 OpenSSL 是否支持某些椭圆曲线。 虽然可以通过 openssl/evp.h 中函数的存在来检查密码和哈希的可用性,例如 check_cxx_symbol_exists("EVP_md4", openssl/evp.h, _openssl_has_md4),但我看不到对曲线执行相同操作的方法。

我是不是遗漏了什么,或者没有比检查 openssl ecparam list_curves 的输出更好的方法了?

更新:由于我的代码不需要 openssl 可执行文件,因此非常希望避免依赖它来构建。

更新 2:感谢 David 的回答以以下模块结束:https://github.com/rnpgp/cmake-modules/blob/master/FindOpenSSLFeatures.cmake

此代码(主要取自 openssl)列出了可用的 EC:

#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/objects.h>

int
main ()
{
  int ret = 1;
  EC_builtin_curve *curves = NULL;
  size_t n, crv_len = EC_get_builtin_curves (NULL, 0);

  curves = OPENSSL_malloc((int)sizeof(*curves) * crv_len);
  if (curves == NULL)
    goto end;

  if (!EC_get_builtin_curves (curves, crv_len))
    goto memfree;

  for (n = 0; n < crv_len; n++)
    {
      const char *comment = curves[n].comment;
      const char *sname = OBJ_nid2sn (curves[n].nid);

      if (comment == NULL)
        comment = "CURVE DESCRIPTION NOT AVAILABLE";
      if (sname == NULL)
        sname = "";

      printf ("%s\t%s\n", sname, comment);
    }
  ret = 0;

memfree:
  OPENSSL_free (curves);

end:
  return ret;
}

我笔记本电脑上的输出:

$ gcc -Wall -L /usr/lib64 -lcrypto -lssl eclist.c -o eclist
$ ./eclist
secp224r1       NIST/SECG curve over a 224 bit prime field
secp256k1       SECG curve over a 256 bit prime field
secp384r1       NIST/SECG curve over a 384 bit prime field
secp521r1       NIST/SECG curve over a 521 bit prime field
prime256v1      X9.62/SECG curve over a 256 bit prime field

openssl 二进制文件给了我相同的输出:

$ openssl ecparam -list_curves
  secp224r1 : NIST/SECG curve over a 224 bit prime field
  secp256k1 : SECG curve over a 256 bit prime field
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field

当然,以这种方式打印值可能不是很有用,但代码可以作为测试 CMake 的基础。