summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Buren <braewoods+rb@braewoods.net>2020-11-21 17:58:01 +0000
committerWilliam Wilgus <me.theuser@yahoo.com>2020-11-22 05:12:04 +0000
commit6b3b4df6f64f1523b76d5f4f26c568ffc208a899 (patch)
treee3a0f2fe2562baf140655718288e92839b7474fa
parent2eb191a3f408281fde2fbd0003f2bdd6c2234970 (diff)
downloadrockbox-6b3b4df6f64f1523b76d5f4f26c568ffc208a899.tar.gz
rockbox-6b3b4df6f64f1523b76d5f4f26c568ffc208a899.zip
rockbox: move firmware checksum algorithms into a common header
Before this was just implemented inline wherever it was needed. Now it is provided as 2 inline functions in a header called checksum.h. There should be no differences in actual behavior. Change-Id: I5d756cc01dc6225f5cc8b6af90911a3fc7b57cd5
-rw-r--r--apps/plugins/crypt_firmware.c14
-rw-r--r--apps/plugins/iriver_flash.c9
-rw-r--r--firmware/common/rb-loader.c13
-rw-r--r--firmware/include/checksum.h41
4 files changed, 47 insertions, 30 deletions
diff --git a/apps/plugins/crypt_firmware.c b/apps/plugins/crypt_firmware.c
index f9bdd4d031..14e9c2be96 100644
--- a/apps/plugins/crypt_firmware.c
+++ b/apps/plugins/crypt_firmware.c
@@ -36,8 +36,7 @@
36*/ 36*/
37 37
38#include "plugin.h" 38#include "plugin.h"
39 39#include "checksum.h"
40
41 40
42static void aes_encrypt(void* data, uint32_t size) 41static void aes_encrypt(void* data, uint32_t size)
43{ 42{
@@ -133,17 +132,6 @@ static void put_uint32be(unsigned char* buf, uint32_t x)
133 buf[3] = x & 0xff; 132 buf[3] = x & 0xff;
134} 133}
135 134
136static uint32_t calc_checksum(uint32_t sum, unsigned char* buf, int len)
137{
138 int i;
139
140 for (i = 0; i < len ; i++) {
141 sum += buf[i];
142 }
143
144 return sum;
145}
146
147enum plugin_status plugin_start(const void* parameter) 135enum plugin_status plugin_start(const void* parameter)
148{ 136{
149 int fd; 137 int fd;
diff --git a/apps/plugins/iriver_flash.c b/apps/plugins/iriver_flash.c
index 9454ac63c8..152ac339ff 100644
--- a/apps/plugins/iriver_flash.c
+++ b/apps/plugins/iriver_flash.c
@@ -23,6 +23,7 @@
23 ****************************************************************************/ 23 ****************************************************************************/
24#include "plugin.h" 24#include "plugin.h"
25#include "lib/helper.h" 25#include "lib/helper.h"
26#include "checksum.h"
26 27
27/* 28/*
28 * Flash commands may rely on null pointer dereferences to work correctly. 29 * Flash commands may rely on null pointer dereferences to work correctly.
@@ -395,7 +396,6 @@ static bool load_firmware(const char* filename, enum firmware firmware,
395 { 396 {
396 uint32_t checksum; 397 uint32_t checksum;
397 uint8_t model[4]; 398 uint8_t model[4];
398 uint32_t sum;
399 399
400 /* subtract the header length */ 400 /* subtract the header length */
401 fd_len -= sizeof(checksum) + sizeof(model); 401 fd_len -= sizeof(checksum) + sizeof(model);
@@ -418,13 +418,8 @@ static bool load_firmware(const char* filename, enum firmware firmware,
418 goto bail; 418 goto bail;
419 } 419 }
420 420
421 /* calculate the checksum */
422 sum = MODEL_NUMBER;
423 for (off_t i = 0; i < fd_len; i++)
424 sum += buffer[i];
425
426 /* verify the checksum */ 421 /* verify the checksum */
427 if (sum != checksum) 422 if (!verify_checksum(checksum, buffer, fd_len))
428 { 423 {
429 msg = "Aborting: checksum mismatch"; 424 msg = "Aborting: checksum mismatch";
430 goto bail; 425 goto bail;
diff --git a/firmware/common/rb-loader.c b/firmware/common/rb-loader.c
index 1ded8c2335..300ba55401 100644
--- a/firmware/common/rb-loader.c
+++ b/firmware/common/rb-loader.c
@@ -24,6 +24,7 @@
24#include "system.h" 24#include "system.h"
25#include "file.h" 25#include "file.h"
26#include "loader_strerror.h" 26#include "loader_strerror.h"
27#include "checksum.h"
27 28
28#if defined(HAVE_BOOTDATA) 29#if defined(HAVE_BOOTDATA)
29#include "bootdata.h" 30#include "bootdata.h"
@@ -129,8 +130,7 @@ static int load_firmware_filename(unsigned char* buf,
129 int buffer_size) 130 int buffer_size)
130{ 131{
131 int len; 132 int len;
132 unsigned long chksum, sum; 133 unsigned long chksum;
133 int i;
134 int ret; 134 int ret;
135 int fd = open(filename, O_RDONLY); 135 int fd = open(filename, O_RDONLY);
136 136
@@ -162,14 +162,7 @@ static int load_firmware_filename(unsigned char* buf,
162 goto end; 162 goto end;
163 } 163 }
164 164
165 sum = MODEL_NUMBER; 165 if (!verify_checksum(chksum, buf, len))
166
167 for(i = 0;i < len;i++)
168 {
169 sum += buf[i];
170 }
171
172 if (sum != chksum)
173 { 166 {
174 ret = EBAD_CHKSUM; 167 ret = EBAD_CHKSUM;
175 goto end; 168 goto end;
diff --git a/firmware/include/checksum.h b/firmware/include/checksum.h
new file mode 100644
index 0000000000..6e66368bcf
--- /dev/null
+++ b/firmware/include/checksum.h
@@ -0,0 +1,41 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2020 James Buren
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include <stdint.h>
22#include <stdbool.h>
23
24#ifndef _CHECKSUM_H
25#define _CHECKSUM_H
26
27/* rockbox firmware checksum algorithm */
28static inline uint32_t calc_checksum(uint32_t sum, const uint8_t* buf, size_t len)
29{
30 for (size_t i = 0; i < len; i++)
31 sum += buf[i];
32 return sum;
33}
34
35/* similar to above but only used for verification */
36static inline bool verify_checksum(uint32_t cs, const uint8_t* buf, size_t len)
37{
38 return (calc_checksum(MODEL_NUMBER, buf, len) == cs);
39}
40
41#endif