@@ -138,7 +138,7 @@ static int psa_snprint_ecc_curve(char *buffer, size_t buffer_size,
138138
139139static void usage (const char * program_name )
140140{
141- printf ("Usage: %s TYPE VALUE\n" ,
141+ printf ("Usage: %s TYPE VALUE [VALUE...] \n" ,
142142 program_name == NULL ? "psa_constant_names" : program_name );
143143 printf ("Print the symbolic name whose numerical value is VALUE in TYPE.\n" );
144144 printf ("Supported types (with = between aliases):\n" );
@@ -149,11 +149,19 @@ static void usage(const char *program_name)
149149 printf (" error=status Status code (psa_status_t)\n" );
150150}
151151
152+ typedef enum {
153+ TYPE_STATUS ,
154+ TYPE_ALGORITHM ,
155+ TYPE_ECC_CURVE ,
156+ TYPE_KEY_TYPE ,
157+ TYPE_KEY_USAGE ,
158+ } value_type ;
159+
152160int main (int argc , char * argv [])
153161{
154- char buffer [ 200 ] ;
155- unsigned long value ;
156- char * end ;
162+ value_type type ;
163+ unsigned long max ;
164+ int i ;
157165
158166 if (argc <= 1 ||
159167 !strcmp (argv [1 ], "help" ) ||
@@ -162,31 +170,64 @@ int main(int argc, char *argv[])
162170 usage (argv [0 ]);
163171 return EXIT_FAILURE ;
164172 }
165- if (argc != 3 ) {
166- usage (argv [0 ]);
167- return EXIT_FAILURE ;
168- }
169- value = strtoul (argv [2 ], & end , 0 );
170- if (* end ) {
171- printf ("Non-numeric value: %s\n" , argv [2 ]);
172- return EXIT_FAILURE ;
173- }
174173
175- if (!strcmp (argv [1 ], "error" ) || !strcmp (argv [1 ], "status" ))
176- psa_snprint_status (buffer , sizeof (buffer ), (psa_status_t ) value );
177- else if (!strcmp (argv [1 ], "alg" ) || !strcmp (argv [1 ], "algorithm" ))
178- psa_snprint_algorithm (buffer , sizeof (buffer ), (psa_algorithm_t ) value );
179- else if (!strcmp (argv [1 ], "curve" ) || !strcmp (argv [1 ], "ecc_curve" ))
180- psa_snprint_ecc_curve (buffer , sizeof (buffer ), (psa_ecc_curve_t ) value );
181- else if (!strcmp (argv [1 ], "type" ) || !strcmp (argv [1 ], "key_type" ))
182- psa_snprint_key_type (buffer , sizeof (buffer ), (psa_key_type_t ) value );
183- else if (!strcmp (argv [1 ], "usage" ) || !strcmp (argv [1 ], "key_usage" ))
184- psa_snprint_key_usage (buffer , sizeof (buffer ), (psa_key_usage_t ) value );
185- else {
174+ if (!strcmp (argv [1 ], "error" ) || !strcmp (argv [1 ], "status" )) {
175+ type = TYPE_STATUS ;
176+ max = 0x7fffffff ; /* hard-coded because psa_status_t is signed */
177+ } else if (!strcmp (argv [1 ], "alg" ) || !strcmp (argv [1 ], "algorithm" )) {
178+ type = TYPE_ALGORITHM ;
179+ max = (psa_algorithm_t )( -1 );
180+ } else if (!strcmp (argv [1 ], "curve" ) || !strcmp (argv [1 ], "ecc_curve" )) {
181+ type = TYPE_ECC_CURVE ;
182+ max = (psa_ecc_curve_t )( -1 );
183+ } else if (!strcmp (argv [1 ], "type" ) || !strcmp (argv [1 ], "key_type" )) {
184+ type = TYPE_KEY_TYPE ;
185+ max = (psa_key_type_t )( -1 );
186+ } else if (!strcmp (argv [1 ], "usage" ) || !strcmp (argv [1 ], "key_usage" )) {
187+ type = TYPE_KEY_USAGE ;
188+ max = (psa_key_usage_t )( -1 );
189+ } else {
186190 printf ("Unknown type: %s\n" , argv [1 ]);
187191 return EXIT_FAILURE ;
188192 }
189193
190- puts (buffer );
194+ for (i = 2 ; i < argc ; i ++ ) {
195+ char buffer [200 ];
196+ char * end ;
197+ unsigned long value = strtoul (argv [i ], & end , 0 );
198+ if (* end ) {
199+ printf ("Non-numeric value: %s\n" , argv [i ]);
200+ return EXIT_FAILURE ;
201+ }
202+ if (value > max ) {
203+ printf ("Value out of range: %s\n" , argv [i ]);
204+ return EXIT_FAILURE ;
205+ }
206+
207+ switch (type ) {
208+ case TYPE_STATUS :
209+ psa_snprint_status (buffer , sizeof (buffer ),
210+ (psa_status_t ) value );
211+ break ;
212+ case TYPE_ALGORITHM :
213+ psa_snprint_algorithm (buffer , sizeof (buffer ),
214+ (psa_algorithm_t ) value );
215+ break ;
216+ case TYPE_ECC_CURVE :
217+ psa_snprint_ecc_curve (buffer , sizeof (buffer ),
218+ (psa_ecc_curve_t ) value );
219+ break ;
220+ case TYPE_KEY_TYPE :
221+ psa_snprint_key_type (buffer , sizeof (buffer ),
222+ (psa_key_type_t ) value );
223+ break ;
224+ case TYPE_KEY_USAGE :
225+ psa_snprint_key_usage (buffer , sizeof (buffer ),
226+ (psa_key_usage_t ) value );
227+ break ;
228+ }
229+ puts (buffer );
230+ }
231+
191232 return EXIT_SUCCESS ;
192233}
0 commit comments