aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/chitu_crypt.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2020-08-30 13:11:34 -0400
committerKevin O'Connor <kevin@koconnor.net>2020-08-30 13:11:34 -0400
commit12529ef6cda3c2e8835a630b465e2b1025569bcf (patch)
tree8e41ef1c9c5aca6afdfc73e94e863d7cc8db3d1e /scripts/chitu_crypt.py
parent1d201c3592f1e29048eff3dc62c70aa650c3985e (diff)
downloadkutter-12529ef6cda3c2e8835a630b465e2b1025569bcf.tar.gz
kutter-12529ef6cda3c2e8835a630b465e2b1025569bcf.tar.xz
kutter-12529ef6cda3c2e8835a630b465e2b1025569bcf.zip
update_chitu: Rename script and minor changes
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'scripts/chitu_crypt.py')
-rwxr-xr-xscripts/chitu_crypt.py130
1 files changed, 0 insertions, 130 deletions
diff --git a/scripts/chitu_crypt.py b/scripts/chitu_crypt.py
deleted file mode 100755
index 080b9f47..00000000
--- a/scripts/chitu_crypt.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env python2
-# Encrypts STM32 firmwares to be flashable from SD card by Chitu motherboards.
-# Relocate firmware to 0x08008800!
-
-# Copied from Marlin and modified.
-# Licensed under GPL-3.0
-
-import os
-import random
-import struct
-import uuid
-import sys
-
-def calculate_crc(contents, seed):
- accumulating_xor_value = seed;
-
- for i in range(0, len(contents), 4):
- value = struct.unpack('<I', contents[ i : i + 4])[0]
- accumulating_xor_value = accumulating_xor_value ^ value
- return accumulating_xor_value
-
-def xor_block(r0, r1, block_number, block_size, file_key):
- # This is the loop counter
- loop_counter = 0x0
-
- # This is the key length
- key_length = 0x18
-
- # This is an initial seed
- xor_seed = 0x4bad
-
- # This is the block counter
- block_number = xor_seed * block_number
-
- #load the xor key from the file
- r7 = file_key
-
- for loop_counter in range(0, block_size):
- # meant to make sure different bits of the key are used.
- xor_seed = int(loop_counter/key_length)
-
- # IP is a scratch register / R12
- ip = loop_counter - (key_length * xor_seed)
-
- # xor_seed = (loop_counter * loop_counter) + block_number
- xor_seed = (loop_counter * loop_counter) + block_number
-
- # shift the xor_seed left by the bits in IP.
- xor_seed = xor_seed >> ip
-
- # load a byte into IP
- ip = r0[loop_counter]
-
- # XOR the seed with r7
- xor_seed = xor_seed ^ r7
-
- # and then with IP
- xor_seed = xor_seed ^ ip
-
- #Now store the byte back
- r1[loop_counter] = xor_seed & 0xFF
-
- #increment the loop_counter
- loop_counter = loop_counter + 1
-
-
-def encrypt_file(input, output_file, file_length):
- input_file = bytearray(input.read())
- block_size = 0x800
- key_length = 0x18
-
- uid_value = uuid.uuid4()
- file_key = int(uid_value.hex[0:8], 16)
-
- xor_crc = 0xef3d4323;
-
- # the input file is exepcted to be in chunks of 0x800
- # so round the size
- while len(input_file) % block_size != 0:
- input_file.extend(b'0x0')
-
- # write the file header
- output_file.write(struct.pack(">I", 0x443D2D3F))
- # encrypt the contents using a known file header key
-
- # write the file_key
- output_file.write(struct.pack("<I", file_key))
-
- #TODO - how to enforce that the firmware aligns to block boundaries?
- block_count = int(len(input_file) / block_size)
- print("Block Count is ", block_count)
- for block_number in range(0, block_count):
- block_offset = (block_number * block_size)
- block_end = block_offset + block_size
- block_array = bytearray(input_file[block_offset: block_end])
- xor_block(block_array, block_array, block_number, block_size, file_key)
- for n in range (0, block_size):
- input_file[block_offset + n] = block_array[n]
-
- # update the expected CRC value.
- xor_crc = calculate_crc(block_array, xor_crc)
-
- # write CRC
- output_file.write(struct.pack("<I", xor_crc))
-
- # finally, append the encrypted results.
- output_file.write(input_file)
- return
-
-if len(sys.argv) == 1:
- print("Usage: chitu_crypt [firmware.bin]")
- exit(1)
-
-fw = sys.argv[-1]
-
-if not os.path.isfile(fw):
- print("Usage: chitu_crypt [firmware.bin]")
- print("Firmware file", fw, "does not exist")
- exit(1)
-
-firmware = open(fw, "rb")
-update = open('./update.cbd', "wb")
-length = os.path.getsize(fw)
-
-encrypt_file(firmware, update, length)
-
-firmware.close()
-update.close()
-
-print("Encryption complete. Firmware is written to update.cbd.")