1/* opiegen.c: Sample OTP generator based on the opiegenerator() 2 library routine. 3 4%%% portions-copyright-cmetz-96 5Portions of this software are Copyright 1996-1999 by Craig Metz, All Rights 6Reserved. The Inner Net License Version 2 applies to these portions of 7the software. 8You should have received a copy of the license with this software. If 9you didn't get a copy, you may request one from <license@inner.net>. 10 11 History: 12 13 Modified by cmetz for OPIE 2.3. OPIE_PASS_MAX changed to 14 OPIE_SECRET_MAX. Send debug info to syslog. 15 Modified by cmetz for OPIE 2.2. Use FUNCTION definition et al. 16 Fixed include order. 17 Created at NRL for OPIE 2.2. 18*/ 19#include "opie_cfg.h" 20#include <stdio.h> 21#if DEBUG 22#include <syslog.h> 23#endif /* DEBUG */ 24#include "opie.h" 25 26int main FUNCTION((argc, argv), int argc AND char *argv[]) 27{ 28 char buffer[OPIE_CHALLENGE_MAX+1]; 29 char secret[OPIE_SECRET_MAX+1]; 30 char response[OPIE_RESPONSE_MAX+1]; 31 int result; 32 33 if (opieinsecure()) { 34 fputs("Sorry, but you don't seem to be on a secure terminal.\n", stderr); 35#if !DEBUG 36 exit(1); 37#endif /* !DEBUG */ 38 } 39 40 if (argc <= 1) { 41 fputs("Challenge: ", stderr); 42 if (!opiereadpass(buffer, sizeof(buffer)-1, 1)) 43 fprintf(stderr, "Error reading challenge!"); 44 } else { 45 char *ap, *ep, *c; 46 int i; 47 48 ep = buffer + sizeof(buffer) - 1; 49 for (i = 1, ap = buffer; (i < argc) && (ap < ep); i++) { 50 c = argv[i]; 51 while ((*(ap++) = *(c++)) && (ap < ep)); 52 *(ap - 1) = ' '; 53 } 54 *(ap - 1) = 0; 55#if DEBUG 56 syslog(LOG_DEBUG, "opiegen: challenge is +%s+\n", buffer); 57#endif /* DEBUG */ 58 } 59 buffer[sizeof(buffer)-1] = 0; 60 61 fputs("Secret pass phrase: ", stderr); 62 if (!opiereadpass(secret, OPIE_SECRET_MAX, 0)) { 63 fputs("Error reading secret pass phrase!\n", stderr); 64 exit(1); 65 }; 66 67 switch (result = opiegenerator(buffer, secret, response)) { 68 case -2: 69 fputs("Not a valid OTP secret pass phrase.\n", stderr); 70 break; 71 case -1: 72 fputs("Error processing challenge!\n", stderr); 73 break; 74 case 1: 75 fputs("Not a valid OTP challenge.\n", stderr); 76 break; 77 case 0: 78 fputs(response, stdout); 79 fputc('\n', stdout); 80 fflush(stdout); 81 memset(secret, 0, sizeof(secret)); 82 exit(0); 83 default: 84 fprintf(stderr, "Unknown error %d!\n", result); 85 } 86 memset(secret, 0, sizeof(secret)); 87 return 1; 88} 89