def test_xmss(self): HEIGHT = 6 seed = pyqrllib.ucharVector(48, 0) xmss = pyqrllib.Xmss(seed=seed, height=HEIGHT) print("Seed", len(seed)) print(pyqrllib.bin2hstr(seed, 48)) print("PK ", len(xmss.getPK())) print(pyqrllib.bin2hstr(xmss.getPK(), 48)) print("SK ", len(xmss.getSK())) print(pyqrllib.bin2hstr(xmss.getSK(), 48)) self.assertIsNotNone(xmss) self.assertEqual(xmss.getHeight(), HEIGHT) message = pyqrllib.ucharVector([i for i in range(32)]) print("Msg ", len(message)) print(pyqrllib.bin2hstr(message, 48)) # Sign message signature = bytearray(xmss.sign(message)) print("Sig ", len(signature)) print(pyqrllib.bin2hstr(signature, 128)) print('----------------------------------------------------------------------') # Verify signature start = time() for i in range(1000): self.assertTrue(pyqrllib.Xmss.verify(message, signature, xmss.getPK())) end = time() print(end - start) # Touch the signature signature[100] += 1 self.assertFalse(pyqrllib.Xmss.verify(message, signature, xmss.getPK())) signature[100] -= 1 self.assertTrue(pyqrllib.Xmss.verify(message, signature, xmss.getPK())) # Touch the message message[2] += 1 self.assertFalse(pyqrllib.Xmss.verify(message, signature, xmss.getPK())) message[2] -= 1 self.assertTrue(pyqrllib.Xmss.verify(message, signature, xmss.getPK()))
def test_pool(self): baseseed = pyqrllib.ucharVector(48, 0) pool = pyqrllib.XmssPool(baseseed, 6, 0, 3) self.assertFalse(pool.isAvailable()) self.assertEqual(pool.getCurrentIndex(), 0) xmss = pool.getNextTree() self.assertEqual( "2dcc3803df4475334b29eaa2516d1a9b36bc19eed0542cfbb501bf8de95d939b" "25510d9876c7845b4694441bdc0e2be51f3d3f87f0c7775893845f25d49f9ef1", pyqrllib.bin2hstr(xmss.getPK())) xmss = pool.getNextTree() self.assertEqual( "be9caeafe11fa52edf722063c18616d6d0c6c30dba3e2c9369a6d9260f76818b" "c424a1b6db5f26ef01ffa4aac8a08440d6a569bc56180b06f51b6ff6e4cc1b2e", pyqrllib.bin2hstr(xmss.getPK())) xmss = pool.getNextTree() self.assertEqual( "5deb91b1d311ecc8c6954e22f3e140ff3e6c04e40cad50c940e60abba3cf766a" "5db9f39f58e532bea6765e4530cb581db1d6afbb7c05da3261ca4db21177afc5", pyqrllib.bin2hstr(xmss.getPK())) xmss = pool.getNextTree() self.assertEqual( "ea15c686e7b9691b8bac52ee4d0ed33bd75ec600f55b4476b857858460c2c983" "90712040a5e03bca7a46715a90270ac2f8db8694ffa943091edb9018fa1dda04", pyqrllib.bin2hstr(xmss.getPK()))
def test_xmss_change_index(self): HEIGHT = 4 seed = pyqrllib.ucharVector(48, 0) xmss = pyqrllib.XmssFast(seed, HEIGHT, pyqrllib.SHAKE_128) xmss.setIndex(0) self.assertEqual(0, xmss.getIndex())
def test_xmss_change_index_high(self): HEIGHT = 4 seed = pyqrllib.ucharVector(48, 0) xmss = pyqrllib.XmssFast(seed, HEIGHT, pyqrllib.SHAKE_128) with pytest.raises(ValueError): xmss.setIndex(16)
def verify(self, message, signature, PK): data_out = ucharVector(len(signature)) self.d.sign_open(data_out, signature, PK) message_out = bytes(self.d.extract_message(data_out)) signature_out = self.d.extract_signature(data_out) if message_out != message: return False if len(signature_out) != 2701: return False return True
def test_xmss_creation_height4(self): HEIGHT = 4 seed = pyqrllib.ucharVector(48, 0) xmss = pyqrllib.XmssBasic(seed, HEIGHT) expected_address = "01020095f03f084bcb29b96b0529c17ce92c54c1e8290193a93803812ead95e8e6902506b67897" expected_PK = "010200c25188b585f731c128e2b457069e" \ "afd1e3fa3961605af8c58a1aec4d82ac" \ "316d3191da3442686282b3d5160f25cf" \ "162a517fd2131f83fbf2698a58f9c46a" \ "fc5d" self.assertEqual(expected_PK, pyqrllib.bin2hstr(xmss.getPK())) self.assertEqual(expected_address, pyqrllib.bin2hstr(xmss.getAddress())) self.assertEqual(expected_address, pyqrllib.bin2hstr(pyqrllib.QRLHelper.getAddress(xmss.getPK()))) descr = pyqrllib.QRLHelper.extractDescriptor(xmss.getPK()) self.assertEqual(4, descr.getHeight()) self.assertEqual(pyqrllib.SHAKE_128, descr.getHashFunction())
def test_xmss_creation_height6(self): HEIGHT = 6 seed = pyqrllib.ucharVector(48, 0) xmss = pyqrllib.XmssBasic(seed, HEIGHT) expected_address = "0103008b0e18dd0bac2c3fdc9a48e10fc466eef899ef074449d12ddf050317b2083527aee74bc3" expected_PK = "010300859060f15adc3825adeec85c7483" \ "d868e898bc5117d0cff04ab1343916d4" \ "07af3191da3442686282b3d5160f25cf" \ "162a517fd2131f83fbf2698a58f9c46a" \ "fc5d" self.assertEqual(expected_PK, pyqrllib.bin2hstr(xmss.getPK())) self.assertEqual(expected_address, pyqrllib.bin2hstr(xmss.getAddress())) self.assertEqual(expected_address, pyqrllib.bin2hstr(pyqrllib.QRLHelper.getAddress(xmss.getPK()))) descr = pyqrllib.QRLHelper.extractDescriptor(xmss.getPK()) self.assertEqual(6, descr.getHeight()) self.assertEqual(pyqrllib.SHAKE_128, descr.getHashFunction())
def test_dilithium_reference2(self): pk = bytes(hstr2bin(self.PK1_HSTR)) sk = bytes(hstr2bin(self.SK1_HSTR)) dilithium = Dilithium(pk, sk) self.assertEqual(1472, len(dilithium.getPK())) self.assertEqual(3504, len(dilithium.getSK())) message = bytes(b"This is a test") message_signed = dilithium.sign(message) data_out = ucharVector(len(message_signed)) Dilithium.sign_open(data_out, message_signed, dilithium.getPK()) message_out = Dilithium.extract_message(data_out) signature_out = Dilithium.extract_signature(data_out) self.assertEqual(2715, len(data_out)) self.assertEqual(len(message_out), len(message_out)) self.assertEqual(2701, len(signature_out)) self.assertEqual(message, bytes(message_out)) self.assertEqual(b"This is a test", bytes(message_out))
def test_dilithium_reference(self): dilithium = Dilithium() self.assertEqual(1472, len(dilithium.getPK())) self.assertEqual(3504, len(dilithium.getSK())) message = bytes(b"This is a test") message_signed = dilithium.sign(message) data_out = ucharVector(len(message_signed)) Dilithium.sign_open(data_out, message_signed, dilithium.getPK()) message_out = Dilithium.extract_message(data_out) signature_out = Dilithium.extract_signature(data_out) self.assertEqual(2715, len(data_out)) self.assertEqual(len(message_out), len(message_out)) self.assertEqual(2701, len(signature_out)) self.assertEqual(message, bytes(message_out)) self.assertEqual(b"This is a test", bytes(message_out)) print(bin2hstr(dilithium.getPK())) print(bin2hstr(dilithium.getSK()))
def test_xmss_exception_verify(self): message = pyqrllib.ucharVector(48, 0) signature = pyqrllib.ucharVector(2287, 0) pk = pyqrllib.ucharVector(48, 0) self.assertFalse(pyqrllib.XmssFast.verify(message, signature, pk))
def test_xmss_exception_constructor(self): HEIGHT = 7 seed = pyqrllib.ucharVector(48, 0) with pytest.raises(ValueError): xmss = pyqrllib.XmssFast(seed, HEIGHT, pyqrllib.SHAKE_128)