mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	[xxtea] Extract encryption functions to separate component (#8183)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
		| @@ -499,5 +499,6 @@ esphome/components/xiaomi_mhoc401/* @vevsvevs | |||||||
| esphome/components/xiaomi_rtcgq02lm/* @jesserockz | esphome/components/xiaomi_rtcgq02lm/* @jesserockz | ||||||
| esphome/components/xl9535/* @mreditor97 | esphome/components/xl9535/* @mreditor97 | ||||||
| esphome/components/xpt2046/touchscreen/* @nielsnl68 @numo68 | esphome/components/xpt2046/touchscreen/* @nielsnl68 @numo68 | ||||||
|  | esphome/components/xxtea/* @clydebarrow | ||||||
| esphome/components/zhlt01/* @cfeenstra1024 | esphome/components/zhlt01/* @cfeenstra1024 | ||||||
| esphome/components/zio_ultrasonic/* @kahrendt | esphome/components/zio_ultrasonic/* @kahrendt | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ from esphome.cpp_generator import MockObjClass | |||||||
|  |  | ||||||
| CODEOWNERS = ["@clydebarrow"] | CODEOWNERS = ["@clydebarrow"] | ||||||
| DEPENDENCIES = ["network"] | DEPENDENCIES = ["network"] | ||||||
| AUTO_LOAD = ["socket"] | AUTO_LOAD = ["socket", "xxtea"] | ||||||
| MULTI_CONF = True | MULTI_CONF = True | ||||||
|  |  | ||||||
| udp_ns = cg.esphome_ns.namespace("udp") | udp_ns = cg.esphome_ns.namespace("udp") | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ | |||||||
| #include "esphome/components/network/util.h" | #include "esphome/components/network/util.h" | ||||||
| #include "udp_component.h" | #include "udp_component.h" | ||||||
|  |  | ||||||
|  | #include "esphome/components/xxtea/xxtea.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace udp { | namespace udp { | ||||||
|  |  | ||||||
| @@ -47,54 +49,7 @@ namespace udp { | |||||||
|  */ |  */ | ||||||
| static const char *const TAG = "udp"; | static const char *const TAG = "udp"; | ||||||
|  |  | ||||||
| /** | static size_t round4(size_t value) { return (value + 3) & ~3; } | ||||||
|  * XXTEA implementation, using 256 bit key. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| static const uint32_t DELTA = 0x9e3779b9; |  | ||||||
| #define MX ((((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((sum ^ y) + (k[(p ^ e) & 7] ^ z))) |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Encrypt a block of data in-place |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| static void xxtea_encrypt(uint32_t *v, size_t n, const uint32_t *k) { |  | ||||||
|   uint32_t z, y, sum, e; |  | ||||||
|   size_t p; |  | ||||||
|   size_t q = 6 + 52 / n; |  | ||||||
|   sum = 0; |  | ||||||
|   z = v[n - 1]; |  | ||||||
|   while (q-- != 0) { |  | ||||||
|     sum += DELTA; |  | ||||||
|     e = (sum >> 2); |  | ||||||
|     for (p = 0; p != n - 1; p++) { |  | ||||||
|       y = v[p + 1]; |  | ||||||
|       z = v[p] += MX; |  | ||||||
|     } |  | ||||||
|     y = v[0]; |  | ||||||
|     z = v[n - 1] += MX; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void xxtea_decrypt(uint32_t *v, size_t n, const uint32_t *k) { |  | ||||||
|   uint32_t z, y, sum, e; |  | ||||||
|   size_t p; |  | ||||||
|   size_t q = 6 + 52 / n; |  | ||||||
|   sum = q * DELTA; |  | ||||||
|   y = v[0]; |  | ||||||
|   while (q-- != 0) { |  | ||||||
|     e = (sum >> 2); |  | ||||||
|     for (p = n - 1; p != 0; p--) { |  | ||||||
|       z = v[p - 1]; |  | ||||||
|       y = v[p] -= MX; |  | ||||||
|     } |  | ||||||
|     z = v[n - 1]; |  | ||||||
|     y = v[0] -= MX; |  | ||||||
|     sum -= DELTA; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| inline static size_t round4(size_t value) { return (value + 3) & ~3; } |  | ||||||
|  |  | ||||||
| union FuData { | union FuData { | ||||||
|   uint32_t u32; |   uint32_t u32; | ||||||
| @@ -312,7 +267,7 @@ void UDPComponent::flush_() { | |||||||
|   memcpy(buffer, this->header_.data(), this->header_.size()); |   memcpy(buffer, this->header_.data(), this->header_.size()); | ||||||
|   memcpy(buffer + header_len, this->data_.data(), this->data_.size()); |   memcpy(buffer + header_len, this->data_.data(), this->data_.size()); | ||||||
|   if (this->is_encrypted_()) { |   if (this->is_encrypted_()) { | ||||||
|     xxtea_encrypt(buffer + header_len, len, (uint32_t *) this->encryption_key_.data()); |     xxtea::encrypt(buffer + header_len, len, (uint32_t *) this->encryption_key_.data()); | ||||||
|   } |   } | ||||||
|   auto total_len = (header_len + len) * 4; |   auto total_len = (header_len + len) * 4; | ||||||
|   this->send_packet_(buffer, total_len); |   this->send_packet_(buffer, total_len); | ||||||
| @@ -503,7 +458,7 @@ void UDPComponent::process_(uint8_t *buf, const size_t len) { | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   if (!provider.encryption_key.empty()) { |   if (!provider.encryption_key.empty()) { | ||||||
|     xxtea_decrypt((uint32_t *) buf, (end - buf) / 4, (uint32_t *) provider.encryption_key.data()); |     xxtea::decrypt((uint32_t *) buf, (end - buf) / 4, (uint32_t *) provider.encryption_key.data()); | ||||||
|   } |   } | ||||||
|   byte = *buf++; |   byte = *buf++; | ||||||
|   if (byte == ROLLING_CODE_KEY) { |   if (byte == ROLLING_CODE_KEY) { | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								esphome/components/xxtea/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								esphome/components/xxtea/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | """ESPHome XXTEA encryption component.""" | ||||||
|  |  | ||||||
|  | CODEOWNERS = ["@clydebarrow"] | ||||||
							
								
								
									
										46
									
								
								esphome/components/xxtea/xxtea.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								esphome/components/xxtea/xxtea.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | #include "xxtea.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace xxtea { | ||||||
|  |  | ||||||
|  | static const uint32_t DELTA = 0x9e3779b9; | ||||||
|  | #define MX ((((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((sum ^ y) + (k[(p ^ e) & 7] ^ z))) | ||||||
|  |  | ||||||
|  | void encrypt(uint32_t *v, size_t n, const uint32_t *k) { | ||||||
|  |   uint32_t z, y, sum, e; | ||||||
|  |   size_t p; | ||||||
|  |   size_t q = 6 + 52 / n; | ||||||
|  |   sum = 0; | ||||||
|  |   z = v[n - 1]; | ||||||
|  |   while (q-- != 0) { | ||||||
|  |     sum += DELTA; | ||||||
|  |     e = (sum >> 2); | ||||||
|  |     for (p = 0; p != n - 1; p++) { | ||||||
|  |       y = v[p + 1]; | ||||||
|  |       z = v[p] += MX; | ||||||
|  |     } | ||||||
|  |     y = v[0]; | ||||||
|  |     z = v[n - 1] += MX; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void decrypt(uint32_t *v, size_t n, const uint32_t *k) { | ||||||
|  |   uint32_t z, y, sum, e; | ||||||
|  |   size_t p; | ||||||
|  |   size_t q = 6 + 52 / n; | ||||||
|  |   sum = q * DELTA; | ||||||
|  |   y = v[0]; | ||||||
|  |   while (q-- != 0) { | ||||||
|  |     e = (sum >> 2); | ||||||
|  |     for (p = n - 1; p != 0; p--) { | ||||||
|  |       z = v[p - 1]; | ||||||
|  |       y = v[p] -= MX; | ||||||
|  |     } | ||||||
|  |     z = v[n - 1]; | ||||||
|  |     y = v[0] -= MX; | ||||||
|  |     sum -= DELTA; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace xxtea | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										26
									
								
								esphome/components/xxtea/xxtea.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								esphome/components/xxtea/xxtea.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <cstdint> | ||||||
|  | #include <cstddef> | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace xxtea { | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Encrypt a block of data in-place using XXTEA algorithm with 256-bit key | ||||||
|  |  * @param v Data to encrypt (as array of 32-bit words) | ||||||
|  |  * @param n Number of 32-bit words in data | ||||||
|  |  * @param k Key (array of 8 32-bit words) | ||||||
|  |  */ | ||||||
|  | void encrypt(uint32_t *v, size_t n, const uint32_t *k); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Decrypt a block of data in-place using XXTEA algorithm with 256-bit key | ||||||
|  |  * @param v Data to decrypt (as array of 32-bit words) | ||||||
|  |  * @param n Number of 32-bit words in data | ||||||
|  |  * @param k Key (array of 8 32-bit words) | ||||||
|  |  */ | ||||||
|  | void decrypt(uint32_t *v, size_t n, const uint32_t *k); | ||||||
|  |  | ||||||
|  | }  // namespace xxtea | ||||||
|  | }  // namespace esphome | ||||||
		Reference in New Issue
	
	Block a user