@@ -620,12 +620,16 @@ int extract_kernel(const char *bootimg_path) {
620620 return -2 ;
621621 }
622622
623- uint32_t kernel_offset = hdr .page_size ;
623+ uint32_t page_size = hdr .page_size ;
624+ uint32_t kernel_offset = page_size ; // Kernel starts after the first page
624625 if (hdr .unused [0 ] >= 3 ) {
625626 kernel_offset = 4096 ;
626627 }
628+ if (hdr .unused [0 ] > 10 ) {
629+ kernel_offset = page_size ;
630+ }
627631
628- tools_logi ("Kernel size: %d, Offset: %d\n" , hdr .kernel_size , kernel_offset );
632+ tools_logi ("Kernel size: %d,Header Version: %d, Offset: %d\n" , hdr .kernel_size , hdr . unused [ 0 ] , kernel_offset );
629633
630634 uint8_t * kernel_data = malloc (hdr .kernel_size );
631635 if (!kernel_data ) {
@@ -687,6 +691,7 @@ int repack_bootimg(const char *orig_boot_path,
687691
688692 struct boot_img_hdr hdr ;
689693 struct avb_footer avb ;
694+ uint32_t extracted_size = 0 ;
690695 fread (& hdr , sizeof (hdr ), 1 , f_orig );
691696
692697 if (memcmp (hdr .magic , "ANDROID!" , 8 ) != 0 ) {
@@ -705,6 +710,7 @@ int repack_bootimg(const char *orig_boot_path,
705710 fread (& avb , sizeof (avb ), 1 , f_orig );
706711
707712 uint32_t header_ver = hdr .unused [0 ];
713+ if (header_ver > 10 ){header_ver = 0 ;extracted_size = hdr .unused [0 ];}
708714 //if (header_ver == 0){tools_loge_exit("we don't support this device any more\n");}
709715 uint32_t page_size = (header_ver >= 3 ) ? 4096 : hdr .page_size ;
710716 uint32_t fmt_size = (header_ver >= 3 ) ? hdr .kernel_addr : hdr .ramdisk_size ;
@@ -812,7 +818,6 @@ int repack_bootimg(const char *orig_boot_path,
812818 uint32_t rest_data_size = (total_size > rest_data_offset ) ? (total_size - rest_data_offset ) : 0 ;
813819 hdr .kernel_size = final_k_size + dtb_size ;
814820 uint32_t checksum_aligned = ALIGN (fmt_size , page_size );
815-
816821 uint8_t * rest_buf = NULL ;
817822 if (rest_data_size > 0 ) {
818823 rest_buf = malloc (rest_data_size );
@@ -841,6 +846,12 @@ int repack_bootimg(const char *orig_boot_path,
841846 checksum_aligned += ALIGN (hdr .second_size , page_size );
842847 }
843848 //to do extra data
849+ if (extracted_size ) {
850+ tools_logi ("extracted_size=%d\n" ,extracted_size );
851+ sha256_update (& ctx , (const BYTE * )rest_buf + checksum_aligned , page_size );
852+ sha256_update (& ctx , (const BYTE * )& extracted_size , 4 );
853+ checksum_aligned += ALIGN (extracted_size , page_size );
854+ }
844855 if (header_ver == 1 || header_ver == 2 ){
845856 tools_logi ("recovery_dtbo_size=%d\n" ,hdr .recovery_dtbo_size );
846857 sha256_update (& ctx , (const BYTE * )rest_buf + checksum_aligned , hdr .recovery_dtbo_size );
@@ -869,10 +880,17 @@ int repack_bootimg(const char *orig_boot_path,
869880 if (hdr .second_size > 0 ){
870881 checksum_aligned += ALIGN (hdr .second_size , page_size );
871882 }
872- tools_logi ("second_size=%d\n" ,hdr .second_size );
883+ tools_logi ("second_size=%d,offset=%d \n" ,hdr .second_size , checksum_aligned + rest_data_offset );
873884 //to do extra data
885+ if (extracted_size ) {
886+ tools_logi ("extracted_size=%d,offset=%d\n" ,extracted_size , checksum_aligned + rest_data_offset );
887+ sha1_update (& ctx , (const BYTE * )rest_buf + checksum_aligned , page_size );
888+ sha1_update (& ctx , (const BYTE * )& extracted_size , 4 );
889+ checksum_aligned += ALIGN (extracted_size , page_size );
890+ }
891+
874892 if (header_ver == 1 || header_ver == 2 ){
875- tools_logi ("recovery_dtbo_size=%d\n" ,hdr .recovery_dtbo_size );
893+ tools_logi ("recovery_dtbo_size=%d,offset=%d \n" ,hdr .recovery_dtbo_size , checksum_aligned + rest_data_offset );
876894 sha1_update (& ctx , (const BYTE * )rest_buf + checksum_aligned , hdr .recovery_dtbo_size );
877895 sha1_update (& ctx , (const BYTE * )& hdr .recovery_dtbo_size , 4 );
878896 checksum_aligned += ALIGN (hdr .recovery_dtbo_size , page_size );
0 commit comments