#include <sys/types.h>
#include <stdarg.h>
#include <fcntl.h>
+#include <string.h>
#include "SS_ImageUpdate.h"
#include "SS_Engine_Errors.h"
#include "ua_types.h"
#include "fota_tar.h"
#include "fota_common.h"
+#include "sha1.h"
void SS_Progress(void *pbUserData, SS_UINT32 uPercent)
{
return ret;
}
+
+int SS_CalculateFileSha(char *filename, long int filesize, unsigned char calculated_sha1[SHA_DIGEST_SIZE])
+{
+
+ FILE *fp = NULL;
+ int ulResult = S_SS_SUCCESS;
+ long int chunk = 20*1024*1024;
+ char buf[256];
+ uint8_t *buffer = NULL;
+
+ fp = fopen(filename, "rb");
+ if (fp == NULL) {
+ strerror_r(errno, buf, sizeof(buf));
+ LOGE("failed to open \"%s\": %s\n", filename, buf);
+ ulResult = E_SS_FAILURE;
+ goto Cleanup;
+ }
+
+ buffer = SS_Malloc(chunk);
+ if (!buffer) {
+ strerror_r(errno, buf, sizeof(buf));
+ LOGE("failed to allocate memory for \"%s\": %s\n", filename, buf);
+ ulResult = E_SS_FAILURE;
+ goto Cleanup;
+ }
+
+ ssize_t bytes_read = 0;
+ sha1_ctx_t sha_ctx;
+ sha1_init(&sha_ctx);
+
+ while (filesize > 0) {
+ if (filesize < chunk) {
+ bytes_read = fread(buffer, 1, filesize, fp);
+ if (bytes_read != filesize) {
+ LOGE("short read of \"%s\" (%ld bytes of %ld)\n", filename, (long)bytes_read, filesize);
+ ulResult = E_SS_FAILURE;
+ goto Cleanup;
+ }
+ sha1_update(&sha_ctx, buffer, filesize);
+ break;
+ } else {
+ bytes_read = fread(buffer, 1, chunk, fp);
+ if (bytes_read != chunk) {
+ LOGE("short read of \"%s\" (%ld bytes of %ld)\n", filename, (long)bytes_read, filesize);
+ ulResult = E_SS_FAILURE;
+ goto Cleanup;
+ }
+ sha1_update(&sha_ctx, buffer, chunk);
+ filesize -= chunk;
+ }
+ }
+
+ sha1_final(&sha_ctx, (uint32_t *) &calculated_sha1[0]);
+
+Cleanup:
+ if (fp)
+ fclose(fp);
+ if (buffer)
+ SS_Free(buffer);
+ return ulResult;
+}
+
};
void SS_unicode_to_char(const char *src, char *dest, int size);
+
+#ifndef SHA_DIGEST_SIZE
+#define SHA_DIGEST_SIZE 20 // To avoid creating dependencies on sha1.h
+#endif
+int SS_CalculateFileSha(char *filename, long int filesize, unsigned char calculated_sha1[SHA_DIGEST_SIZE]);
return E_SS_FAILURE;
}
-int SS_CalculateFileSha(char *filename, long int filesize, FileInfo * file)
-{
-
- FILE *fp = NULL;
- int ulResult = S_SS_SUCCESS;
- long int chunk = 20*1024*1024;
- char buf[256];
-
- fp = fopen(filename, "rb");
- if (fp == NULL) {
- strerror_r(errno, buf, sizeof(buf));
- LOGE("failed to open \"%s\": %s\n", filename, buf);
- ulResult = E_SS_FAILURE;
- goto Cleanup;
- }
-
- file->data = SS_Malloc(chunk);
- if (!file->data) {
- strerror_r(errno, buf, sizeof(buf));
- LOGE("failed to allocate memory for \"%s\": %s\n", filename, buf);
- ulResult = E_SS_FAILURE;
- goto Cleanup;
- }
-
- ssize_t bytes_read = 0;
- sha1_ctx_t sha_ctx;
- sha1_init(&sha_ctx);
-
- while (filesize > 0) {
- if (filesize < chunk) {
- bytes_read = fread(file->data, 1, filesize, fp);
- if (bytes_read != filesize) {
- LOGE("short read of \"%s\" (%ld bytes of %ld)\n", filename, (long)bytes_read, (long)file->size);
- ulResult = E_SS_FAILURE;
- goto Cleanup;
- }
- sha1_update(&sha_ctx, file->data, filesize);
- break;
- } else {
- bytes_read = fread(file->data, 1, chunk, fp);
- if (bytes_read != chunk) {
- LOGE("short read of \"%s\" (%ld bytes of %ld)\n", filename, (long)bytes_read, (long)file->size);
- ulResult = E_SS_FAILURE;
- goto Cleanup;
- }
- sha1_update(&sha_ctx, file->data, chunk);
- filesize -= chunk;
- }
- }
-
- sha1_final(&sha_ctx, (uint32_t *) &file->sha1);
-
-Cleanup:
- if (fp)
- fclose(fp);
- if (file->data)
- SS_Free(file->data);
- return ulResult;
-}
-
int SS_verify_DELTA_image(char *filename)
{
goto Cleanup;
}
- ulResult = SS_CalculateFileSha(filename, udelta_size, &file);
+ unsigned char calcualted_sha1[SHA_DIGEST_SIZE];
+ ulResult = SS_CalculateFileSha(filename, udelta_size, calcualted_sha1);
if (ulResult != S_SS_SUCCESS)
goto Cleanup;