2 * opie.c -- One-Time Password authentication.
4 * For license terms, see the file COPYING in this directory.
12 #include "fetchmail.h"
27 int do_otp(int sock, const char *command, struct query *ctl)
31 char challenge[OPIE_CHALLENGE_MAX+1+8];
32 char response[OPIE_RESPONSE_MAX+1];
34 gen_send(sock, "%s X-OTP", command);
36 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
39 if (strncmp(buffer, "+", 1)) {
40 report(stderr, GT_("server recv fatal\n"));
44 to64frombits(buffer, ctl->remotename, strlen(ctl->remotename));
46 gen_send(sock, buffer, sizeof(buffer));
47 suppress_tags = FALSE;
49 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
52 memset(challenge, '\0', sizeof(challenge));
53 if ((i = from64tobits(challenge, buffer+2, sizeof(challenge))) < 0) {
54 report(stderr, GT_("Could not decode OTP challenge\n"));
58 memset(response, '\0', sizeof(response));
59 rval = opiegenerator(challenge, ctl->password, response);
60 if ((rval == -2) && !run.poll_interval) {
61 char secret[OPIE_SECRET_MAX+1];
62 fprintf(stderr, GT_("Secret pass phrase: "));
63 if (opiereadpass(secret, sizeof(secret), 0))
64 rval = opiegenerator(challenge, secret, response);
65 memset(secret, 0, sizeof(secret));
71 to64frombits(buffer, response, strlen(response));
73 gen_send(sock, buffer, strlen(buffer));
74 suppress_tags = FALSE;
76 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
81 #endif /* OPIE_ENABLE */
83 /* opie.c ends here */