Annotation of 43BSDReno/contrib/isode-beta/dsap/common/certificate.c, revision 1.1

1.1     ! root        1: /* certificate.c - Attribute Syntax for certificates */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/certificate.c,v 7.2 90/01/11 18:35:32 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/dsap/common/RCS/certificate.c,v 7.2 90/01/11 18:35:32 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       certificate.c,v $
        !            12:  * Revision 7.2  90/01/11  18:35:32  mrose
        !            13:  * real-sync
        !            14:  * 
        !            15:  * Revision 7.1  89/12/19  16:19:15  mrose
        !            16:  * sync
        !            17:  * 
        !            18:  * Revision 7.0  89/11/23  21:41:56  mrose
        !            19:  * Release 6.0
        !            20:  * 
        !            21:  */
        !            22: 
        !            23: /*
        !            24:  *                               NOTICE
        !            25:  *
        !            26:  *    Acquisition, use, and distribution of this module and related
        !            27:  *    materials are subject to the restrictions of a license agreement.
        !            28:  *    Consult the Preface in the User's Manual for the full terms of
        !            29:  *    this agreement.
        !            30:  *
        !            31:  */
        !            32: 
        !            33: 
        !            34: #include <stdio.h>
        !            35: 
        !            36: #include "quipu/util.h"
        !            37: #include "quipu/entry.h"
        !            38: #include "quipu/name.h"
        !            39: #include "quipu/authen.h"
        !            40: 
        !            41: PE cert_enc(parm)
        !            42: struct certificate *parm;
        !            43: {
        !            44: PE pe;
        !            45: 
        !            46:   (void) encode_AF_Certificate(&pe, 0, 0, NULLCP, parm);
        !            47:   return (pe);
        !            48: }
        !            49: 
        !            50: struct certificate *cert_dec(pe)
        !            51: PE pe;
        !            52: {
        !            53: struct certificate *result;
        !            54: 
        !            55:   if (decode_AF_Certificate(pe, 0, NULLIP, NULLVP, &result) == NOTOK)
        !            56:        return ((struct certificate *)NULL);
        !            57:   return (result);
        !            58: }
        !            59: 
        !            60: alg_cpy(a, b)
        !            61: struct alg_id *a, *b;
        !            62: {
        !            63:   a->algorithm = oid_cpy(b->algorithm);
        !            64: 
        !            65:   if (b->asn)
        !            66:     a->asn = pe_cpy(b->asn);
        !            67: 
        !            68:   a->p_type = b->p_type;
        !            69: 
        !            70:   if (b->p_type == ALG_PARM_NUMERIC)
        !            71:     a->un.numeric = b->un.numeric;
        !            72: }
        !            73: 
        !            74: struct certificate *cert_cpy(parm)
        !            75: struct certificate *parm;
        !            76: {
        !            77: struct certificate *result;
        !            78: 
        !            79:   result = (struct certificate *) calloc(1, sizeof(struct certificate));
        !            80: 
        !            81:   alg_cpy(&(result->sig.alg), &(parm->sig.alg));
        !            82:   result->sig.n_bits = parm->sig.n_bits;
        !            83:   result->sig.encrypted = malloc((unsigned)(parm->sig.n_bits+7)/8);
        !            84:   bcopy(parm->sig.encrypted, result->sig.encrypted, (parm->sig.n_bits+7)/8);
        !            85: 
        !            86:   alg_cpy(&(result->alg), &(parm->alg));
        !            87:   alg_cpy(&(result->key.alg), &(parm->key.alg));
        !            88:   result->serial = parm->serial;
        !            89:   result->version = parm->version;
        !            90:   result->issuer = dn_cpy(parm->issuer);
        !            91:   result->subject = dn_cpy(parm->subject);
        !            92:   result->valid.not_before =
        !            93:        strdup(parm->valid.not_before);
        !            94:   result->valid.not_after = 
        !            95:        strdup(parm->valid.not_after); 
        !            96:   result->key.n_bits = parm->key.n_bits;
        !            97:   result->key.value = malloc((unsigned)(parm->key.n_bits+7)/8);
        !            98:   bcopy(parm->key.value, result->key.value, 
        !            99:        (parm->key.n_bits+7)/8);
        !           100: 
        !           101:   return (result);
        !           102: }
        !           103: 
        !           104: cert_free(parm)
        !           105: struct certificate *parm;
        !           106: {
        !           107:   dn_free(parm->issuer);
        !           108:   dn_free(parm->subject); 
        !           109:   free((char *) parm);
        !           110: }
        !           111: 
        !           112: str2alg(str, alg)
        !           113: char *str;
        !           114: struct alg_id *alg;
        !           115: {
        !           116: PE asn2pe();
        !           117: 
        !           118:   if ((str == NULLCP) || (*str == '\0'))
        !           119:    {
        !           120:      alg->asn = NULLPE;
        !           121:      alg->p_type = ALG_PARM_ABSENT;
        !           122:    }
        !           123:   else if (strncmp(str,"{ASN}", 5) == 0)
        !           124:     {
        !           125:       alg->asn = asn2pe((char*)str+5);
        !           126:       alg->p_type = ALG_PARM_UNKNOWN;
        !           127:     }
        !           128:   else 
        !           129:     {
        !           130:       alg->asn=NULLPE;
        !           131:       alg->p_type = ALG_PARM_NUMERIC;
        !           132:       alg->un.numeric = atoi(str);
        !           133:     }
        !           134: }
        !           135: 
        !           136: str2encrypted(str, cp, len)
        !           137: char *str;
        !           138: char **cp;
        !           139: int *len;
        !           140: {
        !           141: int i;
        !           142: int l;
        !           143: int k = 0;
        !           144: int tmp;
        !           145: 
        !           146:   l=strlen(str);
        !           147:   if (str[l-1] == '#') l--;
        !           148:   if ((l>2) && str[l-2] == '-')
        !           149:   {
        !           150:     k = atoi(&(str[l-1]));
        !           151:     l = l-2;
        !           152:   }
        !           153:   *cp = malloc((unsigned)(l+1)/2);
        !           154:   *len = 8*((l+1)/2) - k;
        !           155:   for (i=0;i<(l+1)/2;i++)
        !           156:   {
        !           157:    (void) sscanf(str+2*i, "%02x", &tmp);
        !           158:    (*cp)[i] = tmp & 255;
        !           159:   }
        !           160: }
        !           161: 
        !           162: 
        !           163: struct certificate *str2cert(str)
        !           164: char *str;
        !           165: {
        !           166: struct certificate *result;
        !           167: char *ptr;
        !           168: OID oid;
        !           169: 
        !           170:   result = (struct certificate *) calloc(1, sizeof(*result));
        !           171: 
        !           172:   ptr = index(str, '#');
        !           173:   if (ptr == NULLCP)
        !           174:   {
        !           175:     parse_error("Algorithm not present",NULLCP);
        !           176:     free((char *)result);
        !           177:     return (struct certificate *) 0;
        !           178:   }
        !           179:   *ptr = '\0';
        !           180:   ptr++;
        !           181: 
        !           182:   oid = name2oid(str);
        !           183:   if (oid == NULLOID)
        !           184:   {
        !           185:     parse_error("Bad algorithm identifier",NULLCP);
        !           186:     free((char *)result);
        !           187:     return (struct certificate *) 0;
        !           188:   }
        !           189: 
        !           190:   result->sig.alg.algorithm = oid;
        !           191: 
        !           192:   str = ptr;
        !           193:   ptr = index(str, '#');
        !           194:   if (ptr == NULLCP)
        !           195:   {
        !           196:     parse_error("Parameters not present",NULLCP);
        !           197:     free((char*)result);
        !           198:     return (struct certificate *) 0;
        !           199:   }
        !           200:   *ptr = '\0';
        !           201:   ptr++;
        !           202: 
        !           203:   str2alg(str, &(result->sig.alg));
        !           204: 
        !           205:   str = ptr;
        !           206:   ptr = index(str, '#');
        !           207:   if (ptr == NULLCP)
        !           208:   {
        !           209:     parse_error("Signature not present",NULLCP);
        !           210:     free((char*)result);
        !           211:     return (struct certificate *) 0;
        !           212:   }
        !           213:   *ptr = '\0';
        !           214:   ptr++;
        !           215: 
        !           216:   str2encrypted(str, &(result->sig.encrypted), &(result->sig.n_bits));
        !           217: 
        !           218:   str = ptr;
        !           219:   ptr = index(str, '#');
        !           220:   if (ptr == NULLCP)
        !           221:   {
        !           222:     parse_error("Issuer not present",NULLCP);
        !           223:     free((char*)result);
        !           224:     return (struct certificate *) 0;
        !           225:   }
        !           226:   *ptr = '\0';
        !           227:   ptr++;
        !           228: 
        !           229:   result->issuer = str2dn(str);
        !           230: 
        !           231:   str = ptr;
        !           232:   ptr = index(str, '#');
        !           233:   if (ptr == NULLCP)
        !           234:   {
        !           235:     parse_error("Subject not present",NULLCP);
        !           236:     free((char*)result);
        !           237:     return (struct certificate *) 0;
        !           238:   }
        !           239:   *ptr = '\0';
        !           240:   ptr++;
        !           241: 
        !           242:   result->subject = str2dn(str);
        !           243: 
        !           244:   str = ptr;
        !           245:   ptr = index(str, '#');
        !           246:   if (ptr == NULLCP)
        !           247:   {
        !           248:     parse_error("Algorithm not present",NULLCP);
        !           249:     free((char*)result);
        !           250:     return (struct certificate *) 0;
        !           251:   }
        !           252:   *ptr = '\0';
        !           253:   ptr++;
        !           254: 
        !           255:   oid = name2oid(str);
        !           256:   if (oid == NULLOID)
        !           257:   {
        !           258:     parse_error("Bad algorithm identifier",NULLCP);
        !           259:     free((char*)result);
        !           260:     return (struct certificate *) 0;
        !           261:   }
        !           262: 
        !           263:   result->alg.algorithm = oid;
        !           264: 
        !           265:   str = ptr;
        !           266:   ptr = index(str, '#');
        !           267:   if (ptr == NULLCP)
        !           268:   {
        !           269:     parse_error("Parameters not present",NULLCP);
        !           270:     free((char*)result);
        !           271:     return (struct certificate *) 0;
        !           272:   }
        !           273:   *ptr = '\0';
        !           274:   ptr++;
        !           275: 
        !           276:   str2alg(str, &(result->alg));
        !           277: 
        !           278:   str = ptr;
        !           279:   ptr = index(str, '#');
        !           280:   if (ptr == NULLCP)
        !           281:   {
        !           282:     parse_error("Version Number not present",NULLCP);
        !           283:     free((char*)result);
        !           284:     return (struct certificate *) 0;
        !           285:   }
        !           286:   *ptr = '\0';
        !           287:   ptr++;
        !           288: 
        !           289:   result->version = atoi(str);
        !           290: 
        !           291:   str = ptr;
        !           292:   ptr = index(str, '#');
        !           293:   if (ptr == NULLCP)
        !           294:   {
        !           295:     parse_error("Serial Number not present",NULLCP);
        !           296:     free((char*)result);
        !           297:     return (struct certificate *) 0;
        !           298:   }
        !           299:   *ptr = '\0';
        !           300:   ptr++;
        !           301: 
        !           302:   result->serial = atoi(str);
        !           303: 
        !           304:   str = ptr;
        !           305:   ptr = index(str, '#');
        !           306:   if (ptr == NULLCP)
        !           307:   {
        !           308:     parse_error("Start time not present",NULLCP);
        !           309:     free((char*)result);
        !           310:     return (struct certificate *) 0;
        !           311:   }
        !           312:   *ptr = '\0';
        !           313:   ptr++;
        !           314: 
        !           315:   result->valid.not_before = strdup(str);
        !           316: 
        !           317:   str = ptr;
        !           318:   ptr = index(str, '#');
        !           319:   if (ptr == NULLCP)
        !           320:   {
        !           321:     parse_error("End time not present",NULLCP);
        !           322:     free((char*)result);
        !           323:     return (struct certificate *) 0;
        !           324:   }
        !           325:   *ptr = '\0';
        !           326:   ptr++;
        !           327: 
        !           328:   result->valid.not_after = strdup(str);
        !           329: 
        !           330:   str = ptr;
        !           331:   ptr = index(str, '#');
        !           332:   if (ptr == NULLCP)
        !           333:   {
        !           334:     free((char*)result);
        !           335:     return (struct certificate *) 0;
        !           336:   }
        !           337:   *ptr = '\0';
        !           338:   ptr++;
        !           339: 
        !           340:   oid = name2oid(str);
        !           341:   if (oid == NULLOID)
        !           342:   {
        !           343:     free((char*)result);
        !           344:     return (struct certificate *) 0;
        !           345:   }
        !           346: 
        !           347:   result->key.alg.algorithm = oid;
        !           348: 
        !           349:   str = ptr;
        !           350:   ptr = index(str, '#');
        !           351:   if (ptr == NULLCP)
        !           352:   {
        !           353:     free((char*)result);
        !           354:     return (struct certificate *) 0;
        !           355:   }
        !           356:   *ptr = '\0';
        !           357:   ptr++;
        !           358: 
        !           359:   str2alg(str, &(result->key.alg));
        !           360: 
        !           361:   str = ptr;
        !           362: 
        !           363:   str2encrypted(str, &(result->key.value), &(result->key.n_bits));
        !           364: 
        !           365:   return (result);
        !           366: }
        !           367: 
        !           368: print_algid(ps, parm, format)
        !           369: PS ps;
        !           370: struct alg_id *parm;
        !           371: int format;
        !           372: {
        !           373:   ps_printf(ps, "%s#", oid2name (parm->algorithm, OIDPART));
        !           374: 
        !           375:   switch(parm->p_type) {
        !           376:      case ALG_PARM_ABSENT:
        !           377:        ps_printf(ps, "#");
        !           378:        break;
        !           379:      case ALG_PARM_NUMERIC:
        !           380:        if (format == READOUT)
        !           381:          ps_printf(ps, "%d#", parm->un.numeric);
        !           382:        else
        !           383:          ps_printf(ps, "%d#", parm->un.numeric);
        !           384:        break;
        !           385:       default:
        !           386:        if (format == READOUT)
        !           387:        {
        !           388:          if ((parm->asn->pe_class == PE_CLASS_UNIV)
        !           389:            &&(parm->asn->pe_form  == PE_FORM_PRIM)
        !           390:            &&(parm->asn->pe_id    == PE_PRIM_INT))
        !           391:            ps_printf(ps, "%d", prim2num(parm->asn));
        !           392:          else
        !           393:          {
        !           394:            vpushquipu (ps);
        !           395:            vunknown(parm->asn);
        !           396:           vpopquipu ();
        !           397:          }
        !           398:        }
        !           399:        else
        !           400:        {
        !           401:        /* This routine will print a {ASN} prefix */
        !           402:          pe_print(ps, parm->asn, format);
        !           403:        }
        !           404:        ps_printf(ps, "#");
        !           405:    }
        !           406: }
        !           407: 
        !           408: print_encrypted(ps, str, n_bits, format)
        !           409: PS ps;
        !           410: char *str;
        !           411: int n_bits;
        !           412: int format;
        !           413: {
        !           414: int i;
        !           415: 
        !           416: /* The end-user doesn't care what the signature is, so don't display it */
        !           417: 
        !           418:   if (format != READOUT)
        !           419:   {
        !           420:     for (i=0;i<(n_bits+7)/8;i++)
        !           421:       ps_printf(ps, "%02x", str[i] & 255);
        !           422:   
        !           423:     if ((i = (n_bits % 8)) != 0)
        !           424:       ps_printf(ps, "-%d", 8-i);
        !           425: 
        !           426:     ps_printf(ps, "#");
        !           427:   }
        !           428: 
        !           429: }
        !           430: 
        !           431: 
        !           432: printcert(ps, parm, format)
        !           433: PS ps;
        !           434: struct certificate *parm;
        !           435: int format;
        !           436: {
        !           437:   print_algid(ps, &(parm->sig.alg), format);
        !           438:   print_encrypted(ps, parm->sig.encrypted, parm->sig.n_bits, format);
        !           439: 
        !           440:   dn_print(ps, parm->issuer, EDBOUT);
        !           441:   ps_printf(ps, "#");
        !           442:   dn_print(ps, parm->subject, EDBOUT);
        !           443:   ps_printf(ps, "#");
        !           444:   print_algid(ps, &(parm->alg), format);
        !           445:   ps_printf(ps, "%d#", parm->version);
        !           446:   ps_printf(ps, "%d#", parm->serial);
        !           447: 
        !           448:   utcprint(ps, parm->valid.not_before, format);
        !           449:   ps_printf(ps, "#");
        !           450:   utcprint(ps, parm->valid.not_after, format);
        !           451:   ps_printf(ps, "#");
        !           452: 
        !           453:   print_algid(ps, &(parm->key.alg), format);
        !           454:   print_encrypted(ps, parm->key.value, 
        !           455:        parm->key.n_bits, format);
        !           456: }
        !           457: 
        !           458: int cert_cmp(a, b)
        !           459: struct certificate *a, *b;
        !           460: {
        !           461: int ret;
        !           462: 
        !           463:   ret = dn_cmp(a->issuer, b->issuer);
        !           464:   if (ret != 0)
        !           465:     return (ret);
        !           466: 
        !           467:   ret = dn_cmp(a->subject, b->subject);
        !           468:   if (ret != 0)
        !           469:     return (ret);
        !           470: 
        !           471:   if (a->version > b->version)
        !           472:     return (1);
        !           473:   if (a->version < b->version)
        !           474:     return (-1);
        !           475: 
        !           476:   if (a->serial > b->serial)
        !           477:     return (1);
        !           478:   if (a->serial < b->serial)
        !           479:     return (-1);
        !           480: 
        !           481:   /* issuer, subject, version and serial should uniquely identify the
        !           482:    * certificate.
        !           483:    */
        !           484: 
        !           485:   return (0);
        !           486: }
        !           487: 
        !           488: certificate_syntax()
        !           489: {
        !           490:   (void) add_attribute_syntax(
        !           491:        "Certificate",
        !           492:        (IFP) cert_enc, (IFP) cert_dec,
        !           493:        (IFP) str2cert, (IFP) printcert,
        !           494:        (IFP) cert_cpy, (IFP) cert_cmp,
        !           495:        cert_free,      NULLCP,
        !           496:        NULLIFP,        TRUE);
        !           497: }

unix.superglobalmegacorp.com

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