Пример #1
0
/**************************************************************************
 *  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;
}
Пример #2
0
/**************************************************************************
 *  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;
}
Пример #3
0
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;
}
Пример #4
0
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();
}