aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-09-27 07:32:26 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-09-27 07:32:26 +0000
commitd3841401b2350e9b4b28f6b943f5cda262076101 (patch)
tree06a0eea2f982a7517f5629b0b4f17e2a55828f84 /src
parent69592b82abe009675df6f8000ca3e30113349721 (diff)
verify PKCS#7 (S/MIME) signature.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@605 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/main.c3
-rw-r--r--src/mimeview.c6
-rw-r--r--src/rfc2015.c36
-rw-r--r--src/rfc2015.h3
4 files changed, 41 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index 6a632277..a1bf21a3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -559,7 +559,8 @@ static void check_gpg(void)
debug_print("GpgME Protocol: %s\n Version: %s\n",
gpgme_get_protocol_name
(engineInfo->protocol),
- engineInfo->version);
+ engineInfo->version ?
+ engineInfo->version : "(unknown)");
engineInfo = engineInfo->next;
}
}
diff --git a/src/mimeview.c b/src/mimeview.c
index 1e3014d2..5a365f76 100644
--- a/src/mimeview.c
+++ b/src/mimeview.c
@@ -786,8 +786,7 @@ static void mimeview_selection_changed(GtkTreeSelection *selection,
default:
mimeview_change_view_type(mimeview, MIMEVIEW_TEXT);
#if USE_GPGME
- if (g_ascii_strcasecmp(partinfo->content_type,
- "application/pgp-signature") == 0)
+ if (rfc2015_is_signature_part(partinfo))
mimeview_show_signature_part(mimeview, partinfo);
else
#endif
@@ -1185,8 +1184,7 @@ static void mimeview_update_signature_info(MimeView *mimeview)
partinfo = mimeview_get_selected_part(mimeview);
if (!partinfo) return;
- if (g_ascii_strcasecmp(partinfo->content_type,
- "application/pgp-signature") == 0) {
+ if (rfc2015_is_signature_part(partinfo)) {
mimeview_change_view_type(mimeview, MIMEVIEW_TEXT);
mimeview_show_signature_part(mimeview, partinfo);
}
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)
diff --git a/src/rfc2015.h b/src/rfc2015.h
index e70605e1..7c6a638a 100644
--- a/src/rfc2015.h
+++ b/src/rfc2015.h
@@ -32,6 +32,9 @@ MimeInfo **rfc2015_find_signature (MimeInfo *mimeinfo);
gboolean rfc2015_has_signature (MimeInfo *mimeinfo);
void rfc2015_check_signature (MimeInfo *mimeinfo,
FILE *fp);
+gboolean rfc2015_is_pgp_signature_part (MimeInfo *mimeinfo);
+gboolean rfc2015_is_pkcs7_signature_part(MimeInfo *mimeinfo);
+gboolean rfc2015_is_signature_part (MimeInfo *mimeinfo);
gint rfc2015_is_encrypted (MimeInfo *mimeinfo);
gboolean rfc2015_msg_is_encrypted (const gchar *file);