mirror of
https://github.com/m5stack/LLM_buildroot-external-m5stack.git
synced 2026-05-20 11:34:12 -07:00
[update] buildroot clean
This commit is contained in:
Binary file not shown.
@@ -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 $?
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
@@ -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')
|
||||
|
||||
@@ -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')
|
||||
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Executable
+11
@@ -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-----
|
||||
Executable
+11
@@ -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-----
|
||||
Executable
+27
@@ -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-----
|
||||
Executable
+8
@@ -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-----
|
||||
Executable
+7
@@ -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')
|
||||
Executable
+1
@@ -0,0 +1 @@
|
||||
# This file is necessary to make this directory a package.
|
||||
+1
@@ -0,0 +1 @@
|
||||
# This file is necessary to make this directory a package.
|
||||
+1682
File diff suppressed because it is too large
Load Diff
+890
File diff suppressed because it is too large
Load Diff
Executable
+28
@@ -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
@@ -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
Reference in New Issue
Block a user