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"
29 int do_otp(int sock, const char *command, struct query *ctl)
33 char challenge[OPIE_CHALLENGE_MAX+1+8];
34 char response[OPIE_RESPONSE_MAX+1];
36 gen_send(sock, "%s X-OTP", command);
38 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
41 if (strncmp(buffer, "+", 1)) {
42 report(stderr, GT_("server recv fatal\n"));
46 to64frombits(buffer, ctl->remotename, strlen(ctl->remotename));
48 gen_send(sock, buffer, sizeof(buffer));
49 suppress_tags = FALSE;
51 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
54 memset(challenge, '\0', sizeof(challenge));
55 if ((i = from64tobits(challenge, buffer+2, sizeof(challenge))) < 0) {
56 report(stderr, GT_("Could not decode OTP challenge\n"));
60 memset(response, '\0', sizeof(response));
61 rval = opiegenerator(challenge, ctl->password, response);
62 if ((rval == -2) && !run.poll_interval) {
63 char secret[OPIE_SECRET_MAX+1];
64 fprintf(stderr, GT_("Secret pass phrase: "));
65 if (opiereadpass(secret, sizeof(secret), 0))
66 rval = opiegenerator(challenge, secret, response);
67 memset(secret, 0, sizeof(secret));
73 to64frombits(buffer, response, strlen(response));
75 gen_send(sock, buffer, strlen(buffer));
76 suppress_tags = FALSE;
78 if ((rval = gen_recv(sock, buffer, sizeof(buffer))))
83 #endif /* OPIE_ENABLE */
85 /* opie.c ends here */