1/* 2 * Copyright (c) 1995-1999 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#include "otp_locl.h" 35#include <getarg.h> 36 37RCSID("$Id$"); 38 39static int extendedp; 40static int count = 10; 41static int hexp; 42static char* alg_string; 43static int version_flag; 44static int help_flag; 45 46struct getargs args[] = { 47 { "extended", 'e', arg_flag, &extendedp, "print keys in extended format" }, 48 { "count", 'n', arg_integer, &count, "number of keys to print" }, 49 { "hexadecimal", 'h', arg_flag, &hexp, "output in hexadecimal" }, 50 { "hash", 'f', arg_string, &alg_string, 51 "hash algorithm (md4, md5, or sha)", "algorithm"}, 52 { "version", 0, arg_flag, &version_flag }, 53 { "help", 0, arg_flag, &help_flag } 54}; 55 56int num_args = sizeof(args) / sizeof(args[0]); 57 58static void 59usage(int code) 60{ 61 arg_printusage(args, num_args, NULL, "num seed"); 62 exit(code); 63} 64 65static int 66print (int argc, 67 char **argv, 68 int count, 69 OtpAlgorithm *alg, 70 void (*print_fn)(OtpKey, char *, size_t)) 71{ 72 char pw[64]; 73 OtpKey key; 74 int n; 75 int i; 76 char *seed; 77 78 if (argc != 2) 79 usage (1); 80 n = atoi(argv[0]); 81 seed = argv[1]; 82 if (UI_UTIL_read_pw_string (pw, sizeof(pw), "Pass-phrase: ", 0)) 83 return 1; 84 alg->init (key, pw, seed); 85 for (i = 0; i < n; ++i) { 86 char s[64]; 87 88 alg->next (key); 89 if (i >= n - count) { 90 (*print_fn)(key, s, sizeof(s)); 91 printf ("%d: %s\n", i + 1, s); 92 } 93 } 94 return 0; 95} 96 97int 98main (int argc, char **argv) 99{ 100 int optind = 0; 101 void (*fn)(OtpKey, char *, size_t); 102 OtpAlgorithm *alg = otp_find_alg (OTP_ALG_DEFAULT); 103 104 setprogname (argv[0]); 105 if(getarg(args, num_args, argc, argv, &optind)) 106 usage(1); 107 if(help_flag) 108 usage(0); 109 if(version_flag) { 110 print_version(NULL); 111 exit(0); 112 } 113 114 if(alg_string) { 115 alg = otp_find_alg (alg_string); 116 if (alg == NULL) 117 errx(1, "Unknown algorithm: %s", alg_string); 118 } 119 argc -= optind; 120 argv += optind; 121 122 if (hexp) { 123 if (extendedp) 124 fn = otp_print_hex_extended; 125 else 126 fn = otp_print_hex; 127 } else { 128 if (extendedp) 129 fn = otp_print_stddict_extended; 130 else 131 fn = otp_print_stddict; 132 } 133 134 return print (argc, argv, count, alg, fn); 135} 136