# 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 os import pytest from cryptography.hazmat.backends.interfaces import HashBackend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.x963kdf import X963KDF from ...doubles import DummyHashAlgorithm from ...utils import load_vectors_from_file, load_x963_vectors def _skip_hashfn_unsupported(backend, hashfn): if not backend.hash_supported(hashfn): pytest.skip( "Hash {} is not supported by this backend {}".format( hashfn.name, backend ) ) @pytest.mark.requires_backend_interface(interface=HashBackend) class TestX963(object): _algorithms_dict = { "SHA-1": hashes.SHA1, "SHA-224": hashes.SHA224, "SHA-256": hashes.SHA256, "SHA-384": hashes.SHA384, "SHA-512": hashes.SHA512, } @pytest.mark.parametrize( ("vector"), load_vectors_from_file( os.path.join("KDF", "ansx963_2001.txt"), load_x963_vectors ), ) def test_x963(self, backend, vector): hashfn = self._algorithms_dict[vector["hash"]] _skip_hashfn_unsupported(backend, hashfn()) key = binascii.unhexlify(vector["Z"]) sharedinfo = None if vector["sharedinfo_length"] != 0: sharedinfo = binascii.unhexlify(vector["sharedinfo"]) key_data_len = vector["key_data_length"] // 8 key_data = binascii.unhexlify(vector["key_data"]) xkdf = X963KDF( algorithm=hashfn(), length=key_data_len, sharedinfo=sharedinfo, backend=backend, ) xkdf.verify(key, key_data) def test_unsupported_hash(self, backend): with pytest.raises(pytest.skip.Exception): _skip_hashfn_unsupported(backend, DummyHashAlgorithm())