10
10
"""
11
11
12
12
import argparse
13
+ import hashlib
13
14
import os
14
15
import struct
15
16
24
25
DUAL_read = "0x3B"
25
26
QUAD_read = "0x6B"
26
27
28
+ TAG_MAGIC = 0x6907
29
+ TAG_LEN = 0x0028
30
+ TAG_TYPE_SHA = 0x0010
31
+ TAG_SHA_LEN = 0x0020
32
+
27
33
28
34
def parse_args ():
29
35
"""
@@ -88,10 +94,10 @@ def img_gen(load_addr, spi_freq, spi_rdcmd, original_bin, signed_bin):
88
94
To obtain the RTS5912 image header and output a new BIN file
89
95
"""
90
96
img_size = os .path .getsize (original_bin )
91
- payload = bytearray (0 )
92
- img_size = os . path . getsize ( original_bin )
97
+ hdr_payload = bytearray (0 )
98
+ tag_payload = bytearray ( 0 )
93
99
94
- fmt = (
100
+ hdr_fmt = (
95
101
"<"
96
102
+
97
103
# type ImageHdr struct {
@@ -108,8 +114,8 @@ def img_gen(load_addr, spi_freq, spi_rdcmd, original_bin, signed_bin):
108
114
+ "H" # reserved uint16
109
115
) # }
110
116
111
- header = struct .pack (
112
- fmt ,
117
+ hdr = struct .pack (
118
+ hdr_fmt ,
113
119
IMAGE_MAGIC ,
114
120
load_addr ,
115
121
IMAGE_HDR_SIZE ,
@@ -123,15 +129,37 @@ def img_gen(load_addr, spi_freq, spi_rdcmd, original_bin, signed_bin):
123
129
0 ,
124
130
)
125
131
126
- payload [: len (header )] = header
132
+ hdr_payload [: len (hdr )] = hdr
133
+
134
+ tag_fmt = (
135
+ "<"
136
+ +
137
+ # type ImageTag struct {
138
+ "H" # Magic uint16
139
+ + "H" # TagSz uint16
140
+ + "H" # TagHash uint16
141
+ + "H" # HashSz uint16
142
+ ) # }
143
+
144
+ tag = struct .pack (tag_fmt , TAG_MAGIC , TAG_LEN , TAG_TYPE_SHA , TAG_SHA_LEN )
145
+
146
+ tag_payload [: len (tag )] = tag
147
+
148
+ sha = hashlib .sha256 ()
149
+ sha .update (hdr_payload )
150
+ with open (original_bin , "rb" ) as original :
151
+ sha .update (original .read ())
152
+ digest = sha .digest ()
127
153
128
154
with open (signed_bin , "wb" ) as signed :
129
- signed .write (payload )
155
+ signed .write (hdr_payload )
130
156
signed .flush ()
131
157
signed .close ()
132
158
133
159
with open (signed_bin , "ab" ) as signed , open (original_bin , "rb" ) as original :
134
160
signed .write (original .read ())
161
+ signed .write (tag_payload )
162
+ signed .write (digest )
135
163
signed .flush ()
136
164
signed .close ()
137
165
original .close ()
0 commit comments