summaryrefslogtreecommitdiff
path: root/cxmanage/simg.py
diff options
context:
space:
mode:
Diffstat (limited to 'cxmanage/simg.py')
-rw-r--r--cxmanage/simg.py24
1 files changed, 18 insertions, 6 deletions
diff --git a/cxmanage/simg.py b/cxmanage/simg.py
index 175e3c5..a6bfd0e 100644
--- a/cxmanage/simg.py
+++ b/cxmanage/simg.py
@@ -71,7 +71,7 @@ class SIMGHeader:
self.crc32)
-def create_simg(contents, version=0, daddr=0, skip_crc32=False):
+def create_simg(contents, version=0, daddr=0, skip_crc32=False, align=False):
"""Create an SIMG version of a file
Assumes version and hdrfmt are 0.
@@ -82,6 +82,9 @@ def create_simg(contents, version=0, daddr=0, skip_crc32=False):
header.imglen = len(contents)
header.daddr = daddr
+ if align:
+ header.imgoff = 4096
+
# Calculate crc value
if skip_crc32:
crc32 = 0
@@ -92,7 +95,7 @@ def create_simg(contents, version=0, daddr=0, skip_crc32=False):
header.flags = 0xFFFFFFFF
header.crc32 = crc32
- return str(header) + contents
+ return str(header).ljust(header.imgoff, chr(0)) + contents
def has_simg(simg):
@@ -112,16 +115,17 @@ def valid_simg(simg):
if not has_simg(simg):
return False
header = SIMGHeader(simg[:28])
- contents = simg[28:]
# Check offset
- if header.imgoff != 28:
+ if header.imgoff < 28:
return False
# Check length
+ start = header.imgoff
+ end = start + header.imglen
+ contents = simg[start:end]
if len(contents) < header.imglen:
return False
- contents = contents[:header.imglen]
# Check crc32
crc32 = header.crc32
@@ -136,7 +140,15 @@ def valid_simg(simg):
def get_simg_header(simg):
""" Return the header of this SIMG """
- if len(simg) < 28 or not has_simg(simg):
+ if not valid_simg(simg):
raise ValueError("Failed to read invalid SIMG")
return SIMGHeader(simg[:28])
+
+
+def get_simg_contents(simg):
+ """ Return the contents of this SIMG """
+ header = get_simg_header(simg)
+ start = header.imgoff
+ end = start + header.imglen
+ return simg[start:end]