Fix hexadecimal master key decoding

This commit is contained in:
2026-10-26 12:06:17 +08:00
parent 4adf7c4882
commit dd6d20e3a3
2 changed files with 16 additions and 6 deletions
@@ -28,13 +28,19 @@ def decode_master_key(value: str) -> bytes:
text = (value or "").strip() text = (value or "").strip()
if not text: if not text:
raise ValueError("KCA_MASTER_KEY is empty") raise ValueError("KCA_MASTER_KEY is empty")
try: is_hex = len(text) == KEY_BYTES * 2 and all(
raw = base64.b64decode(text, validate=True) char in "0123456789abcdefABCDEF" for char in text
except Exception: # noqa: BLE001 )
if is_hex:
raw = bytes.fromhex(text)
else:
try: try:
raw = bytes.fromhex(text) raw = base64.b64decode(text, validate=True)
except ValueError as exc: except Exception: # noqa: BLE001
raise ValueError("KCA_MASTER_KEY must be base64 or hex") from exc try:
raw = bytes.fromhex(text)
except ValueError as exc:
raise ValueError("KCA_MASTER_KEY must be base64 or hex") from exc
if len(raw) != KEY_BYTES: if len(raw) != KEY_BYTES:
raise ValueError(f"KCA_MASTER_KEY must be {KEY_BYTES} bytes") raise ValueError(f"KCA_MASTER_KEY must be {KEY_BYTES} bytes")
return raw return raw
@@ -553,6 +553,10 @@ class ExportImportTest(unittest.TestCase):
class CryptoTest(unittest.TestCase): class CryptoTest(unittest.TestCase):
def test_decode_hex_master_key(self) -> None:
expected = bytes(range(crypto.KEY_BYTES))
self.assertEqual(crypto.decode_master_key(expected.hex()), expected)
def test_envelope(self) -> None: def test_envelope(self) -> None:
master = crypto.generate_master_key() master = crypto.generate_master_key()
blob = crypto.encrypt_private_key(b"secret", "key-id", crypto.decode_master_key(master)) blob = crypto.encrypt_private_key(b"secret", "key-id", crypto.decode_master_key(master))