[gmime] Fixed CryptoContext::encrypt() to take a hash arg



commit bc584f5121d0db3ca4dd8a7153fab87b37b4ac2d
Author: Jeffrey Stedfast <fejj gnome org>
Date:   Mon Nov 22 22:07:13 2010 -0500

    Fixed CryptoContext::encrypt() to take a hash arg
    
    2010-11-22  Jeffrey Stedfast  <fejj novell com>
    
    	* gmime/gmime-multipart-encrypted.c
    	* (g_mime_multipart_encrypted_encrypt):
    	Now takes a hash algorithm argument which it passes along to
    	g_mime_crypto_context_encrypt().
    
    	* gmime/gmime-gpg-context.c (gpg_ctx_get_argv): When signing and
    	encrypting, pass the digest algorithm to gpg on the
    command-line.
    	(gpg_encrypt): Set the hash id on the GpgCtx.
    
    	* gmime/gmime-crypto-context.c (g_mime_crypto_context_encrypt):
    	Now takes a hash algorithm argument.

 ChangeLog                         |   13 +++++++++++++
 gmime/gmime-crypto-context.c      |   21 +++++++++++----------
 gmime/gmime-crypto-context.h      |   12 ++++++------
 gmime/gmime-gpg-context.c         |   18 ++++++++++--------
 gmime/gmime-multipart-encrypted.c |    7 ++++---
 gmime/gmime-multipart-encrypted.h |    4 ++--
 gmime/gmime-pkcs7-context.c       |   11 +++++------
 mono/gmime-api.raw                |    3 +++
 tests/test-pgp.c                  |    4 ++--
 tests/test-pgpmime.c              |    3 ++-
 tests/test-pkcs7.c                |    3 ++-
 tests/test-smime.c                |    3 ++-
 12 files changed, 62 insertions(+), 40 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f998884..2e3cfdd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2010-11-22  Jeffrey Stedfast  <fejj novell com>
 
+	* gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt):
+	Now takes a hash algorithm argument which it passes along to
+	g_mime_crypto_context_encrypt().
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_get_argv): When signing and
+	encrypting, pass the digest algorithm to gpg on the command-line.
+	(gpg_encrypt): Set the hash id on the GpgCtx.
+
+	* gmime/gmime-crypto-context.c (g_mime_crypto_context_encrypt):
+	Now takes a hash algorithm argument.
+
+2010-11-22  Jeffrey Stedfast  <fejj novell com>
+
 	Fixes bug #635492.
 
 	* gmime/gmime-gpg-context.c (gpg_hash_from_id): New function
diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
index 75b87ea..ea4211c 100644
--- a/gmime/gmime-crypto-context.c
+++ b/gmime/gmime-crypto-context.c
@@ -55,9 +55,9 @@ static GMimeSignatureValidity *crypto_verify (GMimeCryptoContext *ctx, GMimeCryp
 					      GError **err);
 	
 static int crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign,
-			   const char *userid, GPtrArray *recipients,
-			   GMimeStream *istream, GMimeStream *ostream,
-			   GError **err);
+			   const char *userid, GMimeCryptoHash hash,
+			   GPtrArray *recipients, GMimeStream *istream,
+			   GMimeStream *ostream, GError **err);
 
 static GMimeSignatureValidity *crypto_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream,
 					       GMimeStream *ostream, GError **err);
@@ -232,7 +232,7 @@ crypto_sign (GMimeCryptoContext *ctx, const char *userid, GMimeCryptoHash hash,
  * g_mime_crypto_context_sign:
  * @ctx: a #GMimeCryptoContext
  * @userid: private key to use to sign the stream
- * @hash: preferred Message-Integrity-Check hash algorithm
+ * @hash: digest algorithm to use
  * @istream: input stream
  * @ostream: output stream
  * @err: a #GError
@@ -268,7 +268,7 @@ crypto_verify (GMimeCryptoContext *ctx, GMimeCryptoHash hash, GMimeStream *istre
 /**
  * g_mime_crypto_context_verify:
  * @ctx: a #GMimeCryptoContext
- * @hash: secure hash used
+ * @hash: digest algorithm used, if known
  * @istream: input stream
  * @sigstream: optional detached-signature stream
  * @err: a #GError
@@ -294,8 +294,8 @@ g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeCryptoHash hash, GMi
 
 
 static int
-crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GPtrArray *recipients,
-		GMimeStream *istream, GMimeStream *ostream, GError **err)
+crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeCryptoHash hash,
+		GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
 	g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
 		     "Encryption is not supported by this crypto context");
@@ -309,6 +309,7 @@ crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GPtr
  * @ctx: a #GMimeCryptoContext
  * @sign: sign as well as encrypt
  * @userid: key id (or email address) to use when signing (assuming @sign is %TRUE)
+ * @hash: digest algorithm to use when signing
  * @recipients: an array of recipient key ids and/or email addresses
  * @istream: cleartext input stream
  * @ostream: cryptotext output stream
@@ -320,14 +321,14 @@ crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GPtr
  * Returns: %0 on success or %-1 on fail.
  **/
 int
-g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GPtrArray *recipients,
-			       GMimeStream *istream, GMimeStream *ostream, GError **err)
+g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeCryptoHash hash,
+			       GPtrArray *recipients, 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)->encrypt (ctx, sign, userid, recipients, istream, ostream, err);
+	return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->encrypt (ctx, sign, userid, hash, recipients, istream, ostream, err);
 }
 
 
diff --git a/gmime/gmime-crypto-context.h b/gmime/gmime-crypto-context.h
index 71e347e..7d87296 100644
--- a/gmime/gmime-crypto-context.h
+++ b/gmime/gmime-crypto-context.h
@@ -131,9 +131,9 @@ struct _GMimeCryptoContextClass {
 						  GError **err);
 	
 	int                      (* encrypt)     (GMimeCryptoContext *ctx, gboolean sign,
-						  const char *userid, GPtrArray *recipients,
-						  GMimeStream *istream, GMimeStream *ostream,
-						  GError **err);
+						  const char *userid, GMimeCryptoHash hash,
+						  GPtrArray *recipients, GMimeStream *istream,
+						  GMimeStream *ostream, GError **err);
 	
 	GMimeSignatureValidity * (* decrypt)     (GMimeCryptoContext *ctx, GMimeStream *istream,
 						  GMimeStream *ostream, GError **err);
@@ -165,9 +165,9 @@ GMimeSignatureValidity *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, G
 						      GError **err);
 
 int                  g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign,
-						    const char *userid, GPtrArray *recipients,
-						    GMimeStream *istream, GMimeStream *ostream,
-						    GError **err);
+						    const char *userid, GMimeCryptoHash hash,
+						    GPtrArray *recipients, GMimeStream *istream,
+						    GMimeStream *ostream, GError **err);
 
 GMimeSignatureValidity *g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream,
 						       GMimeStream *ostream, GError **err);
diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c
index 96a0960..a73c5c4 100644
--- a/gmime/gmime-gpg-context.c
+++ b/gmime/gmime-gpg-context.c
@@ -86,10 +86,9 @@ static GMimeSignatureValidity *gpg_verify (GMimeCryptoContext *ctx, GMimeCryptoH
 					   GMimeStream *istream, GMimeStream *sigstream,
 					   GError **err);
 
-static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign,
-			const char *userid, GPtrArray *recipients,
-			GMimeStream *istream, GMimeStream *ostream,
-			GError **err);
+static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid,
+			GMimeCryptoHash hash, GPtrArray *recipients, GMimeStream *istream,
+			GMimeStream *ostream, GError **err);
 
 static GMimeSignatureValidity *gpg_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream,
 					    GMimeStream *ostream, GError **err);
@@ -608,8 +607,7 @@ gpg_ctx_get_argv (struct _GpgCtx *gpg, int status_fd, int secret_fd, char ***str
 		g_ptr_array_add (args, "--detach");
 		if (gpg->armor)
 			g_ptr_array_add (args, "--armor");
-		hash_str = gpg_hash_str (gpg->hash);
-		if (hash_str)
+		if ((hash_str = gpg_hash_str (gpg->hash)))
 			g_ptr_array_add (args, (char *) hash_str);
 		if (gpg->userid) {
 			g_ptr_array_add (args, "-u");
@@ -638,6 +636,9 @@ gpg_ctx_get_argv (struct _GpgCtx *gpg, int status_fd, int secret_fd, char ***str
 	case GPG_CTX_MODE_SIGN_ENCRYPT:
 		g_ptr_array_add (args, "--sign");
 		
+		if ((hash_str = gpg_hash_str (gpg->hash)))
+			g_ptr_array_add (args, (char *) hash_str);
+		
 		/* fall thru... */
 	case GPG_CTX_MODE_ENCRYPT:
 		g_ptr_array_add (args, "--encrypt");
@@ -1786,8 +1787,8 @@ gpg_verify (GMimeCryptoContext *context, GMimeCryptoHash hash,
 
 static int
 gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
-	     GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream,
-	     GError **err)
+	     GMimeCryptoHash hash, GPtrArray *recipients, GMimeStream *istream,
+	     GMimeStream *ostream, GError **err)
 {
 	GMimeGpgContext *ctx = (GMimeGpgContext *) context;
 	struct _GpgCtx *gpg;
@@ -1798,6 +1799,7 @@ gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
 		gpg_ctx_set_mode (gpg, GPG_CTX_MODE_SIGN_ENCRYPT);
 	else
 		gpg_ctx_set_mode (gpg, GPG_CTX_MODE_ENCRYPT);
+	gpg_ctx_set_hash (gpg, hash);
 	gpg_ctx_set_armor (gpg, TRUE);
 	gpg_ctx_set_userid (gpg, userid);
 	gpg_ctx_set_istream (gpg, istream);
diff --git a/gmime/gmime-multipart-encrypted.c b/gmime/gmime-multipart-encrypted.c
index fbd110c..98c17cd 100644
--- a/gmime/gmime-multipart-encrypted.c
+++ b/gmime/gmime-multipart-encrypted.c
@@ -148,6 +148,7 @@ g_mime_multipart_encrypted_new (void)
  * @ctx: encryption crypto context
  * @sign: %TRUE if the content should also be signed or %FALSE otherwise
  * @userid: user id to use for signing (only used if @sign is %TRUE)
+ * @hash: digest algorithm to use when signing
  * @recipients: an array of recipients to encrypt to
  * @err: a #GError
  *
@@ -163,8 +164,8 @@ g_mime_multipart_encrypted_new (void)
 int
 g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content,
 				    GMimeCryptoContext *ctx, gboolean sign,
-				    const char *userid, GPtrArray *recipients,
-				    GError **err)
+				    const char *userid, GMimeCryptoHash hash,
+				    GPtrArray *recipients, GError **err)
 {
 	GMimeStream *filtered_stream, *ciphertext, *stream;
 	GMimePart *version_part, *encrypted_part;
@@ -194,7 +195,7 @@ g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *c
 	
 	/* encrypt the content stream */
 	ciphertext = g_mime_stream_mem_new ();
-	if (g_mime_crypto_context_encrypt (ctx, sign, userid, recipients, stream, ciphertext, err) == -1) {
+	if (g_mime_crypto_context_encrypt (ctx, sign, userid, hash, recipients, stream, ciphertext, err) == -1) {
 		g_object_unref (ciphertext);
 		g_object_unref (stream);
 		return -1;
diff --git a/gmime/gmime-multipart-encrypted.h b/gmime/gmime-multipart-encrypted.h
index 12446b8..e037512 100644
--- a/gmime/gmime-multipart-encrypted.h
+++ b/gmime/gmime-multipart-encrypted.h
@@ -70,8 +70,8 @@ GMimeMultipartEncrypted *g_mime_multipart_encrypted_new (void);
 
 int g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content,
 					GMimeCryptoContext *ctx, gboolean sign,
-					const char *userid, GPtrArray *recipients,
-					GError **err);
+					const char *userid, GMimeCryptoHash hash,
+					GPtrArray *recipients, GError **err);
 
 GMimeObject *g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe,
 						 GMimeCryptoContext *ctx,
diff --git a/gmime/gmime-pkcs7-context.c b/gmime/gmime-pkcs7-context.c
index e8f0bbb..034ce53 100644
--- a/gmime/gmime-pkcs7-context.c
+++ b/gmime/gmime-pkcs7-context.c
@@ -84,10 +84,9 @@ static GMimeSignatureValidity *pkcs7_verify (GMimeCryptoContext *ctx, GMimeCrypt
 					     GMimeStream *istream, GMimeStream *sigstream,
 					     GError **err);
 
-static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign,
-			  const char *userid, GPtrArray *recipients,
-			  GMimeStream *istream, GMimeStream *ostream,
-			  GError **err);
+static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid,
+			  GMimeCryptoHash hash, GPtrArray *recipients, GMimeStream *istream,
+			  GMimeStream *ostream, GError **err);
 
 static GMimeSignatureValidity *pkcs7_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream,
 					      GMimeStream *ostream, GError **err);
@@ -649,8 +648,8 @@ key_list_free (gpgme_key_t *keys)
 
 static int
 pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
-	       GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream,
-	       GError **err)
+	       GMimeCryptoHash hash, GPtrArray *recipients, GMimeStream *istream,
+	       GMimeStream *ostream, GError **err)
 {
 #ifdef ENABLE_SMIME
 	GMimePkcs7Context *ctx = (GMimePkcs7Context *) context;
diff --git a/mono/gmime-api.raw b/mono/gmime-api.raw
index 710ea75..48ae0fb 100644
--- a/mono/gmime-api.raw
+++ b/mono/gmime-api.raw
@@ -181,6 +181,7 @@
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="gboolean" name="sign" />
           <parameter type="const-char*" name="userid" />
+          <parameter type="GMimeCryptoHash" name="hash" />
           <parameter type="GPtrArray*" name="recipients" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
@@ -226,6 +227,7 @@
         <parameters>
           <parameter type="gboolean" name="sign" />
           <parameter type="const-char*" name="userid" />
+          <parameter type="GMimeCryptoHash" name="hash" />
           <parameter type="GPtrArray*" name="recipients" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
@@ -1021,6 +1023,7 @@
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="gboolean" name="sign" />
           <parameter type="const-char*" name="userid" />
+          <parameter type="GMimeCryptoHash" name="hash" />
           <parameter type="GPtrArray*" name="recipients" />
           <parameter type="GError**" name="err" />
         </parameters>
diff --git a/tests/test-pgp.c b/tests/test-pgp.c
index d1bc897..34b9c52 100644
--- a/tests/test-pgp.c
+++ b/tests/test-pgp.c
@@ -103,8 +103,8 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	recipients = g_ptr_array_new ();
 	g_ptr_array_add (recipients, "no user no domain");
 	
-	g_mime_crypto_context_encrypt (ctx, sign, "no user no domain", recipients,
-				       cleartext, ciphertext, &err);
+	g_mime_crypto_context_encrypt (ctx, sign, "no user no domain", GMIME_CRYPTO_HASH_SHA256,
+				       recipients, cleartext, ciphertext, &err);
 	
 	g_ptr_array_free (recipients, TRUE);
 	
diff --git a/tests/test-pgpmime.c b/tests/test-pgpmime.c
index 2784e7f..734288e 100644
--- a/tests/test-pgpmime.c
+++ b/tests/test-pgpmime.c
@@ -285,7 +285,8 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	recipients = g_ptr_array_new ();
 	g_ptr_array_add (recipients, "no user no domain");
 	g_mime_multipart_encrypted_encrypt (mpe, GMIME_OBJECT (part), ctx, sign,
-					    "no user no domain", recipients, &err);
+					    "no user no domain", GMIME_CRYPTO_HASH_SHA256,
+					    recipients, &err);
 	g_ptr_array_free (recipients, TRUE);
 	g_object_unref (part);
 	
diff --git a/tests/test-pkcs7.c b/tests/test-pkcs7.c
index a9c69e9..8c4db4f 100644
--- a/tests/test-pkcs7.c
+++ b/tests/test-pkcs7.c
@@ -104,7 +104,8 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	recipients = g_ptr_array_new ();
 	g_ptr_array_add (recipients, "no user no domain");
 	
-	g_mime_crypto_context_encrypt (ctx, sign, "no user no domain", recipients,
+	g_mime_crypto_context_encrypt (ctx, sign, "no user no domain",
+				       GMIME_CRYPTO_HASH_SHA256, recipients,
 				       cleartext, ciphertext, &err);
 	
 	g_ptr_array_free (recipients, TRUE);
diff --git a/tests/test-smime.c b/tests/test-smime.c
index b72f74d..db1d93f 100644
--- a/tests/test-smime.c
+++ b/tests/test-smime.c
@@ -286,7 +286,8 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	recipients = g_ptr_array_new ();
 	g_ptr_array_add (recipients, "no user no domain");
 	g_mime_multipart_encrypted_encrypt (mpe, GMIME_OBJECT (part), ctx, sign,
-					    "no user no domain", recipients, &err);
+					    "no user no domain", GMIME_CRYPTO_HASH_SHA256,
+					    recipients, &err);
 	g_ptr_array_free (recipients, TRUE);
 	g_object_unref (part);
 	



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