Add tf_fuzz tool
This is fully derived from tf-m repo.
Signed-off-by: Karl Zhang <karl.zhang@arm.com>
Change-Id: I8d35e70eda9081af66d8fa3f3cb4beb1d953060e
diff --git a/tf_fuzz/utility/data_blocks.hpp b/tf_fuzz/utility/data_blocks.hpp
new file mode 100644
index 0000000..f4628a5
--- /dev/null
+++ b/tf_fuzz/utility/data_blocks.hpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include <string>
+
+/* These classes "cut down the clutter" by grouping together related data and
+ associated methods (most importantly their constructors) used in template_
+ line, psa_call, psa_asset (etc.). */
+
+#ifndef DATA_BLOCKS_HPP
+#define DATA_BLOCKS_HPP
+
+/* 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. However these in particular are mostly axiomatic: Not
+ dependent upon other classes. */
+
+
+using namespace std;
+
+
+/**********************************************************************************
+ Class expect_info is all about expected data and expected pass/fail information.
+ The members are therefore broken down with prefixes pf_ (for pass/fail) or
+ data_. Pass/fail, is broadly:
+ * "Pass" == the test passes
+ * "Specified" == some specified failure (e.g., no such asset)
+ * "Nothing" == no expectation
+ Expected data refers to psa-asset data values, generally after reading them.
+ Currently, they are limited to character strings, but that will probably be
+ generalized in the future.
+**********************************************************************************/
+
+class expect_info
+{
+public:
+ // Data members:
+ // Expected-result info:
+ bool pf_nothing; // true to not generate results-check(s)
+ bool pf_pass; // if !expect.pf_nothing, then pass is expected
+ bool pf_fail; // if "expect fail" was specified
+ bool pf_specified;
+ /* if !pf_nothing && !pf_pass, then
+ true == expected result was specified
+ false == tf_fuzz must model expected result, and
+ pf_result_string is the expected result */
+ string pf_result_string;
+ bool data_specified; // (literal expected data specified)
+ string data; // what test template expects data from reading an asset to be
+ int n_exp_vars; // how many check-value variables have been created
+ bool data_var_specified; // check against a variable
+ string data_var; // name of variable containing expected data
+ bool pf_info_incomplete;
+ /* In parsing the template, the expect information comes later than the
+ rest of the call info. This flag tells us to fill in the pass/fail
+ expect info when it comes available. */
+ bool expected_results_saved;
+ /* This indicates whether expected results have or have not already been
+ copied to this call. It's a "one-shot," so to speak, to copy only
+ once when results are known good. Since calls can be inserted into
+ earlier points in the call sequence (not always appended), the call
+ sequence has to be gone over for this process multiple times. */
+ // Methods:
+ expect_info (void); // (default constructor)
+ ~expect_info (void); // (destructor)
+ void set_pf_pass (void);
+ void set_pf_fail (void);
+ void set_pf_nothing (void);
+ void set_pf_error (string error);
+ void copy_expect_to_call (psa_call *the_call);
+
+protected:
+ // Data members:
+ bool data_matches_asset;
+ /* true if template specifies expected data, and that expected data
+ agrees with that in the asset */
+};
+
+
+/**********************************************************************************
+ Class set_data_info addresses PSA-asset data values as affected, directly or
+ indirctly/implicitly, by the template-line content. "Directly," that is, by
+ virtue of the template line stating verbatim what to set data to, or indirectly
+ by virtue of telling TF-Fuzz to create random data for it.
+**********************************************************************************/
+
+class set_data_info
+{
+public:
+ // Data members:
+ bool string_specified;
+ // true if a string of data is specified in template file
+ bool random_data; // true to generate random data for the asset
+ bool file_specified; // true if a file of expected data was specified
+ bool literal_data_not_file;
+ // true to use data strings rather than files as data source
+ int n_set_vars; // how many implicit set variables have been created
+ string file_path; // path to file, if specified
+ string flags_string;
+ // creation flags, nominally for SST but have to be in a vector of base-class
+ uint32_t data_offset; // offset into asset data
+ // Methods:
+ set_data_info (void); // (default constructor)
+ ~set_data_info (void); // (destructor)
+ void set (string set_val);
+ void set_calculated (string set_val);
+ void randomize (void);
+ string get (void);
+ bool set_file (string file_name);
+
+protected:
+ // Data members:
+ string data; // String describing asset data.
+ // Methods:
+ string rand_creation_flags (void);
+};
+
+
+/**********************************************************************************
+ Class asset_name_id_info groups together and acts upon all information related to the
+ human names (as reflected in the code variable names, etc.) for PSA assets.
+**********************************************************************************/
+
+class asset_name_id_info
+{
+public:
+ // Data members (not much value in "hiding" these behind getters)
+ psa_asset *the_asset;
+ psa_asset_type asset_type; // SST vs. key vs. policy (etc.)
+ bool id_n_not_name; // true to create a PSA asset by ID
+ bool name_specified; // true iff template supplied human name
+ bool id_n_specified; // true iff template supplied ID #
+ vector<string> asset_name_vector;
+ vector<int> asset_id_n_vector;
+ long asset_ser_no; // unique ID for psa asset needed to find data string
+ asset_search how_asset_found;
+ uint64_t id_n; // asset ID# (e.g., SST UID).
+ /* Note: This is just a holder to pass ID from template-line to call. The
+ IDs for a given template line are in asset_info.asset_id_n_vector. */
+ // Methods:
+ asset_name_id_info (void); // (default constructor)
+ ~asset_name_id_info (void); // (destructor)
+ void set_name (string set_val);
+ void set_calc_name (string set_val);
+ void set_just_name (string set_val);
+ string get_name (void);
+ void set_id_n (string set_val);
+ void set_id_n (uint64_t set_val);
+ string make_id_n_based_name (uint64_t id_n);
+ // create UID-based asset name
+
+protected:
+ // Data members:
+ string asset_name; // parsed from template, assigned to psa_asset object
+};
+
+
+/**********************************************************************************
+ Class key_policy_info collects together the aspects of a Crypto key attributes
+ ("policies"). These include aspects that can affect TF-Fuzz's test-generation.
+**********************************************************************************/
+
+class key_policy_info
+{
+public:
+ // Data members:
+ // Digested info:
+ bool get_policy_from_key;
+ /* if true, then we must get policy info from a stated key; the asset
+ here is a key that uses the policy, and not the policy itself. */
+ bool implicit_policy;
+ /* if true, then the key was defined with policy specifications, but not
+ a named policy, meaning that we have to create an implicit policy. */
+ bool copy_key; // true to indicate copying one key to another
+ bool exportable; // key data can be exported (viewed - fail exports if not).
+ bool copyable; // can be copied (fail key-copies if not).
+ bool can_encrypt; // OK for encryption (fail other uses).
+ bool can_decrypt; // OK for decryption (fail other uses).
+ bool can_sign; // OK for signing (fail other operations).
+ bool can_verify; // OK for verifing a message signature (fail other uses).
+ bool derivable; // OK for derive other keys (fail other uses).
+ bool persistent; // must be deleted at the end of test.
+ string usage_string;
+ /* This string is set to a PSA_KEY_USAGE_* value in the template
+ immediately prior to making define_call<add_policy_usage_call>.
+ The copy_template_to_call() therein sets the corresponding string
+ in the call, and that is copied into the code in the fill_in_command()
+ invocation. */
+ string print_usage_true_string;
+ /* For printing out policy usage, this states how to describe the usage
+ if it can be used this way. This is managed similarly with, and used
+ in conjunction with usage_string above. NOTE: THIS ALSO SERVES AS AN
+ INDICATOR WHETHER OR NOT TO PRINT ON A GET-USAGE CALL. "" means not
+ to print. */
+ string print_usage_false_string;
+ /* Also for printing out policy usage, this is how to describe usage if
+ it cannot be used this way. */
+ string key_type; // AES, DES, RSA pair, DS public, etc.
+ string key_algorithm;
+ int n_bits;
+ // for get_key_info call (possibly others) exected key size in bits
+ string handle_str; // the text name of the key's "handle"
+ string key_data; // the key data as best we can know it.
+ string asset_2_name;
+ // if there's a 2nd asset, such as policy on key call, this is its name
+ string asset_3_name; // if there's a 3rd asset, then this is its name
+
+ // Methods:
+ key_policy_info (void); // (default constructor)
+ ~key_policy_info (void); // (destructor)
+
+
+protected:
+ // Data members:
+ bool data_matches_asset;
+ /* true if template specifies expected data, and that expected data
+ agrees with that in the asset */
+};
+
+
+
+#endif // DATA_BLOCKS_HPP
+