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)+']')
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.crua import de_crua #print(hex(shas(bin_to_num(b'og-a'), 0))) #print(hex(raw_og(1, 512))) print(hex(de_crua(1, 0xec0eaabae901dd12696324677f3e12ceeeee5d3989379a73134821e55d80837b4abac214e1e95fe0c60df79d09cbd05454a4cb958683e02318aa147f2a5e6d60)))
#!/usr/bin/python3 import sys sys.path.append('..') from urbit.crua import de_crua #print(hex(shas(bin_to_num(b'og-a'), 0))) #print(hex(raw_og(1, 512))) print( hex( de_crua( 1, 0xec0eaabae901dd12696324677f3e12ceeeee5d3989379a73134821e55d80837b4abac214e1e95fe0c60df79d09cbd05454a4cb958683e02318aa147f2a5e6d60 )))