mirror of
https://github.com/bkerler/mtkclient.git
synced 2025-02-25 22:14:31 -05:00
Add legacy basic support
This commit is contained in:
parent
534c0d0a97
commit
7ccb0d8c8f
10 changed files with 880 additions and 150 deletions
4
mtk
4
mtk
|
@ -1087,9 +1087,9 @@ class Main(metaclass=LogBase):
|
|||
self.error(f"Error: Couldn't detect partition: {partition}\nAvailable partitions:")
|
||||
for rpartition in res[1]:
|
||||
self.info(rpartition.name)
|
||||
if (countFP == len(partitions) and countFP > 1):
|
||||
if countFP == len(partitions) and countFP > 1:
|
||||
print(f"All partitions formatted.")
|
||||
elif (countFP != len(partitions) and countFP > 1):
|
||||
elif countFP != len(partitions) and countFP > 1:
|
||||
print(f"Failed to format all partitions.")
|
||||
self.close()
|
||||
elif cmd == "es":
|
||||
|
|
|
@ -3,6 +3,433 @@
|
|||
# (c) B.Kerler 2018-2021 GPLv3 License
|
||||
ErrorCodes = {
|
||||
0x0: "OK",
|
||||
# COMMON
|
||||
0x3E8: "STOP", # 1000
|
||||
0x3E9: "UNDEFINED_ERROR",
|
||||
0x3EA: "INVALID_ARGUMENTS",
|
||||
0x3EB: "INVALID_BBCHIP_TYPE",
|
||||
0x3EC: "INVALID_EXT_CLOCK",
|
||||
0x3ED: "INVALID_BMTSIZE",
|
||||
0x3EE: "GET_DLL_VER_FAIL",
|
||||
0x3EF: "INVALID_BUF",
|
||||
0x3F0: "BUF_IS_NULL",
|
||||
0x3F1: "BUF_LEN_IS_ZERO",
|
||||
0x3F2: "BUF_SIZE_TOO_SMALL",
|
||||
0x3F3: "NOT_ENOUGH_STORAGE_SPACE",
|
||||
0x3F4: "NOT_ENOUGH_MEMORY",
|
||||
0x3F5: "COM_PORT_OPEN_FAIL",
|
||||
0x3F6: "COM_PORT_SET_TIMEOUT_FAIL",
|
||||
0x3F7: "COM_PORT_SET_STATE_FAIL",
|
||||
0x3F8: "COM_PORT_PURGE_FAIL",
|
||||
0x3F9: "FILEPATH_NOT_SPECIFIED_YET",
|
||||
0x3FA: "UNKNOWN_TARGET_BBCHIP",
|
||||
0x3FB: "SKIP_BBCHIP_HW_VER_CHECK",
|
||||
0x3FC: "UNSUPPORTED_VER_OF_BOOT_ROM",
|
||||
0x3FD: "UNSUPPORTED_VER_OF_BOOTLOADER",
|
||||
0x3FE: "UNSUPPORTED_VER_OF_DA",
|
||||
0x3FF: "UNSUPPORTED_VER_OF_SEC_INFO",
|
||||
0x400: "UNSUPPORTED_VER_OF_ROM_INFO",
|
||||
0x401: "SEC_INFO_NOT_FOUND",
|
||||
0x402: "ROM_INFO_NOT_FOUND",
|
||||
0x403: "CUST_PARA_NOT_SUPPORTED",
|
||||
0x404: "CUST_PARA_WRITE_LEN_INCONSISTENT",
|
||||
0x405: "SEC_RO_NOT_SUPPORTED",
|
||||
0x406: "SEC_RO_WRITE_LEN_INCONSISTENT",
|
||||
0x407: "ADDR_N_LEN_NOT_32BITS_ALIGNMENT",
|
||||
0x408: "UART_CHKSUM_ERROR",
|
||||
0x409: "EMMC_FLASH_BOOT",
|
||||
0x40A: "NOR_FLASH_BOOT",
|
||||
0x40B: "NAND_FLASH_BOOT",
|
||||
0x40C: "UNSUPPORTED_VER_OF_EMI_INFO",
|
||||
0x40D: "PART_NO_VALID_TABLE",
|
||||
0x40E: "PART_NO_SPACE_FOUND",
|
||||
0x40F: "UNSUPPORTED_VER_OF_SEC_CFG",
|
||||
0x410: "UNSUPPORTED_OPERATION",
|
||||
0x411: "CHKSUM_ERROR",
|
||||
0x412: "TIMEOUT",
|
||||
# BROM
|
||||
0x7D0: "SET_META_REG_FAIL",
|
||||
0x7D1: "SET_FLASHTOOL_REG_FAIL",
|
||||
0x7D2: "SET_REMAP_REG_FAIL",
|
||||
0x7D3: "SET_EMI_FAIL",
|
||||
0x7D4: "DOWNLOAD_DA_FAIL",
|
||||
0x7D5: "CMD_STARTCMD_FAIL",
|
||||
0x7D6: "CMD_STARTCMD_TIMEOUT",
|
||||
0x7D7: "CMD_JUMP_FAIL",
|
||||
0x7D8: "CMD_WRITE16_MEM_FAIL",
|
||||
0x7D9: "CMD_READ16_MEM_FAIL",
|
||||
0x7DA: "CMD_WRITE16_REG_FAIL",
|
||||
0x7DB: "CMD_READ16_REG_FAIL",
|
||||
0x7DC: "CMD_CHKSUM16_MEM_FAIL",
|
||||
0x7DD: "CMD_WRITE32_MEM_FAIL",
|
||||
0x7DE: "CMD_READ32_MEM_FAIL",
|
||||
0x7DF: "CMD_WRITE32_REG_FAIL",
|
||||
0x7E0: "CMD_READ32_REG_FAIL",
|
||||
0x7E1: "CMD_CHKSUM32_MEM_FAIL",
|
||||
0x7E2: "JUMP_TO_META_MODE_FAIL",
|
||||
0x7E3: "WR16_RD16_MEM_RESULT_DIFF",
|
||||
0x7E4: "CHKSUM16_MEM_RESULT_DIFF",
|
||||
0x7E5: "BBCHIP_HW_VER_INCORRECT",
|
||||
0x7E6: "FAIL_TO_GET_BBCHIP_HW_VER",
|
||||
0x7E7: "AUTOBAUD_FAIL",
|
||||
0x7E8: "SPEEDUP_BAUDRATE_FAIL",
|
||||
0x7E9: "LOCK_POWERKEY_FAIL",
|
||||
0x7EA: "WM_APP_MSG_OUT_OF_RANGE",
|
||||
0x7EB: "NOT_SUPPORT_MT6205B",
|
||||
0x7EC: "EXCEED_MAX_DATA_BLOCKS",
|
||||
0x7ED: "EXTERNAL_SRAM_DETECTION_FAIL",
|
||||
0x7EE: "EXTERNAL_DRAM_DETECTION_FAIL",
|
||||
0x7EF: "GET_FW_VER_FAIL",
|
||||
0x7F0: "CONNECT_TO_BOOTLOADER_FAIL",
|
||||
0x7F1: "CMD_SEND_DA_FAIL",
|
||||
0x7F2: "CMD_SEND_DA_CHKSUM_DIFF",
|
||||
0x7F3: "CMD_JUMP_DA_FAIL",
|
||||
0x7F4: "CMD_JUMP_BL_FAIL",
|
||||
0x7F5: "EFUSE_REG_NO_MATCH_WITH_TARGET",
|
||||
0x7F6: "EFUSE_WRITE_TIMEOUT",
|
||||
0x7F7: "EFUSE_DATA_PROCESS_ERROR",
|
||||
0x7F8: "EFUSE_BLOW_ERROR",
|
||||
0x7F9: "EFUSE_ALREADY_BROKEN",
|
||||
0x7FA: "EFUSE_BLOW_PARTIAL",
|
||||
0x7FB: "SEC_VER_FAIL",
|
||||
0x7FC: "PL_SEC_VER_FAIL",
|
||||
0x7FD: "SET_WATCHDOG_FAIL",
|
||||
0x7FE: "EFUSE_VALUE_IS_NOT_ZERO",
|
||||
0x7FF: "EFUSE_WRITE_TIMEOUT_WITHOUT_EFUSE_VERIFY",
|
||||
0x800: "EFUSE_UNKNOW_EXCEPTION_WITHOUT_EFUSE_VERIFY",
|
||||
# DA error
|
||||
0xBB8: "INT_RAM_ERROR",
|
||||
0xBB9: "EXT_RAM_ERROR",
|
||||
0xBBA: "SETUP_DRAM_FAIL",
|
||||
0xBBB: "SETUP_PLL_ERR",
|
||||
0xBBC: "SETUP_EMI_PLL_ERR",
|
||||
0xBBD: "DRAM_ABNORMAL_TYPE_SETTING",
|
||||
0xBBE: "DRAMC_RANK0_CALIBRATION_FAILED",
|
||||
0xBBF: "DRAMC_RANK1_CALIBRATION_FAILED",
|
||||
0xBC0: "DRAM_NOT_SUPPORT",
|
||||
0xBC1: "RAM_FLOARTING",
|
||||
0xBC2: "RAM_UNACCESSABLE",
|
||||
0xBC3: "RAM_ERROR",
|
||||
0xBC4: "DEVICE_NOT_FOUND",
|
||||
0xBC5: "NOR_UNSUPPORTED_DEV_ID",
|
||||
0xBC6: "NAND_UNSUPPORTED_DEV_ID",
|
||||
0xBC7: "NOR_FLASH_NOT_FOUND",
|
||||
0xBC8: "NAND_FLASH_NOT_FOUND",
|
||||
0xBC9: "SOC_CHECK_FAIL",
|
||||
0xBCA: "NOR_PROGRAM_FAILED",
|
||||
0xBCB: "NOR_ERASE_FAILED",
|
||||
0xBCC: "NAND_PAGE_PROGRAM_FAILED",
|
||||
0xBCD: "NAND_SPARE_PROGRAM_FAILED",
|
||||
0xBCE: "NAND_HW_COPYBACK_FAILED",
|
||||
0xBCF: "NAND_ERASE_FAILED",
|
||||
0xBD0: "TIMEOUT",
|
||||
0xBD1: "IN_PROGRESS",
|
||||
0xBD2: "SUPERAND_ONLY_SUPPORT_PAGE_READ",
|
||||
0xBD3: "SUPERAND_PAGE_PRGRAM_NOT_SUPPORT",
|
||||
0xBD4: "SUPERAND_SPARE_PRGRAM_NOT_SUPPORT",
|
||||
0xBD5: "SUPERAND_COPYBACK_NOT_SUPPORT",
|
||||
0xBD6: "NOR_CMD_SEQUENCE_ERR",
|
||||
0xBD7: "NOR_BLOCK_IS_LOCKED",
|
||||
0xBD8: "NAND_BLOCK_IS_LOCKED",
|
||||
0xBD9: "NAND_BLOCK_DATA_UNSTABLE",
|
||||
0xBDA: "NOR_BLOCK_DATA_UNSTABLE",
|
||||
0xBDB: "NOR_VPP_RANGE_ERR",
|
||||
0xBDC: "INVALID_BEGIN_ADDR",
|
||||
0xBDD: "NOR_INVALID_ERASE_BEGIN_ADDR",
|
||||
0xBDE: "NOR_INVALID_READ_BEGIN_ADDR",
|
||||
0xBDF: "NOR_INVALID_PROGRAM_BEGIN_ADDR",
|
||||
0xBE0: "INVALID_RANGE",
|
||||
0xBE1: "NOR_PROGRAM_AT_ODD_ADDR",
|
||||
0xBE2: "NOR_PROGRAM_WITH_ODD_LENGTH",
|
||||
0xBE3: "NOR_BUFPGM_NO_SUPPORT",
|
||||
0xBE4: "NAND_UNKNOWN_ERR",
|
||||
0xBE5: "NAND_BAD_BLOCK",
|
||||
0xBE6: "NAND_ECC_1BIT_CORRECT",
|
||||
0xBE7: "NAND_ECC_2BITS_ERR",
|
||||
0xBE8: "NAND_SPARE_CHKSUM_ERR",
|
||||
0xBE9: "NAND_HW_COPYBACK_DATA_INCONSISTENT",
|
||||
0xBEA: "NAND_INVALID_PAGE_INDEX",
|
||||
0xBEB: "NFI_NOT_SUPPORT",
|
||||
0xBEC: "NFI_CS1_NOT_SUPPORT",
|
||||
0xBED: "NFI_16BITS_IO_NOT_SUPPORT",
|
||||
0xBEE: "NFB_BOOTLOADER_NOT_EXIST",
|
||||
0xBEF: "NAND_NO_GOOD_BLOCK",
|
||||
0xBF0: "NAND_UBIIMG_NOT_SPARSEIMAGE",
|
||||
0xBF1: "BOOTLOADER_IS_TOO_LARGE",
|
||||
0xBF2: "SIBLEY_REWRITE_OBJ_MODE_REGION",
|
||||
0xBF3: "SIBLEY_WRITE_B_HALF_IN_CTRL_MODE_REGION",
|
||||
0xBF4: "SIBLEY_ILLEGAL_CMD",
|
||||
0xBF5: "SIBLEY_PROGRAM_AT_THE_SAME_REGIONS",
|
||||
0xBF6: "UART_GET_DATA_TIMEOUT",
|
||||
0xBF7: "UART_GET_CHKSUM_LSB_TIMEOUT",
|
||||
0xBF8: "UART_GET_CHKSUM_MSB_TIMEOUT",
|
||||
0xBF9: "UART_DATA_CKSUM_ERROR",
|
||||
0xBFA: "UART_RX_BUF_FULL",
|
||||
0xBFB: "UART_RX_BUF_NOT_ENOUGH",
|
||||
0xBFC: "FLASH_RECOVERY_BUF_NOT_ENOUGH",
|
||||
0xBFD: "HANDSET_SEC_INFO_NOT_FOUND",
|
||||
0xBFE: "HANDSET_SEC_INFO_MAC_VERIFY_FAIL",
|
||||
0xBFF: "HANDSET_ROM_INFO_NOT_FOUND",
|
||||
0xC00: "HANDSET_FAT_INFO_NOT_FOUND",
|
||||
0xC01: "OPERATION_UNSUPPORT_FOR_NFB",
|
||||
0xC02: "BYPASS_POST_PROCESS",
|
||||
0xC03: "NOR_OTP_NOT_SUPPORT",
|
||||
0xC04: "NOR_OTP_EXIST",
|
||||
0xC05: "NOR_OTP_LOCKED",
|
||||
0xC06: "NOR_OTP_GETSIZE_FAIL",
|
||||
0xC07: "NOR_OTP_READ_FAIL",
|
||||
0xC08: "NOR_OTP_PROGRAM_FAIL",
|
||||
0xC09: "NOR_OTP_LOCK_FAIL",
|
||||
0xC0A: "NOR_OTP_LOCK_CHECK_STATUS_FAIL",
|
||||
0xC0B: "BLANK_FLASH",
|
||||
0xC0C: "CODE_AREA_IS_BLANK",
|
||||
0xC0D: "SEC_RO_AREA_IS_BLANK",
|
||||
0xC0E: "NOR_OTP_UNLOCKED",
|
||||
0xC0F: "UNSUPPORTED_BBCHIP",
|
||||
0xC10: "FAT_NOT_EXIST",
|
||||
0xC11: "EXT_SRAM_NOT_FOUND",
|
||||
0xC12: "EXT_DRAM_NOT_FOUND",
|
||||
0xC13: "MT_PIN_LOW",
|
||||
0xC14: "MT_PIN_HIGH",
|
||||
0xC15: "MT_PIN_SHORT",
|
||||
0xC16: "MT_BUS_ERROR",
|
||||
0xC17: "MT_ADDR_NOT_2BYTE_ALIGNMENT",
|
||||
0xC18: "MT_ADDR_NOT_4BYTE_ALIGNMENT",
|
||||
0xC19: "MT_SIZE_NOT_2BYTE_ALIGNMENT",
|
||||
0xC1A: "MT_SIZE_NOT_4BYTE_ALIGNMENT",
|
||||
0xC1B: "MT_DEDICATED_PATTERN_ERROR",
|
||||
0xC1C: "MT_INC_PATTERN_ERROR",
|
||||
0xC1D: "MT_DEC_PATTERN_ERROR",
|
||||
0xC1E: "NFB_BLOCK_0_IS_BAD",
|
||||
0xC1F: "CUST_PARA_AREA_IS_BLANK",
|
||||
0xC20: "ENTER_RELAY_MODE_FAIL",
|
||||
0xC21: "ENTER_RELAY_MODE_IS_FORBIDDEN_AFTER_META",
|
||||
0xC22: "NAND_PAGE_READ_FAILED",
|
||||
0xC23: "NAND_IMAGE_BLOCK_NO_EXIST",
|
||||
0xC24: "NAND_IMAGE_LIST_NOT_EXIST",
|
||||
0xC25: "MBA_RESOURCE_NO_EXIST_IN_TARGET",
|
||||
0xC26: "MBA_PROJECT_VERSION_NO_MATCH_WITH_TARGET",
|
||||
0xC27: "MBA_UPDATING_RESOURCE_NO_EXIST_IN_TARGET",
|
||||
0xC28: "MBA_UPDATING_RESOURCE_SIZE_EXCEED_IN_TARGET",
|
||||
0xC29: "NAND_BIN_SIZE_EXCEED_MAX_SIZE",
|
||||
0xC2A: "NAND_EXCEED_CONTAINER_LIMIT",
|
||||
0xC2B: "NAND_REACH_END_OF_FLASH",
|
||||
0xC2C: "NAND_OTP_NOT_SUPPORT",
|
||||
0xC2D: "NAND_OTP_EXIST",
|
||||
0xC2E: "NAND_OTP_LOCKED",
|
||||
0xC2F: "NAND_OTP_LOCK_FAIL",
|
||||
0xC30: "NAND_OTP_UNLOCKED",
|
||||
0xC31: "OTP_NOT_SUPPORT",
|
||||
0xC32: "OTP_EXIST",
|
||||
0xC33: "OTP_LOCKED",
|
||||
0xC34: "OTP_GETSIZE_FAIL",
|
||||
0xC35: "OTP_READ_FAIL",
|
||||
0xC36: "OTP_PROGRAM_FAIL",
|
||||
0xC37: "OTP_LOCK_FAIL",
|
||||
0xC38: "OTP_LOCK_CHECK_STATUS_FAIL",
|
||||
0xC39: "OTP_UNLOCKED",
|
||||
0xC3A: "SEC_RO_ILLEGAL_MAGIC_TAIL",
|
||||
0xC3B: "HANDSET_FOTA_INFO_NOT_FOUND",
|
||||
0xC3C: "HANDSET_UA_INFO_NOT_FOUND",
|
||||
0xC3D: "SB_FSM_INVALID_INFO",
|
||||
0xC3E: "NFB_TARGET_DUAL_BL_PAIRED_VERSION_NOT_MATCHED_WITH_MAUI",
|
||||
0xC3F: "NFB_TARGET_DUAL_BL_FEATURE_COMBINATION_NOT_MATCHED_WITH_MAUI",
|
||||
0xC40: "NFB_TARGET_IS_SINGLE_BL_BUT_PC_NOT",
|
||||
0xC41: "NFB_TARGET_IS_DUAL_BL_BUT_PC_NOT",
|
||||
0xC42: "NOR_TARGET_BL_PAIRED_VERSION_NOT_MATCHED_WITH_MAUI",
|
||||
0xC43: "NOR_TARGET_BL_FEATURE_COMBINATION_NOT_MATCHED_WITH_MAUI",
|
||||
0xC44: "NOR_TARGET_IS_NOT_NEW_BL_BUT_PC_IS",
|
||||
0xC45: "NOR_TARGET_IS_NEW_BL_BUT_PC_NOT",
|
||||
0xC46: "DOWNLOAD_BOOTLOADER_FLASH_DEV_IS_NONE",
|
||||
0xC47: "DOWNLOAD_BOOTLOADER_FLASH_DEV_IS_NOT_SUPPORTED",
|
||||
0xC48: "DOWNLOAD_BOOTLOADER_BEGIN_ADDR_OVERLAPS_WITH_PREVIOUS_BOUNDARY",
|
||||
0xC49: "UPDATE_BOOTLOADER_EXIST_MAGIC_NOT_MATCHED",
|
||||
0xC4A: "UPDATE_BOOTLOADER_FILE_TYPE_NOT_MATCHED",
|
||||
0xC4B: "UPDATE_BOOTLOADER_FILE_SIZE_EXCEEDS_BOUNDARY_ADDR",
|
||||
0xC4C: "UPDATE_BOOTLOADER_BEGIN_ADDR_NOT_MATCHED",
|
||||
0xC4D: "EMMC_FLASH_NOT_FOUND",
|
||||
0xC4E: "EMMC_FW_VER_CHECK_FAIL",
|
||||
0xC4F: "SDMMC_FLASH_NOT_FOUND",
|
||||
0xC50: "SDMMC_CONFIG_FAILED",
|
||||
0xC51: "SDMMC_READ_FAILED",
|
||||
0xC52: "SDMMC_WRITE_FAILED",
|
||||
0xC53: "SDMMC_ERR_CRC",
|
||||
0xC54: "SDMMC_ERR_TIMEOUT",
|
||||
0xC55: "SDMMC_UNSUPPORTED",
|
||||
0xC56: "DSPBL_CHECK_PLATFORM_FAILED",
|
||||
0xC57: "UFS_FLASH_NOT_FOUND",
|
||||
0xC58: "UFS_CONFIG_FAILED",
|
||||
0xC59: "UFS_READ_FAILED",
|
||||
0xC5A: "UFS_WRITE_FAILED",
|
||||
0xC5B: "UFS_ERR_TIMEOUT",
|
||||
0xC5C: "UFS_UNSUPPORTED",
|
||||
0xC5D: "UFS_OTP_NOT_SUPPORT",
|
||||
0xC5E: "UFS_OTP_EXIST",
|
||||
0xC5F: "UFS_OTP_LOCKED",
|
||||
0xC60: "UFS_OTP_LOCK_FAIL",
|
||||
0xC61: "UFS_OTP_UNLOCKED",
|
||||
0xC62: "HANDSET_SEC_CFG_NOT_FOUND",
|
||||
0xC63: "EMMC_OTP_NOT_SUPPORT",
|
||||
0xC64: "EMMC_OTP_EXIST",
|
||||
0xC65: "EMMC_OTP_LOCKED",
|
||||
0xC66: "EMMC_OTP_LOCK_FAIL",
|
||||
0xC67: "EMMC_OTP_UNLOCKED",
|
||||
0xC68: "READ_IMEI_PID_SWV_NOT_SUPPORT",
|
||||
0xC69: "NFI_EMPTY_PAGE",
|
||||
0xC6A: "INVALID_STORAGE_TYPE",
|
||||
0xC6B: "SEND_CMD_FAIL",
|
||||
0xC6C: "READ_CMD_ACK_FAIL",
|
||||
0xC6D: "READ_FLASH_STATUS_INFO_FAIL",
|
||||
0xC6E: "PL_VALIDATION_FAIL",
|
||||
0xC6F: "STORAGE_NOT_MATCH",
|
||||
0xC70: "CHIP_TYPE_NOT_MATCH",
|
||||
0xC71: "EXCEED_MAX_PARTITION_COUNT",
|
||||
# SECURITY
|
||||
0x1770: "CALLBACK_SLA_CHALLENGE_FAIL",
|
||||
0x1771: "SLA_WRONG_AUTH_FILE",
|
||||
0x1772: "SLA_INVALID_AUTH_FILE",
|
||||
0x1773: "SLA_CHALLENGE_FAIL",
|
||||
0x1774: "SLA_FAIL",
|
||||
0x1775: "DAA_FAIL",
|
||||
0x1776: "SBC_FAIL",
|
||||
0x1777: "SF_SECURE_VER_CHECK_FAIL",
|
||||
0x1778: "SF_HANDSET_SECURE_CUSTOM_NAME_NOT_MATCH",
|
||||
0x1779: "SF_FTCFG_LOCKDOWN",
|
||||
0x177A: "SF_CODE_DOWNLOAD_FORBIDDEN",
|
||||
0x177B: "SF_CODE_READBACK_FORBIDDEN",
|
||||
0x177C: "SF_CODE_FORMAT_FORBIDDEN",
|
||||
0x177D: "SF_SEC_RO_DOWNLOAD_FORBIDDEN",
|
||||
0x177E: "SF_SEC_RO_READBACK_FORBIDDEN",
|
||||
0x177F: "SF_SEC_RO_FORMAT_FORBIDDEN",
|
||||
0x1780: "SF_FAT_DOWNLOAD_FORBIDDEN",
|
||||
0x1781: "SF_FAT_READBACK_FORBIDDEN",
|
||||
0x1782: "SF_FAT_FORMAT_FORBIDDEN",
|
||||
0x1783: "SF_RESTRICTED_AREA_ACCESS_FORBIDDEN",
|
||||
0x1784: "SECURE_CUSTOM_NAME_NOT_MATCH_BETWEEN_AUTH_AND_DL_HANDLE",
|
||||
0x1785: "DOWNLOAD_FILE_IS_CORRUPTED",
|
||||
0x1786: "NOT_SUPPORT",
|
||||
0x1787: "BOOTLOADER_IMAGE_SIGNATURE_FAIL",
|
||||
0x1788: "BOOTLOADER_ELDER_SW_VERSION_CANNOT_BE_DOWNLOADED",
|
||||
0x1789: "BOOTLOADER_IMAGE_NO_SIGNATURE",
|
||||
0x178A: "BOOTLOADER_CORRUPTED_SCATTER_FILE",
|
||||
0x178B: "SECURE_USB_DL_NO_MAUI_IN_SCATTER_FILE",
|
||||
0x178C: "SEND_CERT_FAIL",
|
||||
0x178D: "SEND_AUTH_FAIL",
|
||||
0x178E: "GET_SEC_CONFIG_FAIL",
|
||||
0x178F: "GET_ME_ID_FAIL",
|
||||
0x1790: "GET_HW_SW_VER_FAIL",
|
||||
0x1791: "GET_HW_CODE_FAIL",
|
||||
0x1792: "ROM_INFO_NOT_FOUND",
|
||||
0x1793: "ROM_INFO_ID_MISMATCH",
|
||||
0x1794: "SEC_CTRL_ID_MISMATCH",
|
||||
0x1795: "SEC_KEY_ID_MISMATCH",
|
||||
0x1796: "SECURE_USB_DL_FAIL",
|
||||
0x1797: "SECURE_USB_DL_CHECK_TARGET_STATUS_FAIL",
|
||||
0x1798: "SECURE_USB_DL_SEND_CHIP_STATUS_FAIL",
|
||||
0x1799: "SECURE_USB_DL_DISABLED",
|
||||
0x179A: "SECURE_USB_DL_ENABLED",
|
||||
0x179B: "SECURE_USB_DL_IMAGE_PUBLIC_N_KEY_READ_FAIL",
|
||||
0x179C: "SECURE_USB_DL_IMAGE_PUBLIC_E_KEY_READ_FAIL",
|
||||
0x179D: "SECURE_USB_DL_IMAGE_SIGN_HEADER_NOT_FOUND",
|
||||
0x179E: "SECURE_USB_DL_IMGAE_SIGNATURE_VERIFY_FAIL",
|
||||
0x179F: "SECURE_USB_DL_IMAGE_HASH_FAIL",
|
||||
0x17A0: "SECURE_USB_DL_IMAGE_NOT_FOUND",
|
||||
0x17A1: "SECURE_USB_DL_INVALID_IMAGE_ARGUMENT",
|
||||
0x17A2: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_INIT_FAIL",
|
||||
0x17A3: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRITE_IMAGE_NAME_FAIL",
|
||||
0x17A4: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRITE_IMAGE_NAME_LEN_FAIL",
|
||||
0x17A5: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRITE_TYPE_FAIL",
|
||||
0x17A6: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRITE_HEADER_FAIL",
|
||||
0x17A7: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRITE_IMAGE_OFFSET_FAIL",
|
||||
0x17A8: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRITE_SIGNATURE_HASH_FAIL",
|
||||
0x17A9: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_GET_CHECK_RESULT_FAIL",
|
||||
0x17AA: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_DOWNLOAD_IMAGE_INVALID",
|
||||
0x17AB: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_UNKNOWN_CHECK_RESULT",
|
||||
0x17AC: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_WRONG_OPERATION",
|
||||
0x17AD: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_INVALID_HEADER_LENGTH",
|
||||
0x17AE: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_INVALID_IMAGE_OFFSET",
|
||||
0x17AF: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_INVALID_SIGNATURE_LENGTH",
|
||||
0x17F0: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_SIGNATURE_LENGTH_TOO_LARGE",
|
||||
0x17F1: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_IMAGE_NAME_LENGTH_TOO_LONG",
|
||||
0x17F2: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_EXT_HEADER_TOO_LARGE",
|
||||
0x17F3: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_EXT_HEADER_OFFSET_INVALID",
|
||||
0x17F4: "SECURE_USB_DL_IMAGE_INFO_CHECK_CMD_EXT_HEADER_SELF_COPY_FAIL",
|
||||
0x17F5: "SEC_CFG_NOT_EXIST",
|
||||
0x17F6: "SEC_CFG_WRITE_CMD_INIT_FAIL",
|
||||
0x17F7: "SEC_CFG_WRONG_MAGIC_NUMBER",
|
||||
0x17F8: "SEC_CFG_IS_FULL_CANNOT_ADD_NEW_IMAGE",
|
||||
0x17F9: "SEC_CFG_IMAGE_NOT_FOUND_SO_CANNOT_UPDATE",
|
||||
0x17FA: "SEC_CFG_IMAGE_CUST_NAME_MISMATCH",
|
||||
0x17FB: "SEC_CFG_IMAGE_CANNOT_ROLL_BACK_SW_LOAD",
|
||||
0x17FC: "SEC_CFG_IMAGE_EXIST_CANNOT_CREATE_MEW_FILE",
|
||||
0x17FD: "SEC_CFG_WRITE_FAIL_CFG_NOT_EXIST",
|
||||
0x17FE: "SEC_CFG_WRITE_FAIL_MAGIC_INCORRECT",
|
||||
0x17FF: "SEC_CFG_WRITE_FAIL_CANNOT_WRITE_TO_FIRST_BLOCK",
|
||||
0x1800: "SEC_CFG_WRITE_FAIL_YAFFS2_POST_PROCESS_FAIL",
|
||||
0x1801: "SEC_CFG_WRITE_FAIL_NAND_DEVICE",
|
||||
0x1802: "SEC_CFG_WRITE_FAIL_CANNOT_READ_BACK",
|
||||
0x1803: "SEC_CFG_WRITE_FAIL_READ_BACK_MAGIC_INCORRECT",
|
||||
0x1804: "SEC_CFG_WRITE_FAIL_READ_BACK_ID_INCORRECT",
|
||||
0x1805: "SEC_CFG_WRITE_FAIL_READ_BACK_STATUS_INCORRECT",
|
||||
0x1806: "SEC_CFG_WRITE_FAIL_READ_BACK_END_PATTERN_INCORRECT",
|
||||
0x1807: "SEC_CFG_WRITE_FAIL_SEC_CFG_CANNOT_OVERWRITE_NEXT_PARTITION",
|
||||
0x1808: "SEC_CFG_WRITE_FAIL_NAND_NOT_DETECTED",
|
||||
0x1809: "SEC_CFG_WRITE_FAIL_EMMC_NOT_DETECTED",
|
||||
0x180a: "SEC_CFG_WRITE_FAIL_EMMC_DEVICE",
|
||||
0x180b: "SEC_CFG_WRITE_FAIL_NAND_PAGE_SIZE_NOT_SUPPORT",
|
||||
0x180c: "SEC_CFG_WRITE_FAIL_NAND_FIND_GOOD_BLK_FAIL",
|
||||
0x180d: "SEC_CFG_WRITE_FAIL_NAND_ERASE_FAIL",
|
||||
0x180e: "SEC_CFG_WRITE_FAIL_UNKNOWN_DEVIE_TYPE",
|
||||
0x180f: "SEC_CFG_READ_FAIL_NAND_NOT_DETECTED",
|
||||
0x1810: "SEC_CFG_READ_FAIL_EMMC_NOT_DETECTED",
|
||||
0x1811: "SEC_CFG_READ_FAIL_EMMC_DEVICE",
|
||||
0x1812: "SEC_CFG_READ_FAIL_NAND_PAGE_SIZE_NOT_SUPPORT",
|
||||
0x1813: "SEC_CFG_READ_FAIL_NAND_FIND_GOOD_BLK_FAIL",
|
||||
0x1814: "SEC_CFG_READ_FAIL_UNKNOWN_DEVIE_TYPE",
|
||||
0x1815: "SEC_CFG_READ_FAIL_NAND_LOGICAL_READ_FAIL",
|
||||
0x1816: "SEC_CFG_EXT_REGION_SPACE_OVERFLOW",
|
||||
0x1817: "SECURE_USB_DL_ROM_INFO_UPDATE_REQUEST_FAIL",
|
||||
0x1818: "SECURE_USB_DL_DA_RETURN_INVALID_TYPE",
|
||||
0x1819: "SECURE_USB_DL_MOVE_IMAGE_HEADER_TO_END_FAIL",
|
||||
0x181a: "SECURE_USB_DL_NO_NEED_TO_MOVE_IMAGE_HEADER",
|
||||
0x181b: "SECURE_USB_DL_NO_NEED_TO_REMOVE_IMAGE_HEADER_AND_SIG",
|
||||
0x181c: "CIPHER_DATA_UNALIGNED",
|
||||
0x181d: "CIPHER_MODE_INVALID",
|
||||
0x181e: "CIPHER_KEY_INVALID",
|
||||
0x181f: "CIPHER_INIT_FAIL",
|
||||
0x1820: "CIPHER_ROM_NOT_LOADED",
|
||||
0x1821: "CIPHER_DEC_FAIL",
|
||||
0x1822: "CIPHER_ENC_TEST_FAIL",
|
||||
0x1823: "AES_VER_INVALID",
|
||||
0x1824: "INVALID_IMGDEC_CFG",
|
||||
0x1825: "IMGDEC_INVALID_FORCE_DEC_PARAM",
|
||||
0x1826: "IMGDEC_INVALID_AES_KEY_SIZE",
|
||||
0x1827: "IMGDEC_FAIL_IMAGE_NOT_ENCRYPTED",
|
||||
0x1828: "IMGDEC_INIT_FAIL_FTH_IS_NULL",
|
||||
0x1829: "IMGDEC_INIT_FAIL_DECH_IS_NULL",
|
||||
0x182a: "INIDEC_FAIL_INI_NOT_ENCRYPTED",
|
||||
0x182b: "INIDEC_INVALID_AES_KEY_SIZE",
|
||||
0x182c: "INVALID_PROJECT",
|
||||
0x182d: "SECRO_ANTICLONE_LENGTH_INVALID",
|
||||
0x182e: "SECRO_HASH_INCORRECT",
|
||||
0x182f: "SECRO_ENCRYPT_FAIL",
|
||||
0x1830: "AC_REGION_NOT_FOUND_IN_SECROIMG",
|
||||
|
||||
# common
|
||||
|
||||
0x1b58: "EPP_FAIL",
|
||||
0x1b59: "EPP_EXT_DRAM_NOT_FOUND",
|
||||
0x1b5a: "EPP_EXT_DRAM_INIT_FAIL",
|
||||
0x1b5b: "EPP_NO_EMI_CONFIG_PARAM_FAIL",
|
||||
0x2711: "PL_MODE_UNSUPPORTED",
|
||||
0x2712: "PL_MODE_FORBIDDEN",
|
||||
0x2713: "PL_MODE_INVALID_ARGUMETS",
|
||||
0x2714: "PL_READ_FAIL",
|
||||
0x2715: "PL_WRITE_FAIL",
|
||||
0x2716: "PL_READ_TIMEOUT",
|
||||
0x2717: "PL_WRITE_TIMEOUT",
|
||||
0x2718: "PL_DISC_CMD_NEEDED",
|
||||
|
||||
0x1000: "CRYPTO_INIT_FAIL",
|
||||
0x1001: "CRYPTO_DEINIT_FAIL",
|
||||
0x1002: "CRYPTO_MODE_INVALID",
|
||||
|
@ -101,22 +528,22 @@ ErrorCodes = {
|
|||
0xA005: "OTP_WRITE_FAIL"
|
||||
}
|
||||
|
||||
COMMON=1
|
||||
AUTHENTICATION=2
|
||||
LIBRARY=3
|
||||
DEV_HW=4
|
||||
FUNCTION=5
|
||||
BROM=6
|
||||
DA=7
|
||||
PRELOADER=8
|
||||
COMMON = 1
|
||||
AUTHENTICATION = 2
|
||||
LIBRARY = 3
|
||||
DEV_HW = 4
|
||||
FUNCTION = 5
|
||||
BROM = 6
|
||||
DA = 7
|
||||
PRELOADER = 8
|
||||
|
||||
SUCCESS=(0 << 30)
|
||||
INFO=(1 << 30)
|
||||
WARNING=(2 << 30)
|
||||
ERROR=(3 << 30)
|
||||
SUCCESS = (0 << 30)
|
||||
INFO = (1 << 30)
|
||||
WARNING = (2 << 30)
|
||||
ERROR = (3 << 30)
|
||||
|
||||
ErrorCodes_XFlash={
|
||||
0:"OK",
|
||||
ErrorCodes_XFlash = {
|
||||
0: "OK",
|
||||
0xc0010001: "Error",
|
||||
0xc0010002: "Abort",
|
||||
0xc0010003: "Unsupported command",
|
||||
|
@ -278,6 +705,7 @@ ErrorCodes_XFlash={
|
|||
0xc0070005: "DA exceed max num"
|
||||
}
|
||||
|
||||
|
||||
class ErrorHandler:
|
||||
def __init__(self):
|
||||
self.ec = ErrorCodes
|
||||
|
@ -285,7 +713,7 @@ class ErrorHandler:
|
|||
|
||||
def status(self, status):
|
||||
if status in self.ec:
|
||||
return self.ec[status]+" ("+hex(status)+")"
|
||||
return self.ec[status] + " (" + hex(status) + ")"
|
||||
if status in self.xec:
|
||||
return self.xec[status]+" ("+hex(status)+")"
|
||||
return self.xec[status] + " (" + hex(status) + ")"
|
||||
return "Unknown: " + hex(status)
|
||||
|
|
230
mtkclient/Library/legacy_ext.py
Normal file
230
mtkclient/Library/legacy_ext.py
Normal file
|
@ -0,0 +1,230 @@
|
|||
import os
|
||||
from struct import unpack, pack
|
||||
from mtkclient.config.payloads import pathconfig
|
||||
from mtkclient.Library.error import ErrorHandler
|
||||
from mtkclient.Library.hwcrypto import crypto_setup, hwcrypto
|
||||
from mtkclient.Library.utils import LogBase, progress, logsetup, find_binary
|
||||
from mtkclient.Library.settings import writesetting, loadsetting
|
||||
from mtkclient.Library.seccfg import seccfg
|
||||
from binascii import hexlify
|
||||
import hashlib
|
||||
|
||||
class LCmd:
|
||||
CUSTOM_READ = b"\x29"
|
||||
CUSTOM_WRITE = b"\x2A"
|
||||
ACK = b"\x5A"
|
||||
NACK = b"\xA5"
|
||||
|
||||
class legacyext(metaclass=LogBase):
|
||||
def __init__(self, mtk, legacy, loglevel):
|
||||
self.pathconfig = pathconfig()
|
||||
self.__logger = logsetup(self, self.__logger, loglevel)
|
||||
self.info = self.__logger.info
|
||||
self.debug = self.__logger.debug
|
||||
self.error = self.__logger.error
|
||||
self.warning = self.__logger.warning
|
||||
self.mtk = mtk
|
||||
self.loglevel = loglevel
|
||||
self.__logger = self.__logger
|
||||
self.eh = ErrorHandler()
|
||||
self.config = self.mtk.config
|
||||
self.usbwrite = self.mtk.port.usbwrite
|
||||
self.usbread = self.mtk.port.usbread
|
||||
self.echo = self.mtk.port.echo
|
||||
self.rbyte = self.mtk.port.rbyte
|
||||
self.rdword = self.mtk.port.rdword
|
||||
self.rword = self.mtk.port.rword
|
||||
self.legacy = legacy
|
||||
self.Cmd=LCmd()
|
||||
self.da2 = None
|
||||
self.da2address = None
|
||||
|
||||
def patch_da2(self, da2):
|
||||
da2patched = bytearray(da2)
|
||||
# Patch security
|
||||
check_addr = find_binary(da2, b"\x08\xB5\x4F\xF4\x50\x42\xA0\xF1\x81\x53")
|
||||
if check_addr is not None:
|
||||
da2patched[check_addr:check_addr + 6] = b"\x08\xB5\x00\x20\x08\xBD"
|
||||
else:
|
||||
self.warning("Legacy address check not patched.")
|
||||
return da2patched
|
||||
|
||||
def fix_hash(self, da1, da2, da2sig_len, hashpos, hashmode):
|
||||
da1 = bytearray(da1)
|
||||
dahash = None
|
||||
if hashmode == 1:
|
||||
dahash = hashlib.sha1(da2[:-da2sig_len]).digest()
|
||||
elif hashmode == 2:
|
||||
dahash = hashlib.sha256(da2[:-da2sig_len]).digest()
|
||||
da1[hashpos:hashpos + len(dahash)] = dahash
|
||||
return da1
|
||||
|
||||
def readmem(self, addr, dwords=1):
|
||||
res = []
|
||||
for pos in range(dwords):
|
||||
data = self.legacy.read_reg32(addr + pos * 4)
|
||||
if data is None:
|
||||
return False
|
||||
if dwords == 1:
|
||||
return data
|
||||
res.append(data)
|
||||
return res
|
||||
|
||||
def custom_read(self, addr, length):
|
||||
dwords=length//4
|
||||
if length%4!=0:
|
||||
dwords+=1
|
||||
data = b"".join([pack(">I",val) for val in self.readmem(addr, dwords)])
|
||||
return data[:length]
|
||||
|
||||
def writeregister(self, addr, dwords):
|
||||
if isinstance(dwords, int):
|
||||
dwords = [dwords]
|
||||
pos = 0
|
||||
for val in dwords:
|
||||
if not self.legacy.write_reg32(addr + pos, val):
|
||||
return False
|
||||
pos += 4
|
||||
return True
|
||||
|
||||
def writemem(self, addr, data):
|
||||
for i in range(0, len(data), 4):
|
||||
value = data[i:i + 4]
|
||||
while len(value) < 4:
|
||||
value += b"\x00"
|
||||
self.writeregister(addr + i, unpack("<I", value))
|
||||
return True
|
||||
|
||||
def custom_write(self, addr, data):
|
||||
return self.writemem(addr, data)
|
||||
|
||||
def setotp(self, hwc):
|
||||
otp = None
|
||||
if self.mtk.config.preloader is not None:
|
||||
idx = self.mtk.config.preloader.find(b"\x4D\x4D\x4D\x01\x30")
|
||||
if idx != -1:
|
||||
otp = self.mtk.config.preloader[idx + 0xC:idx + 0xC + 32]
|
||||
if otp is None:
|
||||
otp = 32 * b"\x00"
|
||||
hwc.sej.sej_set_otp(otp)
|
||||
|
||||
def cryptosetup(self):
|
||||
setup = crypto_setup()
|
||||
setup.blacklist = self.config.chipconfig.blacklist
|
||||
setup.gcpu_base = self.config.chipconfig.gcpu_base
|
||||
setup.dxcc_base = self.config.chipconfig.dxcc_base
|
||||
setup.da_payload_addr = self.config.chipconfig.da_payload_addr
|
||||
setup.sej_base = self.config.chipconfig.sej_base
|
||||
setup.read32 = self.readmem
|
||||
setup.write32 = self.writeregister
|
||||
setup.writemem = self.writemem
|
||||
return hwcrypto(setup, self.loglevel)
|
||||
|
||||
def seccfg(self, lockflag):
|
||||
if lockflag not in ["unlock", "lock"]:
|
||||
print("Valid flags are: unlock, lock")
|
||||
return False
|
||||
hwc = self.cryptosetup()
|
||||
sc_org = seccfg(hwc)
|
||||
data, guid_gpt = self.legacy.partition.get_gpt(0, 0, 0, "user")
|
||||
seccfg_data = None
|
||||
partition = None
|
||||
for rpartition in guid_gpt.partentries:
|
||||
if rpartition.name == "seccfg":
|
||||
partition = rpartition
|
||||
seccfg_data = self.legacy.readflash(
|
||||
addr=partition.sector * self.mtk.daloader.daconfig.pagesize,
|
||||
length=partition.sectors * self.mtk.daloader.daconfig.pagesize,
|
||||
filename="", parttype="user", display=False)
|
||||
break
|
||||
if seccfg_data is None:
|
||||
self.error("Couldn't detect existing seccfg partition. Aborting unlock.")
|
||||
return False
|
||||
if seccfg_data[:4] != pack("<I", 0x4D4D4D4D):
|
||||
self.error("Unknown seccfg partition header. Aborting unlock.")
|
||||
return False
|
||||
|
||||
if not sc_org.parse(seccfg_data):
|
||||
return False
|
||||
sc_new = seccfg(hwc)
|
||||
self.setotp(hwc)
|
||||
hwtype = "hw"
|
||||
V3 = True
|
||||
sc_new.create(sc_org=sc_org, hwtype=hwtype, V3=V3)
|
||||
if sc_org.hash != sc_new.hash:
|
||||
V3=False
|
||||
sc_new.create(sc_org=sc_org, hwtype=hwtype, V3=V3)
|
||||
if sc_org.hash != sc_new.hash:
|
||||
hwtype = "sw"
|
||||
sc_new.create(sc_org=sc_org, hwtype=hwtype)
|
||||
if sc_org.hash != sc_new.hash:
|
||||
self.error("Device has is either already unlocked or algo is unknown. Aborting.")
|
||||
return False
|
||||
writedata = sc_new.create(sc_org=None, hwtype=hwtype, lockflag=lockflag, V3=V3)
|
||||
if self.legacy.writeflash(addr=partition.sector * self.mtk.daloader.daconfig.pagesize,
|
||||
length=len(writedata),
|
||||
filename=None, wdata=writedata, parttype="user", display=True):
|
||||
self.info("Successfully wrote seccfg.")
|
||||
return True
|
||||
self.error("Error on writing seccfg config to flash.")
|
||||
return False
|
||||
|
||||
def generate_keys(self):
|
||||
hwc = self.cryptosetup()
|
||||
meid = b""
|
||||
meidv = loadsetting("meid")
|
||||
socidv = loadsetting("socid")
|
||||
if meidv is not None:
|
||||
meid = bytes.fromhex(meidv)
|
||||
self.info("MEID : " + meidv)
|
||||
if socidv is not None:
|
||||
socid = bytes.fromhex(socidv)
|
||||
self.info("SOCID : " + socidv)
|
||||
if self.config.chipconfig.dxcc_base is not None:
|
||||
self.info("Generating dxcc rpmbkey...")
|
||||
rpmbkey = hwc.aes_hwcrypt(btype="dxcc", mode="rpmb")
|
||||
self.info("Generating dxcc fdekey...")
|
||||
fdekey = hwc.aes_hwcrypt(btype="dxcc", mode="fde")
|
||||
self.info("Generating dxcc rpmbkey2...")
|
||||
rpmb2key = hwc.aes_hwcrypt(btype="dxcc", mode="rpmb2")
|
||||
self.info("Generating dxcc km key...")
|
||||
ikey = hwc.aes_hwcrypt(btype="dxcc", mode="itrustee")
|
||||
#self.info("Generating dxcc platkey + provkey key...")
|
||||
#platkey, provkey = hwc.aes_hwcrypt(btype="dxcc", mode="prov")
|
||||
#self.info("Provkey : " + hexlify(provkey).decode('utf-8'))
|
||||
#self.info("Platkey : " + hexlify(platkey).decode('utf-8'))
|
||||
if rpmbkey is not None:
|
||||
self.info("RPMB : " + hexlify(rpmbkey).decode('utf-8'))
|
||||
writesetting("rpmbkey",hexlify(rpmbkey).decode('utf-8'))
|
||||
if rpmb2key is not None:
|
||||
self.info("RPMB2 : " + hexlify(rpmb2key).decode('utf-8'))
|
||||
writesetting("rpmb2key",hexlify(rpmb2key).decode('utf-8'))
|
||||
if fdekey is not None:
|
||||
self.info("FDE : " + hexlify(fdekey).decode('utf-8'))
|
||||
writesetting("fdekey",hexlify(fdekey).decode('utf-8'))
|
||||
if ikey is not None:
|
||||
self.info("iTrustee : " + hexlify(ikey).decode('utf-8'))
|
||||
writesetting("kmkey", hexlify(ikey).decode('utf-8'))
|
||||
if self.config.chipconfig.prov_addr:
|
||||
provkey = self.custom_read(self.config.chipconfig.prov_addr, 16)
|
||||
self.info("PROV : " + hexlify(provkey).decode('utf-8'))
|
||||
writesetting("provkey", hexlify(provkey).decode('utf-8'))
|
||||
"""
|
||||
hrid = self.xflash.get_hrid()
|
||||
if hrid is not None:
|
||||
self.info("HRID : " + hexlify(hrid).decode('utf-8'))
|
||||
open(os.path.join("logs", "hrid.txt"), "wb").write(hexlify(hrid))
|
||||
"""
|
||||
elif self.config.chipconfig.sej_base is not None:
|
||||
if meid == b"":
|
||||
if self.config.chipconfig.meid_addr:
|
||||
meid = self.custom_read(self.config.chipconfig.meid_addr,16)
|
||||
if meid != b"":
|
||||
self.info("Generating sej rpmbkey...")
|
||||
self.setotp(hwc)
|
||||
rpmbkey = hwc.aes_hwcrypt(mode="rpmb", data=meid, btype="sej")
|
||||
self.info("RPMB : " + hexlify(rpmbkey).decode('utf-8'))
|
||||
writesetting("rpmbkey", hexlify(rpmbkey).decode('utf-8'))
|
||||
else:
|
||||
self.info("SEJ Mode: No meid found. Are you in brom mode ?")
|
||||
return True
|
|
@ -5,6 +5,7 @@ import sys
|
|||
import logging
|
||||
import os
|
||||
import time
|
||||
import hashlib
|
||||
from struct import pack, unpack
|
||||
from binascii import hexlify
|
||||
from mtkclient.Library.utils import LogBase, progress, read_object, logsetup, structhelper
|
||||
|
@ -13,7 +14,7 @@ from mtkclient.Library.daconfig import DaStorage, EMMC_PartitionType
|
|||
from mtkclient.Library.partition import Partition
|
||||
from mtkclient.config.payloads import pathconfig
|
||||
from mtkclient.Library.settings import writesetting
|
||||
|
||||
from mtkclient.Library.legacy_ext import legacyext
|
||||
|
||||
class norinfo:
|
||||
m_nor_ret = None
|
||||
|
@ -673,6 +674,29 @@ class DALegacy(metaclass=LogBase):
|
|||
self.partition = Partition(self.mtk, self.readflash, self.read_pmt, loglevel)
|
||||
self.progress = progress(self.daconfig.pagesize)
|
||||
self.pathconfig = pathconfig()
|
||||
self.patch = False
|
||||
self.generatekeys = self.mtk.config.generatekeys
|
||||
if self.generatekeys:
|
||||
self.patch = True
|
||||
self.lft = legacyext(self.mtk, self, loglevel)
|
||||
|
||||
def read_reg32(self, addr:int):
|
||||
if self.usbwrite(self.Cmd.READ_REG32_CMD): # 0x7A
|
||||
self.usbwrite(pack(">I", addr))
|
||||
value = unpack(">I",self.usbread(4))[0]
|
||||
ack = self.usbread(1)
|
||||
if ack == self.Rsp.ACK:
|
||||
return value
|
||||
return None
|
||||
|
||||
def write_reg32(self, addr:int, data:int):
|
||||
self.usbwrite(self.Cmd.WRITE_REG32_CMD) # 0x7B
|
||||
self.usbwrite(pack(">I",addr))
|
||||
self.usbwrite(pack(">I",data))
|
||||
ack = self.usbread(1)
|
||||
if ack == self.Rsp.ACK:
|
||||
return True
|
||||
return False
|
||||
|
||||
def read_pmt(self): # A5
|
||||
class GptEntries:
|
||||
|
@ -941,18 +965,33 @@ class DALegacy(metaclass=LogBase):
|
|||
self.error("No valid da loader found... aborting.")
|
||||
return False
|
||||
loader = self.daconfig.loader
|
||||
self.info("Uploading stage 1...")
|
||||
self.info(f"Uploading legacy stage 1 from {os.path.basename(loader)}")
|
||||
with open(loader, 'rb') as bootldr:
|
||||
# stage 1
|
||||
stage = 1
|
||||
offset = self.daconfig.da.region[stage].m_buf
|
||||
size = self.daconfig.da.region[stage].m_len
|
||||
address = self.daconfig.da.region[stage].m_start_addr
|
||||
sig_len = self.daconfig.da.region[stage].m_sig_len
|
||||
bootldr.seek(offset)
|
||||
dadata = bootldr.read(size)
|
||||
if self.mtk.preloader.send_da(address, size, sig_len, dadata):
|
||||
if self.mtk.preloader.jump_da(address):
|
||||
da1offset = self.daconfig.da.region[1].m_buf
|
||||
da1size = self.daconfig.da.region[1].m_len
|
||||
da1address = self.daconfig.da.region[1].m_start_addr
|
||||
da2address = self.daconfig.da.region[1].m_start_addr
|
||||
da1sig_len = self.daconfig.da.region[1].m_sig_len
|
||||
bootldr.seek(da1offset)
|
||||
da1 = bootldr.read(da1size)
|
||||
# ------------------------------------------------
|
||||
da2offset = self.daconfig.da.region[2].m_buf
|
||||
da2sig_len = self.daconfig.da.region[2].m_sig_len
|
||||
bootldr.seek(da2offset)
|
||||
da2 = bootldr.read(self.daconfig.da.region[2].m_len)
|
||||
|
||||
hashaddr, hashmode, hashlen = self.mtk.daloader.compute_hash_pos(da1, da2, da2sig_len)
|
||||
if hashaddr is not None:
|
||||
da2 = self.lft.patch_da2(da2)
|
||||
da1 = self.mtk.daloader.fix_hash(da1, da2, hashaddr, hashmode, hashlen)
|
||||
self.patch = True
|
||||
self.daconfig.da2 = da2[:hashlen]
|
||||
else:
|
||||
self.daconfig.da2 = da2[:-da2sig_len]
|
||||
|
||||
if self.mtk.preloader.send_da(da1address, da1size, da1sig_len, da1):
|
||||
if self.mtk.preloader.jump_da(da1address):
|
||||
sync = self.usbread(1)
|
||||
if sync != b"\xC0":
|
||||
self.error("Error on DA sync")
|
||||
|
@ -995,7 +1034,7 @@ class DALegacy(metaclass=LogBase):
|
|||
self.set_stage2_config(self.config.hwcode)
|
||||
self.info("Uploading stage 2...")
|
||||
# stage 2
|
||||
if self.brom_send(self.daconfig, bootldr, 2):
|
||||
if self.brom_send(self.daconfig, da2, 2):
|
||||
if self.read_flash_info():
|
||||
if self.daconfig.flashtype == "nand":
|
||||
self.daconfig.flashsize = self.nand.m_nand_flash_size
|
||||
|
@ -1035,12 +1074,10 @@ class DALegacy(metaclass=LogBase):
|
|||
self.finish(0x0) # DISCONNECT_USB_AND_RELEASE_POWERKEY
|
||||
self.mtk.port.close(reset=True)
|
||||
|
||||
def brom_send(self, dasetup, da, stage, packetsize=0x1000):
|
||||
def brom_send(self, dasetup, dadata, stage, packetsize=0x1000):
|
||||
offset = dasetup.da.region[stage].m_buf
|
||||
size = dasetup.da.region[stage].m_len
|
||||
address = dasetup.da.region[stage].m_start_addr
|
||||
da.seek(offset)
|
||||
dadata = da.read(size)
|
||||
self.usbwrite(pack(">I", address))
|
||||
self.usbwrite(pack(">I", size))
|
||||
self.usbwrite(pack(">I", packetsize))
|
||||
|
@ -1065,9 +1102,10 @@ class DALegacy(metaclass=LogBase):
|
|||
|
||||
def check_usb_cmd(self):
|
||||
if self.usbwrite(self.Cmd.USB_CHECK_STATUS): # 72
|
||||
res = self.usbread(2)
|
||||
if len(res) > 1:
|
||||
if res[0] is self.Rsp.ACK[0]:
|
||||
res = self.usbread(1)
|
||||
if res == self.Rsp.ACK:
|
||||
res = self.usbread(1)
|
||||
if len(res) > 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
import json
|
||||
import logging
|
||||
import os
|
||||
import hashlib
|
||||
from mtkclient.Library.utils import LogBase, logsetup
|
||||
from mtkclient.Library.error import ErrorHandler
|
||||
from mtkclient.Library.daconfig import DAconfig
|
||||
|
@ -11,6 +12,7 @@ from mtkclient.Library.mtk_dalegacy import DALegacy, norinfo, emmcinfo, sdcinfo,
|
|||
from mtkclient.Library.mtk_daxflash import DAXFlash
|
||||
from mtkclient.config.brom_config import damodes
|
||||
from mtkclient.Library.xflash_ext import xflashext
|
||||
from mtkclient.Library.legacy_ext import legacyext
|
||||
|
||||
class DAloader(metaclass=LogBase):
|
||||
def __init__(self, mtk, loglevel=logging.INFO):
|
||||
|
@ -29,6 +31,7 @@ class DAloader(metaclass=LogBase):
|
|||
self.daconfig = DAconfig(mtk=self.mtk, loader=self.mtk.config.loader,
|
||||
preloader=self.mtk.config.preloader, loglevel=loglevel)
|
||||
self.xft = None
|
||||
self.lft = None
|
||||
self.da = None
|
||||
|
||||
def writestate(self):
|
||||
|
@ -48,6 +51,39 @@ class DAloader(metaclass=LogBase):
|
|||
|
||||
open(".state", "w").write(json.dumps(config))
|
||||
|
||||
def compute_hash_pos(self, da1, da2, da2sig_len):
|
||||
hashlen = len(da2)-da2sig_len
|
||||
|
||||
hashmode, idx = self.calc_da_hash(da1, da2[:hashlen])
|
||||
if idx == -1:
|
||||
hashlen = len(da2)
|
||||
hashmode, idx = self.calc_da_hash(da1, da2[:hashlen])
|
||||
if idx == -1:
|
||||
self.error("Hash computation failed.")
|
||||
return None, None, None
|
||||
return idx, hashmode, hashlen
|
||||
return idx, hashmode, hashlen
|
||||
|
||||
def calc_da_hash(self, da1, da2):
|
||||
hashdigest = hashlib.sha1(da2).digest()
|
||||
hashdigest256 = hashlib.sha256(da2).digest()
|
||||
idx = da1.find(hashdigest)
|
||||
hashmode = 1
|
||||
if idx == -1:
|
||||
idx = da1.find(hashdigest256)
|
||||
hashmode = 2
|
||||
return hashmode, idx
|
||||
|
||||
def fix_hash(self, da1, da2, hashpos, hashmode, hashlen):
|
||||
da1 = bytearray(da1)
|
||||
dahash = None
|
||||
if hashmode == 1:
|
||||
dahash = hashlib.sha1(da2[:hashlen]).digest()
|
||||
elif hashmode == 2:
|
||||
dahash = hashlib.sha256(da2[:hashlen]).digest()
|
||||
da1[hashpos:hashpos + len(dahash)] = dahash
|
||||
return da1
|
||||
|
||||
def reinit(self):
|
||||
if os.path.exists(".state"):
|
||||
config = json.loads(open(".state", "r").read())
|
||||
|
@ -59,7 +95,8 @@ class DAloader(metaclass=LogBase):
|
|||
self.daconfig.flashtype = config["flashtype"]
|
||||
self.daconfig.flashsize = config["flashsize"]
|
||||
self.da.reinit()
|
||||
self.xft=xflashext(self.mtk, self.da, self.loglevel)
|
||||
self.xft = xflashext(self.mtk, self.da, self.loglevel)
|
||||
self.lft = None
|
||||
else:
|
||||
self.da = DALegacy(self.mtk, self.daconfig, self.loglevel)
|
||||
self.daconfig.flashtype = config["flashtype"]
|
||||
|
@ -68,7 +105,7 @@ class DAloader(metaclass=LogBase):
|
|||
self.da.nand = nandinfo64()
|
||||
self.da.emmc = emmcinfo()
|
||||
self.da.sdc = sdcinfo()
|
||||
|
||||
self.lft=legacyext(self.mtk, self.da, self.loglevel)
|
||||
self.da.emmc.m_emmc_ua_size = config["m_emmc_ua_size"]
|
||||
self.da.emmc.m_emmc_boot1_size = config["m_emmc_boot1_size"]
|
||||
self.da.emmc.m_emmc_boot2_size = config["m_emmc_boot2_size"]
|
||||
|
@ -94,6 +131,7 @@ class DAloader(metaclass=LogBase):
|
|||
self.xft = xflashext(self.mtk, self.da, self.loglevel)
|
||||
else:
|
||||
self.da = DALegacy(self.mtk, self.daconfig, self.loglevel)
|
||||
self.lft = legacyext(self.mtk, self.da, self.loglevel)
|
||||
|
||||
def setmetamode(self, porttype: str):
|
||||
self.xflash = False
|
||||
|
@ -169,26 +207,26 @@ class DAloader(metaclass=LogBase):
|
|||
def peek(self, addr: int, length:int):
|
||||
if self.xflash:
|
||||
return self.xft.custom_read(addr=addr, length=length)
|
||||
self.error("Device is not in xflash mode, cannot run peek cmd.")
|
||||
return b""
|
||||
else:
|
||||
return self.lft.custom_read(addr=addr, length=length)
|
||||
|
||||
def poke(self, addr: int, data: bytes or bytearray):
|
||||
if self.xflash:
|
||||
return self.xft.custom_write(addr=addr, data=data)
|
||||
self.error("Device is not in xflash mode, cannot run poke cmd.")
|
||||
return False
|
||||
else:
|
||||
return self.lft.custom_write(addr=addr, data=data)
|
||||
|
||||
def keys(self):
|
||||
if self.xflash:
|
||||
return self.xft.generate_keys()
|
||||
self.error("Device is not in xflash mode, cannot run keys cmd.")
|
||||
return False
|
||||
else:
|
||||
return self.lft.generate_keys()
|
||||
|
||||
def seccfg(self, lockflag):
|
||||
if self.xflash:
|
||||
return self.xft.seccfg(lockflag)
|
||||
self.error("Device is not in xflash mode, cannot run unlock cmd.")
|
||||
return False
|
||||
else:
|
||||
return self.lft.seccfg(lockflag)
|
||||
|
||||
def read_rpmb(self, filename=None):
|
||||
if self.xflash:
|
||||
|
|
|
@ -131,10 +131,6 @@ class DAXFlash(metaclass=LogBase):
|
|||
self.warning = self.__logger.warning
|
||||
self.mtk = mtk
|
||||
self.loglevel = loglevel
|
||||
self.patch = False
|
||||
self.generatekeys = self.mtk.config.generatekeys
|
||||
if self.generatekeys:
|
||||
self.patch = True
|
||||
self.daext = False
|
||||
self.sram = None
|
||||
self.dram = None
|
||||
|
@ -157,6 +153,10 @@ class DAXFlash(metaclass=LogBase):
|
|||
self.partition = Partition(self.mtk, self.readflash, self.read_pmt, loglevel)
|
||||
self.progress = progress(self.daconfig.pagesize)
|
||||
self.pathconfig = pathconfig()
|
||||
self.patch = False
|
||||
self.generatekeys = self.mtk.config.generatekeys
|
||||
if self.generatekeys:
|
||||
self.patch = True
|
||||
self.xft = xflashext(self.mtk, self, loglevel)
|
||||
|
||||
def usleep(self, usec):
|
||||
|
@ -345,19 +345,6 @@ class DAXFlash(metaclass=LogBase):
|
|||
self.error(f"Error on sending data: {self.eh.status(status)}")
|
||||
return False
|
||||
|
||||
def compute_hash_pos(self, da1, da2):
|
||||
hashdigest = hashlib.sha1(da2).digest()
|
||||
hashdigest256 = hashlib.sha256(da2).digest()
|
||||
idx = da1.find(hashdigest)
|
||||
hashmode = 1
|
||||
if idx == -1:
|
||||
idx = da1.find(hashdigest256)
|
||||
hashmode = 2
|
||||
if idx != -1:
|
||||
return idx, hashmode
|
||||
self.error("Hash computation failed.")
|
||||
return None, None
|
||||
|
||||
def boot_to(self, at_address, da, display=True, timeout=0.5): # =0x40000000
|
||||
if self.xsend(self.Cmd.BOOT_TO):
|
||||
if self.status() == 0:
|
||||
|
@ -976,7 +963,7 @@ class DAXFlash(metaclass=LogBase):
|
|||
self.error("No valid da loader found... aborting.")
|
||||
return False
|
||||
loader = self.daconfig.loader
|
||||
self.info(f"Uploading stage 1 from {os.path.basename(loader)}")
|
||||
self.info(f"Uploading xflash stage 1 from {os.path.basename(loader)}")
|
||||
with open(loader, 'rb') as bootldr:
|
||||
# stage 1
|
||||
da1offset = self.daconfig.da.region[1].m_buf
|
||||
|
@ -992,12 +979,12 @@ class DAXFlash(metaclass=LogBase):
|
|||
bootldr.seek(da2offset)
|
||||
da2 = bootldr.read(self.daconfig.da.region[2].m_len)
|
||||
|
||||
hashaddr, hashmode = self.compute_hash_pos(da1, da2[:-da2sig_len])
|
||||
hashaddr, hashmode, hashlen = self.mtk.daloader.compute_hash_pos(da1, da2, da2sig_len)
|
||||
if hashaddr is not None:
|
||||
da2 = self.xft.patch_da2(da2)
|
||||
da1 = self.xft.fix_hash(da1, da2, hashaddr, hashmode)
|
||||
da1 = self.mtk.daloader.fix_hash(da1, da2, hashaddr, hashmode, hashlen)
|
||||
self.patch = True
|
||||
self.daconfig.da2 = da2
|
||||
self.daconfig.da2 = da2[:hashlen]
|
||||
else:
|
||||
self.daconfig.da2 = da2[:-da2sig_len]
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
# (c) B.Kerler 2018-2021 GPLv3 License
|
||||
import os
|
||||
import logging
|
||||
import shutil
|
||||
from enum import Enum
|
||||
from struct import unpack, pack
|
||||
from binascii import hexlify
|
||||
|
@ -126,7 +127,21 @@ class Preloader(metaclass=LogBase):
|
|||
|
||||
def init(self, maxtries=None, display=True):
|
||||
if os.path.exists(".state"):
|
||||
os.remove(".state")
|
||||
try:
|
||||
os.remove(".state")
|
||||
except:
|
||||
pass
|
||||
settings=os.path.join("logs","hwparam.json")
|
||||
if os.path.exists(settings):
|
||||
try:
|
||||
os.remove(settings)
|
||||
except:
|
||||
pass
|
||||
if os.path.exists("logs"):
|
||||
try:
|
||||
shutil.rmtree("logs")
|
||||
except:
|
||||
pass
|
||||
readsocid=self.config.readsocid
|
||||
skipwdt = self.config.skipwdt
|
||||
|
||||
|
|
73
mtkclient/Library/seccfg.py
Normal file
73
mtkclient/Library/seccfg.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
from struct import unpack, pack
|
||||
import hashlib
|
||||
|
||||
|
||||
class seccfg:
|
||||
def __init__(self, hwc):
|
||||
self.hwc = hwc
|
||||
self.magic = 0x4D4D4D4D
|
||||
self.seccfg_ver = None
|
||||
self.seccfg_size = None
|
||||
self.lock_state = None
|
||||
self.critical_lock_state = None
|
||||
self.sboot_runtime = None
|
||||
self.endflag = 0x45454545
|
||||
self.hash = b""
|
||||
|
||||
def parse(self, data):
|
||||
seccfg_data = unpack("<IIIIIII", data[:7 * 4])
|
||||
self.magic, self.seccfg_ver, self.seccfg_size, self.lock_state, self.critical_lock_state, \
|
||||
self.sboot_runtime, self.endflag = seccfg_data
|
||||
self.hash = data[7 * 4:(7 * 4) + 32]
|
||||
if self.magic != 0x4D4D4D4D or self.endflag != 0x45454545:
|
||||
self.error("Unknown seccfg structure !")
|
||||
return False
|
||||
return True
|
||||
|
||||
"""
|
||||
LKS_DEFAULT = 0x01
|
||||
LKS_MP_DEFAULT = 0x02
|
||||
LKS_UNLOCK = 0x03
|
||||
LKS_LOCK = 0x04
|
||||
LKS_VERIFIED = 0x05
|
||||
LKS_CUSTOM = 0x06
|
||||
LKCS_UNLOCK = 0x01
|
||||
LKCS_LOCK = 0x02
|
||||
SBOOT_RUNTIME_OFF = 0
|
||||
SBOOT_RUNTIME_ON = 1
|
||||
"""
|
||||
|
||||
def create(self, sc_org, hwtype: str, lockflag: str = "unlock", V3=False):
|
||||
if sc_org is None:
|
||||
if lockflag == "unlock":
|
||||
self.lock_state = 3
|
||||
self.critical_lock_state = 1
|
||||
self.seccfg_ver = 4
|
||||
self.seccfg_size = 0x3C
|
||||
self.sboot_runtime = 0
|
||||
elif lockflag == "lock":
|
||||
self.lock_state = 1
|
||||
self.critical_lock_state = 1
|
||||
self.seccfg_ver = 4
|
||||
self.seccfg_size = 0x3C
|
||||
self.sboot_runtime = 0
|
||||
else:
|
||||
self.lock_state = sc_org.lock_state
|
||||
self.critical_lock_state = sc_org.critical_lock_state
|
||||
self.seccfg_size = sc_org.seccfg_size
|
||||
self.sboot_runtime = sc_org.sboot_runtime
|
||||
self.seccfg_ver = sc_org.seccfg_ver
|
||||
seccfg_data = pack("<IIIIIII", self.magic, self.seccfg_ver, self.seccfg_size, self.lock_state,
|
||||
self.critical_lock_state, self.sboot_runtime, 0x45454545)
|
||||
dec_hash = hashlib.sha256(seccfg_data).digest()
|
||||
if hwtype == "sw":
|
||||
enc_hash = self.hwc.sej.sej_sec_cfg_sw(dec_hash, True)
|
||||
else:
|
||||
if not V3:
|
||||
enc_hash = self.hwc.sej.sej_sec_cfg_hw(dec_hash, True)
|
||||
else:
|
||||
enc_hash = self.hwc.sej.sej_sec_cfg_hw_V3(dec_hash, True)
|
||||
self.hash = enc_hash
|
||||
data = seccfg_data + enc_hash
|
||||
data += b"\x00" * (0x200 - len(data))
|
||||
return bytearray(data)
|
|
@ -5,6 +5,7 @@ from mtkclient.Library.error import ErrorHandler
|
|||
from mtkclient.Library.hwcrypto import crypto_setup, hwcrypto
|
||||
from mtkclient.Library.utils import LogBase, progress, logsetup, find_binary
|
||||
from mtkclient.Library.settings import writesetting, loadsetting
|
||||
from mtkclient.Library.seccfg import seccfg
|
||||
from binascii import hexlify
|
||||
import hashlib
|
||||
|
||||
|
@ -21,77 +22,6 @@ class XCmd:
|
|||
CUSTOM_READ_UFS_RPMB = 0x0F0008
|
||||
CUSTOM_WRITE_UFS_RPMB = 0x0F0009
|
||||
|
||||
class seccfg:
|
||||
def __init__(self, hwc):
|
||||
self.hwc = hwc
|
||||
self.magic = 0x4D4D4D4D
|
||||
self.seccfg_ver = None
|
||||
self.seccfg_size = None
|
||||
self.lock_state = None
|
||||
self.critical_lock_state = None
|
||||
self.sboot_runtime = None
|
||||
self.endflag = 0x45454545
|
||||
self.hash = b""
|
||||
|
||||
def parse(self, data):
|
||||
seccfg_data = unpack("<IIIIIII", data[:7 * 4])
|
||||
self.magic, self.seccfg_ver, self.seccfg_size, self.lock_state, self.critical_lock_state, \
|
||||
self.sboot_runtime, self.endflag = seccfg_data
|
||||
self.hash = data[7 * 4:(7 * 4) + 32]
|
||||
if self.magic != 0x4D4D4D4D or self.endflag != 0x45454545:
|
||||
self.error("Unknown seccfg structure !")
|
||||
return False
|
||||
return True
|
||||
|
||||
"""
|
||||
LKS_DEFAULT = 0x01
|
||||
LKS_MP_DEFAULT = 0x02
|
||||
LKS_UNLOCK = 0x03
|
||||
LKS_LOCK = 0x04
|
||||
LKS_VERIFIED = 0x05
|
||||
LKS_CUSTOM = 0x06
|
||||
LKCS_UNLOCK = 0x01
|
||||
LKCS_LOCK = 0x02
|
||||
SBOOT_RUNTIME_OFF = 0
|
||||
SBOOT_RUNTIME_ON = 1
|
||||
"""
|
||||
|
||||
def create(self, sc_org, hwtype: str, lockflag: str = "unlock", V3=False):
|
||||
if sc_org is None:
|
||||
if lockflag == "unlock":
|
||||
self.lock_state = 3
|
||||
self.critical_lock_state = 1
|
||||
self.seccfg_ver = 4
|
||||
self.seccfg_size = 0x3C
|
||||
self.sboot_runtime = 0
|
||||
elif lockflag == "lock":
|
||||
self.lock_state = 1
|
||||
self.critical_lock_state = 1
|
||||
self.seccfg_ver = 4
|
||||
self.seccfg_size = 0x3C
|
||||
self.sboot_runtime = 0
|
||||
else:
|
||||
self.lock_state = sc_org.lock_state
|
||||
self.critical_lock_state = sc_org.critical_lock_state
|
||||
self.seccfg_size = sc_org.seccfg_size
|
||||
self.sboot_runtime = sc_org.sboot_runtime
|
||||
self.seccfg_ver = sc_org.seccfg_ver
|
||||
seccfg_data = pack("<IIIIIII", self.magic, self.seccfg_ver, self.seccfg_size, self.lock_state,
|
||||
self.critical_lock_state, self.sboot_runtime, 0x45454545)
|
||||
dec_hash = hashlib.sha256(seccfg_data).digest()
|
||||
if hwtype == "sw":
|
||||
enc_hash = self.hwc.sej.sej_sec_cfg_sw(dec_hash, True)
|
||||
else:
|
||||
if not V3:
|
||||
enc_hash = self.hwc.sej.sej_sec_cfg_hw(dec_hash, True)
|
||||
else:
|
||||
enc_hash = self.hwc.sej.sej_sec_cfg_hw_V3(dec_hash, True)
|
||||
self.hash = enc_hash
|
||||
data = seccfg_data + enc_hash
|
||||
data += b"\x00" * (0x200 - len(data))
|
||||
return bytearray(data)
|
||||
|
||||
|
||||
class xflashext(metaclass=LogBase):
|
||||
def __init__(self, mtk, xflash, loglevel):
|
||||
self.pathconfig = pathconfig()
|
||||
|
@ -212,6 +142,7 @@ class xflashext(metaclass=LogBase):
|
|||
return daextdata
|
||||
return None
|
||||
|
||||
|
||||
def patch_da2(self, da2):
|
||||
#open("da2.bin","wb").write(da2)
|
||||
da2patched = bytearray(da2)
|
||||
|
@ -261,16 +192,6 @@ class xflashext(metaclass=LogBase):
|
|||
self.warning("Write not allowed not patched.")
|
||||
return da2patched
|
||||
|
||||
def fix_hash(self, da1, da2, hashpos, hashmode):
|
||||
da1 = bytearray(da1)
|
||||
dahash = None
|
||||
if hashmode == 1:
|
||||
dahash = hashlib.sha1(da2).digest()
|
||||
elif hashmode == 2:
|
||||
dahash = hashlib.sha256(da2).digest()
|
||||
da1[hashpos:hashpos + len(dahash)] = dahash
|
||||
return da1
|
||||
|
||||
def cmd(self, cmd):
|
||||
if self.xsend(self.xflash.Cmd.DEVICE_CTRL):
|
||||
status = self.status()
|
||||
|
|
2
setup.py
2
setup.py
|
@ -4,7 +4,7 @@ import os
|
|||
|
||||
setup(
|
||||
name='mtkclient',
|
||||
version='1.4',
|
||||
version='1.5',
|
||||
packages=find_packages(),
|
||||
long_description=open("README.md").read(),
|
||||
scripts=['mtk','stage2'],
|
||||
|
|
Loading…
Reference in a new issue