跳轉到內容

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。

華夏公益教科書