diff --git a/libagent/gpg/agent.py b/libagent/gpg/agent.py index e60b3e9..92bb2d7 100644 --- a/libagent/gpg/agent.py +++ b/libagent/gpg/agent.py @@ -124,7 +124,7 @@ class Handler(object): raise AgentError(b'ERR 100696144 No such device ') keyring.sendline(conn, b'D ' + reply) - @util.memoize + @util.memoize_method # global cache for key grips def get_identity(self, keygrip): """ Returns device.interface.Identity that matches specified keygrip. @@ -171,7 +171,6 @@ class Handler(object): ec_point = self.client.ecdh(identity=identity, pubkey=remote_pubkey) keyring.sendline(conn, b'D ' + _serialize_point(ec_point)) - @util.memoize def have_key(self, *keygrips): """Check if any keygrip corresponds to a TREZOR-based key.""" for keygrip in keygrips: diff --git a/libagent/util.py b/libagent/util.py index 623ddda..c98891f 100644 --- a/libagent/util.py +++ b/libagent/util.py @@ -215,6 +215,24 @@ def memoize(func): return wrapper +def memoize_method(method): + """Simple caching decorator.""" + cache = {} + + @functools.wraps(method) + def wrapper(self, *args, **kwargs): + """Caching wrapper.""" + key = (args, tuple(sorted(kwargs.items()))) + if key in cache: + return cache[key] + else: + result = method(self, *args, **kwargs) + cache[key] = result + return result + + return wrapper + + @memoize def which(cmd): """Return full path to specified command, or raise OSError if missing."""