diff options
-rw-r--r-- | notes/crypto/ipython_log.py | 44 | ||||
-rw-r--r-- | notes/crypto/notes.txt | 151 |
2 files changed, 195 insertions, 0 deletions
diff --git a/notes/crypto/ipython_log.py b/notes/crypto/ipython_log.py new file mode 100644 index 0000000..91f0403 --- /dev/null +++ b/notes/crypto/ipython_log.py @@ -0,0 +1,44 @@ +# IPython log file + +import pysodium +import base64 +import pyblake2 + +pub_key = "yx6NZfPGJC25C/2ZrMr0eTDqP/bIUvtQyqpUjJzcuLc=" +base64.b16encode(base64.b64decode(pub_key)).lower() +pub_key = base64.b64decode(pub_key) +secret_key = "qzvSkJMQeWw2rGb4W+xbGNTgk5dEkiViOtq5niOkEiTLHo1l88YkLbkL/ZmsyvR5MOo/9shS+1DKqlSMnNy4tw==" +base64.b16encode(base64.b64decode(secret_key)).lower() +secret_key = base64.b64decode(secret_key) + +h = pyblake2.blake2b(data=b"hypercore", key=pub_key, digest_size=32) +h.hexdigest() + +base64.b16encode(bytearray([43, 235, 230, 134, 54, 24, 197, 134, 8, 109, 37, 32, 170, 13, 19, 218, 102, 107, 0, 46, 90, 210, 177, 98, 35, 161, 91, 193, 85, 134, 241, 228, 0, 0, 0, 0, 0, 0, 0, 204])).lower() + +h = pyblake2.blake2b(digest_size=32) +h.update([2]) +h.update(bytearray([0x02])) +h.update(base64.b16decode("67179c243b387b7c7c420bd7bdc69d35c061b979bb365f9cc07b4527eeddeefa".upper())) +h.update(bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])) +h.update(bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42])) +h.hexdigest() + +base64.b16encode(pysodium.crypto_sign_detached(h.digest(), secret_key)).lower() + +h = pyblake2.blake2b(digest_size=32) +h.update(bytearray([0x02])) +h.update(base64.b16decode("ab27d45f509274ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df".upper())) +h.update(bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])) +h.update(bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01])) +h.hexdigest() + +sk = base64.b16decode("53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda3839718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238".upper()) +base64.b16encode(pysodium.crypto_sign_detached(h.digest(), sk)).lower() + +lh = pyblake2.blake2b(digest_size=32) +lh.update(bytearray([0x00])) +lh.update(bytearray([0, 0, 0, 0, 0, 0, 0, 1])) +hex(ord('a')) +lh.update(bytearray([0x61])) +lh.hexdigest() diff --git a/notes/crypto/notes.txt b/notes/crypto/notes.txt new file mode 100644 index 0000000..023aaf6 --- /dev/null +++ b/notes/crypto/notes.txt @@ -0,0 +1,151 @@ + +libsodium Ed25519 keys, Blake2b 32-bit hashes + +====== simple + +bnewbold@orithena$ cat test-data/dat/simple/.dat/content.key | base64 +BnlFLuVBAS6rYID8wUCmIS/O85v/jJ9i7ousH16C0r0= + + +metadata pub: + len_bytes: 32 + hex: cb1e8d65f3c6242db90bfd99accaf47930ea3ff6c852fb50caaa548c9cdcb8b7 + base64: yx6NZfPGJC25C/2ZrMr0eTDqP/bIUvtQyqpUjJzcuLc= + +metadata secret: + len_bytes: 64 + file: ~/.dat/secret_keys/bf/feaefe7cb34458e11ecb1e38b67b5f93eafce2bd7a286db229a87f0384e61c + hex: ab3bd2909310796c36ac66f85bec5b18d4e09397449225623adab99e23a41224cb1e8d65f3c6242db90bfd99accaf47930ea3ff6c852fb50caaa548c9cdcb8b7 + base64: qzvSkJMQeWw2rGb4W+xbGNTgk5dEkiViOtq5niOkEiTLHo1l88YkLbkL/ZmsyvR5MOo/9shS+1DKqlSMnNy4tw== + +discovery key: + len_bytes: 32 + hex: bffeaefe7cb34458e11ecb1e38b67b5f93eafce2bd7a286db229a87f0384e61c + +content pub: + len_bytes: 32 + hex: 0679452ee541012eab6080fcc140a6212fcef39bff8c9f62ee8bac1f5e82d2bd + base64: BnlFLuVBAS6rYID8wUCmIS/O85v/jJ9i7ousH16C0r0= + +content secret: + len_bytes: 64 + hex: c322b4918b90e53f13ab14c7e86dec7e5e7bd4128b585dac6bdf0353f8e4974f0679452ee541012eab6080fcc140a6212fcef39bff8c9f62ee8bac1f5e82d2bd + base64: wyK0kYuQ5T8TqxTH6G3sfl571BKLWF2sa98DU/jkl08GeUUu5UEBLqtggPzBQKYhL87zm/+Mn2Lui6wfXoLSvQ== + +To make a discovery key, do a "keyed" Blake2b hash of the string "hypercore" (9 +bytes, no null) using the public key. + + bnewbold@orithena$ ./target/debug/geniza-sleep file-read-all test-data/dat/simple/.dat/content.tree + 0: + debug: Ok([103, 23, 156, 36, 59, 56, 123, 124, 124, 66, 11, 215, 189, 198, 157, 53, 192, 97, 185, 121, 187, 54, 95, 156, 192, 123, 69, 39, 238, 221, 238, 250, 0, 0, 0, 0, 0, 0, 0, 66]) + hex: 67179c243b387b7c7c420bd7bdc69d35c061b979bb365f9cc07b4527eeddeefa0000000000000042 + 1: + debug: Ok([43, 235, 230, 134, 54, 24, 197, 134, 8, 109, 37, 32, 170, 13, 19, 218, 102, 107, 0, 46, 90, 210, 177, 98, 35, 161, 91, 193, 85, 134, 241, 228, 0, 0, 0, 0, 0, 0, 0, 204]) + hex: 2bebe6863618c586086d2520aa0d13da666b002e5ad2b16223a15bc15586f1e400000000000000cc + 2: + debug: Ok([163, 78, 52, 182, 129, 66, 214, 34, 130, 211, 196, 230, 152, 173, 250, 133, 82, 164, 113, 127, 75, 106, 60, 76, 179, 136, 210, 137, 113, 45, 233, 250, 0, 0, 0, 0, 0, 0, 0, 138]) + hex: a34e34b68142d62282d3c4e698adfa8552a4717f4b6a3c4cb388d289712de9fa000000000000008a + +Signature file should be 64 byte each: + + bnewbold@orithena$ ./target/debug/geniza-sleep file-read-all test-data/dat/simple/.dat/content.signatures + 0: + debug: Ok([235, 70, 69, 206, 179, 128, 50, 76, 255, 139, 94, 124, 133, 55, 170, 130, 46, 139, 101, 250, 234, 52, 122, 184, 195, 40, 149, 95, 215, 220, 160, 39, 99, 173, 22, 146, 226, 165, 213, 245, 57, 186, 81, 45, 159, 218, 248, 109, 140, 172, 99, 57, 155, 180, 128, 17, 181, 220, 90, 22, 238, 78, 81, 1]) + hex: eb4645ceb380324cff8b5e7c8537aa822e8b65faea347ab8c328955fd7dca02763ad1692e2a5d5f539ba512d9fdaf86d8cac63399bb48011b5dc5a16ee4e5101 + 1: + debug: Ok([53, 69, 157, 171, 205, 82, 230, 197, 158, 124, 63, 2, 46, 165, 192, 24, 86, 33, 58, 126, 220, 80, 116, 202, 6, 194, 40, 108, 160, 63, 63, 245, 248, 171, 2, 76, 207, 153, 236, 176, 192, 193, 17, 45, 64, 246, 160, 228, 9, 120, 117, 115, 209, 34, 91, 117, 210, 82, 15, 238, 21, 160, 151, 9]) + hex: 35459dabcd52e6c59e7c3f022ea5c01856213a7edc5074ca06c2286ca03f3ff5f8ab024ccf99ecb0c0c1112d40f6a0e409787573d1225b75d2520fee15a09709 + + +Paper says: + + Ed25519 sign( + BLAKE2b( + <1 byte> 2 // root type + for (every root node left-to-right) { + <32 byte root hash> + <8 byte Uint64BE root tree index> + <8 byte Uint64BE child byte lengths> + } + ) + ) + +So, for first entry, expect: + + Ed25519 sign( + BLAKE2b ( + 02, + 67179c243b387b7c7c420bd7bdc69d35c061b979bb365f9cc07b4527eeddeefa, + 00 00 00 00 00 00 00 00, + 00 00 00 00 00 00 00 42, + ) = e589278e08886963a6010afff83f27a977fe9a8e54a404cc7f18347a5dabcb8c + ) = 0c9baeb68e8c74adc57ac4e85ffb7e4b6b66f21c821b068e6eead2889b68026c5c731bc5786c669cdf3461572fb7f32f41e8399c8ecd7e360f9fdfb39a667a05 + +For the second: + + Ed25519 sign( + BLAKE2b ( + 02, + 2bebe6863618c586086d2520aa0d13da666b002e5ad2b16223a15bc15586f1e4, + 00 00 00 00 00 00 00 01, + 00 00 00 00 00 00 00 CC, + ) = e589278e08886963a6010afff83f27a977fe9a8e54a404cc7f18347a5dabcb8c + ) = 0c9baeb68e8c74adc57ac4e85ffb7e4b6b66f21c821b068e6eead2889b68026c5c731bc5786c669cdf3461572fb7f32f41e8399c8ecd7e360f9fdfb39a667a05 + + +=========== New example from hypercore tests + +Data chunks are just 'a', 'b', 'c'. + +Public key: + 9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238 + +Secret key: + 53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda3839718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238 + +Tree: + 0: ab27d45f509274ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001 + 1: 064321a8413be8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de0000000000000002 + 2: 94c17054005942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af80000000000000001 + 3: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 4: 94c17054005942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af80000000000000001 + + BLAKE2b ( + 00, + 00 00 00 00 00 00 00 01, + 61, + ) = ab27d45f509274ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df + +Signatures: + 0: 84684e8dd76c339d6f5754e813204906ee818e6c6cdc6a816a2ac785a3e0d926ac08641a904013194fe6121847b7dad4e361965d47715428eb0a0ededbdd5909 + 1: d037ff3c3614fa0100ed9264a712d3b77cbe7a4f6eadd8f342809be99dfb9154a19e278d7a5de7d2b4d890f7701a38b006469f6bab1aff66ac6125d48bafdc07 + 2: 11057675ed57d445ce7ed4613881be37ebc56bb40556b822e431bb4dc3517421f9a5e3ed124eb5c4db8367386d9ce12b2408613b9fec2837022772a635ffd807 + + + Ed25519 sign( + BLAKE2b ( + 02, + ab27d45f509274ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df, + 00 00 00 00 00 00 00 00, + 00 00 00 00 00 00 00 01, + ) = fd09e68350db613d3afc9390abf12a7c2693d602b69012ff068251568d05887b + ) = 84684e8dd76c339d6f5754e813204906ee818e6c6cdc6a816a2ac785a3e0d926ac08641a904013194fe6121847b7dad4e361965d47715428eb0a0ededbdd5909 + +Cool! It works! + +====== alphabet + +Tree: + 0: ab27d45f509274ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001 + 1: 064321a8413be8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de0000000000000002 + 2: 94c17054005942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af80000000000000001 + + ab27d45f509274ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001 + 588e663097be0b31a3862613f96a1826be03c4ee529f11a495d193465d42b4ab0000000000000002 <= AH HA! parent hashing + 064321a8413be8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de0000000000000002 + +Ah, the gotcha: when making parent hashes, make sure to only include child +*hashes* (32-bytes), not entire child entries (40 bytes, including lengths). + +Ah, and signatures were failing because I was passing an index to +tree_root_nodes(), not an entry_count (index+1). |