跳转到内容

OpenSSL/EC GROUP 复制

来自 Wikibooks,开放世界中的开放书籍

EC_GROUP_copy 将曲线 src 复制到 dst 中。srcdst 必须使用相同的 EC_METHOD。

EC_GROUP_dup 创建一个新的 EC_GROUP 对象,并将 src 中的内容复制到新创建的 EC_GROUP 对象中。

EC_GROUP_method_of 获取 group 的 EC_METHOD。

EC_GROUP_set_generator 设置曲线参数,这些参数必须由所有使用曲线的参与者达成一致。这些参数包括 生成器余因子生成器 是曲线上为加密操作选择的定义明确的点。用于点乘的整数将在 0 到 n-1 之间,其中 n 是 乘以 余因子 则得到曲线上点的数量。

EC_GROUP_get0_generator 返回标识的 group 的生成器。

函数 EC_GROUP_get_order 和 EC_GROUP_get_cofactor 使用提供的 ordercofactor 参数分别填充 group 的阶和余因子。

函数 EC_GROUP_set_curve_name 和 EC_GROUP_get_curve_name 分别设置和获取曲线的 NID(参见 EC_GROUP_new)。如果曲线没有与之关联的 NID,那么 EC_GROUP_get_curve_name 将返回 0。

曲线上的 asn1_flag 值用于确定是否存在特定的 ASN1 OID 来描述曲线。如果 asn1_flag 为 1,则这是一个具有关联 ASN1 OID 的命名曲线。如果不是,则 asn1_flag 为 0。函数 EC_GROUP_get_asn1_flag 和 EC_GROUP_set_asn1_flag 分别获取和设置曲线的 asn1_flag 状态。如果设置,则也必须设置 curve_name。

曲线的 point_conversion_form 控制 EC_POINT 数据如何根据 X9.62(ECDSA)定义的 ASN1 编码。point_conversion_form_t 是定义如下枚举类型

typedef enum {
       /** the point is encoded as z||x, where the octet z specifies 
        *   which solution of the quadratic equation y is  */
       POINT_CONVERSION_COMPRESSED = 2,
       /** the point is encoded as z||x||y, where z is the octet 0x02  */
       POINT_CONVERSION_UNCOMPRESSED = 4,
       /** the point is encoded as z||x||y, where the octet z specifies
        *  which solution of the quadratic equation y is  */
       POINT_CONVERSION_HYBRID = 6
} point_conversion_form_t;


对于 POINT_CONVERSION_UNCOMPRESSED,点被编码为一个字节,表示已使用 UNCOMPRESSED 形式,然后是 x 的字节,然后是 y 的字节。

对于曲线上点上的任何给定 x 坐标,可以推导出两个可能的 y 值。对于 POINT_CONVERSION_COMPRESSED,点被编码为一个字节,表示已使用 COMPRESSED 形式,以及两个可能的 y 解决方案中哪个已被使用,然后是 x 的字节。

对于 POINT_CONVERSION_HYBRID,点被编码为一个字节,表示已使用 HYBRID 形式,以及两个可能的 y 解决方案中哪个已被使用,然后是 x 的字节,然后是 y 的字节。

函数 EC_GROUP_set_point_conversion_form 和 EC_GROUP_get_point_conversion_form 分别设置和获取曲线的 point_conversion_form。

ANSI X9.62(ECDSA 标准)定义了一种从随机数生成曲线参数 b 的方法。这样做的优势在于,以这种方式获得的参数极不可能容易受到特殊用途攻击,或在其内部包含任何陷阱门。如果曲线存在种子,则使用该种子以可验证的方式生成 b 参数。OpenSSL EC 库不使用此种子值,但允许您使用 EC_GROUP_get0_seed 检查它。这将返回指向包含所用种子的内存块的指针。可以使用 EC_GROUP_get_seed_len 获取内存块的长度。库中的许多内置曲线提供了可以获取的种子值。也可以使用 EC_GROUP_set_seed 设置自定义种子,并将指向内存块的指针以及种子的长度传递给它。同样,EC 库不会使用此种子值,尽管它将在任何基于 ASN1 的通信中保留。

EC_GROUP_get_degree 获取字段的度数。对于 Fp 字段,这将是 p 中的位数。对于 F2^m 字段,这将是值 m。

函数 EC_GROUP_check_discriminant 计算曲线的判别式并验证其是否有效。对于在 Fp 上定义的曲线,判别式由公式 4*a^3 + 27*b^2 给出,而对于 F2^m 曲线,判别式只是 b。在这两种情况下,为了使曲线有效,判别式必须非零。

函数 EC_GROUP_check 对曲线执行一些检查,以验证其是否有效。执行的检查包括验证判别式是否非零;是否已定义生成器;生成器是否在曲线上并具有正确的阶。

EC_GROUP_cmp 比较 ab 以确定它们是否代表相同的曲线。

函数 EC_GROUP_get_basis_type、EC_GROUP_get_trinomial_basis 和 EC_GROUP_get_pentanomial_basis 仅应针对在 F2^m 字段上定义的曲线调用。F2^m 字段中的加法和乘法运算使用不可约多项式函数 f(x) 执行。此函数要么是形式为

f(x) = x^m + x^k + 1 with m > k >= 1

的三项式,要么是形式为

f(x) = x^m + x^k3 + x^k2 + x^k1 + 1 with m > k3 > k2 > k1 >= 1

的五项式。函数 EC_GROUP_get_basis_type 返回一个 NID,标识字段中使用的是三项式还是五项式。函数 EC_GROUP_get_trinomial_basis 仅应在 f(x) 为三项式形式时调用,并返回 k 的值。同样,函数 EC_GROUP_get_pentanomial_basis 仅应在 f(x) 为五项式形式时调用,并分别返回 k1k2k3 的值。

返回值

[编辑 | 编辑源代码]

以下函数在成功时返回 1,在错误时返回 0:EC_GROUP_copy、EC_GROUP_set_generator、EC_GROUP_check、EC_GROUP_check_discriminant、EC_GROUP_get_trinomial_basis 和 EC_GROUP_get_pentanomial_basis。

EC_GROUP_dup 返回指向复制曲线的指针,或者在错误时返回 NULL。

EC_GROUP_method_of 返回给定曲线使用的 EC_METHOD 实现,或者在错误时返回 NULL。

EC_GROUP_get0_generator 返回给定曲线的生成器,或者在错误时返回 NULL。

EC_GROUP_get_order、EC_GROUP_get_cofactor、EC_GROUP_get_curve_name、EC_GROUP_get_asn1_flag、EC_GROUP_get_point_conversion_form 和 EC_GROUP_get_degree 分别返回指定曲线的阶、余因子、曲线名称(NID)、ASN1 标志、point_conversion_form 和度数。如果曲线没有与之关联的曲线名称,那么 EC_GROUP_get_curve_name 将返回 0。

EC_GROUP_get0_seed 返回指向用于生成参数 b 的种子的指针,或者如果未指定种子则返回 NULL。EC_GROUP_get_seed_len 返回种子的长度,或者如果未指定种子则返回 0。

EC_GROUP_set_seed 返回已设置的种子的长度。如果提供的种子为 NULL,或者提供的种子长度为 0,则返回值将为 1。在错误时返回 0。

EC_GROUP_cmp 如果曲线相等则返回 0,如果不相等则返回 1,或者在错误时返回 -1。

EC_GROUP_get_basis_type 分别返回三项式或五项式的值 NID_X9_62_tpBasis 或 NID_X9_62_ppBasis(如 <openssl/obj_mac.h> 中定义)。或者,在发生错误的情况下返回 0。

华夏公益教科书