⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgppubring.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
      switch (skt & 0x7f)      {	case 2:			/* creation time */	{	  if (skl < 4)	    break;	  sig_gen_time = 0;	  for (i = 0; i < 4; i++)	    sig_gen_time = (sig_gen_time << 8) + buff[j++];	  break;	}	case 3:			/* expiration time */	{	  if (skl < 4)	    break;	  validity = 0;	  for (i = 0; i < 4; i++)	    validity = (validity << 8) + buff[j++];	  break;	}	case 9:			/* key expiration time */	{	  if (skl < 4)	    break;	  key_validity = 0;	  for (i = 0; i < 4; i++)	    key_validity = (key_validity << 8) + buff[j++];	  break;	}	case 16:			/* issuer key ID */	{	  if (skl < 8)	    break;	  signerid2 = signerid1 = 0;	  for (i = 0; i < 4; i++)	    signerid1 = (signerid1 << 8) + buff[j++];	  for (i = 0; i < 4; i++)	    signerid2 = (signerid2 << 8) + buff[j++];	  	  break;	}	case 10:			/* CMR key */	break;	case 4:				/* exportable */	case 5:				/* trust */	case 6:				/* regexp */	case 7:				/* revocable */	case 11:			/* Pref. symm. alg. */	case 12:			/* revocation key */	case 20:			/* notation data */	case 21:			/* pref. hash */	case 22:			/* pref. comp.alg. */	case 23:			/* key server prefs. */	case 24:			/* pref. key server */	default:	{	  if (skt & 0x80)	    have_critical_spks = 1;	}      }    }    j = nextone;  }  if (sigtype == 0x20 || sigtype == 0x28)    p->flags |= KEYFLAG_REVOKED;  if (key_validity != -1 && time (NULL) > p->gen_time + key_validity)    p->flags |= KEYFLAG_EXPIRED;  if (have_critical_spks)    p->flags |= KEYFLAG_CRITICAL;  if (s)  {    s->sigtype = sigtype;    s->sid1    = signerid1;    s->sid2    = signerid2;  }    return 0;}static int pgp_parse_sig (unsigned char *buff, size_t l,                          pgp_key_t p, pgp_sig_t *sig){  if (!buff || l < 2 || !p)    return -1;  switch (buff[1])  {  case 2:  case 3:    return pgp_parse_pgp2_sig (buff, l, p, sig);        case 4:    return pgp_parse_pgp3_sig (buff, l, p, sig);  default:    return -1;  }}/* parse one key block, including all subkeys. */static pgp_key_t pgp_parse_keyblock (FILE * fp){  unsigned char *buff;  unsigned char pt = 0;  unsigned char last_pt;  size_t l;  short err = 0;#ifdef HAVE_FGETPOS  fpos_t pos;#else  LOFF_T pos;#endif  pgp_key_t root = NULL;  pgp_key_t *last = &root;  pgp_key_t p = NULL;  pgp_uid_t *uid = NULL;  pgp_uid_t **addr = NULL;  pgp_sig_t **lsig = NULL;  FGETPOS(fp,pos);    while (!err && (buff = pgp_read_packet (fp, &l)) != NULL)  {    last_pt = pt;    pt = buff[0] & 0x3f;    /* check if we have read the complete key block. */        if ((pt == PT_SECKEY || pt == PT_PUBKEY) && root)    {      FSETPOS(fp, pos);      return root;    }        switch (pt)    {      case PT_SECKEY:      case PT_PUBKEY:      case PT_SUBKEY:      case PT_SUBSECKEY:      {	if (!(*last = p = pgp_parse_keyinfo (buff, l)))	{	  err = 1;	  break;	}	last = &p->next;	addr = &p->address;	lsig = &p->sigs;		if (pt == PT_SUBKEY || pt == PT_SUBSECKEY)	{	  p->flags |= KEYFLAG_SUBKEY;	  if (p != root)	  {	    p->parent  = root;	    p->address = pgp_copy_uids (root->address, p);	    while (*addr) addr = &(*addr)->next;	  }	}		if (pt == PT_SECKEY || pt == PT_SUBSECKEY)	  p->flags |= KEYFLAG_SECRET;	break;      }      case PT_SIG:      {	if (lsig)	{	  pgp_sig_t *signature = safe_calloc (sizeof (pgp_sig_t), 1);	  *lsig = signature;	  lsig = &signature->next;	  	  pgp_parse_sig (buff, l, p, signature);	}	break;      }      case PT_TRUST:      {	if (p && (last_pt == PT_SECKEY || last_pt == PT_PUBKEY ||		  last_pt == PT_SUBKEY || last_pt == PT_SUBSECKEY))	{	  if (buff[1] & 0x20)	  {	    p->flags |= KEYFLAG_DISABLED;	  }	}	else if (last_pt == PT_NAME && uid)	{	  uid->trust = buff[1];	}	break;      }      case PT_NAME:      {	char *chr;	if (!addr)	  break;	chr = safe_malloc (l);	memcpy (chr, buff + 1, l - 1);	chr[l - 1] = '\0';	*addr = uid = safe_calloc (1, sizeof (pgp_uid_t)); /* XXX */	uid->addr = chr;	uid->parent = p;	uid->trust = 0;	addr = &uid->next;	lsig = &uid->sigs;		/* the following tags are generated by	 * pgp 2.6.3in.	 */	if (strstr (chr, "ENCR"))	  p->flags |= KEYFLAG_PREFER_ENCRYPTION;	if (strstr (chr, "SIGN"))	  p->flags |= KEYFLAG_PREFER_SIGNING;	break;      }    }    FGETPOS(fp,pos);  }  if (err)    pgp_free_key (&root);    return root;  }static int pgpring_string_matches_hint (const char *s, const char *hints[], int nhints){  int i;  if (!hints || !nhints)    return 1;  for (i = 0; i < nhints; i++)  {    if (mutt_stristr (s, hints[i]) != NULL)      return 1;  }  return 0;}/*  * Go through the key ring file and look for keys with * matching IDs. */static void pgpring_find_candidates (char *ringfile, const char *hints[], int nhints){  FILE *rfp;#ifdef HAVE_FGETPOS  fpos_t pos, keypos;#else  LOFF_T pos, keypos;#endif  unsigned char *buff = NULL;  unsigned char pt = 0;  size_t l = 0;  short err = 0;    if ((rfp = fopen (ringfile, "r")) == NULL)  {    char *error_buf;    size_t error_buf_len;    error_buf_len = sizeof ("fopen: ") - 1 + strlen (ringfile) + 1;    error_buf = safe_malloc (error_buf_len);    snprintf (error_buf, error_buf_len, "fopen: %s", ringfile);    perror (error_buf);    FREE (&error_buf);    return;  }  FGETPOS(rfp,pos);  FGETPOS(rfp,keypos);  while (!err && (buff = pgp_read_packet (rfp, &l)) != NULL)  {    pt = buff[0] & 0x3f;        if (l < 1)      continue;        if ((pt == PT_SECKEY) || (pt == PT_PUBKEY))    {      keypos = pos;    }    else if (pt == PT_NAME)    {      char *tmp = safe_malloc (l);      memcpy (tmp, buff + 1, l - 1);      tmp[l - 1] = '\0';      /* mutt_decode_utf8_string (tmp, chs); */      if (pgpring_string_matches_hint (tmp, hints, nhints))      {	pgp_key_t p;	FSETPOS(rfp, keypos);	/* Not bailing out here would lead us into an endless loop. */	if ((p = pgp_parse_keyblock (rfp)) == NULL)	  err = 1;		pgpring_dump_keyblock (p);	pgp_free_key (&p);      }      FREE (&tmp);    }    FGETPOS(rfp,pos);  }  fclose (rfp);}static void print_userid (const char *id){  for (; id && *id; id++)  {    if (*id >= ' ' && *id <= 'z' && *id != ':')      putchar (*id);    else      printf ("\\x%02x", (*id) & 0xff);  }}static void print_fingerprint (pgp_key_t p) {  int i = 0;  printf ("fpr:::::::::");  for (i = 0; i < p->fp_len; i++)    printf ("%02X", p->fingerprint[i]);  printf (":\n");} /* print_fingerprint() */static void pgpring_dump_signatures (pgp_sig_t *sig){  for (; sig; sig = sig->next)  {    if (sig->sigtype == 0x10 || sig->sigtype == 0x11 ||	sig->sigtype == 0x12 || sig->sigtype == 0x13)      printf ("sig::::%08lX%08lX::::::%X:\n",	      sig->sid1, sig->sid2, sig->sigtype);    else if (sig->sigtype == 0x20)      printf ("rev::::%08lX%08lX::::::%X:\n",	      sig->sid1, sig->sid2, sig->sigtype);  }}static char gnupg_trustletter (int t){  switch (t)  {    case 1: return 'n';    case 2: return 'm';    case 3: return 'f';  }  return 'q';}static void pgpring_dump_keyblock (pgp_key_t p){  pgp_uid_t *uid;  short first;  struct tm *tp;  time_t t;    for (; p; p = p->next)  {    first = 1;    if (p->flags & KEYFLAG_SECRET)    {      if (p->flags & KEYFLAG_SUBKEY)	printf ("ssb:");      else	printf ("sec:");    }    else     {      if (p->flags & KEYFLAG_SUBKEY)	printf ("sub:");      else	printf ("pub:");    }        if (p->flags & KEYFLAG_REVOKED)      putchar ('r');    if (p->flags & KEYFLAG_EXPIRED)      putchar ('e');    if (p->flags & KEYFLAG_DISABLED)      putchar ('d');    for (uid = p->address; uid; uid = uid->next, first = 0)    {      if (!first)      {	printf ("uid:%c::::::::", gnupg_trustletter (uid->trust));	print_userid (uid->addr);	printf (":\n");      }      else      {	if (p->flags & KEYFLAG_SECRET)	  putchar ('u');	else	  putchar (gnupg_trustletter (uid->trust));	t = p->gen_time;	tp = gmtime (&t);	printf (":%d:%d:%s:%04d-%02d-%02d::::", p->keylen, p->numalg, p->keyid,		1900 + tp->tm_year, tp->tm_mon + 1, tp->tm_mday);		print_userid (uid->addr);	printf ("::");	if(pgp_canencrypt(p->numalg))	  putchar ('e');	if(pgp_cansign(p->numalg))	  putchar ('s');	if (p->flags & KEYFLAG_DISABLED)	  putchar ('D');	printf (":\n");	if (dump_fingerprints)           print_fingerprint (p);      }            if (dump_signatures)      {	if (first) pgpring_dump_signatures (p->sigs);	pgpring_dump_signatures (uid->sigs);      }    }  }}/* * The mutt_gettext () defined in gettext.c requires iconv, * so we do without charset conversion here. */char *mutt_gettext (const char *message){  return (char *)message;}

⌨️ 快捷键说明

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