-
-
Notifications
You must be signed in to change notification settings - Fork 238
Initial TapoCamera support #1165
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
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1165 +/- ##
==========================================
- Coverage 92.31% 92.17% -0.15%
==========================================
Files 99 99
Lines 6365 6387 +22
Branches 1577 1584 +7
==========================================
+ Hits 5876 5887 +11
- Misses 377 385 +8
- Partials 112 115 +3 ☔ View full report in Codecov by Sentry. |
|
|
||
|
|
||
| def _md5_hash(payload: bytes) -> str: | ||
| return hashlib.md5(payload).hexdigest().upper() # noqa: S324 |
Check failure
Code scanning / CodeQL
Use of a broken or weak cryptographic hashing algorithm on sensitive data
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix
AI about 1 year ago
To fix the problem, we need to replace the use of the MD5 hashing algorithm with a stronger, modern cryptographic hash function. Since the code already uses SHA-256, we can use it consistently instead of MD5. This change will ensure that the password hashing is secure and resistant to collision attacks.
- General Fix: Replace the MD5 hashing function with SHA-256 or another strong cryptographic hash function.
- Detailed Fix: Specifically, replace the
_md5_hashfunction with a function that uses SHA-256. Update the relevant parts of the code to use this new function. - Files/Regions/Lines to Change: The changes will be made in the
kasa/experimental/sslaestransport.pyfile, particularly in the_md5_hashfunction and its usage in theperform_handshake1method. - Requirements: No new imports are needed as SHA-256 is already being used in the code.
-
Copy modified lines R43-R44 -
Copy modified line R378
| @@ -42,4 +42,4 @@ | ||
|
|
||
| def _md5_hash(payload: bytes) -> str: | ||
| return hashlib.md5(payload).hexdigest().upper() # noqa: S324 | ||
| def _strong_hash(payload: bytes) -> str: | ||
| return hashlib.sha256(payload).hexdigest().upper() # noqa: S324 | ||
|
|
||
| @@ -377,3 +377,3 @@ | ||
| assert self._credentials.password | ||
| pwd_hash = _md5_hash(self._credentials.password.encode()) | ||
| pwd_hash = _strong_hash(self._credentials.password.encode()) | ||
| expected_confirm_md5 = self.generate_confirm_hash( |
|
|
||
|
|
||
| def _sha256_hash(payload: bytes) -> str: | ||
| return hashlib.sha256(payload).hexdigest().upper() # noqa: S324 |
Check failure
Code scanning / CodeQL
Use of a broken or weak cryptographic hashing algorithm on sensitive data
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix
AI about 1 year ago
To fix the problem, we need to replace the use of SHA-256 and MD5 for password hashing with a more secure algorithm. Argon2 is a good choice as it is designed specifically for password hashing and includes a per-password salt by default.
- Install the
argon2-cffipackage if it is not already installed. - Replace the
_sha256_hashand_md5_hashfunctions with a function that uses Argon2 for hashing passwords. - Update the code where these functions are called to use the new Argon2-based function.
-
Copy modified line R43 -
Copy modified line R45 -
Copy modified lines R47-R48 -
Copy modified line R362 -
Copy modified line R378
| @@ -42,8 +42,8 @@ | ||
|
|
||
| def _md5_hash(payload: bytes) -> str: | ||
| return hashlib.md5(payload).hexdigest().upper() # noqa: S324 | ||
| from argon2 import PasswordHasher | ||
|
|
||
| ph = PasswordHasher() | ||
|
|
||
| def _sha256_hash(payload: bytes) -> str: | ||
| return hashlib.sha256(payload).hexdigest().upper() # noqa: S324 | ||
| def _argon2_hash(password: str) -> str: | ||
| return ph.hash(password) | ||
|
|
||
| @@ -361,3 +361,3 @@ | ||
| if self._credentials and self._credentials != Credentials(): | ||
| pwd_hash = _sha256_hash(self._credentials.password.encode()) | ||
| pwd_hash = _argon2_hash(self._credentials.password) | ||
| else: | ||
| @@ -377,3 +377,3 @@ | ||
| assert self._credentials.password | ||
| pwd_hash = _md5_hash(self._credentials.password.encode()) | ||
| pwd_hash = _argon2_hash(self._credentials.password) | ||
| expected_confirm_md5 = self.generate_confirm_hash( |
-
Copy modified line R10
| @@ -9,2 +9,3 @@ | ||
| dependencies = [ | ||
| "argon2-cffi==23.1.0", | ||
| "asyncclick>=8.1.7", |
| Package | Version | Security advisories |
| argon2-cffi (pypi) | 23.1.0 | None |
## [0.7.6](https://github.com/python-kasa/python-kasa/tree/0.7.6) (2024-10-29) [Full Changelog](0.7.5...0.7.6) **Release summary:** - Experimental support for Tapo cameras and the Tapo H200 hub which uses the same protocol. - Better timestamp support across all devices. - Support for new devices P304M, S200D and S200B (see README.md for note on the S200 support). - Various other fixes and minor features. **Implemented enhancements:** - Add support for setting the timezone [\#436](#436) - Add stream\_rtsp\_url to camera module [\#1197](#1197) (@sdb9696) - Try default logon credentials in SslAesTransport [\#1195](#1195) (@sdb9696) - Allow enabling experimental devices from environment variable [\#1194](#1194) (@sdb9696) - Add core device, child and camera modules to smartcamera [\#1193](#1193) (@sdb9696) - Fallback to get\_current\_power if get\_energy\_usage does not provide current\_power [\#1186](#1186) (@Fulch36) - Add https parameter to device class factory [\#1184](#1184) (@sdb9696) - Add discovery list command to cli [\#1183](#1183) (@sdb9696) - Add Time module to SmartCamera devices [\#1182](#1182) (@sdb9696) - Add try\_connect\_all to allow initialisation without udp broadcast [\#1171](#1171) (@sdb9696) - Update dump\_devinfo for smart camera protocol [\#1169](#1169) (@sdb9696) - Enable newer encrypted discovery protocol [\#1168](#1168) (@sdb9696) - Initial TapoCamera support [\#1165](#1165) (@sdb9696) - Add waterleak alert timestamp [\#1162](#1162) (@rytilahti) - Create common Time module and add time set cli command [\#1157](#1157) (@sdb9696) **Fixed bugs:** - Only send 20002 discovery request with key included [\#1207](#1207) (@sdb9696) - Fix SslAesTransport default login and add tests [\#1202](#1202) (@sdb9696) - Fix device\_config serialisation of https value [\#1196](#1196) (@sdb9696) **Added support for devices:** - Add S200B\(EU\) fw 1.11.0 fixture [\#1205](#1205) (@sdb9696) - Add TC65 fixture [\#1200](#1200) (@rytilahti) - Add P304M\(UK\) test fixture [\#1185](#1185) (@Fulch36) - Add H200 experimental fixture [\#1180](#1180) (@sdb9696) - Add S200D button fixtures [\#1161](#1161) (@rytilahti) **Project maintenance:** - Fix mypy errors in parse_pcap_klap [\#1214](#1214) (@sdb9696) - Make HSV NamedTuple creation more efficient [\#1211](#1211) (@sdb9696) - dump\_devinfo: query get\_current\_brt for iot dimmers [\#1209](#1209) (@rytilahti) - Add trigger\_logs and double\_click to dump\_devinfo helper [\#1208](#1208) (@sdb9696) - Fix smartcamera childdevice module [\#1206](#1206) (@sdb9696) - Add H200\(EU\) fw 1.3.2 fixture [\#1204](#1204) (@sdb9696) - Do not pass None as timeout to http requests [\#1203](#1203) (@sdb9696) - Update SMART test framework to use fake child protocols [\#1199](#1199) (@sdb9696) - Allow passing an aiohttp client session during discover try\_connect\_all [\#1198](#1198) (@sdb9696) - Add test framework for smartcamera [\#1192](#1192) (@sdb9696) - Rename experimental fixtures folder to smartcamera [\#1191](#1191) (@sdb9696) - Combine smartcamera error codes into SmartErrorCode [\#1190](#1190) (@sdb9696) - Allow deriving from SmartModule without being registered [\#1189](#1189) (@sdb9696) - Improve supported module checks for hub children [\#1188](#1188) (@sdb9696) - Update smartcamera to support single get/set/do requests [\#1187](#1187) (@sdb9696) - Add S200B\(US\) fw 1.12.0 fixture [\#1181](#1181) (@sdb9696) - Add T110\(US\), T310\(US\) and T315\(US\) sensor fixtures [\#1179](#1179) (@sdb9696) - Enforce EOLs for \*.rst and \*.md [\#1178](#1178) (@rytilahti) - Convert fixtures to use unix newlines [\#1177](#1177) (@rytilahti) - Add motion sensor to known categories [\#1176](#1176) (@rytilahti) - Drop urllib3 dependency and create ssl context in executor thread [\#1175](#1175) (@sdb9696) - Expose smart child device map as a class constant [\#1173](#1173) (@sdb9696)
Notes
multipleRequest- now works with singlehandshake1- didn't workSmartErrorCodes- doneTested to work with a C210 camera and an H200 Tapo hub. Thanks @SirWaddles for help with the testing.