[gmime] Modified g_mime_crypto_context_sign() to take a 'detach' argument



commit 0e7c5453a38276e26a95935254eaccec691d079c
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date:   Sat Feb 18 09:11:37 2017 -0500

    Modified g_mime_crypto_context_sign() to take a 'detach' argument
    
    This was needed for application/pkcs7-mime support which
    needed a way to get an encapsulated signature rather than
    the detached signature that is used by multipart/signed.

 gmime/gmime-application-pkcs7-mime.c |    2 +-
 gmime/gmime-crypto-context.c         |   14 ++++++++------
 gmime/gmime-crypto-context.h         |   14 ++++++++------
 gmime/gmime-gpg-context.c            |   12 +++++++-----
 gmime/gmime-multipart-signed.c       |    2 +-
 gmime/gmime-pkcs7-context.c          |   12 +++++++-----
 gmime/gmime.h                        |    1 +
 tests/test-pgp.c                     |    2 +-
 tests/test-pkcs7.c                   |    2 +-
 9 files changed, 35 insertions(+), 26 deletions(-)
---
diff --git a/gmime/gmime-application-pkcs7-mime.c b/gmime/gmime-application-pkcs7-mime.c
index c2dfbe4..9f9e768 100644
--- a/gmime/gmime-application-pkcs7-mime.c
+++ b/gmime/gmime-application-pkcs7-mime.c
@@ -457,7 +457,7 @@ g_mime_application_pkcs7_mime_sign (GMimePkcs7Context *ctx, GMimeObject *entity,
        
        /* sign the content stream */
        ciphertext = g_mime_stream_mem_new ();
-       if (g_mime_crypto_context_sign ((GMimeCryptoContext *) ctx, userid, digest, stream, ciphertext, err) 
== -1) {
+       if (g_mime_crypto_context_sign ((GMimeCryptoContext *) ctx, FALSE, userid, digest, stream, 
ciphertext, err) == -1) {
                g_object_unref (ciphertext);
                g_object_unref (stream);
                return NULL;
diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
index 0745321..0853a43 100644
--- a/gmime/gmime-crypto-context.c
+++ b/gmime/gmime-crypto-context.c
@@ -58,9 +58,10 @@ static gboolean crypto_get_retrieve_session_key (GMimeCryptoContext *ctx);
 static void crypto_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust);
 static gboolean crypto_get_always_trust (GMimeCryptoContext *ctx);
 
-static int crypto_sign (GMimeCryptoContext *ctx, const char *userid,
-                       GMimeDigestAlgo digest, GMimeStream *istream,
-                       GMimeStream *ostream, GError **err);
+static int crypto_sign (GMimeCryptoContext *ctx, gboolean detach,
+                       const char *userid, GMimeDigestAlgo digest,
+                       GMimeStream *istream, GMimeStream *ostream,
+                       GError **err);
        
 static GMimeSignatureList *crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
                                          GMimeStream *istream, GMimeStream *sigstream,
@@ -312,7 +313,7 @@ g_mime_crypto_context_get_key_exchange_protocol (GMimeCryptoContext *ctx)
 
 
 static int
-crypto_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest,
+crypto_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, GMimeDigestAlgo digest,
             GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
        g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
@@ -325,6 +326,7 @@ crypto_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest
 /**
  * g_mime_crypto_context_sign:
  * @ctx: a #GMimeCryptoContext
+ * @detach: %TRUE if @ostream should be the detached signature; otherwise, %FALSE
  * @userid: private key to use to sign the stream
  * @digest: digest algorithm to use
  * @istream: input stream
@@ -337,14 +339,14 @@ crypto_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest
  * specified as #GMIME_DIGEST_ALGO_DEFAULT) or %-1 on fail.
  **/
 int
-g_mime_crypto_context_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest,
+g_mime_crypto_context_sign (GMimeCryptoContext *ctx, gboolean detach, const char *userid, GMimeDigestAlgo 
digest,
                            GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
        g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1);
        g_return_val_if_fail (GMIME_IS_STREAM (istream), -1);
        g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1);
        
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->sign (ctx, userid, digest, istream, ostream, err);
+       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->sign (ctx, detach, userid, digest, istream, ostream, 
err);
 }
 
 
diff --git a/gmime/gmime-crypto-context.h b/gmime/gmime-crypto-context.h
index 45c97e9..1dbf660 100644
--- a/gmime/gmime-crypto-context.h
+++ b/gmime/gmime-crypto-context.h
@@ -89,9 +89,10 @@ struct _GMimeCryptoContextClass {
        const char *             (* get_encryption_protocol) (GMimeCryptoContext *ctx);
        const char *             (* get_key_exchange_protocol) (GMimeCryptoContext *ctx);
        
-       int                      (* sign)        (GMimeCryptoContext *ctx, const char *userid,
-                                                 GMimeDigestAlgo digest, GMimeStream *istream,
-                                                 GMimeStream *ostream, GError **err);
+       int                      (* sign)        (GMimeCryptoContext *ctx, gboolean detach,
+                                                 const char *userid, GMimeDigestAlgo digest,
+                                                 GMimeStream *istream, GMimeStream *ostream,
+                                                 GError **err);
        
        GMimeSignatureList *     (* verify)      (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
                                                  GMimeStream *istream, GMimeStream *sigstream,
@@ -139,9 +140,10 @@ const char *g_mime_crypto_context_get_encryption_protocol (GMimeCryptoContext *c
 const char *g_mime_crypto_context_get_key_exchange_protocol (GMimeCryptoContext *ctx);
 
 /* crypto routines */
-int g_mime_crypto_context_sign (GMimeCryptoContext *ctx, const char *userid,
-                               GMimeDigestAlgo digest, GMimeStream *istream,
-                               GMimeStream *ostream, GError **err);
+int g_mime_crypto_context_sign (GMimeCryptoContext *ctx, gboolean detach,
+                               const char *userid, GMimeDigestAlgo digest,
+                               GMimeStream *istream, GMimeStream *ostream,
+                               GError **err);
 
 GMimeSignatureList *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
                                                  GMimeStream *istream, GMimeStream *sigstream,
diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c
index 797b553..9db3857 100644
--- a/gmime/gmime-gpg-context.c
+++ b/gmime/gmime-gpg-context.c
@@ -96,9 +96,10 @@ static int gpg_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retri
 static gboolean gpg_get_always_trust (GMimeCryptoContext *context);
 static void gpg_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust);
 
-static int gpg_sign (GMimeCryptoContext *ctx, const char *userid,
-                    GMimeDigestAlgo digest, GMimeStream *istream,
-                    GMimeStream *ostream, GError **err);
+static int gpg_sign (GMimeCryptoContext *ctx, gboolean detach,
+                    const char *userid, GMimeDigestAlgo digest,
+                    GMimeStream *istream, GMimeStream *ostream,
+                    GError **err);
 
 static const char *gpg_get_signature_protocol (GMimeCryptoContext *ctx);
 static const char *gpg_get_encryption_protocol (GMimeCryptoContext *ctx);
@@ -464,10 +465,11 @@ gpg_add_signer (GMimeGpgContext *gpg, const char *signer, GError **err)
 #endif /* ENABLE_CRYPTO */
 
 static int
-gpg_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo digest,
+gpg_sign (GMimeCryptoContext *context, gboolean detach, const char *userid, GMimeDigestAlgo digest,
          GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
 #ifdef ENABLE_CRYPTO
+       gpgme_sig_mode_t mode = detach ? GPGME_SIG_MODE_DETACH : GPGME_SIG_MODE_NORMAL;
        GMimeGpgContext *gpg = (GMimeGpgContext *) context;
        gpgme_sign_result_t result;
        gpgme_data_t input, output;
@@ -490,7 +492,7 @@ gpg_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo diges
        }
        
        /* sign the input stream */
-       if ((error = gpgme_op_sign (gpg->ctx, input, output, GPGME_SIG_MODE_DETACH)) != GPG_ERR_NO_ERROR) {
+       if ((error = gpgme_op_sign (gpg->ctx, input, output, mode)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Signing failed"));
                gpgme_signers_clear (gpg->ctx);
                gpgme_data_release (output);
diff --git a/gmime/gmime-multipart-signed.c b/gmime/gmime-multipart-signed.c
index f660585..60fa59b 100644
--- a/gmime/gmime-multipart-signed.c
+++ b/gmime/gmime-multipart-signed.c
@@ -268,7 +268,7 @@ g_mime_multipart_signed_sign (GMimeMultipartSigned *mps, GMimeObject *content,
        sigstream = g_mime_stream_mem_new ();
        
        /* sign the content stream */
-       if ((rv = g_mime_crypto_context_sign (ctx, userid, digest, filtered, sigstream, err)) == -1) {
+       if ((rv = g_mime_crypto_context_sign (ctx, TRUE, userid, digest, filtered, sigstream, err)) == -1) {
                g_object_unref (sigstream);
                g_object_unref (filtered);
                g_object_unref (stream);
diff --git a/gmime/gmime-pkcs7-context.c b/gmime/gmime-pkcs7-context.c
index 276ff1d..77785dd 100644
--- a/gmime/gmime-pkcs7-context.c
+++ b/gmime/gmime-pkcs7-context.c
@@ -93,9 +93,10 @@ static const char *pkcs7_get_encryption_protocol (GMimeCryptoContext *ctx);
 
 static const char *pkcs7_get_key_exchange_protocol (GMimeCryptoContext *ctx);
 
-static int pkcs7_sign (GMimeCryptoContext *ctx, const char *userid,
-                      GMimeDigestAlgo digest, GMimeStream *istream,
-                      GMimeStream *ostream, GError **err);
+static int pkcs7_sign (GMimeCryptoContext *ctx, gboolean detach,
+                      const char *userid, GMimeDigestAlgo digest,
+                      GMimeStream *istream, GMimeStream *ostream,
+                      GError **err);
        
 static GMimeSignatureList *pkcs7_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
                                         GMimeStream *istream, GMimeStream *sigstream,
@@ -448,10 +449,11 @@ pkcs7_add_signer (GMimePkcs7Context *pkcs7, const char *signer, GError **err)
 #endif /* ENABLE_CRYPTO */
 
 static int
-pkcs7_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo digest,
+pkcs7_sign (GMimeCryptoContext *context, gboolean detach, const char *userid, GMimeDigestAlgo digest,
            GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
 #ifdef ENABLE_CRYPTO
+       gpgme_sig_mode_t mode = detach ? GPGME_SIG_MODE_DETACH : GPGME_SIG_MODE_NORMAL;
        GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context;
        gpgme_sign_result_t result;
        gpgme_data_t input, output;
@@ -474,7 +476,7 @@ pkcs7_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo dig
        }
        
        /* sign the input stream */
-       if ((error = gpgme_op_sign (pkcs7->ctx, input, output, GPGME_SIG_MODE_DETACH)) != GPG_ERR_NO_ERROR) {
+       if ((error = gpgme_op_sign (pkcs7->ctx, input, output, mode)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Signing failed"));
                gpgme_data_release (output);
                gpgme_data_release (input);
diff --git a/gmime/gmime.h b/gmime/gmime.h
index 1de8815..e478694 100644
--- a/gmime/gmime.h
+++ b/gmime/gmime.h
@@ -35,6 +35,7 @@
 #include <gmime/gmime-object.h>
 #include <gmime/gmime-part.h>
 #include <gmime/gmime-part-iter.h>
+#include <gmime/gmime-application-pkcs7-mime.h>
 #include <gmime/gmime-multipart.h>
 #include <gmime/gmime-multipart-encrypted.h>
 #include <gmime/gmime-multipart-signed.h>
diff --git a/tests/test-pgp.c b/tests/test-pgp.c
index 122649d..9294074 100644
--- a/tests/test-pgp.c
+++ b/tests/test-pgp.c
@@ -73,7 +73,7 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
        Exception *ex;
        int rv;
        
-       rv = g_mime_crypto_context_sign (ctx, "no.user@no.domain",
+       rv = g_mime_crypto_context_sign (ctx, TRUE, "no.user@no.domain",
                                         GMIME_DIGEST_ALGO_SHA256,
                                         cleartext, ciphertext, &err);
        
diff --git a/tests/test-pkcs7.c b/tests/test-pkcs7.c
index eafbef7..32a8075 100644
--- a/tests/test-pkcs7.c
+++ b/tests/test-pkcs7.c
@@ -74,7 +74,7 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
        Exception *ex;
        int rv;
        
-       rv = g_mime_crypto_context_sign (ctx, "alice example net",
+       rv = g_mime_crypto_context_sign (ctx, TRUE, "alice example net",
                                         GMIME_DIGEST_ALGO_SHA256,
                                         cleartext, ciphertext, &err);
        


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]