📄 crypt.c
字号:
if (t && m->badsig) t |= BADSIGN; } } else if ((WithCrypto & APPLICATION_PGP) && m->type == TYPETEXT) { t |= mutt_is_application_pgp (m); if (t && m->goodsig) t |= GOODSIGN; } if (m->type == TYPEMULTIPART) { t |= mutt_is_multipart_encrypted(m); t |= mutt_is_multipart_signed (m); if (t && m->goodsig) t |= GOODSIGN; } if (m->type == TYPEMULTIPART || m->type == TYPEMESSAGE) { BODY *p; int u, v, w; u = m->parts ? 0xffffffff : 0; /* Bits set in all parts */ w = 0; /* Bits set in any part */ for (p = m->parts; p; p = p->next) { v = crypt_query (p); u &= v; w |= v; } t |= u | (w & ~GOODSIGN); if ((w & GOODSIGN) && !(u & GOODSIGN)) t |= PARTSIGN; } return t;}int crypt_write_signed(BODY *a, STATE *s, const char *tempfile){ FILE *fp; int c; short hadcr; size_t bytes; if (!WithCrypto) return -1; if (!(fp = safe_fopen (tempfile, "w"))) { mutt_perror (tempfile); return -1; } fseeko (s->fpin, a->hdr_offset, 0); bytes = a->length + a->offset - a->hdr_offset; hadcr = 0; while (bytes > 0) { if ((c = fgetc (s->fpin)) == EOF) break; bytes--; if (c == '\r') hadcr = 1; else { if (c == '\n' && !hadcr) fputc ('\r', fp); hadcr = 0; } fputc (c, fp); } fclose (fp); return 0;}void convert_to_7bit (BODY *a){ if (!WithCrypto) return; while (a) { if (a->type == TYPEMULTIPART) { if (a->encoding != ENC7BIT) { a->encoding = ENC7BIT; convert_to_7bit(a->parts); } else if ((WithCrypto & APPLICATION_PGP) && option (OPTPGPSTRICTENC)) convert_to_7bit (a->parts); } else if (a->type == TYPEMESSAGE && ascii_strcasecmp(a->subtype, "delivery-status")) { if(a->encoding != ENC7BIT) mutt_message_to_7bit (a, NULL); } else if (a->encoding == ENC8BIT) a->encoding = ENCQUOTEDPRINTABLE; else if (a->encoding == ENCBINARY) a->encoding = ENCBASE64; else if (a->content && a->encoding != ENCBASE64 && (a->content->from || (a->content->space && option (OPTPGPSTRICTENC)))) a->encoding = ENCQUOTEDPRINTABLE; a = a->next; }}void crypt_extract_keys_from_messages (HEADER * h){ int i; char tempfname[_POSIX_PATH_MAX], *mbox; ADDRESS *tmp = NULL; FILE *fpout; if (!WithCrypto) return; mutt_mktemp (tempfname); if (!(fpout = safe_fopen (tempfname, "w"))) { mutt_perror (tempfname); return; } if ((WithCrypto & APPLICATION_PGP)) set_option (OPTDONTHANDLEPGPKEYS); if (!h) { for (i = 0; i < Context->vcount; i++) { if (Context->hdrs[Context->v2r[i]]->tagged) { mutt_parse_mime_message (Context, Context->hdrs[Context->v2r[i]]); if (Context->hdrs[Context->v2r[i]]->security & ENCRYPT && !crypt_valid_passphrase (Context->hdrs[Context->v2r[i]]->security)) { fclose (fpout); break; } if ((WithCrypto & APPLICATION_PGP) && (Context->hdrs[Context->v2r[i]]->security & APPLICATION_PGP)) { mutt_copy_message (fpout, Context, Context->hdrs[Context->v2r[i]], M_CM_DECODE|M_CM_CHARCONV, 0); fflush(fpout); mutt_endwin (_("Trying to extract PGP keys...\n")); crypt_pgp_invoke_import (tempfname); } if ((WithCrypto & APPLICATION_SMIME) && (Context->hdrs[Context->v2r[i]]->security & APPLICATION_SMIME)) { if (Context->hdrs[Context->v2r[i]]->security & ENCRYPT) mutt_copy_message (fpout, Context, Context->hdrs[Context->v2r[i]], M_CM_NOHEADER|M_CM_DECODE_CRYPT |M_CM_DECODE_SMIME, 0); else mutt_copy_message (fpout, Context, Context->hdrs[Context->v2r[i]], 0, 0); fflush(fpout); if (Context->hdrs[Context->v2r[i]]->env->from) tmp = mutt_expand_aliases (Context->hdrs[Context->v2r[i]]->env->from); else if (Context->hdrs[Context->v2r[i]]->env->sender) tmp = mutt_expand_aliases (Context->hdrs[Context->v2r[i]] ->env->sender); mbox = tmp ? tmp->mailbox : NULL; if (mbox) { mutt_endwin (_("Trying to extract S/MIME certificates...\n")); crypt_smime_invoke_import (tempfname, mbox); tmp = NULL; } } rewind (fpout); } } } else { mutt_parse_mime_message (Context, h); if (!(h->security & ENCRYPT && !crypt_valid_passphrase (h->security))) { if ((WithCrypto & APPLICATION_PGP) && (h->security & APPLICATION_PGP)) { mutt_copy_message (fpout, Context, h, M_CM_DECODE|M_CM_CHARCONV, 0); fflush(fpout); mutt_endwin (_("Trying to extract PGP keys...\n")); crypt_pgp_invoke_import (tempfname); } if ((WithCrypto & APPLICATION_SMIME) && (h->security & APPLICATION_SMIME)) { if (h->security & ENCRYPT) mutt_copy_message (fpout, Context, h, M_CM_NOHEADER |M_CM_DECODE_CRYPT |M_CM_DECODE_SMIME, 0); else mutt_copy_message (fpout, Context, h, 0, 0); fflush(fpout); if (h->env->from) tmp = mutt_expand_aliases (h->env->from); else if (h->env->sender) tmp = mutt_expand_aliases (h->env->sender); mbox = tmp ? tmp->mailbox : NULL; if (mbox) /* else ? */ { mutt_message (_("Trying to extract S/MIME certificates...\n")); crypt_smime_invoke_import (tempfname, mbox); } } } } fclose (fpout); if (isendwin()) mutt_any_key_to_continue (NULL); mutt_unlink (tempfname); if ((WithCrypto & APPLICATION_PGP)) unset_option (OPTDONTHANDLEPGPKEYS);}int crypt_get_keys (HEADER *msg, char **keylist){ /* Do a quick check to make sure that we can find all of the encryption * keys if the user has requested this service. */ if (!WithCrypto) return 0; if ((WithCrypto & APPLICATION_PGP)) set_option (OPTPGPCHECKTRUST); *keylist = NULL; if (msg->security & ENCRYPT) { if ((WithCrypto & APPLICATION_PGP) && (msg->security & APPLICATION_PGP)) { if ((*keylist = crypt_pgp_findkeys (msg->env->to, msg->env->cc, msg->env->bcc)) == NULL) return (-1); unset_option (OPTPGPCHECKTRUST); } if ((WithCrypto & APPLICATION_SMIME) && (msg->security & APPLICATION_SMIME)) { if ((*keylist = crypt_smime_findkeys (msg->env->to, msg->env->cc, msg->env->bcc)) == NULL) return (-1); } } return (0);}static void crypt_fetch_signatures (BODY ***signatures, BODY *a, int *n){ if (!WithCrypto) return; for (; a; a = a->next) { if (a->type == TYPEMULTIPART) crypt_fetch_signatures (signatures, a->parts, n); else { if((*n % 5) == 0) safe_realloc (signatures, (*n + 6) * sizeof (BODY **)); (*signatures)[(*n)++] = a; } }}/* * This routine verifies a "multipart/signed" body. */int mutt_signed_handler (BODY *a, STATE *s){ char tempfile[_POSIX_PATH_MAX]; char *protocol; int protocol_major = TYPEOTHER; char *protocol_minor = NULL; BODY *b = a; BODY **signatures = NULL; int sigcnt = 0; int i; short goodsig = 1; int rc = 0; if (!WithCrypto) return -1; protocol = mutt_get_parameter ("protocol", a->parameter); a = a->parts; /* extract the protocol information */ if (protocol) { char major[STRING]; char *t; if ((protocol_minor = strchr (protocol, '/'))) protocol_minor++; strfcpy (major, protocol, sizeof(major)); if((t = strchr(major, '/'))) *t = '\0'; protocol_major = mutt_check_mime_type (major); } /* consistency check */ if (!(a && a->next && a->next->type == protocol_major && !mutt_strcasecmp (a->next->subtype, protocol_minor))) { state_attach_puts (_("[-- Error: " "Inconsistent multipart/signed structure! --]\n\n"), s); return mutt_body_handler (a, s); } if ((WithCrypto & APPLICATION_PGP) && protocol_major == TYPEAPPLICATION && !ascii_strcasecmp (protocol_minor, "pgp-signature")) ; else if ((WithCrypto & APPLICATION_SMIME) && protocol_major == TYPEAPPLICATION && !(ascii_strcasecmp (protocol_minor, "x-pkcs7-signature") && ascii_strcasecmp (protocol_minor, "pkcs7-signature"))) ; else if (protocol_major == TYPEMULTIPART && !ascii_strcasecmp (protocol_minor, "mixed")) ; else { state_printf (s, _("[-- Error: " "Unknown multipart/signed protocol %s! --]\n\n"), protocol); return mutt_body_handler (a, s); } if (s->flags & M_DISPLAY) { crypt_fetch_signatures (&signatures, a->next, &sigcnt); if (sigcnt) { mutt_mktemp (tempfile); if (crypt_write_signed (a, s, tempfile) == 0) { for (i = 0; i < sigcnt; i++) { if ((WithCrypto & APPLICATION_PGP) && signatures[i]->type == TYPEAPPLICATION && !ascii_strcasecmp (signatures[i]->subtype, "pgp-signature")) { if (crypt_pgp_verify_one (signatures[i], s, tempfile) != 0) goodsig = 0; continue; } if ((WithCrypto & APPLICATION_SMIME) && signatures[i]->type == TYPEAPPLICATION && (!ascii_strcasecmp(signatures[i]->subtype, "x-pkcs7-signature") || !ascii_strcasecmp(signatures[i]->subtype, "pkcs7-signature"))) { if (crypt_smime_verify_one (signatures[i], s, tempfile) != 0) goodsig = 0; continue; } state_printf (s, _("[-- Warning: " "We can't verify %s/%s signatures. --]\n\n"), TYPE(signatures[i]), signatures[i]->subtype); } } mutt_unlink (tempfile); b->goodsig = goodsig; b->badsig = !goodsig; /* Now display the signed body */ state_attach_puts (_("[-- The following data is signed --]\n\n"), s); FREE (&signatures); } else state_attach_puts (_("[-- Warning: Can't find any signatures. --]\n\n"), s); } rc = mutt_body_handler (a, s); if (s->flags & M_DISPLAY && sigcnt) state_attach_puts (_("\n[-- End of signed data --]\n"), s); return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -