def generate_owner_key(passphrase, mnemonic=None): owner_key = bytearray(108) master_secret, master_cofactor = get_beam_kdf(mnemonic) beam.export_owner_key(master_secret, master_cofactor, passphrase, len(passphrase), owner_key) owner_key = ubinascii.b2a_base64(owner_key) return owner_key
def test_get_public_key(self): mnemonic = "all all all all all all all all all all all all" kdf = get_beam_kdf(mnemonic) test_datasets = ( (0, 0, "88b528eecb5ee5ae81e56e2105aca06997761c9cd2e566b25eaee1951be26688", 1), (0, 1, "53839a38c1089e28e901279266cff2da921ca82ed39c6ac0261a039157754e40", 1), (0, 8, "a3378664f9ada1a32cf860076ec6110621c7430d9b04316a20b56ced6fd73546", 1), (1, 1, "da2d246d99860617bd37755605f0584de6094b437efb4931ec20cf85b62631a5", 0), (1, 8, "54158bdbeef7292b96d5ea57b2eebc3ba6c8d4a16cfeb6cd75354e8497d009b8", 1), (2, 8, "bfb3e6e6eb8ee2b686aaa6a056fa2670a5c49d76583eb05fb84d9c5ab7227c71", 0), (3, 0, "22e6e269fb26638d8501583d5a7c0c8051315f9576174cc6f64dacfe9a01ef7f", 0), (3, 3, "392b73f534c490f614c36a3ad738a10b2cc4b08543e6250a2b2927d1c5ffa4ba", 1), (4, 4, "e5c551250ccb2dfbd11b5d38eae670d0476909acb7d1955c78c53647dd5de3e9", 0), (5, 2, "269c9a18d3a8f5acf4036a711e41cf7c5071aceac1fe95666040369a3311ac71", 0), (10, 3, "706bc1d21de9d4fdf4daef73b7774cb7e869e454a7776d8116c0ce86f9427577", 0), ) for test_params in test_datasets: kid_idx = test_params[0] kid_sub_idx = test_params[1] expected_public_key_x = test_params[2] expected_public_key_y = test_params[3] pk = get_beam_pk(kid_idx, kid_sub_idx, kdf) self.assertEqual(bin_to_str(pk[0]), expected_public_key_x) self.assertEqual(pk[1], expected_public_key_y)
def test_get_public_key_another_mnemonic(self): mnemonic = "abc abc abc abc abc abc abc abc abc abc abc abc" kdf = get_beam_kdf(mnemonic) test_datasets = ( (0, 0, "119a034ddd950028e45ee1d0c9b26efba0fb28af83e7f2ba83a5c0fa7ae2daee", 0), (0, 1, "2a4c57b74f1cc0ee995ceab14ae9e9bc581da8ccb290564d15b9079858635604", 1), (0, 8, "418ec586d5ff80c1d82b25892c64a45243d9630fec255580cb2f0ac95b614415", 1), (1, 1, "f3632a997e42ff854d8d450113e8bea6f47e2ef069ed6cf36188343a1c7df013", 0), (2, 8, "a135d3ddcbce9cc76e46c2c8374ab084e88e01d81eb8a9588bd19cb997a41f91", 1), (3, 0, "19812e15f636ae0df35cc158d3496dd33999cf8f18df939588248d3f8ff86bd7", 0), (3, 3, "9e2b9fb5178fb4e71a8242b658c249e0aceb7ac576fc20a034a67c8c4f5b1c61", 0), (4, 4, "d320b5f0fcdcbfe2d005bff93d0fec1e1ac33abeebe51b2c9322176f820252cf", 1), (5, 2, "3206c52f75f777b230f64e0d6dff6eb6c2a1566b3b887943939beb0d3a6444f1", 1), (10, 3, "ff33f03af33b4b062e69479327d1fc02c13a22354dcd9a3bc7162ad3b2768f1c", 1), ) for test_params in test_datasets: kid_idx = test_params[0] kid_sub_idx = test_params[1] expected_public_key_x = test_params[2] expected_public_key_y = test_params[3] pk = get_beam_pk(kid_idx, kid_sub_idx, kdf) self.assertEqual(bin_to_str(pk[0]), expected_public_key_x) self.assertEqual(pk[1], expected_public_key_y)
def test_sign_message(self): test_datasets = ( ( 0, 0, "hello world", "94bb1f34c5e970136d4f1ff769e3332e4e5f430122ebe7e7720c754713adfab6", 0, "9f01b0eb202cd0780e35f0cf20c06cd930af8bb55db9c9c3e2146f34de1239d9", ), ( 0, 1, "hello world", "39e2014221f59c4f887be7158df22ef996ff061b7411a6d915ac91dc5a336d4b", 0, "a7b9447e39eb14e0c3167496ba53b3253918577c1c4bc0084fe8105ea6d520e5", ), ( 5, 2, "hello world", "848824bb7e3ee53ecc0d9ecdbacd8e7015d80ebaa3f50a0147d65a92e8d61894", 0, "d6d4b41ba3c858d99bb454155b9e9d531c35fc8f1535807a38e9509cb7314a75", ), ( 0, 0, "hello world", "9f315b9105225a0493d072d345b0e9a96e7c68395f004676c508259a16ade81e", 1, "3a303f731efb81d035cc98d835b66e109dd17921ec0e14091aecc72d64d7ab40", ), ( 1, 8, "hello from BEAM", "50d1f214d345a0f9cab5f7299f8e300ff1ee7c1201646bd67132203526593263", 0, "a49d590c6894f1675b5d6a43bb7845c9277d66d70c1114927a7870c6c6e95492", ), ( 4, 4, "abcdefg", "ec088ee2b66fab3b3c43337e8ad992dcc81e69a55f40b36b181a6899fc08a0f8", 0, "177a773a6278a87f03606edb5237f83bd40ea2e2954649e20930c42eb4bd7f17", ), ) print() for test_params in test_datasets: kdf = get_beam_kdf(self.mnemonic) kid_idx = test_params[0] kid_sub_idx = test_params[1] message = test_params[2] expected_nonce_pub_x = test_params[3] expected_nonce_pub_y = test_params[4] expected_sign_k = test_params[5] sign_nonce_pub_x = bytearray(32) sign_nonce_pub_y = bytearray(1) sign_k = bytearray(32) sk = get_beam_sk(kid_idx, kid_sub_idx, kdf) digest = message_digest(message) beam.signature_sign(digest, sk, sign_nonce_pub_x, sign_nonce_pub_y, sign_k) #print("Idx: {}; Sub idx: {}, message: {}".format(kid_idx, kid_sub_idx, message)) #print("Digest: {}; Sk: {}".format(bin_to_str(digest), bin_to_str(sk))) #print("X: {}, y: {}, k: {}".format(bin_to_str(sign_nonce_pub_x), sign_nonce_pub_y[0], bin_to_str(sign_k))) self.assertEqual(bin_to_str(sign_nonce_pub_x), expected_nonce_pub_x) self.assertEqual(sign_nonce_pub_y[0], expected_nonce_pub_y) self.assertEqual(bin_to_str(sign_k), expected_sign_k)
def test_verify_message(self): test_datasets = ( ( "hello world", "94bb1f34c5e970136d4f1ff769e3332e4e5f430122ebe7e7720c754713adfab6", 0, "9f01b0eb202cd0780e35f0cf20c06cd930af8bb55db9c9c3e2146f34de1239d9", "88b528eecb5ee5ae81e56e2105aca06997761c9cd2e566b25eaee1951be26688", 1, True, ), ( "hello world", "39e2014221f59c4f887be7158df22ef996ff061b7411a6d915ac91dc5a336d4b", 0, "a7b9447e39eb14e0c3167496ba53b3253918577c1c4bc0084fe8105ea6d520e5", "53839a38c1089e28e901279266cff2da921ca82ed39c6ac0261a039157754e40", 1, True, ), ( "hello world", "39e2014221f59c4f887be7158df22ef996ff061b7411a6d915ac91dc5a336d4b", 0, "a7b9447e39eb14e0c3167496ba53b3253918577c1c4bc0084fe8105ea6d520e5", "53839a38c1089e28e901279266cff2da921ca82ed39c6ac0261a039157754e40", 0, False, ), ( "hello world", "848824bb7e3ee53ecc0d9ecdbacd8e7015d80ebaa3f50a0147d65a92e8d61894", 0, "d6d4b41ba3c858d99bb454155b9e9d531c35fc8f1535807a38e9509cb7314a75", "269c9a18d3a8f5acf4036a711e41cf7c5071aceac1fe95666040369a3311ac71", 0, True, ), ( "hello world", "9f315b9105225a0493d072d345b0e9a96e7c68395f004676c508259a16ade81e", 1, "3a303f731efb81d035cc98d835b66e109dd17921ec0e14091aecc72d64d7ab40", "88b528eecb5ee5ae81e56e2105aca06997761c9cd2e566b25eaee1951be26688", 1, True, ), ( "hello from BEAM", "50d1f214d345a0f9cab5f7299f8e300ff1ee7c1201646bd67132203526593263", 0, "a49d590c6894f1675b5d6a43bb7845c9277d66d70c1114927a7870c6c6e95492", "54158bdbeef7292b96d5ea57b2eebc3ba6c8d4a16cfeb6cd75354e8497d009b8", 1, True, ), ( "abcdefg", "ec088ee2b66fab3b3c43337e8ad992dcc81e69a55f40b36b181a6899fc08a0f8", 0, "177a773a6278a87f03606edb5237f83bd40ea2e2954649e20930c42eb4bd7f17", "e5c551250ccb2dfbd11b5d38eae670d0476909acb7d1955c78c53647dd5de3e9", 0, True, ), ( "abcdefg", "ec088ee2b66fab3b3c43337e8ad992dcc81e69a55f40b36b181a6899fc08a0f8", 0, "177a773a6278a87f03606edb5237f83bd40ea2e2954649e20930c42eb4bd7f17", "f5c551250ccb2dfbd11b5d38eae670d0476909acb7d1955c78c53647dd5de3e9", 0, False, ), ) kdf = get_beam_kdf(self.mnemonic) for test_params in test_datasets: message = test_params[0] nonce_pub_x = test_params[1] nonce_pub_y = test_params[2] sign_k = test_params[3] pub_key_x = test_params[4] pub_key_y = test_params[5] expected_is_valid = int(test_params[6]) message = message_digest(message) signature = BeamSignature(nonce_pub=BeamECCPoint( x=unhexlify(nonce_pub_x), y=int(nonce_pub_y)), sign_k=unhexlify(sign_k)) public_key = BeamECCPoint(x=unhexlify(pub_key_x), y=int(pub_key_y)) is_valid = is_valid_beam_message(signature, public_key, message) self.assertEqual(is_valid, expected_is_valid) self.assertNotEqual(not is_valid, expected_is_valid)