From d3841401b2350e9b4b28f6b943f5cda262076101 Mon Sep 17 00:00:00 2001 From: hiro Date: Tue, 27 Sep 2005 07:32:26 +0000 Subject: verify PKCS#7 (S/MIME) signature. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@605 ee746299-78ed-0310-b773-934348b2243d --- src/rfc2015.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'src/rfc2015.c') diff --git a/src/rfc2015.c b/src/rfc2015.c index 8708dc81..a71f5333 100644 --- a/src/rfc2015.c +++ b/src/rfc2015.c @@ -202,6 +202,11 @@ static void check_signature(MimeInfo *mimeinfo, MimeInfo *partinfo, FILE *fp) goto leave; } + if (rfc2015_is_pkcs7_signature_part(partinfo)) { + debug_print("pkcs7 signature detected\n"); + gpgme_set_protocol(ctx, GPGME_PROTOCOL_CMS); + } + /* don't include the last empty line. It does not belong to the signed text */ if (mimeinfo->children->size > 0) { @@ -412,8 +417,7 @@ MimeInfo **rfc2015_find_signature(MimeInfo *mimeinfo) /* check that we have at least 2 parts of the correct type */ for (partinfo = mimeinfo->children; partinfo != NULL; partinfo = partinfo->next) { - if (++n > 1 && !g_ascii_strcasecmp(partinfo->content_type, - "application/pgp-signature")) + if (++n > 1 && rfc2015_is_signature_part(partinfo)) break; } @@ -451,6 +455,34 @@ void rfc2015_check_signature(MimeInfo *mimeinfo, FILE *fp) g_free(signedinfo); } +gboolean rfc2015_is_pgp_signature_part(MimeInfo *mimeinfo) +{ + if (!mimeinfo || !mimeinfo->content_type) + return FALSE; + + return !g_ascii_strcasecmp(mimeinfo->content_type, + "application/pgp-signature"); +} + +gboolean rfc2015_is_pkcs7_signature_part(MimeInfo *mimeinfo) +{ + const gchar *c_type; + + if (!mimeinfo || !mimeinfo->content_type) + return FALSE; + + c_type = mimeinfo->content_type; + + return (!g_ascii_strcasecmp(c_type, "application/pkcs7-signature") || + !g_ascii_strcasecmp(c_type, "application/x-pkcs7-signature")); +} + +gboolean rfc2015_is_signature_part(MimeInfo *mimeinfo) +{ + return (rfc2015_is_pgp_signature_part(mimeinfo) || + rfc2015_is_pkcs7_signature_part(mimeinfo)); +} + gint rfc2015_is_encrypted(MimeInfo *mimeinfo) { if (!mimeinfo || mimeinfo->mime_type != MIME_MULTIPART) -- cgit v1.2.3