]> Pileus Git - ~andy/fetchmail/blob - opie.c
Fix for OPIE operation.
[~andy/fetchmail] / opie.c
1 /*
2  * opie.c -- One-Time Password authentication.
3  *
4  * For license terms, see the file COPYING in this directory.
5  */
6
7 #include  "config.h"
8 #include  <stdio.h>
9 #include  <string.h>
10 #include  <ctype.h>
11 #if defined(STDC_HEADERS)
12 #include  <stdlib.h>
13 #endif
14 #include  "fetchmail.h"
15 #include  "socket.h"
16
17 #include  "i18n.h"
18 #include "md5.h"
19
20 #if OPIE_ENABLE
21 #include <opie.h>
22
23 int do_otp(int sock, char *command, struct query *ctl)
24 {
25     int i, rval;
26     int result;
27     char buffer[128];
28     char challenge[OPIE_CHALLENGE_MAX+1+8];
29     char response[OPIE_RESPONSE_MAX+1];
30
31     gen_send(sock, "%s X-OTP", command);
32
33     if (rval = gen_recv(sock, buffer, sizeof(buffer)))
34         return rval;
35
36         if (strncmp(buffer, "+", 1)) {
37         report(stderr, GT_("server recv fatal\n"));
38         return PS_AUTHFAIL;
39         }
40
41     to64frombits(buffer, ctl->remotename, strlen(ctl->remotename));
42         suppress_tags = TRUE;
43     gen_send(sock, buffer, sizeof(buffer));
44         suppress_tags = FALSE;
45
46     if (rval = gen_recv(sock, buffer, sizeof(buffer)))
47         return rval;
48
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"));
52         return PS_AUTHFAIL;
53     };
54
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));
63     };
64
65     if (rval)
66         return(PS_AUTHFAIL);
67
68     to64frombits(buffer, response, strlen(response));
69     suppress_tags = TRUE;
70     gen_send(sock, buffer, strlen(buffer));
71     suppress_tags = FALSE;
72
73     if (rval = gen_recv(sock, buffer, sizeof(buffer)))
74         return rval;
75
76     if (result)
77         return PS_SUCCESS;
78     else
79         return PS_AUTHFAIL;
80 };
81 #endif /* OPIE_ENABLE */
82
83 /* opie.c ends here */