SHA¶
How to use the crypto_condor.primitives.SHA module to test implementations of the
SHA-1, SHA-2, and SHA-3 families of hash functions.
Supported parameters¶
The supported algorithms are defined by the Algorithm enum.
Implementations can be either bit- or byte-oriented. To select an orientation use the
Orientation enum.
- enum crypto_condor.primitives.SHA.Algorithm(value)¶
- Supported hash algorithms. - Member Type:
- str
 - Valid values are as follows: - SHA_1 = <Algorithm.SHA_1: 'SHA-1'>¶
 - SHA_224 = <Algorithm.SHA_224: 'SHA-224'>¶
 - SHA_256 = <Algorithm.SHA_256: 'SHA-256'>¶
 - SHA_384 = <Algorithm.SHA_384: 'SHA-384'>¶
 - SHA_512 = <Algorithm.SHA_512: 'SHA-512'>¶
 - SHA_512_224 = <Algorithm.SHA_512_224: 'SHA-512/224'>¶
 - SHA_512_256 = <Algorithm.SHA_512_256: 'SHA-512/256'>¶
 - SHA3_224 = <Algorithm.SHA3_224: 'SHA3-224'>¶
 - SHA3_256 = <Algorithm.SHA3_256: 'SHA3-256'>¶
 - SHA3_384 = <Algorithm.SHA3_384: 'SHA3-384'>¶
 - SHA3_512 = <Algorithm.SHA3_512: 'SHA3-512'>¶
 
Test an implementation directly¶
- crypto_condor.primitives.SHA.test(hash_function, hash_algorithm, orientation=Orientation.BYTE)¶
- Tests a SHA implementation. - Runs NIST test vectors on the given function. The function to test must conform to the - HashFunctionprotocol.- Parameters:
- hash_function (HashFunction) – The implementation to test. 
- hash_algorithm (Algorithm) – The hash algorithm implemented by - hash_function.
- orientation (Orientation) – The orientation of the implementation, either bit- or byte-oriented. 
 
- Returns:
- A - ResultsDictcontaining the results of short message (- short), long message (- long), and Monte-Carlo (- monte-carlo) tests.
- Return type:
 - Example - First import the SHA module. - >>> from crypto_condor.primitives import SHA - Let’s test PyCryptodome’s implementation of SHA-256. For this, we need to wrap the SHA256 class so it behaves like - HashFunction.- >>> from Crypto.Hash import SHA256 - >>> def my_sha256(data: bytes) -> bytes: ... return SHA256.new(data=data).digest() - We define the parameters to test. - >>> algorithm = SHA.Algorithm.SHA_256 >>> orientation = SHA.Orientation.BYTE - And call - test()on our function and selected parameters.- >>> results_dict = SHA.test(my_sha256, algorithm, orientation) [NIST] ... >>> assert results_dict.check() 
Test the output of an implementation¶
- crypto_condor.primitives.SHA.verify_file(filename, hash_algorithm)¶
- Verifies SHA hashes. - Tests hashes from a file. The file must follow the format described below. - Format:
- One set of arguments per line. 
- Lines are separated by newlines ( - \n).
- Lines that start with ‘#’ are counted as comments and ignored. 
- Arguments are written in hexadecimal and separated by slashes. 
- The order of arguments is: 
 - message/hash 
 - Parameters:
- filename (str) – Name of the file to test. 
- hash_algorithm (Algorithm) – Hash algorithm used to generate the hashes. 
 
- Returns:
- The results of hashing the message with the internal implementation and comparing with the expected output. 
- Return type:
 - Example - First import the SHA module. - >>> from crypto_condor.primitives import SHA - Let’s generate a file of random messages and their hash. - >>> import random >>> filename = "/tmp/crypto-condor-test/SHA-256-verify.txt" >>> algorithm = SHA.Algorithm.SHA_256 >>> with open(filename, "w") as file: ... for i in range(20): ... message = random.randbytes(64) ... digest = SHA._sha(algorithm, message) ... line = f"{message.hex()}/{digest.hex()}\n" ... _ = file.write(line) - We call - verify_file()on our test file.- >>> results = SHA.verify_file(filename, algorithm) Testing ... >>> assert results.check() 
Run a wrapper¶
Note
Available wrappers are defined by Wrapper.
- crypto_condor.primitives.SHA.run_wrapper(wrapper, hash_algorithm, orientation)¶
- Runs the corresponding wrapper. - Parameters:
- wrapper (Path) – The wrapper to test. 
- language – The language of the wrapper to run. 
- hash_algorithm (Algorithm) – The hash algorithm to test. 
- orientation (Orientation) – The orientation of the implementation, either bit- or byte-oriented. 
 
- Returns:
- A - ResultsDictcontaining the results of short message (- short), long message (- long), and Monte-Carlo (- monte-carlo) tests.
- Return type:
 
Protocols¶
- protocol crypto_condor.primitives.SHA.HashFunction¶
- Represents a hash function. - Hash functions must behave like - __call__to be tested with this module.- Classes that implement this protocol must have the following methods / attributes: - __call__(data)¶
- Hashes the given data. - Parameters:
- data (bytes) – The input data. 
- Returns:
- The resulting hash. 
- Return type:
- bytes