SHAKE wrappers¶
Digest¶
digest is a single operation equivalent to:
h = SHAKE.init()
h.update(some_data)
h.digest(length) # or h.finalize() or h.squeeze()
Naming convention¶
To test a function that implements digest, create a function with one of the
following names:
CC_SHAKE_128_digest
CC_SHAKE_256_digest
Protocol¶
The function must implement the following protocol:
- protocol crypto_condor.primitives.SHAKE.Xof
- Represents a XOF. - XOFs must behave like - __call__to be tested with this module.- Classes that implement this protocol must have the following methods / attributes: - __call__(data, output_length)
- Produces digests of any desired length. - Parameters:
- data (bytes) – The input data. 
- output_length (int) – The desired length of the digest in bytes. 
 
- Returns:
- The digest of the desired length. 
- Return type:
- bytes 
 
 
Example¶
We use PyCryptodome for the wrapper example:
"""Wrapper template for SHAKE implementations.
Usage:
    crypto-condor-cli test wrapper SHAKE shake_wrapper_example.py
"""
from Crypto.Hash import SHAKE128, SHAKE256
def CC_SHAKE_128_digest(data: bytes, output_length: int) -> bytes:
    """Hashes with SHAKE128."""
    return SHAKE128.new(data).read(output_length)
def CC_SHAKE_256_digest(data: bytes, output_length: int) -> bytes:
    """Hashes with SHAKE256."""
    return SHAKE256.new(data).read(output_length)