certificate.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 530 行

C
530
字号
/* certificate.c - Attribute Syntax for certificates */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/dsap/common/RCS/certificate.c,v 9.0 1992/06/16 12:12:39 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/dsap/common/RCS/certificate.c,v 9.0 1992/06/16 12:12:39 isode Rel $ * * * $Log: certificate.c,v $ * Revision 9.0  1992/06/16  12:12:39  isode * Release 8.0 * *//* *				  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 <stdio.h>#include "quipu/util.h"#include "quipu/entry.h"#include "quipu/name.h"#include "quipu/authen.h"#include "quipu/syntaxes.h"PE cert_enc(parm)struct certificate *parm;{PE pe;  (void) encode_AF_Certificate(&pe, 0, 0, NULLCP, parm);  return (pe);}struct certificate *cert_dec(pe)PE pe;{struct certificate *result;  if (decode_AF_Certificate(pe, 0, NULLIP, NULLVP, &result) == NOTOK)	return ((struct certificate *)NULL);  return (result);}alg_cpy(a, b)struct alg_id *a, *b;{  a->algorithm = oid_cpy(b->algorithm);  if (b->asn)    a->asn = pe_cpy(b->asn);  a->p_type = b->p_type;  if (b->p_type == ALG_PARM_NUMERIC)    a->un.numeric = b->un.numeric;}struct certificate *cert_cpy(parm)struct certificate *parm;{struct certificate *result;  result = (struct certificate *) calloc(1, sizeof(struct certificate));  alg_cpy(&(result->sig.alg), &(parm->sig.alg));  result->sig.n_bits = parm->sig.n_bits;  result->sig.encrypted = malloc((unsigned)(parm->sig.n_bits+7)/8);  bcopy(parm->sig.encrypted, result->sig.encrypted, (parm->sig.n_bits+7)/8);  alg_cpy(&(result->alg), &(parm->alg));  alg_cpy(&(result->key.alg), &(parm->key.alg));  result->serial = parm->serial;  result->version = parm->version;  result->issuer = dn_cpy(parm->issuer);  result->subject = dn_cpy(parm->subject);  result->valid.not_before =	strdup(parm->valid.not_before);  result->valid.not_after = 	strdup(parm->valid.not_after);   result->key.n_bits = parm->key.n_bits;  result->key.value = malloc((unsigned)(parm->key.n_bits+7)/8);  bcopy(parm->key.value, result->key.value, 	(parm->key.n_bits+7)/8);  return (result);}cert_free(parm)struct certificate *parm;{  dn_free(parm->issuer);  dn_free(parm->subject);   if (parm->sig.alg.algorithm)      oid_free (parm->sig.alg.algorithm);  parm->sig.alg.algorithm = NULLOID;  if (parm->alg.algorithm)      oid_free (parm->alg.algorithm);  parm->alg.algorithm = NULLOID;  if (parm->key.alg.algorithm)      oid_free (parm->key.alg.algorithm);  parm->key.alg.algorithm = NULLOID;  if (parm->sig.encrypted)      free (parm->sig.encrypted);  parm->sig.encrypted = NULLCP;  if (parm->key.value)      free (parm->key.value);  parm->key.value = NULLCP;  if (parm->valid.not_before)      free (parm->valid.not_before);  parm->valid.not_before = NULLCP;  if (parm->valid.not_after)      free (parm->valid.not_after);  parm->valid.not_after = NULLCP;  if (parm->key.alg.p_type == ALG_PARM_UNKNOWN)      pe_free (parm->key.alg.asn);  parm->key.alg.asn = NULLPE;  free((char *) parm);}str2alg(str, alg)char *str;struct alg_id *alg;{PE asn2pe();  if ((str == NULLCP) || (*str == '\0'))   {     alg->asn = NULLPE;     alg->p_type = ALG_PARM_ABSENT;   }  else if (strncmp(str,"{ASN}", 5) == 0)    {      alg->asn = asn2pe((char*)str+5);      alg->p_type = ALG_PARM_UNKNOWN;    }  else     {      alg->asn=NULLPE;      alg->p_type = ALG_PARM_NUMERIC;      alg->un.numeric = atoi(str);    }}str2encrypted(str, cp, len)char *str;char **cp;int *len;{int i;int l;int k = 0;int tmp;  l=strlen(str);  if (str[l-1] == '#') l--;  if ((l>2) && str[l-2] == '-')  {    k = atoi(&(str[l-1]));    l = l-2;  }  *cp = malloc((unsigned)(l+1)/2);  *len = 8*((l+1)/2) - k;  for (i=0;i<(l+1)/2;i++)  {   (void) sscanf(str+2*i, "%02x", &tmp);   (*cp)[i] = tmp & 255;  }}struct certificate *str2cert(str)char *str;{struct certificate *result;char *ptr;OID oid;  result = (struct certificate *) calloc(1, sizeof(*result));  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Algorithm not present (SIGNED Value)",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  oid = name2oid(SkipSpace(str));  if (oid == NULLOID)  {    parse_error("Bad algorithm identifier (SIGNED Value)",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  result->sig.alg.algorithm = oid;  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Parameters not present (SIGNED Value)",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  str2alg(str, &(result->sig.alg));  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Signature not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  str2encrypted(str, &(result->sig.encrypted), &(result->sig.n_bits));  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Issuer not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  result->issuer = str2dn(str);  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Subject not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  result->subject = str2dn(str);  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Algorithm not present (\"signature\")",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  oid = name2oid(SkipSpace(str));  if (oid == NULLOID)  {    parse_error("Bad algorithm identifier (\"signature\")",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  result->alg.algorithm = oid;  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Parameters not present (\"signature\")",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  str2alg(str, &(result->alg));  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Version Number not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  result->version = atoi(str);  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Serial Number not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  result->serial = atoi(str);  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("Start time not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  result->valid.not_before = strdup(str);  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    parse_error("End time not present",NULLCP);    cert_free(result);     return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  result->valid.not_after = strdup(str);  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    free((char*)result);    return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  oid = name2oid(SkipSpace(str));  if (oid == NULLOID)  {    free((char*)result);    return (struct certificate *) 0;  }  result->key.alg.algorithm = oid;  str = ptr;  ptr = index(str, '#');  if (ptr == NULLCP)  {    free((char*)result);    return (struct certificate *) 0;  }  *ptr = '\0';  ptr++;  str2alg(str, &(result->key.alg));  str = ptr;  str2encrypted(str, &(result->key.value), &(result->key.n_bits));  return (result);}print_algid(ps, parm, format)PS ps;struct alg_id *parm;int format;{  ps_printf(ps, "%s#", oid2name (parm->algorithm, OIDPART));  switch(parm->p_type) {     case ALG_PARM_ABSENT:       if(parm->asn != NULLPE)             pe_print(ps, parm->asn, format);       ps_printf(ps, "#\\\n");       break;     case ALG_PARM_NUMERIC:       if (format == READOUT)         ps_printf(ps, "%d#", parm->un.numeric);       else         ps_printf(ps, "%d#", parm->un.numeric);       break;      default:       if (format == READOUT)       {         if ((parm->asn->pe_class == PE_CLASS_UNIV)           &&(parm->asn->pe_form  == PE_FORM_PRIM)           &&(parm->asn->pe_id    == PE_PRIM_INT))           ps_printf(ps, "%d", prim2num(parm->asn));         else         {           vpushquipu (ps);           vunknown(parm->asn);	   vpopquipu ();         }       }       else       {	/* This routine will print a {ASN} prefix */         pe_print(ps, parm->asn, format);       }       ps_printf(ps, "#\\\n");   }}print_encrypted(ps, str, n_bits, format)PS ps;char *str;int n_bits;int format;{int i;/* The end-user doesn't care what the signature is, so don't display it */  if (format != READOUT)  {    for (i=0;i<(n_bits+7)/8;i++) {      ps_printf(ps, "%02x", str[i] & 255);      if ( ((i % EDB_LINEWRAP) == 0) && i)	      ps_print(ps, "\\\n");    }    if ((i = (n_bits % 8)) != 0)      ps_printf(ps, "-%d", 8-i);    ps_printf(ps, "#");  }}printcert(ps, parm, format)PS ps;struct certificate *parm;int format;{  print_algid(ps, &(parm->sig.alg), format);  print_encrypted(ps, parm->sig.encrypted, parm->sig.n_bits, format);  dn_print(ps, parm->issuer, EDBOUT);  ps_printf(ps, "#\\\n");  dn_print(ps, parm->subject, EDBOUT);  ps_printf(ps, "#\\\n");  print_algid(ps, &(parm->alg), format);  ps_printf(ps, "%d#", parm->version);  ps_printf(ps, "%d#", parm->serial);  utcprint(ps, parm->valid.not_before, format);  ps_printf(ps, "#");  utcprint(ps, parm->valid.not_after, format);  ps_printf(ps, "#\\\n");  print_algid(ps, &(parm->key.alg), format);  print_encrypted(ps, parm->key.value, 	parm->key.n_bits, format);}int cert_cmp(a, b)struct certificate *a, *b;{int ret;  ret = dn_cmp(a->issuer, b->issuer);  if (ret != 0)    return (ret);  ret = dn_cmp(a->subject, b->subject);  if (ret != 0)    return (ret);  if (a->version > b->version)    return (1);  if (a->version < b->version)    return (-1);  if (a->serial > b->serial)    return (1);  if (a->serial < b->serial)    return (-1);  /* issuer, subject, version and serial should uniquely identify the   * certificate.   */  return (0);}certificate_syntax(){  (void) add_attribute_syntax(	"Certificate",	(IFP) cert_enc, (IFP) cert_dec,	(IFP) str2cert, (IFP) printcert,	(IFP) cert_cpy, (IFP) cert_cmp,	cert_free,	NULLCP,	NULLIFP,	TRUE);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?