[update] buildroot clean

This commit is contained in:
dianjixz
2024-12-05 12:16:09 +08:00
parent fb89f482db
commit 3d64a6374b
70 changed files with 15764 additions and 35 deletions
Binary file not shown.
+45 -29
View File
@@ -1,41 +1,57 @@
#!/usr/bin/env bash
#
# atf_image extracts the ATF binary image from DTB_FILE_NAME that appears in
# BR2_TARGET_ARM_TRUSTED_FIRMWARE_ADDITIONAL_VARIABLES in ${BR_CONFIG},
# then prints the corresponding file name for the genimage
# configuration file
#
atf_image()
{
local ATF_VARIABLES="$(sed -n 's/^BR2_TARGET_ARM_TRUSTED_FIRMWARE_ADDITIONAL_VARIABLES="\(.*\)"$/\1/p' ${BR2_CONFIG})"
local DTB_NAME="$(sed -n 's/.*DTB_FILE_NAME=\([^ ]*\)/\1/p' <<< ${ATF_VARIABLES})"
local STM_NAME="tf-a-$(cut -f1 -d'.' <<< ${DTB_NAME}).stm32"
echo ${STM_NAME}
}
main()
{
local ATFBIN="$(atf_image)"
if [ ! -e ${BINARIES_DIR}/${ATFBIN} ]; then
echo "Can not find ATF binary ${ATFBIN}"
exit 1
fi
local GENIMAGE_CFG="$(mktemp --suffix genimage.cfg)"
local GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp"
local SCRIPT_PATH=$(dirname "$0")
work_dir="output/images"
sed -e "s/%ATFBIN%/${ATFBIN}/" \
${SCRIPT_PATH}/genimage.cfg > ${GENIMAGE_CFG}
# BR2_EXTERNAL_M5STACK_PATH
# OUTPUT_DIR=${OUTPUT_DIR}/..
# BINARIES_DIR
SIGN_SCRIPT=${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/imgsign/sec_boot_AX620E_sign.py
# PUB_KEY="${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/imgsign/key_3072/pubkey.pem"
# PRIV_KEY="${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/imgsign/key_3072/private.pem"
# SIGN_PARAMS="-cap 0x54FEFE -key_bit 3072"
support/scripts/genimage.sh -c ${GENIMAGE_CFG}
PUB_KEY="${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/imgsign/public.pem"
PRIV_KEY="${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/imgsign/private.pem"
SIGN_PARAMS="-cap 0x54FAFE -key_bit 2048"
rm -f ${GENIMAGE_CFG}
sed -e "s/%ATFBIN%/${ATFBIN}/" \
${SCRIPT_PATH}/flash.tsv > ${BINARIES_DIR}/flash.tsv
${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/ax_gzip -9 ${BINARIES_DIR}/u-boot-dtb.bin
python3 ${SIGN_SCRIPT} -i ${BINARIES_DIR}/u-boot-dtb_axgzip.bin \
-o ${BINARIES_DIR}/u-boot_signed.bin -pub ${PUB_KEY} -prv ${PRIV_KEY} ${SIGN_PARAMS}
cp ${BINARIES_DIR}/u-boot_signed.bin ${BINARIES_DIR}/u-boot_b_signed.bin
${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/ax_gzip -9 ${BINARIES_DIR}/Image
${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/ax_gzip -9 ${BINARIES_DIR}/m5stack-ax630c-module-llm.dtb
python3 ${SIGN_SCRIPT} -i ${BINARIES_DIR}/Image.axgzip \
-o ${BINARIES_DIR}/boot_signed.bin -pub ${PUB_KEY} -prv ${PRIV_KEY} ${SIGN_PARAMS}
python3 ${SIGN_SCRIPT} -i ${BINARIES_DIR}/m5stack-ax630c-module-llm.dtb.axgzip \
-o ${BINARIES_DIR}/AX630C_emmc_arm64_k419_signed.dtb -pub ${PUB_KEY} -prv ${PRIV_KEY} ${SIGN_PARAMS}
cp ${BINARIES_DIR}/boot_signed.bin ${BINARIES_DIR}/boot_signed.bin.1
cp ${BINARIES_DIR}/AX630C_emmc_arm64_k419_signed.dtb ${BINARIES_DIR}/AX630C_emmc_arm64_k419_signed.dtb.1
mkdir ${BINARIES_DIR}/rootfs
fuse2fs ${BINARIES_DIR}/rootfs.ext2 ${BINARIES_DIR}/rootfs
${BR2_EXTERNAL_M5STACK_PATH}/tools/bin/make_ext4fs -l 30606884864 -s ${BINARIES_DIR}/rootfs_sparse.ext4
fusermount -u ${BINARIES_DIR}/rootfs
rm ${BINARIES_DIR}/rootfs -rf
mkdir -p ${BINARIES_DIR}/../axera-image
tar zxvf ${BR2_EXTERNAL_M5STACK_PATH}/board/m5stack/module-LLM/image_overlay.tar.gz -C ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/u-boot_signed.bin ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/u-boot_b_signed.bin ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/AX630C_emmc_arm64_k419_signed.dtb ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/AX630C_emmc_arm64_k419_signed.dtb.1 ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/boot_signed.bin ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/boot_signed.bin.1 ${BINARIES_DIR}/../axera-image
cp ${BINARIES_DIR}/rootfs_sparse.ext4 ${BINARIES_DIR}/../axera-image
cd ${BINARIES_DIR}/../axera-image
zip -r ../output.zip .
cd ..
mv output.zip M5_LLM_buildroot_$(date +%Y%m%d).axp
exit $?
}
+3 -2
View File
@@ -76,8 +76,9 @@ BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION="https://ftp.denx.de/pub/u-boot/u-boot-
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="AX630C_m5stack_LLM_module"
BR2_TARGET_UBOOT_NEEDS_PYLIBFDT=y
# BR2_TARGET_UBOOT_FORMAT_BIN is not set
BR2_TARGET_UBOOT_FORMAT_CUSTOM=y
BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot-nodtb.bin u-boot.dtb"
BR2_TARGET_UBOOT_FORMAT_DTB_BIN=y
# BR2_TARGET_UBOOT_FORMAT_CUSTOM=y
# BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot.bin"
BR2_TARGET_UBOOT_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_M5STACK_PATH)/board/m5stack/module-LLM/uboot-dts/*"
BR2_TARGET_UBOOT_CUSTOM_MAKEOPTS="dtb-y=m5stack-ax630c-module-llm.dtb DEVICE_TREE=m5stack-ax630c-module-llm EXTRA_CFLAGS=-DUBOOT_IMG_HEADER_BASE=0x5C000000"
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+320
View File
@@ -0,0 +1,320 @@
import os
import sys
LOCAL_PATH = os.path.abspath(os.path.dirname(__file__))
HOME_PATH = LOCAL_PATH + "/../../.."
IMGSIGN_KEY_PATH = HOME_PATH + "/tools/imgsign"
sys.path.append(IMGSIGN_KEY_PATH)
import rsa
import ctypes
import traceback
import struct
def gen_rsa_2048_keys():
try:
(pubkey, prvkey) = rsa.newkeys(2048)
print("pub: ", pubkey)
print("prv: ", prvkey)
data = pubkey.save_pkcs1(format='PEM')
with open('public.pem', 'wb') as f:
f.write(data)
data = prvkey.save_pkcs1(format='PEM')
with open('private.pem', 'wb') as f:
f.write(data)
except:
print(sys.exc_info())
print(traceback.format_exc())
def print_usage():
print('\nbuild_spl.py -i <spl_file> -pub <public_key_file(*.pem)> -prv <private_key_file(*.pem)> -o <out_file>')
print(' -i : input original spl file path, the file size must be less than 79K bytes')
print(' -pub : input rsa public key file (*.pem) path')
print(' -prv : input rsa private key file (*.pem) path')
print(' -o : output new spl file with 512K bytes\n')
print(' -fw : input original fw file path, the file size must be less than 80K bytes\n')
print(' -packsize : input image packed size, the packsize must be aligned at 0x20000\n')
print(' -cap : input capability of header field\n')
'''
struct img_header{
u32 check_sum;//0x00
u32 magic_data;//0x04, should be 0x55543322
u32 capability;
u32 img_size;
u32 fw_size;
u32 img_check_sum;
u32 fw_check_sum;
/*
* [1:0]: nand page_size, page_size = 2^(nand_nor_cfg[1:0] + 11), 2KB ~ 16KB
* [4:2]: nand block_size, block_size = 2^(nand_nor_cfg[4:2] + 16), 64KB ~ 8MB
* [6:5]: nand oob_size, oob_size = 2^(nand_nor_cfg[6:5] + 6), 64Bytes ~ 512Bytes
* [7]: nand bad block marker size, if nand_nor_cfg[7] is 0, the bad block marker
* is 1 byte, if nand_type[7] is 1, bad block marker is 2 bytes.
* [15: 8]: nor QE read status register cmd
* [23:16]: nor QE write status register cmd
* [31:24]: nor QE bit offset
*/
u32 nand_nor_cfg;
u32 boot_bak_flash_addr;
u32 fw_flash_addr;
u32 fw_bak_flash_addr;
u32 key_n_header;
u32 rsa_key_n[96];
u32 key_e_header;
u32 rsa_key_e;
u32 sig_header;
u32 signature[96];
u32 reserved[49];
};
'''
IMG_ALIGN=0x20000
class spl_header(ctypes.Structure):
_pack_ = 4
_fields_ = [
("check_sum", ctypes.c_uint),
("magic_data", ctypes.c_uint),
("capability", ctypes.c_uint),
("img_size", ctypes.c_uint),
("fw_size", ctypes.c_uint),
("img_check_sum", ctypes.c_uint),
("fw_check_sum", ctypes.c_uint),
("nand_nor_cfg", ctypes.c_uint),
("boot_bak_flash_addr", ctypes.c_uint),
("fw_flash_addr", ctypes.c_uint),
("fw_bak_flash_addr", ctypes.c_uint),
("key_n_header", ctypes.c_uint), # 0x02000800 //0x00, 0x08, 0x00, 0x02
("rsa_key_n", ctypes.c_uint8*256),
("key_e_header", ctypes.c_uint), # 0x02010020 //0x20, 0x00, 0x01, 0x02
("rsa_key_e", ctypes.c_uint8*4),
("reserved1", ctypes.c_uint8*128),
("sig_header", ctypes.c_uint), # 0x01000800 //0x00, 0x08, 0x00, 0x01
("signature", ctypes.c_uint8*384),
("nand_ext_cfg", ctypes.c_uint),
("nand_rx_sample_delay", ctypes.c_uint*3),
("nor_rx_sample_delay", ctypes.c_uint*3),
("ocm_start_addr", ctypes.c_uint),
("reserved", ctypes.c_uint*41)
]
def to_bytes(n, length, byteorder='big'):
if sys.version > '3':
return n.to_bytes(length, byteorder=byteorder, signed=False)
else:
if byteorder == 'big':
data = b''
for i in reversed(range(length)):
d = (n >> i * 8) & 0xff
data += struct.pack("B", d)
return data
else:
data = b''
for i in range(length):
d = (n >> i * 8) & 0xff
data += struct.pack("B", d)
return data
def copy_data_by_bytes(src, dst, length, dst_offset= 0, revers=False, flag=False):
if sys.version > '3':
for i in range(length):
if revers:
dst[dst_offset + i] = ctypes.c_uint8(src[length - i - 1])
else:
dst[dst_offset + i] = ctypes.c_uint8(src[i])
else:
for i in range(length):
if revers:
dst[dst_offset + i] = ctypes.c_uint8(ord(src[length - i - 1]))
else:
if flag:
dst[dst_offset + i] = ctypes.c_uint8((src[i]))
else:
dst[dst_offset + i] = ctypes.c_uint8(ord(src[i]))
def do_spl(in_file, pub_file, prv_file, out_file, fw_file, pack_size, capability):
# load pub and private key file
try:
with open(pub_file, 'rb') as f:
pub_key = rsa.PublicKey.load_pkcs1(f.read())
with open(prv_file, 'rb') as f:
prv_key = rsa.PrivateKey.load_pkcs1(f.read())
except:
print('[error] load public or private key file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
# load in file data
header_size = 1024
in_size = os.path.getsize(in_file)
max_img_size = pack_size - header_size
all_img_pack_size = pack_size
if in_size > (max_img_size):
print('[error] file size({}) too big, must not be larger than %d'.format(in_size),max_img_size)
return False
try:
with open(in_file, 'rb') as f:
file_data = f.read()
except:
print('[error] load image file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
out_data = (ctypes.c_uint8 * all_img_pack_size)(0)
# load fw file data
fw_size = os.path.getsize(fw_file)
if fw_size > 80*1024:
print('[error] file size({}) too big, must not be larger than 80K'.format(fw_size))
return False
try:
with open(fw_file, 'rb') as f:
fw_data = f.read()
except:
print('[error] load fw file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
img_size = in_size
boot_bak_flash_addr = (header_size*2+in_size + (IMG_ALIGN - 1)) & (~(IMG_ALIGN - 1))
fw_flash_addr = (boot_bak_flash_addr+in_size + (IMG_ALIGN - 1)) & (~(IMG_ALIGN - 1))
fw_bak_flash_addr = fw_flash_addr + IMG_ALIGN
# create 80k buffer and put the file data offset 2K
copy_data_by_bytes(file_data, out_data, in_size, header_size*1)
# calc img check sum
check_sum = ctypes.c_uint32(0)
for i in range(header_size//4, in_size//4+(header_size//4)):
data = out_data[4*i] + (out_data[4*i + 1] << 8) + (out_data[4*i + 2] << 16) + (out_data[4*i + 3] << 24)
check_sum.value += ctypes.c_uint32(data).value
# construct spl_header
hdr = spl_header()
hdr.magic_data = 0x55543322
hdr.key_n_header = 0x02000800
hdr.key_e_header = 0x02010020
hdr.sig_header = 0x01000800
hdr.nand_nor_cfg = 0x06010504
hdr.ocm_start_addr = 0x03000400
hdr.capability = capability
hdr.img_size = in_size
hdr.img_check_sum = check_sum.value
hdr.fw_size = fw_size
hdr.boot_bak_flash_addr = boot_bak_flash_addr
hdr.fw_flash_addr = fw_flash_addr
hdr.fw_bak_flash_addr = fw_bak_flash_addr
pub_n = to_bytes(pub_key.n, 256, byteorder='little')
copy_data_by_bytes(pub_n, hdr.rsa_key_n, 256)
pub_e = to_bytes(pub_key.e, 4, byteorder='little')
copy_data_by_bytes(pub_e, hdr.rsa_key_e, 4)
# sign data
_message = file_data
signature = rsa.sign(_message, prv_key, 'SHA-256')
copy_data_by_bytes(signature, hdr.signature, 256, 0, True)
# verify test
try:
ret = rsa.verify(_message, signature, pub_key)
except e:
print('[error] verify failed\n')
print(sys.exc_info())
print(traceback.format_exc())
exit(-1)
# put hdr in first 1k
p = ctypes.cast(ctypes.pointer(hdr), ctypes.POINTER(ctypes.c_uint8 * header_size))
for i in range(header_size):
out_data[i] = p.contents[i]
# calc header check sum
header_check_sum = ctypes.c_uint32(0)
for i in range(2, (header_size-8)//4):
data = out_data[4*i] + (out_data[4*i + 1] << 8) + (out_data[4*i + 2] << 16) + (out_data[4*i + 3] << 24)
header_check_sum.value += ctypes.c_uint32(data).value
# update check sum in buffer
p = ctypes.cast(ctypes.pointer(header_check_sum), ctypes.POINTER(ctypes.c_uint8 * 4))
for i in range(4):
out_data[i] = p.contents[i]
packed_data = (ctypes.c_uint8 * (all_img_pack_size))(0)
#copy header once
copy_data_by_bytes(out_data, packed_data, header_size, 0, False, False)
# load in file back data
copy_data_by_bytes(file_data, packed_data, in_size, header_size*1)
# save data to out file
try:
with open(out_file, 'wb') as f:
f.write(packed_data)
except:
print('[error] create spl file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
return True
if __name__ == '__main__':
#gen_rsa_2048_keys()
in_file = None
pub_file = None
prv_file = None
out_file = None
fw_file = None
pack_size=0
capability=0
if len(sys.argv) < 15:
print('[error] param is invalid\n')
print_usage()
exit(-1)
for i in range(1, len(sys.argv)):
if sys.argv[i] == '-i':
in_file = sys.argv[i+1]
elif sys.argv[i] == '-pub':
pub_file = sys.argv[i+1]
elif sys.argv[i] == '-prv':
prv_file = sys.argv[i+1]
elif sys.argv[i] == '-o':
out_file = sys.argv[i + 1]
elif sys.argv[i] == '-fw':
fw_file = sys.argv[i + 1]
elif sys.argv[i] == '-packsize':
pack_size = int(sys.argv[i + 1],16)
elif sys.argv[i] == '-cap':
capability = int(sys.argv[i + 1],16)
if in_file is None or pub_file is None or prv_file is None or out_file is None or fw_file is None:
print('[error] param is invalid\n')
print_usage()
exit(-1)
if (not os.path.exists(in_file)) or (not os.path.exists(pub_file)) or (not os.path.exists(prv_file)) or (not os.path.exists(fw_file)):
print('[error] sign input file does not exist\n')
exit(-1)
'''
# test
in_file = 'D:/fdl1.bin'
pub_file = 'D:/public.pem'
prv_file = 'D:/private.pem'
out_file = 'D:/fdl1_sign.bin'
'''
ret = do_spl(in_file, pub_file, prv_file, out_file, fw_file, pack_size, capability)
if ret:
print('sign complete')
+319
View File
@@ -0,0 +1,319 @@
import os
import sys
LOCAL_PATH = os.path.abspath(os.path.dirname(__file__))
HOME_PATH = LOCAL_PATH + "/../../.."
IMGSIGN_KEY_PATH = HOME_PATH + "/tools/imgsign"
sys.path.append(IMGSIGN_KEY_PATH)
import rsa
import ctypes
import traceback
import struct
def gen_rsa_2048_keys():
try:
(pubkey, prvkey) = rsa.newkeys(2048)
print("pub: ", pubkey)
print("prv: ", prvkey)
data = pubkey.save_pkcs1(format='PEM')
with open('public.pem', 'wb') as f:
f.write(data)
data = prvkey.save_pkcs1(format='PEM')
with open('private.pem', 'wb') as f:
f.write(data)
except:
print(sys.exc_info())
print(traceback.format_exc())
def print_usage():
print('\nbuild_spl.py -i <spl_file> -pub <public_key_file(*.pem)> -prv <private_key_file(*.pem)> -o <out_file>')
print(' -i : input original spl file path, the file size must be less than 79K bytes')
print(' -pub : input rsa public key file (*.pem) path')
print(' -prv : input rsa private key file (*.pem) path')
print(' -o : output new spl file with 512K bytes\n')
print(' -fw : input original fw file path, the file size must be less than 80K bytes\n')
print(' -packsize : input image packed size, the packsize must be aligned at 0x20000\n')
print(' -cap : input capability of header field\n')
'''
struct img_header{
u32 check_sum;//0x00
u32 magic_data;//0x04, should be 0x55543322
u32 capability;
u32 img_size;
u32 fw_size;
u32 img_check_sum;
u32 fw_check_sum;
/*
* [1:0]: nand page_size, page_size = 2^(nand_nor_cfg[1:0] + 11), 2KB ~ 16KB
* [4:2]: nand block_size, block_size = 2^(nand_nor_cfg[4:2] + 16), 64KB ~ 8MB
* [6:5]: nand oob_size, oob_size = 2^(nand_nor_cfg[6:5] + 6), 64Bytes ~ 512Bytes
* [7]: nand bad block marker size, if nand_nor_cfg[7] is 0, the bad block marker
* is 1 byte, if nand_type[7] is 1, bad block marker is 2 bytes.
* [15: 8]: nor QE read status register cmd
* [23:16]: nor QE write status register cmd
* [31:24]: nor QE bit offset
*/
u32 nand_nor_cfg;
u32 boot_bak_flash_addr;
u32 fw_flash_addr;
u32 fw_bak_flash_addr;
u32 key_n_header;
u32 rsa_key_n[96];
u32 key_e_header;
u32 rsa_key_e;
u32 sig_header;
u32 signature[96];
u32 reserved[49];
};
'''
IMG_ALIGN=0x20000
class spl_header(ctypes.Structure):
_pack_ = 4
_fields_ = [
("check_sum", ctypes.c_uint),
("magic_data", ctypes.c_uint),
("capability", ctypes.c_uint),
("img_size", ctypes.c_uint),
("fw_size", ctypes.c_uint),
("img_check_sum", ctypes.c_uint),
("fw_check_sum", ctypes.c_uint),
("nand_nor_cfg", ctypes.c_uint),
("boot_bak_flash_addr", ctypes.c_uint),
("fw_flash_addr", ctypes.c_uint),
("fw_bak_flash_addr", ctypes.c_uint),
("key_n_header", ctypes.c_uint), # 0x02000800 //0x00, 0x08, 0x00, 0x02
("rsa_key_n", ctypes.c_uint8*384),
("key_e_header", ctypes.c_uint), # 0x02010020 //0x20, 0x00, 0x01, 0x02
("rsa_key_e", ctypes.c_uint8*4),
("sig_header", ctypes.c_uint), # 0x01000800 //0x00, 0x08, 0x00, 0x01
("signature", ctypes.c_uint8*384),
("nand_ext_cfg", ctypes.c_uint),
("nand_rx_sample_delay", ctypes.c_uint*3),
("nor_rx_sample_delay", ctypes.c_uint*3),
("ocm_start_addr", ctypes.c_uint),
("reserved", ctypes.c_uint*41)
]
def to_bytes(n, length, byteorder='big'):
if sys.version > '3':
return n.to_bytes(length, byteorder=byteorder, signed=False)
else:
if byteorder == 'big':
data = b''
for i in reversed(range(length)):
d = (n >> i * 8) & 0xff
data += struct.pack("B", d)
return data
else:
data = b''
for i in range(length):
d = (n >> i * 8) & 0xff
data += struct.pack("B", d)
return data
def copy_data_by_bytes(src, dst, length, dst_offset= 0, revers=False, flag=False):
if sys.version > '3':
for i in range(length):
if revers:
dst[dst_offset + i] = ctypes.c_uint8(src[length - i - 1])
else:
dst[dst_offset + i] = ctypes.c_uint8(src[i])
else:
for i in range(length):
if revers:
dst[dst_offset + i] = ctypes.c_uint8(ord(src[length - i - 1]))
else:
if flag:
dst[dst_offset + i] = ctypes.c_uint8((src[i]))
else:
dst[dst_offset + i] = ctypes.c_uint8(ord(src[i]))
def do_spl(in_file, pub_file, prv_file, out_file, fw_file, pack_size, capability):
# load pub and private key file
try:
with open(pub_file, 'rb') as f:
pub_key = rsa.PublicKey.load_pkcs1(f.read())
with open(prv_file, 'rb') as f:
prv_key = rsa.PrivateKey.load_pkcs1(f.read())
except:
print('[error] load public or private key file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
# load in file data
header_size = 1024
in_size = os.path.getsize(in_file)
max_img_size = pack_size - header_size
all_img_pack_size = pack_size
if in_size > (max_img_size):
print('[error] file size({}) too big, must not be larger than %d'.format(in_size),max_img_size)
return False
try:
with open(in_file, 'rb') as f:
file_data = f.read()
except:
print('[error] load image file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
out_data = (ctypes.c_uint8 * all_img_pack_size)(0)
# load fw file data
fw_size = os.path.getsize(fw_file)
if fw_size > 80*1024:
print('[error] file size({}) too big, must not be larger than 80K'.format(fw_size))
return False
try:
with open(fw_file, 'rb') as f:
fw_data = f.read()
except:
print('[error] load fw file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
img_size = in_size
boot_bak_flash_addr = (header_size*2+in_size + (IMG_ALIGN - 1)) & (~(IMG_ALIGN - 1))
fw_flash_addr = (boot_bak_flash_addr+in_size + (IMG_ALIGN - 1)) & (~(IMG_ALIGN - 1))
fw_bak_flash_addr = fw_flash_addr + IMG_ALIGN
# create 80k buffer and put the file data offset 2K
copy_data_by_bytes(file_data, out_data, in_size, header_size*1)
# calc img check sum
check_sum = ctypes.c_uint32(0)
for i in range(header_size//4, in_size//4+(header_size//4)):
data = out_data[4*i] + (out_data[4*i + 1] << 8) + (out_data[4*i + 2] << 16) + (out_data[4*i + 3] << 24)
check_sum.value += ctypes.c_uint32(data).value
# construct spl_header
hdr = spl_header()
hdr.magic_data = 0x55543322
hdr.key_n_header = 0x02000C00
hdr.key_e_header = 0x02010020
hdr.sig_header = 0x01000C00
hdr.nand_nor_cfg = 0x06010504
hdr.ocm_start_addr = 0x03000400
hdr.capability = capability
hdr.img_size = in_size
hdr.img_check_sum = check_sum.value
hdr.fw_size = fw_size
hdr.boot_bak_flash_addr = boot_bak_flash_addr
hdr.fw_flash_addr = fw_flash_addr
hdr.fw_bak_flash_addr = fw_bak_flash_addr
pub_n = to_bytes(pub_key.n, 384, byteorder='little')
copy_data_by_bytes(pub_n, hdr.rsa_key_n, 384)
pub_e = to_bytes(pub_key.e, 4, byteorder='little')
copy_data_by_bytes(pub_e, hdr.rsa_key_e, 4)
# sign data
_message = file_data
signature = rsa.sign(_message, prv_key, 'SHA-256')
copy_data_by_bytes(signature, hdr.signature, 384, 0, True)
# verify test
try:
ret = rsa.verify(_message, signature, pub_key)
except e:
print('[error] verify failed\n')
print(sys.exc_info())
print(traceback.format_exc())
exit(-1)
# put hdr in first 1k
p = ctypes.cast(ctypes.pointer(hdr), ctypes.POINTER(ctypes.c_uint8 * header_size))
for i in range(header_size):
out_data[i] = p.contents[i]
# calc header check sum
header_check_sum = ctypes.c_uint32(0)
for i in range(2, (header_size-8)//4):
data = out_data[4*i] + (out_data[4*i + 1] << 8) + (out_data[4*i + 2] << 16) + (out_data[4*i + 3] << 24)
header_check_sum.value += ctypes.c_uint32(data).value
# update check sum in buffer
p = ctypes.cast(ctypes.pointer(header_check_sum), ctypes.POINTER(ctypes.c_uint8 * 4))
for i in range(4):
out_data[i] = p.contents[i]
packed_data = (ctypes.c_uint8 * (all_img_pack_size))(0)
#copy header once
copy_data_by_bytes(out_data, packed_data, header_size, 0, False, False)
# load in file back data
copy_data_by_bytes(file_data, packed_data, in_size, header_size*1)
# save data to out file
try:
with open(out_file, 'wb') as f:
f.write(packed_data)
except:
print('[error] create spl file failed\n')
print(sys.exc_info())
print(traceback.format_exc())
return False
return True
if __name__ == '__main__':
#gen_rsa_2048_keys()
in_file = None
pub_file = None
prv_file = None
out_file = None
fw_file = None
pack_size=0
capability=0
if len(sys.argv) < 15:
print('[error] param is invalid\n')
print_usage()
exit(-1)
for i in range(1, len(sys.argv)):
if sys.argv[i] == '-i':
in_file = sys.argv[i+1]
elif sys.argv[i] == '-pub':
pub_file = sys.argv[i+1]
elif sys.argv[i] == '-prv':
prv_file = sys.argv[i+1]
elif sys.argv[i] == '-o':
out_file = sys.argv[i + 1]
elif sys.argv[i] == '-fw':
fw_file = sys.argv[i + 1]
elif sys.argv[i] == '-packsize':
pack_size = int(sys.argv[i + 1],16)
elif sys.argv[i] == '-cap':
capability = int(sys.argv[i + 1],16)
if in_file is None or pub_file is None or prv_file is None or out_file is None or fw_file is None:
print('[error] param is invalid\n')
print_usage()
exit(-1)
if (not os.path.exists(in_file)) or (not os.path.exists(pub_file)) or (not os.path.exists(prv_file)) or (not os.path.exists(fw_file)):
print('[error] sign input file does not exist\n')
exit(-1)
'''
# test
in_file = 'D:/fdl1.bin'
pub_file = 'D:/public.pem'
prv_file = 'D:/private.pem'
out_file = 'D:/fdl1_sign.bin'
'''
ret = do_spl(in_file, pub_file, prv_file, out_file, fw_file, pack_size, capability)
if ret:
print('sign complete')
+39
View File
@@ -0,0 +1,39 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
+11
View File
@@ -0,0 +1,11 @@
-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEA50aisdw1cqOUxDyIxYW598uAbfybWyFNWkliNYWjIOeToNksC5jg
bDZNsMGXz30wIn1LQDHaH3L9mEIhLm4NW63IlSqtwPyTjWYnQ8tOelVg5KyQHfis
yCpRMqSnyaoeyKcK3ctgTKWsAZ3hyigGOGqDmBTvj4nG1zxyp5MXGQcIaUmE46aZ
m2/3FlsOyPBRJdVcD7wRkmZsdlaW1rQskgwTFSmO3YvNW+QuPwFsiXgqCM3ObLcb
2HkaZiJCz90mcLJAh1e42UQT6iDL5HyCM1ldNEZcv2iPqzuffm4uP5lYfpzZIyyP
YvxBP1SfHDvGgT+H+xc8vQ9KELy1mzq1r6bve1d7kdDrlrdVIZuNqFhgEYQR+7KL
b5tpTnM1RWYNlxyyzQutEet9tTpPym0kf8a2ohnz1ReTxzuwaMR4o/vAi6lhWCLa
C9do6NnRuGpEP/y6ZY7FycbmSJqSuy9BBP3bXSwU5mDQNYBe+BAhDFwyoQDrziy4
SaIc0DuEFPPtAgMBAAE=
-----END RSA PUBLIC KEY-----
+11
View File
@@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA50aisdw1cqOUxDyIxYW5
98uAbfybWyFNWkliNYWjIOeToNksC5jgbDZNsMGXz30wIn1LQDHaH3L9mEIhLm4N
W63IlSqtwPyTjWYnQ8tOelVg5KyQHfisyCpRMqSnyaoeyKcK3ctgTKWsAZ3hyigG
OGqDmBTvj4nG1zxyp5MXGQcIaUmE46aZm2/3FlsOyPBRJdVcD7wRkmZsdlaW1rQs
kgwTFSmO3YvNW+QuPwFsiXgqCM3ObLcb2HkaZiJCz90mcLJAh1e42UQT6iDL5HyC
M1ldNEZcv2iPqzuffm4uP5lYfpzZIyyPYvxBP1SfHDvGgT+H+xc8vQ9KELy1mzq1
r6bve1d7kdDrlrdVIZuNqFhgEYQR+7KLb5tpTnM1RWYNlxyyzQutEet9tTpPym0k
f8a2ohnz1ReTxzuwaMR4o/vAi6lhWCLaC9do6NnRuGpEP/y6ZY7FycbmSJqSuy9B
BP3bXSwU5mDQNYBe+BAhDFwyoQDrziy4SaIc0DuEFPPtAgMBAAE=
-----END PUBLIC KEY-----
+27
View File
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAkOExgdIicsMTY7QEVKT1RZXmNobXJ3fIGGi5CVmp+kqa6zuL
3Cx8zR1tvg5erv9Pn/BAkOExgdIicsMTY7QEVKT1RZXmNobXJ3fIGGi5CVmp+kqa
6zuL3Cx8zR1tvg5erv9Pn/BAkOExgdIicsMTY7QEVKT1RZXmNobXJ3fIG9k46JhH
96dXBrZmFcV1JNSEM+OTQvKiUgGxYRDAcB/Pfy7ejj3tnUz8rFwLu2saynop2Yk4
6JhH96dXBrZmFcV1JNSEM+OTQvKiUgGxYRDAcB/Pfy7ejj3tnUz8rFwLu2saynop
2Yk46JhH96dXBrZmFcV1JNSEM+OTQvKiUga+KwIDAQABAoIBAAaMRwKJDsmFC5FM
B44TzooQllEMkxjTjxWbVhGYHdiUGqBbFp0i3ZkfpWAboifiniSqZSCnLOejKa9q
Jawx7KgutG8qsTbxrTO5dC+2O/ayOL55NLtA+7c9w345wEYAvELIgz7FSwXBR82I
Q8pQCsZM0o1Iz1UPy1HXkk3UWhT4EO/11Y5tc1ML6vDQiWhuTgbl68uEY2lJAeDm
xn9eZEP82+HBellfPvfW3Lx1VFo58tHXt3BPVTTtzNKya0pQL+jHza1mRUsq48LI
qGFARiXevcOjXDtBINm4vp5XNjwb1LO5mVIxNxbPrrSUTSwyEcqpr49IJy0MxaSq
ikMiYkECgYEAyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI
yMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI
yMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyrsCgYEAuLi4
uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4
uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4
uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u1ECgYACBBIQAgQSEAIEEhACBBIQ
AgQSEAIEEhACBBIQAgQSEAIEEhACBBIQAgQSEAIEEhACBBIQAgQSEAIEEhACBBIQ
AgQSEAIEEhACBBIQAgQSEAIEEhACBBIQAgQSEAIEEhACBBIQAgQSEAIEEhACBBIQ
AgQSEAIEEhACBBIQAgQSFQKBgF3AcxBdwHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBd
wHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBd
wHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBdwHMQXcBzEF3AcxBd
wHRhAoGAV490ZxNVX1Fk4zJdIUHhAjofEb4ACfwPjd0Hy+yLrOTJvGiqtKa6OIey
dpc2V490ZxNVX1Fk4zJdIUHhAjofEb4ACfwPjd0Hy+yLrOTJvGiqtKa6OIeydpc2
V490ZxNVX1Fk4zJdIUHhAjofEb4ACfwPjd0Hy+yLrOTJvGiqtYA=
-----END RSA PRIVATE KEY-----
+8
View File
@@ -0,0 +1,8 @@
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAkOExgdIicsMTY7QEVKT1RZXmNobXJ3fIGGi5CVmp+kqa6zuL3Cx8
zR1tvg5erv9Pn/BAkOExgdIicsMTY7QEVKT1RZXmNobXJ3fIGGi5CVmp+kqa6zuL
3Cx8zR1tvg5erv9Pn/BAkOExgdIicsMTY7QEVKT1RZXmNobXJ3fIG9k46JhH96dX
BrZmFcV1JNSEM+OTQvKiUgGxYRDAcB/Pfy7ejj3tnUz8rFwLu2saynop2Yk46JhH
96dXBrZmFcV1JNSEM+OTQvKiUgGxYRDAcB/Pfy7ejj3tnUz8rFwLu2saynop2Yk4
6JhH96dXBrZmFcV1JNSEM+OTQvKiUga+KwIDAQAB
-----END RSA PUBLIC KEY-----
+7
View File
@@ -0,0 +1,7 @@
import sys
# https://www.python.org/dev/peps/pep-0396/
__version__ = '0.4.8'
if sys.version_info[:2] < (2, 4):
raise RuntimeError('PyASN1 requires Python 2.4 or later')
+1
View File
@@ -0,0 +1 @@
# This file is necessary to make this directory a package.
+1
View File
@@ -0,0 +1 @@
# This file is necessary to make this directory a package.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+28
View File
@@ -0,0 +1,28 @@
#
# This file is part of pyasn1 software.
#
# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com>
# License: http://snmplabs.com/pyasn1/license.html
#
from pyasn1.type import base
from pyasn1.type import tag
__all__ = ['endOfOctets']
class EndOfOctets(base.SimpleAsn1Type):
defaultValue = 0
tagSet = tag.initTagSet(
tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x00)
)
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
endOfOctets = EndOfOctets()
+1
View File
@@ -0,0 +1 @@
# This file is necessary to make this directory a package.

Some files were not shown because too many files have changed in this diff Show More