#!/usr/bin/python3 import sys sys.path.append('..') from urbit.util import strings, from_le from urbit.cue import cue import binascii import sys if sys.version_info[0:2] < (3, 0): print("Requires python3", file=sys.stderr) exit(1) packets_hex = [ b'015facce8d9c058f07fe0c1de0910b234b7b1b38cc871bdc1ce0a99b2b939b17700102180e684598dee8eae6c4022e40809e2d10f7000f3ea137b634bb30397e011720e0db00cf2d21b9b4303790a9b73ab6b26e01fc69d272fb40582aef165dca0be778d9ff16700102360ef0db422a7393cb0309aa63a3eb1640002000d760ee0bdb19a0ab73142627574607b254c6c696a7178000abab8a60d505ddec397738522c00ce480b60bfdc07a40d43534fabf3a2849e009f722de001046801bc6c1d85b195b9815cbdb19995b54085d5b1e5750bb800018506f0b875c5164696d6962607a2046217e60642562607c21416e6d62d0001f0e4e9a5a993f8ec75a2a95b4d7c63b1003cf69b4b8373cb236ba14b7393cb736ba17b73732b136b414b239bcba36b69994ba3232b3b6b810b9b23ab9b6b114b2383cbc36b414b7373cbc317700102043ddcae0b880001e600ef2d28b434b63438902190a637b7b56e01172020a543715dc004081008e0612b284ceecd0d44a86c6cad4cae2dccad5bc00408c0096844c6dadac4022e4040a0017c6f1185b9a595b181a0bcd1a195c98dc9a5d195c9a585a5802cb195a5b9750bb80001b806f86e1d85c9c995d1812c95b1b1e5750b4000fc895733d0b78be0420d47fef5b2f6b3055c80808c037cb7944090cadce4f24082ead8e8ba050c808000efada13a39bab43990ac3039bb34b76e01ec5d150a2e552063df415c6cd2a82b2aa1052040be712d300b5a78071820ce58814836dc0266090069402f9257269657e62616700102cc385c7a0be04e3e994bd82588ae13f2b7209293106b001efbb185c1cd9589b5cca5b1a195d1b5d085b99995cdb5b8a589d195cdb5b490a5b9b9958db5b0a5d1b5959db59085b1c195e1b5b8a5cdcdd5b90b9800010001bc6d4dd195d995b981a0b4c991bdb5a5b9bda580109595750b4000655146405a867ed28423e24d108b13b3055480804987c4fb0210d00ffb5dc072f724ef1911ae53457d5eaf' ] # see ++meal in zuze.hoon d = [] for packet in packets_hex: packet = binascii.a2b_hex(packet) num = from_le(packet) cake = cue(num) print(cake) #print(urbit_util.format_hexnum(num)) print(strings(cake)) #d = ((d[1] & ((1<<8192)-1)) << 8191) | d[0] #d = (d[1]<<8192) | d[0] #print(cue(d))
def dump_urbit_packet(args, timestamp, srcaddr, sport, dstaddr, dport, data): try: # Urbit header and payload urhdr = unpack('<L', data[0:4])[0] proto = urhdr & 7 mug = (urhdr >> 3) & 0xfffff yax = (urhdr >> 23) & 3 yax_bytes = 1<<(yax+1) qax = (urhdr >> 25) & 3 qax_bytes = 1<<(qax+1) crypto = (urhdr >> 27) sender = from_le(data[4:4+yax_bytes]) receiver = from_le(data[4+yax_bytes:4+yax_bytes+qax_bytes]) payload = data[4+yax_bytes+qax_bytes:] if crypto == 2: # %fast keyhash = from_le(payload[0:16]) payload = payload[16:] else: keyhash = None except (IndexError, struct.error): print('Warn: invpkt') return # Decode packet if crypto known decrypted = False if crypto in [0,1]: # %none %open decrypted = True if crypto == 2 and keyhash in args.keys: # %fast payload = from_le(payload) payload = de_crua(args.keys[keyhash], payload) payload = to_le(payload) decrypted = True # Print packet hdata = [('proto', str(proto)), ('mug', '%05x' % mug), ('crypto', crypto_name(crypto))] if keyhash is not None and (args.always_show_keyhashes or not decrypted): hdata += [('keyhash', format_hexnum(keyhash))] if srcaddr is not None: metadata = '' if args.show_timestamps: metadata += colorize(datetime.datetime.utcfromtimestamp(timestamp).strftime('%H%M%S.%f'), COLOR_TIMESTAMP) + ' ' metadata += (colorize(ipv4str(srcaddr), COLOR_IP) + v_colon + colorize(str(sport), COLOR_IP) + ' ' + colorize(pname(sender), COLOR_RECIPIENT) + ' ' + v_arrow + ' ' + colorize(ipv4str(dstaddr), COLOR_IP) + v_colon + colorize(str(dport), COLOR_IP) + ' ' + colorize(pname(receiver), COLOR_RECIPIENT)) else: metadata = (' %fore ' + # nested packet colorize(pname(sender), COLOR_RECIPIENT) + ' ' + v_arrow + ' ' + colorize(pname(receiver), COLOR_RECIPIENT)) print( metadata + v_colon + ' ' + ' '.join(colorize(key, COLOR_HEADER) + v_equal + colorize(value, COLOR_VALUE) for (key,value) in hdata)) if decrypted: # decrypted or unencrypted data if args.show_raw: print(' ' + colorize(hexstr(payload), COLOR_DATA)) cake = cue(from_le(payload)) if cake[0] == 1701998438: # %fore subpacket = to_le(cake[1][1][1]) dump_urbit_packet(args, None, None, None, None, None, subpacket) else: if args.show_nouns: sys.stdout.write(' ') dump_noun(cake, sys.stdout) sys.stdout.write('\n') else: # [sealed] print(' [' + colorize(hexstr(payload), COLOR_DATA_ENC)+']')
import sys if sys.version_info[0:2] < (3, 0): print("Requires python3", file=sys.stderr) exit(1) packets_hex = [ b'01dfec4dae1cf00002b40900f81458db600500020a0d0002b40002fe58981c3cce900108a8bfa58fedcf9577f6c7e36666958f9306000400a51500f4dfb85839cfb31e23eaa2ea0bf7dc82ece195a6d8f1730f5565009d55a715cbb1a2f1858b07470ae9b4cd61023a554a6c8cbb109f9606e6ff036aca98121fb4ab84d08ae2e26f380ae829d3d4050cd6669b3aad8774a48d1ab39cbc2c6e90ecaa821ced8c419cdbb40fc477776d4bee5cfe9963444dd5844abd4a59d2c594e43d24802ccf72212d4d597ec5b975ce120ee7d53b62e509da99e4bda4fd8895704c7e0146e22b387de3acf1aee9392c8f5a7ea6331d13f1e6c39462c0429411d70591016e6a2de2669891602296b1701b517a8caf2e5b01233970fc95659a28d3f1d093bbd2b5a23f3fe47d93215ba4629059a35efc494fd1c65e90730b6c6c1defac6c32e00204141a40000000000000c042b35604c54803000060812f73077cb2bab572c0677b932307aef705de8d1de81ada00cf1d5a1a5d39c07fc5164696d696262fe1ca04f8d985b9819095c981308585b901c003841dc5e6f6d7f37c425d2bbe812648e809cec30fe8409a292c9dcf78807b82aaebe2d747b3ed8c16ad8a8efcecbdea536546c4fc3bd44ea146165b62b5646387dc9520b57c8f5dd58878b5a993d88ef1064eeb1849d80459cb90898106eccbea01db492c9f2999a442aabe46f8abeafc769e7dc9d15374b1fc93cce109e9ec5179a5617fc7cc7270843f03d15636819253fc2d45cf9c2cb156d340d69d804fa139fba7431443b2caac8fb8e6861204207527f8cefffb8029709121e64c436ce16cefd81a0ef88ac90653d9484171655e865c32b46bd6c8dd8cd987a5f34bb92bd96327ed3f472c1046e1b2d36db0ea542e1400a4ca3fe6c662971e8c1f07ff1f20b900a0ffb2873d400653b77d31fa37f937d096f86753faed634b75cf8d45707db187fec27e2ed0363ecfece6e9e60740cb7c1fa67093d97262a76c354f185b58fb956f56cc9078f89888cd29652b810a896f11e0c986efaf4db322b2e28debab059c67b4cd3731b5c9970397d121dba09fcd102a8d1624e2c5250d4b6919c4b26927db793f37d56ad973abad8e9259a07971ec76b437bfc57540943ad977043a26080286cbe3e7127d1fe1ef1b9c36dd6e5531c220ad809bd9b80a304338b76d9a6e5fe2d97c51caf237f98732fc7d1f463d426103ae683b57b0e453ca23f6596e5799ea2169754a97958c187c8825af8a64473406f2dd7561269d0e4ebede2b1f0ae4716593810108200000000000000007062ce461a4010000b08694c780bf96e67606f856c98985b9814895c1d589b1a58d014003849dc8637b65d05f164f6b9bec888da8f76ae991c9ce0e5be9bbb97f5a0458a26594a3aaf9759c6b7fbb25ac82e8454b3481c218f6f7f0d93ccf352f9715223e967bfccc0e8e25e484257445fcf67d2d7b12b3ed72e56372e63dd1d5bce07da2f5a5d3539534486cde5c7afc0f45c9', b'01dfec4dae1cf00002b409000c792ab96f018080420380002d80803f1626078fe3900108a8bfa58fedcf9577f6c7e36666958f9306004ab77062b2072c8950258e3d03da9730f30d9bbb9fa9926c3473beec14d8533683b8afc55a94921a30d2e54a6b8a7ef5227e62e3856131d7c3a39a2e4d75777875c736a8998c45fc61be01258787ad450b1d3288b5c588efa6b81e44efaccf52723b08c357a0d758055489e5f0c66bfa5871bb4e358a9243d59926a3fc8eba73011a007ce44299aa89d57b3e5099bed39fc1072c1700f45ff229981941d9b7f3cbc3597d97632dd4f6d1bca35e24918de57036be0fd1a906f1064edfc6b8e66b42f2491842fe819bbf86cbb23f52c6699e078057b72aafbf5c88e3d16236d12d91079d05400521c9e9ab27a93099d0086ebc4214cb41c19ccd878505a967b543bbdf1fdff6eec5d484d74aff5da8aa74449af5cb4f16e2181c6940047bf08a256b118a1c8af723406e75c78a4aeab55b2335ddb01f2201ab3124ac598a9fc8b73e3500d78d5e0b1941cf2066a90c6e049a2d5c9d8395a415d0877f7f98be37852398ae2abe8afd99774d83974cd7ab199ded53de2e04d870d645606401c10a7f86310e605dd32f0ac84861e0a13760b0d212baf6fc06f5aecc041000000000000080104d07f230d20000005843ca63c01fd30b930b001e20ec2ee5798a18eb68525dd3ef1f292d7e810675c09a4d4c66b4aa42d339ffe3b7f004fc1ece6e6f67b20ccc2fa3e25f36b9ee4ddafa054f61914a6cf9b2c97a36a1fd91a2c23e2f66bd69c833a9be9a33c8663177e4304735da4bbea6589ef02d93d3a3cbb4ce94048b2d26f3aefbfbea0b8d3204aed4c127c1f04af1134ce862749eee6c97a735ae1aed8749e3b32470a507981ca78231ee4146206738ed6940ea7169dc7caaa3dad018e88607f9292413688fe3c98e45e1b954dbef115fcf4b8369c93f68c6d1dacd2bc4bf1efd14de00b648a95e67b31386c6e68d1c282b78dcbb778b22186151ad3d088c084ea435a0e69512d40ec295754b9af479d9e6eaca02c0ff51d42a2c07e4330a372d7134a5990a13ab9076d61fa4c183f1e1cb68af228ce5401feb928a2a1a086124a5a48d9d392c2f698d7b3e6c3dba7621995e316229d8894ce2eab6b3a8bf3149ee24ad1f678b48e8826ee4a85f1e9cb196cc7bb07abd4f192dbd89bfc5b9db67fbce289f6d87f1bfbe839a2ac53d630207eec888a0ff20fc4042fb27db323f7e6cbed5981f170044f18088ad47f4fd34fea5d0e6d06db1be12ec61b677c46c1e3889aca6fd1a41fc5d4a9d4ad1073c29b8790261f65d2cb7920a80796889f8beb4d7040013786dfdec0017c2d71ff14b0e29b30012ce93e44ddbdc39d35c60cb5e40ae6dd67eb9b9746e7a2e9d0fdc54daf556e78a98' ] # see ++meal in zuze.hoon d = [] for packet in packets_hex: packet = binascii.a2b_hex(packet) num = urbit_util.from_le(packet) cake = cue(num) assert (urbit_util.num_to_term(cake[0]) == '%fore') inner = cake[1][1][1] print(urbit_util.format_hexnum(inner & ((1 << 96) - 1))) inner >>= 96 # drop routing info inner_cake = cue(inner) assert (urbit_util.num_to_term(inner_cake[0]) == '%carp') #print(inner_cake) inner2_skin = inner_cake[1][0] inner2_idx = inner_cake[1][1][0] inner2_cnt = inner_cake[1][1][1][0] inner2_hdr = inner_cake[1][1][1][1][0] inner2 = inner_cake[1][1][1][1][1] d.append(inner2) #print(binascii.b2a_hex(to_le(inner2_hdr))) #print(binascii.b2a_hex(to_le(inner2)))
def dump_urbit_packet(args, timestamp, srcaddr, sport, dstaddr, dport, data): try: # Urbit header and payload urhdr = unpack('<L', data[0:4])[0] proto = urhdr & 7 mug = (urhdr >> 3) & 0xfffff yax = (urhdr >> 23) & 3 yax_bytes = 1 << (yax + 1) qax = (urhdr >> 25) & 3 qax_bytes = 1 << (qax + 1) crypto = (urhdr >> 27) sender = from_le(data[4:4 + yax_bytes]) receiver = from_le(data[4 + yax_bytes:4 + yax_bytes + qax_bytes]) payload = data[4 + yax_bytes + qax_bytes:] if crypto == 2: # %fast keyhash = from_le(payload[0:16]) payload = payload[16:] else: keyhash = None except (IndexError, struct.error): print('Warn: invpkt') return # Decode packet if crypto known decrypted = False if crypto in [0, 1]: # %none %open decrypted = True if crypto == 2 and keyhash in args.keys: # %fast payload = from_le(payload) payload = de_crua(args.keys[keyhash], payload) payload = to_le(payload) decrypted = True # Print packet hdata = [('proto', str(proto)), ('mug', '%05x' % mug), ('crypto', crypto_name(crypto))] if keyhash is not None and (args.always_show_keyhashes or not decrypted): hdata += [('keyhash', format_hexnum(keyhash))] if srcaddr is not None: metadata = '' if args.show_timestamps: metadata += colorize( datetime.datetime.utcfromtimestamp(timestamp).strftime( '%H%M%S.%f'), COLOR_TIMESTAMP) + ' ' metadata += (colorize(ipv4str(srcaddr), COLOR_IP) + v_colon + colorize(str(sport), COLOR_IP) + ' ' + colorize(pname(sender), COLOR_RECIPIENT) + ' ' + v_arrow + ' ' + colorize(ipv4str(dstaddr), COLOR_IP) + v_colon + colorize(str(dport), COLOR_IP) + ' ' + colorize(pname(receiver), COLOR_RECIPIENT)) else: metadata = ( ' %fore ' + # nested packet colorize(pname(sender), COLOR_RECIPIENT) + ' ' + v_arrow + ' ' + colorize(pname(receiver), COLOR_RECIPIENT)) print(metadata + v_colon + ' ' + ' '.join( colorize(key, COLOR_HEADER) + v_equal + colorize(value, COLOR_VALUE) for (key, value) in hdata)) if decrypted: # decrypted or unencrypted data if args.show_raw: print(' ' + colorize(hexstr(payload), COLOR_DATA)) cake = cue(from_le(payload)) if cake[0] == 1701998438: # %fore subpacket = to_le(cake[1][1][1]) dump_urbit_packet(args, None, None, None, None, None, subpacket) else: if args.show_nouns: sys.stdout.write(' ') dump_noun(cake, sys.stdout) sys.stdout.write('\n') else: # [sealed] print(' [' + colorize(hexstr(payload), COLOR_DATA_ENC) + ']')
#!/usr/bin/python3 import sys sys.path.append('..') from urbit.util import strings, from_le from urbit.cue import cue import binascii import sys if sys.version_info[0:2] < (3,0): print("Requires python3", file=sys.stderr) exit(1) packets_hex = [ b'015facce8d9c058f07fe0c1de0910b234b7b1b38cc871bdc1ce0a99b2b939b17700102180e684598dee8eae6c4022e40809e2d10f7000f3ea137b634bb30397e011720e0db00cf2d21b9b4303790a9b73ab6b26e01fc69d272fb40582aef165dca0be778d9ff16700102360ef0db422a7393cb0309aa63a3eb1640002000d760ee0bdb19a0ab73142627574607b254c6c696a7178000abab8a60d505ddec397738522c00ce480b60bfdc07a40d43534fabf3a2849e009f722de001046801bc6c1d85b195b9815cbdb19995b54085d5b1e5750bb800018506f0b875c5164696d6962607a2046217e60642562607c21416e6d62d0001f0e4e9a5a993f8ec75a2a95b4d7c63b1003cf69b4b8373cb236ba14b7393cb736ba17b73732b136b414b239bcba36b69994ba3232b3b6b810b9b23ab9b6b114b2383cbc36b414b7373cbc317700102043ddcae0b880001e600ef2d28b434b63438902190a637b7b56e01172020a543715dc004081008e0612b284ceecd0d44a86c6cad4cae2dccad5bc00408c0096844c6dadac4022e4040a0017c6f1185b9a595b181a0bcd1a195c98dc9a5d195c9a585a5802cb195a5b9750bb80001b806f86e1d85c9c995d1812c95b1b1e5750b4000fc895733d0b78be0420d47fef5b2f6b3055c80808c037cb7944090cadce4f24082ead8e8ba050c808000efada13a39bab43990ac3039bb34b76e01ec5d150a2e552063df415c6cd2a82b2aa1052040be712d300b5a78071820ce58814836dc0266090069402f9257269657e62616700102cc385c7a0be04e3e994bd82588ae13f2b7209293106b001efbb185c1cd9589b5cca5b1a195d1b5d085b99995cdb5b8a589d195cdb5b490a5b9b9958db5b0a5d1b5959db59085b1c195e1b5b8a5cdcdd5b90b9800010001bc6d4dd195d995b981a0b4c991bdb5a5b9bda580109595750b4000655146405a867ed28423e24d108b13b3055480804987c4fb0210d00ffb5dc072f724ef1911ae53457d5eaf' ] # see ++meal in zuze.hoon d = [] for packet in packets_hex: packet = binascii.a2b_hex(packet) num = from_le(packet) cake = cue(num) print(cake) #print(urbit_util.format_hexnum(num)) print(strings(cake)) #d = ((d[1] & ((1<<8192)-1)) << 8191) | d[0] #d = (d[1]<<8192) | d[0] #print(cue(d))
import sys if sys.version_info[0:2] < (3,0): print("Requires python3", file=sys.stderr) exit(1) packets_hex = [ b'01dfec4dae1cf00002b40900f81458db600500020a0d0002b40002fe58981c3cce900108a8bfa58fedcf9577f6c7e36666958f9306000400a51500f4dfb85839cfb31e23eaa2ea0bf7dc82ece195a6d8f1730f5565009d55a715cbb1a2f1858b07470ae9b4cd61023a554a6c8cbb109f9606e6ff036aca98121fb4ab84d08ae2e26f380ae829d3d4050cd6669b3aad8774a48d1ab39cbc2c6e90ecaa821ced8c419cdbb40fc477776d4bee5cfe9963444dd5844abd4a59d2c594e43d24802ccf72212d4d597ec5b975ce120ee7d53b62e509da99e4bda4fd8895704c7e0146e22b387de3acf1aee9392c8f5a7ea6331d13f1e6c39462c0429411d70591016e6a2de2669891602296b1701b517a8caf2e5b01233970fc95659a28d3f1d093bbd2b5a23f3fe47d93215ba4629059a35efc494fd1c65e90730b6c6c1defac6c32e00204141a40000000000000c042b35604c54803000060812f73077cb2bab572c0677b932307aef705de8d1de81ada00cf1d5a1a5d39c07fc5164696d696262fe1ca04f8d985b9819095c981308585b901c003841dc5e6f6d7f37c425d2bbe812648e809cec30fe8409a292c9dcf78807b82aaebe2d747b3ed8c16ad8a8efcecbdea536546c4fc3bd44ea146165b62b5646387dc9520b57c8f5dd58878b5a993d88ef1064eeb1849d80459cb90898106eccbea01db492c9f2999a442aabe46f8abeafc769e7dc9d15374b1fc93cce109e9ec5179a5617fc7cc7270843f03d15636819253fc2d45cf9c2cb156d340d69d804fa139fba7431443b2caac8fb8e6861204207527f8cefffb8029709121e64c436ce16cefd81a0ef88ac90653d9484171655e865c32b46bd6c8dd8cd987a5f34bb92bd96327ed3f472c1046e1b2d36db0ea542e1400a4ca3fe6c662971e8c1f07ff1f20b900a0ffb2873d400653b77d31fa37f937d096f86753faed634b75cf8d45707db187fec27e2ed0363ecfece6e9e60740cb7c1fa67093d97262a76c354f185b58fb956f56cc9078f89888cd29652b810a896f11e0c986efaf4db322b2e28debab059c67b4cd3731b5c9970397d121dba09fcd102a8d1624e2c5250d4b6919c4b26927db793f37d56ad973abad8e9259a07971ec76b437bfc57540943ad977043a26080286cbe3e7127d1fe1ef1b9c36dd6e5531c220ad809bd9b80a304338b76d9a6e5fe2d97c51caf237f98732fc7d1f463d426103ae683b57b0e453ca23f6596e5799ea2169754a97958c187c8825af8a64473406f2dd7561269d0e4ebede2b1f0ae4716593810108200000000000000007062ce461a4010000b08694c780bf96e67606f856c98985b9814895c1d589b1a58d014003849dc8637b65d05f164f6b9bec888da8f76ae991c9ce0e5be9bbb97f5a0458a26594a3aaf9759c6b7fbb25ac82e8454b3481c218f6f7f0d93ccf352f9715223e967bfccc0e8e25e484257445fcf67d2d7b12b3ed72e56372e63dd1d5bce07da2f5a5d3539534486cde5c7afc0f45c9', b'01dfec4dae1cf00002b409000c792ab96f018080420380002d80803f1626078fe3900108a8bfa58fedcf9577f6c7e36666958f9306004ab77062b2072c8950258e3d03da9730f30d9bbb9fa9926c3473beec14d8533683b8afc55a94921a30d2e54a6b8a7ef5227e62e3856131d7c3a39a2e4d75777875c736a8998c45fc61be01258787ad450b1d3288b5c588efa6b81e44efaccf52723b08c357a0d758055489e5f0c66bfa5871bb4e358a9243d59926a3fc8eba73011a007ce44299aa89d57b3e5099bed39fc1072c1700f45ff229981941d9b7f3cbc3597d97632dd4f6d1bca35e24918de57036be0fd1a906f1064edfc6b8e66b42f2491842fe819bbf86cbb23f52c6699e078057b72aafbf5c88e3d16236d12d91079d05400521c9e9ab27a93099d0086ebc4214cb41c19ccd878505a967b543bbdf1fdff6eec5d484d74aff5da8aa74449af5cb4f16e2181c6940047bf08a256b118a1c8af723406e75c78a4aeab55b2335ddb01f2201ab3124ac598a9fc8b73e3500d78d5e0b1941cf2066a90c6e049a2d5c9d8395a415d0877f7f98be37852398ae2abe8afd99774d83974cd7ab199ded53de2e04d870d645606401c10a7f86310e605dd32f0ac84861e0a13760b0d212baf6fc06f5aecc041000000000000080104d07f230d20000005843ca63c01fd30b930b001e20ec2ee5798a18eb68525dd3ef1f292d7e810675c09a4d4c66b4aa42d339ffe3b7f004fc1ece6e6f67b20ccc2fa3e25f36b9ee4ddafa054f61914a6cf9b2c97a36a1fd91a2c23e2f66bd69c833a9be9a33c8663177e4304735da4bbea6589ef02d93d3a3cbb4ce94048b2d26f3aefbfbea0b8d3204aed4c127c1f04af1134ce862749eee6c97a735ae1aed8749e3b32470a507981ca78231ee4146206738ed6940ea7169dc7caaa3dad018e88607f9292413688fe3c98e45e1b954dbef115fcf4b8369c93f68c6d1dacd2bc4bf1efd14de00b648a95e67b31386c6e68d1c282b78dcbb778b22186151ad3d088c084ea435a0e69512d40ec295754b9af479d9e6eaca02c0ff51d42a2c07e4330a372d7134a5990a13ab9076d61fa4c183f1e1cb68af228ce5401feb928a2a1a086124a5a48d9d392c2f698d7b3e6c3dba7621995e316229d8894ce2eab6b3a8bf3149ee24ad1f678b48e8826ee4a85f1e9cb196cc7bb07abd4f192dbd89bfc5b9db67fbce289f6d87f1bfbe839a2ac53d630207eec888a0ff20fc4042fb27db323f7e6cbed5981f170044f18088ad47f4fd34fea5d0e6d06db1be12ec61b677c46c1e3889aca6fd1a41fc5d4a9d4ad1073c29b8790261f65d2cb7920a80796889f8beb4d7040013786dfdec0017c2d71ff14b0e29b30012ce93e44ddbdc39d35c60cb5e40ae6dd67eb9b9746e7a2e9d0fdc54daf556e78a98' ] # see ++meal in zuze.hoon d = [] for packet in packets_hex: packet = binascii.a2b_hex(packet) num = urbit_util.from_le(packet) cake = cue(num) assert(urbit_util.num_to_term(cake[0]) == '%fore') inner = cake[1][1][1] print(urbit_util.format_hexnum(inner & ((1<<96)-1))) inner >>= 96 # drop routing info inner_cake = cue(inner) assert(urbit_util.num_to_term(inner_cake[0]) == '%carp') #print(inner_cake) inner2_skin = inner_cake[1][0] inner2_idx = inner_cake[1][1][0] inner2_cnt = inner_cake[1][1][1][0] inner2_hdr = inner_cake[1][1][1][1][0] inner2 = inner_cake[1][1][1][1][1] d.append(inner2) #print(binascii.b2a_hex(to_le(inner2_hdr))) #print(binascii.b2a_hex(to_le(inner2)))