def _test_manifest()

in features/0003-awses-message-encryption-generate.py [0:0]


def _test_manifest(keys_filename, manifest):
    """Test that the manifest is actually complete.

    :param str keys_file: Name of file containing the keys manifest
    :param dict manifest: Full message encrypt manifest to test
    """
    with open(keys_filename, "r") as keys_file:
        keys = json.load(keys_file)

    aes_key_count = len(list(_keys_for_algorithm("aes", keys)))
    black_hole_aes_key_count = len([value for value in list(_keys_for_algorithm("aes", keys)) if value in list(_keys_for_decryptval(False, keys))])
    aes_key_combination_count = (aes_key_count-black_hole_aes_key_count+((aes_key_count-black_hole_aes_key_count)*black_hole_aes_key_count))

    cycleable_rsa_key_count = 0
    black_hole_rsa_key_count = 0
    for _name, rsa_key in _keys_for_algorithm("rsa", keys):
        if rsa_key["encrypt"]:
            if rsa_key["decrypt"]:
                cycleable_rsa_key_count += 1
            else:
                black_hole_rsa_key_count += 1

    cycleable_rsa_combination_count = cycleable_rsa_key_count * len(
        RAW_RSA_PADDING_ALGORITHMS
    )
    black_hole_rsa_combination_count = (
        cycleable_rsa_combination_count * black_hole_rsa_key_count
    )
    rsa_key_combination_count = (
        cycleable_rsa_combination_count + black_hole_rsa_combination_count
    )

    kms_key_count = len(list(_keys_for_type("aws-kms", keys)))
    black_hole_kms_key_count = len([value for value in list(_keys_for_type("aws-kms", keys)) if value in list(_keys_for_decryptval(False, keys))])
    kms_key_combination_count = (kms_key_count-black_hole_kms_key_count+((kms_key_count-black_hole_kms_key_count)*black_hole_kms_key_count))

    aes_test_count = len(list(_tests_for_algorithm("aes", manifest)))
    rsa_test_count = len(list(_tests_for_algorithm("rsa", manifest)))
    kms_test_count = len(list(_tests_for_type("aws-kms", manifest)))

    iterations = len(ALGORITHM_SUITES) * len(FRAME_SIZES) * len(ENCRYPTION_CONTEXTS)
    expected_aes_test_count = aes_key_combination_count * iterations
    expected_rsa_test_count = rsa_key_combination_count * iterations
    expected_kms_test_count = kms_key_combination_count * iterations

    if not all(
        [
            0 < expected_aes_test_count == aes_test_count,
            0 < expected_rsa_test_count == rsa_test_count,
            0 < expected_kms_test_count == kms_test_count,
        ]
    ):
        raise ValueError(
            "Unexpected test count: \nAES: {aes}\nRSA: {rsa}\nAWS-KMS: {kms}".format(
                aes="Expected: {expected} Actual: {actual}".format(
                    expected=expected_aes_test_count, actual=aes_test_count
                ),
                rsa="Expected: {expected} Actual: {actual}".format(
                    expected=expected_rsa_test_count, actual=rsa_test_count
                ),
                kms="Expected: {expected} Actual: {actual}".format(
                    expected=expected_kms_test_count, actual=kms_test_count
                ),
            )
        )