|
|
1.1 root 1: /* security.c - Check security parameters */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/RCS/security.c,v 7.1 89/12/19 16:20:47 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/RCS/security.c,v 7.1 89/12/19 16:20:47 mrose Exp $
9: *
10: *
11: * $Log: security.c,v $
12: * Revision 7.1 89/12/19 16:20:47 mrose
13: * sync
14: *
15: * Revision 6.0 89/09/08 10:20:02 mrose
16: * *** empty log message ***
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: #include "logger.h"
32: #include "quipu/ds_error.h"
33: #include "quipu/commonarg.h"
34:
35: extern int encode_AF_CertificateToSign();
36: extern int dn_print();
37: extern LLog *log_dsap;
38: #ifndef NO_STATS
39: extern LLog *log_stat;
40: #endif
41:
42: #define adios(a, b) fatal(-1, b)
43:
44: unsigned *compute_signature();
45: struct MD4Hash *pe2hash();
46: struct signature *sign_operation_aux();
47: struct signature *sign_operation();
48:
49: /*
50: * Cache holding keys of trusted certification authorities
51: */
52:
53: struct ca_record *ca_key_cache = (struct ca_record *) 0;
54:
55: /*
56: * Cache holding keys of users (untrusted)
57: */
58:
59: struct ca_record *user_key_cache = (struct ca_record *) 0;
60:
61: /*
62: * Own certificate. (For convenient access).
63: */
64:
65: struct certificate *my_certificate = (struct certificate *) 0;
66:
67: /*
68: * RSA secret key.
69: */
70:
71: static struct RSASecretKey *my_secret_key;
72: static struct RSAParameters *my_key_parms;
73:
74: struct ca_record *find_user_keyinfo();
75: struct ca_record *find_ca_keyinfo();
76:
77: /*
78: * Check security parameters - return 0 or the number of the security error.
79: */
80:
81: /* ARGSUSED */
82: int check_security_parms(data, fnx, sp, sig, nameptr)
83: caddr_t data;
84: IFP fnx;
85: struct security_parms *sp;
86: struct signature *sig;
87: DN *nameptr;
88: {
89: extern long time();
90: long time_now;
91: long time_then;
92: long delta;
93:
94: /* If parameters are present, they must be valid */
95:
96: if (sp != (struct security_parms *) 0)
97: {
98: if (sp->sp_time != NULLCP)
99: {
100: (void) time(&time_now);
101: time_then = gtime(ut2tm(str2utct(sp->sp_time, strlen(sp->sp_time))));
102: delta = time_now - time_then;
103: }
104: else
105: delta = 0L;
106:
107: #ifndef NO_STATS
108: DLOG(log_stat, LLOG_NOTICE,
109: ("Delay=%D s, protection%s requested, certificate%s present",
110: delta,
111: (sp->sp_target == '\0') ? " not" : "",
112: (sp->sp_path == (struct certificate_list *) 0) ? " not" : ""
113: ));
114: /* NB : must use "" rather than NULLCP for the above to work. */
115: #endif
116: }
117:
118: /* If no signature is provided, nothing else to do */
119:
120: if (sig == (struct signature *) 0)
121: return (0);
122:
123: #ifndef NO_STATS
124: DLOG(log_stat, LLOG_NOTICE, ("Operation is signed"));
125: #endif
126:
127: /* Policy : signed messages must have security parameters present. */
128: if (sp == (struct security_parms *) 0)
129: return (DSE_SC_INVALIDCREDENTIALS);
130:
131: /* Policy: signed messages must have a time-stamp. */
132: if (sp->sp_time == NULLCP)
133: return (DSE_SC_INVALIDCREDENTIALS);
134:
135: /* Policy: a certification path must be provided. */
136: if (sp->sp_path == (struct certificate_list *) 0)
137: return (DSE_SC_INVALIDCREDENTIALS);
138:
139: return (DSE_SC_AUTHENTICATION);
140: }
141:
142:
143: /*
144: * Having decided that a CA is trusted (eg. by looking a tailor file),
145: * add its key to the cache.
146: */
147:
148: int add_ca_key(str)
149: char *str;
150: {
151: struct key_info key;
152: DN name;
153: char *ptr;
154: OID alg;
155:
156: ptr = index(str, '#');
157: if (ptr == NULLCP)
158: return (NOTOK);
159: *ptr = '\0';
160: ptr++;
161: name = str2dn(str);
162: if (name == NULLDN)
163: {
164: DLOG(log_dsap, LLOG_FATAL, ("Invalid CA name: %s", str));
165: return (NOTOK);
166: }
167:
168: str = ptr;
169: ptr = index(str, '#');
170: if (ptr == NULLCP)
171: return (NOTOK);
172: *ptr = '\0';
173: ptr++;
174: alg = name2oid(str);
175: if (alg == NULLOID)
176: {
177: DLOG(log_dsap, LLOG_FATAL, ("Invalid algorithm: %s", str));
178: return (NOTOK);
179: }
180: key.alg.algorithm = alg;
181:
182: str = ptr;
183: ptr = index(str, '#');
184: if (ptr == NULLCP)
185: {
186: DLOG(log_dsap, LLOG_FATAL, ("Algorithm parameters missing"));
187: return (NOTOK);
188: }
189: *ptr = '\0';
190: ptr++;
191: str2alg(str, &(key.alg));
192:
193: str = ptr;
194: str2encrypted(str, &(key.value), &(key.n_bits));
195:
196: return (add_ca_key_aux(name, &key));
197: }
198:
199: int add_ca_key_aux(name, key)
200: DN name;
201: struct key_info *key;
202: {
203: struct ca_record *new;
204:
205: pslog(log_dsap, LLOG_NOTICE, "Adding CA:", dn_print, (caddr_t) name);
206:
207: new = (struct ca_record *) calloc(1, sizeof(*new));
208: if (new == (struct ca_record *) 0)
209: return (NOTOK);
210:
211: new->name = name;
212: bcopy((char *)key, (char *)&(new->key), sizeof(struct key_info));
213: new->next = ca_key_cache;
214: ca_key_cache = new;
215:
216: return (OK);
217: }
218:
219:
220: /* ARGSUSED */
221: static struct ca_record *find_keyinfo_aux(cache, name)
222: struct ca_record *cache;
223: DN name;
224: {
225: struct ca_record *ptr;
226:
227: ptr = cache;
228:
229: while (ptr)
230: {
231: if (dn_cmp(name, ptr->name) == 0)
232: return (ptr);
233: ptr = ptr->next;
234: }
235:
236: return (ptr); /* ie. NULL */
237: }
238:
239: struct ca_record *find_user_keyinfo(name)
240: DN name;
241: {
242: return (find_keyinfo_aux(user_key_cache, name));
243: }
244:
245: struct ca_record *find_ca_keyinfo(name)
246: DN name;
247: {
248: return (find_keyinfo_aux(ca_key_cache, name));
249: }
250:
251: /*
252: * Read RSA secret key from a file.
253: */
254:
255: /* ARGSUSED */
256: int set_secret_key(str)
257: char *str;
258: {
259: int rc;
260:
261: return (NOTOK);
262: }
263:
264: /*
265: * Compute signature. To do this, have to know canonical BER encoding of the
266: * data structure. Hence, this routine takes a PEPY-produced encoder as one
267: * parameter, and uses it to produce a PE.
268: */
269:
270:
271: /* ARGSUSED */
272: struct signature *sign_operation(data, encfnx)
273: caddr_t data;
274: IFP encfnx;
275: {
276: return sign_operation_aux(data, encfnx, my_secret_key, my_key_parms);
277: }
278:
279: /* ARGSUSED */
280: struct signature *sign_operation_aux(type, fnx, key, parms)
281: caddr_t type;
282: IFP fnx;
283: struct RSASecretKey *key;
284: struct RSAParameters *parms;
285: {
286: struct signature *result;
287: unsigned *csig;
288: PE pe;
289:
290:
291: result = (struct signature *) calloc(1, sizeof(*result));
292:
293: result->encrypted = calloc(64, 1);
294: result->n_bits = 512;
295: result->alg.algorithm = oid_cpy(ode2oid("sq_mod_n_with_rsa"));
296: result->alg.p_type = ALG_PARM_NUMERIC;
297: result->alg.un.numeric = 512;
298:
299: return (result);
300: }
301:
302:
303:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.