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

📄 crypt.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 1996,1997 Michael R. Elkins <me@mutt.org> * Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org> * Copyright (C) 2001  Thomas Roessler <roessler@does-not-exist.org> *                     Oliver Ehli <elmy@acm.org> * Copyright (C) 2003  Werner Koch <wk@gnupg.org> * Copyright (C) 2004 g10code GmbH * *     This program is free software; you can redistribute it and/or modify *     it under the terms of the GNU General Public License as published by *     the Free Software Foundation; either version 2 of the License, or *     (at your option) any later version. *  *     This program is distributed in the hope that it will be useful, *     but WITHOUT ANY WARRANTY; without even the implied warranty of *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *     GNU General Public License for more details. *  *     You should have received a copy of the GNU General Public License *     along with this program; if not, write to the Free Software *     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. */#if HAVE_CONFIG_H# include "config.h"#endif#include "mutt.h"#include "mutt_curses.h"#include "mime.h"#include "copy.h"#include "mutt_crypt.h"#include "pgp.h"#include <sys/wait.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/stat.h>#include <errno.h>#include <ctype.h>#ifdef HAVE_LOCALE_H#include <locale.h>#endif#ifdef HAVE_SYS_TIME_H# include <sys/time.h>#endif#ifdef HAVE_SYS_RESOURCE_H# include <sys/resource.h>#endif/* print the current time to avoid spoofing of the signature output */void crypt_current_time(STATE *s, char *app_name){  time_t t;  char p[STRING], tmp[STRING];  if (!WithCrypto)    return;  if (option (OPTCRYPTTIMESTAMP))  {    t = time(NULL);    setlocale (LC_TIME, "");    strftime (p, sizeof (p), _(" (current time: %c)"), localtime (&t));    setlocale (LC_TIME, "C");  }  else    *p = '\0';  snprintf (tmp, sizeof (tmp), _("[-- %s output follows%s --]\n"), NONULL(app_name), p);  state_attach_puts (tmp, s);}void crypt_forget_passphrase (void){  if ((WithCrypto & APPLICATION_PGP))    crypt_pgp_void_passphrase ();  if ((WithCrypto & APPLICATION_SMIME))    crypt_smime_void_passphrase ();  if (WithCrypto)    mutt_message _("Passphrase(s) forgotten.");}#if defined(HAVE_SETRLIMIT) && (!defined(DEBUG))static void disable_coredumps (void){  struct rlimit rl = {0, 0};  static short done = 0;  if (!done)  {    setrlimit (RLIMIT_CORE, &rl);    done = 1;  }}#endif /* HAVE_SETRLIMIT */int crypt_valid_passphrase(int flags){  int ret = 0;# if defined(HAVE_SETRLIMIT) &&(!defined(DEBUG))  disable_coredumps ();# endif  if ((WithCrypto & APPLICATION_PGP) && (flags & APPLICATION_PGP))    ret = crypt_pgp_valid_passphrase ();  if ((WithCrypto & APPLICATION_SMIME) && (flags & APPLICATION_SMIME))    ret = crypt_smime_valid_passphrase ();  return ret;}int mutt_protect (HEADER *msg, char *keylist){  BODY *pbody = NULL, *tmp_pbody = NULL;  BODY *tmp_smime_pbody = NULL;  BODY *tmp_pgp_pbody = NULL;  int flags = (WithCrypto & APPLICATION_PGP)? msg->security: 0;  int i;  if (!WithCrypto)    return -1;  if ((msg->security & SIGN) && !crypt_valid_passphrase (msg->security))    return (-1);  if ((WithCrypto & APPLICATION_PGP) && ((msg->security & PGPINLINE) == PGPINLINE))  {    /* they really want to send it inline... go for it */    if (!isendwin ()) mutt_endwin _("Invoking PGP...");    pbody = crypt_pgp_traditional_encryptsign (msg->content, flags, keylist);    if (pbody)    {      msg->content = pbody;      return 0;    }    /* otherwise inline won't work...ask for revert */    if ((i = query_quadoption (OPT_PGPMIMEAUTO, _("Message can't be sent inline.  Revert to using PGP/MIME?"))) != M_YES)      {	mutt_error _("Mail not sent.");	return -1;      }    /* go ahead with PGP/MIME */  }  if (!isendwin ()) mutt_endwin (NULL);  if ((WithCrypto & APPLICATION_SMIME))    tmp_smime_pbody = msg->content;  if ((WithCrypto & APPLICATION_PGP))    tmp_pgp_pbody   = msg->content;  if (msg->security & SIGN)  {    if ((WithCrypto & APPLICATION_SMIME)        && (msg->security & APPLICATION_SMIME))    {      if (!(tmp_pbody = crypt_smime_sign_message (msg->content)))	return -1;      pbody = tmp_smime_pbody = tmp_pbody;    }    if ((WithCrypto & APPLICATION_PGP)        && (msg->security & APPLICATION_PGP)        && (!(flags & ENCRYPT) || option (OPTPGPRETAINABLESIG)))    {      if (!(tmp_pbody = crypt_pgp_sign_message (msg->content)))        return -1;      flags &= ~SIGN;      pbody = tmp_pgp_pbody = tmp_pbody;    }    if (WithCrypto        && (msg->security & APPLICATION_SMIME)	&& (msg->security & APPLICATION_PGP))    {	/* here comes the draft ;-) */    }  }  if (msg->security & ENCRYPT)  {    if ((WithCrypto & APPLICATION_SMIME)        && (msg->security & APPLICATION_SMIME))    {      if (!(tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody,                                                        keylist)))      {	/* signed ? free it! */	return (-1);      }      /* free tmp_body if messages was signed AND encrypted ... */      if (tmp_smime_pbody != msg->content && tmp_smime_pbody != tmp_pbody)      {	/* detatch and dont't delete msg->content,	   which tmp_smime_pbody->parts after signing. */	tmp_smime_pbody->parts = tmp_smime_pbody->parts->next;	msg->content->next = NULL;	mutt_free_body (&tmp_smime_pbody);      }      pbody = tmp_pbody;    }    if ((WithCrypto & APPLICATION_PGP)        && (msg->security & APPLICATION_PGP))    {      if (!(pbody = crypt_pgp_encrypt_message (tmp_pgp_pbody, keylist,                                               flags & SIGN)))      {	/* did we perform a retainable signature? */	if (flags != msg->security)	{	  /* remove the outer multipart layer */	  tmp_pgp_pbody = mutt_remove_multipart (tmp_pgp_pbody);	  /* get rid of the signature */	  mutt_free_body (&tmp_pgp_pbody->next);	}	return (-1);      }      /* destroy temporary signature envelope when doing retainable        * signatures.       */      if (flags != msg->security)      {	tmp_pgp_pbody = mutt_remove_multipart (tmp_pgp_pbody);	mutt_free_body (&tmp_pgp_pbody->next);      }    }  }  if(pbody)      msg->content = pbody;  return 0;}        int mutt_is_multipart_signed (BODY *b){  char *p;  if (!b || !(b->type == TYPEMULTIPART) ||      !b->subtype || ascii_strcasecmp(b->subtype, "signed"))    return 0;  if (!(p = mutt_get_parameter("protocol", b->parameter)))    return 0;  if (!(ascii_strcasecmp (p, "multipart/mixed")))    return SIGN;  if ((WithCrypto & APPLICATION_PGP)      && !(ascii_strcasecmp (p, "application/pgp-signature")))    return PGPSIGN;      if ((WithCrypto & APPLICATION_SMIME)      && !(ascii_strcasecmp (p, "application/x-pkcs7-signature")))    return SMIMESIGN;  if ((WithCrypto & APPLICATION_SMIME)      && !(ascii_strcasecmp (p, "application/pkcs7-signature")))    return SMIMESIGN;  return 0;}        int mutt_is_multipart_encrypted (BODY *b){  if ((WithCrypto & APPLICATION_PGP))  {    char *p;      if (!b || b->type != TYPEMULTIPART ||        !b->subtype || ascii_strcasecmp (b->subtype, "encrypted") ||        !(p = mutt_get_parameter ("protocol", b->parameter)) ||        ascii_strcasecmp (p, "application/pgp-encrypted"))      return 0;       return PGPENCRYPT;  }  return 0;}int mutt_is_application_pgp (BODY *m){  int t = 0;  char *p;    if (m->type == TYPEAPPLICATION)  {    if (!ascii_strcasecmp (m->subtype, "pgp") || !ascii_strcasecmp (m->subtype, "x-pgp-message"))    {      if ((p = mutt_get_parameter ("x-action", m->parameter))	  && (!ascii_strcasecmp (p, "sign") || !ascii_strcasecmp (p, "signclear")))	t |= PGPSIGN;      if ((p = mutt_get_parameter ("format", m->parameter)) && 	  !ascii_strcasecmp (p, "keys-only"))	t |= PGPKEY;      if(!t) t |= PGPENCRYPT;  /* not necessarily correct, but... */    }    if (!ascii_strcasecmp (m->subtype, "pgp-signed"))      t |= PGPSIGN;    if (!ascii_strcasecmp (m->subtype, "pgp-keys"))      t |= PGPKEY;  }  else if (m->type == TYPETEXT && ascii_strcasecmp ("plain", m->subtype) == 0)  {    if (((p = mutt_get_parameter ("x-mutt-action", m->parameter))	 || (p = mutt_get_parameter ("x-action", m->parameter)) 	 || (p = mutt_get_parameter ("action", m->parameter)))	 && !ascii_strncasecmp ("pgp-sign", p, 8))      t |= PGPSIGN;    else if (p && !ascii_strncasecmp ("pgp-encrypt", p, 11))      t |= PGPENCRYPT;    else if (p && !ascii_strncasecmp ("pgp-keys", p, 7))      t |= PGPKEY;  }  if (t)    t |= PGPINLINE;  return t;}int mutt_is_application_smime (BODY *m){  char *t=NULL;  int len, complain=0;  if(!m)    return 0;  if ((m->type & TYPEAPPLICATION) && m->subtype)  {    /* S/MIME MIME types don't need x- anymore, see RFC2311 */    if (!ascii_strcasecmp (m->subtype, "x-pkcs7-mime") ||	!ascii_strcasecmp (m->subtype, "pkcs7-mime"))    {      if ((t = mutt_get_parameter ("smime-type", m->parameter)))      {	if (!ascii_strcasecmp (t, "enveloped-data"))	  return SMIMEENCRYPT;	else if (!ascii_strcasecmp (t, "signed-data"))	  return (SMIMESIGN|SMIMEOPAQUE);	else return 0;      }      /* Netscape 4.7 uses        * Content-Description: S/MIME Encrypted Message       * instead of Content-Type parameter       */      if (!ascii_strcasecmp (m->description, "S/MIME Encrypted Message"))	return SMIMEENCRYPT;      complain = 1;    }    else if (ascii_strcasecmp (m->subtype, "octet-stream"))      return 0;    t = mutt_get_parameter ("name", m->parameter);    if (!t) t = m->d_filename;    if (!t) t = m->filename;    if (!t)     {      if (complain)	mutt_message (_("S/MIME messages with no hints on content are unsupported."));      return 0;    }    /* no .p7c, .p10 support yet. */    len = mutt_strlen (t) - 4;    if (len > 0 && *(t+len) == '.')    {      len++;      if (!ascii_strcasecmp ((t+len), "p7m"))#if 0       return SMIMEENCRYPT;#else      /* Not sure if this is the correct thing to do, but          it's required for compatibility with Outlook */       return (SMIMESIGN|SMIMEOPAQUE);#endif      else if (!ascii_strcasecmp ((t+len), "p7s"))	return (SMIMESIGN|SMIMEOPAQUE);    }  }  return 0;}int crypt_query (BODY *m){  int t = 0;  if (!WithCrypto)    return 0;    if (!m)    return 0;  if (m->type == TYPEAPPLICATION)  {    if ((WithCrypto & APPLICATION_PGP))      t |= mutt_is_application_pgp(m);    if ((WithCrypto & APPLICATION_SMIME))    {      t |= mutt_is_application_smime(m);      if (t && m->goodsig) t |= GOODSIGN;

⌨️ 快捷键说明

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