Skip to content

Commit 1d26b28

Browse files
dirkmuellerearlephilhower
authored andcommitted
Remove duplicated sha1 implementation (Fixes #6568) (#6569)
* Remove duplicated sha1 implementation (Fixes #6568) The Hash library had its own copy of a loop-unrolled sha1 implementation adding a large code footprint for no good reason, as there are several sha1 implementations already in tree (one in NONOS-SDK as well as one in bearssl). Switching to the bearssl one is straightforward and removes about 3kb of code size overhead. Also cleanup some obvious inefficiencies (copy by value, string summing, no reservation causing repeated reallocations) in the implementation. * Remove overload variants for sha1(...) that accept nonconst data The data is always remaining unmodified, so non-const overloads are confusing and redundant. Also optimize the hexify variant a bit more.
1 parent 2a83adb commit 1d26b28

File tree

4 files changed

+20
-285
lines changed

4 files changed

+20
-285
lines changed

libraries/Hash/src/Hash.cpp

+16-37
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,18 @@
2323
*/
2424

2525
#include <Arduino.h>
26+
#include <bearssl/bearssl_hash.h>
2627

2728
#include "Hash.h"
2829

29-
extern "C" {
30-
#include "sha1/sha1.h"
31-
}
32-
3330
/**
3431
* create a sha1 hash from data
3532
* @param data uint8_t *
3633
* @param size uint32_t
3734
* @param hash uint8_t[20]
3835
*/
39-
void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]) {
40-
41-
SHA1_CTX ctx;
36+
void sha1(const uint8_t* data, uint32_t size, uint8_t hash[20]) {
37+
br_sha1_context ctx;
4238

4339
#ifdef DEBUG_SHA1
4440
os_printf("DATA:");
@@ -53,9 +49,9 @@ void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]) {
5349
os_printf("\n");
5450
#endif
5551

56-
SHA1Init(&ctx);
57-
SHA1Update(&ctx, data, size);
58-
SHA1Final(hash, &ctx);
52+
br_sha1_init(&ctx);
53+
br_sha1_update(&ctx, data, size);
54+
br_sha1_out(&ctx, hash);
5955

6056
#ifdef DEBUG_SHA1
6157
os_printf("SHA1:");
@@ -66,52 +62,35 @@ void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]) {
6662
#endif
6763
}
6864

69-
void sha1(char * data, uint32_t size, uint8_t hash[20]) {
70-
sha1((uint8_t *) data, size, hash);
71-
}
72-
73-
void sha1(const uint8_t * data, uint32_t size, uint8_t hash[20]) {
74-
sha1((uint8_t *) data, size, hash);
75-
}
76-
77-
void sha1(const char * data, uint32_t size, uint8_t hash[20]) {
78-
sha1((uint8_t *) data, size, hash);
65+
void sha1(const char* data, uint32_t size, uint8_t hash[20]) {
66+
sha1((const uint8_t *) data, size, hash);
7967
}
8068

81-
void sha1(String data, uint8_t hash[20]) {
69+
void sha1(const String& data, uint8_t hash[20]) {
8270
sha1(data.c_str(), data.length(), hash);
8371
}
8472

85-
String sha1(uint8_t* data, uint32_t size) {
73+
String sha1(const uint8_t* data, uint32_t size) {
8674
uint8_t hash[20];
87-
String hashStr = "";
75+
String hashStr((const char*)nullptr);
76+
hashStr.reserve(20 * 2 + 1);
8877

8978
sha1(&data[0], size, &hash[0]);
9079

9180
for(uint16_t i = 0; i < 20; i++) {
92-
String hex = String(hash[i], HEX);
93-
if(hex.length() < 2) {
94-
hex = "0" + hex;
95-
}
81+
char hex[3];
82+
snprintf(hex, sizeof(hex), "%02x", hash[i]);
9683
hashStr += hex;
9784
}
9885

9986
return hashStr;
10087
}
10188

102-
String sha1(char* data, uint32_t size) {
103-
return sha1((uint8_t*) data, size);
104-
}
105-
106-
String sha1(const uint8_t* data, uint32_t size) {
107-
return sha1((uint8_t*) data, size);
108-
}
109-
11089
String sha1(const char* data, uint32_t size) {
111-
return sha1((uint8_t*) data, size);
90+
return sha1((const uint8_t*) data, size);
11291
}
11392

114-
String sha1(String data) {
93+
String sha1(const String& data) {
11594
return sha1(data.c_str(), data.length());
11695
}
11796

libraries/Hash/src/Hash.h

+4-8
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,12 @@
2727

2828
//#define DEBUG_SHA1
2929

30-
void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]);
31-
void sha1(char * data, uint32_t size, uint8_t hash[20]);
32-
void sha1(const uint8_t * data, uint32_t size, uint8_t hash[20]);
33-
void sha1(const char * data, uint32_t size, uint8_t hash[20]);
34-
void sha1(String data, uint8_t hash[20]);
30+
void sha1(const uint8_t* data, uint32_t size, uint8_t hash[20]);
31+
void sha1(const char* data, uint32_t size, uint8_t hash[20]);
32+
void sha1(const String& data, uint8_t hash[20]);
3533

36-
String sha1(uint8_t* data, uint32_t size);
37-
String sha1(char* data, uint32_t size);
3834
String sha1(const uint8_t* data, uint32_t size);
3935
String sha1(const char* data, uint32_t size);
40-
String sha1(String data);
36+
String sha1(const String& data);
4137

4238
#endif /* HASH_H_ */

libraries/Hash/src/sha1/sha1.c

-208
This file was deleted.

libraries/Hash/src/sha1/sha1.h

-32
This file was deleted.

0 commit comments

Comments
 (0)