1+ from typing import ClassVar
2+
3+
14class ECCMode :
5+ _CURVE_MAP : ClassVar [dict [str , int ]] = {
6+ "secp256r1" : 0 ,
7+ "secp384r1" : 1 ,
8+ "secp521r1" : 2 ,
9+ "secp256k1" : 3 ,
10+ }
11+
212 def __init__ (self , curve_mode : int = 0 , use_ecdsa_binding : bool = False ):
313 self .curve_mode = curve_mode
414 self .use_ecdsa_binding = use_ecdsa_binding
@@ -15,15 +25,25 @@ def set_elliptic_curve(self, curve_mode: int):
1525 def get_elliptic_curve_type (self ) -> int :
1626 return self .curve_mode
1727
28+ def get_curve_name (self ) -> str :
29+ """Get the curve name as a string (e.g., 'secp256r1')."""
30+ for name , mode in self ._CURVE_MAP .items ():
31+ if mode == self .curve_mode :
32+ return name
33+ # Default to secp256r1 if not found
34+ return "secp256r1"
35+
1836 @staticmethod
1937 def get_ec_compressed_pubkey_size (curve_type : int ) -> int :
20- # 0: secp256r1, 1: secp384r1, 2: secp521r1
38+ # 0: secp256r1, 1: secp384r1, 2: secp521r1, 3: secp256k1
2139 if curve_type == 0 :
22- return 33
40+ return 33 # secp256r1
2341 elif curve_type == 1 :
24- return 49
42+ return 49 # secp384r1
2543 elif curve_type == 2 :
26- return 67
44+ return 67 # secp521r1
45+ elif curve_type == 3 :
46+ return 33 # secp256k1 (same size as secp256r1)
2747 else :
2848 raise ValueError ("Unsupported ECC algorithm." )
2949
@@ -33,13 +53,15 @@ def get_ecc_mode_as_byte(self) -> int:
3353
3454 @staticmethod
3555 def from_string (curve_str : str ) -> "ECCMode" :
36- """Create ECCMode from curve string like 'secp256r1' or 'secp384r1'."""
37- curve_map = {
38- "secp256r1" : 0 ,
39- "secp384r1" : 1 ,
40- "secp521r1" : 2 ,
41- }
42- curve_mode = curve_map .get (curve_str .lower ())
56+ """Create ECCMode from curve string like 'secp256r1' or 'secp384r1', or policy binding type like 'gmac' or 'ecdsa'."""
57+ # Handle policy binding types
58+ if curve_str .lower () == "gmac" :
59+ return ECCMode (0 , False ) # GMAC binding with default secp256r1 curve
60+ elif curve_str .lower () == "ecdsa" :
61+ return ECCMode (0 , True ) # ECDSA binding with default secp256r1 curve
62+
63+ # Handle curve names
64+ curve_mode = ECCMode ._CURVE_MAP .get (curve_str .lower ())
4365 if curve_mode is None :
4466 raise ValueError (f"Unsupported curve string: '{ curve_str } '" )
4567 return ECCMode (curve_mode , False )
0 commit comments