|
|
1.1 root 1: /* protected.c - ProtectedPassword attribute syntax */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/protected.c,v 7.3 90/01/12 08:08:26 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/dsap/common/RCS/protected.c,v 7.3 90/01/12 08:08:26 mrose Exp $
9: *
10: *
11: * $Log: protected.c,v $
12: * Revision 7.3 90/01/12 08:08:26 mrose
13: * again
14: *
15: * Revision 7.2 90/01/11 23:53:12 mrose
16: * lint
17: *
18: * Revision 7.1 89/12/19 16:19:29 mrose
19: * sync
20: *
21: * Revision 7.0 89/11/23 21:47:43 mrose
22: * Release 6.0
23: *
24: */
25:
26: /*
27: * NOTICE
28: *
29: * Acquisition, use, and distribution of this module and related
30: * materials are subject to the restrictions of a license agreement.
31: * Consult the Preface in the User's Manual for the full terms of
32: * this agreement.
33: *
34: */
35:
36: #include "logger.h"
37: #include "quipu/util.h"
38: #include "quipu/attr.h"
39: #include "quipu/authen.h"
40:
41: extern LLog *log_dsap;
42: extern char allow_crypt;
43: char *cryptparse();
44:
45: static PE prot_enc (x)
46: struct protected_password *x;
47: {
48: PE result = NULLPE;
49:
50: (void) encode_Quipu_ProtectedPassword (&result, 0, 0, NULLCP, x);
51: return (result);
52: }
53:
54: static struct protected_password * prot_dec (pe)
55: PE pe;
56: {
57: struct protected_password *result;
58:
59: if (decode_Quipu_ProtectedPassword (pe, 0, NULLIP, NULLVP, &result)
60: == NOTOK)
61: return ((struct protected_password *) 0);
62: return (result);
63: }
64:
65: static struct protected_password *str2prot(str)
66: char *str;
67: {
68: struct protected_password *result;
69: char *octparse();
70:
71: result = (struct protected_password *)
72: calloc(1, sizeof(*result));
73:
74: if (result == (struct protected_password *) 0)
75: return (result);
76:
77: /* Using strlen means can't have zeros in the password */
78: result->passwd = cryptparse(str);
79: result->n_octets = strlen(result->passwd);
80: result->protected = '\0';
81: result->time1 = NULLCP;
82: result->time2 = NULLCP;
83: result->random1 = (struct random_number *) 0;
84: result->random2 = (struct random_number *) 0;
85:
86: return (result);
87: }
88:
89: static prot_print (ps, parm, format)
90: PS ps;
91: struct protected_password *parm;
92: int format;
93: {
94: char *cp;
95: extern char * cryptstring();
96:
97: /* Make a null-terminated copy */
98: cp = malloc((unsigned)(parm->n_octets + 1));
99: bcopy(parm->passwd, cp, parm->n_octets);
100: cp[parm->n_octets] = '\0';
101:
102: if (allow_crypt == FALSE)
103: octprint(ps, cp, format);
104: else
105: {
106: ps_print(ps, "{CRYPT}");
107: octprint(ps, cryptstring(cp), format);
108: }
109: free(cp);
110: }
111:
112:
113: /* Portable conversion from OCTET STRING to whatever structure is
114: * used to hold a hash. This is currently an unsigned long, which limits the
115: * length of a hash.
116: */
117:
118:
119: /* The reverse operation. Currently, hashes are always 4 octets long. */
120:
121: char *hash2str(hash, len)
122: unsigned long hash;
123: int *len;
124: {
125: char *result;
126: int i;
127:
128: result = malloc(5);
129: if (result == NULLCP)
130: return (result);
131:
132: for (i=0; i<4; i++)
133: {
134: result[i] = (char) (hash & 255);
135: hash = hash >> 8;
136: }
137:
138: *len = 4;
139: return (result);
140: }
141:
142: /* insecure hash function for testing purposes */
143:
144: /* ARGSUSED */
145: unsigned long hash_passwd(seed, str, len)
146: unsigned long seed;
147: char *str;
148: int len;
149: {
150: seed = 0;
151:
152: DLOG(log_dsap, LLOG_DEBUG, ("Hash = %D", seed));
153:
154: return (seed);
155: }
156:
157: /* ARGSUSED */
158: int check_guard(pwd, pwd_len, salt, hval, hlen)
159: char *pwd; /* This string is not null-terminated */
160: int pwd_len;
161: char *salt; /* Null-terminated salt */
162: char *hval; /* This string is not null-terminated */
163: int hlen;
164: {
165: return (2);
166: }
167:
168: static int prot_cmp (a, b)
169: struct protected_password *a, *b;
170: {
171: int retval;
172:
173: if (a->protected == (char) 0)
174: {
175: if (b->protected == (char) 0)
176: {
177: /* Both are unencrypted. Do a direct compare. */
178: if (a->n_octets != b->n_octets)
179: retval = 2;
180: else
181: retval = (strncmp(a->passwd, b->passwd, a->n_octets) == 0)? 0:2;
182: }
183: else
184: retval = check_guard(a->passwd, a->n_octets, b->time1, b->passwd, b->n_octets);
185: }
186: else
187: {
188: if (b->protected == (char) 0)
189: retval = check_guard(b->passwd, b->n_octets, a->time1, a->passwd, a->n_octets);
190: else
191: {
192: /* Both are encrypted.
193: * This case does not occur with sane usage of this syntax.
194: * However, we have to handle it in case a DUA tries it.
195: * To preserve semantics of `equals', should check whether a & b
196: * are both guarded versions of the same thing, BUT the encryption
197: * mechanism prevents us doing this check.
198: *
199: * To make evrything mathematically correct, should re-write it
200: * to use '>=' rather than '='. Unfortunately, can't check '>='
201: * with a directory COMPARE operation ...
202: */
203: if (a->n_octets != b->n_octets)
204: retval = 2;
205: else
206: retval = (strncmp(a->passwd, b->passwd, a->n_octets) == 0)? 0:2;
207: }
208: }
209: return (retval);
210: }
211:
212: static struct protected_password *prot_cpy(parm)
213: struct protected_password *parm;
214: {
215: struct protected_password *result;
216:
217: result = (struct protected_password *)
218: calloc(1, sizeof(*result));
219:
220: result->passwd = malloc((unsigned)parm->n_octets);
221: if (result->passwd == NULLCP)
222: return ((struct protected_password *) 0);
223: bcopy(parm->passwd, result->passwd, parm->n_octets);
224:
225: result->n_octets = parm->n_octets;
226: if (parm->time1 == NULLCP)
227: result->time1 = NULLCP;
228: else
229: result->time1 = strdup(parm->time1);
230:
231: if (parm->time2 == NULLCP)
232: result->time2 = NULLCP;
233: else
234: result->time2 = strdup(parm->time2);
235:
236: result->random1 = (struct random_number *) 0;
237: result->random2 = (struct random_number *) 0;
238:
239: result->protected = parm->protected;
240:
241: return (result);
242: }
243:
244: static prot_free(parm)
245: struct protected_password *parm;
246: {
247: if (parm->passwd != NULLCP)
248: free(parm->passwd);
249: if (parm->time1 != NULLCP)
250: free(parm->time1);
251: if (parm->time2 != NULLCP)
252: free(parm->time2);
253:
254: free((char *) parm);
255: }
256:
257: protected_password_syntax ()
258: {
259: (void) add_attribute_syntax ("ProtectedPassword",
260: (IFP) prot_enc, (IFP) prot_dec,
261: (IFP) str2prot, prot_print,
262: (IFP) prot_cpy, prot_cmp,
263: prot_free, NULLCP,
264: NULLIFP, FALSE);
265: }
266:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.