rizin/librz/bin/format/mbn/mbn.h

156 lines
4.9 KiB
C

// SPDX-FileCopyrightText: 2015-2019 pancake <pancake@nopcode.org>
// SPDX-FileCopyrightText: 2025 Rot127 <rot127@posteo.com>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_types.h>
#include <rz_util.h>
#include <rz_lib.h>
#include <rz_bin.h>
#define mbn_file_get_hdr(bf) ((SblHeader *)bf->o->bin_obj)
/**
* \brief A 40 bytes MBN header for a chain of attestation.
* For a more general intro to MBN, see the file comment in mbn.c.
*
* For firmware attestation scheme details see:
* https://www.qualcomm.com/content/dam/qcomm-martech/dm-assets/documents/secure-boot-and-image-authentication-version_final.pdf
*/
typedef struct sbl_header {
ut32 /*<RzMBNImageId>*/ image_id; ///< Identifies the type of image this header represents (OEM SBL, AMSS, Apps boot loader, etc.).
ut32 version; ///< Header version
ut32 paddr; ///< Offset from the _end of the header_ where the image starts.
ut32 vaddr; ///< Memory address it is loaded at.
ut32 psize; ///< Size of complete image in bytes.
ut32 code_pa; ///< Size of code region in bytes.
ut32 sign_va; ///< Memory address to the attestation signature.
ut32 sign_sz; ///< Size of the attestation signature in bytes.
ut32 cert_va; ///< Memory address to the chain of attestation of this image.
ut32 cert_sz; ///< Size of the attestation chain in bytes.
} SblHeader;
/**
* \brief Known MBN image IDs.
*
* Reference:
* https://github.com/openpst/libopenpst/blob/master/include/qualcomm/mbn.h
*/
typedef enum {
RZ_MBN_kMbnImageNone = 0x00,
RZ_MBN_kMbnImageOemSbl = 0x01,
RZ_MBN_kMbnImageAmss = 0x02,
RZ_MBN_kMbnImageOcbl = 0x03,
RZ_MBN_kMbnImageHash = 0x04,
RZ_MBN_kMbnImageAppbl = 0x05,
RZ_MBN_kMbnImageApps = 0x06,
RZ_MBN_kMbnImageHostDl = 0x07,
RZ_MBN_kMbnImageDsp1 = 0x08,
RZ_MBN_kMbnImageFsbl = 0x09,
RZ_MBN_kMbnImageDbl = 0x0A,
RZ_MBN_kMbnImageOsbl = 0x0B,
RZ_MBN_kMbnImageDsp2 = 0x0C,
RZ_MBN_kMbnImageEhostdl = 0x0D,
RZ_MBN_kMbnImageNandprg = 0x0E,
RZ_MBN_kMbnImageNorprg = 0x0F,
RZ_MBN_kMbnImageRamfs1 = 0x10,
RZ_MBN_kMbnImageRamfs2 = 0x11,
RZ_MBN_kMbnImageAdspQ5 = 0x12,
RZ_MBN_kMbnImageAppsKernel = 0x13,
RZ_MBN_kMbnImageBackupRamfs = 0x14,
RZ_MBN_kMbnImageSbl1 = 0x15,
RZ_MBN_kMbnImageSbl2 = 0x16,
RZ_MBN_kMbnImageRpm = 0x17,
RZ_MBN_kMbnImageSbl3 = 0x18,
RZ_MBN_kMbnImageTz = 0x19,
RZ_MBN_kMbnImageSsdKeys = 0x1A,
RZ_MBN_kMbnImageGen = 0x1B,
RZ_MBN_kMbnImageDsp3 = 0x1C,
RZ_MBN_kMbnImageAcdb = 0x1D,
RZ_MBN_kMbnImageWdt = 0x1E,
RZ_MBN_kMbnImageMba = 0x1F,
RZ_MBN_kMbnImageLast = RZ_MBN_kMbnImageMba
} RzMBNImageId;
static inline const char *rz_mbn_image_id_str(RzMBNImageId id) {
switch (id) {
case RZ_MBN_kMbnImageNone:
return "kMbnImageNone";
case RZ_MBN_kMbnImageOemSbl:
return "kMbnImageOemSbl";
case RZ_MBN_kMbnImageAmss:
return "kMbnImageAmss";
case RZ_MBN_kMbnImageOcbl:
return "kMbnImageOcbl";
case RZ_MBN_kMbnImageHash:
return "kMbnImageHash";
case RZ_MBN_kMbnImageAppbl:
return "kMbnImageAppbl";
case RZ_MBN_kMbnImageApps:
return "kMbnImageApps";
case RZ_MBN_kMbnImageHostDl:
return "kMbnImageHostDl";
case RZ_MBN_kMbnImageDsp1:
return "kMbnImageDsp1";
case RZ_MBN_kMbnImageFsbl:
return "kMbnImageFsbl";
case RZ_MBN_kMbnImageDbl:
return "kMbnImageDbl";
case RZ_MBN_kMbnImageOsbl:
return "kMbnImageOsbl";
case RZ_MBN_kMbnImageDsp2:
return "kMbnImageDsp2";
case RZ_MBN_kMbnImageEhostdl:
return "kMbnImageEhostdl";
case RZ_MBN_kMbnImageNandprg:
return "kMbnImageNandprg";
case RZ_MBN_kMbnImageNorprg:
return "kMbnImageNorprg";
case RZ_MBN_kMbnImageRamfs1:
return "kMbnImageRamfs1";
case RZ_MBN_kMbnImageRamfs2:
return "kMbnImageRamfs2";
case RZ_MBN_kMbnImageAdspQ5:
return "kMbnImageAdspQ5";
case RZ_MBN_kMbnImageAppsKernel:
return "kMbnImageAppsKernel";
case RZ_MBN_kMbnImageBackupRamfs:
return "kMbnImageBackupRamfs";
case RZ_MBN_kMbnImageSbl1:
return "kMbnImageSbl1";
case RZ_MBN_kMbnImageSbl2:
return "kMbnImageSbl2";
case RZ_MBN_kMbnImageRpm:
return "kMbnImageRpm";
case RZ_MBN_kMbnImageSbl3:
return "kMbnImageSbl3";
case RZ_MBN_kMbnImageTz:
return "kMbnImageTz";
case RZ_MBN_kMbnImageSsdKeys:
return "kMbnImageSsdKeys";
case RZ_MBN_kMbnImageGen:
return "kMbnImageGen";
case RZ_MBN_kMbnImageDsp3:
return "kMbnImageDsp3";
case RZ_MBN_kMbnImageAcdb:
return "kMbnImageAcdb";
case RZ_MBN_kMbnImageWdt:
return "kMbnImageWdt";
case RZ_MBN_kMbnImageMba:
return "kMbnImageMba";
}
return "unknown";
}
bool mbn_read_sbl_header(RzBuffer *b, SblHeader *sb, ut64 *offset);
bool mbn_check_buffer(RzBuffer *b);
bool mbn_load_buffer(RzBinFile *bf, RzBinObject *obj, RzBuffer *b, Sdb *sdb);
ut64 mbn_baddr(RzBinFile *bf);
RzPVector /*<RzBinAddr *>*/ *mbn_entries(RzBinFile *bf);
RzPVector /*<RzBinSection *>*/ *mbn_sections(RzBinFile *bf);
RzBinInfo *mbn_info(RzBinFile *bf);
ut64 mbn_size(RzBinFile *bf);
void mbn_destroy_obj(SblHeader *sb);
void mbn_destroy(RzBinFile *bf);
RzPVector /*<RzBinString *>*/ *mbn_strings(RzBinFile *bf);
RzStructuredData *mbn_structure(SblHeader *sb);
RzStructuredData *mbn_structure_bin(RzBinFile *bf);