2 * opie.c -- One-Time Password authentication.
4 * For license terms, see the file COPYING in this directory.
13 #if defined(STDC_HEADERS)
30 int do_otp(int sock, const char *command, struct query *ctl)
34 char challenge[OPIE_CHALLENGE_MAX+1+8];
35 char response[OPIE_RESPONSE_MAX+1];
37 gen_send(sock, "%s X-OTP", command);
39 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
42 if (strncmp(buffer, "+", 1)) {
43 report(stderr, GT_("server recv fatal\n"));
47 to64frombits(buffer, ctl->remotename, strlen(ctl->remotename), sizeof(buffer));
49 gen_send(sock, "%s", buffer);
50 suppress_tags = FALSE;
52 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
55 memset(challenge, '\0', sizeof(challenge));
56 if ((i = from64tobits(challenge, buffer+2, sizeof(challenge))) < 0) {
57 report(stderr, GT_("Could not decode OTP challenge\n"));
61 memset(response, '\0', sizeof(response));
62 rval = opiegenerator(challenge, ctl->password, response);
63 if ((rval == -2) && !run.poll_interval) {
64 char secret[OPIE_SECRET_MAX+1];
65 fprintf(stderr, GT_("Secret pass phrase: "));
66 if (opiereadpass(secret, sizeof(secret), 0))
67 rval = opiegenerator(challenge, secret, response);
68 memset(secret, 0, sizeof(secret));
74 to64frombits(buffer, response, strlen(response), sizeof(buffer));
76 gen_send(sock, "%s", buffer);
77 suppress_tags = FALSE;
79 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
84 #endif /* OPIE_ENABLE */
86 /* opie.c ends here */