# (c) Copyright 2018 by Coinkite Inc. This file is covered by license found in COPYING-CC. # # callgate.py - thin wrapper around modckcc and the bootloader and its services. # import ckcc def get_bl_version(): # version string and related details # something like: ('1.0.0', [('time', '20180220.092345'), ('git', 'master@f8d1758')]) rv = bytearray(64) ln = ckcc.gate(0, rv, 0) ver, *args = str(rv[0:ln], 'utf8').split(' ') return ver, [tuple(i.split('=', 1)) for i in args] def get_bl_checksum(salt=0): # salted checksum over code rv = bytearray(32) ckcc.gate(1, rv, salt) return rv def enter_dfu(msg=0): # enter DFU while showing a message # 0 = normal DFU # 1 = downgrade attack detected # 2 = blankish # 3 = i am bricked # ckcc.oneway(2, msg) def show_logout(dont_clear=0): # wipe memory and die, shows standard message # dont_clear=1 => don't clear OLED # 2=> restart system after wipe ckcc.oneway(3, dont_clear) def get_genuine(): return ckcc.gate(4, None, 0) def clear_genuine(): ckcc.gate(4, None, 1) def set_genuine(): # does checksum over firmware, and might set green return ckcc.gate(4, None, 3) def get_dfu_button(): # read current state rv = bytearray(1) ckcc.gate(12, rv, 0) return (rv[0] == 1) def get_bl_rng(): # read 32 bytes of RNG (test) rv = bytearray(32) assert ckcc.gate(17, rv, 0) == 0 return rv def get_is_bricked(): # see if we are a brick? return ckcc.gate(5, None, 0) != 0 def set_bag_number(s): assert 3 <= len(s) < 32 arg = bytearray(32) # zero pad arg[0:len(s)] = s return ckcc.gate(19, arg, 1) def set_rdp_level(n): # complex hardware rules around these changes. assert n in {0,1,2} return ckcc.gate(19, None, 100+n) def get_bag_number(): arg = bytearray(32) ckcc.gate(19, arg, 0) if arg[0] == 0xff: return None rv = bytes(arg) return str(rv[0:rv.index(b'\0')], 'ascii') def get_highwater(): arg = bytearray(8) ckcc.gate(21, arg, 0) return bytes(arg) def set_highwater(ts): arg = bytearray(ts) return ckcc.gate(21, arg, 2) def has_608(): return ckcc.gate(6, None, 0) == 0 def has_608b(): config = bytearray(128) ckcc.gate(20, config, 0) return (config[7] >= 0x3) # EOF