1997-02-06 17:52:29 +00:00
|
|
|
/* opiegen.c: Sample OTP generator based on the opiegenerator()
|
|
|
|
library routine.
|
|
|
|
|
1997-09-29 08:53:38 +00:00
|
|
|
%%% portions-copyright-cmetz-96
|
2002-03-21 22:50:02 +00:00
|
|
|
Portions of this software are Copyright 1996-1999 by Craig Metz, All Rights
|
1997-02-06 17:52:29 +00:00
|
|
|
Reserved. The Inner Net License Version 2 applies to these portions of
|
|
|
|
the software.
|
|
|
|
You should have received a copy of the license with this software. If
|
|
|
|
you didn't get a copy, you may request one from <license@inner.net>.
|
|
|
|
|
|
|
|
History:
|
|
|
|
|
|
|
|
Modified by cmetz for OPIE 2.3. OPIE_PASS_MAX changed to
|
|
|
|
OPIE_SECRET_MAX. Send debug info to syslog.
|
|
|
|
Modified by cmetz for OPIE 2.2. Use FUNCTION definition et al.
|
|
|
|
Fixed include order.
|
|
|
|
Created at NRL for OPIE 2.2.
|
|
|
|
*/
|
|
|
|
#include "opie_cfg.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#if DEBUG
|
|
|
|
#include <syslog.h>
|
|
|
|
#endif /* DEBUG */
|
|
|
|
#include "opie.h"
|
|
|
|
|
|
|
|
int main FUNCTION((argc, argv), int argc AND char *argv[])
|
|
|
|
{
|
|
|
|
char buffer[OPIE_CHALLENGE_MAX+1];
|
|
|
|
char secret[OPIE_SECRET_MAX+1];
|
|
|
|
char response[OPIE_RESPONSE_MAX+1];
|
|
|
|
int result;
|
|
|
|
|
|
|
|
if (opieinsecure()) {
|
|
|
|
fputs("Sorry, but you don't seem to be on a secure terminal.\n", stderr);
|
|
|
|
#if !DEBUG
|
|
|
|
exit(1);
|
|
|
|
#endif /* !DEBUG */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc <= 1) {
|
|
|
|
fputs("Challenge: ", stderr);
|
|
|
|
if (!opiereadpass(buffer, sizeof(buffer)-1, 1))
|
|
|
|
fprintf(stderr, "Error reading challenge!");
|
|
|
|
} else {
|
|
|
|
char *ap, *ep, *c;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
ep = buffer + sizeof(buffer) - 1;
|
|
|
|
for (i = 1, ap = buffer; (i < argc) && (ap < ep); i++) {
|
|
|
|
c = argv[i];
|
|
|
|
while ((*(ap++) = *(c++)) && (ap < ep));
|
|
|
|
*(ap - 1) = ' ';
|
|
|
|
}
|
|
|
|
*(ap - 1) = 0;
|
|
|
|
#if DEBUG
|
|
|
|
syslog(LOG_DEBUG, "opiegen: challenge is +%s+\n", buffer);
|
|
|
|
#endif /* DEBUG */
|
|
|
|
}
|
|
|
|
buffer[sizeof(buffer)-1] = 0;
|
|
|
|
|
|
|
|
fputs("Secret pass phrase: ", stderr);
|
|
|
|
if (!opiereadpass(secret, OPIE_SECRET_MAX, 0)) {
|
|
|
|
fputs("Error reading secret pass phrase!\n", stderr);
|
|
|
|
exit(1);
|
|
|
|
};
|
|
|
|
|
|
|
|
switch (result = opiegenerator(buffer, secret, response)) {
|
|
|
|
case -2:
|
|
|
|
fputs("Not a valid OTP secret pass phrase.\n", stderr);
|
|
|
|
break;
|
|
|
|
case -1:
|
|
|
|
fputs("Error processing challenge!\n", stderr);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
fputs("Not a valid OTP challenge.\n", stderr);
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
fputs(response, stdout);
|
|
|
|
fputc('\n', stdout);
|
|
|
|
fflush(stdout);
|
|
|
|
memset(secret, 0, sizeof(secret));
|
|
|
|
exit(0);
|
|
|
|
default:
|
|
|
|
fprintf(stderr, "Unknown error %d!\n", result);
|
|
|
|
}
|
|
|
|
memset(secret, 0, sizeof(secret));
|
|
|
|
return 1;
|
|
|
|
}
|