Lines Matching refs:self
123 def __init__(self, endian, magic=TLV_INFO_MAGIC): argument
124 self.magic = magic
125 self.buf = bytearray()
126 self.endian = endian
128 def __len__(self): argument
129 return TLV_INFO_SIZE + len(self.buf)
131 def add(self, kind, payload): argument
135 e = STRUCT_ENDIAN_DICT[self.endian]
145 self.buf += buf
146 self.buf += payload
148 def get(self): argument
149 if len(self.buf) == 0:
151 e = STRUCT_ENDIAN_DICT[self.endian]
152 header = struct.pack(e + 'HH', self.magic, len(self))
153 return header + bytes(self.buf)
245 def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE, argument
256 self.image_hash = None
257 self.image_size = None
258 self.signature = None
259 self.version = version or versmod.decode_version("0")
260 self.header_size = header_size
261 self.pad_header = pad_header
262 self.pad = pad
263 self.confirm = confirm
264 self.align = align
265 self.slot_size = slot_size
266 self.max_sectors = max_sectors
267 self.overwrite_only = overwrite_only
268 self.endian = endian
269 self.base_addr = None
270 self.load_addr = 0 if load_addr is None else load_addr
271 self.rom_fixed = rom_fixed
272 self.erased_val = 0xff if erased_val is None else int(erased_val, 0)
273 self.payload = []
274 self.infile_data = []
275 self.enckey = None
276 self.save_enctlv = save_enctlv
277 self.enctlv_len = 0
278 self.max_align = max(DEFAULT_MAX_ALIGN, align) if max_align is None else int(max_align)
279 self.non_bootable = non_bootable
281 if self.max_align == DEFAULT_MAX_ALIGN:
282 self.boot_magic = bytes([
288 lsb = self.max_align & 0x00ff
289 msb = (self.max_align & 0xff00) >> 8
290 align = bytes([msb, lsb]) if self.endian == "big" else bytes([lsb, msb])
291 self.boot_magic = align + bytes([0x2d, 0xe1,
299 self.security_counter = ((self.version.major << 24)
300 + (self.version.minor << 16)
301 + self.version.revision)
303 self.security_counter = security_counter
305 def __repr__(self): argument
310 self.version,
311 self.header_size,
312 self.security_counter,
313 self.base_addr if self.base_addr is not None else "N/A",
314 self.load_addr,
315 self.align,
316 self.slot_size,
317 self.max_sectors,
318 self.overwrite_only,
319 self.endian,
320 self.__class__.__name__,
321 len(self.payload))
323 def load(self, path): argument
329 self.infile_data = ih.tobinarray()
330 self.payload = copy.copy(self.infile_data)
331 self.base_addr = ih.minaddr()
334 self.infile_data = f.read()
335 self.payload = copy.copy(self.infile_data)
338 self.image_size = len(self.payload)
341 if self.pad_header and self.header_size > 0:
342 if self.base_addr:
344 self.base_addr -= self.header_size
345 self.payload = bytes([self.erased_val] * self.header_size) + \
346 self.payload
348 self.check_header()
350 def load_compressed(self, data, compression_header): argument
352 self.payload = compression_header + data
353 self.image_size = len(self.payload)
356 if self.pad_header and self.header_size > 0:
357 if self.base_addr:
359 self.base_addr -= self.header_size
360 self.payload = bytes([self.erased_val] * self.header_size) + \
361 self.payload
363 self.check_header()
365 def save(self, path, hex_addr=None): argument
370 if self.base_addr is None and hex_addr is None:
375 self.base_addr = hex_addr
376 h.frombytes(bytes=self.payload, offset=self.base_addr)
377 if self.pad:
378 trailer_size = self._trailer_size(self.align, self.max_sectors,
379 self.overwrite_only,
380 self.enckey,
381 self.save_enctlv,
382 self.enctlv_len)
383 trailer_addr = (self.base_addr + self.slot_size) - trailer_size
384 if self.confirm and not self.overwrite_only:
385 magic_align_size = align_up(len(self.boot_magic),
386 self.max_align)
387 image_ok_idx = -(magic_align_size + self.max_align)
388 flag = bytearray([self.erased_val] * self.max_align)
392 h.puts(trailer_addr + (trailer_size - len(self.boot_magic)),
393 bytes(self.boot_magic))
396 if self.pad:
397 self.pad_to(self.slot_size)
399 f.write(self.payload)
401 def check_header(self): argument
402 if self.header_size > 0 and not self.pad_header:
403 if any(v != 0 for v in self.payload[0:self.header_size]):
407 def check_trailer(self): argument
408 if self.slot_size > 0:
409 tsize = self._trailer_size(self.align, self.max_sectors,
410 self.overwrite_only, self.enckey,
411 self.save_enctlv, self.enctlv_len)
412 padding = self.slot_size - (len(self.payload) + tsize)
416 len(self.payload), tsize, self.slot_size)
419 def ecies_hkdf(self, enckey, plainkey): argument
447 def create(self, key, public_key_format, enckey, dependencies=None, argument
451 self.enckey = enckey
475 if self.security_counter is not None:
487 image_version = (str(self.version.major) + '.'
488 + str(self.version.minor) + '.'
489 + str(self.version.revision))
527 if self.enckey is not None:
528 pad_len = len(self.payload) % 16
531 if isinstance(self.payload, bytes):
532 self.payload += pad
534 self.payload.extend(pad)
544 self.add_header(enckey, protected_tlv_size, compression_flags, 256)
546 self.add_header(enckey, protected_tlv_size, compression_flags)
548 prot_tlv = TLV(self.endian, TLV_PROT_INFO_MAGIC)
555 e = STRUCT_ENDIAN_DICT[self.endian]
557 if self.security_counter is not None:
558 payload = struct.pack(e + 'I', self.security_counter)
583 protected_tlv_off = len(self.payload)
584 self.payload += prot_tlv.get()
586 tlv = TLV(self.endian)
593 sha.update(self.payload)
597 self.image_hash = digest
605 self.payload = digest
622 sig = key.sign(bytes(self.payload))
627 self.signature = sig
630 self.signature = fixed_sig['value']
637 self.payload = self.payload[:protected_tlv_off]
651 self.enctlv_len = len(cipherkey)
655 cipherkey, mac, pubk = self.ecies_hkdf(enckey, plainkey)
657 self.enctlv_len = len(enctlv)
668 img = bytes(self.payload[self.header_size:])
669 self.payload[self.header_size:] = \
672 self.payload += prot_tlv.get()
673 self.payload += tlv.get()
675 self.check_trailer()
677 def get_struct_endian(self): argument
678 return STRUCT_ENDIAN_DICT[self.endian]
680 def get_signature(self): argument
681 return self.signature
683 def get_infile_data(self): argument
684 return self.infile_data
686 def add_header(self, enckey, protected_tlv_size, compression_flags, aes_length=128): argument
695 if self.load_addr != 0:
699 if self.rom_fixed:
701 if self.non_bootable:
704 e = STRUCT_ENDIAN_DICT[self.endian]
719 self.rom_fixed or self.load_addr,
720 self.header_size,
723 len(self.payload) - self.header_size, # ImageSz
725 self.version.major,
726 self.version.minor or 0,
727 self.version.revision or 0,
728 self.version.build or 0,
730 self.payload = bytearray(self.payload)
731 self.payload[:len(header)] = header
733 def _trailer_size(self, write_size, max_sectors, overwrite_only, enckey, argument
737 magic_align_size = align_up(magic_size, self.max_align)
739 return self.max_align * 2 + magic_align_size
749 keylen = align_up(enctlv_len, self.max_align)
751 keylen = align_up(16, self.max_align)
753 trailer += self.max_align * 4 # image_ok/copy_done/swap_info/swap_size
757 def pad_to(self, size): argument
759 tsize = self._trailer_size(self.align, self.max_sectors,
760 self.overwrite_only, self.enckey,
761 self.save_enctlv, self.enctlv_len)
762 padding = size - (len(self.payload) + tsize)
763 pbytes = bytearray([self.erased_val] * padding)
764 pbytes += bytearray([self.erased_val] * (tsize - len(self.boot_magic)))
765 pbytes += self.boot_magic
766 if self.confirm and not self.overwrite_only:
768 magic_align_size = align_up(magic_size, self.max_align)
769 image_ok_idx = -(magic_align_size + self.max_align)
771 self.payload += pbytes