From d5b57384bfdd47bd4d86838f49cfefee73903702 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 21 Sep 2025 11:39:25 -0600 Subject: [PATCH] was overly complex --- esphome/components/sha256/sha256.cpp | 101 +++++++-------------------- esphome/components/sha256/sha256.h | 23 +++--- 2 files changed, 33 insertions(+), 91 deletions(-) diff --git a/esphome/components/sha256/sha256.cpp b/esphome/components/sha256/sha256.cpp index 62edb5aaa2..a1f757cf0d 100644 --- a/esphome/components/sha256/sha256.cpp +++ b/esphome/components/sha256/sha256.cpp @@ -10,99 +10,67 @@ namespace esphome::sha256 { #if defined(USE_ESP32) || defined(USE_LIBRETINY) -SHA256::~SHA256() { - if (this->ctx_) { - mbedtls_sha256_free(&this->ctx_->ctx); - } -} +SHA256::~SHA256() { mbedtls_sha256_free(&this->ctx_); } void SHA256::init() { - if (!this->ctx_) { - this->ctx_ = std::make_unique(); - } - mbedtls_sha256_init(&this->ctx_->ctx); - mbedtls_sha256_starts(&this->ctx_->ctx, 0); // 0 = SHA256, not SHA224 + mbedtls_sha256_init(&this->ctx_); + mbedtls_sha256_starts(&this->ctx_, 0); // 0 = SHA256, not SHA224 } -void SHA256::add(const uint8_t *data, size_t len) { - if (!this->ctx_) { - this->init(); - } - mbedtls_sha256_update(&this->ctx_->ctx, data, len); -} +void SHA256::add(const uint8_t *data, size_t len) { mbedtls_sha256_update(&this->ctx_, data, len); } -void SHA256::calculate() { - if (!this->ctx_) { - this->init(); - } - mbedtls_sha256_finish(&this->ctx_->ctx, this->ctx_->hash); -} +void SHA256::calculate() { mbedtls_sha256_finish(&this->ctx_, this->hash_); } #elif defined(USE_ESP8266) || defined(USE_RP2040) SHA256::~SHA256() = default; void SHA256::init() { - if (!this->ctx_) { - this->ctx_ = std::make_unique(); - } - br_sha256_init(&this->ctx_->ctx); - this->ctx_->calculated = false; + br_sha256_init(&this->ctx_); + this->calculated_ = false; } -void SHA256::add(const uint8_t *data, size_t len) { - if (!this->ctx_) { - this->init(); - } - br_sha256_update(&this->ctx_->ctx, data, len); -} +void SHA256::add(const uint8_t *data, size_t len) { br_sha256_update(&this->ctx_, data, len); } void SHA256::calculate() { - if (!this->ctx_) { - this->init(); - } - if (!this->ctx_->calculated) { - br_sha256_out(&this->ctx_->ctx, this->ctx_->hash); - this->ctx_->calculated = true; + if (!this->calculated_) { + br_sha256_out(&this->ctx_, this->hash_); + this->calculated_ = true; } } #elif defined(USE_HOST) SHA256::~SHA256() { - if (this->ctx_ && this->ctx_->ctx) { - EVP_MD_CTX_free(this->ctx_->ctx); - this->ctx_->ctx = nullptr; + if (this->ctx_) { + EVP_MD_CTX_free(this->ctx_); } } void SHA256::init() { - if (!this->ctx_) { - this->ctx_ = std::make_unique(); + if (this->ctx_) { + EVP_MD_CTX_free(this->ctx_); } - if (this->ctx_->ctx) { - EVP_MD_CTX_free(this->ctx_->ctx); - } - this->ctx_->ctx = EVP_MD_CTX_new(); - EVP_DigestInit_ex(this->ctx_->ctx, EVP_sha256(), nullptr); - this->ctx_->calculated = false; + this->ctx_ = EVP_MD_CTX_new(); + EVP_DigestInit_ex(this->ctx_, EVP_sha256(), nullptr); + this->calculated_ = false; } void SHA256::add(const uint8_t *data, size_t len) { if (!this->ctx_) { this->init(); } - EVP_DigestUpdate(this->ctx_->ctx, data, len); + EVP_DigestUpdate(this->ctx_, data, len); } void SHA256::calculate() { if (!this->ctx_) { this->init(); } - if (!this->ctx_->calculated) { + if (!this->calculated_) { unsigned int len = 32; - EVP_DigestFinal_ex(this->ctx_->ctx, this->ctx_->hash, &len); - this->ctx_->calculated = true; + EVP_DigestFinal_ex(this->ctx_, this->hash_, &len); + this->calculated_ = true; } } @@ -110,22 +78,11 @@ void SHA256::calculate() { #error "SHA256 not supported on this platform" #endif -void SHA256::get_bytes(uint8_t *output) { - if (!this->ctx_) { - memset(output, 0, 32); - return; - } - memcpy(output, this->ctx_->hash, 32); -} +void SHA256::get_bytes(uint8_t *output) { memcpy(output, this->hash_, 32); } void SHA256::get_hex(char *output) { - if (!this->ctx_) { - memset(output, '0', 64); - output[64] = '\0'; - return; - } for (size_t i = 0; i < 32; i++) { - uint8_t byte = this->ctx_->hash[i]; + uint8_t byte = this->hash_[i]; output[i * 2] = format_hex_char(byte >> 4); output[i * 2 + 1] = format_hex_char(byte & 0x0F); } @@ -137,17 +94,9 @@ std::string SHA256::get_hex_string() { return std::string(buf); } -bool SHA256::equals_bytes(const uint8_t *expected) { - if (!this->ctx_) { - return false; - } - return memcmp(this->ctx_->hash, expected, 32) == 0; -} +bool SHA256::equals_bytes(const uint8_t *expected) { return memcmp(this->hash_, expected, 32) == 0; } bool SHA256::equals_hex(const char *expected) { - if (!this->ctx_) { - return false; - } uint8_t parsed[32]; if (!parse_hex(expected, parsed, 32)) { return false; diff --git a/esphome/components/sha256/sha256.h b/esphome/components/sha256/sha256.h index 35552bc92c..30121e20f2 100644 --- a/esphome/components/sha256/sha256.h +++ b/esphome/components/sha256/sha256.h @@ -48,26 +48,19 @@ class SHA256 : public esphome::HashBase { protected: #if defined(USE_ESP32) || defined(USE_LIBRETINY) - struct SHA256Context { - mbedtls_sha256_context ctx; - uint8_t hash[32]; - }; + mbedtls_sha256_context ctx_{}; + uint8_t hash_[32]; #elif defined(USE_ESP8266) || defined(USE_RP2040) - struct SHA256Context { - br_sha256_context ctx; - uint8_t hash[32]; - bool calculated{false}; - }; + br_sha256_context ctx_{}; + uint8_t hash_[32]; + bool calculated_{false}; #elif defined(USE_HOST) - struct SHA256Context { - EVP_MD_CTX *ctx{nullptr}; - uint8_t hash[32]; - bool calculated{false}; - }; + EVP_MD_CTX *ctx_{nullptr}; + uint8_t hash_[32]; + bool calculated_{false}; #else #error "SHA256 not supported on this platform" #endif - std::unique_ptr ctx_; }; } // namespace esphome::sha256