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