HMAC wrappers¶
Digest¶
Generates a MAC tag using HMAC.
Naming convention¶
CC_HMAC_digest_<hash function>
Where hash function is one of:
sha1,sha224,sha256,sha384,sha512.sha3_224,sha3_256,sha3_384,sha3_512.
Protocol¶
The function must conform to the following protocol:
- protocol crypto_condor.primitives.HMAC.Digest
Represents the HMAC digest operation.
Added in version 2025.03.12: Replaces
HMAC.digest().Classes that implement this protocol must have the following methods / attributes:
- __call__(key, msg)
Generates a MAC using HMAC.
- Parameters:
key (bytes) – The secret key.
msg (bytes) – The message to authenticate.
- Returns:
The MAC, in bytes.
- Return type:
bytes
Verify¶
Verifies an HMAC tag.
Naming convention¶
CC_HMAC_verify_<hash function>
Where hash function is one of:
sha1,sha224,sha256,sha384,sha512.sha3_224,sha3_256,sha3_384,sha3_512.
Protocol¶
The function must conform to the following protocol:
- protocol crypto_condor.primitives.HMAC.Verify
Represents the verification of an HMAC tag.
Some implementations may offer a
verifymethod, while others expect the user to generate a tag from the key and message, and compare it with the existing tag.Added in version 2025.03.12: Replaces
HMAC.verify().Classes that implement this protocol must have the following methods / attributes:
- __call__(key, msg, mac, mac_len)
Verifies a HMAC tag.
The size of the MAC is given to indicate that the tag may be truncated, therefore shorter than the digest size.
- Parameters:
key (bytes) – The secret key.
msg (bytes) – The message to authenticate.
mac (bytes) – The tag to verify.
mac_len (int) – The size of the MAC in bytes. Equal to len(mac).
- Returns:
True if the tags match, False otherwise.
- Return type:
bool
Example¶
"""HMAC wrapper example.
Uses Python's built-in ``hmac`` module.
To test this example:
crypto-condor-cli test wrapper HMAC hmac_wrapper_example.py
"""
import hmac
def CC_HMAC_digest_sha256(key: bytes, msg: bytes) -> bytes:
"""Tests HMAC-SHA-256 digest."""
return hmac.digest(key, msg, "sha256")
def CC_HMAC_digest_sha3_512(key: bytes, msg: bytes) -> bytes:
"""Tests HMAC-SHA3-512 digest."""
return hmac.digest(key, msg, "sha3_512")
def CC_HMAC_verify_sha256(key: bytes, msg: bytes, mac: bytes, mac_len: int) -> bool:
"""Tests HMAC-SHA-256 verify."""
_mac = hmac.digest(key, msg, "sha256")
# Some MACs are truncated, so we have to truncate ours to in order to compare them.
ref_mac = _mac[:mac_len]
return hmac.compare_digest(ref_mac, mac)
def CC_HMAC_verify_sha3_512(key: bytes, msg: bytes, mac: bytes, mac_len: int) -> bool:
"""Tests HMAC-SHA3-512 verify."""
_mac = hmac.digest(key, msg, "sha3_512")
# Some MACs are truncated, so we have to truncate ours to in order to compare them.
ref_mac = _mac[:mac_len]
return hmac.compare_digest(ref_mac, mac)