Skip to content

Fix bugs in HMAC class initialization and digest computation #127204

@shashankrushiya

Description

@shashankrushiya

Feature or enhancement

Proposal: Fix bugs in HMAC class initialization and digest computation

Why it should be implemented:

The current implementation of the HMAC class, while functional, can be difficult to maintain and extend due to a few issues:

  1. Readability: The code is somewhat cluttered with redundant checks and complicated logic for handling different types of digest algorithms. Refactoring can make it cleaner and easier to understand.

  2. Error Handling: The class lacks proper error handling in certain areas, especially when dealing with unsupported digest algorithms or invalid input types. By introducing better error management, we can make the code more robust and user-friendly.

  3. Deprecation Warnings: Some parts of the code might use older methods or modules, which could result in deprecation warnings. Updating the code to comply with modern Python standards will prevent these warnings and ensure better compatibility with future versions of Python.

  4. Extensibility: With a clearer structure and better error handling, the class will be more easily extendable in the future, supporting additional hashing algorithms or other features as needed.

How it would be used:

After the proposed changes, the HMAC class would work similarly to the existing implementation but with improvements in clarity and error management. Here’s an example of how it would be used:

Example 1: Creating an HMAC Object
from hmac_module import HMAC

key = b"secret_key"
message = b"data to be hashed"
digestmod = 'sha256'  # or a custom hash function

hmac_object = HMAC(key, msg=message, digestmod=digestmod)
print(hmac_object.hexdigest())
Example 2: Error Handling

If an unsupported hash algorithm is provided, the class will raise a more informative error:

try:
    hmac_object = HMAC(key, msg=message, digestmod='unsupported_algorithm')
except ValueError as e:
    print(f"Error: {e}")
Example 3: Copying an HMAC Object

You can still create a separate copy of the HMAC object without affecting the original:

hmac_copy = hmac_object.copy()

This refactoring will ensure the code remains clean, maintainable, and less prone to errors, providing a better experience for developers working with the HMAC class.

Conclusion:

By refactoring the HMAC class, we enhance the readability, maintainability, and extensibility of the code. Better error handling ensures the code can gracefully handle unexpected scenarios, and modernizing the implementation will make it more compatible with future versions of Python. This change will make it easier for future developers to contribute to the codebase and prevent unnecessary bugs.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-featureA feature request or enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions