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