blob: 0cf908fe90c12965a54bb786f7a039119bebb4d9 [file] [log] [blame]
# 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"]))