67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
# This file is dual licensed under the terms of the Apache License, Version
|
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
|
# for complete details.
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
|
|
import binascii
|
|
|
|
import pytest
|
|
|
|
from cryptography.exceptions import InvalidSignature
|
|
from cryptography.hazmat.primitives import hashes, hmac
|
|
|
|
|
|
_HMAC_ALGORITHMS = {
|
|
"HMACSHA1": hashes.SHA1(),
|
|
"HMACSHA224": hashes.SHA224(),
|
|
"HMACSHA256": hashes.SHA256(),
|
|
"HMACSHA384": hashes.SHA384(),
|
|
"HMACSHA512": hashes.SHA512(),
|
|
"HMACSHA3-224": hashes.SHA3_224(),
|
|
"HMACSHA3-256": hashes.SHA3_256(),
|
|
"HMACSHA3-384": hashes.SHA3_384(),
|
|
"HMACSHA3-512": hashes.SHA3_512(),
|
|
}
|
|
|
|
|
|
@pytest.mark.wycheproof_tests(
|
|
"hmac_sha1_test.json",
|
|
"hmac_sha224_test.json",
|
|
"hmac_sha256_test.json",
|
|
"hmac_sha384_test.json",
|
|
"hmac_sha3_224_test.json",
|
|
"hmac_sha3_256_test.json",
|
|
"hmac_sha3_384_test.json",
|
|
"hmac_sha3_512_test.json",
|
|
"hmac_sha512_test.json",
|
|
)
|
|
def test_hmac(backend, wycheproof):
|
|
hash_algo = _HMAC_ALGORITHMS[wycheproof.testfiledata["algorithm"]]
|
|
if wycheproof.testgroup["tagSize"] // 8 != hash_algo.digest_size:
|
|
pytest.skip("Truncated HMAC not supported")
|
|
if not backend.hash_supported(hash_algo):
|
|
pytest.skip("Hash {} not supported".format(hash_algo.name))
|
|
|
|
h = hmac.HMAC(
|
|
key=binascii.unhexlify(wycheproof.testcase["key"]),
|
|
algorithm=hash_algo,
|
|
backend=backend,
|
|
)
|
|
h.update(binascii.unhexlify(wycheproof.testcase["msg"]))
|
|
|
|
if wycheproof.invalid:
|
|
with pytest.raises(InvalidSignature):
|
|
h.verify(binascii.unhexlify(wycheproof.testcase["tag"]))
|
|
else:
|
|
tag = h.finalize()
|
|
assert tag == binascii.unhexlify(wycheproof.testcase["tag"])
|
|
|
|
h = hmac.HMAC(
|
|
key=binascii.unhexlify(wycheproof.testcase["key"]),
|
|
algorithm=hash_algo,
|
|
backend=backend,
|
|
)
|
|
h.update(binascii.unhexlify(wycheproof.testcase["msg"]))
|
|
h.verify(binascii.unhexlify(wycheproof.testcase["tag"]))
|