|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 6160 (0x1810) Types: TextFile Names: »security.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/quipu/security.c«
/* security.c - Check security parameters */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/security.c,v 7.1 89/12/19 16:20:47 mrose Exp $"; #endif /* * $Header: /f/osi/quipu/RCS/security.c,v 7.1 89/12/19 16:20:47 mrose Exp $ * * * $Log: security.c,v $ * Revision 7.1 89/12/19 16:20:47 mrose * sync * * Revision 6.0 89/09/08 10:20:02 mrose * *** empty log message *** * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include "logger.h" #include "quipu/ds_error.h" #include "quipu/commonarg.h" extern int encode_AF_CertificateToSign(); extern int dn_print(); extern LLog *log_dsap; #ifndef NO_STATS extern LLog *log_stat; #endif caddr_t compute_signature(); int pe2hash(); /* * Cache holding keys of trusted certification authorities */ struct ca_record *ca_key_cache = (struct ca_record *) 0; /* * Cache holding keys of users (untrusted) */ struct ca_record *user_key_cache = (struct ca_record *) 0; /* * Own certificate. (For convenient access). */ struct certificate *my_certificate = (struct certificate *) 0; /* * RSA secret key. */ static caddr_t my_secret_key; static caddr_t my_key_parms; struct ca_record *find_user_keyinfo(); struct ca_record *find_ca_keyinfo(); /* * Check security parameters - return 0 or the number of the security error. */ /* ARGSUSED */ int check_security_parms(data, fnx, sp, sig, nameptr) caddr_t data; IFP fnx; struct security_parms *sp; struct signature *sig; DN *nameptr; { extern long time(); long time_now; long time_then; long delta; /* If parameters are present, they must be valid */ if (sp != (struct security_parms *) 0) { if (sp->sp_time != NULLCP) { (void) time(&time_now); time_then = gtime(ut2tm(str2utct(sp->sp_time, strlen(sp->sp_time)))); delta = time_now - time_then; } else delta = 0L; #ifndef NO_STATS DLOG(log_stat, LLOG_NOTICE, ("Delay=%D s, protection%s requested, certificate%s present", delta, (sp->sp_target == '\0') ? " not" : "", (sp->sp_path == (struct certificate_list *) 0) ? " not" : "" )); /* NB : must use "" rather than NULLCP for the above to work. */ #endif } /* If no signature is provided, nothing else to do */ if (sig == (struct signature *) 0) return (0); #ifndef NO_STATS DLOG(log_stat, LLOG_NOTICE, ("Operation is signed")); #endif /* Policy : signed messages must have security parameters present. */ if (sp == (struct security_parms *) 0) return (DSE_SC_INVALIDCREDENTIALS); /* Policy: signed messages must have a time-stamp. */ if (sp->sp_time == NULLCP) return (DSE_SC_INVALIDCREDENTIALS); /* Policy: a certification path must be provided. */ if (sp->sp_path == (struct certificate_list *) 0) return (DSE_SC_INVALIDCREDENTIALS); return (DSE_SC_AUTHENTICATION); } /* * Having decided that a CA is trusted (eg. by looking a tailor file), * add its key to the cache. */ int add_ca_key(str) char *str; { struct key_info key; DN name; char *ptr; OID alg; ptr = index(str, '#'); if (ptr == NULLCP) return (NOTOK); *ptr = '\0'; ptr++; name = str2dn(str); if (name == NULLDN) { DLOG(log_dsap, LLOG_FATAL, ("Invalid CA name: %s", str)); return (NOTOK); } str = ptr; ptr = index(str, '#'); if (ptr == NULLCP) return (NOTOK); *ptr = '\0'; ptr++; alg = name2oid(str); if (alg == NULLOID) { DLOG(log_dsap, LLOG_FATAL, ("Invalid algorithm: %s", str)); return (NOTOK); } key.alg.algorithm = alg; str = ptr; ptr = index(str, '#'); if (ptr == NULLCP) { DLOG(log_dsap, LLOG_FATAL, ("Algorithm parameters missing")); return (NOTOK); } *ptr = '\0'; ptr++; str2alg(str, &(key.alg)); str = ptr; str2encrypted(str, &(key.value), &(key.n_bits)); return (add_ca_key_aux(name, &key)); } int add_ca_key_aux(name, key) DN name; struct key_info *key; { struct ca_record *new; pslog(log_dsap, LLOG_NOTICE, "Adding CA:", dn_print, (caddr_t) name); new = (struct ca_record *) calloc(1, sizeof(*new)); if (new == (struct ca_record *) 0) return (NOTOK); new->name = name; bcopy((char *)key, (char *)&(new->key), sizeof(struct key_info)); new->next = ca_key_cache; ca_key_cache = new; return (OK); } /* ARGSUSED */ static struct ca_record *find_keyinfo_aux(cache, name) struct ca_record *cache; DN name; { struct ca_record *ptr; ptr = cache; while (ptr) { if (dn_cmp(name, ptr->name) == 0) return (ptr); ptr = ptr->next; } return (ptr); /* ie. NULL */ } struct ca_record *find_user_keyinfo(name) DN name; { return (find_keyinfo_aux(user_key_cache, name)); } struct ca_record *find_ca_keyinfo(name) DN name; { return (find_keyinfo_aux(ca_key_cache, name)); } /* * Read RSA secret key from a file. */ /* ARGSUSED */ int set_secret_key(str) char *str; { return (NOTOK); } /* * Compute signature. To do this, have to know canonical BER encoding of the * data structure. Hence, this routine takes a PEPY-produced encoder as one * parameter, and uses it to produce a PE. */ struct signature *sign_operation_aux(); /* ARGSUSED */ struct signature *sign_operation(data, encfnx) caddr_t data; IFP encfnx; { return sign_operation_aux(data, encfnx, my_secret_key, my_key_parms); } /* ARGSUSED */ struct signature *sign_operation_aux(data, encfnx, secret, parms) caddr_t data; IFP encfnx; caddr_t secret; caddr_t parms; { struct signature *result; result = (struct signature *) calloc(1, sizeof(*result)); if (result == (struct signature *) 0) return (result); result->alg.algorithm = name2oid("2.5.8.3.1"); /* sq_mod_n_with_rsa */ result->alg.p_type = ALG_PARM_NUMERIC; result->alg.un.numeric = 512; result->encrypted = calloc(64, 1); result->n_bits = 512; return (result); } /* ARGSUSED */ int check_signature(data, fnx, sig, public, parms) caddr_t data; IFP fnx; struct signature *sig; caddr_t public; caddr_t parms; { return (NOTOK); }