Feature #41: Add SHA calculation to updater. Has yet to be checked against file. Code not tested
This commit is contained in:
parent
d63761d016
commit
a7394ef170
@ -21,13 +21,14 @@ set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/ram-link.ld)
|
|||||||
set(ELFFILE "${PROJECT_NAME}.elf")
|
set(ELFFILE "${PROJECT_NAME}.elf")
|
||||||
aux_source_directory("." SRCS)
|
aux_source_directory("." SRCS)
|
||||||
aux_source_directory("fatfs" FATFS_SRCS)
|
aux_source_directory("fatfs" FATFS_SRCS)
|
||||||
|
aux_source_directory("3rd-party/sha256" SHA256_SRCS)
|
||||||
aux_source_directory("fatfs/shimatta_sdio_driver" SDIO_SRCS)
|
aux_source_directory("fatfs/shimatta_sdio_driver" SDIO_SRCS)
|
||||||
set(STM_PERIPH_SRCS "../../stm-periph/backup-ram.c" "../../stm-periph/rcc-manager.c" "../../stm-periph/crc-unit.c")
|
set(STM_PERIPH_SRCS "../../stm-periph/backup-ram.c" "../../stm-periph/rcc-manager.c" "../../stm-periph/crc-unit.c")
|
||||||
set(SAFETY_MEMORY_SRCS "../../safety/safety-memory.c")
|
set(SAFETY_MEMORY_SRCS "../../safety/safety-memory.c")
|
||||||
|
|
||||||
add_executable(${ELFFILE} ${SRCS} ${FATFS_SRCS} ${SDIO_SRCS} ${STM_PERIPH_SRCS} ${SAFETY_MEMORY_SRCS})
|
add_executable(${ELFFILE} ${SRCS} ${FATFS_SRCS} ${SDIO_SRCS} ${STM_PERIPH_SRCS} ${SAFETY_MEMORY_SRCS} ${SHA256_SRCS})
|
||||||
|
|
||||||
target_include_directories(${ELFFILE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include ../../include)
|
target_include_directories(${ELFFILE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include ../../include ${CMAKE_CURRENT_SOURCE_DIR}/3rd-party)
|
||||||
target_compile_options(${ELFFILE} PRIVATE -Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter)
|
target_compile_options(${ELFFILE} PRIVATE -Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter)
|
||||||
target_compile_options(${ELFFILE} PRIVATE -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles -Wimplicit-fallthrough=3 -Wsign-compare -Os -g3)
|
target_compile_options(${ELFFILE} PRIVATE -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles -Wimplicit-fallthrough=3 -Wsign-compare -Os -g3)
|
||||||
target_compile_definitions(${ELFFILE} PRIVATE -DGIT_VER=${GIT_DESCRIBE} -DHSE_VALUE=8000000UL -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DSAFETY_MEMORY_STRIPOUT_DUMP)
|
target_compile_definitions(${ELFFILE} PRIVATE -DGIT_VER=${GIT_DESCRIBE} -DHSE_VALUE=8000000UL -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DSAFETY_MEMORY_STRIPOUT_DUMP)
|
||||||
|
@ -51,3 +51,37 @@ uint32_t heapless_itoa(int32_t value, char *buffer, uint32_t base)
|
|||||||
return bufferIdx;
|
return bufferIdx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char num_to_hex_digit(uint8_t num, bool capitalized)
|
||||||
|
{
|
||||||
|
char ret = 'U';
|
||||||
|
|
||||||
|
switch (num) {
|
||||||
|
case 0 ... 9:
|
||||||
|
ret = '0' + num;
|
||||||
|
break;
|
||||||
|
case 0xA ... 0xF:
|
||||||
|
if (capitalized)
|
||||||
|
ret = 'A' + num - 0xA;
|
||||||
|
else
|
||||||
|
ret = 'a' + num - 0xA;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bytes_to_hex_string(uint8_t *input, uint32_t count, char *output_buffer, bool capitalized)
|
||||||
|
{
|
||||||
|
uint32_t idx;
|
||||||
|
uint8_t b;
|
||||||
|
|
||||||
|
for (idx = 0; idx < count; idx++) {
|
||||||
|
b = input[idx];
|
||||||
|
output_buffer[idx] = num_to_hex_digit(b >> 4, capitalized);
|
||||||
|
output_buffer[idx+1] = num_to_hex_digit(b & 0xF, capitalized);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -2,7 +2,10 @@
|
|||||||
#define _ITOA_H_
|
#define _ITOA_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
uint32_t heapless_itoa(int32_t value, char *buffer, uint32_t base);
|
uint32_t heapless_itoa(int32_t value, char *buffer, uint32_t base);
|
||||||
|
|
||||||
|
uint32_t bytes_to_hex_string(uint8_t *input, uint32_t count, char *output_buffer, bool capitalized);
|
||||||
|
|
||||||
#endif /* _ITOA_H_ */
|
#endif /* _ITOA_H_ */
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
#include "itoa.h"
|
#include "itoa.h"
|
||||||
|
#include <sha256/sha-256.h>
|
||||||
|
|
||||||
static volatile unsigned int wait_tick;
|
static volatile unsigned int wait_tick;
|
||||||
|
|
||||||
@ -197,6 +198,49 @@ exit_parser_close:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int compute_sha256_of_file(const char *fname, uint8_t *sha256_out)
|
||||||
|
{
|
||||||
|
FIL _file;
|
||||||
|
int ret = 0;
|
||||||
|
FIL *file = &_file;
|
||||||
|
FRESULT fres;
|
||||||
|
static char workbuff[1024];
|
||||||
|
UINT act_read;
|
||||||
|
struct Sha_256 sha;
|
||||||
|
|
||||||
|
if (!fname || !sha256_out)
|
||||||
|
return -1000;
|
||||||
|
|
||||||
|
fres = f_open(file, fname, FA_READ);
|
||||||
|
if (fres != FR_OK) {
|
||||||
|
ret = -1;
|
||||||
|
goto ret_noact;
|
||||||
|
}
|
||||||
|
|
||||||
|
sha_256_init(&sha, sha256_out);
|
||||||
|
do {
|
||||||
|
fres = f_read(file, workbuff, sizeof(workbuff), &act_read);
|
||||||
|
if (act_read > 0) {
|
||||||
|
sha_256_write(&sha, workbuff, (size_t)act_read);
|
||||||
|
} else {
|
||||||
|
if (f_eof(file)) {
|
||||||
|
break;
|
||||||
|
} else if (f_error(file)) {
|
||||||
|
ret = -2;
|
||||||
|
goto ret_close_file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
(void)sha_256_close(&sha);
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
ret_close_file:
|
||||||
|
(void)f_close(file);
|
||||||
|
ret_noact:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int ram_code_main(void)
|
int ram_code_main(void)
|
||||||
{
|
{
|
||||||
FRESULT fres;
|
FRESULT fres;
|
||||||
@ -207,6 +251,7 @@ int ram_code_main(void)
|
|||||||
uint32_t count;
|
uint32_t count;
|
||||||
uint32_t update_size;
|
uint32_t update_size;
|
||||||
int retries = 3;
|
int retries = 3;
|
||||||
|
uint8_t sha_hash[SIZE_OF_SHA_256_HASH];
|
||||||
|
|
||||||
|
|
||||||
SysTick_Config(168000UL);
|
SysTick_Config(168000UL);
|
||||||
@ -237,6 +282,19 @@ int ram_code_main(void)
|
|||||||
if (res)
|
if (res)
|
||||||
ram_code_exit(false);
|
ram_code_exit(false);
|
||||||
|
|
||||||
|
uart_send_string("Calculating SHA256 checksum\r\n");
|
||||||
|
if (compute_sha256_of_file(filename, sha_hash)) {
|
||||||
|
uart_send_string("Calculation failed!");
|
||||||
|
ram_code_exit(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
uart_send_string("SHA256: ");
|
||||||
|
bytes_to_hex_string(sha_hash, SIZE_OF_SHA_256_HASH, tmp_buff, false);
|
||||||
|
tmp_buff[SIZE_OF_SHA_256_HASH] = 0;
|
||||||
|
uart_send_string(tmp_buff);
|
||||||
|
uart_send_string("\r\n");
|
||||||
|
|
||||||
|
|
||||||
uart_send_string("Checking hex file ");
|
uart_send_string("Checking hex file ");
|
||||||
uart_send_string(filename);
|
uart_send_string(filename);
|
||||||
uart_send_string("\r\n");
|
uart_send_string("\r\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user