|
|
1.1 ! root 1: /* revoke.c - Certificate List attribute syntax */ ! 2: ! 3: /* This syntax is still at the testing stage. Accordingly, quipu should ! 4: * not load this syntax (just in case). ! 5: */ ! 6: ! 7: ! 8: #ifndef lint ! 9: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/revoke.c,v 7.2 90/01/11 18:35:36 mrose Exp $"; ! 10: #endif ! 11: ! 12: /* ! 13: * $Header: /f/osi/dsap/common/RCS/revoke.c,v 7.2 90/01/11 18:35:36 mrose Exp $ ! 14: * ! 15: * ! 16: * $Log: revoke.c,v $ ! 17: * Revision 7.2 90/01/11 18:35:36 mrose ! 18: * real-sync ! 19: * ! 20: * Revision 7.1 89/12/19 16:19:31 mrose ! 21: * sync ! 22: * ! 23: * Revision 7.0 89/11/23 21:47:45 mrose ! 24: * Release 6.0 ! 25: * ! 26: */ ! 27: ! 28: /* ! 29: * NOTICE ! 30: * ! 31: * Acquisition, use, and distribution of this module and related ! 32: * materials are subject to the restrictions of a license agreement. ! 33: * Consult the Preface in the User's Manual for the full terms of ! 34: * this agreement. ! 35: * ! 36: */ ! 37: ! 38: ! 39: #include <stdio.h> ! 40: ! 41: #include "quipu/util.h" ! 42: #include "quipu/entry.h" ! 43: #include "quipu/bind.h" ! 44: ! 45: PE enc_revoke(parm) ! 46: struct revocation_list *parm; ! 47: { ! 48: PE pe; ! 49: encode_AF_CertificateList(&pe, 0, 0, NULLCP, parm); ! 50: return (pe); ! 51: } ! 52: ! 53: struct revocation_list *dec_revoke(pe) ! 54: PE pe; ! 55: { ! 56: struct revocation_list *result; ! 57: ! 58: if (decode_AF_CertificateList(pe, 0, NULLIP, NULLVP, &result) == NOTOK) ! 59: return (struct revocation_list *) 0; ! 60: return (result); ! 61: } ! 62: ! 63: struct revocation_list *str2revoke(str) ! 64: char *str; ! 65: { ! 66: struct revocation_list *result; ! 67: struct revoked_certificate *cert; ! 68: struct revoked_certificate **last; ! 69: OID oid; ! 70: char *ptr; ! 71: ! 72: result = (struct revocation_list *) calloc(1, sizeof(*result)); ! 73: if (result == (struct revocation_list *) 0) ! 74: return (result); ! 75: ! 76: ptr = index(str, '#'); ! 77: if (ptr) ! 78: { ! 79: *ptr = '\0'; ! 80: ptr++; ! 81: } ! 82: else ! 83: return (struct revocation_list *) 0; ! 84: ! 85: oid = name2oid(str); ! 86: if (oid == NULLOID) ! 87: { ! 88: parse_error("Invalid OID %s", str); ! 89: return (struct revocation_list *) 0; ! 90: } ! 91: result->sig.alg.algorithm = oid; ! 92: ! 93: str = ptr; ! 94: ptr = index(str, '#'); ! 95: if (ptr) ! 96: { ! 97: *ptr = '\0'; ! 98: ptr++; ! 99: } ! 100: else ! 101: return (struct revocation_list *) 0; ! 102: ! 103: str2alg(str, &(result->sig.alg)); ! 104: ! 105: str=ptr; ! 106: ptr = index(str, '#'); ! 107: if (ptr) ! 108: { ! 109: *ptr = '\0'; ! 110: ptr++; ! 111: } ! 112: ! 113: str2encrypted(str, &(result->sig.encrypted), &(result->sig.n_bits)); ! 114: ! 115: str=ptr; ! 116: ptr = index(str, '#'); ! 117: if (ptr) ! 118: { ! 119: *ptr = '\0'; ! 120: ptr++; ! 121: } ! 122: ! 123: result->issuer = str2dn(str); ! 124: ! 125: str=ptr; ! 126: ptr = index(str, '#'); ! 127: if (ptr) ! 128: { ! 129: *ptr = '\0'; ! 130: ptr++; ! 131: } ! 132: else ! 133: return (struct revocation_list *) 0; ! 134: ! 135: oid = name2oid(str); ! 136: if (oid == NULLOID) ! 137: { ! 138: parse_error("Invalid OID %s", str); ! 139: return (struct revocation_list *) 0; ! 140: } ! 141: result->alg.algorithm = oid; ! 142: ! 143: str=ptr; ! 144: ptr = index(str, '#'); ! 145: if (ptr) ! 146: { ! 147: *ptr = '\0'; ! 148: ptr++; ! 149: } ! 150: else return (struct revocation_list *) 0; ! 151: ! 152: str2alg(str, &(result->alg)); ! 153: ! 154: str=ptr; ! 155: ptr = index(str, '#'); ! 156: if (ptr) ! 157: { ! 158: *ptr = '\0'; ! 159: ptr++; ! 160: } ! 161: /* This may be the end of the string */ ! 162: ! 163: result->last_update = strdup(str); ! 164: ! 165: if ((str = ptr) == NULLCP) ! 166: return (result); ! 167: ptr = index(str, '#'); ! 168: if (ptr == NULLCP) ! 169: return(result); ! 170: ! 171: *ptr = '\0'; ! 172: ptr++; ! 173: ! 174: oid = name2oid(str); ! 175: result->sig2.alg.algorithm = oid; ! 176: ! 177: str=ptr; ! 178: ptr = index(str, '#'); ! 179: if (ptr) ! 180: { ! 181: *ptr = '\0'; ! 182: ptr++; ! 183: } ! 184: else ! 185: return (struct revocation_list *) 0; ! 186: ! 187: str2alg(str, &(result->sig2.alg)); ! 188: ! 189: str=ptr; ! 190: ptr = index(str, '#'); ! 191: if (ptr) ! 192: { ! 193: *ptr = '\0'; ! 194: ptr++; ! 195: } ! 196: /* This may be the end of the string */ ! 197: ! 198: str2encrypted(str, &(result->sig2.encrypted), &(result->sig2.n_bits)); ! 199: ! 200: last = (struct revoked_certificate **) &(result->revoked); ! 201: ! 202: while (str = ptr, ((ptr = index(str, '#')) != NULLCP)) ! 203: { ! 204: *ptr = '\0'; ! 205: ptr++; ! 206: ! 207: cert = (struct revoked_certificate *) calloc(1, sizeof(*cert)); ! 208: if (cert == (struct revoked_certificate *) 0) ! 209: return ((struct revocation_list *) 0); ! 210: ! 211: *last = cert; ! 212: last = &(cert->next); ! 213: cert->next = (struct revoked_certificate *) 0; ! 214: ! 215: cert->subject = str2dn(str); ! 216: if (cert->subject == NULLDN) ! 217: { ! 218: parse_error("Invalid DN %s", str); ! 219: return ((struct revocation_list *) 0); ! 220: } ! 221: ! 222: str=ptr; ! 223: ptr = index(str, '#'); ! 224: if (ptr) ! 225: { ! 226: *ptr = '\0'; ! 227: ptr++; ! 228: } ! 229: else ! 230: return (struct revocation_list *) 0; ! 231: ! 232: oid = name2oid(str); ! 233: if (oid == NULLOID) ! 234: { ! 235: parse_error("Invalid OID %s", str); ! 236: return (struct revocation_list *) 0; ! 237: } ! 238: ! 239: cert->alg.algorithm = oid; ! 240: ! 241: str=ptr; ! 242: ptr = index(str, '#'); ! 243: if (ptr) ! 244: { ! 245: *ptr = '\0'; ! 246: ptr++; ! 247: } ! 248: else ! 249: return (struct revocation_list *) 0; ! 250: ! 251: str2alg(str, &(cert->alg)); ! 252: ! 253: str=ptr; ! 254: ptr = index(str, '#'); ! 255: if (ptr) ! 256: { ! 257: *ptr = '\0'; ! 258: ptr++; ! 259: } ! 260: else ! 261: return (struct revocation_list *) 0; ! 262: ! 263: cert->serial = atoi(str); ! 264: ! 265: str=ptr; ! 266: ptr = index(str, '#'); ! 267: if (ptr) ! 268: { ! 269: *ptr = '\0'; ! 270: ptr++; ! 271: } ! 272: /* may be the end of the string */ ! 273: ! 274: cert->revocation_date = strdup(str); ! 275: ! 276: } ! 277: ! 278: return (result); ! 279: } ! 280: ! 281: print_revoked(ps, parm, format) ! 282: PS ps; ! 283: struct revoked_certificate *parm; ! 284: int format; ! 285: { ! 286: struct revoked_certificate *tmp; ! 287: ! 288: tmp = parm; ! 289: while (tmp) ! 290: { ! 291: dn_print(ps, tmp->subject, EDBOUT); ! 292: ps_printf(ps, "#"); ! 293: print_algid(ps, &(tmp->alg), format); ! 294: ps_printf(ps, "%d#", tmp->serial); ! 295: ps_printf(ps, "%s#", tmp->revocation_date); ! 296: tmp = tmp->next; ! 297: } ! 298: } ! 299: ! 300: print_revoke(ps, parm, format) ! 301: PS ps; ! 302: struct revocation_list *parm; ! 303: int format; ! 304: { ! 305: print_algid(ps, &(parm->sig.alg), format); ! 306: print_encrypted(ps, parm->sig.encrypted, parm->sig.n_bits, format); ! 307: ! 308: dn_print(ps, parm->issuer, EDBOUT); ! 309: ps_printf(ps, "#"); ! 310: print_algid(ps, &(parm->alg), format); ! 311: utcprint(ps, parm->last_update, format); ! 312: ps_printf(ps, "#"); ! 313: if (parm->revoked) ! 314: { ! 315: print_algid(ps, &(parm->sig2.alg), format); ! 316: print_encrypted(ps, parm->sig2.encrypted, ! 317: parm->sig2.n_bits, format); ! 318: print_revoked(ps, parm->revoked, format); ! 319: } ! 320: ! 321: } ! 322: ! 323: struct revocation_list *revoke_cpy(parm) ! 324: struct revocation_list *parm; ! 325: { ! 326: return (parm); ! 327: } ! 328: ! 329: revoke_cmp(a, b) ! 330: struct revocation_list *a, *b; ! 331: { ! 332: int ret; ! 333: ! 334: ret = dn_cmp(a->issuer, b->issuer); ! 335: if (ret != 0) ! 336: return (ret); ! 337: ret = strcmp(a->last_update, b->last_update); ! 338: if (ret != 0) ! 339: return (ret); ! 340: ! 341: return (0); ! 342: } ! 343: ! 344: /* ARGSUSED */ ! 345: ! 346: revoke_free(parm) ! 347: struct signature *parm; ! 348: { ! 349: } ! 350: ! 351: revoke_syntax() ! 352: { ! 353: (void) add_attribute_syntax( ! 354: "CertificateList", ! 355: (IFP)enc_revoke, (IFP)dec_revoke, ! 356: (IFP)str2revoke, print_revoke, ! 357: (IFP)revoke_cpy, revoke_cmp, ! 358: revoke_free, NULLCP, ! 359: NULLIFP, TRUE); ! 360: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.