2 * opie.c -- One-Time Password authentication.
4 * For license terms, see the file COPYING in this directory.
11 #if defined(STDC_HEADERS)
14 #include "fetchmail.h"
23 int do_otp(int sock, char *command, struct query *ctl)
28 char challenge[OPIE_CHALLENGE_MAX+1+8];
29 char response[OPIE_RESPONSE_MAX+1];
31 gen_send(sock, "%s X-OTP", command);
33 if (rval = gen_recv(sock, buffer, sizeof(buffer)))
36 if (strncmp(buffer, "+", 1)) {
37 report(stderr, GT_("server recv fatal\n"));
41 to64frombits(buffer, ctl->remotename, strlen(ctl->remotename));
43 gen_send(sock, buffer, sizeof(buffer));
44 suppress_tags = FALSE;
46 if (rval = gen_recv(sock, buffer, sizeof(buffer)))
49 memset(challenge, '\0', sizeof(challenge));
50 if ((i = from64tobits(challenge, buffer+2, sizeof(challenge))) < 0) {
51 report(stderr, GT_("Could not decode OTP challenge\n"));
55 memset(response, '\0', sizeof(response));
56 rval = opiegenerator(challenge, ctl->password, response);
57 if ((rval == -2) && !run.poll_interval) {
58 char secret[OPIE_SECRET_MAX+1];
59 fprintf(stderr, GT_("Secret pass phrase: "));
60 if (opiereadpass(secret, sizeof(secret), 0))
61 rval = opiegenerator(challenge, secret, response);
62 memset(secret, 0, sizeof(secret));
68 to64frombits(buffer, response, strlen(response));
70 gen_send(sock, buffer, strlen(buffer));
71 suppress_tags = FALSE;
73 if (rval = gen_recv(sock, buffer, sizeof(buffer)))
81 #endif /* OPIE_ENABLE */
83 /* opie.c ends here */