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/parser/tf_fuzz_grammar.l b/tf_fuzz/parser/tf_fuzz_grammar.l
new file mode 100644
index 0000000..429e60c
--- /dev/null
+++ b/tf_fuzz/parser/tf_fuzz_grammar.l
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+
+%{
+#include "class_forwards.hpp"
+#include "boilerplate.hpp"
+#include "gibberish.hpp"
+#include "compute.hpp"
+#include "string_ops.hpp"
+#include "data_blocks.hpp"
+#include "psa_asset.hpp"
+#include "sst_asset.hpp"
+#include "crypto_asset.hpp"
+#include "find_or_create_asset.hpp"
+#include "template_line.hpp"
+#include "tf_fuzz.hpp"
+#include "psa_call.hpp"
+#include "tf_fuzz_grammar.tab.hpp"
+
+int yycolumn = 1;
+
+//char *yytext;
+
+#define YY_USER_ACTION yylloc.first_line = yylloc.last_line = yylineno; \
+ yylloc.first_column = yycolumn; yylloc.last_column = yycolumn + yyleng - 1; \
+ yycolumn += yyleng; \
+ yylval.str = strdup(yytext);
+
+void yyerror (tf_fuzz_info *, const char *str)
+ /* not sure why it sends the yyparse() argument to yyerror(), but OK... */
+{
+ fprintf (stderr, "tf_fuzz template on line %d, at text = \"%s\": %s\n",
+ yylineno, yytext, str);
+ exit (1);
+}
+
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+%}
+
+%x BLOCK_COMMENT
+
+%option yylineno
+%option nodefault
+%option noyywrap
+%array
+
+%%
+
+\r ; /* ignore all \r */
+\/\/.*\n ; /* ignore C++-style line comments */
+purpose[ \t]+[^;]*; return PURPOSE;
+"/*" {BEGIN(BLOCK_COMMENT);}
+<BLOCK_COMMENT>"*/" {BEGIN(INITIAL);}
+<BLOCK_COMMENT>\n ;
+<BLOCK_COMMENT>. ;
+ /* Root commands: */
+set return SET;
+read return READ;
+remove return REMOVE;
+rm return REMOVE;
+secure return SECURE;
+sec return SECURE;
+done return DONE;
+ /* PSA-asset types: */
+sst return SST;
+key return KEY;
+policy return POLICY;
+ /* Other root-command operands: */
+expect return EXPECT;
+exp return EXPECT;
+pass return PASS;
+fail return FAIL;
+nothing return NOTHING;
+error return ERROR;
+\{ return OPEN_BRACE;
+\} return CLOSE_BRACE;
+; return SEMICOLON;
+name return NAME;
+uid return UID;
+data return DATA;
+\* return STAR;
+active return ACTIVE;
+act return ACTIVE;
+deleted return DELETED;
+del return DELETED;
+removed return DELETED;
+check return CHECK;
+chk return CHECK;
+var return VAR;
+print return PRINT;
+hash return HASH;
+neq return NEQ;
+dfname return DFNAME;
+shuffle return SHUFFLE;
+shuf return SHUFFLE;
+to return TO;
+of return OF;
+ /* SST creation keywords: */
+flag return FLAG;
+none return NONE;
+write_once return WRITE_ONCE;
+wo return WRITE_ONCE;
+no_rp return NO_RP;
+nrp return NO_RP;
+no_conf return NO_CONF;
+ncf return NO_CONF;
+ /* Offset into an SST asset */
+offset return OFFSET;
+ /* Policy keywords: */
+attributes return ATTR;
+attr return ATTR;
+type return TYPE;
+algorithm return ALG;
+alg return ALG;
+ /* Policy-usage and -lifetime keywords: */
+export return EXPORT;
+exp return EXPORT;
+noexport return NOEXPORT;
+nex return NOEXPORT;
+copy return COPY;
+nocopy return NOCOPY;
+encrypt return ENCRYPT;
+encr return ENCRYPT;
+noencrypt return NOENCRYPT;
+nenc return NOENCRYPT;
+decrypt return DECRYPT;
+decr return DECRYPT;
+nodecrypt return NODECRYPT;
+ndecr return NODECRYPT;
+sign return SIGN;
+nosign return NOSIGN;
+verify return VERIFY;
+ver return VERIFY;
+noverify return NOVERIFY;
+nver return NOVERIFY;
+derive return DERIVE;
+der return DERIVE;
+noderive return NODERIVE;
+nder return NODERIVE;
+persistent return PERSISTENT;
+pers return PERSISTENT;
+volatile return VOLATILE;
+vol return VOLATILE;
+from return FROM;
+with return WITH;
+ /* Structure operands: */
+[a-zA-z][a-zA-Z_0-9]* {yylval.str = yytext; return IDENTIFIER_TOK;}
+[+-]?[0-9]* {yylval.valueN = atol(yytext); return NUMBER_TOK;}
+\'[a-zA-Z_0-9\/\.]+\' {yylval.str = yytext; return FILE_PATH_TOK;}
+\"[^\"]*\" {yylval.str = yytext; return LITERAL_TOK;}
+\[[a-fA-F 0-9]*\] {yylval.str = yytext; return HEX_LIST;}
+ /* inside quotes: anything but a quote, or nothing */
+[ \t\n\r] ; /* ignore white space */
+. yyerror ((tf_fuzz_info *) NULL, "Unexpected character");
+
+%%
+