NeoMutt  2025-12-11-1040-g5187ba
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
verify_one()

Check a signed MIME part against a signature. More...

Collaboration diagram for verify_one():

Functions

int pgp_gpgme_verify_one (struct Body *b, struct State *state, const char *tempfile)
 Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.
int smime_gpgme_verify_one (struct Body *b, struct State *state, const char *tempfile)
 Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.
int pgp_class_verify_one (struct Body *b, struct State *state, const char *tempfile)
 Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.
int smime_class_verify_one (struct Body *b, struct State *state, const char *tempfile)
 Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.

Detailed Description

Check a signed MIME part against a signature.

Parameters
bBody of the signed mail
stateState of text being processed
tempfFile containing the key
Return values
0Success
-1Error

Function Documentation

◆ pgp_gpgme_verify_one()

int pgp_gpgme_verify_one ( struct Body * b,
struct State * state,
const char * tempfile )

Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.

Definition at line 1724 of file crypt_gpgme.c.

1725{
1726 return verify_one(b, state, tempfile, false);
1727}
static int verify_one(struct Body *b, struct State *state, const char *tempfile, bool is_smime)
Do the actual verification step.
Here is the call graph for this function:

◆ smime_gpgme_verify_one()

int smime_gpgme_verify_one ( struct Body * b,
struct State * state,
const char * tempfile )

Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.

Definition at line 1732 of file crypt_gpgme.c.

1733{
1734 return verify_one(b, state, tempfile, true);
1735}
Here is the call graph for this function:

◆ pgp_class_verify_one()

int pgp_class_verify_one ( struct Body * b,
struct State * state,
const char * tempfile )

Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.

Definition at line 905 of file pgp.c.

906{
907 FILE *fp_pgp_out = NULL;
908 pid_t pid;
909 int badsig = -1;
910 struct Buffer *sigfile = buf_pool_get();
911
912 buf_printf(sigfile, "%s.asc", tempfile);
913
914 FILE *fp_sig = mutt_file_fopen(buf_string(sigfile), "w");
915 if (!fp_sig)
916 {
917 mutt_perror("%s", buf_string(sigfile));
918 goto cleanup;
919 }
920
921 if (!mutt_file_seek(state->fp_in, b->offset, SEEK_SET))
922 {
923 mutt_file_fclose(&fp_sig);
924 goto cleanup;
925 }
926 mutt_file_copy_bytes(state->fp_in, fp_sig, b->length);
927 mutt_file_fclose(&fp_sig);
928
929 FILE *fp_pgp_err = mutt_file_mkstemp();
930 if (!fp_pgp_err)
931 {
932 mutt_perror(_("Can't create temporary file"));
933 unlink(buf_string(sigfile));
934 goto cleanup;
935 }
936
937 crypt_current_time(state, "PGP");
938
939 pid = pgp_invoke_verify(NULL, &fp_pgp_out, NULL, -1, -1, fileno(fp_pgp_err),
940 tempfile, buf_string(sigfile));
941 if (pid != -1)
942 {
943 if (pgp_copy_checksig(fp_pgp_out, state->fp_out) >= 0)
944 badsig = 0;
945
946 mutt_file_fclose(&fp_pgp_out);
947 fflush(fp_pgp_err);
948 fseek(fp_pgp_err, 0, SEEK_SET);
949 clearerr(fp_pgp_err);
950
951 if (pgp_copy_checksig(fp_pgp_err, state->fp_out) >= 0)
952 badsig = 0;
953
954 const int rv = filter_wait(pid);
955 if (rv)
956 badsig = -1;
957
958 mutt_debug(LL_DEBUG1, "filter_wait returned %d\n", rv);
959 }
960
961 mutt_file_fclose(&fp_pgp_err);
962
963 state_attach_puts(state, _("[-- End of PGP output --]\n\n"));
964
966
967cleanup:
968 buf_pool_release(&sigfile);
969
970 mutt_debug(LL_DEBUG1, "returning %d\n", badsig);
971 return badsig;
972}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:168
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
void crypt_current_time(struct State *state, const char *app_name)
Print the current time.
Definition crypt.c:64
int mutt_file_copy_bytes(FILE *fp_in, FILE *fp_out, size_t size)
Copy some content from one file to another.
Definition file.c:192
bool mutt_file_seek(FILE *fp, LOFF_T offset, int whence)
Wrapper for fseeko with error handling.
Definition file.c:648
void mutt_file_unlink(const char *s)
Delete a file, carefully.
Definition file.c:156
#define mutt_file_fclose(FP)
Definition file.h:144
#define mutt_file_fopen(PATH, MODE)
Definition file.h:143
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
#define mutt_perror(...)
Definition logging2.h:95
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition filter.c:231
#define _(a)
Definition message.h:28
void state_attach_puts(struct State *state, const char *t)
Write a string to the state.
Definition state.c:104
static int pgp_copy_checksig(FILE *fp_in, FILE *fp_out)
Copy PGP output and look for signs of a good signature.
Definition pgp.c:248
pid_t pgp_invoke_verify(FILE **fp_pgp_in, FILE **fp_pgp_out, FILE **fp_pgp_err, int fd_pgp_in, int fd_pgp_out, int fd_pgp_err, const char *fname, const char *sig_fname)
Use PGP to verify a message.
Definition pgpinvoke.c:157
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
LOFF_T offset
offset where the actual data begins
Definition body.h:52
LOFF_T length
length (in bytes) of attachment
Definition body.h:53
String manipulation buffer.
Definition buffer.h:36
FILE * fp_out
File to write to.
Definition state.h:56
FILE * fp_in
File to read from.
Definition state.h:55
#define mutt_file_mkstemp()
Definition tmp.h:36
Here is the call graph for this function:

◆ smime_class_verify_one()

int smime_class_verify_one ( struct Body * b,
struct State * state,
const char * tempfile )

Check a signed MIME part against a signature - Implements CryptModuleSpecs::verify_one() -.

Definition at line 1606 of file smime.c.

1607{
1608 FILE *fp = NULL;
1609 FILE *fp_smime_out = NULL;
1610 FILE *fp_smime_err = NULL;
1611 pid_t pid;
1612 int badsig = -1;
1613
1614 LOFF_T tmpoffset = 0;
1615 size_t tmplength = 0;
1616 int orig_type = b->type;
1617
1618 struct Buffer *signedfile = buf_pool_get();
1619
1620 buf_printf(signedfile, "%s.sig", tempfile);
1621
1622 /* decode to a tempfile, saving the original destination */
1623 fp = state->fp_out;
1624 state->fp_out = mutt_file_fopen(buf_string(signedfile), "w");
1625 if (!state->fp_out)
1626 {
1627 mutt_perror("%s", buf_string(signedfile));
1628 goto cleanup;
1629 }
1630 /* decoding the attachment changes the size and offset, so save a copy
1631 * of the "real" values now, and restore them after processing */
1632 tmplength = b->length;
1633 tmpoffset = b->offset;
1634
1635 /* if we are decoding binary bodies, we don't want to prefix each
1636 * line with the prefix or else the data will get corrupted. */
1637 const char *save_prefix = state->prefix;
1638 state->prefix = NULL;
1639
1640 mutt_decode_attachment(b, state);
1641
1642 b->length = ftello(state->fp_out);
1643 b->offset = 0;
1644 mutt_file_fclose(&state->fp_out);
1645
1646 /* restore final destination and substitute the tempfile for input */
1647 state->fp_out = fp;
1648 fp = state->fp_in;
1649 state->fp_in = mutt_file_fopen(buf_string(signedfile), "r");
1650
1651 /* restore the prefix */
1652 state->prefix = save_prefix;
1653
1654 b->type = orig_type;
1655
1656 fp_smime_err = mutt_file_mkstemp();
1657 if (!fp_smime_err)
1658 {
1659 mutt_perror(_("Can't create temporary file"));
1660 goto cleanup;
1661 }
1662
1663 crypt_current_time(state, "OpenSSL");
1664
1665 pid = smime_invoke_verify(NULL, &fp_smime_out, NULL, -1, -1, fileno(fp_smime_err),
1666 tempfile, buf_string(signedfile), 0);
1667 if (pid != -1)
1668 {
1669 fflush(fp_smime_out);
1670 mutt_file_fclose(&fp_smime_out);
1671
1672 if (filter_wait(pid))
1673 {
1674 badsig = -1;
1675 }
1676 else
1677 {
1678 char *line = NULL;
1679 size_t linelen = 0;
1680
1681 fflush(fp_smime_err);
1682 fseek(fp_smime_err, 0, SEEK_SET);
1683 clearerr(fp_smime_err);
1684
1685 line = mutt_file_read_line(line, &linelen, fp_smime_err, NULL, MUTT_RL_NONE);
1686 if (linelen && mutt_istr_equal(line, "verification successful"))
1687 badsig = 0;
1688
1689 FREE(&line);
1690 }
1691 }
1692
1693 fflush(fp_smime_err);
1694 fseek(fp_smime_err, 0, SEEK_SET);
1695 clearerr(fp_smime_err);
1696 mutt_file_copy_stream(fp_smime_err, state->fp_out);
1697 mutt_file_fclose(&fp_smime_err);
1698
1699 state_attach_puts(state, _("[-- End of OpenSSL output --]\n\n"));
1700
1701 mutt_file_unlink(buf_string(signedfile));
1702
1703 b->length = tmplength;
1704 b->offset = tmpoffset;
1705
1706 /* restore the original source stream */
1707 mutt_file_fclose(&state->fp_in);
1708 state->fp_in = fp;
1709
1710cleanup:
1711 buf_pool_release(&signedfile);
1712 return badsig;
1713}
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
Definition file.c:224
char * mutt_file_read_line(char *line, size_t *size, FILE *fp, int *line_num, ReadLineFlags flags)
Read a line from a file.
Definition file.c:678
@ MUTT_RL_NONE
No flags are set.
Definition file.h:43
void mutt_decode_attachment(const struct Body *b, struct State *state)
Decode an email's attachment.
Definition handler.c:1950
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:92
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:678
static pid_t smime_invoke_verify(FILE **fp_smime_in, FILE **fp_smime_out, FILE **fp_smime_err, int fp_smime_infd, int fp_smime_outfd, int fp_smime_errfd, const char *fname, const char *sig_fname, int opaque)
Use SMIME to verify a file.
Definition smime.c:1562
unsigned int type
content-type primary type, ContentType
Definition body.h:40
const char * prefix
String to add to the beginning of each output line.
Definition state.h:57
Here is the call graph for this function: