diff options
author | James Buren <braewoods+rb@braewoods.net> | 2020-11-21 17:58:01 +0000 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2020-11-22 05:12:04 +0000 |
commit | 6b3b4df6f64f1523b76d5f4f26c568ffc208a899 (patch) | |
tree | e3a0f2fe2562baf140655718288e92839b7474fa | |
parent | 2eb191a3f408281fde2fbd0003f2bdd6c2234970 (diff) | |
download | rockbox-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.c | 14 | ||||
-rw-r--r-- | apps/plugins/iriver_flash.c | 9 | ||||
-rw-r--r-- | firmware/common/rb-loader.c | 13 | ||||
-rw-r--r-- | firmware/include/checksum.h | 41 |
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 | ||
42 | static void aes_encrypt(void* data, uint32_t size) | 41 | static 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 | ||
136 | static 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 | |||
147 | enum plugin_status plugin_start(const void* parameter) | 135 | enum 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 */ | ||
28 | static 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 */ | ||
36 | static 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 | ||