1616/* For the UUID (found in the TA's h-file(s)) */
1717#include <acipher_ta.h>
1818
19+ #define ENCRYPT 1
20+ #define DECRYPT 0
21+
1922static void usage (int argc , char * argv [])
2023{
2124 const char * pname = "acipher" ;
2225
2326 if (argc )
2427 pname = argv [0 ];
2528
26- fprintf (stderr , "usage: %s <key_size> <string to encrypt>\n" , pname );
29+ fprintf (stderr , "%s: %s <key_size> <string to encrypt> <algo name>\n" ,
30+ __func__ , pname );
2731 exit (1 );
2832}
2933
3034static void get_args (int argc , char * argv [], size_t * key_size , void * * inbuf ,
31- size_t * inbuf_len )
35+ size_t * inbuf_len , uint32_t * algo_num )
3236{
3337 char * ep ;
3438 long ks ;
39+ char * algo ;
3540
36- if (argc != 3 ) {
41+ if (( argc > 4 ) || ( argc < 3 ) ) {
3742 warnx ("Unexpected number of arguments %d (expected 2)" ,
3843 argc - 1 );
3944 usage (argc , argv );
@@ -52,6 +57,32 @@ static void get_args(int argc, char *argv[], size_t *key_size, void **inbuf,
5257
5358 * inbuf = argv [2 ];
5459 * inbuf_len = strlen (argv [2 ]);
60+
61+ if (argc > 3 ) {
62+ algo = argv [3 ];
63+ printf ("%s algo selected\n" , algo );
64+ if (strcmp (algo , "TA_ALG_OAEP_MGF1_SHA1" ) == 0 ) {
65+ * algo_num = TA_ALG_OAEP_MGF1_SHA1 ;
66+ } else if (strcmp (algo , "TA_ALG_OAEP_MGF1_SHA224" ) == 0 ) {
67+ * algo_num = TA_ALG_OAEP_MGF1_SHA224 ;
68+ } else if (strcmp (algo , "TA_ALG_OAEP_MGF1_SHA256" ) == 0 ) {
69+ * algo_num = TA_ALG_OAEP_MGF1_SHA256 ;
70+ } else if (strcmp (algo , "TA_ALG_OAEP_MGF1_SHA384" ) == 0 ) {
71+ * algo_num = TA_ALG_OAEP_MGF1_SHA384 ;
72+ } else if (strcmp (algo , "TA_ALG_OAEP_MGF1_SHA512" ) == 0 ) {
73+ * algo_num = TA_ALG_OAEP_MGF1_SHA512 ;
74+ } else if (strcmp (algo , "TA_ALG_PKCS1_V1_5" ) == 0 ) {
75+ * algo_num = TA_ALG_PKCS1_V1_5 ;
76+ } else {
77+ printf ("%s algo is invalid\n" , algo );
78+ usage (argc , argv );
79+ }
80+ } else {
81+ printf ("TA_ALG_PKCS1_V1_5 algo selected\n" );
82+ * algo_num = TA_ALG_PKCS1_V1_5 ;
83+ }
84+
85+
5586}
5687
5788static void teec_err (TEEC_Result res , uint32_t eo , const char * str )
@@ -69,10 +100,13 @@ int main(int argc, char *argv[])
69100 size_t key_size ;
70101 void * inbuf ;
71102 size_t inbuf_len ;
103+ void * outbuf = NULL ;
104+ size_t outbuf_len = 0 ;
72105 size_t n ;
106+ uint32_t algo_num ;
73107 const TEEC_UUID uuid = TA_ACIPHER_UUID ;
74108
75- get_args (argc , argv , & key_size , & inbuf , & inbuf_len );
109+ get_args (argc , argv , & key_size , & inbuf , & inbuf_len , & algo_num );
76110
77111 res = TEEC_InitializeContext (NULL , & ctx );
78112 if (res )
@@ -95,26 +129,62 @@ int main(int argc, char *argv[])
95129 memset (& op , 0 , sizeof (op ));
96130 op .paramTypes = TEEC_PARAM_TYPES (TEEC_MEMREF_TEMP_INPUT ,
97131 TEEC_MEMREF_TEMP_OUTPUT ,
98- TEEC_NONE , TEEC_NONE );
132+ TEEC_VALUE_INPUT , TEEC_VALUE_INPUT );
99133 op .params [0 ].tmpref .buffer = inbuf ;
100134 op .params [0 ].tmpref .size = inbuf_len ;
135+ op .params [2 ].value .a = ENCRYPT ; /* encrypt */
136+ op .params [3 ].value .a = algo_num ;
101137
102138 res = TEEC_InvokeCommand (& sess , TA_ACIPHER_CMD_ENCRYPT , & op , & eo );
103139 if (eo != TEEC_ORIGIN_TRUSTED_APP || res != TEEC_ERROR_SHORT_BUFFER )
104140 teec_err (res , eo , "TEEC_InvokeCommand(TA_ACIPHER_CMD_ENCRYPT)" );
105141
142+ outbuf_len = op .params [1 ].tmpref .size ;
106143 op .params [1 ].tmpref .buffer = malloc (op .params [1 ].tmpref .size );
107144 if (!op .params [1 ].tmpref .buffer )
108145 err (1 , "Cannot allocate out buffer of size %zu" ,
109- op . params [ 1 ]. tmpref . size );
146+ outbuf_len );
110147
111148 res = TEEC_InvokeCommand (& sess , TA_ACIPHER_CMD_ENCRYPT , & op , & eo );
112149 if (res )
113150 teec_err (res , eo , "TEEC_InvokeCommand(TA_ACIPHER_CMD_ENCRYPT)" );
114151
152+ outbuf = malloc (outbuf_len );
153+ if (!outbuf )
154+ err (1 , "Cannot allocate out buffer of size %zu" , outbuf_len );
155+
156+ memmove (outbuf , op .params [1 ].tmpref .buffer , outbuf_len );
115157 printf ("Encrypted buffer: " );
116- for (n = 0 ; n < op . params [ 1 ]. tmpref . size ; n ++ )
117- printf ("%02x " , ((uint8_t * )op . params [ 1 ]. tmpref . buffer )[n ]);
158+ for (n = 0 ; n < outbuf_len ; n ++ )
159+ printf ("%02x " , ((uint8_t * )outbuf )[n ]);
118160 printf ("\n" );
161+
162+ memset (& op , 0 , sizeof (op ));
163+ op .paramTypes = TEEC_PARAM_TYPES (TEEC_MEMREF_TEMP_INPUT ,
164+ TEEC_MEMREF_TEMP_OUTPUT ,
165+ TEEC_VALUE_INPUT , TEEC_VALUE_INPUT );
166+ op .params [0 ].tmpref .buffer = outbuf ;
167+ op .params [0 ].tmpref .size = outbuf_len ;
168+ op .params [2 ].value .a = DECRYPT ; /* decrypt */
169+ op .params [3 ].value .a = algo_num ;
170+
171+ res = TEEC_InvokeCommand (& sess , TA_ACIPHER_CMD_ENCRYPT , & op , & eo );
172+ if (eo != TEEC_ORIGIN_TRUSTED_APP || res != TEEC_ERROR_SHORT_BUFFER )
173+ teec_err (res , eo , "TEEC_InvokeCommand(TA_ACIPHER_CMD_DYCRYPT)" );
174+
175+ op .params [1 ].tmpref .buffer = malloc (op .params [1 ].tmpref .size );
176+ if (!op .params [1 ].tmpref .buffer )
177+ err (1 , "Cannot allocate out buffer of size %zu" ,
178+ outbuf_len );
179+
180+ res = TEEC_InvokeCommand (& sess , TA_ACIPHER_CMD_ENCRYPT , & op , & eo );
181+ if (res )
182+ teec_err (res , eo , "TEEC_InvokeCommand(TA_ACIPHER_CMD_DYCRYPT)" );
183+
184+ if (memcmp (inbuf , op .params [1 ].tmpref .buffer , op .params [1 ].tmpref .size ))
185+ printf ("message is not matching\n" );
186+ else
187+ printf ("message is matching successfully\n" );
188+
119189 return 0 ;
120190}
0 commit comments