[Feature][T8TSK-38][FOTA]Added all-inclusive upgrade

Change-Id: I5c137cd2022f015bcc1e1913ed42f0ff11c6dd23
diff --git a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
index 9252126..d31a0d9 100755
--- a/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -476,7 +476,7 @@
  
  
     do {
-
+        memset(delta_data,0,NAND_PAGE_SIZE);
         ret = read(fd_delta, delta_data, NAND_PAGE_SIZE);
 
         if (ret == 0) {
@@ -491,8 +491,8 @@
         }
   
         size -= NAND_PAGE_SIZE;
-		//mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
-		mtk_device_wrap_write(fd_curr,delta_data,ret);
+		mtk_device_wrap_write(fd_curr,delta_data,NAND_PAGE_SIZE);
+		//mtk_device_wrap_write(fd_curr,delta_data,ret);
 
     } while(size > 0);
   
@@ -502,9 +502,6 @@
 }
 
 
-
-
-
 unsigned char ram_buffer[ROCK_RAM_LEN];
 
 
@@ -1574,8 +1571,14 @@
 	
 	if(da_head.full_sys>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
-	    
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/system_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/system_b");
+        }
+        
 		if(current_slot==SLOT_B) {
 	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
             if (fd_system_a < 0) {
@@ -1600,12 +1603,12 @@
 		
 		retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading system full.\n");
-        do {
+        do{
             status = delta_copyto_nand(delta_offset,da_head.full_sys);
-		
-	        ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_sys,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_sys,digest_t);
-		    retry_cnt++;
+
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_sys,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_sys,digest_t);
+            retry_cnt++;
         }while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		
 		mtk_device_wrap_close(fd_curr);
@@ -1653,7 +1656,13 @@
 	
 	if(da_head.full_boot>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/boot_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/boot_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
@@ -1678,11 +1687,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading boot full.\n");
-        do {
+        do{
             status = delta_copyto_nand(delta_offset,da_head.full_boot);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_boot,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_boot,digest_t);
-		    retry_cnt++;	
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_boot,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_boot,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		
 		LYVERBLOG("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
@@ -1728,8 +1737,14 @@
 	
 	if(da_head.full_tee>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot;
-	    
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/tee_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/tee_b");
+        }
+        
 		if(current_slot==SLOT_B) {
 	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
             if (fd_tee_a < 0) {
@@ -1753,11 +1768,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading tee full.\n");
-        do {
+        do{
             status = delta_copyto_nand(delta_offset,da_head.full_tee);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_tee,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_tee,digest_t);
-		    retry_cnt++;	
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_tee,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_tee,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		LYVERBLOG("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
@@ -1800,7 +1815,13 @@
 
 	if(da_head.full_md1img>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/md1img_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/md1img_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
@@ -1825,11 +1846,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading md1img full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_md1img);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_md1img,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_md1img,digest_t);
-		    retry_cnt++;	
+        do{
+            status = delta_copyto_nand(delta_offset,da_head.full_md1img);
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1img,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1img,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
@@ -1873,7 +1894,13 @@
 	
 	if(da_head.full_md1dsp>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee + da_head.full_md1img;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee + da_head.full_md1img;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
@@ -1898,11 +1925,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading md1dsp full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_md1dsp,digest_t);
-		    retry_cnt++;	
+        do{
+            status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1dsp,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
@@ -1946,7 +1973,13 @@
 	
 	if(da_head.full_vbmeta>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee + da_head.full_md1img + da_head.full_md1dsp;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee  + da_head.full_boot + da_head.full_md1img + da_head.full_md1dsp;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
@@ -1971,11 +2004,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading vbmeta full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_vbmeta,digest_t);
-		    retry_cnt++;	
+        do{
+            status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_vbmeta,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
@@ -3286,7 +3319,13 @@
 	
 	if(da_head.full_sys>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/system_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/system_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_system_a = mtk_device_wrap_open(DEV_SYSTEM_A,O_RDWR);
@@ -3312,12 +3351,12 @@
 		
 		retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading system full.\n");
-        do {
+        do{
             status = delta_copyto_nand(delta_offset,da_head.full_sys);
-		
-	        ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_sys,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_sys,digest_t);
-		    retry_cnt++;
+
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_sys,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_sys,digest_t);
+            retry_cnt++;
         }while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		
 		mtk_device_wrap_close(fd_curr);
@@ -3365,7 +3404,13 @@
 	
 	if(da_head.full_boot>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/boot_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/boot_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_boot_a = mtk_device_wrap_open(DEV_BOOT_A,O_RDWR);
@@ -3390,11 +3435,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading boot full.\n");
-        do {
+        do{
             status = delta_copyto_nand(delta_offset,da_head.full_boot);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_boot,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_boot,digest_t);
-		    retry_cnt++;	
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_boot,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_boot,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		
 		LYVERBLOG("+[UA]: boot full retry_cnt = %d\n",retry_cnt);
@@ -3440,7 +3485,13 @@
 	
 	if(da_head.full_tee>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/tee_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/tee_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_tee_a = mtk_device_wrap_open(DEV_TEE_A,O_RDWR);
@@ -3465,11 +3516,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading tee full.\n");
-        do {
+        do{
             status = delta_copyto_nand(delta_offset,da_head.full_tee);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_tee,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_tee,digest_t);
-		    retry_cnt++;	
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_tee,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_tee,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		LYVERBLOG("+[UA]: tee full retry_cnt = %d\n",retry_cnt);		
@@ -3512,7 +3563,13 @@
 
 	if(da_head.full_md1img>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/md1img_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/md1img_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_md1img_a = mtk_device_wrap_open(DEV_MD1IMG_A,O_RDWR);
@@ -3537,11 +3594,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading md1img full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_md1img);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_md1img,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_md1img,digest_t);
-		    retry_cnt++;	
+        do{
+            status = delta_copyto_nand(delta_offset,da_head.full_md1img);
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1img,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1img,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
@@ -3585,7 +3642,13 @@
 	
 	if(da_head.full_md1dsp>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee + da_head.full_md1img;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee + da_head.full_md1img;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/md1dsp_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_md1dsp_a = mtk_device_wrap_open(DEV_MD1DSP_A,O_RDWR);
@@ -3610,11 +3673,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading md1dsp full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_md1dsp,digest_t);
-		    retry_cnt++;	
+        do{
+            status = delta_copyto_nand(delta_offset,da_head.full_md1dsp);
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_md1dsp,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_md1dsp,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
@@ -3658,7 +3721,13 @@
 	
 	if(da_head.full_vbmeta>0) {
 	
-	    delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_tee + da_head.full_md1img + da_head.full_md1dsp;
+        delta_offset = DELTA_HEARD_SIZE + delta_size + DELTA_FULL_HEARD_SIZE + da_head.full_sys + da_head.full_boot + da_head.full_tee + da_head.full_md1img + da_head.full_md1dsp;
+
+        if(current_slot==SLOT_B) {
+            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_a");
+        } else {
+            system("flash_eraseall /dev/disk/by-partlabel/vbmeta_b");
+        }
 	    
 		if(current_slot==SLOT_B) {
 	        fd_vbmeta_a = mtk_device_wrap_open(DEV_VBMETA_A,O_RDWR);
@@ -3683,11 +3752,11 @@
         save_fota_status();
         retry_cnt = 0;
 		LYVERBLOG("+[UA]: Start upgrading vbmeta full.\n");
-        do {       
-		    status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
-			ROCK_SHA_FILE(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
-		    ROCK_SHA_FILE(fd_curr,0,da_head.full_vbmeta,digest_t);
-		    retry_cnt++;	
+        do{
+            status = delta_copyto_nand(delta_offset,da_head.full_vbmeta);
+            ROCK_SHA_FILE_COMMON(fd_delta,delta_offset,da_head.full_vbmeta,digest_s);
+            ROCK_SHA_FILE(fd_curr,0,da_head.full_vbmeta,digest_t);
+            retry_cnt++;
 		}while((strncmp(digest_s,digest_t,SHA_DIGEST_SIZE)!=0)&&(retry_cnt <= 3));
 		mtk_device_wrap_close(fd_curr);
 		
diff --git a/src/lynq/lib/liblynq-fota/rock_ua/sha.c b/src/lynq/lib/liblynq-fota/rock_ua/sha.c
old mode 100644
new mode 100755
index 1989113..bdb29de
--- a/src/lynq/lib/liblynq-fota/rock_ua/sha.c
+++ b/src/lynq/lib/liblynq-fota/rock_ua/sha.c
@@ -319,38 +319,78 @@
     return digest;
 }
 
-#define NAND_PAGE_SIZE  2048
+#define NAND_PAGE_SIZE_SHA  4096
+
+const uint8_t* ROCK_SHA_FILE_COMMON(int fd_sha, int offset,int totle_size, uint8_t *digest) {
+    const uint8_t *p;
+    int i = 0;
+    //int fd_sha;
+    int size = 0;
+    int totale_size_common = totle_size;
+    char data[NAND_PAGE_SIZE_SHA];
+	
+
+    lseek(fd_sha, offset, SEEK_SET);
+    SHA_CTX ctx;
+    SHA_init(&ctx);
+
+    do{
+        if(totale_size_common >= NAND_PAGE_SIZE_SHA)
+        {
+            size = read(fd_sha,data,NAND_PAGE_SIZE_SHA);
+        }
+        else
+        {
+            size = read(fd_sha,data,totale_size_common);
+        }    
+        SHA_update(&ctx, data, size);
+        totale_size_common -= size;
+
+    }while(totale_size_common>0);
+    p = SHA_final(&ctx);
+    for (i = 0; i < SHA_DIGEST_SIZE; ++i) 
+    {
+        digest[i] = *p++;
+    }
+    return digest;
+}
 
 const uint8_t* ROCK_SHA_FILE(int fd_sha, int offset,int totle_size, uint8_t *digest) {
     const uint8_t *p;
     int i = 0;
-	//int fd_sha;
-	int size = 0;
-	char data[NAND_PAGE_SIZE];
+    //int fd_sha;
+    int size = 0;
+    int totale_size_file = totle_size;
+    char data[NAND_PAGE_SIZE_SHA];
 	
 
-	mtk_device_wrap_seek(fd_sha, offset, SEEK_SET);
+    mtk_device_wrap_seek(fd_sha, offset, SEEK_SET);
     SHA_CTX ctx;
     SHA_init(&ctx);
 
-	do {    
-        size = mtk_device_wrap_read(fd_sha,data,NAND_PAGE_SIZE);   
-		SHA_update(&ctx, data, size);
-		totle_size -= NAND_PAGE_SIZE;
+    do{
+        if(totale_size_file >= NAND_PAGE_SIZE_SHA)
+        {
+            size = mtk_device_wrap_read(fd_sha,data,NAND_PAGE_SIZE_SHA);   
+        }
+        else
+        {
+            size = mtk_device_wrap_read(fd_sha,data,totale_size_file);
+        }
+        SHA_update(&ctx, data, size);
+        totale_size_file -= size;
 
-	}while(totle_size>0);
+    }while(totale_size_file>0);
     p = SHA_final(&ctx);
-    for (i = 0; i < SHA_DIGEST_SIZE; ++i) {
+    for (i = 0; i < SHA_DIGEST_SIZE; ++i) 
+    {
         digest[i] = *p++;
     }
-
-
     return digest;
 }
 
 
 
-
 // Take a string 'str' of 40 hex digits and parse it into the 20
 // byte array 'digest'.  'str' may contain only the digest or be of
 // the form "<digest>:<anything>".  Return 0 on success, -1 on any