diff --git a/tf_fuzz/tfz-cpp/utility/data_blocks.cpp b/tf_fuzz/tfz-cpp/utility/data_blocks.cpp
index 21b7f50..5683b06 100644
--- a/tf_fuzz/tfz-cpp/utility/data_blocks.cpp
+++ b/tf_fuzz/tfz-cpp/utility/data_blocks.cpp
@@ -9,6 +9,7 @@
    associated methods (most importantly their constructors) used in template_
    line, psa_call, psa_asset (etc.). */
 
+#include <stdexcept>
 #include <stdlib.h>
 #include <string>
 #include <vector>
@@ -28,62 +29,97 @@
 
 expect_info::expect_info (void)  // (default constructor)
 {
-    pf_nothing = false;  // by default, TF-Fuzz provides expected results
-    pf_pass = pf_fail = pf_specified = false;
-    pf_result_string.assign ("");  data.assign ("");
-    data_var_specified = false;
+    result_code_checking_enabled_f = true;
+    return_code_result_string.assign ("");
+
+    expected_return_code = expected_return_code_t::DontKnow;
+
+    data.assign ("");
     data_var.assign ("");  // name of expected-data variable
+
+    data_var_specified = false;
     data_specified = false;
     data_matches_asset = false;
-    data.assign ("");
-    pf_info_incomplete = true;
     n_exp_vars = -1;  // so the first reference is 0 (no suffix), then _1, _2, ...
-    expected_results_saved = false;
 }
+
 expect_info::~expect_info (void)  // (destructor)
 {}
 
-void expect_info::set_pf_pass (void)
-{
-    pf_pass = true;
-    pf_fail = pf_nothing = pf_specified = false;
-    pf_result_string = "";
+bool expect_info::simulation_needed(void) {
+  if (result_code_checking_enabled_f &&
+      expected_return_code == expected_return_code_t::DontKnow) {
+    return true;
+  }
+
+    return false;
 }
 
-void expect_info::set_pf_fail (void)
+void expect_info::expect_pass (void)
 {
-    pf_fail = true;
-    pf_pass = pf_nothing = pf_specified = false;
-    pf_result_string = "";
+    expected_return_code  = expected_return_code_t::Pass;
+    return_code_result_string = "";
 }
 
-void expect_info::set_pf_nothing (void)
+void expect_info::expect_failure(void)
 {
-    pf_nothing = true;
-    pf_fail = pf_pass = pf_specified = false;
-    pf_result_string = "";
+    expected_return_code  = expected_return_code_t::Fail;
+    return_code_result_string = "";
 }
 
-void expect_info::set_pf_error (string error)
+void expect_info::expect_error_code (string error)
 {
-    pf_specified = true;
-    pf_result_string.assign (error);  // just default "guess," to be filled in
-    pf_pass = pf_fail = pf_nothing = false;
+    expected_return_code = expected_return_code_t::SpecificFail;
+    return_code_result_string = error;
 }
 
-/* The expected pass/fail results are not available from the parser until the call has
-   already been created.  The flag, pf_info_incomplete, that indicates whether or not
-   the "expects" information has been filled in.  If not, fill it in from the template,
-   once that info has been parsed. */
+
+void expect_info::clear_expected_code (void)
+{
+    expected_return_code = expected_return_code_t::DontKnow;
+}
+
+expected_return_code_t expect_info::get_expected_return_code(void) {
+
+    // NOTE: we do not store DontCare in expected_return_code, as this would erase
+    // the value stored prior to checks being disabled. This way, when
+    // enable_result_code_checking is called, it can use the value given by the
+    // user previously.
+    // ..
+    // Despite this, having DontCare as a value is still useful: it allows user
+    // code that uses expected return codes to just be a switch statement.
+
+    if (result_code_checking_enabled_f) {
+        return expected_return_code;
+    }
+
+    return expected_return_code_t::DontCare;
+}
+
+string expect_info::get_expected_return_code_string(void) {
+    if (result_code_checking_enabled_f && expected_return_code == expected_return_code_t::SpecificFail) {
+        return return_code_result_string;
+    }
+    throw std::logic_error("get_expected_return_code_string called when return code is not SpecificFail");
+}
+
+void expect_info::disable_result_code_checking (void)
+{
+    result_code_checking_enabled_f = false;
+}
+
+void expect_info::enable_result_code_checking (void)
+{
+    result_code_checking_enabled_f = true;
+}
+
+bool expect_info::result_code_checking_enabled (void) {
+    return result_code_checking_enabled_f;
+}
+
 void expect_info::copy_expect_to_call (psa_call *the_call)
 {
-    the_call->exp_data.pf_nothing = pf_nothing;
-    the_call->exp_data.pf_pass = pf_pass;
-    the_call->exp_data.pf_fail = pf_fail;
-    the_call->exp_data.pf_specified = pf_specified;
-    the_call->exp_data.pf_result_string = pf_result_string;
-    the_call->exp_data.expected_results_saved = true;
-    the_call->exp_data.pf_info_incomplete = false;
+    the_call->exp_data = *this;
 }
 
 /**********************************************************************************
@@ -181,7 +217,7 @@
     random_data = true;
     literal_data_not_file = true;
     rand_data_length = 40 + (rand() % 256);
-        /* Note:  Multiple assets do get different random data */
+    /* Note:  Multiple assets do get different random data */
     gib.sentence (gib_buff, gib_buff + rand_data_length - 1);
     data = gib_buff;
 }
@@ -303,7 +339,7 @@
             break;
         default:
             cerr << "\nError:  Tool-internal:  Please report error "
-                 << "#1223 to the TF-Fuzz developers." << endl;
+                << "#1223 to the TF-Fuzz developers." << endl;
             exit(1223);
     }
     result.append(to_string(id_n));
diff --git a/tf_fuzz/tfz-cpp/utility/data_blocks.hpp b/tf_fuzz/tfz-cpp/utility/data_blocks.hpp
index 1e56836..9f6cfc2 100644
--- a/tf_fuzz/tfz-cpp/utility/data_blocks.hpp
+++ b/tf_fuzz/tfz-cpp/utility/data_blocks.hpp
@@ -8,7 +8,6 @@
 #include <stdint.h>
 #include <string>
 #include <vector>
-#include <iosfwd>
 
 class psa_asset;
 
@@ -26,62 +25,99 @@
 
 using namespace std;
 
+/// Possible values of return codes.
+///
+/// Intended to be used primarily through [expect_info]
+enum class expected_return_code_t {
+    /// This call should pass.
+    Pass,
+    /// This call should fail.
+    Fail,
+    /// This call should return a specific error code.
+    SpecificFail,
 
-/**********************************************************************************
-  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.
-**********************************************************************************/
+    /// The outcome of this call is unknown and should be simulated.
+    DontKnow,
 
+    /// the return code does not matter, and checks for this should not take
+    /// place.
+    DontCare,
+};
+
+/**
+ * expect_info is all about expected data and expected pass / fail information.
+ *
+ * The possible types of expected values returned from a PSA call are modelled
+ * in [expected_return_codes].
+ *
+ * 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 "expect <ERROR_CODE>" was 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 */
+    // (literal expected data specified)
+    bool data_specified;
+
+    string data;     // what test template expects data from reading an asset to be
+    string data_var; // name of variable containing expected data
+    int n_exp_vars;  // how many check-value variables have been created
+    bool data_var_specified;  // check against a variable
+
+    /* 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. */
+    bool expected_results_saved;
+
+    expect_info (void);  // (default constructor)
+    ~expect_info (void);  // (destructor)
+
+    /// Is simulation of the return code needed?
+    bool simulation_needed(void);
+
+    /// Sets the expected return code of the call to a pass.
+    void expect_pass (void);
+
+    /// Sets the expected return code of the call to a failure.
+    void expect_failure (void);
+
+    /// Sets the expected return code of the call to a specific error code.
+    void expect_error_code (string error);
+
+    /// Sets the expected return code of the call to "don't know".
+    ///
+    /// This will cause TF_Fuzz to later simulate this value.
+    void clear_expected_code(void);
+
+    /// Gets the expected return code.
+    expected_return_code_t get_expected_return_code(void);
+
+    /// When a specified error code is given, get that error code as a string.
+    /// When any other return code is expected, std::logic_error is thrown.
+    string get_expected_return_code_string(void);
+
+    void disable_result_code_checking (void);
+    void enable_result_code_checking (void);
+    bool result_code_checking_enabled(void);
+
+    void copy_expect_to_call (psa_call *the_call);
+
+private:
+    /* true if template specifies expected data, and that expected data
+       agrees with that in the asset */
+    bool data_matches_asset;
+    string return_code_result_string;
+
+    // The type of return code expected.
+    expected_return_code_t expected_return_code;
+
+    // if false, the return code does not matter, and checks for this should not
+    // take place.
+    bool result_code_checking_enabled_f;
 };
 
 
@@ -96,31 +132,31 @@
 {
 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
+    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);
+    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.
+    string data;  // String describing asset data.
     // Methods:
-        string rand_creation_flags (void);
+    string rand_creation_flags (void);
 };
 
 
@@ -133,37 +169,37 @@
 {
 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
-            /* Note:  The original theory is that we can't save away iterators to
+    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
+    /* Note:  The original theory is that we can't save away iterators to
                       assets, because STL vectors could get relocated.  However,
                       we've switched over to lists, which don't get moved around, so
                       we should be safe now. */
-        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
+    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
+    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
+    string asset_name;  // parsed from template, assigned to psa_asset object
 };
 
 
@@ -176,56 +212,56 @@
 {
 public:
     // Data members:
-        // Digested info:
-        bool get_policy_from_key;
-            /* if true, then we must get policy info from a stated key;  the asset
+    // 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
+    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 verifying 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
+    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 verifying 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
+    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
+    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
+    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)
+    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
+    bool data_matches_asset;
+    /* true if template specifies expected data, and that expected data
                agrees with that in the asset */
 };
 
