Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MD5 Builder: Rework for unqiue_ptr instead of malloc for internal dynamic buffers. #7208

Merged
merged 2 commits into from
Apr 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 25 additions & 23 deletions cores/esp8266/MD5Builder.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#include <Arduino.h>
#include <MD5Builder.h>
#include <memory>

uint8_t hex_char_to_byte(uint8_t c){
return (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;
uint8_t hex_char_to_byte(uint8_t c) {
return (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;
}

void MD5Builder::begin(void){
Expand All @@ -18,25 +19,27 @@ void MD5Builder::add(const uint8_t * data, const uint16_t len){

void MD5Builder::addHexString(const char * data){
uint16_t i, len = strlen(data);
uint8_t * tmp = (uint8_t*)malloc(len/2);
if(tmp == NULL) {
auto tmp = std::unique_ptr<uint8_t[]>{new(std::nothrow) uint8_t[len / 2]};

if (!tmp) {
return;
}

for(i=0; i<len; i+=2) {
uint8_t high = hex_char_to_byte(data[i]);
uint8_t low = hex_char_to_byte(data[i+1]);
tmp[i/2] = (high & 0x0F) << 4 | (low & 0x0F);
}
add(tmp, len/2);
free(tmp);
add(tmp.get(), len/2);
}

bool MD5Builder::addStream(Stream & stream, const size_t maxLen){
bool MD5Builder::addStream(Stream &stream, const size_t maxLen) {
const int buf_size = 512;
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;
}

Expand All @@ -45,48 +48,47 @@ bool MD5Builder::addStream(Stream & stream, const size_t maxLen){

// determine number of bytes to read
int readBytes = bytesAvailable;
if(readBytes > maxLengthLeft) {
readBytes = maxLengthLeft ; // read only until max_len
if (readBytes > maxLengthLeft){
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
}

// read data and check if we got something
int numBytesRead = stream.readBytes(buf, readBytes);
if(numBytesRead< 1) {
free(buf); // release the buffer
int numBytesRead = stream.readBytes(buf.get(), readBytes);
if (numBytesRead < 1) {
return false;
}

// Update MD5 with buffer payload
MD5Update(&_ctx, buf, numBytesRead);
MD5Update(&_ctx, buf.get(), numBytesRead);

yield(); // time for network streams

// update available number of bytes
maxLengthLeft -= numBytesRead;
bytesAvailable = stream.available();
}
free(buf);

return true;
}

void MD5Builder::calculate(void){
MD5Final(_buf, &_ctx);
}

void MD5Builder::getBytes(uint8_t * output){
void MD5Builder::getBytes(uint8_t * output) const {
memcpy(output, _buf, 16);
}

void MD5Builder::getChars(char * output){
for(uint8_t i = 0; i < 16; i++) {
void MD5Builder::getChars(char * output) const {
for (uint8_t i=0; i<16; i++){
sprintf(output + (i * 2), "%02x", _buf[i]);
}
}

String MD5Builder::toString(void){
String MD5Builder::toString(void) const {
char out[33];
getChars(out);
return String(out);
Expand Down
6 changes: 3 additions & 3 deletions cores/esp8266/MD5Builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ class MD5Builder {
void addHexString(const String& data){ addHexString(data.c_str()); }
bool addStream(Stream & stream, const size_t maxLen);
void calculate(void);
void getBytes(uint8_t * output);
void getChars(char * output);
String toString(void);
void getBytes(uint8_t * output) const;
void getChars(char * output) const;
String toString(void) const;
};


Expand Down