From 3a9330b9955f9587919d327c61dca3b415a30109 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Fri, 14 Jul 2017 21:16:14 +0300 Subject: [PATCH] gpg: return SCD version from agent --- libagent/gpg/agent.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libagent/gpg/agent.py b/libagent/gpg/agent.py index 4505ab6..a86b78b 100644 --- a/libagent/gpg/agent.py +++ b/libagent/gpg/agent.py @@ -78,13 +78,13 @@ class Handler(object): # Cache public keys from GnuPG self.pubkey_bytes = keyring.export_public_keys() # "Clone" existing GPG version - version = keyring.gpg_version() + self.version = keyring.gpg_version() self.handlers = { b'RESET': None, b'OPTION': None, b'SETKEYDESC': None, - b'GETINFO': lambda conn, _: keyring.sendline(conn, b'D ' + version), + b'GETINFO': lambda conn, _: keyring.sendline(conn, b'D ' + self.version), b'AGENT_ID': lambda conn, _: keyring.sendline(conn, b'D TREZOR'), # "Fake" agent ID b'SIGKEY': lambda _, args: self.set_key(*args), b'SETKEY': lambda _, args: self.set_key(*args), @@ -93,13 +93,17 @@ class Handler(object): b'PKDECRYPT': lambda conn, _: self.pkdecrypt(conn), b'HAVEKEY': lambda _, args: self.have_key(*args), b'KEYINFO': lambda conn, _: self.key_info(conn), - b'SCD': lambda *_: self.fail_scd(), + b'SCD': self.handle_scd, } - @staticmethod - def fail_scd(): + def handle_scd(self, conn, args): """No support for smart-card device protocol.""" - raise AgentError(b'ERR 100696144 No such device ') + reply = { + (b'GETINFO', b'version'): self.version, + }.get(args) + if reply is None: + raise AgentError(b'ERR 100696144 No such device ') + keyring.sendline(conn, b'D ' + reply) @util.memoize def get_identity(self, keygrip): @@ -182,7 +186,7 @@ class Handler(object): for line in keyring.iterlines(conn): parts = line.split(b' ') command = parts[0] - args = parts[1:] + args = tuple(parts[1:]) if command == b'BYE': return