From d8fcf587007ce67a1eda2b036599ac3f7e643af9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 16 May 2001 21:33:17 +0000 Subject: Removed (this now exists in camel/camel-smime.c). 2001-05-16 Jeffrey Stedfast * mail-crypto.c (mail_crypto_is_smime_v3_signed): Removed (this now exists in camel/camel-smime.c). (mail_crypto_is_pkcs7_mime): Same. (mail_crypto_smime_part_sign): new (mail_crypto_smime_part_verify): new (mail_crypto_smime_part_encrypt): new (mail_crypto_smime_part_decrypt): new (mail_crypto_pgp_mime_part_sign): Added code to set an exception if the context fails to be created. (mail_crypto_pgp_mime_part_verify): And here... (mail_crypto_pgp_mime_part_encrypt): Same. (mail_crypto_pgp_mime_part_decrypt): And here too. svn path=/trunk/; revision=9856 --- mail/ChangeLog | 15 ++++ mail/mail-crypto.c | 224 ++++++++++++++++++++++++++++++----------------------- mail/mail-crypto.h | 23 +++++- 3 files changed, 162 insertions(+), 100 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index a3b5431668..e75b043d81 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,18 @@ +2001-05-16 Jeffrey Stedfast + + * mail-crypto.c (mail_crypto_is_smime_v3_signed): Removed (this + now exists in camel/camel-smime.c). + (mail_crypto_is_pkcs7_mime): Same. + (mail_crypto_smime_part_sign): new + (mail_crypto_smime_part_verify): new + (mail_crypto_smime_part_encrypt): new + (mail_crypto_smime_part_decrypt): new + (mail_crypto_pgp_mime_part_sign): Added code to set an exception + if the context fails to be created. + (mail_crypto_pgp_mime_part_verify): And here... + (mail_crypto_pgp_mime_part_encrypt): Same. + (mail_crypto_pgp_mime_part_decrypt): And here too. + 2001-05-16 Dan Winship * mail-display.c (mail_display_redisplay): Deal with full-header diff --git a/mail/mail-crypto.c b/mail/mail-crypto.c index 9572a5edbb..0043e0a7f6 100644 --- a/mail/mail-crypto.c +++ b/mail/mail-crypto.c @@ -31,101 +31,12 @@ #include "mail-session.h" #include "mail-config.h" -/** rfc2633 stuff (aka S/MIME v3) ********************************/ - -gboolean -mail_crypto_is_smime_v3_signed (CamelMimePart *mime_part) -{ - CamelDataWrapper *wrapper; - CamelMultipart *mp; - CamelMimePart *part; - CamelContentType *type; - const gchar *param, *micalg; - int nparts; - - /* check that we have a multipart/signed */ - type = camel_mime_part_get_content_type (mime_part); - if (!header_content_type_is (type, "multipart", "signed")) - return FALSE; - - /* check that we have a protocol param with the value: "application/pkcs7-signature" */ - param = header_content_type_param (type, "protocol"); - if (!param || g_strcasecmp (param, "application/pkcs7-signature")) - return FALSE; - - /* check that we have a micalg parameter */ - micalg = header_content_type_param (type, "micalg"); - if (!micalg) - return FALSE; - - /* check that we have exactly 2 subparts */ - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - mp = CAMEL_MULTIPART (wrapper); - nparts = camel_multipart_get_number (mp); - if (nparts != 2) - return FALSE; - - /* The first part may be of any type except for - * application/pkcs7-signature - check it. */ - part = camel_multipart_get_part (mp, 0); - type = camel_mime_part_get_content_type (part); - if (header_content_type_is (type, "application", "pkcs7-signature")) - return FALSE; - - /* The second part should be application/pkcs7-signature. */ - part = camel_multipart_get_part (mp, 1); - type = camel_mime_part_get_content_type (part); - if (!header_content_type_is (type, "application", "pkcs7-signature")) - return FALSE; - - return TRUE; -} - -gboolean -mail_crypto_is_pkcs7_mime (CamelMimePart *mime_part) -{ - char *types[] = { "p7m", "p7c", "p7s", NULL }; - const gchar *param, *filename; - CamelContentType *type; - int i; - - /* check that we have a application/pkcs7-mime part */ - type = camel_mime_part_get_content_type (mime_part); - if (header_content_type_is (type, "application", "pkcs7-mime")) - return TRUE; - - if (header_content_type_is (type, "application", "octent-stream")) { - /* check to see if we have a paremeter called "smime-type" */ - param = header_content_type_param (type, "smime-type"); - if (param) - return TRUE; - - /* check to see if there is a name param and if it has a smime extension */ - param = header_content_type_param (type, "smime-type"); - if (param && *param && strlen (param) > 4) { - for (i = 0; types[i]; i++) - if (!g_strcasecmp (param + strlen (param)-4, types[i])) - return TRUE; - } - - /* check to see if there is a name param and if it has a smime extension */ - filename = camel_mime_part_get_filename (mime_part); - if (filename && *filename && strlen (filename) > 4) { - for (i = 0; types[i]; i++) - if (!g_strcasecmp (filename + strlen (filename)-4, types[i])) - return TRUE; - } - } - - return FALSE; -} - /** * mail_crypto_pgp_mime_part_sign: * @mime_part: a MIME part that will be replaced by a pgp signed part * @userid: userid to sign with - * @hash: one of PGP_HASH_TYPE_MD5 or PGP_HASH_TYPE_SHA1 + * @hash: one of CAMEL_CIPHER_HASH_MD5 or CAMEL_CIPHER_HASH_SHA1 * @ex: exception which will be set if there are any errors. * * Constructs a PGP/MIME multipart in compliance with rfc2015 and @@ -143,7 +54,9 @@ mail_crypto_pgp_mime_part_sign (CamelMimePart **mime_part, const char *userid, C if (context) { camel_pgp_mime_part_sign (context, mime_part, userid, hash, ex); camel_object_unref (CAMEL_OBJECT (context)); - } + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a PGP signature context.")); } @@ -152,7 +65,7 @@ mail_crypto_pgp_mime_part_sign (CamelMimePart **mime_part, const char *userid, C * @mime_part: a multipart/signed MIME Part * @ex: exception * - * Returns a PgpValidity on success or NULL on fail. + * Returns a CamelCipherValidity on success or NULL on fail. **/ CamelCipherValidity * mail_crypto_pgp_mime_part_verify (CamelMimePart *mime_part, CamelException *ex) @@ -166,7 +79,9 @@ mail_crypto_pgp_mime_part_verify (CamelMimePart *mime_part, CamelException *ex) if (context) { valid = camel_pgp_mime_part_verify (context, mime_part, ex); camel_object_unref (CAMEL_OBJECT (context)); - } + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a PGP verification context.")); return valid; } @@ -179,7 +94,7 @@ mail_crypto_pgp_mime_part_verify (CamelMimePart *mime_part, CamelException *ex) * @ex: exception which will be set if there are any errors. * * Constructs a PGP/MIME multipart in compliance with rfc2015 and - * replaces #mime_part with the generated multipart/signed. On failure, + * replaces #mime_part with the generated multipart/encrypted. On failure, * #ex will be set and #part will remain untouched. **/ void @@ -193,7 +108,9 @@ mail_crypto_pgp_mime_part_encrypt (CamelMimePart **mime_part, GPtrArray *recipie if (context) { camel_pgp_mime_part_encrypt (context, mime_part, recipients, ex); camel_object_unref (CAMEL_OBJECT (context)); - } + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a PGP encryption context.")); } @@ -216,7 +133,122 @@ mail_crypto_pgp_mime_part_decrypt (CamelMimePart *mime_part, CamelException *ex) if (context) { part = camel_pgp_mime_part_decrypt (context, mime_part, ex); camel_object_unref (CAMEL_OBJECT (context)); - } + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a PGP decryption context.")); + + return part; +} + + +/** + * mail_crypto_smime_part_sign: + * @mime_part: a MIME part that will be replaced by a S/MIME signed part + * @userid: userid to sign with + * @hash: one of CAMEL_CIPHER_HASH_MD5 or CAMEL_CIPHER_HASH_SHA1 + * @ex: exception which will be set if there are any errors. + * + * Constructs a S/MIME multipart in compliance with rfc2633 and + * replaces #part with the generated multipart/signed. On failure, + * #ex will be set and #part will remain untouched. + **/ +void +mail_crypto_smime_part_sign (CamelMimePart **mime_part, const char *userid, CamelCipherHash hash, CamelException *ex) +{ + CamelSMimeContext *context = NULL; + +#ifdef HAVE_NSS + context = camel_smime_context_new (session); +#endif + + if (context) { + camel_smime_part_sign (context, mime_part, userid, hash, ex); + camel_object_unref (CAMEL_OBJECT (context)); + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a S/MIME signature context.")); +} + + +/** + * mail_crypto_smime_part_verify: + * @mime_part: a multipart/signed S/MIME Part + * @ex: exception + * + * Returns a CamelCipherValidity on success or NULL on fail. + **/ +CamelCipherValidity * +mail_crypto_smime_part_verify (CamelMimePart *mime_part, CamelException *ex) +{ + CamelCipherValidity *valid = NULL; + CamelSMimeContext *context = NULL; + +#ifdef HAVE_NSS + context = camel_smime_context_new (session); +#endif + + if (context) { + valid = camel_smime_part_verify (context, mime_part, ex); + camel_object_unref (CAMEL_OBJECT (context)); + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a S/MIME verification context.")); + + return valid; +} + + +/** + * mail_crypto_smime_part_encrypt: + * @mime_part: a MIME part that will be replaced by a S/MIME encrypted part + * @recipients: list of recipient S/MIME encryption certificates + * @ex: exception which will be set if there are any errors. + * + * Constructs a S/MIME multipart in compliance with rfc2633 and + * replaces #mime_part with the generated part. On failure, + * #ex will be set and #part will remain untouched. + **/ +void +mail_crypto_smime_part_encrypt (CamelMimePart **mime_part, GPtrArray *recipients, CamelException *ex) +{ + CamelSMimeContext *context = NULL; + +#ifdef HAVE_NSS + context = camel_smime_context_new (session); +#endif + + if (context) { + camel_smime_part_encrypt (context, mime_part, recipients, ex); + camel_object_unref (CAMEL_OBJECT (context)); + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a S/MIME encryption context.")); +} + + +/** + * mail_crypto_smime_part_decrypt: + * @mime_part: an S/MIME encrypted Part + * @ex: exception + * + * Returns the decrypted MIME Part on success or NULL on fail. + **/ +CamelMimePart * +mail_crypto_smime_part_decrypt (CamelMimePart *mime_part, CamelException *ex) +{ + CamelSMimeContext *context = NULL; + CamelMimePart *part = NULL; + +#ifdef HAVE_NSS + context = camel_smime_context_new (session); +#endif + + if (context) { + part = camel_smime_part_decrypt (context, mime_part, ex); + camel_object_unref (CAMEL_OBJECT (context)); + } else + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create a S/MIME decryption context.")); return part; } diff --git a/mail/mail-crypto.h b/mail/mail-crypto.h index 1f90665f3a..806430173e 100644 --- a/mail/mail-crypto.h +++ b/mail/mail-crypto.h @@ -25,15 +25,14 @@ #include #include +#include #ifdef __cplusplus extern "C" { #pragma } -#endif /* __cplusplus }*/ - -gboolean mail_crypto_is_smime_v3_signed (CamelMimePart *mime_part); -gboolean mail_crypto_is_pkcs7_mime (CamelMimePart *mime_part); +#endif /* __cplusplus } */ +/* PGP/MIME convenience wrappers */ void mail_crypto_pgp_mime_part_sign (CamelMimePart **mime_part, const char *userid, CamelCipherHash hash, @@ -49,6 +48,22 @@ void mail_crypto_pgp_mime_part_encrypt (CamelMimePart **mime_part, CamelMimePart *mail_crypto_pgp_mime_part_decrypt (CamelMimePart *mime_part, CamelException *ex); +/* S/MIME convenience wrappers */ +void mail_crypto_smime_part_sign (CamelMimePart **mime_part, + const char *userid, + CamelCipherHash hash, + CamelException *ex); + +CamelCipherValidity *mail_crypto_smime_part_verify (CamelMimePart *mime_part, + CamelException *ex); + +void mail_crypto_smime_part_encrypt (CamelMimePart **mime_part, + GPtrArray *recipients, + CamelException *ex); + +CamelMimePart *mail_crypto_smime_part_decrypt (CamelMimePart *mime_part, + CamelException *ex); + #ifdef __cplusplus } #endif /* __cplusplus */ -- cgit v1.2.3