mirror of
https://github.com/acidanthera/audk.git
synced 2025-05-02 21:50:11 +02:00
https://bugzilla.tianocore.org/show_bug.cgi?id=945 Based on content from the following branch https://github.com/Microsoft/MS_UEFI/tree/share/beta/CapsuleTools * Convert C tools to Python * Add common python modules to: BaseTools/Source/Python/Common/Uefi/Capsule BaseTools/Source/Python/Common/Edk2/Capsule * Add GenerateCapsule.py to BaseTools/Source/Python/Capsule * Add Windows and Posix wrappers for GenerateCapsule.py usage: GenerateCapsule [-h] [-o OUTPUTFILE] (-e | -d | --dump-info) [--capflag {PersistAcrossReset,PopulateSystemTable,InitiateReset}] [--capoemflag CAPSULEOEMFLAG] [--guid GUID] [--hardware-instance HARDWAREINSTANCE] [--monotonic-count MONOTONICCOUNT] [--fw-version FWVERSION] [--lsv LOWESTSUPPORTEDVERSION] [--pfx-file SIGNTOOLPFXFILE] [--signer-private-cert OPENSSLSIGNERPRIVATECERTFILE] [--other-public-cert OPENSSLOTHERPUBLICCERTFILE] [--trusted-public-cert OPENSSLTRUSTEDPUBLICCERTFILE] [--signing-tool-path SIGNINGTOOLPATH] [--version] [-v] [-q] [--debug [0-9]] InputFile Generate a capsule. Copyright (c) 2018, Intel Corporation. All rights reserved. positional arguments: InputFile Input binary payload filename. optional arguments: -h, --help show this help message and exit -o OUTPUTFILE, --output OUTPUTFILE Output filename. -e, --encode Encode file -d, --decode Decode file --dump-info Display FMP Payload Header information --capflag {PersistAcrossReset,PopulateSystemTable,InitiateReset} Capsule flag can be PersistAcrossReset, or PopulateSystemTable or InitiateReset or not set --capoemflag CAPSULEOEMFLAG Capsule OEM Flag is an integer between 0x0000 and 0xffff. --guid GUID The FMP/ESRT GUID in registry format. Required for encode operations. --hardware-instance HARDWAREINSTANCE The 64-bit hardware instance. The default is 0x0000000000000000 --monotonic-count MONOTONICCOUNT 64-bit monotonic count value in header. Default is 0x0000000000000000. --fw-version FWVERSION The 32-bit version of the binary payload (e.g. 0x11223344 or 5678). --lsv LOWESTSUPPORTEDVERSION The 32-bit lowest supported version of the binary payload (e.g. 0x11223344 or 5678). --pfx-file SIGNTOOLPFXFILE signtool PFX certificate filename. --signer-private-cert OPENSSLSIGNERPRIVATECERTFILE OpenSSL signer private certificate filename. --other-public-cert OPENSSLOTHERPUBLICCERTFILE OpenSSL other public certificate filename. --trusted-public-cert OPENSSLTRUSTEDPUBLICCERTFILE OpenSSL trusted public certificate filename. --signing-tool-path SIGNINGTOOLPATH Path to signtool or OpenSSL tool. Optional if path to tools are already in PATH. --version show program's version number and exit -v, --verbose Turn on verbose output with informational messages printed, including capsule headers and warning messages. -q, --quiet Disable all messages except fatal errors. --debug [0-9] Set debug level Cc: Sean Brogan <sean.brogan@microsoft.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Cc: Liming Gao <liming.gao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
92 lines
3.7 KiB
Python
92 lines
3.7 KiB
Python
## @file
|
|
# Module that encodes and decodes a FMP_PAYLOAD_HEADER with a payload.
|
|
# The FMP_PAYLOAD_HEADER is processed by the FmpPayloadHeaderLib in the
|
|
# FmpDevicePkg.
|
|
#
|
|
# Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
|
|
# This program and the accompanying materials
|
|
# are licensed and made available under the terms and conditions of the BSD License
|
|
# which accompanies this distribution. The full text of the license may be found at
|
|
# http://opensource.org/licenses/bsd-license.php
|
|
#
|
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
#
|
|
|
|
'''
|
|
FmpPayloadHeader
|
|
'''
|
|
|
|
import struct
|
|
|
|
def _SIGNATURE_32 (A, B, C, D):
|
|
return struct.unpack ('=I',bytearray (A + B + C + D, 'ascii'))[0]
|
|
|
|
def _SIGNATURE_32_TO_STRING (Signature):
|
|
return struct.pack ("<I", Signature).decode ()
|
|
|
|
class FmpPayloadHeaderClass (object):
|
|
#
|
|
# typedef struct {
|
|
# UINT32 Signature;
|
|
# UINT32 HeaderSize;
|
|
# UINT32 FwVersion;
|
|
# UINT32 LowestSupportedVersion;
|
|
# } FMP_PAYLOAD_HEADER;
|
|
#
|
|
# #define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')
|
|
#
|
|
_StructFormat = '<IIII'
|
|
_StructSize = struct.calcsize (_StructFormat)
|
|
|
|
_FMP_PAYLOAD_HEADER_SIGNATURE = _SIGNATURE_32 ('M', 'S', 'S', '1')
|
|
|
|
def __init__ (self):
|
|
self._Valid = False
|
|
self.Signature = self._FMP_PAYLOAD_HEADER_SIGNATURE
|
|
self.HeaderSize = self._StructSize
|
|
self.FwVersion = 0x00000000
|
|
self.LowestSupportedVersion = 0x00000000
|
|
self.Payload = b''
|
|
|
|
def Encode (self):
|
|
FmpPayloadHeader = struct.pack (
|
|
self._StructFormat,
|
|
self.Signature,
|
|
self.HeaderSize,
|
|
self.FwVersion,
|
|
self.LowestSupportedVersion
|
|
)
|
|
self._Valid = True
|
|
return FmpPayloadHeader + self.Payload
|
|
|
|
def Decode (self, Buffer):
|
|
if len (Buffer) < self._StructSize:
|
|
raise ValueError
|
|
(Signature, HeaderSize, FwVersion, LowestSupportedVersion) = \
|
|
struct.unpack (
|
|
self._StructFormat,
|
|
Buffer[0:self._StructSize]
|
|
)
|
|
if Signature != self._FMP_PAYLOAD_HEADER_SIGNATURE:
|
|
raise ValueError
|
|
if HeaderSize < self._StructSize:
|
|
raise ValueError
|
|
self.Signature = Signature
|
|
self.HeaderSize = HeaderSize
|
|
self.FwVersion = FwVersion
|
|
self.LowestSupportedVersion = LowestSupportedVersion
|
|
self.Payload = Buffer[self.HeaderSize:]
|
|
|
|
self._Valid = True
|
|
return self.Payload
|
|
|
|
def DumpInfo (self):
|
|
if not self._Valid:
|
|
raise ValueError
|
|
print ('FMP_PAYLOAD_HEADER.Signature = {Signature:08X} ({SignatureString})'.format (Signature = self.Signature, SignatureString = _SIGNATURE_32_TO_STRING (self.Signature)))
|
|
print ('FMP_PAYLOAD_HEADER.HeaderSize = {HeaderSize:08X}'.format (HeaderSize = self.HeaderSize))
|
|
print ('FMP_PAYLOAD_HEADER.FwVersion = {FwVersion:08X}'.format (FwVersion = self.FwVersion))
|
|
print ('FMP_PAYLOAD_HEADER.LowestSupportedVersion = {LowestSupportedVersion:08X}'.format (LowestSupportedVersion = self.LowestSupportedVersion))
|
|
print ('sizeof (Payload) = {Size:08X}'.format (Size = len (self.Payload)))
|