1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

MD5 Builder: Rework for unqiue_ptr instead of malloc, get only member functions marked as const (#7208)

Co-authored-by: Luiss <luiss@mind.cc>
This commit is contained in:
Luigi Rodorigo 2020-04-11 20:02:38 +02:00 committed by GitHub
parent 4f27ce16b3
commit e1789ddf0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 26 deletions

View File

@ -1,10 +1,11 @@
#include <Arduino.h> #include <Arduino.h>
#include <MD5Builder.h> #include <MD5Builder.h>
#include <memory>
uint8_t hex_char_to_byte(uint8_t c){ uint8_t hex_char_to_byte(uint8_t c) {
return (c >= 'a' && c <= 'f') ? (c - ((uint8_t)'a' - 0xa)) : return (c >= 'a' && c <= 'f') ? (c - ((uint8_t)'a' - 0xa)) :
(c >= 'A' && c <= 'F') ? (c - ((uint8_t)'A' - 0xA)) : (c >= 'A' && c <= 'F') ? (c - ((uint8_t)'A' - 0xA)) :
(c >= '0' && c<= '9') ? (c - (uint8_t)'0') : 0; (c >= '0' && c <= '9') ? (c - (uint8_t)'0') : 0;
} }
void MD5Builder::begin(void){ void MD5Builder::begin(void){
@ -18,25 +19,27 @@ void MD5Builder::add(const uint8_t * data, const uint16_t len){
void MD5Builder::addHexString(const char * data){ void MD5Builder::addHexString(const char * data){
uint16_t i, len = strlen(data); uint16_t i, len = strlen(data);
uint8_t * tmp = (uint8_t*)malloc(len/2); auto tmp = std::unique_ptr<uint8_t[]>{new(std::nothrow) uint8_t[len / 2]};
if(tmp == NULL) {
if (!tmp) {
return; return;
} }
for(i=0; i<len; i+=2) { for(i=0; i<len; i+=2) {
uint8_t high = hex_char_to_byte(data[i]); uint8_t high = hex_char_to_byte(data[i]);
uint8_t low = hex_char_to_byte(data[i+1]); uint8_t low = hex_char_to_byte(data[i+1]);
tmp[i/2] = (high & 0x0F) << 4 | (low & 0x0F); tmp[i/2] = (high & 0x0F) << 4 | (low & 0x0F);
} }
add(tmp, len/2); add(tmp.get(), len/2);
free(tmp);
} }
bool MD5Builder::addStream(Stream & stream, const size_t maxLen){ bool MD5Builder::addStream(Stream &stream, const size_t maxLen) {
const int buf_size = 512; const int buf_size = 512;
int maxLengthLeft = maxLen; int maxLengthLeft = maxLen;
uint8_t * buf = (uint8_t*) malloc(buf_size);
if(!buf) { auto buf = std::unique_ptr<uint8_t[]>{new(std::nothrow) uint8_t[buf_size]};
if (!buf) {
return false; return false;
} }
@ -45,22 +48,21 @@ bool MD5Builder::addStream(Stream & stream, const size_t maxLen){
// determine number of bytes to read // determine number of bytes to read
int readBytes = bytesAvailable; int readBytes = bytesAvailable;
if(readBytes > maxLengthLeft) { if (readBytes > maxLengthLeft){
readBytes = maxLengthLeft ; // read only until max_len readBytes = maxLengthLeft; // read only until max_len
} }
if(readBytes > buf_size) { if (readBytes > buf_size){
readBytes = buf_size; // not read more the buffer can handle readBytes = buf_size; // not read more the buffer can handle
} }
// read data and check if we got something // read data and check if we got something
int numBytesRead = stream.readBytes(buf, readBytes); int numBytesRead = stream.readBytes(buf.get(), readBytes);
if(numBytesRead< 1) { if (numBytesRead < 1) {
free(buf); // release the buffer
return false; return false;
} }
// Update MD5 with buffer payload // Update MD5 with buffer payload
MD5Update(&_ctx, buf, numBytesRead); MD5Update(&_ctx, buf.get(), numBytesRead);
yield(); // time for network streams yield(); // time for network streams
@ -68,7 +70,7 @@ bool MD5Builder::addStream(Stream & stream, const size_t maxLen){
maxLengthLeft -= numBytesRead; maxLengthLeft -= numBytesRead;
bytesAvailable = stream.available(); bytesAvailable = stream.available();
} }
free(buf);
return true; return true;
} }
@ -76,17 +78,17 @@ void MD5Builder::calculate(void){
MD5Final(_buf, &_ctx); MD5Final(_buf, &_ctx);
} }
void MD5Builder::getBytes(uint8_t * output){ void MD5Builder::getBytes(uint8_t * output) const {
memcpy(output, _buf, 16); memcpy(output, _buf, 16);
} }
void MD5Builder::getChars(char * output){ void MD5Builder::getChars(char * output) const {
for(uint8_t i = 0; i < 16; i++) { for (uint8_t i=0; i<16; i++){
sprintf(output + (i * 2), "%02x", _buf[i]); sprintf(output + (i * 2), "%02x", _buf[i]);
} }
} }
String MD5Builder::toString(void){ String MD5Builder::toString(void) const {
char out[33]; char out[33];
getChars(out); getChars(out);
return String(out); return String(out);

View File

@ -40,9 +40,9 @@ class MD5Builder {
void addHexString(const String& data){ addHexString(data.c_str()); } void addHexString(const String& data){ addHexString(data.c_str()); }
bool addStream(Stream & stream, const size_t maxLen); bool addStream(Stream & stream, const size_t maxLen);
void calculate(void); void calculate(void);
void getBytes(uint8_t * output); void getBytes(uint8_t * output) const;
void getChars(char * output); void getChars(char * output) const;
String toString(void); String toString(void) const;
}; };