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/randomization.cpp b/tf_fuzz/utility/randomization.cpp
new file mode 100644
index 0000000..23eb7d2
--- /dev/null
+++ b/tf_fuzz/utility/randomization.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+/**********************************************************************************
+   Functions in this file are exactly that:  functions, not methods of any class.
+   That is, they are stand-alone, utility functions linked in to the executable,
+   and available to whomever needs them.
+**********************************************************************************/
+
+#include "randomization.hpp"
+
+/**
+ * \brief Selects and returns a random key_usage_t value.
+ *
+ * \details
+ *
+ * \note
+ *
+ */
+string rand_key_usage (void)
+{
+    switch (rand() % 6) {
+        case 0:  return "PSA_KEY_USAGE_EXPORT";
+        case 1:  return "PSA_KEY_USAGE_ENCRYPT";
+        case 2:  return "PSA_KEY_USAGE_DECRYPT";
+        case 3:  return "PSA_KEY_USAGE_SIGN";
+        case 4:  return "PSA_KEY_USAGE_VERIFY";
+        case 5:  return "PSA_KEY_USAGE_DERIVE";
+    }
+    return "";  /* placate compiler */
+}
+
+/**
+ * \brief Selects and returns a random psa_algorithm_t value.
+ *
+ * \details
+ *
+ * \note
+ *
+ */
+/* TODO:  Likely want to make additional versions of these specific for TLS,
+   asymmetric, symmetric... */
+string rand_key_algorithm (void)
+{
+    switch (rand() % 44) {
+        case  0:  return "PSA_ALG_VENDOR_FLAG";
+        case  1:  return "PSA_ALG_CATEGORY_MASK";
+        case  2:  return "PSA_ALG_CATEGORY_HASH";
+        case  3:  return "PSA_ALG_CATEGORY_MAC";
+        case  4:  return "PSA_ALG_CATEGORY_CIPHER";
+        case  5:  return "PSA_ALG_CATEGORY_AEAD";
+        case  6:  return "PSA_ALG_CATEGORY_SIGN";
+        case  7:  return "PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION";
+        case  8:  return "PSA_ALG_CATEGORY_KEY_AGREEMENT";
+        case  9:  return "PSA_ALG_CATEGORY_KEY_DERIVATION";
+        case 10:  return "PSA_ALG_HASH_MASK";
+        case 11:  return "PSA_ALG_MD2";
+        case 12:  return "PSA_ALG_MD4";
+        case 13:  return "PSA_ALG_MD5";
+        case 14:  return "PSA_ALG_RIPEMD160";
+        case 15:  return "PSA_ALG_SHA_1";
+        case 16:  return "PSA_ALG_SHA_224";
+        case 17:  return "PSA_ALG_SHA_256";
+        case 18:  return "PSA_ALG_SHA_384";
+        case 19:  return "PSA_ALG_SHA_512";
+        case 20:  return "PSA_ALG_SHA_512_224";
+        case 21:  return "PSA_ALG_SHA_512_256";
+        case 22:  return "PSA_ALG_SHA3_224";
+        case 23:  return "PSA_ALG_SHA3_256";
+        case 24:  return "PSA_ALG_SHA3_384";
+        case 25:  return "PSA_ALG_SHA3_512";
+        case 26:  return "PSA_ALG_ANY_HASH";
+        case 27:  return "PSA_ALG_MAC_SUBCATEGORY_MASK";
+        case 28:  return "PSA_ALG_HMAC_BASE";
+        case 29:  return "PSA_ALG_MAC_TRUNCATION_MASK";
+        case 30:  return "PSA_ALG_CIPHER_MAC_BASE";
+        case 31:  return "PSA_ALG_CBC_MAC";
+        case 32:  return "PSA_ALG_CMAC";
+        case 33:  return "PSA_ALG_CIPHER_STREAM_FLAG";
+        case 34:  return "PSA_ALG_CIPHER_FROM_BLOCK_FLAG";
+        case 35:  return "PSA_ALG_ARC4";
+        case 36:  return "PSA_ALG_CTR";
+        case 37:  return "PSA_ALG_CFB";
+        case 38:  return "PSA_ALG_OFB";
+        case 39:  return "PSA_ALG_XTS";
+        case 40:  return "PSA_ALG_CBC_NO_PADDING";
+        case 41:  return "PSA_ALG_CBC_PKCS7";
+        case 42:  return "PSA_ALG_CCM";
+        case 43:  return "PSA_ALG_GCM";
+    }
+    return "";  /* placate compiler */
+}
+
+
+/**
+ * \brief Selects and returns a random psa_key_type_t value.
+ *
+ * \details
+ *
+ * \note
+ *
+ */
+string rand_key_type (void)
+{
+    switch (rand() % 24) {
+        case 0:  return "PSA_KEY_TYPE_NONE";
+        case 1:  return "PSA_KEY_TYPE_VENDOR_FLAG";
+        case 2:  return "PSA_KEY_TYPE_CATEGORY_MASK";
+        case 3:  return "PSA_KEY_TYPE_CATEGORY_SYMMETRIC";
+        case 4:  return "PSA_KEY_TYPE_CATEGORY_RAW";
+        case 5:  return "PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY";
+        case 6:  return "PSA_KEY_TYPE_CATEGORY_KEY_PAIR";
+        case 7:  return "PSA_KEY_TYPE_CATEGORY_FLAG_PAIR";
+        case 8:  return "PSA_KEY_TYPE_RAW_DATA";
+        case 9:  return "PSA_KEY_TYPE_HMAC";
+        case 10:  return "PSA_KEY_TYPE_DERIVE";
+        case 11:  return "PSA_KEY_TYPE_AES";
+        case 12:  return "PSA_KEY_TYPE_DES";
+        case 13:  return "PSA_KEY_TYPE_CAMELLIA";
+        case 14:  return "PSA_KEY_TYPE_ARC4";
+        case 15:  return "PSA_KEY_TYPE_CHACHA20";
+        case 16:  return "PSA_KEY_TYPE_RSA_PUBLIC_KEY";
+        case 17:  return "PSA_KEY_TYPE_RSA_KEY_PAIR";
+        case 18:  return "PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE";
+        case 19:  return "PSA_KEY_TYPE_ECC_KEY_PAIR_BASE";
+        case 20:  return "PSA_KEY_TYPE_ECC_CURVE_MASK";
+        case 21:  return "PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE";
+        case 22:  return "PSA_KEY_TYPE_DH_KEY_PAIR_BASE";
+        case 23:  return "PSA_KEY_TYPE_DH_GROUP_MASK";
+        default:  return "";
+    }
+    return "";  /* placate compiler */
+}
+
+
+