/************************************************************************** * READ IMAGE **************************************************************************/ uint32 sec_mtd_read_image(char* part_name, char* buf, uint32 off, uint32 size) { ASF_FILE fp; uint32 ret = SEC_OK; uint32 i = 0; char mtd_name[32]; uint32 part_index = 0; /* find which partition should be updated in mtd */ for(i=0; i<MAX_MTD_PARTITIONS; i++) { if(0 == mcmp(mtd_part_map[i].name,part_name,strlen(part_name))) { part_index = i; break; } } if(MAX_MTD_PARTITIONS == i) { ret = ERR_SBOOT_UPDATE_IMG_NOT_FOUND_IN_MTD; goto _end; } /* indicate which partition */ sprintf(mtd_name, "/dev/mtd/mtd%d", part_index); fp = ASF_OPEN(mtd_name); if (ASF_IS_ERR(fp)) { SMSG(true,"[%s] open fail\n",MOD); ret = ERR_SBOOT_UPDATE_IMG_OPEN_FAIL; goto _open_fail; } /* configure file system type */ osal_set_kernel_fs(); /* adjust read off */ ASF_SEEK_SET(fp,off); /* read image to input buf */ if(0 >= ASF_READ(fp,buf,size)) { ret = ERR_SBOOT_UPDATE_IMG_READ_FAIL; goto _read_fail; } _read_fail: ASF_CLOSE(fp); osal_restore_fs(); _open_fail: _end: return ret; }
/************************************************************************** * READ SECRO **************************************************************************/ uint32 sec_fs_read_secroimg (char* path, char* buf) { uint32 ret = SEC_OK; const uint32 size = sizeof(AND_SECROIMG_T); uint32 temp = 0; ASF_FILE fd; /* ------------------------ */ /* check parameter */ /* ------------------------ */ SMSG(TRUE,"[%s] open '%s'\n",MOD,path); if(0 == size) { ret = ERR_FS_SECRO_READ_SIZE_CANNOT_BE_ZERO; goto _end; } /* ------------------------ */ /* open secro */ /* ------------------------ */ fd = ASF_OPEN(path); if (ASF_IS_ERR(fd)) { ret = ERR_FS_SECRO_OPEN_FAIL; goto _open_fail; } /* ------------------------ */ /* read secro */ /* ------------------------ */ /* configure file system type */ osal_set_kernel_fs(); /* adjust read off */ ASF_SEEK_SET(fd,0); /* read secro content */ if(0 >= (temp = ASF_READ(fd,buf,size))) { ret = ERR_FS_SECRO_READ_FAIL; goto _end; } if(size != temp) { SMSG(TRUE,"[%s] size '0x%x', read '0x%x'\n",MOD,size,temp); ret = ERR_FS_SECRO_READ_WRONG_SIZE; goto _end; } /* ------------------------ */ /* check integrity */ /* ------------------------ */ if(SEC_OK != (ret = sec_secro_check())) { goto _end; } /* ------------------------ */ /* SECROIMG is valid */ /* ------------------------ */ bSecroExist = TRUE; _end: ASF_CLOSE(fd); osal_restore_fs(); _open_fail: return ret; }
int read_info (int part_index, uint32 part_off, uint32 search_region, char* info_name, uint32 info_name_len, uint32 info_sz, char* info_buf) { int ret = ERR_MTD_INFO_NOT_FOUND; char part_path[32]; uint32 off = 0; uchar *buf; MtdRCtx *ctx = (MtdRCtx*) osal_kmalloc(sizeof(MtdRCtx)); if (ctx == NULL) { ret = ERR_ROM_INFO_ALLOCATE_BUF_FAIL; goto _end; } ctx->buf = osal_kmalloc(search_region); memset(ctx->buf,0,search_region); if (ctx->buf == NULL) { ret = ERR_ROM_INFO_ALLOCATE_BUF_FAIL; goto _end; } /* ------------------------ */ /* open file */ /* ------------------------ */ /* in order to keep key finding process securely, open file in kernel module */ if(TRUE == sec_usif_enabled()) { sec_usif_part_path(part_index,part_path,sizeof(part_path)); if(FALSE == dump_search_info) { SMSG(TRUE,"[%s] open '%s'\n",MOD,part_path); dump_search_info = TRUE; } } else { sprintf(part_path, "/dev/mtd/mtd%d", part_index); if(FALSE == dump_search_info) { SMSG(TRUE,"[%s] open '%s'\n",MOD,part_path); dump_search_info = TRUE; } } ctx->fd = ASF_OPEN(part_path); if (ASF_IS_ERR(ctx->fd)) { SMSG(true,"[%s] open fail\n",MOD); ret = ERR_INFO_PART_NOT_FOUND; goto _open_fail; } /* ------------------------ */ /* read partition */ /* ------------------------ */ /* configure file system type */ osal_set_kernel_fs(); /* adjust read off */ ASF_SEEK_SET(ctx->fd,part_off); /* read partition */ if(0 >= (ret = ASF_READ(ctx->fd,ctx->buf,search_region))) { SMSG(TRUE,"[%s] read fail (%d)\n",MOD,ret); ret = ERR_ROM_INFO_MTD_READ_FAIL; goto _end; } else { /* ------------------------ */ /* search info */ /* ------------------------ */ for(off = 0; off<(search_region-info_sz); off++) { buf = ctx->buf + off; if(0 == strncmp(buf,info_name,info_name_len)) { osal_mtd_lock(); /* ------------------------ */ /* fill info */ /* ------------------------ */ mcpy(info_buf, buf, info_sz); ret = SEC_OK; osal_mtd_unlock(); break; } } } _end: ASF_CLOSE(ctx->fd); osal_restore_fs(); _open_fail : osal_kfree(ctx->buf); osal_kfree(ctx); return ret; }
void sec_dev_find_parts(void) { ASF_FILE fd; const uint32 buf_len = 2048; char *buf = osal_kmalloc(buf_len); char *pmtdbufp; uint32 mtd_part_cnt = 0; uint32 off = 0; uint32 rn = 0; ssize_t pm_sz; int cnt; osal_set_kernel_fs(); /* -------------------------- */ /* open proc device */ /* -------------------------- */ if(TRUE == sec_usif_enabled()) { /* -------------------------- */ /* open proc/dumchar_info */ /* -------------------------- */ SMSG(TRUE,"[%s] open /proc/dumchar_info\n",MOD); fd = ASF_OPEN("/proc/dumchar_info"); } else { /* -------------------------- */ /* open proc/mtd */ /* -------------------------- */ SMSG(TRUE,"[%s] open /proc/mtd\n",MOD); fd = ASF_OPEN("/proc/mtd"); } if (ASF_IS_ERR(fd)) { goto _end; } buf[buf_len - 1] = '\0'; pm_sz = ASF_READ(fd, buf, buf_len - 1); pmtdbufp = buf; /* -------------------------- */ /* parsing proc device */ /* -------------------------- */ while (pm_sz > 0) { int m_num, m_sz, mtd_e_sz; char m_name[16]; m_name[0] = '\0'; m_num = -1; m_num ++; if(TRUE == sec_usif_enabled()) { /* -------------------------- */ /* parsing proc/dumchar_info */ /* -------------------------- */ cnt = sscanf(pmtdbufp, "%15s %x %x %x",m_name, &m_sz, &mtd_e_sz, &rn); //SMSG(TRUE,"[%s] find parts %s, size 0x%x, cnt 0x%x, rn 0x%x\n",MOD,m_name,m_sz,cnt,rn); if ((cnt == 4) && (rn == 2)) { if (mtd_part_cnt < MAX_MTD_PARTITIONS) { /* ===================== */ /* uboot */ /* ===================== */ if(0 == mcmp(m_name,USIF_UBOOT,strlen(USIF_UBOOT))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_UBOOT, strlen(PL_UBOOT)); } /* ===================== */ /* logo */ /* ===================== */ else if(0 == mcmp(m_name,USIF_LOGO,strlen(USIF_LOGO))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_LOGO, strlen(PL_LOGO)); } /* ===================== */ /* boot image */ /* ===================== */ else if(0 == mcmp(m_name,USIF_BOOTIMG,strlen(USIF_BOOTIMG))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_BOOTIMG, strlen(PL_BOOTIMG)); } /* ===================== */ /* user data */ /* ===================== */ else if(0 == mcmp(m_name,USIF_USER,strlen(USIF_USER))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_USER, strlen(PL_USER)); } /* ===================== */ /* android system image */ /* ===================== */ else if(0 == mcmp(m_name,USIF_ANDSYSIMG,strlen(USIF_ANDSYSIMG))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_ANDSYSIMG, strlen(PL_ANDSYSIMG)); } /* ===================== */ /* recovery */ /* ===================== */ else if(0 == mcmp(m_name,USIF_RECOVERY,strlen(USIF_RECOVERY))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_RECOVERY, strlen(PL_RECOVERY)); } /* ===================== */ /* secroimg */ /* ===================== */ else if(0 == mcmp(m_name,USIF_SECRO,strlen(USIF_SECRO))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_SECRO, strlen(PL_SECRO)); secro_img_mtd_num = mtd_part_cnt; } /* ===================== */ /* other */ /* ===================== */ else { mcpy(mtd_part_map[mtd_part_cnt].name, m_name, sizeof(m_name)-1); } /* fill partition size */ mtd_part_map[mtd_part_cnt].sz = m_sz; /* calculate partition off */ mtd_part_map[mtd_part_cnt].off = off; /* update off and part count */ off += m_sz; mtd_part_cnt++; } else { SMSG(TRUE,"too many mtd partitions\n"); } } } else { /* -------------------------- */ /* parsing proc/mtd */ /* -------------------------- */ cnt = sscanf(pmtdbufp, "mtd%d: %x %x %15s",&m_num, &m_sz, &mtd_e_sz, m_name); if ((cnt == 4) && (m_name[0] == '"')) { char *x = strchr(m_name + 1, '"'); if (x) { *x = 0; } if (mtd_part_cnt < MAX_MTD_PARTITIONS) { /* ===================== */ /* uboot */ /* ===================== */ if(0 == mcmp(m_name+1,MTD_UBOOT,strlen(MTD_UBOOT))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_UBOOT, strlen(PL_UBOOT)); } /* ===================== */ /* logo */ /* ===================== */ else if(0 == mcmp(m_name+1,MTD_LOGO,strlen(MTD_LOGO))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_LOGO, strlen(PL_LOGO)); } /* ===================== */ /* boot image */ /* ===================== */ else if(0 == mcmp(m_name+1,MTD_BOOTIMG,strlen(MTD_BOOTIMG))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_BOOTIMG, strlen(PL_BOOTIMG)); } /* ===================== */ /* user data */ /* ===================== */ else if(0 == mcmp(m_name+1,MTD_USER,strlen(MTD_USER))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_USER, strlen(PL_USER)); } /* ===================== */ /* android system image */ /* ===================== */ else if(0 == mcmp(m_name+1,MTD_ANDSYSIMG,strlen(MTD_ANDSYSIMG))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_ANDSYSIMG, strlen(PL_ANDSYSIMG)); } /* ===================== */ /* recovery */ /* ===================== */ else if(0 == mcmp(m_name+1,MTD_RECOVERY,strlen(MTD_RECOVERY))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_RECOVERY, strlen(PL_RECOVERY)); } /* ===================== */ /* secroimg */ /* ===================== */ else if(0 == mcmp(m_name+1,MTD_SECRO,strlen(MTD_SECRO))) { mcpy(mtd_part_map[mtd_part_cnt].name, PL_SECRO, strlen(PL_SECRO)); secro_img_mtd_num = mtd_part_cnt; } /* ===================== */ /* other */ /* ===================== */ else { mcpy(mtd_part_map[mtd_part_cnt].name, m_name+1, sizeof(m_name)-1); } /* fill partition size */ mtd_part_map[mtd_part_cnt].sz = m_sz; /* calculate partition off */ mtd_part_map[mtd_part_cnt].off = off; /* update off and part count */ off += m_sz; mtd_part_cnt++; } else { SMSG(TRUE,"too many mtd partitions\n"); } } } while (pm_sz > 0 && *pmtdbufp != '\n') { pmtdbufp++; pm_sz--; } if (pm_sz > 0) { pmtdbufp++; pm_sz--; } } ASF_CLOSE(fd); _end: osal_kfree(buf); osal_restore_fs(); /* ------------------------ */ /* dump partition */ /* ------------------------ */ //sec_dev_dump_part(); }