Fix hexadecimal master key decoding
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user