Annotation of 43BSDReno/contrib/isode-beta/quipu/security.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.