Skip to content

Commit 5eb8a25

Browse files
committed
Fix NanoTDF support
1 parent dd30965 commit 5eb8a25

File tree

12 files changed

+1921
-265
lines changed

12 files changed

+1921
-265
lines changed

src/otdf_python/cli.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ def create_nano_tdf_config(sdk: SDK, args) -> NanoTDFConfig:
201201
kas_endpoints = parse_kas_endpoints(args.kas_endpoint)
202202
kas_info_list = [KASInfo(url=kas_url) for kas_url in kas_endpoints]
203203
config.kas_info_list.extend(kas_info_list)
204+
elif args.platform_url:
205+
# If no explicit KAS endpoint provided, derive from platform URL
206+
# This matches the default KAS path convention
207+
kas_url = args.platform_url.rstrip("/") + "/kas"
208+
logger.debug(f"Deriving KAS endpoint from platform URL: {kas_url}")
209+
kas_info = KASInfo(url=kas_url)
210+
config.kas_info_list.append(kas_info)
204211

205212
if hasattr(args, "policy_binding") and args.policy_binding:
206213
if args.policy_binding.lower() == "ecdsa":
@@ -554,7 +561,7 @@ def main():
554561
sys.exit(1)
555562
except Exception as e:
556563
logger.error(f"Unexpected error: {e}")
557-
logger.debug("", exc_info=True)
564+
logger.error("", exc_info=True) # Always print traceback for unexpected errors
558565
sys.exit(1)
559566

560567

src/otdf_python/ecc_mode.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
1+
from typing import ClassVar
2+
3+
14
class 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

Comments
 (0)