打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ubo-header、signature、chunk结构

*      |----------------------------------------------------------------|

 *      |                 ubo-header-signature(256)                      |

 *      |----------------------------------------------------------------|

 *      |                  ubo-header(64)                                |

 *      |----------------------------------------------------------------|

 *      |                  payload                                       |

 *      |----------------------------------------------------------------|

 *      |                  ctrdata(solution dependent length)            |

 *      |----------------------------------------------------------------|

 *      |                 signature(256)                                 |

 *      |----------------------------------------------------------------|

 *

 *  image_get_data_size(ubo-header) = LengthOf(payload)

 *  

 *  ubo-header-signature = SignatureOf(ubo-header)

 *  KeyOf(ubo-header-signature) = ABL_RSA_PKx

 * 

 *  signature = SignatureOf(payload(clear) + ctrdata)

 *  KeyOf(signature) = ABL_RSA_PKx

3922 OTP mapping路径

\\alinet\tpe\DMS\STB\STB_Project\Fuse_setting\C3922

###########################

\\alinet\tpe\DMS\STB\STB_Project\Fuse_setting\C3922 C3922_OTP_Mapping_Table_20170914.xls

//depot/IC_Support/OTP/ALiOTP_Tool_Release/OTP_Control_Modify/otp_sysctrl_r.exe

if [ "$BR2_TARGET_GENERICFS_P1_ENCRYPT_BY_UK" != "ABL_AES_NONE"  ];then

message "encrypt boot code area: ====>"

cd $TEMPDIR

cp ${TEMPDIR}/bl.in ${TEMPDIR}/boot_total_area_clear.abs

cp ${TEMPDIR}/bl.in ${TEMPDIR}/boot_total_area_encrypt.abs

cp ${TEMPDIR}/boot_total_area_encrypt.abs ./../

cd ..

./tools/bl_tool BL_Encrypted_M3755.cmd

cp ./boot_total_area_encrypt.abs ${TEMPDIR}/boot_total_area_encrypt.abs

cp ${TEMPDIR}/boot_total_area_encrypt.abs ${TEMPDIR}/bl.in

echo -e "\033[44;31;4;5m|->boot_total_area.abs<-|\033[0m encrypt Done!"

[ $? -ne 0 ] && message "($BASH_SOURCE:$FUNCNAME:$LINENO) Error!" && exit 1

fi

ret=$?

if [ $ret != 0 ]; then

echo "$0 with error[$ret]"

exit 1

fi

 //depot/Documents/cas/Chip_Level/Riscure/M3755/

 //depot/Documents/S0000/S5000/Bootrom/Bootrom0_Design/C3503D_BootRom_0_Datasheet_V1.0.docx

typedef struct{

unsigned long id;

unsigned long len;

unsigned long offset;

unsigned long crc;

unsigned char name[16];

unsigned char version[16];

unsigned char time[16];

unsigned char reserved[64];

}CHUNK_HEADER;

block_len = sto_fetch_long(ota_offset + CHUNK_LENGTH) - CHUNK_HEADER_SIZE + CHUNK_NAME;

得到block_len 就是和下面的接口是一样的。工具先剪掉16字节,然后处理去拿,拿完之后再加上16字节。

ret = bl_get_chunk_len(chid, &block_addr, &block_len);

这个接口,拿到的数据就是正常的长度。

#define ABL_DUMP(prompt, data, len)                                     \

do{                                                             \

int i, l=(int)(len);                                    \

printf("\033[0;32;32m%s\033[m\n",prompt);               \

for(i=0; i<l; i++){                                     \

printf("0x%02X,",*(u_char*)((unsigned int)data+i));   \

if((i+1)%16==0)                                 \

printf("\n");                           \

}                                                       \

if((i)%16==0)                                           \

printf("\n");                                   \

else                                                    \

printf("\n");                                   \

}while(0)

#else

#define ABL_DUMP(fmt, args...) do {} while (0)

#endif

dd if=product_sabbat_dual_main.abs of=main.abs bs=1k skip=2111 count=1650

比如 你要提取product_sabbat_dual.abs 当中的maincode abs

bs:一个block的大小

skip: 从文件的开头,跳过多少个 bs

count :要提取的长度

dd if=product_sabbat_dual_main.abs of=main.abs bs=1k skip=2111 count=1650

dd命令中seek和skip的用法

dd命令中seek和skip用法,感兴趣的朋友可以参考下。

假如有一个文件abc.gz,大小为83456k,我想用dd命令实现如下备份 结果:首先将备份分成三个部分,第一部分为备份文件abc.gz的前10000k,第二部分为中间的70000k,最后备份后面的3456k.

备份方法如下三条命令: 

复制代码 代码如下:

dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000

 dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000 

 dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000

恢复方法如下:

复制代码 代码如下:

dd if=abc.gz.bak1 of=abc.gz

 dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000

 dd if=abc.gz.bak3 of=abc.gz bs=1k seek=80000

这时查看一下恢复的文件将和原来的文件一模一样,说明备份成功了。

说明:

skip=xxx是在备份时对if 后面的部分也就是原文件跳过多少块再开始备份;

seek=xxx则是在备份时对of 后面的部分也就是目标文件跳过多少块再开始写。

具体事例见:

product_sabbat_dual_main.abs 只有对maincode 进行了签名,没有加密,你想单独提取带签名的maincode的chunk

从开头 跳过 2112*1024 =  2162688 = 0x210000

maincode 加上chunk头,再加上签名一共 0x19AEE0 因为按照1K为单位进行提取的,

所以提取 0x19B000 = 1683456 /1024 =1644

dd if=product_sabbat_dual_main.abs of=main_test.abs bs=1k skip=2112 count=1644

#######################################################################

typedef struct{

unsigned long id; --chunk id 4byte 09 F6 01 00

unsigned long len; --chunk len 4byte,实际的数据段大小,00 00 00 70 实际的数据的长度,有chunck header,没有签名

unsigned long offset; --chunk offset 4byte,整个chunk分配的大小 00 00 02 00,也就是这个地方放着给这个chunk的的大小。offset = sto_fetch_long(addr + CHUNK_OFFSET),就能够得到这个chunk的大小。

unsigned long crc; --chunk crc 4byte, crc校验,4E 43 52 43

unsigned char name[16]; --chunk 名字,不能太长 

unsigned char version[16];版本号

unsigned char time[16];日期

unsigned char reserved[64];预留的

}CHUNK_HEADER;

4*4 + 3*16 + 64 = 128

addr:0x0005fe00,id:0x09f60100,len:0x00000070,offset:0x00000200, crc:0x4e435243,

addr:0x00060000,id:0x01fe0101,len:0x001cb896,offset:0x0024c000, crc:0x07fd289c,

###############################################

09 F6 01 00 00 00 00 70 00 00 02 00 4E 43 52 43

48 44 43 50 4B 65 79 00 FF FF FF FF FF FF FF FF 名字

30 30 30 30 30 30 30 31 00 FF FF FF FF FF FF FF 版本

32 30 31 35 2D 30 39 2D 32 34 00 FF FF FF FF FF 日期

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 预留

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

###############################################

[File]

id=0x09F60100

offset=0x00200

file=empty_hdcp.key

NCRC = "NCRC"

name="HDCPKey"

ver="00000001"

time=2015.11.17

#################################

 ret = bl_get_chunk_len(chid, &block_addr, &block_len);

 block_addr  在flash上面的地址,位置

 block_len  在flash上面的实际内容,裸数据的大小。

 sto_get_data(sto_dev, main_decrypted, block_addr - CHUNK_HEADER_SIZE, CHUNK_HEADER_SIZE)

 block_addr - CHUNK_HEADER_SIZE 去拿数据的时候,给入去掉chunk头的大小,因为去拿的时候,包括头了,内存已经有头了

 就是默认是连头一起拿的,可以读取main_decrypted地址上面的数据,查看,main_decrypted所在的位置开始的地方是chunk头的数据。

data_id  = sto_fetch_long((UINT32)pointer + CHUNK_ID);拿chunk的id号

data_len = sto_fetch_long((UINT32)pointer + CHUNK_LENGTH);拿chunk的长度,包括头和裸数据

data_off = sto_fetch_long((UINT32)pointer + CHUNK_OFFSET);拿chunk的offset分配的大小

data_crc = sto_fetch_long((UINT32)pointer + CHUNK_CRC);拿chunk的crc 

###############@@@@ 7.xbranch uboot启动流程。

void main_loop(void)

#if defined(CONFIG_ALI_PLATFORM) && defined(CONFIG_ALI_AUTOBOOT_APP)

s = ali_autoboot_command();

abl_autoboot_app();

#if defined(CONFIG_ENABLE_SHOW_OSD)

//show osd

abl_app_show_osd,// show logo and ....入口。

#endif

#endif

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
领先指标ASI - 捕捉大黑马
MP4文件格式详解
《关于libstagefright系列漏洞分析》的评论
不错的分时主图
android boot.img 结构
老鼠仓tdx
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服