11 parser
= argparse
.ArgumentParser()
12 parser
.add_argument('--input-file', type=str, required
=True)
13 parser
.add_argument('--output-file', type=str, required
=True)
14 parser
.add_argument('--model', type=str, required
=True)
15 parser
.add_argument('--region', type=str, required
=True)
16 parser
.add_argument('--version', type=str, required
=True)
17 parser
.add_argument('--encryption-block-size', type=str, required
=True)
18 parser
.add_argument('--openssl-bin', type=str, required
=True)
19 parser
.add_argument('--key', type=str, required
=True)
20 parser
.add_argument('--iv', type=str, required
=True)
21 args
= parser
.parse_args()
23 assert re
.match(r
'V[0-9]\.[0-9]\.[0-9]\.[0-9]',
24 args
.version
), 'Version must start with Vx.x.x.x'
25 encryption_block_size
= int(args
.encryption_block_size
, 0)
26 assert (encryption_block_size
> 0 and encryption_block_size
% 16 ==
27 0), 'Encryption block size must be a multiple of the AES block size (16)'
29 image
= open(args
.input_file
, 'rb').read()
31 for i
in range(0, len(image
), encryption_block_size
):
32 chunk
= image
[i
:i
+ encryption_block_size
]
33 chunk
+= b
'\x00' * ((-len(chunk
)) % 16) # pad to AES block size (16)
34 res
= subprocess
.run([
43 check
=True, input=chunk
, stdout
=subprocess
.PIPE
)
44 image_enc
.append(res
.stdout
)
45 image_enc
= b
''.join(image_enc
)
47 image_with_header
= struct
.pack(
48 '>32s32s64s64s64s256s12sII',
49 args
.model
.encode('ascii'),
50 args
.region
.encode('ascii'),
51 args
.version
.encode('ascii'),
52 b
'Thu Jan 1 00:00:00 1970', # static date for reproducibility
54 b
'', # RSA signature - omitted for now
57 encryption_block_size
,
60 checksum
= zlib
.crc32(image_with_header
, 0xffffffff) ^
0xffffffff
62 with
open(args
.output_file
, 'wb') as outfile
:
63 outfile
.write(image_with_header
)
64 outfile
.write(struct
.pack('>I', checksum
))
67 if __name__
== "__main__":