欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

列举 OpenSSL 中内建的椭圆曲线

程序员文章站 2022-03-16 08:45:37
...

    本文中使用的 OpenSSL 版本是 1.1.1。在 include\openssl\ec.h 中定义了结构体 EC_builtin_curve,如下:

typedef struct {
    int nid;
    const char *comment;
} EC_builtin_curve;

    还声明了函数 EC_get_builtin_curves( ),该函数的作用是获取所有内建曲线的信息(包括 nid 和 comment),函数的实现在 ec_curve.c 中,如下:

size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems)
{
    size_t i, min;

    if (r == NULL || nitems == 0)
        return curve_list_length;

    min = nitems < curve_list_length ? nitems : curve_list_length;

    for (i = 0; i < min; i++) {
        r[i].nid = curve_list[i].nid;
        r[i].comment = curve_list[i].comment;
    }

    return curve_list_length;
}

    从该函数实现中可以看出:如果参数 r 为空指针,或 nitmes 值为 0, 该函数返回内建曲线条数。如果参数 nitems 的值大于 0 并且小于内建曲线条数,则只获取前 nitems 条曲线的信息。
    函数执行成功时,该函数返回内建曲线条数,执行失败返回 0。

    调用函数 EC_get_builtin_curves( ),列举当前 OpenSSL 版本中内建所有椭圆曲线信息的示例程序如下:

/**************************************************
* File name: list_built_in_curves.c
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: Aug 22nd, 2018
* Description: demonstrate how to list all built-in
               EC curves in OpenSSL
**************************************************/

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

int main()
{
	EC_builtin_curve *curves = NULL, *p;
    int curves_count, i;
	
	if ( !(curves_count = EC_get_builtin_curves(NULL, 0)) )
	{
		printf("Get built-in EC curves count failed!\n");
		return (-1);
	}
	if ( !(curves = (EC_builtin_curve *)malloc(sizeof(EC_builtin_curve) * curves_count)) )
	{
		printf("Allocate memory failed!\n");
		return (-1);
	}
	if ( !(curves_count = EC_get_builtin_curves(curves, curves_count)) )
	{
		printf("Get built-in EC curves info failed!\n");
		free(curves);
		return (-1);
	}
	
	printf("Total built-in EC curves count: %d\n", curves_count);
	printf("Built-in EC curves info:\n");
	p = curves;
	for (i = 0; i < curves_count; i++)
	{
		printf("EC curve item: %d\n", (i+1));
		printf("NID: %d\n", p->nid);
		printf("Comment: %s\n", p->comment);
		p++;
	}
	
	free(curves);
	return 0;
}


程序执行结果的部分截图如下:
列举 OpenSSL 中内建的椭圆曲线

 

列举 OpenSSL 中内建的椭圆曲线

可以看出,当前版本 OpenSSL 内建 82 种椭圆曲线,其中包括了中国国密 SM2 算法的曲线,其 nid 值为 1172。

相关标签: OpenSSL