41
41
from .keys import rsa , ecdsa , x25519
42
42
43
43
IMAGE_MAGIC = 0x96f3b83d
44
+ IMAGE_MAGIC_LE = 0x3db8f396
44
45
IMAGE_HEADER_SIZE = 32
45
46
BIN_EXT = "bin"
46
47
INTEL_HEX_EXT = "hex"
@@ -101,7 +102,7 @@ def align_up(num, align):
101
102
return (num + (align - 1 )) & ~ (align - 1 )
102
103
103
104
104
- class TLV () :
105
+ class TLV :
105
106
def __init__ (self , endian , magic = TLV_INFO_MAGIC ):
106
107
self .magic = magic
107
108
self .buf = bytearray ()
@@ -194,10 +195,11 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
194
195
lsb = self .max_align & 0x00ff
195
196
msb = (self .max_align & 0xff00 ) >> 8
196
197
align = bytes ([msb , lsb ]) if self .endian == "big" else bytes ([lsb , msb ])
197
- self .boot_magic = align + bytes ([0x2d , 0xe1 ,
198
- 0x5d , 0x29 , 0x41 , 0x0b ,
199
- 0x8d , 0x77 , 0x67 , 0x9c ,
200
- 0x11 , 0x0f , 0x1f , 0x8a , ])
198
+ self .boot_magic = align + bytes ([
199
+ 0x2d , 0xe1 ,
200
+ 0x5d , 0x29 , 0x41 , 0x0b ,
201
+ 0x8d , 0x77 , 0x67 , 0x9c ,
202
+ 0x11 , 0x0f , 0x1f , 0x8a , ])
201
203
202
204
if security_counter == 'auto' :
203
205
# Security counter has not been explicitly provided,
@@ -649,19 +651,23 @@ def verify(imgfile, key):
649
651
except FileNotFoundError :
650
652
raise click .UsageError (f"Image file not found: { imgfile } " )
651
653
652
- magic , _ , header_size , _ , img_size = struct .unpack ('IIHHI' , b [:16 ])
653
- version = struct .unpack ('BBHI' , b [20 :28 ])
654
+ # Detect image byteorder by image magic
655
+ magic = int .from_bytes (b [:4 ], "big" )
656
+ e = '<' if magic == IMAGE_MAGIC_LE else '>'
657
+
658
+ magic , _ , header_size , _ , img_size = struct .unpack (e + 'IIHHI' , b [:16 ])
659
+ version = struct .unpack (e + 'BBHI' , b [20 :28 ])
654
660
655
661
if magic != IMAGE_MAGIC :
656
662
return VerifyResult .INVALID_MAGIC , None , None
657
663
658
664
tlv_off = header_size + img_size
659
665
tlv_info = b [tlv_off :tlv_off + TLV_INFO_SIZE ]
660
- magic , tlv_tot = struct .unpack ('HH' , tlv_info )
666
+ magic , tlv_tot = struct .unpack (e + 'HH' , tlv_info )
661
667
if magic == TLV_PROT_INFO_MAGIC :
662
668
tlv_off += tlv_tot
663
669
tlv_info = b [tlv_off :tlv_off + TLV_INFO_SIZE ]
664
- magic , tlv_tot = struct .unpack ('HH' , tlv_info )
670
+ magic , tlv_tot = struct .unpack (e + 'HH' , tlv_info )
665
671
666
672
if magic != TLV_INFO_MAGIC :
667
673
return VerifyResult .INVALID_TLV_INFO_MAGIC , None , None
@@ -673,7 +679,7 @@ def verify(imgfile, key):
673
679
tlv_off += TLV_INFO_SIZE # skip tlv info
674
680
while tlv_off < tlv_end :
675
681
tlv = b [tlv_off :tlv_off + TLV_SIZE ]
676
- tlv_type , _ , tlv_len = struct .unpack ('BBH' , tlv )
682
+ tlv_type , _ , tlv_len = struct .unpack (e + 'BBH' , tlv )
677
683
if tlv_type == TLV_VALUES ["SHA256" ] or tlv_type == TLV_VALUES ["SHA384" ]:
678
684
if not tlv_matches_key_type (tlv_type , key ):
679
685
return VerifyResult .KEY_MISMATCH , None , None
0 commit comments