xref: /netbsd-src/external/bsd/libfido2/dist/tools/fido2-token.c (revision 2d40c4512a84c0d064ec30a492c5e2a14d230bc3)
1ba9bdd8bSchristos /*
2ba9bdd8bSchristos  * Copyright (c) 2018 Yubico AB. All rights reserved.
3ba9bdd8bSchristos  * Use of this source code is governed by a BSD-style
4ba9bdd8bSchristos  * license that can be found in the LICENSE file.
5*2d40c451Schristos  * SPDX-License-Identifier: BSD-2-Clause
6ba9bdd8bSchristos  */
7ba9bdd8bSchristos 
8ba9bdd8bSchristos #include <fido.h>
9ba9bdd8bSchristos #include <stdio.h>
10ba9bdd8bSchristos #include <stdlib.h>
11ba9bdd8bSchristos 
12ba9bdd8bSchristos #include "../openbsd-compat/openbsd-compat.h"
13ba9bdd8bSchristos #include "extern.h"
14ba9bdd8bSchristos 
15ba9bdd8bSchristos static int action;
16ba9bdd8bSchristos 
17ba9bdd8bSchristos void
usage(void)18ba9bdd8bSchristos usage(void)
19ba9bdd8bSchristos {
20ba9bdd8bSchristos 	fprintf(stderr,
2195dbdf32Schristos "usage: fido2-token -C [-d] device\n"
2295dbdf32Schristos "       fido2-token -Db [-k key_path] [-i cred_id -n rp_id] device\n"
2395dbdf32Schristos "       fido2-token -Dei template_id device\n"
2495dbdf32Schristos "       fido2-token -Du device\n"
2595dbdf32Schristos "       fido2-token -Gb [-k key_path] [-i cred_id -n rp_id] blob_path device\n"
26ba9bdd8bSchristos "       fido2-token -I [-cd] [-k rp_id -i cred_id]  device\n"
2795dbdf32Schristos "       fido2-token -L [-bder] [-k rp_id] [device]\n"
2895dbdf32Schristos "       fido2-token -R [-d] device\n"
2995dbdf32Schristos "       fido2-token -S [-adefu] [-l pin_length] [-i template_id -n template_name] device\n"
3095dbdf32Schristos "       fido2-token -Sb [-k key_path] [-i cred_id -n rp_id] blob_path device\n"
31ede6d7f8Schristos "       fido2-token -Sc -i cred_id -k user_id -n name -p display_name device\n"
32*2d40c451Schristos "       fido2-token -Sm rp_id device\n"
33ba9bdd8bSchristos "       fido2-token -V\n"
34ba9bdd8bSchristos 	);
35ba9bdd8bSchristos 
36ba9bdd8bSchristos 	exit(1);
37ba9bdd8bSchristos }
38ba9bdd8bSchristos 
39ba9bdd8bSchristos static void
setaction(int ch)40ba9bdd8bSchristos setaction(int ch)
41ba9bdd8bSchristos {
42ba9bdd8bSchristos 	if (action)
43ba9bdd8bSchristos 		usage();
44ba9bdd8bSchristos 	action = ch;
45ba9bdd8bSchristos }
46ba9bdd8bSchristos 
47ba9bdd8bSchristos int
main(int argc,char ** argv)48ba9bdd8bSchristos main(int argc, char **argv)
49ba9bdd8bSchristos {
50ba9bdd8bSchristos 	int ch;
51ba9bdd8bSchristos 	int flags = 0;
52ba9bdd8bSchristos 	char *device;
53ba9bdd8bSchristos 
54ba9bdd8bSchristos 	while ((ch = getopt(argc, argv, TOKEN_OPT)) != -1) {
55ba9bdd8bSchristos 		switch (ch) {
5695dbdf32Schristos 		case 'a':
57ba9bdd8bSchristos 		case 'b':
58ba9bdd8bSchristos 		case 'c':
59ba9bdd8bSchristos 		case 'e':
6095dbdf32Schristos 		case 'f':
61ba9bdd8bSchristos 		case 'i':
62ba9bdd8bSchristos 		case 'k':
6395dbdf32Schristos 		case 'l':
64*2d40c451Schristos 		case 'm':
65ba9bdd8bSchristos 		case 'n':
66ede6d7f8Schristos 		case 'p':
67ba9bdd8bSchristos 		case 'r':
6895dbdf32Schristos 		case 'u':
69ba9bdd8bSchristos 			break; /* ignore */
70ba9bdd8bSchristos 		case 'd':
71ba9bdd8bSchristos 			flags = FIDO_DEBUG;
72ba9bdd8bSchristos 			break;
73ba9bdd8bSchristos 		default:
74ba9bdd8bSchristos 			setaction(ch);
75ba9bdd8bSchristos 			break;
76ba9bdd8bSchristos 		}
77ba9bdd8bSchristos 	}
78ba9bdd8bSchristos 
7995dbdf32Schristos 	if (argc - optind < 1)
80ba9bdd8bSchristos 		device = NULL;
8195dbdf32Schristos 	else
8295dbdf32Schristos 		device = argv[argc - 1];
83ba9bdd8bSchristos 
84ba9bdd8bSchristos 	fido_init(flags);
85ba9bdd8bSchristos 
86ba9bdd8bSchristos 	switch (action) {
87ba9bdd8bSchristos 	case 'C':
88ba9bdd8bSchristos 		return (pin_change(device));
89ba9bdd8bSchristos 	case 'D':
90ba9bdd8bSchristos 		return (token_delete(argc, argv, device));
9195dbdf32Schristos 	case 'G':
9295dbdf32Schristos 		return (token_get(argc, argv, device));
93ba9bdd8bSchristos 	case 'I':
94ba9bdd8bSchristos 		return (token_info(argc, argv, device));
95ba9bdd8bSchristos 	case 'L':
96ba9bdd8bSchristos 		return (token_list(argc, argv, device));
97ba9bdd8bSchristos 	case 'R':
98ba9bdd8bSchristos 		return (token_reset(device));
99ba9bdd8bSchristos 	case 'S':
100ba9bdd8bSchristos 		return (token_set(argc, argv, device));
101ba9bdd8bSchristos 	case 'V':
102ba9bdd8bSchristos 		fprintf(stderr, "%d.%d.%d\n", _FIDO_MAJOR, _FIDO_MINOR,
103ba9bdd8bSchristos 		    _FIDO_PATCH);
104ba9bdd8bSchristos 		exit(0);
105ba9bdd8bSchristos 	}
106ba9bdd8bSchristos 
107ba9bdd8bSchristos 	usage();
108ba9bdd8bSchristos 
109ba9bdd8bSchristos 	/* NOTREACHED */
110ba9bdd8bSchristos }
111