def main(wait_e, keyno, passwd, data_regnual, data_upgrade): l = len(data_regnual) if (l & 0x03) != 0: data_regnual = data_regnual.ljust(l + 4 - (l & 0x03), chr(0)) crc32code = crc32(data_regnual) print("CRC32: %04x\n" % crc32code) data_regnual += pack('<I', crc32code) rsa_key = rsa.read_key_from_file('rsa_example.key') rsa_raw_pubkey = rsa.get_raw_pubkey(rsa_key) gnuk = get_gnuk_device() gnuk.cmd_select_openpgp() gnuk.cmd_verify(BY_ADMIN, passwd.encode('UTF-8')) gnuk.cmd_write_binary(1+keyno, rsa_raw_pubkey, False) gnuk.cmd_select_openpgp() challenge = gnuk.cmd_get_challenge().tostring() digestinfo = binascii.unhexlify(SHA256_OID_PREFIX) + challenge signed = rsa.compute_signature(rsa_key, digestinfo) signed_bytes = rsa.integer_to_bytes_256(signed) gnuk.cmd_external_authenticate(keyno, signed_bytes) gnuk.stop_gnuk() mem_info = gnuk.mem_info() print("%08x:%08x" % mem_info) print("Downloading flash upgrade program...") gnuk.download(mem_info[0], data_regnual) print("Run flash upgrade program...") gnuk.execute(mem_info[0] + len(data_regnual) - 4) # time.sleep(3) gnuk.reset_device() del gnuk gnuk = None # reg = None while reg == None: print("Wait %d seconds..." % wait_e) time.sleep(wait_e) for dev in gnuk_devices_by_vidpid(): try: reg = regnual(dev) print("Device: %s" % dev.filename) break except: pass # Then, send upgrade program... mem_info = reg.mem_info() print("%08x:%08x" % mem_info) print("Downloading the program") reg.download(mem_info[0], data_upgrade) reg.protect() reg.finish() reg.reset_device() return 0
def main(wait_e, keyno, passwd, data_regnual, data_upgrade): l = len(data_regnual) if (l & 0x03) != 0: data_regnual = data_regnual.ljust(l + 4 - (l & 0x03), chr(0)) crc32code = crc32(data_regnual) print("CRC32: %04x\n" % crc32code) data_regnual += pack('<I', crc32code) rsa_key = rsa.read_key_from_file('rsa_example.key') rsa_raw_pubkey = rsa.get_raw_pubkey(rsa_key) gnuk = get_gnuk_device() gnuk.cmd_select_openpgp() gnuk.cmd_verify(BY_ADMIN, passwd.encode('UTF-8')) gnuk.cmd_write_binary(1 + keyno, rsa_raw_pubkey, False) gnuk.cmd_select_openpgp() challenge = gnuk.cmd_get_challenge().tostring() digestinfo = binascii.unhexlify(SHA256_OID_PREFIX) + challenge signed = rsa.compute_signature(rsa_key, digestinfo) signed_bytes = rsa.integer_to_bytes_256(signed) gnuk.cmd_external_authenticate(keyno, signed_bytes) gnuk.stop_gnuk() mem_info = gnuk.mem_info() print("%08x:%08x" % mem_info) print("Downloading flash upgrade program...") gnuk.download(mem_info[0], data_regnual) print("Run flash upgrade program...") gnuk.execute(mem_info[0] + len(data_regnual) - 4) # time.sleep(3) gnuk.reset_device() del gnuk gnuk = None # reg = None while reg == None: print("Wait %d seconds..." % wait_e) time.sleep(wait_e) for dev in gnuk_devices_by_vidpid(): try: reg = regnual(dev) print("Device: %s" % dev.filename) break except: pass # Then, send upgrade program... mem_info = reg.mem_info() print("%08x:%08x" % mem_info) print("Downloading the program") reg.download(mem_info[0], data_upgrade) reg.protect() reg.finish() reg.reset_device() return 0
def main(wait_e, keyno, passwd, data_regnual, data_upgrade): l = len(data_regnual) if (l & 0x03) != 0: data_regnual = data_regnual.ljust(l + 4 - (l & 0x03), chr(0)) crc32code = crc32(data_regnual) print("CRC32: %04x\n" % crc32code) data_regnual += pack('<I', crc32code) rsa_key = rsa.read_key_from_file('rsa_example.key') rsa_raw_pubkey = rsa.get_raw_pubkey(rsa_key) gnuk = get_gnuk_device() gnuk.cmd_select_openpgp() # Compute passwd data kdf_data = gnuk.cmd_get_data(0x00, 0xf9).tostring() if kdf_data == b"": passwd_data = passwd.encode('UTF-8') else: algo, subalgo, iters, salt_user, salt_reset, salt_admin, \ hash_user, hash_admin = parse_kdf_data(kdf_data) if salt_admin: salt = salt_admin else: salt = salt_user passwd_data = kdf_calc(passwd, salt, iters) # And authenticate with the passwd data gnuk.cmd_verify(BY_ADMIN, passwd_data) gnuk.cmd_write_binary(1 + keyno, rsa_raw_pubkey, False) gnuk.cmd_select_openpgp() challenge = gnuk.cmd_get_challenge().tostring() digestinfo = binascii.unhexlify(SHA256_OID_PREFIX) + challenge signed = rsa.compute_signature(rsa_key, digestinfo) signed_bytes = rsa.integer_to_bytes_256(signed) gnuk.cmd_external_authenticate(keyno, signed_bytes) gnuk.stop_gnuk() mem_info = gnuk.mem_info() print("%08x:%08x" % mem_info) print("Downloading flash upgrade program...") gnuk.download(mem_info[0], data_regnual) print("Run flash upgrade program...") gnuk.execute(mem_info[0] + len(data_regnual) - 4) # time.sleep(3) gnuk.reset_device() del gnuk gnuk = None # reg = None print("Waiting for device to appear:") while reg == None: print(" Wait %d seconds..." % wait_e) time.sleep(wait_e) for dev in gnuk_devices_by_vidpid(): try: reg = regnual(dev) print("Device: %s" % dev.filename) break except: pass # Then, send upgrade program... mem_info = reg.mem_info() print("%08x:%08x" % mem_info) print("Downloading the program") reg.download(mem_info[0], data_upgrade) print("Protecting device") reg.protect() print("Finish flashing") reg.finish() print("Resetting device") reg.reset_device() print("Update procedure finished") return 0