aboutsummaryrefslogtreecommitdiff
path: root/libhal.py
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-11-02 01:27:00 -0400
committerRob Austein <sra@hactrn.net>2016-11-02 01:27:00 -0400
commitc593d44af2ad0d9c5c56b78c575a938badea8038 (patch)
treef387c14b5229ac934f50fc46d4008d9be713902e /libhal.py
parentd844d764a4f0614bf378331b007467de288f74eb (diff)
Fix pkey_get_attribute(), handle XDR encoding of base types properly.
pkey_get_attribute() wasn't passing value_max, resulting in an XDR error. XDR encoding of built-in types now uses isinstance() rather than playing nasty games with the string names of base types.
Diffstat (limited to 'libhal.py')
-rw-r--r--libhal.py29
1 files changed, 16 insertions, 13 deletions
diff --git a/libhal.py b/libhal.py
index fbf86ff..55785b3 100644
--- a/libhal.py
+++ b/libhal.py
@@ -238,6 +238,10 @@ class Attribute(object):
self.type = type
self.value = value
+ def __repr__(self):
+ #return "<Attribute {} {}>".format(self.type, "".join("{:02x}".format(ord(v)) for v in self.value))
+ return "<Attribute {} {}>".format(self.type, self.value)
+
def xdr_packer(self, packer):
packer.pack_uint(self.type)
packer.pack_bytes(self.value)
@@ -476,33 +480,32 @@ class HSM(object):
else:
msg.append(c)
+ _pack_builtin = (((int, long), "_pack_uint"),
+ (str, "_pack_bytes"),
+ ((list, tuple), "_pack_array"))
+
def _pack(self, packer, args):
for arg in args:
if hasattr(arg, "xdr_packer"):
arg.xdr_packer(packer)
else:
try:
- func = getattr(self, "_pack_" + type(arg).__name__)
- except AttributeError:
+ method = tuple(meth for cls, meth in self._pack_builtin if isinstance(arg, cls))[0]
+ except IndexError:
raise RuntimeError("Don't know how to pack {!r} ({!r})".format(arg, type(arg)))
else:
- func(packer, arg)
+ getattr(self, method)(packer, arg)
- @staticmethod
- def _pack_int(packer, arg):
+ def _pack_uint(self, packer, arg):
packer.pack_uint(arg)
- @staticmethod
- def _pack_str(packer, arg):
+ def _pack_bytes(self, packer, arg):
packer.pack_bytes(arg)
- def _pack_tuple(self, packer, arg):
+ def _pack_array(self, packer, arg):
packer.pack_uint(len(arg))
self._pack(packer, arg)
- _pack_long = _pack_int
- _pack_list = _pack_tuple
-
@contextlib.contextmanager
def rpc(self, code, *args, **kwargs):
client = kwargs.get("client", 0)
@@ -662,8 +665,8 @@ class HSM(object):
with self.rpc(RPC_FUNC_PKEY_SET_ATTRIBUTE, pkey, attr_type, attr_value):
return
- def pkey_get_attribute(self, pkey, attr_type):
- with self.rpc(RPC_FUNC_PKEY_GET_ATTRIBUTE, pkey, attr_type) as r:
+ def pkey_get_attribute(self, pkey, attr_type, value_max = 1024):
+ with self.rpc(RPC_FUNC_PKEY_GET_ATTRIBUTE, pkey, attr_type, value_max) as r:
return Attribute(attr_type, r.unpack_bytes())
def pkey_delete_attribute(self, pkey, attr_type):