def __init__(self, header=None, stringCount=0, styleCount=0, flags=0, stringsStart=0, stylesStart=0): if header is None: header = ResChunk_header(ResourceType.RES_STRING_POOL_TYPE, headerSize=ResStringPool_header.len, size=ResStringPool_header.len) if not isinstance(header, ResChunk_header): raise WrongTypeException('header', ResChunk_header) if header.type is not ResourceType.RES_STRING_POOL_TYPE: raise ChunkHeaderWrongTypeException( ResourceType.RES_STRING_POOL_TYPE) self.header = header if isinstance(stringCount, uint32): ## Number of strings in this pool (number of uint32_t indices that # follow in the data). self.stringCount = stringCount else: self.stringCount = uint32(stringCount, little=True) if isinstance(styleCount, uint32): ## Number of style span arrays in the pool (number of uint32_t # indices follow the string indices). self.styleCount = styleCount else: self.styleCount = uint32(styleCount, little=True) if isinstance(flags, ResStringPool_header.Flags): ## Flags. self.flags = flags else: self.flags = ResStringPool_header.Flags(flags) if isinstance(stringsStart, uint32): ## Index from header of the string data. self.stringsStart = stringsStart else: self.stringsStart = uint32(stringsStart, little=True) if isinstance(stylesStart, uint32): ## Index from header of the style data. self.stylesStart = stylesStart else: self.stylesStart = uint32(stylesStart, little=True)
def from_bytes(b, little=True): content = b header, b = ResStringPool_header.from_bytes(b) # drop everything inside size declared in ResStringPool_header content, rest = content[:header.header.size.integer], \ content[header.header.size.integer:] # split content strrefslen = header.stringCount.integer * len(uint32(0)) stylerefslen = header.styleCount.integer * len(uint32(0)) if strrefslen > 0: strrefs_b, b = b[:strrefslen], b[strrefslen:] strings_b = content[header.stringsStart.integer:] else: strrefs_b = bytes() strings_b = bytes() if stylerefslen > 0: stylerefs_b, b = b[:stylerefslen], b[stylerefslen:] styles_b = content[header.stylesStart.integer:] else: stylerefs_b = bytes() styles_b = bytes() # split ref list buffers into Python lists strrefs, r = ResStringPool._split_fixed_list( strrefs_b, header.stringCount.integer, uint32) if len(r) > 0: raise Exception('String pool inconsistent') stylerefs, r = ResStringPool._split_fixed_list( stylerefs_b, header.styleCount.integer, uint32) if len(r) > 0: raise Exception('Style span pool inconsistent') # count lengths of entries strlengths = ResStringPool._offsets_to_length(strrefs + \ [uint32(len(strings_b))]) stylelengths = ResStringPool._offsets_to_length(stylerefs + \ [uint32(len(styles_b))]) # split strings and styles into lists strings = ResStringPool._split_variable_length_strings( strings_b, strlengths) styles = ResStringPool._split_variable_length_strings( styles_b, stylelengths) return ResStringPool(header, strrefs, stylerefs, strings, styles), rest
def __init__(self, header=None, id=1, res0=0, res1=0, entryCount=0): if header is None: header = ResChunk_header(ResourceType.RES_TABLE_TYPE_SPEC_TYPE, headerSize=ResTable_typeSpec_header.len, size=ResTable_typeSpec_header.len) if not isinstance(header, ResChunk_header): raise WrongTypeException('header', ResChunk_header) if header.type is not ResourceType.RES_TABLE_TYPE_SPEC_TYPE: raise ChunkHeaderWrongTypeException( ResourceType.RES_TABLE_TYPE_SPEC_TYPE) if not isinstance(id, uint8): id = uint8(id, little=True) if not isinstance(res0, uint8): res0 = uint8(res0, little=True) if not isinstance(res1, uint16): res1 = uint16(res1, little=True) if not isinstance(entryCount, uint32): entryCount = uint32(entryCount, little=True) self.header = header ## The type identifier this chunk is holding. Type IDs start # at 1 (corresponding to the value of the type bits in a # resource identifier). 0 is invalid. self.id = id ## Must be 0. self.res0 = res0 ## Must be 0. self.res1 = res1 ## Number of uint32_t entry configuration masks that follow. self.entryCount = entryCount
def test_objects_are_not_same(self): invector1 = ResTable_header() invector2 = ResTable_header() invector1.header.size = uint32(123) self.assertIsNot(invector1, invector2) self.assertNotEqual(invector1, invector2)
def test_packageCount_is_uint32(self): invector = ResTable_header( ResChunk_header(ResourceType.RES_TABLE_TYPE), uint32(0x8331337)) expected = uint32 actual = type(invector.packageCount) self.assertEqual(expected, actual)
class ResChunk_header: ResChunk_header_len = len(ResourceType.RES_NULL_TYPE) + len(uint16(0)) + \ len(uint32(0)) def __init__(self, chunkType=ResourceType.RES_NULL_TYPE, headerSize=ResChunk_header_len, size=ResChunk_header_len): if isinstance(chunkType, ResourceType): self.type = chunkType else: self.type = ResourceType(chunkType, little=True) if isinstance(headerSize, uint16): self.headerSize = headerSize else: self.headerSize = uint16(headerSize, little=True) if isinstance(size, uint32): self.size = size else: self.size = uint32(size, little=True) def __str__(self): return '{{type={type}, headerSize={headerSize}, size={size}}}'.format( type=str(self.type), headerSize=self.headerSize, size=self.size) def __repr__(self): return '{c}({type}, {headerSize}, {size})'.format( c=type(self).__name__, type=str(self.type), headerSize=self.headerSize, size=self.size) def __eq__(self, rhs): return self.type == rhs.type and self.headerSize == rhs.headerSize and \ self.size == rhs.size def __len__(self): return len(bytes(self)) def __bytes__(self): chunkType = bytes(reversed(bytes(self.type))) # always little headerSize = bytes(self.headerSize) size = bytes(self.size) return chunkType + headerSize + size def from_bytes(b, little=True): chunkType, b = ResourceType.from_bytes(b, little=True) headerSize, b = uint16.from_bytes(b, little=True) size, b = uint32.from_bytes(b, little=True) return ResChunk_header(chunkType, headerSize, size), b
def __init__(self, header=None, packageCount=0): if header is None: header = ResChunk_header(ResourceType.RES_TABLE_TYPE, headerSize=ResTable_header.len, size=ResTable_header.len) if not isinstance(header, ResChunk_header): raise WrongTypeException('header', ResChunk_header) if header.type is not ResourceType.RES_TABLE_TYPE: raise ChunkHeaderWrongTypeException(ResourceType.RES_TABLE_TYPE, header.type) self.header = header if isinstance(packageCount, uint32): self.packageCount = packageCount else: self.packageCount = uint32(packageCount, little=True)
def __init__(self, chunkType=ResourceType.RES_NULL_TYPE, headerSize=ResChunk_header_len, size=ResChunk_header_len): if isinstance(chunkType, ResourceType): self.type = chunkType else: self.type = ResourceType(chunkType, little=True) if isinstance(headerSize, uint16): self.headerSize = headerSize else: self.headerSize = uint16(headerSize, little=True) if isinstance(size, uint32): self.size = size else: self.size = uint32(size, little=True)
def __init__(self, size=0x30, imsi=None, locale=None, screenType=None, input=None, screenSize=None, version=None, screenConfig=None, screenSizeDp=None): notimpl = None if isinstance(size, uint32): ## Number of bytes in this structure self.size = size elif isinstance(size, bytes): # TODO: remove after full implementation self.size, notimpl = uint32.from_bytes(size, little=True) else: self.size = uint32(size, little=True) if notimpl is None: notimpl = bytes(self.size.integer - 4) self.notimpl = notimpl
class ResTable_packageTests(unittest.TestCase): # FIXME: a bit ugly, maybe change ? Flags = ResStringPool_header.Flags # ResTable_package_header(name='test') package_header = b'\0\2\x20\1\x08\3\0\0\x7f\0\0\0t\0e\0s\0t\0\0\0' + \ bytes(246) + b'\x20\1\0\0\1\0\0\0\xb4\1\0\0\4\0\0\0' + \ b'\0\0\0\0' # ResStringPool type_strings = \ b'\1\0\x1c\0\x94\0\0\0\x0a\0\0\0\0\0\0\0\0\1\0\0\x44\0\0\0' + \ b'\0\0\0\0\0\0\0\0\7\0\0\0\x12\0\0\0\x1b\0\0\0\x21\0\0\0' + \ b'\x29\0\0\0\x31\0\0\0\x3a\0\0\0\x42\0\0\0\x49\0\0\0\4\4attr\0' + \ b'\x08\x08drawable\0\6\6layout\0\3\3raw\0\5\5color\0\5\5dimen\0' + \ b'\6\6string\0\5\5style\0\4\4menu\0\2\2id\0' + \ b'\0\0' # ResStringPool key_strings = \ b'\1\0\x1c\0\x4c\0\0\0' + \ b'\4\0\0\0\0\0\0\0\0\1\0\0\x2c\0\0\0\0\0\0\0' + \ b'\0\0\0\0\x08\0\0\0\x11\0\0\0\x19\0\0\0' + \ b'\5\5alarm\0\6\6alarm1\0\5\5arrow\0\4\4back\0' typeSpec = b'\2\2\x10\0\x20\0\0\0\7\0\0\0\4\0\0\0' + (b'\4\0\0\0' * 4) #20 type1 = b'\1\2\x44\0\x74\0\0\0\7\0\0\0\4\0\0\0\x54\0\0\0' + \ b'\x30\0\0\0' + bytes(0x2c) + \ b'\0\0\0\0\x10\0\0\0\x20\0\0\0\x30\0\0\0' + \ b'\x08\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0' + \ b'\x08\0\0\0\x11\0\0\0\x08\0\0\0\x19\0\0\0' type2 = b'\1\2\x44\0\x74\0\0\0\7\0\0\0\4\0\0\0\x54\0\0\0' + \ b'\x30\0\0\0\0\0\0\0de' + bytes(0x26) + \ b'\0\0\0\0\x10\0\0\0\x20\0\0\0\x30\0\0\0' + \ b'\x08\0\0\0\0\0\0\0\x08\0\0\0\x08\0\0\0' + \ b'\x08\0\0\0\x11\0\0\0\x08\0\0\0\x19\0\0\0' tv1_bytes = package_header + type_strings + key_strings + typeSpec + type1 + \ type2 tv1_obj = \ ResTable_package( ResTable_package_header( ResChunk_header( ResourceType.RES_TABLE_PACKAGE_TYPE, 288, 776 ), 127, b't\x00e\x00s\x00t\x00\x00\x00', 288, 1, 436, 4 ), ResStringPool( ResStringPool_header( ResChunk_header( ResourceType.RES_STRING_POOL_TYPE, 28, 148 ), 10, 0, Flags.UTF8_FLAG, 68, 0 ), [ uint32(0), uint32(7), uint32(18), uint32(27), uint32(33), uint32(41), uint32(49), uint32(58), uint32(66), uint32(73) ], [], [ b'\x04\x04attr\x00', b'\x08\x08drawable\x00', b'\x06\x06layout\x00', b'\x03\x03raw\x00', b'\x05\x05color\x00', b'\x05\x05dimen\x00', b'\x06\x06string\x00', b'\x05\x05style\x00', b'\x04\x04menu\x00', b'\x02\x02id\x00\x00\x00' ], [] ), ResStringPool( ResStringPool_header( ResChunk_header( ResourceType.RES_STRING_POOL_TYPE, 28, 76 ), 4, 0, Flags.UTF8_FLAG, 44, 0 ), [ uint32(0), uint32(8), uint32(17), uint32(25) ], [], [ b'\x05\x05alarm\x00', b'\x06\x06alarm1\x00', b'\x05\x05arrow\x00', b'\x04\x04back\x00' ], [] ), [ [ ResTable_typeSpec( ResTable_typeSpec_header( ResChunk_header( ResourceType.RES_TABLE_TYPE_SPEC_TYPE, 16, 32 ), 7, 0, 0, 4 ), (b'\x04\x00\x00\x00' * 4) ), ResTable_type( ResTable_type_header( ResChunk_header( ResourceType.RES_TABLE_TYPE_TYPE, 68, 116 ), 7, 0, 0, 4, 84, b'0' + bytes(0x2f) ), b'\x00\x00\x00\x00\x10\x00\x00\x00'\ b' \x00\x00\x000\x00\x00\x00'\ b'\x08\x00\x00\x00\x00\x00\x00\x00'\ b'\x08\x00\x00\x00\x08\x00\x00\x00'\ b'\x08\x00\x00\x00\x11\x00\x00\x00'\ b'\x08\x00\x00\x00\x19\x00\x00\x00' ), ResTable_type( ResTable_type_header( ResChunk_header( ResourceType.RES_TABLE_TYPE_TYPE, 68, 116 ), 7, 0, 0, 4, 84, b'0\x00\x00\x00\x00\x00\x00\x00de'+bytes(0x26) ), b'\x00\x00\x00\x00\x10\x00\x00\x00'\ b' \x00\x00\x000\x00\x00\x00'\ b'\x08\x00\x00\x00\x00\x00\x00\x00'\ b'\x08\x00\x00\x00\x08\x00\x00\x00'\ b'\x08\x00\x00\x00\x11\x00\x00\x00'\ b'\x08\x00\x00\x00\x19\x00\x00\x00' ) ] ] ) def test_str(self): invector = ResTable_packageTests.tv1_obj expected = "{header={header={type="\ "ResourceType.RES_TABLE_PACKAGE_TYPE, headerSize=288, "\ "size=776}, id=127, name=b't\\x00e\\x00s\\x00t\\x00\\x00\\x00"+\ ("\\x00" * 246)+"', typeStrings=288, lastPublicType=1, "\ "keyStrings=436, lastPublicKey=4}, typeStrings={"\ "header={header={"\ "type=ResourceType.RES_STRING_POOL_TYPE, headerSize=28, "\ "size=148}, stringCount=10, styleCount=0, "\ "flags=Flags.UTF8_FLAG, stringsStart=68, stylesStart=0}, "\ "strrefs=[uint32(0), uint32(7), uint32(18), uint32(27), "\ "uint32(33), uint32(41), uint32(49), uint32(58), uint32(66), "\ "uint32(73)], stylerefs=[], strings=[b'\\x04\\x04attr\\x00', "\ "b'\\x08\\x08drawable\\x00', b'\\x06\\x06layout\\x00', "\ "b'\\x03\\x03raw\\x00', b'\\x05\\x05color\\x00', "\ "b'\\x05\\x05dimen\\x00', b'\\x06\\x06string\\x00', "\ "b'\\x05\\x05style\\x00', b'\\x04\\x04menu\\x00', "\ "b'\\x02\\x02id\\x00\\x00\\x00'], styles=[]}, "\ "keyStrings={header={header={"\ "type=ResourceType.RES_STRING_POOL_TYPE, headerSize=28, "\ "size=76}, stringCount=4, styleCount=0, "\ "flags=Flags.UTF8_FLAG, stringsStart=44, stylesStart=0}, "\ "strrefs=[uint32(0), uint32(8), uint32(17), uint32(25)], "\ "stylerefs=[], strings=[b'\\x05\\x05alarm\\x00', "\ "b'\\x06\\x06alarm1\\x00', b'\\x05\\x05arrow\\x00', "\ "b'\\x04\\x04back\\x00'], styles=[]}, "\ "types=[[ResTable_typeSpec(ResTable_typeSpec_header("\ "ResChunk_header(ResourceType.RES_TABLE_TYPE_SPEC_TYPE, 16, "\ "32), 7, 0, 0, 4), b'\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00"\ "\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00'), ResTable_type("\ "ResTable_type_header(ResChunk_header("\ "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\ "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'"\ "), b'\\x00\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x00"\ "0\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08"\ "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11"\ "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00'), "\ "ResTable_type(ResTable_type_header(ResChunk_header("\ "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\ "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00de\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'), b'\\x00"\ "\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x000\\x00"\ "\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00"\ "\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11\\x00"\ "\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00')]]}" actual = str(invector) self.assertEqual(expected, actual) def test_repr(self): invector = ResTable_packageTests.tv1_obj expected = "ResTable_package(ResTable_package_header(ResChunk_header("\ "ResourceType.RES_TABLE_PACKAGE_TYPE, 288, 776), 127, "\ "b't\\x00e\\x00s\\x00t\\x00\\x00\\x00" + ("\\x00" * 246) + \ "', 288, 1, 436, 4), ResStringPool(ResStringPool_header("\ "ResChunk_header(ResourceType.RES_STRING_POOL_TYPE, 28, 148"\ "), 10, 0, Flags.UTF8_FLAG, 68, 0), [uint32(0), uint32(7), "\ "uint32(18), uint32(27), uint32(33), uint32(41), uint32(49), "\ "uint32(58), uint32(66), uint32(73)], [], ["\ "b'\\x04\\x04attr\\x00', b'\\x08\\x08drawable\\x00', "\ "b'\\x06\\x06layout\\x00', b'\\x03\\x03raw\\x00', "\ "b'\\x05\\x05color\\x00', b'\\x05\\x05dimen\\x00', "\ "b'\\x06\\x06string\\x00', b'\\x05\\x05style\\x00', "\ "b'\\x04\\x04menu\\x00', b'\\x02\\x02id\\x00\\x00\\x00'], "\ "[]), ResStringPool(ResStringPool_header(ResChunk_header("\ "ResourceType.RES_STRING_POOL_TYPE, 28, 76), 4, 0, "\ "Flags.UTF8_FLAG, 44, 0), [uint32(0), uint32(8), uint32(17), "\ "uint32(25)], [], [b'\\x05\\x05alarm\\x00', "\ "b'\\x06\\x06alarm1\\x00', b'\\x05\\x05arrow\\x00', "\ "b'\\x04\\x04back\\x00'], []), [[ResTable_typeSpec("\ "ResTable_typeSpec_header(ResChunk_header("\ "ResourceType.RES_TABLE_TYPE_SPEC_TYPE, 16, 32), 7, 0, 0, 4), "\ "b'\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00"\ "\\x00\\x04\\x00\\x00\\x00'), ResTable_type("\ "ResTable_type_header(ResChunk_header("\ "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\ "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'"\ "), b'\\x00\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x00"\ "0\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08"\ "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11"\ "\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00'), "\ "ResTable_type(ResTable_type_header(ResChunk_header("\ "ResourceType.RES_TABLE_TYPE_TYPE, 68, 116), 7, 0, 0, 4, 84, "\ "b'0\\x00\\x00\\x00\\x00\\x00\\x00\\x00de\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00"\ "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'), b'\\x00"\ "\\x00\\x00\\x00\\x10\\x00\\x00\\x00 \\x00\\x00\\x000\\x00"\ "\\x00\\x00\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08\\x00"\ "\\x00\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x11\\x00"\ "\\x00\\x00\\x08\\x00\\x00\\x00\\x19\\x00\\x00\\x00')]])" actual = repr(invector) self.assertEqual(expected, actual) def test_bytes(self): invector = ResTable_packageTests.tv1_obj expected = ResTable_packageTests.tv1_bytes actual = bytes(invector) self.assertEqual(expected, actual) def test_from_bytes(self): invector = ResTable_packageTests.tv1_bytes + b'\x13\x37' expected = ResTable_packageTests.tv1_obj, b'\x13\x37' actual = ResTable_package.from_bytes(invector) self.assertEqual(expected, actual)
def __init__(self, header=None, id=0, name=b'\0\0', typeStrings=0, lastPublicType=0, keyStrings=0, lastPublicKey=0): if header is None: header = ResChunk_header(ResourceType.RES_TABLE_PACKAGE_TYPE, headerSize=ResTable_package_header.len, size=ResTable_package_header.len) if not isinstance(header, ResChunk_header): raise WrongTypeException('header', ResChunk_header) if header.type is not ResourceType.RES_TABLE_PACKAGE_TYPE: raise ChunkHeaderWrongTypeException( ResourceType.RES_TABLE_PACKAGE_TYPE) ## \link ResChunk_header \endlink instance # \details Identifies structure and defines its size self.header = header if isinstance(id, uint32): ## If this is a base package, its ID # \details Package IDs start at 1 (corresponding to the value of the # package bits in a resource identifier). 0 means this is not a base # package. self.id = id else: self.id = uint32(id, little=True) if isinstance(name, bytes): name_length = len(name) if name_length > ResTable_package_header.MAX_NAME_LEN * 2: raise Exception('name is longer than maximum ({l}>{m})'.format( l=name_length, m=ResTable_package_header.MAX_NAME_LEN)) if name[-2:] != b'\0\0': raise (Exception('name does not end with NULL')) ## Actual name of this package # \details NULL-terminated, UTF-16 string. self.name = name + bytes((ResTable_package_header.MAX_NAME_LEN * \ 2) - name_length) else: raise Exception('name must be of type bytes') if isinstance(typeStrings, uint32): self.typeStrings = typeStrings else: self.typeStrings = uint32(typeStrings, little=True) if isinstance(lastPublicType, uint32): self.lastPublicType = lastPublicType else: self.lastPublicType = uint32(lastPublicType, little=True) if isinstance(keyStrings, uint32): self.keyStrings = keyStrings else: self.keyStrings = uint32(keyStrings, little=True) if isinstance(lastPublicKey, uint32): self.lastPublicKey = lastPublicKey else: self.lastPublicKey = uint32(lastPublicKey, little=True)