blob: 4626536f0c015df18a25d9f0f9f7c331586707ce [file] [log] [blame]
/*
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#ifndef CRYPTO_TEMPLATE_LINE_HPP
#define CRYPTO_TEMPLATE_LINE_HPP
#include <cstdint>
/* This project's header files #including other project headers quickly becomes
unrealistically complicated. The only solution is for each .cpp to include
the headers it needs.
#include "psa_asset.hpp"
//class psa_asset; // just need a forward reference
#include "template_line.hpp"
#include "psa_call.hpp"
*/
using namespace std;
class set_policy_template_line : public policy_template_line
{
public:
// Data members:
// Methods:
void setup_call (set_data_info set_info, bool random_data,
bool fill_in_template, bool create_call,
template_line *temLin, tf_fuzz_info *rsrc) {
/* If the name of the primary asset is known, then add calls at
random, otherwise append to end. If not, then we do not know
what asset-name barrier to search for. */
bool add_to_end_bool = (random_asset != psa_asset_usage::all);
// Add the calls of interest:
define_call<init_policy_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_random_after_barrier, yes_set_barrier );
define_call<reset_policy_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_random_after_barrier, yes_set_barrier );
policy_info.usage_string.assign ("0"); // clear out all usages
define_call<set_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_random_after_barrier, yes_set_barrier );
if (policy_info.exportable) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_EXPORT");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
if (policy_info.copyable) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_COPY");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
if (policy_info.can_encrypt) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_ENCRYPT");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
if (policy_info.can_decrypt) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_DECRYPT");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
if (policy_info.can_sign) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_SIGN");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
if (policy_info.can_verify) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_VERIFY");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
if (policy_info.derivable) {
policy_info.usage_string.assign ("PSA_KEY_USAGE_DERIVE");
define_call<add_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
}
define_call<set_policy_lifetime_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
define_call<set_policy_algorithm_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
define_call<set_policy_type_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier );
define_call<set_policy_size_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier );
}
set_policy_template_line (tf_fuzz_info *resources); // (constructor)
~set_policy_template_line (void);
protected:
// Data members:
// Methods:
private:
// Data members:
// Methods:
};
class read_policy_template_line : public policy_template_line
{
public:
// Data members:
// Methods:
void setup_call (set_data_info set_info, bool random_data,
bool fill_in_template, bool create_call,
template_line *temLin, tf_fuzz_info *rsrc) {
/* If the name of the primary asset is known, then add calls at
random, otherwise append to end. If not, then we do not know
what asset-name barrier to search for. */
bool add_to_end_bool = (random_asset != psa_asset_usage::all);
if (policy_info.get_policy_from_key) {
define_call<get_key_policy_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, yes_set_barrier );
}
define_call<get_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, yes_set_barrier );
define_call<get_policy_lifetime_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
define_call<get_policy_algorithm_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
define_call<get_policy_type_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
define_call<get_policy_size_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end_bool, dont_set_barrier );
if (print_data) {
/* Printing data, so we need to read and filter usage for various
attributes, one by one: */
policy_info.print_usage_true_string.assign ("key can be exported.");
policy_info.print_usage_false_string.assign ("key cannot be exported.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_EXPORT");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, dont_set_barrier );
policy_info.print_usage_true_string.assign ("key can be copied.");
policy_info.print_usage_false_string.assign ("key cannot be copied.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_COPY");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, dont_set_barrier );
policy_info.print_usage_true_string.assign ("key works for encryption.");
policy_info.print_usage_false_string.assign ("key is not for encryption.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_ENCRYPT");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, dont_set_barrier );
policy_info.print_usage_true_string.assign ("key works for decyption.");
policy_info.print_usage_false_string.assign ("key is not for decyption.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_DECRYPT");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, dont_set_barrier );
policy_info.print_usage_true_string.assign ("key works for signing.");
policy_info.print_usage_false_string.assign ("key is not for signing.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_SIGN");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, dont_set_barrier );
policy_info.print_usage_true_string.assign ("key can be used to verify.");
policy_info.print_usage_false_string.assign ("key not for verify.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_VERIFY");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, dont_set_barrier );
policy_info.print_usage_true_string.assign ("key can derive other keys.");
policy_info.print_usage_false_string.assign ("key cannot derive other keys.");
policy_info.usage_string.assign ("PSA_KEY_USAGE_DERIVE");
define_call<print_policy_usage_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier );
}
}
read_policy_template_line (tf_fuzz_info *resources); // (constructor)
~read_policy_template_line (void);
protected:
// Data members:
// Methods:
private:
// Data members:
// Methods:
};
class set_key_template_line : public key_template_line
{
public:
// Data members:
// Methods:
void setup_call (set_data_info set_info, bool random_data,
bool fill_in_template, bool create_call,
template_line *temLin, tf_fuzz_info *rsrc) {
if (policy_info.copy_key) {
// Copying a key:
define_call<copy_key_call> (set_info, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier);
} else if (set_data.string_specified || set_data.random_data) {
// Key data (key material) supplied:
define_call<create_key_call> (set_info, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier);
} else {
// Generate from scratch:
define_call<generate_key_call> (set_info, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier);
}
}
set_key_template_line (tf_fuzz_info *resources); // (constructor)
~set_key_template_line (void);
protected:
// Data members:
// Methods:
private:
// Data members:
// Methods:
};
class read_key_template_line : public key_template_line
{
public:
// Data members:
// Methods:
void setup_call (set_data_info set_info, bool random_data,
bool fill_in_template, bool create_call,
template_line *temLin, tf_fuzz_info *rsrc) {
define_call<read_key_data_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier);
}
read_key_template_line (tf_fuzz_info *resources); // (constructor)
~read_key_template_line (void);
protected:
// Data members:
// Methods:
private:
// Data members:
// Methods:
};
class remove_key_template_line : public key_template_line
{
public:
// Data members:
// Methods:
void setup_call (set_data_info set_info, bool random_data,
bool fill_in_template, bool create_call,
template_line *temLin, tf_fuzz_info *rsrc) {
define_call<remove_key_call> (set_data, random_data,
fill_in_template, create_call, temLin, rsrc,
add_to_end, yes_set_barrier);
}
remove_key_template_line (tf_fuzz_info *resources); // (constructor)
~remove_key_template_line (void);
protected:
// Data members:
// Methods:
private:
// Data members:
// Methods:
};
#endif // #ifndef CRYPTO_TEMPLATE_LINE_HPP