[Cryptech-Commits] [sw/libhal] 04/05: Fix pkey_get_attribute(), handle XDR encoding of base types properly.

git at cryptech.is git at cryptech.is
Wed Nov 2 05:32:28 UTC 2016


This is an automated email from the git hooks/post-receive script.

sra at hactrn.net pushed a commit to branch ksng
in repository sw/libhal.

commit c593d44af2ad0d9c5c56b78c575a938badea8038
Author: Rob Austein <sra at hactrn.net>
AuthorDate: Wed Nov 2 01:27:00 2016 -0400

    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.
---
 libhal.py | 29 ++++++++++++++++-------------
 1 file 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):



More information about the Commits mailing list