diff --git a/src/envelope_authorizer/commands/list_keys.py b/src/envelope_authorizer/commands/list_keys.py index fd54011..e52f2c1 100644 --- a/src/envelope_authorizer/commands/list_keys.py +++ b/src/envelope_authorizer/commands/list_keys.py @@ -5,16 +5,31 @@ CAN_AUTHORIZE (`?` if unreadable here). prints only fingerprint/metadata - never the wrapped key or DEK. """ +import logging from datetime import datetime, timezone +from cryptography.exceptions import InvalidTag + from . import boot_local, doc_meta, read_flag +log = logging.getLogger(__name__) + def _can_authorize(crypto, doc) -> str: - """decrypted authority of a doc as Yes/No, or `?` if unreadable here""" + """decrypted authority of a doc as Yes/No, or `?` if unreadable here + + a malformed/foreign flag degrades to `?` for display continuity. a GCM auth-tag + failure is logged first (WARNING): it is either a foreign key this host can't + decrypt or a tampered authz record, and this layer can't tell them apart, so the + security signal must stay visible rather than render identically to a `?`. + """ try: return "Yes" if read_flag(crypto, doc["meta"]["authorizer"]) else "No" - except Exception: + except (KeyError, TypeError, ValueError): + return "?" + except InvalidTag: + friendly = doc_meta(doc).get("friendly", doc.get("_id", "?")) + log.warning("auth-tag verification failed for flag %s - foreign key or tampered record", friendly) return "?"