# coding=utf-8
import ConfigParser
import binascii
import os
import sys
import hashlib
import struct
import re
# cp = ConfigParser.SafeConfigParser()
# cp.read('config_startcode.conf')
if len(sys.argv) == 1:
print('\nparameters is wrong\n')
exit()
elif len(sys.argv) == 2:
print('\nparameters is wrong\n')
exit()
elif len(sys.argv) == 3:
code_filename = sys.argv[2]
config_filename = sys.argv[1]
cp = ConfigParser.SafeConfigParser()
cp.read(config_filename)
mode = 0
elif len(sys.argv) == 4:
code_filename = sys.argv[2]
config_filename = sys.argv[1]
cp = ConfigParser.SafeConfigParser()
cp.read(config_filename)
mode = sys.argv[3]
else:
print('\nparameters is wrong\n')
exit()
# cp = ConfigParser.SafeConfigParser()
# cp.read('config_startcode.conf')
if not os.path.exists(code_filename):
print('\n{} does not exist\n'.format(code_filename))
exit()
if not os.path.exists(config_filename):
print('\nconfig file does not exist\n')
exit()
if int(mode) == 0:
print('\nmode is 0, test mode\n')
head_key_2048 = cer_key_2048 = '2048_mode0_key.pem'
head_key_4096 = cer_key_4096 = '4096_mode0_key.pem'
head_key_sm2 = cer_key_sm2 = 'sm3_mode0_key.pem'
elif int(mode) == 1:
print('\nmode is 1, normal mode\n')
head_key_2048 = '2048_head_key.pem'
cer_key_2048 = '2048_cer_key.pem'
head_key_4096 = '4096_head_key.pem'
cer_key_4096 = '4096_cer_key.pem'
head_key_sm2 = 'sm2_head_key.pem'
cer_key_sm2 = 'sm2_cer_key.pem'
else:
print('\nmode is wrong\n')
exit()
class General:
def deal_value(self, level1_name, level2_name):
protery_value = cp.get(level1_name, level2_name).replace(' ', '')
if protery_value.upper().startswith('0X'):
protery_value = protery_value[2:]
elif protery_value.startswith('\"') or protery_value.startswith('\''):
protery_value = protery_value.replace("\'", '').replace('\"', "").encode('hex')
else:
protery_value = hex(int(protery_value))[2:]
if len(protery_value) % 2 == 1:
protery_value = '0' + protery_value
return protery_value
def get_LSignAlg_alg_uwSubKeyLen(self):
LSignAlg_alg_value = self.deal_value('HeadArea', 'LSignAlg')
uwSubKeyLen_value = self.deal_value('SecondaryKeyCertificate', 'uwSubKeyLen')
if LSignAlg_alg_value == '010000' and uwSubKeyLen_value == '0100':
print('\n')
print('\nLSignAlg = 0x10000, uwSubKeyLen = 0x100, means hash_alg is SHA2-256,sign_alg is RSA_PSS, pub_key length is 2048\n')
elif LSignAlg_alg_value == '010000' and uwSubKeyLen_value == '0200':
print('\n')
print('\nLSignAlg = 0x10000,uwSubKeyLen = 0x200, means hash_alg is SHA2-256,sign_alg is RSA_PSS, pub_key length is 4096\n')
elif LSignAlg_alg_value == '200020' and uwSubKeyLen_value == '20':
print('\n')
print('\nLSignAlg = 0x200020, uwSubKeyLen = 0x20, means hash_alg is SM3, sign_alg is SM2, pub_key length is 32\n')
else:
print('\nPlease check LSignAlg and uwSubKeyLen\n')
exit()
return LSignAlg_alg_value, uwSubKeyLen_value
def get_uwSubKeySignAlg(self):
uwSubKeySignAlg_value = self.deal_value('SecondaryKeyCertificate', 'uwSubKeySignAlg')
if uwSubKeySignAlg_value == '010000':
print('\nuwSubKeySignAlg_value = 0x10000, means hash_alg is SHA2-256,sign_alg is RSA_PSS, pub_key length is 4096\n')
elif uwSubKeySignAlg_value == '200020':
print('\nuwSubKeySignAlg = 0x200020, means hash_alg is SM3, sign_alg is SM2, pub_key length is 32\n')
else:
print('\nPlease check uwSubKeySignAlg\n')
exit()
return uwSubKeySignAlg_value
def get_LcodeHashAlg(self):
LcodeHashAlg_value = self.deal_value('HeadArea', 'LcodeHashAlg')
if LcodeHashAlg_value == '00':
print('\nLcodeHashAlg = 0x00, means SHA256\n')
elif LcodeHashAlg_value == '01':
print('\nLcodeHashAlg = 0x01, means SHA512\n')
elif LcodeHashAlg_value == '02':
print('\nLcodeHashAlg = 0x01, means SM3\n')
else:
print('\nLcodeHashAlg is wrong\n')
exit()
return LcodeHashAlg_value
def get_sm3(self, value):
IV = "7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e"
IV = int(IV.replace(" ", ""), 16)
a = []
for i in range(0, 8):
a.append(0)
a[i] = (IV >> ((7 - i) * 32)) & 0xFFFFFFFF
IV = a
def rotate_left(a, k):
k = k % 32
return ((a << k) & 0xFFFFFFFF) | ((a & 0xFFFFFFFF) >> (32 - k))
T_j = []
for i in range(0, 16):
T_j.append(0)
T_j[i] = 0x79cc4519
for i in range(16, 64):
T_j.append(0)
T_j[i] = 0x7a879d8a
def FF_j(X, Y, Z, j):
if 0 <= j and j < 16:
ret = X ^ Y ^ Z
elif 16 <= j and j < 64:
ret = (X & Y) | (X & Z) | (Y & Z)
return ret
def GG_j(X, Y, Z, j):
if 0 <= j and j < 16:
ret = X ^ Y ^ Z
elif 16 <= j and j < 64:
ret = (X & Y) | ((~ X) & Z)
return ret
def P_0(X):
return X ^ (rotate_left(X, 9)) ^ (rotate_left(X, 17))
def P_1(X):
return X ^ (rotate_left(X, 15)) ^ (rotate_left(X, 23))
def CF(V_i, B_i):
W = []
for j in range(0, 16):
W.append(0)
unpack_list = struct.unpack(">I", B_i[j * 4:(j + 1) * 4])
W[j] = unpack_list[0]
for j in range(16, 68):
W.append(0)
W[j] = P_1(W[j - 16] ^ W[j - 9] ^ (rotate_left(W[j - 3], 15))) ^ (rotate_left(W[j - 13], 7)) ^ W[j - 6]
W_1 = []
for j in range(0, 64):
W_1.append(0)
W_1[j] = W[j] ^ W[j + 4]
A, B, C, D, E, F, G, H = V_i
for j in range(0, 64):
SS1 = rotate_left(((rotate_left(A, 12)) + E + (rotate_left(T_j[j], j))) & 0xFFFFFFFF, 7)
SS2 = SS1 ^ (rotate_left(A, 12))
TT1 = (FF_j(A, B, C, j) + D + SS2 + W_1[j]) & 0xFFFFFFFF
TT2 = (GG_j(E, F, G, j) + H + SS1 + W[j]) & 0xFFFFFFFF
D = C
C = rotate_left(B, 9)
B = A
A = TT1
H = G
G = rotate_left(F, 19)
F = E
E = P_0(TT2)
A = A & 0xFFFFFFFF
B = B & 0xFFFFFFFF
C = C & 0xFFFFFFFF
D = D & 0xFFFFFFFF
E = E & 0xFFFFFFFF
F = F & 0xFFFFFFFF
G = G & 0xFFFFFFFF
H = H & 0xFFFFFFFF
V_i_1 = []
V_i_1.append(A ^ V_i[0])
V_i_1.append(B ^ V_i[1])
V_i_1.append(C ^ V_i[2])
V_i_1.append(D ^ V_i[3])
V_i_1.append(E ^ V_i[4])
V_i_1.append(F ^ V_i[5])
V_i_1.append(G ^ V_i[6])
V_i_1.append(H ^ V_i[7])
return V_i_1
def hash_msg(msg):
len1 = len(msg)
reserve1 = len1 % 64
msg = msg + chr(0x80)
reserve1 = reserve1 + 1
range_end = 56
if reserve1 > range_end:
range_end = range_end + 64
for i in range(reserve1, range_end):
msg = msg + chr(0x00)
bit_length = (len1) * 8
bit_length_string = struct.pack(">Q", bit_length)
msg = msg + bit_length_string
group_count = len(msg) / 64
B = []
for i in range(0, group_count):
B.append(0)
B[i] = msg[i * 64:(i + 1) * 64]
V = []
V.append(0)
V[0] = IV
for i in range(0, group_count):
V.append(0)
V[i + 1] = CF(V[i], B[i])
return V[i + 1]
def out_hex(list1):
want = ''
for i in list1:
want += "%08x" % i
return want
return out_hex(hash_msg(value))
def get_sign_2048(self, key_name, hash_filename, want_sign_filename, sign_filename):
if not os.path.exists(key_name):
os.system("openssl genrsa -out {} 2048 >/dev/null 2>&1".format(key_name))
dump_key = os.popen('openssl rsa -in {} -text -noout'.format(key_name)).read().replace('\n', '').replace(' ', '')
N_value_256 = re.search('(modulus:)(.*)(publicExponent:)', dump_key).group(2).replace(':', '')
if N_value_256.startswith('00'):
N_value_256 = N_value_256[2:]
E_value_256 = re.search('(publicExponent:)(.*)(privateExponent:)', dump_key).group(2).replace(':', '')
E_value_256 = re.search('(\(0x)(.*)(\))', E_value_256).group(2)
os.system("openssl dgst -sha256 -binary -out {} {} >/dev/null 2>&1".format(hash_filename, want_sign_filename))
os.system('openssl pkeyutl -sign -pkeyopt rsa_padding_mode:pss -pkeyopt digest:sha256 -inkey {} -in {} -out {} >/dev/null 2>&1'.format(key_name, hash_filename, sign_filename))
with open(sign_filename, 'rb') as fp:
bin_file = fp.read()
sign_256 = binascii.hexlify(bin_file)
return N_value_256, E_value_256, sign_256
def get_sign_4096(self, key_name, hash_filename, want_sign_filename, sign_filename):
if not os.path.exists(key_name):
os.system("openssl genrsa -out {} 4096 >/dev/null 2>&1".format(key_name))
dump_key = os.popen('openssl rsa -in {} -text -noout'.format(key_name)).read().replace('\n', '').replace(' ', '')
N_value_256 = re.search('(modulus:)(.*)(publicExponent:)', dump_key).group(2).replace(':', '')
if N_value_256.startswith('00'):
N_value_256 = N_value_256[2:]
E_value_256 = re.search('(publicExponent:)(.*)(privateExponent:)', dump_key).group(2).replace(':', '')
E_value_256 = re.search('(\(0x)(.*)(\))', E_value_256).group(2)
os.system("openssl dgst -sha256 -binary -out {} {} >/dev/null 2>&1".format(hash_filename, want_sign_filename))
os.system('openssl pkeyutl -sign -pkeyopt rsa_padding_mode:pss -pkeyopt digest:sha256 -inkey {} -in {} -out {} >/dev/null 2>&1'.format(key_name, hash_filename, sign_filename))
with open(sign_filename, 'rb') as fp:
bin_file = fp.read()
sign_256 = binascii.hexlify(bin_file)
return N_value_256, E_value_256, sign_256
def get_sign_sm2(self, key_name, want_sign_filename, sign_filename):
if not os.path.exists(key_name):
os.system("gmssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:sm2p256v1 -out {} >/dev/null 2>&1".format(key_name))
dump_key_sm2 = os.popen('gmssl sm2 -in {} -noout -text -param_enc explicit'.format(key_name)).read().replace('\n', '').replace(' ', '')
sm2_X = re.search('(pub:04:)(.*)(FieldType:prime-field)', dump_key_sm2).group(2).replace(':', '')[0:64]
sm2_Y = re.search('(pub:04:)(.*)(FieldType:prime-field)', dump_key_sm2).group(2).replace(':', '')[64:]
os.system('gmssl sm2utl -sign -in {} -out {} -inkey {} -id 1234567812345678'.format(want_sign_filename, sign_filename, key_name))
dump_sign = os.popen('gmssl asn1parse -in ./{} -inform DER -dump'.format(sign_filename)).read().replace(' ', '')
want_part = re.findall('(INTEGER:)(.*)(\n)', dump_sign)
part1 = want_part[0][1]
part2 = want_part[1][1]
sign_sm2 = part1 + part2
return sm2_X, sm2_Y, sign_sm2
def reverse_hex(self, protery_value):
temp_lst = []
temp_len = len(protery_value)
for i in range(0, temp_len, 2):
temp_lst.append(protery_value[i:i + 2])
return ''.join(temp_lst[::-1])
def add_zero_after(self, protery_value, length):
protery_value = protery_value + ('0' * (length * 2 - (len(protery_value))))
return protery_value
def add_zero_before(self, protery_value, length):
protery_value = '0' * (length * 2 - (len(protery_value))) + protery_value
return protery_value
def little_endian(self, protery_value, length):
protery_value = self.add_zero_before(protery_value, length)
return self.reverse_hex(protery_value)
def big_endian(self, protery_value, length):
protery_value = self.add_zero_before(protery_value, length)
return protery_value
gen = General()
LSignAlg, uwSubKeyLen = gen.get_LSignAlg_alg_uwSubKeyLen()
uwSubKeySignAlg = gen.get_uwSubKeySignAlg()
LcodeHashAlg = gen.get_LcodeHashAlg()
if mode == 0:
if LSignAlg != uwSubKeySignAlg:
print('\nIn mode 0 ,LSignAlg should be equal uwSubKeySignAlg')
exit()
if uwSubKeyLen == '0100':
print('\nIn mode 0 ,uwSubKeyLen can not supports 256')
exit()
with open(code_filename, 'rb') as fp:
bin_code_file = fp.read()
code_file_sha256 = hashlib.sha256(bin_code_file).hexdigest()
code_file_sha512 = hashlib.sha512(bin_code_file).hexdigest()
code_file_sm3 = gen.get_sm3(bin_code_file)
code_file_len = hex(len(bin_code_file))[2:]
print('LCodeLen = 0x{}\n'.format(code_file_len))
hex_code_file = binascii.hexlify(bin_code_file)
class Get_orange_content:
def get_orange_1(self, LcodeHashAlg, code_file_len):
if LcodeHashAlg == '00':
ucLCodeHash = code_file_sha256
elif LcodeHashAlg == '01':
ucLCodeHash = code_file_sha512
elif LcodeHashAlg == '02':
ucLCodeHash = code_file_sm3
print('\nucLCodeHash = 0x{}\n'.format(ucLCodeHash))
Lpreamble = gen.little_endian(gen.deal_value('HeadArea', 'Lpreamble'), 4)
LHeadLen = gen.little_endian(gen.deal_value('HeadArea', 'LHeadLen'), 4)
LSubKeyCertOffset = gen.little_endian(gen.deal_value('HeadArea', 'LSubKeyCertOffset'), 4)
LSignAlg = gen.little_endian(gen.deal_value('HeadArea', 'LSignAlg'), 4)
LSignOffset = gen.little_endian(gen.deal_value('HeadArea', 'LSignOffset'), 4)
LCodeOffset = gen.little_endian(gen.deal_value('HeadArea', 'LCodeOffset'), 4)
LCodeLen = gen.little_endian(code_file_len, 4)
ucLCodeHash = gen.add_zero_after(ucLCodeHash,64)
uwCodeTag = gen.add_zero_after(gen.deal_value('HeadArea', 'uwCodeTag'), 16)
uwCodeNVCNT = gen.little_endian(gen.deal_value('HeadArea', 'uwCodeNVCNT'), 4)
LcodeHashAlg = gen.little_endian(LcodeHashAlg, 4)
LRevListOffset = gen.little_endian(gen.deal_value('HeadArea', 'LRevListOffset'), 4)
uwEncryptFlag = gen.little_endian(gen.deal_value('HeadArea', 'uwEncryptFlag'), 4)
uwEncryptAlg = gen.little_endian(gen.deal_value('HeadArea', 'uwEncryptAlg'), 4)
uwDeriveSeedEK1 = gen.big_endian(gen.deal_value('HeadArea', 'uwDeriveSeedEK1'), 16)
uwDeriveSeedEK2 = gen.big_endian(gen.deal_value('HeadArea', 'uwDeriveSeedEK2'), 16)
uwDeriveSeedEK3 = gen.big_endian(gen.deal_value('HeadArea', 'uwDeriveSeedEK3'), 32)
uwEncryptIv = gen.big_endian(gen.deal_value('HeadArea', 'uwEncryptIv'), 16)
uwEncryptTag = gen.little_endian(gen.deal_value('HeadArea', 'uwEncryptTag'), 16)
uwEncryptADD = gen.little_endian(gen.deal_value('HeadArea', 'uwEncryptADD'), 16)
LUserLen = gen.little_endian(gen.deal_value('HeadArea', 'LUserLen'), 4)
ucLUserDefineData = gen.little_endian(gen.deal_value('HeadArea', 'ucLUserDefineData'), 1072)
LJumpOffset = gen.little_endian(gen.deal_value('HeadArea', 'LJumpOffset'), 4)
ucLUserDefineData += LJumpOffset
LHeadMagic = gen.little_endian(gen.deal_value('HeadArea', 'LHeadMagic'), 4)
HeadArea_head_1 = Lpreamble + LHeadLen + LSubKeyCertOffset + LSignAlg + LSignOffset + LCodeOffset + LCodeLen + \
ucLCodeHash + uwCodeTag + uwCodeNVCNT + LcodeHashAlg + LRevListOffset + uwEncryptFlag + \
uwEncryptAlg + uwDeriveSeedEK1 + uwDeriveSeedEK2 + uwDeriveSeedEK3 + uwEncryptIv + \
uwEncryptTag + uwEncryptADD + LUserLen + ucLUserDefineData + LHeadMagic
return HeadArea_head_1
def get_orange_1_hash(self, LcodeHashAlg, orange_1_content):
bin_HeadArea_head_1 = binascii.a2b_hex(orange_1_content)
if LcodeHashAlg == '00':
ucHeadHash = hashlib.sha256(bin_HeadArea_head_1).hexdigest()
elif LcodeHashAlg == '01':
ucHeadHash = hashlib.sha512(bin_HeadArea_head_1).hexdigest()
elif LcodeHashAlg == '02':
ucHeadHash = gen.get_sm3(bin_HeadArea_head_1)
print('ucHeadHash = {}\n'.format(ucHeadHash))
return ucHeadHash
def get_HeadArea_all_bin(self, HeadArea_head_1, ucHeadHash):
ucHeadHash = gen.add_zero_after(ucHeadHash,64)
head_Padding = gen.little_endian(gen.deal_value('HeadArea', 'Padding'), 148)
HeadArea_all_hex = HeadArea_head_1 + ucHeadHash + head_Padding
bin_HeadArea_all = binascii.a2b_hex(HeadArea_all_hex)
with open('HeadArea_all.bin', 'wb') as fp1:
fp1.write(bin_HeadArea_all)
return HeadArea_all_hex
class Get_green_content:
def get_head_sign(self,key_name_head_2048, key_name_head_4096, key_name_head_sm2, LSignAlg, uwSubKeyLen):
if LSignAlg == '010000' and uwSubKeyLen == '0100':
N, E, head_sign = gen.get_sign_2048(key_name_head_2048, '2048_hash_head.bin', 'HeadArea_all.bin', '2048_sign_head.bin')
elif LSignAlg == '010000' and uwSubKeyLen == '0200':
N, E, head_sign = gen.get_sign_4096(key_name_head_4096, '4096_hash_head.bin', 'HeadArea_all.bin', '4096_sign_head.bin')
elif LSignAlg == '200020' and uwSubKeyLen == '20':
N, E, head_sign = gen.get_sign_sm2(key_name_head_sm2, 'HeadArea_all.bin', 'sm2_sign_head.bin')
print('\nhead_sign_N = 0x{}\n'.format(N))
print('\nhead_sign_E = 0x{}\n'.format(E))
print('\nhead_sign = 0x{}\n'.format(head_sign))
return N, E, head_sign
class Get_blue_content:
def get_blue_1_file(self, LSignAlg, uwSubKeySignAlg, uwSubKeyLen, N, E):
uwSubKeyVersion = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'uwSubKeyVersion'), 4)
uwSubKeySignAlg = gen.little_endian(uwSubKeySignAlg, 4)
uwSubKeyCategory = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'uwSubKeyCategory'), 4)
uwSubKeyID = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'uwSubKeyCategory'), 4)
uwSubKeyLen = gen.little_endian(uwSubKeyLen, 4)
if uwSubKeySignAlg == '00000100':
uwSubKeySignLen = '0200'
elif uwSubKeySignAlg == '20002000':
uwSubKeySignLen = '40'
uwSubKeySignLen = gen.little_endian(uwSubKeySignLen, 4)
if LSignAlg == '010000' and uwSubKeyLen == '00010000':
ucSubKey = gen.big_endian(N, 256)
ucSubKeyE = gen.add_zero_before(E, 256)
elif LSignAlg == '010000' and uwSubKeyLen == '00020000':
ucSubKey = gen.big_endian(N, 512)
ucSubKeyE = gen.add_zero_before(E, 512)
elif LSignAlg == '200020' and uwSubKeyLen == '20000000':
ucSubKey = gen.big_endian(N, 32)
ucSubKeyE = gen.add_zero_before(E, 32)
blue_1_hex = uwSubKeyVersion + uwSubKeySignAlg + uwSubKeyCategory + uwSubKeyID + uwSubKeyLen + uwSubKeySignLen + ucSubKey + ucSubKeyE
blue_1_bin = binascii.a2b_hex(blue_1_hex)
with open('blue_head.bin', 'wb') as fp1:
fp1.write(blue_1_bin)
return blue_1_hex
def get_blue1_sign(self, key_name_cer_4096, key_name_cer_sm2, uwSubKeySignAlg):
if uwSubKeySignAlg == '010000':
N, E, Certificate_sign = gen.get_sign_4096(key_name_cer_4096, '4096_hash_cer_head.bin', 'blue_head.bin', '4096_sign_cer.bin')
elif uwSubKeySignAlg == '200020':
N, E, Certificate_sign = gen.get_sign_sm2(key_name_cer_sm2, 'blue_head.bin', 'sm2_sign_cer.bin')
print('\nCertificate_sign_N = 0x{}\n'.format(N))
print('\nCertificate_sign_E = 0x{}\n'.format(E))
print('\nCertificate_sign = 0x{}\n'.format(Certificate_sign))
return N, E, Certificate_sign
get_o = Get_orange_content()
get_g = Get_green_content()
get_b = Get_blue_content()
hex_orange_1 = get_o.get_orange_1(LcodeHashAlg,code_file_len)
orange_1_hash = get_o.get_orange_1_hash(LcodeHashAlg, hex_orange_1)
orange_all = get_o.get_HeadArea_all_bin(hex_orange_1, orange_1_hash)
#
N_head, E_head, head_sign = get_g.get_head_sign(head_key_2048, head_key_4096, head_key_sm2, LSignAlg, uwSubKeyLen)
blue_1 = get_b.get_blue_1_file(LSignAlg,uwSubKeySignAlg, uwSubKeyLen, N_head,E_head)
N_cer, E_cer, blue_1_sign = get_b.get_blue1_sign(cer_key_4096, cer_key_sm2, uwSubKeySignAlg)
if uwSubKeyLen == '0100':
ucSubKeySign = gen.big_endian(gen.deal_value(blue_1_sign, 512))
ucReserved = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'ucReserved'), 512)
SecondaryKeyCertificate_Padding = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'Padding'), 488)
head_sign = gen.big_endian(head_sign, 256)
HeadAreaSignature_Padding = gen.little_endian(gen.deal_value('HeadAreaSignature', 'Padding'), 256)
elif uwSubKeyLen == '0200':
ucSubKeySign = gen.big_endian(blue_1_sign, 512)
ucReserved = ''
SecondaryKeyCertificate_Padding = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'Padding'), 488)
head_sign = gen.big_endian(head_sign, 512)
HeadAreaSignature_Padding = ''
elif uwSubKeyLen == '20':
ucSubKeySign = gen.big_endian(blue_1_sign, 64)
ucReserved = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'ucReserved'), 1408)
SecondaryKeyCertificate_Padding = gen.little_endian(gen.deal_value('SecondaryKeyCertificate', 'Padding'), 488)
head_sign = gen.big_endian(head_sign, 64)
HeadAreaSignature_Padding = gen.little_endian(gen.deal_value('HeadAreaSignature', 'Padding'), 448)
header_all_hex = orange_all + blue_1 + ucSubKeySign + ucReserved + SecondaryKeyCertificate_Padding + head_sign + HeadAreaSignature_Padding + 'FF' * 768
file_all_header = binascii.a2b_hex(header_all_hex)
file_all_hex = header_all_hex + hex_code_file
file_all = binascii.a2b_hex(file_all_hex)
with open('startcode_head.bin', 'wb') as fp1:
fp1.write(file_all_header)
with open('startcode_all.bin', 'wb') as fp2:
fp2.write(file_all)
print('\nstartcode_head.bin and startcode_all.bin are generated\n')
最新发布