-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathecc_mode.py
More file actions
45 lines (38 loc) · 1.51 KB
/
ecc_mode.py
File metadata and controls
45 lines (38 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class ECCMode:
def __init__(self, curve_mode: int = 0, use_ecdsa_binding: bool = False):
self.curve_mode = curve_mode
self.use_ecdsa_binding = use_ecdsa_binding
def set_ecdsa_binding(self, flag: bool):
self.use_ecdsa_binding = flag
def is_ecdsa_binding_enabled(self) -> bool:
return self.use_ecdsa_binding
def set_elliptic_curve(self, curve_mode: int):
self.curve_mode = curve_mode
def get_elliptic_curve_type(self) -> int:
return self.curve_mode
@staticmethod
def get_ec_compressed_pubkey_size(curve_type: int) -> int:
# 0: secp256r1, 1: secp384r1, 2: secp521r1
if curve_type == 0:
return 33
elif curve_type == 1:
return 49
elif curve_type == 2:
return 67
else:
raise ValueError("Unsupported ECC algorithm.")
def get_ecc_mode_as_byte(self) -> int:
# Most significant bit: use_ecdsa_binding, lower 3 bits: curve_mode
return ((1 if self.use_ecdsa_binding else 0) << 7) | (self.curve_mode & 0x07)
@staticmethod
def from_string(curve_str: str) -> "ECCMode":
"""Create ECCMode from curve string like 'secp256r1' or 'secp384r1'."""
curve_map = {
"secp256r1": 0,
"secp384r1": 1,
"secp521r1": 2,
}
curve_mode = curve_map.get(curve_str.lower())
if curve_mode is None:
raise ValueError(f"Unsupported curve string: '{curve_str}'")
return ECCMode(curve_mode, False)