kernel - Revert part of the contig allocation work
[dragonfly.git] / contrib / opie / libopie / verify.c
blob71e746fe4f85877882e0c9dcbf4226328af82404
1 /* verify.c: The opieverify() library function.
3 %%% copyright-cmetz-96
4 This software is Copyright 1996-2001 by Craig Metz, All Rights Reserved.
5 The Inner Net License Version 3 applies to this software.
6 You should have received a copy of the license with this software. If
7 you didn't get a copy, you may request one from <license@inner.net>.
9 History:
11 Modified by cmetz for OPIE 2.4. Use struct opie_otpkey for keys.
12 Check that seed and sequence number are valid.
13 Modified by cmetz for OPIE 2.32. Renamed _opieparsechallenge() to
14 __opieparsechallenge() and handle new argument. Fixed init
15 response parsing bug.
16 Modified by cmetz for OPIE 2.31. Renamed "init" to "init-hex".
17 Modified by cmetz for OPIE 2.31. Renamed "init" and "RESPONSE_INIT"
18 to "init-hex" and "RESPONSE_INIT_HEX". Removed active attack
19 protection support.
20 Created by cmetz for OPIE 2.3 using the old verify.c as a guide.
23 #include "opie_cfg.h"
24 #ifdef HAVE_STRING_H
25 #include <string.h>
26 #endif /* HAVE_STRING_H */
27 #include <ctype.h>
28 #include "opie.h"
30 #define RESPONSE_STANDARD 0
31 #define RESPONSE_WORD 1
32 #define RESPONSE_HEX 2
33 #define RESPONSE_INIT_HEX 3
34 #define RESPONSE_INIT_WORD 4
35 #define RESPONSE_UNKNOWN 5
37 struct _rtrans {
38 int type;
39 char *name;
42 static struct _rtrans rtrans[] = {
43 { RESPONSE_WORD, "word" },
44 { RESPONSE_HEX, "hex" },
45 { RESPONSE_INIT_HEX, "init-hex" },
46 { RESPONSE_INIT_WORD, "init-word" },
47 { RESPONSE_STANDARD, "" },
48 { RESPONSE_UNKNOWN, NULL }
51 static int changed FUNCTION((opie), struct opie *opie)
53 struct opie opie2;
55 memset(&opie2, 0, sizeof(struct opie));
56 opie2.opie_principal = opie->opie_principal;
57 if (__opiereadrec(&opie2))
58 return 1;
60 if ((opie2.opie_n != opie->opie_n) || strcmp(opie2.opie_val, opie->opie_val) || strcmp(opie2.opie_seed, opie->opie_seed))
61 return 1;
63 memset(&opie2, 0, sizeof(struct opie));
64 return 0;
67 int opieverify FUNCTION((opie, response), struct opie *opie AND char *response)
69 int i, rval = -1;
70 char *c;
71 struct opie_otpkey key, fkey, lastkey;
73 if (!opie || !response)
74 goto verret;
76 if (!opie->opie_principal)
77 #if DEBUG
78 abort();
79 #else /* DEBUG */
80 goto verret;
81 #endif /* DEBUG */
83 if (!opieatob8(&lastkey, opie->opie_val))
84 goto verret;
86 for (c = opie->opie_seed; *c; c++)
87 if (!isalnum(*c))
88 goto verret;
90 if (opie->opie_n <= 0)
91 goto verret;
93 if ((c = strchr(response, ':')) != NULL) {
94 *(c++) = 0;
96 struct _rtrans *r;
97 for (r = rtrans; r->name && strcmp(r->name, response); r++);
98 i = r->type;
100 } else
101 i = RESPONSE_STANDARD;
103 switch(i) {
104 case RESPONSE_STANDARD:
105 i = 1;
107 if (opieetob(&key, response) == 1) {
108 memcpy(&fkey, &key, sizeof(struct opie_otpkey));
109 opiehash(&fkey, MDX);
110 i = memcmp(&fkey, &lastkey, sizeof(struct opie_otpkey));
112 if (i && opieatob8(&key, response)) {
113 memcpy(&fkey, &key, sizeof(struct opie_otpkey));
114 opiehash(&fkey, MDX);
115 i = memcmp(&fkey, &lastkey, sizeof(struct opie_otpkey));
117 break;
118 case RESPONSE_WORD:
119 i = 1;
121 if (opieetob(&key, c) == 1) {
122 memcpy(&fkey, &key, sizeof(struct opie_otpkey));
123 opiehash(&fkey, MDX);
124 i = memcmp(&fkey, &lastkey, sizeof(struct opie_otpkey));
126 break;
127 case RESPONSE_HEX:
128 i = 1;
130 if (opieatob8(&key, c)) {
131 memcpy(&fkey, &key, sizeof(struct opie_otpkey));
132 opiehash(&fkey, MDX);
133 i = memcmp(&fkey, &lastkey, sizeof(struct opie_otpkey));
135 break;
136 case RESPONSE_INIT_HEX:
137 case RESPONSE_INIT_WORD:
139 char *c2;
141 if (!(c2 = strchr(c, ':')))
142 goto verret;
144 *(c2++) = 0;
146 if (i == RESPONSE_INIT_HEX) {
147 if (!opieatob8(&key, c))
148 goto verret;
149 } else {
150 if (opieetob(&key, c) != 1)
151 goto verret;
154 memcpy(&fkey, &key, sizeof(struct opie_otpkey));
155 opiehash(&fkey, MDX);
157 if (memcmp(&fkey, &lastkey, sizeof(struct opie_otpkey)))
158 goto verret;
160 if (changed(opie))
161 goto verret;
163 opie->opie_n--;
165 if (!opiebtoa8(opie->opie_val, &key))
166 goto verret;
168 if (__opiewriterec(opie))
169 goto verret;
171 if (!(c2 = strchr(c = c2, ':')))
172 goto verret;
174 *(c2++) = 0;
177 int j, k;
179 if (__opieparsechallenge(c, &j, &(opie->opie_n), &(opie->opie_seed), &k) || (j != MDX) || k)
180 goto verret;
183 if (i == RESPONSE_INIT_HEX) {
184 if (!opieatob8(&key, c2))
185 goto verret;
186 } else {
187 if (opieetob(&key, c2) != 1)
188 goto verret;
191 goto verwrt;
192 case RESPONSE_UNKNOWN:
193 rval = 1;
194 goto verret;
195 default:
196 rval = -1;
197 goto verret;
200 if (i) {
201 rval = 1;
202 goto verret;
205 if (changed(opie))
206 goto verret;
208 opie->opie_n--;
210 verwrt:
211 if (!opiebtoa8(opie->opie_val, &key))
212 goto verret;
213 rval = __opiewriterec(opie);
215 verret:
216 opieunlock();
217 memset(opie, 0, sizeof(struct opie));
218 return rval;