def test_hash_function(self): xmss_height = 4 seed = bytearray([i for i in range(48)]) xmss = XMSS(XmssFast(seed, xmss_height, SHAKE_128)) self.assertEqual('shake128', xmss.hash_function) xmss = XMSS(XmssFast(seed, xmss_height, SHAKE_256)) self.assertEqual('shake256', xmss.hash_function) xmss = XMSS(XmssFast(seed, xmss_height, SHA2_256)) self.assertEqual('sha2_256', xmss.hash_function)
def validate_or_raise(self, verify_signature=True) -> bool: """ This method will validate a transaction and raise exception if problems are found :return: True if the exception is valid, exceptions otherwise :rtype: bool """ if not self._validate_custom(): raise ValueError("Custom validation failed") self._coinbase_filter() expected_transaction_hash = self.generate_txhash() if verify_signature and self.txhash != expected_transaction_hash: logger.warning('Invalid Transaction hash') logger.warning('Expected Transaction hash %s', bin2hstr(expected_transaction_hash)) logger.warning('Found Transaction hash %s', bin2hstr(self.txhash)) raise ValueError("Invalid Transaction Hash") if verify_signature: # Temporarily disabled following new added lines. # TODO: Review Juan # if not XMSS.validate_signature(self.signature, self.PK): # raise ValueError("Invalid xmss signature") if not XmssFast.verify(self.get_data_hash(), self.signature, self.PK): raise ValueError("Invalid xmss signature") return True
def test_sign_verify(self): message = "This is a test" message_bin = str2bin(message) xmss_height = 10 seed = bytearray([i for i in range(48)]) xmss = XMSS(XmssFast(seed, xmss_height)) pk = xmss.pk xmss.set_ots_index(1) for i in range(10): self.assertTrue(xmss.ots_index == i + 1) signature = xmss.sign(message_bin) self.assertTrue(XmssFast.verify(message_bin, signature, pk))
def test_PK(self): xmss_height = 10 seed = bytearray([i for i in range(48)]) xmss = XMSS(XmssFast(seed, xmss_height)) pk = xmss.pk self.assertEqual('010500ffc6e502e2a8244aed6a8cd67531e79f95baa638615ba789c194a1d15d7eb' '77e4e3983bd564298c49ae2e7fa6e28d4b954d8cd59398f1225b08d6144854aee0e', bin2hstr(pk))
def from_extended_seed(extended_seed: bytes): if len(extended_seed) != 51: raise Exception('Extended seed should be 51 bytes long') descr = xrdDescriptor.fromBytes(extended_seed[0:3]) if descr.getSignatureType() != pyxrdlib.XMSS: raise Exception('Signature type nor supported') height = descr.getHeight() hash_function = descr.getHashFunction() tmp = XmssFast(extended_seed[3:], height, hash_function) return XMSS(tmp)
def get_slave_xmss() -> XMSS: xmss_height = 6 seed = bytes([i + 10 for i in range(48)]) return XMSS(XmssFast(seed, xmss_height))
def get_bob_xmss(xmss_height=6) -> XMSS: seed = bytes([i + 5 for i in range(48)]) return XMSS(XmssFast(seed, xmss_height))
def get_some_address(idx=0) -> bytes: seed = bytearray([i for i in range(48)]) seed[0] = idx xmss = XMSS(XmssFast(seed, 4)) return xmss.address
def from_height(tree_height: int, hash_function="shake128"): if hash_function not in hash_functions: raise Exception("XMSS does not support this hash function!") seed = getRandomSeed(48, '') return XMSS(XmssFast(seed, tree_height, hash_functions[hash_function]))
def test_signature_type(self): xmss_height = 4 seed = bytearray([i for i in range(48)]) xmss = XMSS(XmssFast(seed, xmss_height)) self.assertEqual(0, xmss.signature_type)