[gmime] Updated docs and .NET bindings



commit 75bafb26c9a2ed3ea598c139bc5aacd5b248168c
Author: Jeffrey Stedfast <fejj gnome org>
Date:   Thu Mar 17 23:43:56 2011 -0400

    Updated docs and .NET bindings

 docs/reference/gmime-docs.sgml    |    6 +-
 docs/reference/gmime-sections.txt |  209 +++++++----
 docs/reference/gmime.hierarchy    |    5 +
 examples/basic-example.c          |   36 +-
 gmime/gmime-certificate.c         |    8 +-
 gmime/gmime-certificate.h         |    6 +-
 gmime/gmime-crypto-context.c      |    2 +-
 gmime/gmime-crypto-context.h      |    1 +
 gmime/gmime-gpg-context.c         |   14 +-
 gmime/gmime-signature.c           |    2 +-
 gmime/gmime-signature.h           |    1 +
 mono/CertificateCollection.custom |  264 ++++++++++++
 mono/CryptoRecipient.custom       |    8 -
 mono/CryptoRecipientCollection.cs |  129 ------
 mono/DecryptionResult.custom      |    3 -
 mono/GMime.metadata               |   68 +++-
 mono/Makefile.am                  |   10 +-
 mono/SignatureCollection.custom   |  264 ++++++++++++
 mono/SignatureValidity.custom     |    3 -
 mono/Signer.custom                |    8 -
 mono/SignerCollection.cs          |  130 ------
 mono/gmime-api.raw                |  799 ++++++++++++++++++++-----------------
 tests/test-pgp.c                  |   47 ++-
 tests/test-pgpmime.c              |  114 +++---
 tests/test-pkcs7.c                |   47 ++-
 tests/test-smime.c                |  114 +++---
 26 files changed, 1362 insertions(+), 936 deletions(-)
---
diff --git a/docs/reference/gmime-docs.sgml b/docs/reference/gmime-docs.sgml
index a4f9a52..c1d1bb9 100644
--- a/docs/reference/gmime-docs.sgml
+++ b/docs/reference/gmime-docs.sgml
@@ -49,6 +49,8 @@
 <!ENTITY GMimeFilterStrip SYSTEM "xml/gmime-filter-strip.xml">
 <!ENTITY GMimeFilterWindows SYSTEM "xml/gmime-filter-windows.xml">
 <!ENTITY GMimeFilterYenc SYSTEM "xml/gmime-filter-yenc.xml">
+<!ENTITY GMimeCertificate SYSTEM "xml/gmime-certificate.xml">
+<!ENTITY GMimeSignature SYSTEM "xml/gmime-signature.xml">
 <!ENTITY GMimeCryptoContext SYSTEM "xml/gmime-crypto-context.xml">
 <!ENTITY GMimeGpgContext SYSTEM "xml/gmime-gpg-context.xml">
 <!ENTITY GMimePkcs7Context SYSTEM "xml/gmime-pkcs7-context.xml">
@@ -84,7 +86,7 @@
       </author>
     </authorgroup>
     <copyright>
-      <year>2000-2010</year>
+      <year>2000-2011</year>
       <holder>Jeffrey Stedfast</holder>
     </copyright>
 
@@ -247,6 +249,8 @@ string utilities, file utilities, a main loop abstraction, and so on.
 
     <chapter id="CryptoContexts">
       <title>Cryptography Contexts</title>
+      &GMimeCertificate;
+      &GMimeSignature;
       &GMimeCryptoContext;
       &GMimeGpgContext;
       &GMimePkcs7Context;
diff --git a/docs/reference/gmime-sections.txt b/docs/reference/gmime-sections.txt
index 43a743b..47a7d09 100644
--- a/docs/reference/gmime-sections.txt
+++ b/docs/reference/gmime-sections.txt
@@ -1135,16 +1135,128 @@ g_mime_iconv_locale_to_utf8_length
 </SECTION>
 
 <SECTION>
+<FILE>gmime-certificate</FILE>
+GMimePubKeyAlgo
+GMimeDigestAlgo
+GMimeCertificateTrust
+GMimeCertificate
+g_mime_certificate_new
+g_mime_certificate_get_pubkey_algo
+g_mime_certificate_set_pubkey_algo
+g_mime_certificate_get_digest_algo
+g_mime_certificate_set_digest_algo
+g_mime_certificate_get_issuer_serial
+g_mime_certificate_set_issuer_serial
+g_mime_certificate_get_issuer_name
+g_mime_certificate_set_issuer_name
+g_mime_certificate_get_fingerprint
+g_mime_certificate_set_fingerprint
+g_mime_certificate_get_created
+g_mime_certificate_set_created
+g_mime_certificate_get_expires
+g_mime_certificate_set_expires
+g_mime_certificate_get_key_id
+g_mime_certificate_set_key_id
+g_mime_certificate_get_trust
+g_mime_certificate_set_trust
+g_mime_certificate_get_email
+g_mime_certificate_set_email
+g_mime_certificate_get_name
+g_mime_certificate_set_name
+<SUBSECTION>
+GMimeCertificateList
+g_mime_certificate_list_new
+g_mime_certificate_list_length
+g_mime_certificate_list_clear
+g_mime_certificate_list_add
+g_mime_certificate_list_insert
+g_mime_certificate_list_remove
+g_mime_certificate_list_remove_at
+g_mime_certificate_list_contains
+g_mime_certificate_list_index_of
+g_mime_certificate_list_get_certificate
+g_mime_certificate_list_set_certificate
+<SUBSECTION Private>
+g_mime_certificate_get_type
+g_mime_certificate_list_get_type
+
+<SUBSECTION Standard>
+GMIME_CERTIFICATE
+GMIME_IS_CERTIFICATE
+GMIME_TYPE_CERTIFICATE
+GMIME_CERTIFICATE_CLASS
+GMIME_IS_CERTIFICATE_CLASS
+GMIME_CERTIFICATE_GET_CLASS
+GMimeCertificateClass
+GMIME_CERTIFICATE_LIST
+GMIME_IS_CERTIFICATE_LIST
+GMIME_TYPE_CERTIFICATE_LIST
+GMIME_CERTIFICATE_LIST_CLASS
+GMIME_IS_CERTIFICATE_LIST_CLASS
+GMIME_CERTIFICATE_LIST_GET_CLASS
+GMimeCertificateListClass
+</SECTION>
+
+<SECTION>
+<FILE>gmime-signature</FILE>
+GMimeSignatureStatus
+GMimeSignatureError
+GMimeSignature
+g_mime_signature_new
+g_mime_signature_get_certificate
+g_mime_signature_set_certificate
+g_mime_signature_get_status
+g_mime_signature_set_status
+g_mime_signature_get_errors
+g_mime_signature_set_errors
+g_mime_signature_get_created
+g_mime_signature_set_created
+g_mime_signature_get_expires
+g_mime_signature_set_expires
+<SUBSECTION>
+GMimeSignatureList
+g_mime_signature_list_new
+g_mime_signature_list_length
+g_mime_signature_list_clear
+g_mime_signature_list_add
+g_mime_signature_list_insert
+g_mime_signature_list_remove
+g_mime_signature_list_remove_at
+g_mime_signature_list_contains
+g_mime_signature_list_index_of
+g_mime_signature_list_get_signature
+g_mime_signature_list_set_signature
+<SUBSECTION Private>
+g_mime_signature_get_type
+g_mime_signature_list_get_type
+
+<SUBSECTION Standard>
+GMIME_SIGNATURE
+GMIME_IS_SIGNATURE
+GMIME_TYPE_SIGNATURE
+GMIME_SIGNATURE_CLASS
+GMIME_IS_SIGNATURE_CLASS
+GMIME_SIGNATURE_GET_CLASS
+GMimeSignatureClass
+GMIME_SIGNATURE_LIST
+GMIME_IS_SIGNATURE_LIST
+GMIME_TYPE_SIGNATURE_LIST
+GMIME_SIGNATURE_LIST_CLASS
+GMIME_IS_SIGNATURE_LIST_CLASS
+GMIME_SIGNATURE_LIST_GET_CLASS
+GMimeSignatureListClass
+</SECTION>
+
+<SECTION>
 <FILE>gmime-crypto-context</FILE>
 GMimePasswordRequestFunc
-GMimeCryptoHash
 GMimeCryptoContext
 g_mime_crypto_context_set_request_password
 g_mime_crypto_context_get_signature_protocol
 g_mime_crypto_context_get_encryption_protocol
 g_mime_crypto_context_get_key_exchange_protocol
-g_mime_crypto_context_hash_id
-g_mime_crypto_context_hash_name
+g_mime_crypto_context_digest_id
+g_mime_crypto_context_digest_name
 g_mime_crypto_context_sign
 g_mime_crypto_context_verify
 g_mime_crypto_context_encrypt
@@ -1152,80 +1264,20 @@ g_mime_crypto_context_decrypt
 g_mime_crypto_context_import_keys
 g_mime_crypto_context_export_keys
 <SUBSECTION>
-GMimeCryptoPubKeyAlgo
-GMimeSignerStatus
-GMimeSignerTrust
-GMimeSignerError
-GMimeSigner
-g_mime_signer_new
-g_mime_signer_free
-g_mime_signer_next
-g_mime_signer_get_status
-g_mime_signer_set_status
-g_mime_signer_get_errors
-g_mime_signer_set_errors
-g_mime_signer_get_trust
-g_mime_signer_set_trust
-g_mime_signer_get_hash_algo
-g_mime_signer_set_hash_algo
-g_mime_signer_get_pubkey_algo
-g_mime_signer_set_pubkey_algo
-g_mime_signer_get_issuer_serial
-g_mime_signer_set_issuer_serial
-g_mime_signer_get_issuer_name
-g_mime_signer_set_issuer_name
-g_mime_signer_get_fingerprint
-g_mime_signer_set_fingerprint
-g_mime_signer_get_sig_class
-g_mime_signer_set_sig_class
-g_mime_signer_get_sig_version
-g_mime_signer_set_sig_version
-g_mime_signer_get_sig_created
-g_mime_signer_set_sig_created
-g_mime_signer_get_sig_expires
-g_mime_signer_set_sig_expires
-g_mime_signer_get_key_created
-g_mime_signer_set_key_created
-g_mime_signer_get_key_expires
-g_mime_signer_set_key_expires
-g_mime_signer_get_key_id
-g_mime_signer_set_key_id
-g_mime_signer_get_email
-g_mime_signer_set_email
-g_mime_signer_get_name
-g_mime_signer_set_name
-<SUBSECTION>
-GMimeSignatureValidity
-g_mime_signature_validity_new
-g_mime_signature_validity_free
-g_mime_signature_validity_set_details
-g_mime_signature_validity_get_details
-g_mime_signature_validity_add_signer
-g_mime_signature_validity_get_signers
-<SUBSECTION>
-GMimeCryptoRecipient
-g_mime_crypto_recipient_new
-g_mime_crypto_recipient_free
-g_mime_crypto_recipient_next
-g_mime_crypto_recipient_set_key_id
-g_mime_crypto_recipient_get_key_id
-g_mime_crypto_recipient_set_pubkey_algo
-g_mime_crypto_recipient_get_pubkey_algo
-<SUBSECTION>
-GMimeCryptoCipherAlgo
-GMimeDecryptionResult
-g_mime_decryption_result_new
-g_mime_decryption_result_free
-g_mime_decryption_result_set_validity
-g_mime_decryption_result_get_validity
-g_mime_decryption_result_add_recipient
-g_mime_decryption_result_get_recipients
-g_mime_decryption_result_set_cipher
-g_mime_decryption_result_get_cipher
-g_mime_decryption_result_set_mdc
-g_mime_decryption_result_get_mdc
+GMimeCipherAlgo
+GMimeDecryptResult
+g_mime_decrypt_result_new
+g_mime_decrypt_result_get_recipients
+g_mime_decrypt_result_set_recipients
+g_mime_decrypt_result_get_signatures
+g_mime_decrypt_result_set_signatures
+g_mime_decrypt_result_get_cipher
+g_mime_decrypt_result_set_cipher
+g_mime_decrypt_result_get_mdc
+g_mime_decrypt_result_set_mdc
 <SUBSECTION Private>
 g_mime_crypto_context_get_type
+g_mime_decrypt_result_get_type
 
 <SUBSECTION Standard>
 GMIME_CRYPTO_CONTEXT
@@ -1235,6 +1287,13 @@ GMIME_CRYPTO_CONTEXT_CLASS
 GMIME_IS_CRYPTO_CONTEXT_CLASS
 GMIME_CRYPTO_CONTEXT_GET_CLASS
 GMimeCryptoContextClass
+GMIME_DECRYPT_RESULT
+GMIME_IS_DECRYPT_RESULT
+GMIME_TYPE_DECRYPT_RESULT
+GMIME_DECRYPT_RESULT_CLASS
+GMIME_IS_DECRYPT_RESULT_CLASS
+GMIME_DECRYPT_RESULT_GET_CLASS
+GMimeDecryptResultClass
 </SECTION>
 
 <SECTION>
diff --git a/docs/reference/gmime.hierarchy b/docs/reference/gmime.hierarchy
index 6776299..fa30bd3 100644
--- a/docs/reference/gmime.hierarchy
+++ b/docs/reference/gmime.hierarchy
@@ -13,8 +13,13 @@ GObject
     InternetAddressGroup
     InternetAddressMailbox
   InternetAddressList
+  GMimeCertificate
+  GMimeCertificateList
+  GMimeSignature
+  GMimeSignatureList
   GMimeCipherContext
     GMimeGpgContext
+    GMimePkcs7Context
   GMimeDataWrapper
   GMimeFilter
     GMimeFilterBasic
diff --git a/examples/basic-example.c b/examples/basic-example.c
index 82eaa30..7dcf203 100644
--- a/examples/basic-example.c
+++ b/examples/basic-example.c
@@ -136,18 +136,19 @@ count_parts_in_message (GMimeMessage *message)
 }
 
 #ifndef G_OS_WIN32
-static GMimeSignerStatus
-sig_status (GMimeSignatureValidity *validity)
+static GMimeSignatureStatus
+sig_status (GMimeSignatureList *signatures)
 {
-	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
-	GMimeSigner *signer = validity->signers;
+	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+	GMimeSignature *sig;
+	int i;
 	
-	if (signer == NULL)
-		return GMIME_SIGNER_STATUS_ERROR;
+	if (!signatures || signatures->array->len == 0)
+		return GMIME_SIGNATURE_STATUS_ERROR;
 	
-	while (signer != NULL) {
-		status = MAX (status, signer->status);
-		signer = signer->next;
+	for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		status = MAX (status, sig->status);
 	}
 	
 	return status;
@@ -161,11 +162,11 @@ verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_d
 	if (GMIME_IS_MULTIPART_SIGNED (part)) {
 		/* this is a multipart/signed part, so we can verify the pgp signature */
 		GMimeMultipartSigned *mps = (GMimeMultipartSigned *) part;
-		GMimeSignatureValidity *validity;
+		GMimeSignatureList *signatures;
 		GError *err = NULL;
 		const char *str;
 		
-		if (!(validity = g_mime_multipart_signed_verify (mps, ctx, &err))) {
+		if (!(signatures = g_mime_multipart_signed_verify (mps, ctx, &err))) {
 			/* an error occured - probably couldn't start gpg? */
 			
 			/* for more information about GError, see:
@@ -176,14 +177,14 @@ verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_d
 			g_error_free (err);
 		} else {
 			/* print out validity info - GOOD vs BAD and "why" */
-			switch (sig_status (validity)) {
-			case GMIME_SIGNER_STATUS_GOOD:
+			switch (sig_status (signatures)) {
+			case GMIME_SIGNATURE_STATUS_GOOD:
 				str = "Good";
 				break;
-			case GMIME_SIGNER_STATUS_BAD:
+			case GMIME_SIGNATURE_STATUS_BAD:
 				str = "Bad";
 				break;
-			case GMIME_SIGNER_STATUS_ERROR:
+			case GMIME_SIGNATURE_STATUS_ERROR:
 				str = "Error";
 				break;
 			default:
@@ -191,10 +192,7 @@ verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_d
 				break;
 			}
 			
-			printf ("PGP signature is %s:\n%s\n", str,
-				g_mime_signature_validity_get_details (validity));
-			
-			g_mime_signature_validity_free (validity);
+			g_object_unref (signatures);
 		}
 	}
 }
diff --git a/gmime/gmime-certificate.c b/gmime/gmime-certificate.c
index 603489e..05a3c7a 100644
--- a/gmime/gmime-certificate.c
+++ b/gmime/gmime-certificate.c
@@ -784,7 +784,7 @@ g_mime_certificate_list_index_of (GMimeCertificateList *list, GMimeCertificate *
 
 
 /**
- * g_mime_certificate_list_get_cert:
+ * g_mime_certificate_list_get_certificate:
  * @list: a #GMimeCertificateList
  * @index: index of #GMimeCertificate to get
  *
@@ -794,7 +794,7 @@ g_mime_certificate_list_index_of (GMimeCertificateList *list, GMimeCertificate *
  * the index is out of range.
  **/
 GMimeCertificate *
-g_mime_certificate_list_get_cert (GMimeCertificateList *list, int index)
+g_mime_certificate_list_get_certificate (GMimeCertificateList *list, int index)
 {
 	g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), NULL);
 	g_return_val_if_fail (index >= 0, NULL);
@@ -807,7 +807,7 @@ g_mime_certificate_list_get_cert (GMimeCertificateList *list, int index)
 
 
 /**
- * g_mime_certificate_list_set_cert:
+ * g_mime_certificate_list_set_certificate:
  * @list: a #GMimeCertificateList
  * @index: index of #GMimeCertificate to set
  * @cert: a #GMimeCertificate
@@ -815,7 +815,7 @@ g_mime_certificate_list_get_cert (GMimeCertificateList *list, int index)
  * Sets the #GMimeCertificate at the specified index to @cert.
  **/
 void
-g_mime_certificate_list_set_cert (GMimeCertificateList *list, int index, GMimeCertificate *cert)
+g_mime_certificate_list_set_certificate (GMimeCertificateList *list, int index, GMimeCertificate *cert)
 {
 	GMimeCertificate *old;
 	
diff --git a/gmime/gmime-certificate.h b/gmime/gmime-certificate.h
index efd5f3e..582216e 100644
--- a/gmime/gmime-certificate.h
+++ b/gmime/gmime-certificate.h
@@ -126,8 +126,10 @@ typedef enum {
 
 /**
  * GMimeCertificate:
+ * @parent_object: parent #GObject
  * @pubkey_algo: The public-key algorithm used by the certificate, if known.
  * @digest_algo: The digest algorithm used by the certificate, if known.
+ * @trust: The level of trust assigned to this certificate.
  * @issuer_serial: The issuer of the certificate, if known.
  * @issuer_name: The issuer of the certificate, if known.
  * @fingerprint: A hex string representing the certificate's fingerprint.
@@ -233,8 +235,8 @@ gboolean g_mime_certificate_list_remove_at (GMimeCertificateList *list, int inde
 gboolean g_mime_certificate_list_contains (GMimeCertificateList *list, GMimeCertificate *cert);
 int g_mime_certificate_list_index_of (GMimeCertificateList *list, GMimeCertificate *cert);
 
-GMimeCertificate *g_mime_certificate_list_get_cert (GMimeCertificateList *list, int index);
-void g_mime_certificate_list_set_cert (GMimeCertificateList *list, int index, GMimeCertificate *cert);
+GMimeCertificate *g_mime_certificate_list_get_certificate (GMimeCertificateList *list, int index);
+void g_mime_certificate_list_set_certificate (GMimeCertificateList *list, int index, GMimeCertificate *cert);
 
 G_END_DECLS
 
diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
index 925b9bb..1c14d43 100644
--- a/gmime/gmime-crypto-context.c
+++ b/gmime/gmime-crypto-context.c
@@ -557,7 +557,7 @@ g_mime_decrypt_result_class_init (GMimeDecryptResultClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	
-	parent_class = g_type_class_ref (G_TYPE_OBJECT);
+	result_parent_class = g_type_class_ref (G_TYPE_OBJECT);
 	
 	object_class->finalize = g_mime_decrypt_result_finalize;
 }
diff --git a/gmime/gmime-crypto-context.h b/gmime/gmime-crypto-context.h
index 3fd5e04..eb88f4f 100644
--- a/gmime/gmime-crypto-context.h
+++ b/gmime/gmime-crypto-context.h
@@ -191,6 +191,7 @@ typedef enum {
 
 /**
  * GMimeDecryptResult:
+ * @parent_object: parent #GObject
  * @recipients: A #GMimeCertificateList
  * @signatures: A #GMimeSignatureList if signed or %NULL otherwise.
  * @cipher: The cipher algorithm used to encrypt the stream.
diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c
index 4d7cb47..cf6fdc0 100644
--- a/gmime/gmime-gpg-context.c
+++ b/gmime/gmime-gpg-context.c
@@ -1855,7 +1855,19 @@ gpg_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest,
 		}
 	}
 	
-	valid = gpg_ctx_op_wait (gpg) == 0;
+	if (gpg_ctx_op_wait (gpg) != 0) {
+		const char *diagnostics;
+		int save;
+		
+		save = errno;
+		diagnostics = gpg_ctx_get_diagnostics (gpg);
+		errno = save;
+		
+		g_set_error_literal (err, GMIME_ERROR, errno, diagnostics);
+		gpg_ctx_free (gpg);
+		
+		return NULL;
+	}
 	
 	signatures = gpg->signatures;
 	gpg->signatures = NULL;
diff --git a/gmime/gmime-signature.c b/gmime/gmime-signature.c
index f26c935..9feba8b 100644
--- a/gmime/gmime-signature.c
+++ b/gmime/gmime-signature.c
@@ -152,7 +152,7 @@ g_mime_signature_get_status (GMimeSignature *sig)
 /**
  * g_mime_signature_set_errors:
  * @sig: a #GMimeSignature
- * @error: a #GMimeSignatureError
+ * @errors: a #GMimeSignatureError
  *
  * Set the errors on the signature.
  **/
diff --git a/gmime/gmime-signature.h b/gmime/gmime-signature.h
index 2baf9c1..0369a33 100644
--- a/gmime/gmime-signature.h
+++ b/gmime/gmime-signature.h
@@ -86,6 +86,7 @@ typedef enum {
 
 /**
  * GMimeSignature:
+ * @parent_object: parent #GObject
  * @status: A #GMimeSignatureStatus.
  * @errors: A bitfield of #GMimeSignatureError values.
  * @cert: The #GMimeCertificate used in the signature.
diff --git a/mono/CertificateCollection.custom b/mono/CertificateCollection.custom
new file mode 100644
index 0000000..a7ab8b7
--- /dev/null
+++ b/mono/CertificateCollection.custom
@@ -0,0 +1,264 @@
+#region Native Methods
+		[DllImport("gmime")]
+		static extern int g_mime_certificate_list_length (IntPtr list);
+		
+		[DllImport("gmime")]
+		static extern void g_mime_certificate_list_clear (IntPtr list);
+		
+		[DllImport("gmime")]
+		static extern int g_mime_certificate_list_add (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern void g_mime_certificate_list_insert (IntPtr list, int index, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern bool g_mime_certificate_list_remove (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern bool g_mime_certificate_list_remove_at (IntPtr list, int index);
+		
+		[DllImport("gmime")]
+		static extern bool g_mime_certificate_list_contains (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern int g_mime_certificate_list_index_of (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern IntPtr g_mime_certificate_list_get_certificate (IntPtr list, int index);
+		
+		[DllImport("gmime")]
+		static extern void g_mime_certificate_list_set_certificate (IntPtr list, int index, IntPtr ia);
+#endregion
+		
+		Exception CannotAdd (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string message = String.Format ("Cannot add objects of type '{0}' to a CertificateCollection.",
+							value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		Exception CannotInsert (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string message = String.Format ("Cannot insert objects of type '{0}' into a CertificateCollection.",
+							value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		Exception CannotRemove (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string  message = String.Format ("Cannot remove objects of type '{0}' from a CertificateCollection.",
+							 value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		Exception CannotSet (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string message = String.Format ("Cannot set objects of type '{0}' on an CertificateCollection.",
+							value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		public int Count {
+			get { return g_mime_certificate_list_length (Handle); }
+		}
+		
+		public bool IsFixedSize {
+			get { return false; }
+		}
+		
+		public bool IsReadOnly {
+			get { return false; }
+		}
+		
+		public bool IsSynchronized {
+			get { return false; }
+		}
+		
+		public object SyncRoot {
+			get { return this; }
+		}
+		
+		public int Add (Certificate cert)
+		{
+			if (cert == null)
+				throw CannotAdd (cert);
+			
+			return g_mime_certificate_list_add (Handle, cert.Handle);
+		}
+		
+		int IList.Add (object value)
+		{
+			Certificate cert = value as Certificate;
+			
+			if (cert == null)
+				throw CannotAdd (value);
+			
+			return Add (cert);
+		}
+		
+		public void Clear ()
+		{
+			g_mime_certificate_list_clear (Handle);
+		}
+		
+		public bool Contains (Certificate cert)
+		{
+			if (cert == null)
+				return false;
+			
+			return g_mime_certificate_list_contains (Handle, cert.Handle);
+		}
+		
+		bool IList.Contains (object value)
+		{
+			return Contains (value as Certificate);
+		}
+		
+		public void CopyTo (Array array, int index)
+		{
+			if (array == null)
+				throw new ArgumentNullException ("array");
+			
+			if (index < 0)
+				throw new ArgumentOutOfRangeException ("index");
+			
+			int n = Count;
+			
+			for (int i = 0; i < n; i++)
+				array.SetValue (((IList) this)[i], index + i);
+		}
+		
+		public IEnumerator GetEnumerator ()
+		{
+			return new CertificateCollectionIterator (this);
+		}
+		
+		public int IndexOf (Certificate cert)
+		{
+			if (cert == null)
+				return -1;
+			
+			return g_mime_certificate_list_index_of (Handle, cert.Handle);
+		}
+		
+		int IList.IndexOf (object value)
+		{
+			return IndexOf (value as Certificate);
+		}
+		
+		public void Insert (int index, Certificate cert)
+		{
+			if (cert == null)
+				throw CannotInsert (cert);
+			
+			if (index < 0)
+				throw new ArgumentOutOfRangeException ("index");
+			
+			g_mime_certificate_list_insert (Handle, index, cert.Handle);
+		}
+		
+		void IList.Insert (int index, object value)
+		{
+			Certificate cert = value as Certificate;
+			
+			if (cert == null)
+				throw CannotInsert (value);
+			
+			Insert (index, cert);
+		}
+		
+		public void Remove (Certificate cert)
+		{
+			if (cert == null)
+				throw CannotRemove (cert);
+			
+			g_mime_certificate_list_remove (Handle, cert.Handle);
+		}
+		
+		void IList.Remove (object value)
+		{
+			Certificate cert = value as Certificate;
+			
+			if (cert == null)
+				throw CannotRemove (value);
+			
+			Remove (cert);
+		}
+		
+		public void RemoveAt (int index)
+		{
+			if (index < 0 || index >= Count)
+				throw new ArgumentOutOfRangeException ("index");
+			
+			g_mime_certificate_list_remove_at (Handle, index);
+		}
+		
+		public Certificate this[int index] {
+			get {
+				IntPtr raw = g_mime_certificate_list_get_certificate (Handle, index);
+				
+				if (raw == IntPtr.Zero)
+					return null;
+				
+				return GLib.Object.GetObject (raw) as Certificate;
+			}
+			
+			set {
+				if (value == null)
+					throw CannotSet (value);
+				
+				g_mime_certificate_list_set_certificate (Handle, index, value.Handle);
+			}
+		}
+		
+		object IList.this[int index] {
+			get {
+				return this[index];
+			}
+			
+			set {
+				this[index] = value as Certificate;
+			}
+		}
+		
+		internal class CertificateCollectionIterator : IEnumerator {
+			CertificateCollection list;
+			int index = -1;
+			
+			public CertificateCollectionIterator (CertificateCollection list)
+			{
+				this.list = list;
+			}
+			
+			public object Current {
+				get { return list[index]; }
+			}
+			
+			public void Reset ()
+			{
+				index = -1;
+			}
+			
+			public bool MoveNext ()
+			{
+				index++;
+				
+				return index < list.Count;
+			}
+		}
diff --git a/mono/GMime.metadata b/mono/GMime.metadata
index 3ec91e5..40e3226 100644
--- a/mono/GMime.metadata
+++ b/mono/GMime.metadata
@@ -46,22 +46,62 @@
   <remove-node path="/api/namespace/object[ cname='GMimeContentType']/field[ cname='params']"/>
   <remove-node path="/api/namespace/object[ cname='GMimeContentType']/field[ cname='subtype']"/>
   <remove-node path="/api/namespace/object[ cname='GMimeContentType']/field[ cname='type']"/>
-
+  
+  <!-- Certificate -->
+  <attr path="/api/namespace/object[ cname='GMimeCertificate']/method[ name='GetCreated']" name="name">GetCreationDate</attr>
+  <attr path="/api/namespace/object[ cname='GMimeCertificate']/method[ name='SetCreated']" name="name">SetCreationDate</attr>
+  <attr path="/api/namespace/object[ cname='GMimeCertificate']/method[ name='GetExpires']" name="name">GetExpirationDate</attr>
+  <attr path="/api/namespace/object[ cname='GMimeCertificate']/method[ name='SetExpires']" name="name">SetExpirationDate</attr>
+  
+  <!-- CertificateList -->
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/field[ cname='array']"/>
+  <attr path="/api/namespace/object[ name='CertificateList']" name="name">CertificateCollection</attr>
+  <!-- We're going to implement the IList interface -->
+  <add-node path="/api/namespace/object[ cname='GMimeCertificateList']">
+    <implements>
+      <interface name="IList"/>
+    </implements>
+  </add-node>
+  <!-- Remove methods we're going to implement manually in GMimeCertificateList.custom -->
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='Add']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='Clear']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='Contains']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='IndexOf']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='Insert']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='Length']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='Remove']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='RemoveAt']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='GetCertificate']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeCertificateList']/method[ name='SetCertificate']"/>
+
+  <!-- Signature -->
+  <attr path="/api/namespace/object[ cname='GMimeSignature']/method[ name='GetCreated']" name="name">GetCreationDate</attr>
+  <attr path="/api/namespace/object[ cname='GMimeSignature']/method[ name='SetCreated']" name="name">SetCreationDate</attr>
+  <attr path="/api/namespace/object[ cname='GMimeSignature']/method[ name='GetExpires']" name="name">GetExpirationDate</attr>
+  <attr path="/api/namespace/object[ cname='GMimeSignature']/method[ name='SetExpires']" name="name">SetExpirationDate</attr>
+
+  <!-- SignatureList -->
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/field[ cname='array']"/>
+  <attr path="/api/namespace/object[ name='SignatureList']" name="name">SignatureCollection</attr>
+  <!-- We're going to implement the IList interface -->
+  <add-node path="/api/namespace/object[ cname='GMimeSignatureList']">
+    <implements>
+      <interface name="IList"/>
+    </implements>
+  </add-node>
+  <!-- Remove methods we're going to implement manually in GMimeSignatureList.custom -->
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='Add']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='Clear']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='Contains']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='IndexOf']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='Insert']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='Length']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='Remove']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='RemoveAt']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='GetSignature']"/>
+  <remove-node path="/api/namespace/object[ cname='GMimeSignatureList']/method[ name='SetSignature']"/>
+  
   <!-- CryptoContext -->
-  <remove-node path="/api/namespace/struct[ cname='GMimeDecryptionResult']/method[ name='GetRecipients']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeDecryptionResult']/method[ name='AddRecipient']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeDecryptionResult']/field[ cname='recipients']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSignatureValidity']/method[ name='GetSigners']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSignatureValidity']/method[ name='AddSigner']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSignatureValidity']/field[ cname='signers']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeCryptoRecipient']/field[ cname='keyid']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeCryptoRecipient']/field[ cname='next']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeCryptoRecipient']/method[ name='Next']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSigner']/field[ cname='sig_ver']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSigner']/field[ cname='unused']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSigner']/field[ cname='keyid']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSigner']/field[ cname='next']"/>
-  <remove-node path="/api/namespace/struct[ cname='GMimeSigner']/method[ name='Next']"/>
 
   <!-- DataWrapper -->
   <attr path="/api/namespace/object[ cname='GMimeDataWrapper']/method[ name='GetStream']" name="name">GetGMimeStream</attr>
diff --git a/mono/Makefile.am b/mono/Makefile.am
index c2c4077..15c8bff 100644
--- a/mono/Makefile.am
+++ b/mono/Makefile.am
@@ -16,17 +16,14 @@ pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = $(PACKAGE_SHARP).pc
 
 sources = 					\
-	CryptoRecipientCollection.cs		\
-	SignerCollection.cs			\
 	StreamWrapper.cs
 
 build_sources =  				\
-	$(srcdir)/CryptoRecipientCollection.cs	\
-	$(srcdir)/SignerCollection.cs		\
 	$(srcdir)/StreamWrapper.cs		\
 	AssemblyInfo.cs
 
 customs = 					\
+	CertificateCollection.custom		\
 	DataWrapper.custom			\
 	Global.custom				\
 	HeaderList.custom			\
@@ -35,10 +32,11 @@ customs = 					\
 	Message.custom				\
 	Multipart.custom			\
 	Object.custom				\
-	SignatureValididty.custom		\
+	SignatureCollection.custom		\
 	Stream.custom
 
 build_customs = 				\
+	$(srcdir)/CertificateCollection.custom	\
 	$(srcdir)/DataWrapper.custom		\
 	$(srcdir)/Global.custom			\
 	$(srcdir)/HeaderList.custom		\
@@ -47,7 +45,7 @@ build_customs = 				\
 	$(srcdir)/Message.custom		\
 	$(srcdir)/Multipart.custom		\
 	$(srcdir)/Object.custom			\
-	$(srcdir)/SignatureValidity.custom	\
+	$(srcdir)/SignatureCollection.custom	\
 	$(srcdir)/Stream.custom
 
 EXTRA_DIST =					\
diff --git a/mono/SignatureCollection.custom b/mono/SignatureCollection.custom
new file mode 100644
index 0000000..a5a95e4
--- /dev/null
+++ b/mono/SignatureCollection.custom
@@ -0,0 +1,264 @@
+#region Native Methods
+		[DllImport("gmime")]
+		static extern int g_mime_signature_list_length (IntPtr list);
+		
+		[DllImport("gmime")]
+		static extern void g_mime_signature_list_clear (IntPtr list);
+		
+		[DllImport("gmime")]
+		static extern int g_mime_signature_list_add (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern void g_mime_signature_list_insert (IntPtr list, int index, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern bool g_mime_signature_list_remove (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern bool g_mime_signature_list_remove_at (IntPtr list, int index);
+		
+		[DllImport("gmime")]
+		static extern bool g_mime_signature_list_contains (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern int g_mime_signature_list_index_of (IntPtr list, IntPtr ia);
+		
+		[DllImport("gmime")]
+		static extern IntPtr g_mime_signature_list_get_signature (IntPtr list, int index);
+		
+		[DllImport("gmime")]
+		static extern void g_mime_signature_list_set_signature (IntPtr list, int index, IntPtr ia);
+#endregion
+		
+		Exception CannotAdd (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string message = String.Format ("Cannot add objects of type '{0}' to a SignatureCollection.",
+							value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		Exception CannotInsert (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string message = String.Format ("Cannot insert objects of type '{0}' into a SignatureCollection.",
+							value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		Exception CannotRemove (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string  message = String.Format ("Cannot remove objects of type '{0}' from a SignatureCollection.",
+							 value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		Exception CannotSet (object value)
+		{
+			if (value == null)
+				return new ArgumentNullException ("value");
+			
+			string message = String.Format ("Cannot set objects of type '{0}' on an SignatureCollection.",
+							value.GetType ().ToString ());
+			
+			return new InvalidOperationException (message);
+		}
+		
+		public int Count {
+			get { return g_mime_signature_list_length (Handle); }
+		}
+		
+		public bool IsFixedSize {
+			get { return false; }
+		}
+		
+		public bool IsReadOnly {
+			get { return false; }
+		}
+		
+		public bool IsSynchronized {
+			get { return false; }
+		}
+		
+		public object SyncRoot {
+			get { return this; }
+		}
+		
+		public int Add (Signature signature)
+		{
+			if (signature == null)
+				throw CannotAdd (signature);
+			
+			return g_mime_signature_list_add (Handle, signature.Handle);
+		}
+		
+		int IList.Add (object value)
+		{
+			Signature signature = value as Signature;
+			
+			if (signature == null)
+				throw CannotAdd (value);
+			
+			return Add (signature);
+		}
+		
+		public void Clear ()
+		{
+			g_mime_signature_list_clear (Handle);
+		}
+		
+		public bool Contains (Signature signature)
+		{
+			if (signature == null)
+				return false;
+			
+			return g_mime_signature_list_contains (Handle, signature.Handle);
+		}
+		
+		bool IList.Contains (object value)
+		{
+			return Contains (value as Signature);
+		}
+		
+		public void CopyTo (Array array, int index)
+		{
+			if (array == null)
+				throw new ArgumentNullException ("array");
+			
+			if (index < 0)
+				throw new ArgumentOutOfRangeException ("index");
+			
+			int n = Count;
+			
+			for (int i = 0; i < n; i++)
+				array.SetValue (((IList) this)[i], index + i);
+		}
+		
+		public IEnumerator GetEnumerator ()
+		{
+			return new SignatureCollectionIterator (this);
+		}
+		
+		public int IndexOf (Signature signature)
+		{
+			if (signature == null)
+				return -1;
+			
+			return g_mime_signature_list_index_of (Handle, signature.Handle);
+		}
+		
+		int IList.IndexOf (object value)
+		{
+			return IndexOf (value as Signature);
+		}
+		
+		public void Insert (int index, Signature signature)
+		{
+			if (signature == null)
+				throw CannotInsert (signature);
+			
+			if (index < 0)
+				throw new ArgumentOutOfRangeException ("index");
+			
+			g_mime_signature_list_insert (Handle, index, signature.Handle);
+		}
+		
+		void IList.Insert (int index, object value)
+		{
+			Signature signature = value as Signature;
+			
+			if (signature == null)
+				throw CannotInsert (value);
+			
+			Insert (index, signature);
+		}
+		
+		public void Remove (Signature signature)
+		{
+			if (signature == null)
+				throw CannotRemove (signature);
+			
+			g_mime_signature_list_remove (Handle, signature.Handle);
+		}
+		
+		void IList.Remove (object value)
+		{
+			Signature signature = value as Signature;
+			
+			if (signature == null)
+				throw CannotRemove (value);
+			
+			Remove (signature);
+		}
+		
+		public void RemoveAt (int index)
+		{
+			if (index < 0 || index >= Count)
+				throw new ArgumentOutOfRangeException ("index");
+			
+			g_mime_signature_list_remove_at (Handle, index);
+		}
+		
+		public Signature this[int index] {
+			get {
+				IntPtr raw = g_mime_signature_list_get_signature (Handle, index);
+				
+				if (raw == IntPtr.Zero)
+					return null;
+				
+				return GLib.Object.GetObject (raw) as Signature;
+			}
+			
+			set {
+				if (value == null)
+					throw CannotSet (value);
+				
+				g_mime_signature_list_set_signature (Handle, index, value.Handle);
+			}
+		}
+		
+		object IList.this[int index] {
+			get {
+				return this[index];
+			}
+			
+			set {
+				this[index] = value as Signature;
+			}
+		}
+		
+		internal class SignatureCollectionIterator : IEnumerator {
+			SignatureCollection list;
+			int index = -1;
+			
+			public SignatureCollectionIterator (SignatureCollection list)
+			{
+				this.list = list;
+			}
+			
+			public object Current {
+				get { return list[index]; }
+			}
+			
+			public void Reset ()
+			{
+				index = -1;
+			}
+			
+			public bool MoveNext ()
+			{
+				index++;
+				
+				return index < list.Count;
+			}
+		}
diff --git a/mono/gmime-api.raw b/mono/gmime-api.raw
index 97055f3..b39b770 100644
--- a/mono/gmime-api.raw
+++ b/mono/gmime-api.raw
@@ -7,6 +7,28 @@
 
 -->
   <namespace name="GMime" library="gmime">
+    <enum name="CertificateTrust" cname="GMimeCertificateTrust" type="enum">
+      <member cname="GMIME_CERTIFICATE_TRUST_NONE" name="None" />
+      <member cname="GMIME_CERTIFICATE_TRUST_NEVER" name="Never" />
+      <member cname="GMIME_CERTIFICATE_TRUST_UNDEFINED" name="Undefined" />
+      <member cname="GMIME_CERTIFICATE_TRUST_MARGINAL" name="Marginal" />
+      <member cname="GMIME_CERTIFICATE_TRUST_FULLY" name="Fully" />
+      <member cname="GMIME_CERTIFICATE_TRUST_ULTIMATE" name="Ultimate" />
+    </enum>
+    <enum name="CipherAlgo" cname="GMimeCipherAlgo" type="enum">
+      <member cname="GMIME_CIPHER_ALGO_DEFAULT" name="Default" />
+      <member cname="GMIME_CIPHER_ALGO_IDEA" name="Idea" value="1" />
+      <member cname="GMIME_CIPHER_ALGO_3DES" name="ThreeDes" value="2" />
+      <member cname="GMIME_CIPHER_ALGO_CAST5" name="Cast5" value="3" />
+      <member cname="GMIME_CIPHER_ALGO_BLOWFISH" name="Blowfish" value="4" />
+      <member cname="GMIME_CIPHER_ALGO_AES" name="Aes" value="7" />
+      <member cname="GMIME_CIPHER_ALGO_AES192" name="Aes192" value="8" />
+      <member cname="GMIME_CIPHER_ALGO_AES256" name="Aes256" value="9" />
+      <member cname="GMIME_CIPHER_ALGO_TWOFISH" name="Twofish" value="10" />
+      <member cname="GMIME_CIPHER_ALGO_CAMELLIA128" name="Camellia128" value="11" />
+      <member cname="GMIME_CIPHER_ALGO_CAMELLIA196" name="Camellia196" value="12" />
+      <member cname="GMIME_CIPHER_ALGO_CAMELLIA256" name="Camellia256" value="13" />
+    </enum>
     <enum name="ContentEncoding" cname="GMimeContentEncoding" type="enum">
       <member cname="GMIME_CONTENT_ENCODING_DEFAULT" name="Default" />
       <member cname="GMIME_CONTENT_ENCODING_7BIT" name="7Bit" />
@@ -16,42 +38,19 @@
       <member cname="GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE" name="Quotedprintable" />
       <member cname="GMIME_CONTENT_ENCODING_UUENCODE" name="Uuencode" />
     </enum>
-    <enum name="CryptoCipherAlgo" cname="GMimeCryptoCipherAlgo" type="enum">
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_DEFAULT" name="Default" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_IDEA" name="Idea" value="1" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_3DES" name="ThreeDes" value="2" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_CAST5" name="Cast5" value="3" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_BLOWFISH" name="Blowfish" value="4" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_AES" name="Aes" value="7" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_AES192" name="Aes192" value="8" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_AES256" name="Aes256" value="9" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_TWOFISH" name="Twofish" value="10" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_CAMELLIA128" name="Camellia128" value="11" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_CAMELLIA196" name="Camellia196" value="12" />
-      <member cname="GMIME_CRYPTO_CIPHER_ALGO_CAMELLIA256" name="Camellia256" value="13" />
-    </enum>
-    <enum name="CryptoHash" cname="GMimeCryptoHash" type="enum">
-      <member cname="GMIME_CRYPTO_HASH_DEFAULT" name="Default" />
-      <member cname="GMIME_CRYPTO_HASH_MD5" name="Md5" value="1" />
-      <member cname="GMIME_CRYPTO_HASH_SHA1" name="Sha1" value="2" />
-      <member cname="GMIME_CRYPTO_HASH_RIPEMD160" name="Ripemd160" value="3" />
-      <member cname="GMIME_CRYPTO_HASH_MD2" name="Md2" value="5" />
-      <member cname="GMIME_CRYPTO_HASH_TIGER192" name="Tiger192" value="6" />
-      <member cname="GMIME_CRYPTO_HASH_HAVAL5160" name="Haval5160" value="7" />
-      <member cname="GMIME_CRYPTO_HASH_SHA256" name="Sha256" value="8" />
-      <member cname="GMIME_CRYPTO_HASH_SHA384" name="Sha384" value="9" />
-      <member cname="GMIME_CRYPTO_HASH_SHA512" name="Sha512" value="10" />
-      <member cname="GMIME_CRYPTO_HASH_SHA224" name="Sha224" value="11" />
-      <member cname="GMIME_CRYPTO_HASH_MD4" name="Md4" value="301" />
-    </enum>
-    <enum name="CryptoPubKeyAlgo" cname="GMimeCryptoPubKeyAlgo" type="enum">
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_DEFAULT" name="Default" />
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_RSA" name="Rsa" value="1" />
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_RSA_E" name="RsaE" value="2" />
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_RSA_S" name="RsaS" value="3" />
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_ELG_E" name="ElgE" value="16" />
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_DSA" name="Dsa" value="17" />
-      <member cname="GMIME_CRYPTO_PUBKEY_ALGO_ELG" name="Elg" value="20" />
+    <enum name="DigestAlgo" cname="GMimeDigestAlgo" type="enum">
+      <member cname="GMIME_DIGEST_ALGO_DEFAULT" name="Default" />
+      <member cname="GMIME_DIGEST_ALGO_MD5" name="Md5" value="1" />
+      <member cname="GMIME_DIGEST_ALGO_SHA1" name="Sha1" value="2" />
+      <member cname="GMIME_DIGEST_ALGO_RIPEMD160" name="Ripemd160" value="3" />
+      <member cname="GMIME_DIGEST_ALGO_MD2" name="Md2" value="5" />
+      <member cname="GMIME_DIGEST_ALGO_TIGER192" name="Tiger192" value="6" />
+      <member cname="GMIME_DIGEST_ALGO_HAVAL5160" name="Haval5160" value="7" />
+      <member cname="GMIME_DIGEST_ALGO_SHA256" name="Sha256" value="8" />
+      <member cname="GMIME_DIGEST_ALGO_SHA384" name="Sha384" value="9" />
+      <member cname="GMIME_DIGEST_ALGO_SHA512" name="Sha512" value="10" />
+      <member cname="GMIME_DIGEST_ALGO_SHA224" name="Sha224" value="11" />
+      <member cname="GMIME_DIGEST_ALGO_MD4" name="Md4" value="301" />
     </enum>
     <enum name="EncodingConstraint" cname="GMimeEncodingConstraint" type="enum">
       <member cname="GMIME_ENCODING_CONSTRAINT_7BIT" name="7Bit" />
@@ -71,6 +70,15 @@
       <member cname="GMIME_FILTER_GZIP_MODE_ZIP" name="Zip" />
       <member cname="GMIME_FILTER_GZIP_MODE_UNZIP" name="Unzip" />
     </enum>
+    <enum name="PubKeyAlgo" cname="GMimePubKeyAlgo" type="enum">
+      <member cname="GMIME_PUBKEY_ALGO_DEFAULT" name="Default" />
+      <member cname="GMIME_PUBKEY_ALGO_RSA" name="Rsa" value="1" />
+      <member cname="GMIME_PUBKEY_ALGO_RSA_E" name="RsaE" value="2" />
+      <member cname="GMIME_PUBKEY_ALGO_RSA_S" name="RsaS" value="3" />
+      <member cname="GMIME_PUBKEY_ALGO_ELG_E" name="ElgE" value="16" />
+      <member cname="GMIME_PUBKEY_ALGO_DSA" name="Dsa" value="17" />
+      <member cname="GMIME_PUBKEY_ALGO_ELG" name="Elg" value="20" />
+    </enum>
     <enum name="RecipientType" cname="GMimeRecipientType" type="enum">
       <member cname="GMIME_RECIPIENT_TYPE_TO" name="To" />
       <member cname="GMIME_RECIPIENT_TYPE_CC" name="Cc" />
@@ -81,26 +89,18 @@
       <member cname="GMIME_STREAM_SEEK_CUR" name="Cur" value="SEEK_CUR" />
       <member cname="GMIME_STREAM_SEEK_END" name="End" value="SEEK_END" />
     </enum>
-    <enum name="SignerError" cname="GMimeSignerError" type="flags">
-      <member cname="GMIME_SIGNER_ERROR_NONE" name="None" />
-      <member cname="GMIME_SIGNER_ERROR_EXPSIG" name="Expsig" value="1 &lt;&lt; 0" />
-      <member cname="GMIME_SIGNER_ERROR_NO_PUBKEY" name="NoPubkey" value="1 &lt;&lt; 1" />
-      <member cname="GMIME_SIGNER_ERROR_EXPKEYSIG" name="Expkeysig" value="1 &lt;&lt; 2" />
-      <member cname="GMIME_SIGNER_ERROR_REVKEYSIG" name="Revkeysig" value="1 &lt;&lt; 3" />
-      <member cname="GMIME_SIGNER_ERROR_UNSUPP_ALGO" name="UnsuppAlgo" value="1 &lt;&lt; 4" />
-    </enum>
-    <enum name="SignerStatus" cname="GMimeSignerStatus" type="enum">
-      <member cname="GMIME_SIGNER_STATUS_GOOD" name="Good" />
-      <member cname="GMIME_SIGNER_STATUS_ERROR" name="Error" />
-      <member cname="GMIME_SIGNER_STATUS_BAD" name="Bad" />
+    <enum name="SignatureError" cname="GMimeSignatureError" type="flags">
+      <member cname="GMIME_SIGNATURE_ERROR_NONE" name="None" />
+      <member cname="GMIME_SIGNATURE_ERROR_EXPSIG" name="Expsig" value="1 &lt;&lt; 0" />
+      <member cname="GMIME_SIGNATURE_ERROR_NO_PUBKEY" name="NoPubkey" value="1 &lt;&lt; 1" />
+      <member cname="GMIME_SIGNATURE_ERROR_EXPKEYSIG" name="Expkeysig" value="1 &lt;&lt; 2" />
+      <member cname="GMIME_SIGNATURE_ERROR_REVKEYSIG" name="Revkeysig" value="1 &lt;&lt; 3" />
+      <member cname="GMIME_SIGNATURE_ERROR_UNSUPP_ALGO" name="UnsuppAlgo" value="1 &lt;&lt; 4" />
     </enum>
-    <enum name="SignerTrust" cname="GMimeSignerTrust" type="enum">
-      <member cname="GMIME_SIGNER_TRUST_NONE" name="None" />
-      <member cname="GMIME_SIGNER_TRUST_NEVER" name="Never" />
-      <member cname="GMIME_SIGNER_TRUST_UNDEFINED" name="Undefined" />
-      <member cname="GMIME_SIGNER_TRUST_MARGINAL" name="Marginal" />
-      <member cname="GMIME_SIGNER_TRUST_FULLY" name="Fully" />
-      <member cname="GMIME_SIGNER_TRUST_ULTIMATE" name="Ultimate" />
+    <enum name="SignatureStatus" cname="GMimeSignatureStatus" type="enum">
+      <member cname="GMIME_SIGNATURE_STATUS_GOOD" name="Good" />
+      <member cname="GMIME_SIGNATURE_STATUS_ERROR" name="Error" />
+      <member cname="GMIME_SIGNATURE_STATUS_BAD" name="Bad" />
     </enum>
     <enum name="StreamBufferMode" cname="GMimeStreamBufferMode" type="enum">
       <member cname="GMIME_STREAM_BUFFER_CACHE_READ" name="CacheRead" />
@@ -160,13 +160,192 @@
         <parameter type="GError**" name="err" />
       </parameters>
     </callback>
+    <object name="Certificate" cname="GMimeCertificate" parent="GObject">
+      <field name="PubkeyAlgo" cname="pubkey_algo" type="GMimePubKeyAlgo" />
+      <field name="DigestAlgo" cname="digest_algo" type="GMimeDigestAlgo" />
+      <field name="Trust" cname="trust" type="GMimeCertificateTrust" />
+      <field name="IssuerSerial" cname="issuer_serial" type="char*" />
+      <field name="IssuerName" cname="issuer_name" type="char*" />
+      <field name="Fingerprint" cname="fingerprint" type="char*" />
+      <field name="Created" cname="created" type="time_t" />
+      <field name="Expires" cname="expires" type="time_t" />
+      <field name="Keyid" cname="keyid" type="char*" />
+      <field name="Email" cname="email" type="char*" />
+      <field name="Name" cname="name" type="char*" />
+      <method name="GetCreated" cname="g_mime_certificate_get_created">
+        <return-type type="time_t" />
+      </method>
+      <method name="GetDigestAlgo" cname="g_mime_certificate_get_digest_algo">
+        <return-type type="GMimeDigestAlgo" />
+      </method>
+      <method name="GetEmail" cname="g_mime_certificate_get_email">
+        <return-type type="const-char*" />
+      </method>
+      <method name="GetExpires" cname="g_mime_certificate_get_expires">
+        <return-type type="time_t" />
+      </method>
+      <method name="GetFingerprint" cname="g_mime_certificate_get_fingerprint">
+        <return-type type="const-char*" />
+      </method>
+      <method name="GetIssuerName" cname="g_mime_certificate_get_issuer_name">
+        <return-type type="const-char*" />
+      </method>
+      <method name="GetIssuerSerial" cname="g_mime_certificate_get_issuer_serial">
+        <return-type type="const-char*" />
+      </method>
+      <method name="GetKeyId" cname="g_mime_certificate_get_key_id">
+        <return-type type="const-char*" />
+      </method>
+      <method name="GetName" cname="g_mime_certificate_get_name">
+        <return-type type="const-char*" />
+      </method>
+      <method name="GetPubkeyAlgo" cname="g_mime_certificate_get_pubkey_algo">
+        <return-type type="GMimePubKeyAlgo" />
+      </method>
+      <method name="GetTrust" cname="g_mime_certificate_get_trust">
+        <return-type type="GMimeCertificateTrust" />
+      </method>
+      <method name="GetType" cname="g_mime_certificate_get_type" shared="true">
+        <return-type type="GType" />
+      </method>
+      <constructor cname="g_mime_certificate_new" />
+      <method name="SetCreated" cname="g_mime_certificate_set_created">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="time_t" name="created" />
+        </parameters>
+      </method>
+      <method name="SetDigestAlgo" cname="g_mime_certificate_set_digest_algo">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeDigestAlgo" name="algo" />
+        </parameters>
+      </method>
+      <method name="SetEmail" cname="g_mime_certificate_set_email">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="const-char*" name="email" />
+        </parameters>
+      </method>
+      <method name="SetExpires" cname="g_mime_certificate_set_expires">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="time_t" name="expires" />
+        </parameters>
+      </method>
+      <method name="SetFingerprint" cname="g_mime_certificate_set_fingerprint">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="const-char*" name="fingerprint" />
+        </parameters>
+      </method>
+      <method name="SetIssuerName" cname="g_mime_certificate_set_issuer_name">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="const-char*" name="issuer_name" />
+        </parameters>
+      </method>
+      <method name="SetIssuerSerial" cname="g_mime_certificate_set_issuer_serial">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="const-char*" name="issuer_serial" />
+        </parameters>
+      </method>
+      <method name="SetKeyId" cname="g_mime_certificate_set_key_id">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="const-char*" name="key_id" />
+        </parameters>
+      </method>
+      <method name="SetName" cname="g_mime_certificate_set_name">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="const-char*" name="name" />
+        </parameters>
+      </method>
+      <method name="SetPubkeyAlgo" cname="g_mime_certificate_set_pubkey_algo">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimePubKeyAlgo" name="algo" />
+        </parameters>
+      </method>
+      <method name="SetTrust" cname="g_mime_certificate_set_trust">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeCertificateTrust" name="trust" />
+        </parameters>
+      </method>
+    </object>
+    <object name="CertificateList" cname="GMimeCertificateList" parent="GObject">
+      <field name="Array" cname="array" type="GPtrArray*" />
+      <method name="Add" cname="g_mime_certificate_list_add">
+        <return-type type="int" />
+        <parameters>
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+      <method name="Clear" cname="g_mime_certificate_list_clear">
+        <return-type type="void" />
+      </method>
+      <method name="Contains" cname="g_mime_certificate_list_contains">
+        <return-type type="gboolean" />
+        <parameters>
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+      <method name="GetCertificate" cname="g_mime_certificate_list_get_certificate">
+        <return-type type="GMimeCertificate*" />
+        <parameters>
+          <parameter type="int" name="index" />
+        </parameters>
+      </method>
+      <method name="GetType" cname="g_mime_certificate_list_get_type" shared="true">
+        <return-type type="GType" />
+      </method>
+      <method name="IndexOf" cname="g_mime_certificate_list_index_of">
+        <return-type type="int" />
+        <parameters>
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+      <method name="Insert" cname="g_mime_certificate_list_insert">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="int" name="index" />
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+      <method name="Length" cname="g_mime_certificate_list_length">
+        <return-type type="int" />
+      </method>
+      <constructor cname="g_mime_certificate_list_new" />
+      <method name="Remove" cname="g_mime_certificate_list_remove">
+        <return-type type="gboolean" />
+        <parameters>
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+      <method name="RemoveAt" cname="g_mime_certificate_list_remove_at">
+        <return-type type="gboolean" />
+        <parameters>
+          <parameter type="int" name="index" />
+        </parameters>
+      </method>
+      <method name="SetCertificate" cname="g_mime_certificate_list_set_certificate">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="int" name="index" />
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+    </object>
     <object name="CryptoContext" cname="GMimeCryptoContext" parent="GObject">
       <field name="RequestPasswd" cname="request_passwd" type="GMimePasswordRequestFunc" />
-      <virtual_method name="HashId" cname="hash_id">
-        <return-type type="GMimeCryptoHash" />
+      <virtual_method name="DigestId" cname="digest_id">
+        <return-type type="GMimeDigestAlgo" />
         <parameters>
           <parameter type="GMimeCryptoContext*" name="ctx" />
-          <parameter type="const-char*" name="hash" />
+          <parameter type="const-char*" name="name" />
         </parameters>
       </virtual_method>
       <virtual_method name="Sign" cname="sign">
@@ -174,17 +353,17 @@
         <parameters>
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="const-char*" name="userid" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
           <parameter type="GError**" name="err" />
         </parameters>
       </virtual_method>
       <virtual_method name="Verify" cname="verify">
-        <return-type type="GMimeSignatureValidity*" />
+        <return-type type="GMimeSignatureList*" />
         <parameters>
           <parameter type="GMimeCryptoContext*" name="ctx" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="sigstream" />
           <parameter type="GError**" name="err" />
@@ -196,7 +375,7 @@
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="gboolean" name="sign" />
           <parameter type="const-char*" name="userid" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GPtrArray*" name="recipients" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
@@ -204,7 +383,7 @@
         </parameters>
       </virtual_method>
       <virtual_method name="Decrypt" cname="decrypt">
-        <return-type type="GMimeDecryptionResult*" />
+        <return-type type="GMimeDecryptResult*" />
         <parameters>
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="GMimeStream*" name="istream" />
@@ -230,19 +409,31 @@
         </parameters>
       </virtual_method>
       <method name="Decrypt" cname="g_mime_crypto_context_decrypt">
-        <return-type type="GMimeDecryptionResult*" />
+        <return-type type="GMimeDecryptResult*" />
         <parameters>
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
           <parameter type="GError**" name="err" />
         </parameters>
       </method>
+      <method name="DigestId" cname="g_mime_crypto_context_digest_id">
+        <return-type type="GMimeDigestAlgo" />
+        <parameters>
+          <parameter type="const-char*" name="name" />
+        </parameters>
+      </method>
+      <method name="DigestName" cname="g_mime_crypto_context_digest_name">
+        <return-type type="const-char*" />
+        <parameters>
+          <parameter type="GMimeDigestAlgo" name="digest" />
+        </parameters>
+      </method>
       <method name="Encrypt" cname="g_mime_crypto_context_encrypt">
         <return-type type="int" />
         <parameters>
           <parameter type="gboolean" name="sign" />
           <parameter type="const-char*" name="userid" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GPtrArray*" name="recipients" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
@@ -269,18 +460,6 @@
       <method name="GetType" cname="g_mime_crypto_context_get_type" shared="true">
         <return-type type="GType" />
       </method>
-      <method name="HashId" cname="g_mime_crypto_context_hash_id">
-        <return-type type="GMimeCryptoHash" />
-        <parameters>
-          <parameter type="const-char*" name="hash" />
-        </parameters>
-      </method>
-      <method name="HashName" cname="g_mime_crypto_context_hash_name">
-        <return-type type="const-char*" />
-        <parameters>
-          <parameter type="GMimeCryptoHash" name="hash" />
-        </parameters>
-      </method>
       <method name="ImportKeys" cname="g_mime_crypto_context_import_keys">
         <return-type type="int" />
         <parameters>
@@ -298,16 +477,16 @@
         <return-type type="int" />
         <parameters>
           <parameter type="const-char*" name="userid" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="ostream" />
           <parameter type="GError**" name="err" />
         </parameters>
       </method>
       <method name="Verify" cname="g_mime_crypto_context_verify">
-        <return-type type="GMimeSignatureValidity*" />
+        <return-type type="GMimeSignatureList*" />
         <parameters>
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GMimeStream*" name="istream" />
           <parameter type="GMimeStream*" name="sigstream" />
           <parameter type="GError**" name="err" />
@@ -359,6 +538,52 @@
         </parameters>
       </method>
     </object>
+    <object name="DecryptResult" cname="GMimeDecryptResult" parent="GObject">
+      <field name="Recipients" cname="recipients" type="GMimeCertificateList*" />
+      <field name="Signatures" cname="signatures" type="GMimeSignatureList*" />
+      <field name="Cipher" cname="cipher" type="GMimeCipherAlgo" />
+      <field name="Mdc" cname="mdc" type="GMimeDigestAlgo" />
+      <method name="GetCipher" cname="g_mime_decrypt_result_get_cipher">
+        <return-type type="GMimeCipherAlgo" />
+      </method>
+      <method name="GetMdc" cname="g_mime_decrypt_result_get_mdc">
+        <return-type type="GMimeDigestAlgo" />
+      </method>
+      <method name="GetRecipients" cname="g_mime_decrypt_result_get_recipients">
+        <return-type type="GMimeCertificateList*" />
+      </method>
+      <method name="GetSignatures" cname="g_mime_decrypt_result_get_signatures">
+        <return-type type="GMimeSignatureList*" />
+      </method>
+      <method name="GetType" cname="g_mime_decrypt_result_get_type" shared="true">
+        <return-type type="GType" />
+      </method>
+      <constructor cname="g_mime_decrypt_result_new" />
+      <method name="SetCipher" cname="g_mime_decrypt_result_set_cipher">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeCipherAlgo" name="cipher" />
+        </parameters>
+      </method>
+      <method name="SetMdc" cname="g_mime_decrypt_result_set_mdc">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeDigestAlgo" name="mdc" />
+        </parameters>
+      </method>
+      <method name="SetRecipients" cname="g_mime_decrypt_result_set_recipients">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeCertificateList*" name="recipients" />
+        </parameters>
+      </method>
+      <method name="SetSignatures" cname="g_mime_decrypt_result_set_signatures">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeSignatureList*" name="signatures" />
+        </parameters>
+      </method>
+    </object>
     <object name="Filter" cname="GMimeFilter" parent="GObject">
       <field name="Priv" cname="priv" type="struct-_GMimeFilterPrivate*" />
       <field name="Outreal" cname="outreal" type="char*" />
@@ -1035,7 +1260,7 @@
         <return-type type="GMimeObject*" />
         <parameters>
           <parameter type="GMimeCryptoContext*" name="ctx" />
-          <parameter type="GMimeDecryptionResult**" name="result" />
+          <parameter type="GMimeDecryptResult**" name="result" />
           <parameter type="GError**" name="err" />
         </parameters>
       </method>
@@ -1046,7 +1271,7 @@
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="gboolean" name="sign" />
           <parameter type="const-char*" name="userid" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GPtrArray*" name="recipients" />
           <parameter type="GError**" name="err" />
         </parameters>
@@ -1067,12 +1292,12 @@
           <parameter type="GMimeObject*" name="content" />
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="const-char*" name="userid" />
-          <parameter type="GMimeCryptoHash" name="hash" />
+          <parameter type="GMimeDigestAlgo" name="digest" />
           <parameter type="GError**" name="err" />
         </parameters>
       </method>
       <method name="Verify" cname="g_mime_multipart_signed_verify">
-        <return-type type="GMimeSignatureValidity*" />
+        <return-type type="GMimeSignatureList*" />
         <parameters>
           <parameter type="GMimeCryptoContext*" name="ctx" />
           <parameter type="GError**" name="err" />
@@ -1474,6 +1699,125 @@
         </parameters>
       </method>
     </object>
+    <object name="Signature" cname="GMimeSignature" parent="GObject">
+      <field name="Status" cname="status" type="GMimeSignatureStatus" />
+      <field name="Errors" cname="errors" type="GMimeSignatureError" />
+      <field name="Cert" cname="cert" type="GMimeCertificate*" />
+      <field name="Created" cname="created" type="time_t" />
+      <field name="Expires" cname="expires" type="time_t" />
+      <method name="GetCertificate" cname="g_mime_signature_get_certificate">
+        <return-type type="GMimeCertificate*" />
+      </method>
+      <method name="GetCreated" cname="g_mime_signature_get_created">
+        <return-type type="time_t" />
+      </method>
+      <method name="GetErrors" cname="g_mime_signature_get_errors">
+        <return-type type="GMimeSignatureError" />
+      </method>
+      <method name="GetExpires" cname="g_mime_signature_get_expires">
+        <return-type type="time_t" />
+      </method>
+      <method name="GetStatus" cname="g_mime_signature_get_status">
+        <return-type type="GMimeSignatureStatus" />
+      </method>
+      <method name="GetType" cname="g_mime_signature_get_type" shared="true">
+        <return-type type="GType" />
+      </method>
+      <constructor cname="g_mime_signature_new" />
+      <method name="SetCertificate" cname="g_mime_signature_set_certificate">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeCertificate*" name="cert" />
+        </parameters>
+      </method>
+      <method name="SetCreated" cname="g_mime_signature_set_created">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="time_t" name="created" />
+        </parameters>
+      </method>
+      <method name="SetErrors" cname="g_mime_signature_set_errors">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeSignatureError" name="errors" />
+        </parameters>
+      </method>
+      <method name="SetExpires" cname="g_mime_signature_set_expires">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="time_t" name="expires" />
+        </parameters>
+      </method>
+      <method name="SetStatus" cname="g_mime_signature_set_status">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="GMimeSignatureStatus" name="status" />
+        </parameters>
+      </method>
+    </object>
+    <object name="SignatureList" cname="GMimeSignatureList" parent="GObject">
+      <field name="Array" cname="array" type="GPtrArray*" />
+      <method name="Add" cname="g_mime_signature_list_add">
+        <return-type type="int" />
+        <parameters>
+          <parameter type="GMimeSignature*" name="sig" />
+        </parameters>
+      </method>
+      <method name="Clear" cname="g_mime_signature_list_clear">
+        <return-type type="void" />
+      </method>
+      <method name="Contains" cname="g_mime_signature_list_contains">
+        <return-type type="gboolean" />
+        <parameters>
+          <parameter type="GMimeSignature*" name="sig" />
+        </parameters>
+      </method>
+      <method name="GetSignature" cname="g_mime_signature_list_get_signature">
+        <return-type type="GMimeSignature*" />
+        <parameters>
+          <parameter type="int" name="index" />
+        </parameters>
+      </method>
+      <method name="GetType" cname="g_mime_signature_list_get_type" shared="true">
+        <return-type type="GType" />
+      </method>
+      <method name="IndexOf" cname="g_mime_signature_list_index_of">
+        <return-type type="int" />
+        <parameters>
+          <parameter type="GMimeSignature*" name="sig" />
+        </parameters>
+      </method>
+      <method name="Insert" cname="g_mime_signature_list_insert">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="int" name="index" />
+          <parameter type="GMimeSignature*" name="sig" />
+        </parameters>
+      </method>
+      <method name="Length" cname="g_mime_signature_list_length">
+        <return-type type="int" />
+      </method>
+      <constructor cname="g_mime_signature_list_new" />
+      <method name="Remove" cname="g_mime_signature_list_remove">
+        <return-type type="gboolean" />
+        <parameters>
+          <parameter type="GMimeSignature*" name="sig" />
+        </parameters>
+      </method>
+      <method name="RemoveAt" cname="g_mime_signature_list_remove_at">
+        <return-type type="gboolean" />
+        <parameters>
+          <parameter type="int" name="index" />
+        </parameters>
+      </method>
+      <method name="SetSignature" cname="g_mime_signature_list_set_signature">
+        <return-type type="void" />
+        <parameters>
+          <parameter type="int" name="index" />
+          <parameter type="GMimeSignature*" name="sig" />
+        </parameters>
+      </method>
+    </object>
     <object name="Stream" cname="GMimeStream" parent="GObject">
       <field name="SuperStream" cname="super_stream" type="GMimeStream*" />
       <field name="Position" cname="position" type="gint64" />
@@ -2252,82 +2596,6 @@
         </parameters>
       </method>
     </struct>
-    <struct name="CryptoRecipient" cname="GMimeCryptoRecipient" opaque="true">
-      <field name="Next" cname="next" type="GMimeCryptoRecipient*" access="public" writeable="true" />
-      <field name="PubkeyAlgo" cname="pubkey_algo" type="GMimeCryptoPubKeyAlgo" access="public" writeable="true" />
-      <field name="Keyid" cname="keyid" type="char*" access="public" writeable="true" />
-      <method name="Free" cname="g_mime_crypto_recipient_free">
-        <return-type type="void" />
-      </method>
-      <method name="GetKeyId" cname="g_mime_crypto_recipient_get_key_id">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetPubkeyAlgo" cname="g_mime_crypto_recipient_get_pubkey_algo">
-        <return-type type="GMimeCryptoPubKeyAlgo" />
-      </method>
-      <constructor cname="g_mime_crypto_recipient_new" />
-      <method name="Next" cname="g_mime_crypto_recipient_next">
-        <return-type type="const-GMimeCryptoRecipient*" />
-      </method>
-      <method name="SetKeyId" cname="g_mime_crypto_recipient_set_key_id">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="key_id" />
-        </parameters>
-      </method>
-      <method name="SetPubkeyAlgo" cname="g_mime_crypto_recipient_set_pubkey_algo">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeCryptoPubKeyAlgo" name="pubkey_algo" />
-        </parameters>
-      </method>
-    </struct>
-    <struct name="DecryptionResult" cname="GMimeDecryptionResult" opaque="true">
-      <field name="Validity" cname="validity" type="GMimeSignatureValidity*" access="public" writeable="true" />
-      <field name="Recipients" cname="recipients" type="GMimeCryptoRecipient*" access="public" writeable="true" />
-      <field name="Cipher" cname="cipher" type="GMimeCryptoCipherAlgo" access="public" writeable="true" />
-      <field name="Mdc" cname="mdc" type="GMimeCryptoHash" access="public" writeable="true" />
-      <method name="AddRecipient" cname="g_mime_decryption_result_add_recipient">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeCryptoRecipient*" name="recipient" />
-        </parameters>
-      </method>
-      <method name="Free" cname="g_mime_decryption_result_free">
-        <return-type type="void" />
-      </method>
-      <method name="GetCipher" cname="g_mime_decryption_result_get_cipher">
-        <return-type type="GMimeCryptoCipherAlgo" />
-      </method>
-      <method name="GetMdc" cname="g_mime_decryption_result_get_mdc">
-        <return-type type="GMimeCryptoHash" />
-      </method>
-      <method name="GetRecipients" cname="g_mime_decryption_result_get_recipients">
-        <return-type type="const-GMimeCryptoRecipient*" />
-      </method>
-      <method name="GetValidity" cname="g_mime_decryption_result_get_validity">
-        <return-type type="const-GMimeSignatureValidity*" />
-      </method>
-      <constructor cname="g_mime_decryption_result_new" />
-      <method name="SetCipher" cname="g_mime_decryption_result_set_cipher">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeCryptoCipherAlgo" name="cipher" />
-        </parameters>
-      </method>
-      <method name="SetMdc" cname="g_mime_decryption_result_set_mdc">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeCryptoHash" name="mdc" />
-        </parameters>
-      </method>
-      <method name="SetValidity" cname="g_mime_decryption_result_set_validity">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeSignatureValidity*" name="validity" />
-        </parameters>
-      </method>
-    </struct>
     <struct name="Encoding" cname="GMimeEncoding" opaque="true">
       <method name="Base64DecodeStep" cname="g_mime_encoding_base64_decode_step" shared="true">
         <return-type type="size_t" />
@@ -2668,217 +2936,6 @@
         <return-type type="const-GMimeReferences*" />
       </method>
     </struct>
-    <struct name="SignatureValidity" cname="GMimeSignatureValidity" opaque="true">
-      <field name="Signers" cname="signers" type="GMimeSigner*" access="public" writeable="true" />
-      <field name="Details" cname="details" type="char*" access="public" writeable="true" />
-      <method name="AddSigner" cname="g_mime_signature_validity_add_signer">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeSigner*" name="signer" />
-        </parameters>
-      </method>
-      <method name="Free" cname="g_mime_signature_validity_free">
-        <return-type type="void" />
-      </method>
-      <method name="GetDetails" cname="g_mime_signature_validity_get_details">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetSigners" cname="g_mime_signature_validity_get_signers">
-        <return-type type="const-GMimeSigner*" />
-      </method>
-      <constructor cname="g_mime_signature_validity_new" />
-      <method name="SetDetails" cname="g_mime_signature_validity_set_details">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="details" />
-        </parameters>
-      </method>
-    </struct>
-    <struct name="Signer" cname="GMimeSigner" opaque="true">
-      <field name="Next" cname="next" type="GMimeSigner*" access="public" writeable="true" />
-      <field name="Status" cname="status" bits="2" type="unsigned int" access="public" writeable="true" />
-      <field name="Errors" cname="errors" bits="6" type="unsigned int" access="public" writeable="true" />
-      <field name="Trust" cname="trust" bits="3" type="unsigned int" access="public" writeable="true" />
-      <field name="Unused" cname="unused" bits="5" type="unsigned int" access="public" writeable="true" />
-      <field name="SigClass" cname="sig_class" bits="8" type="unsigned int" access="public" writeable="true" />
-      <field name="SigVer" cname="sig_ver" bits="8" type="unsigned int" access="public" writeable="true" />
-      <field name="PubkeyAlgo" cname="pubkey_algo" type="GMimeCryptoPubKeyAlgo" access="public" writeable="true" />
-      <field name="HashAlgo" cname="hash_algo" type="GMimeCryptoHash" access="public" writeable="true" />
-      <field name="IssuerSerial" cname="issuer_serial" type="char*" access="public" writeable="true" />
-      <field name="IssuerName" cname="issuer_name" type="char*" access="public" writeable="true" />
-      <field name="Fingerprint" cname="fingerprint" type="char*" access="public" writeable="true" />
-      <field name="SigCreated" cname="sig_created" type="time_t" access="public" writeable="true" />
-      <field name="SigExpires" cname="sig_expires" type="time_t" access="public" writeable="true" />
-      <field name="KeyCreated" cname="key_created" type="time_t" access="public" writeable="true" />
-      <field name="KeyExpires" cname="key_expires" type="time_t" access="public" writeable="true" />
-      <field name="Keyid" cname="keyid" type="char*" access="public" writeable="true" />
-      <field name="Email" cname="email" type="char*" access="public" writeable="true" />
-      <field name="Name" cname="name" type="char*" access="public" writeable="true" />
-      <method name="Free" cname="g_mime_signer_free">
-        <return-type type="void" />
-      </method>
-      <method name="GetEmail" cname="g_mime_signer_get_email">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetErrors" cname="g_mime_signer_get_errors">
-        <return-type type="GMimeSignerError" />
-      </method>
-      <method name="GetFingerprint" cname="g_mime_signer_get_fingerprint">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetHashAlgo" cname="g_mime_signer_get_hash_algo">
-        <return-type type="GMimeCryptoHash" />
-      </method>
-      <method name="GetIssuerName" cname="g_mime_signer_get_issuer_name">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetIssuerSerial" cname="g_mime_signer_get_issuer_serial">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetKeyCreated" cname="g_mime_signer_get_key_created">
-        <return-type type="time_t" />
-      </method>
-      <method name="GetKeyExpires" cname="g_mime_signer_get_key_expires">
-        <return-type type="time_t" />
-      </method>
-      <method name="GetKeyId" cname="g_mime_signer_get_key_id">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetName" cname="g_mime_signer_get_name">
-        <return-type type="const-char*" />
-      </method>
-      <method name="GetPubkeyAlgo" cname="g_mime_signer_get_pubkey_algo">
-        <return-type type="GMimeCryptoPubKeyAlgo" />
-      </method>
-      <method name="GetSigClass" cname="g_mime_signer_get_sig_class">
-        <return-type type="int" />
-      </method>
-      <method name="GetSigCreated" cname="g_mime_signer_get_sig_created">
-        <return-type type="time_t" />
-      </method>
-      <method name="GetSigExpires" cname="g_mime_signer_get_sig_expires">
-        <return-type type="time_t" />
-      </method>
-      <method name="GetSigVersion" cname="g_mime_signer_get_sig_version">
-        <return-type type="int" />
-      </method>
-      <method name="GetStatus" cname="g_mime_signer_get_status">
-        <return-type type="GMimeSignerStatus" />
-      </method>
-      <method name="GetTrust" cname="g_mime_signer_get_trust">
-        <return-type type="GMimeSignerTrust" />
-      </method>
-      <constructor cname="g_mime_signer_new">
-        <parameters>
-          <parameter type="GMimeSignerStatus" name="status" />
-        </parameters>
-      </constructor>
-      <method name="Next" cname="g_mime_signer_next">
-        <return-type type="const-GMimeSigner*" />
-      </method>
-      <method name="SetEmail" cname="g_mime_signer_set_email">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="email" />
-        </parameters>
-      </method>
-      <method name="SetErrors" cname="g_mime_signer_set_errors">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeSignerError" name="error" />
-        </parameters>
-      </method>
-      <method name="SetFingerprint" cname="g_mime_signer_set_fingerprint">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="fingerprint" />
-        </parameters>
-      </method>
-      <method name="SetHashAlgo" cname="g_mime_signer_set_hash_algo">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeCryptoHash" name="hash" />
-        </parameters>
-      </method>
-      <method name="SetIssuerName" cname="g_mime_signer_set_issuer_name">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="issuer_name" />
-        </parameters>
-      </method>
-      <method name="SetIssuerSerial" cname="g_mime_signer_set_issuer_serial">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="issuer_serial" />
-        </parameters>
-      </method>
-      <method name="SetKeyCreated" cname="g_mime_signer_set_key_created">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="time_t" name="created" />
-        </parameters>
-      </method>
-      <method name="SetKeyExpires" cname="g_mime_signer_set_key_expires">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="time_t" name="expires" />
-        </parameters>
-      </method>
-      <method name="SetKeyId" cname="g_mime_signer_set_key_id">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="key_id" />
-        </parameters>
-      </method>
-      <method name="SetName" cname="g_mime_signer_set_name">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="const-char*" name="name" />
-        </parameters>
-      </method>
-      <method name="SetPubkeyAlgo" cname="g_mime_signer_set_pubkey_algo">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeCryptoPubKeyAlgo" name="pubkey_algo" />
-        </parameters>
-      </method>
-      <method name="SetSigClass" cname="g_mime_signer_set_sig_class">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="int" name="sig_class" />
-        </parameters>
-      </method>
-      <method name="SetSigCreated" cname="g_mime_signer_set_sig_created">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="time_t" name="created" />
-        </parameters>
-      </method>
-      <method name="SetSigExpires" cname="g_mime_signer_set_sig_expires">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="time_t" name="expires" />
-        </parameters>
-      </method>
-      <method name="SetSigVersion" cname="g_mime_signer_set_sig_version">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="int" name="version" />
-        </parameters>
-      </method>
-      <method name="SetStatus" cname="g_mime_signer_set_status">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeSignerStatus" name="status" />
-        </parameters>
-      </method>
-      <method name="SetTrust" cname="g_mime_signer_set_trust">
-        <return-type type="void" />
-        <parameters>
-          <parameter type="GMimeSignerTrust" name="trust" />
-        </parameters>
-      </method>
-    </struct>
     <struct name="StreamIOVector" cname="GMimeStreamIOVector">
       <field name="Data" cname="data" type="void*" />
       <field name="Len" cname="len" type="size_t" />
diff --git a/tests/test-pgp.c b/tests/test-pgp.c
index af8a416..106b3ea 100644
--- a/tests/test-pgp.c
+++ b/tests/test-pgp.c
@@ -46,18 +46,19 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
-static GMimeSignerStatus
-get_sig_status (GMimeSigner *signers)
+static GMimeSignatureStatus
+get_sig_status (GMimeSignatureList *signatures)
 {
-	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
-	GMimeSigner *signer = signers;
+	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+	GMimeSignature *sig;
+	int i;
 	
-	if (signers == NULL)
-		return GMIME_SIGNER_STATUS_ERROR;
+	if (!signatures || signatures->array->len == 0)
+		return GMIME_SIGNATURE_STATUS_ERROR;
 	
-	while (signer != NULL) {
-		status = MAX (status, signer->status);
-		signer = signer->next;
+	for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		status = MAX (status, sig->status);
 	}
 	
 	return status;
@@ -71,7 +72,7 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
 	int rv;
 	
 	rv = g_mime_crypto_context_sign (ctx, "no user no domain",
-					 GMIME_CRYPTO_HASH_SHA256,
+					 GMIME_DIGEST_ALGO_SHA256,
 					 cleartext, ciphertext, &err);
 	
 	if (rv == -1 || err != NULL) {
@@ -81,7 +82,7 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
 	}
 	
 	v(fprintf (stderr, "signature (%s):\n%.*s\n",
-		   g_mime_crypto_context_hash_name (ctx, rv),
+		   g_mime_crypto_context_digest_name (ctx, rv),
 		   GMIME_STREAM_MEM (ciphertext)->buffer->len,
 		   GMIME_STREAM_MEM (ciphertext)->buffer->data));
 }
@@ -89,25 +90,25 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
 static void
 test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
-	GMimeSignatureValidity *validity;
+	GMimeSignatureList *signatures;
 	GError *err = NULL;
 	Exception *ex;
 	
-	validity = g_mime_crypto_context_verify (ctx, GMIME_CRYPTO_HASH_DEFAULT,
-						 cleartext, ciphertext, &err);
+	signatures = g_mime_crypto_context_verify (ctx, GMIME_DIGEST_ALGO_DEFAULT,
+						   cleartext, ciphertext, &err);
 	
-	if (validity == NULL) {
+	if (signatures == NULL) {
 		ex = exception_new ("%s", err->message);
 		g_error_free (err);
 		throw (ex);
 	}
 	
-	if (get_sig_status (validity->signers) != GMIME_SIGNER_STATUS_GOOD) {
-		g_mime_signature_validity_free (validity);
+	if (get_sig_status (signatures) != GMIME_SIGNATURE_STATUS_GOOD) {
+		g_object_unref (signatures);
 		throw (exception_new ("signature BAD"));
 	}
 	
-	g_mime_signature_validity_free (validity);
+	g_object_unref (signatures);
 }
 
 static void
@@ -120,7 +121,7 @@ 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", GMIME_CRYPTO_HASH_SHA256,
+	g_mime_crypto_context_encrypt (ctx, sign, "no user no domain", GMIME_DIGEST_ALGO_SHA256,
 				       recipients, cleartext, ciphertext, &err);
 	
 	g_ptr_array_free (recipients, TRUE);
@@ -139,7 +140,7 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 static void
 test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
-	GMimeDecryptionResult *result;
+	GMimeDecryptResult *result;
 	Exception *ex = NULL;
 	GMimeStream *stream;
 	GError *err = NULL;
@@ -155,14 +156,14 @@ test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	}
 	
 	if (sign) {
-		if (!result->validity || get_sig_status (result->validity->signers) != GMIME_SIGNER_STATUS_GOOD)
+		if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
 			ex = exception_new ("expected GOOD signature");
 	} else {
-		if (result->validity && result->validity->signers != NULL)
+		if (result->signatures != NULL)
 			ex = exception_new ("unexpected signature");
 	}
 	
-	g_mime_decryption_result_free (result);
+	g_object_unref (result);
 	
 	if (ex != NULL) {
 		g_object_unref (stream);
diff --git a/tests/test-pgpmime.c b/tests/test-pgpmime.c
index b8bcf27..1faa592 100644
--- a/tests/test-pgpmime.c
+++ b/tests/test-pgpmime.c
@@ -47,36 +47,38 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
-static GMimeSignerStatus
-get_sig_status (GMimeSigner *signers)
+static GMimeSignatureStatus
+get_sig_status (GMimeSignatureList *signatures)
 {
-	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
-	GMimeSigner *signer = signers;
+	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+	GMimeSignature *sig;
+	int i;
 	
-	if (signers == NULL)
-		return GMIME_SIGNER_STATUS_ERROR;
+	if (!signatures || signatures->array->len == 0)
+		return GMIME_SIGNATURE_STATUS_ERROR;
 	
-	while (signer != NULL) {
-		status = MAX (status, signer->status);
-		signer = signer->next;
+	for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		status = MAX (status, sig->status);
 	}
 	
 	return status;
 }
 
 static void
-print_verify_results (const GMimeSignatureValidity *validity)
+print_verify_results (GMimeSignatureList *signatures)
 {
-	GMimeSigner *signer;
+	GMimeSignature *sig;
+	int count, i;
 	
-	switch (get_sig_status (validity->signers)) {
-	case GMIME_SIGNER_STATUS_GOOD:
+	switch (get_sig_status (signatures)) {
+	case GMIME_SIGNATURE_STATUS_GOOD:
 		fputs ("GOOD\n", stdout);
 		break;
-	case GMIME_SIGNER_STATUS_BAD:
+	case GMIME_SIGNATURE_STATUS_BAD:
 		fputs ("BAD\n", stdout);
 		break;
-	case GMIME_SIGNER_STATUS_ERROR:
+	case GMIME_SIGNATURE_STATUS_ERROR:
 		fputs ("ERROR status\n", stdout);
 		break;
 	default:
@@ -84,75 +86,74 @@ print_verify_results (const GMimeSignatureValidity *validity)
 		break;
 	}
 	
-	fputs ("\nSigners:\n", stdout);
-	signer = validity->signers;
-	while (signer != NULL) {
-		fprintf (stdout, "\tName: %s\n", signer->name ? signer->name : "(null)");
-		fprintf (stdout, "\tKeyId: %s\n", signer->keyid ? signer->keyid : "(null)");
-		fprintf (stdout, "\tFingerprint: %s\n", signer->fingerprint ? signer->fingerprint : "(null)");
+	fputs ("\nSignatures:\n", stdout);
+	count = g_mime_signature_list_length (signatures);
+	for (i = 0; i < count; i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		
+		fprintf (stdout, "\tName: %s\n", sig->cert->name ? sig->cert->name : "(null)");
+		fprintf (stdout, "\tKeyId: %s\n", sig->cert->keyid ? sig->cert->keyid : "(null)");
+		fprintf (stdout, "\tFingerprint: %s\n", sig->cert->fingerprint ? sig->cert->fingerprint : "(null)");
 		fprintf (stdout, "\tTrust: ");
 		
-		switch (signer->trust) {
-		case GMIME_SIGNER_TRUST_NONE:
+		switch (sig->cert->trust) {
+		case GMIME_CERTIFICATE_TRUST_NONE:
 			fputs ("None\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_NEVER:
+		case GMIME_CERTIFICATE_TRUST_NEVER:
 			fputs ("Never\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_UNDEFINED:
+		case GMIME_CERTIFICATE_TRUST_UNDEFINED:
 			fputs ("Undefined\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_MARGINAL:
+		case GMIME_CERTIFICATE_TRUST_MARGINAL:
 			fputs ("Marginal\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_FULLY:
+		case GMIME_CERTIFICATE_TRUST_FULLY:
 			fputs ("Fully\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_ULTIMATE:
+		case GMIME_CERTIFICATE_TRUST_ULTIMATE:
 			fputs ("Ultimate\n", stdout);
 			break;
 		}
 		
 		fprintf (stdout, "\tStatus: ");
-		switch (signer->status) {
-		case GMIME_SIGNER_STATUS_GOOD:
+		switch (sig->status) {
+		case GMIME_SIGNATURE_STATUS_GOOD:
 			fputs ("GOOD\n", stdout);
 			break;
-		case GMIME_SIGNER_STATUS_BAD:
+		case GMIME_SIGNATURE_STATUS_BAD:
 			fputs ("BAD\n", stdout);
 			break;
-		case GMIME_SIGNER_STATUS_ERROR:
+		case GMIME_SIGNATURE_STATUS_ERROR:
 			fputs ("ERROR\n", stdout);
 			break;
 		}
 		
-		fprintf (stdout, "\tSignature made on %s", ctime (&signer->sig_created));
-		if (signer->sig_expires != (time_t) 0)
-			fprintf (stdout, "\tSignature expires on %s", ctime (&signer->sig_expires));
+		fprintf (stdout, "\tSignature made on %s", ctime (&sig->created));
+		if (sig->expires != (time_t) 0)
+			fprintf (stdout, "\tSignature expires on %s", ctime (&sig->expires));
 		else
 			fprintf (stdout, "\tSignature never expires\n");
 		
-		if (signer->errors) {
+		if (sig->errors) {
 			fprintf (stdout, "\tErrors: ");
-			if (signer->errors & GMIME_SIGNER_ERROR_EXPSIG)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG)
 				fputs ("Expired, ", stdout);
-			if (signer->errors & GMIME_SIGNER_ERROR_NO_PUBKEY)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY)
 				fputs ("No Pub Key, ", stdout);
-			if (signer->errors & GMIME_SIGNER_ERROR_EXPKEYSIG)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG)
 				fputs ("Key Expired, ", stdout);
-			if (signer->errors & GMIME_SIGNER_ERROR_REVKEYSIG)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG)
 				fputs ("Key Revoked", stdout);
 			fputc ('\n', stdout);
 		} else {
 			fprintf (stdout, "\tNo errors for this signer\n");
 		}
 		
-		if ((signer = signer->next))
+		if (i + 1 < count)
 			fputc ('\n', stdout);
 	}
-	
-	fprintf (stdout, "\nValidity diagnostics: \n%s\n",
-		 g_mime_signature_validity_get_details (validity));
 }
 
 #define MULTIPART_SIGNED_CONTENT "This is a test of the emergency broadcast system \
@@ -165,7 +166,7 @@ then we have ourselves a winner I guess...\n"
 static void
 test_multipart_signed (GMimeCryptoContext *ctx)
 {
-	GMimeSignatureValidity *validity;
+	GMimeSignatureList *signatures;
 	GMimeMultipartSigned *mps;
 	GMimeDataWrapper *content;
 	GMimeMessage *message;
@@ -200,7 +201,7 @@ test_multipart_signed (GMimeCryptoContext *ctx)
 	
 	/* sign the part */
 	g_mime_multipart_signed_sign (mps, GMIME_OBJECT (part), ctx, "no user no domain",
-				      GMIME_CRYPTO_HASH_SHA1, &err);
+				      GMIME_DIGEST_ALGO_SHA1, &err);
 	g_object_unref (part);
 	
 	if (err != NULL) {
@@ -242,15 +243,15 @@ test_multipart_signed (GMimeCryptoContext *ctx)
 	mps = (GMimeMultipartSigned *) message->mime_part;
 	
 	v(fputs ("Trying to verify signature... ", stdout));
-	if (!(validity = g_mime_multipart_signed_verify (mps, ctx, &err))) {
+	if (!(signatures = g_mime_multipart_signed_verify (mps, ctx, &err))) {
 		ex = exception_new ("%s", err->message);
 		v(fputs ("failed.\n", stdout));
 		g_error_free (err);
 		throw (ex);
 	}
 	
-	v(print_verify_results (validity));
-	g_mime_signature_validity_free (validity);
+	v(print_verify_results (signatures));
+	g_object_unref (signatures);
 	
 	g_object_unref (message);
 }
@@ -262,7 +263,7 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 {
 	GMimeStream *cleartext, *stream;
 	GMimeMultipartEncrypted *mpe;
-	GMimeDecryptionResult *result;
+	GMimeDecryptResult *result;
 	GMimeDataWrapper *content;
 	GMimeObject *decrypted;
 	GPtrArray *recipients;
@@ -297,7 +298,7 @@ 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", GMIME_CRYPTO_HASH_SHA256,
+					    "no user no domain", GMIME_DIGEST_ALGO_SHA256,
 					    recipients, &err);
 	g_ptr_array_free (recipients, TRUE);
 	g_object_unref (part);
@@ -345,24 +346,23 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	decrypted = g_mime_multipart_encrypted_decrypt (mpe, ctx, &result, &err);
 	if (!decrypted || err != NULL) {
 		ex = exception_new ("decryption failed: %s", err->message);
-		g_mime_decryption_result_free (result);
 		g_object_unref (cleartext);
 		g_error_free (err);
 		throw (ex);
 	}
 	
-	if (result->validity)
-		v(print_verify_results (result->validity));
+	if (result->signatures)
+		v(print_verify_results (result->signatures));
 	
 	if (sign) {
-		if (!result->validity || get_sig_status (result->validity->signers) != GMIME_SIGNER_STATUS_GOOD)
+		if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
 			ex = exception_new ("signature status expected to be GOOD");
 	} else {
-		if (result->validity && result->validity->signers != NULL)
+		if (result->signatures)
 			ex = exception_new ("signature status expected to be NONE");
 	}
 	
-	g_mime_decryption_result_free (result);
+	g_object_unref (result);
 	
 	if (ex != NULL) {
 		g_object_unref (cleartext);
diff --git a/tests/test-pkcs7.c b/tests/test-pkcs7.c
index 6bb8ac9..199cd13 100644
--- a/tests/test-pkcs7.c
+++ b/tests/test-pkcs7.c
@@ -47,18 +47,19 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
-static GMimeSignerStatus
-get_sig_status (GMimeSigner *signers)
+static GMimeSignatureStatus
+get_sig_status (GMimeSignatureList *signatures)
 {
-	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
-	GMimeSigner *signer = signers;
+	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+	GMimeSignature *sig;
+	int i;
 	
-	if (signers == NULL)
-		return GMIME_SIGNER_STATUS_ERROR;
+	if (!signatures || signatures->array->len == 0)
+		return GMIME_SIGNATURE_STATUS_ERROR;
 	
-	while (signer != NULL) {
-		status = MAX (status, signer->status);
-		signer = signer->next;
+	for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		status = MAX (status, sig->status);
 	}
 	
 	return status;
@@ -72,7 +73,7 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
 	int rv;
 	
 	rv = g_mime_crypto_context_sign (ctx, "alice example net",
-					 GMIME_CRYPTO_HASH_SHA256,
+					 GMIME_DIGEST_ALGO_SHA256,
 					 cleartext, ciphertext, &err);
 	
 	if (rv == -1 || err != NULL) {
@@ -82,7 +83,7 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
 	}
 	
 	v(fprintf (stderr, "signature (%s):\n%.*s\n",
-		   g_mime_crypto_context_hash_name (ctx, rv),
+		   g_mime_crypto_context_digest_name (ctx, rv),
 		   GMIME_STREAM_MEM (ciphertext)->buffer->len,
 		   GMIME_STREAM_MEM (ciphertext)->buffer->data));
 }
@@ -90,25 +91,25 @@ test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphert
 static void
 test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
-	GMimeSignatureValidity *validity;
+	GMimeSignatureList *signatures;
 	GError *err = NULL;
 	Exception *ex;
 	
-	validity = g_mime_crypto_context_verify (ctx, GMIME_CRYPTO_HASH_DEFAULT,
-						 cleartext, ciphertext, &err);
+	signatures = g_mime_crypto_context_verify (ctx, GMIME_DIGEST_ALGO_DEFAULT,
+						   cleartext, ciphertext, &err);
 	
-	if (validity == NULL) {
+	if (signatures == NULL) {
 		ex = exception_new ("%s", err->message);
 		g_error_free (err);
 		throw (ex);
 	}
 	
-	if (get_sig_status (validity->signers) != GMIME_SIGNER_STATUS_GOOD) {
-		g_mime_signature_validity_free (validity);
+	if (get_sig_status (signatures) != GMIME_SIGNATURE_STATUS_GOOD) {
+		g_object_unref (signatures);
 		throw (exception_new ("signature BAD"));
 	}
 	
-	g_mime_signature_validity_free (validity);
+	g_object_unref (signatures);
 }
 
 static void
@@ -122,7 +123,7 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	g_ptr_array_add (recipients, "alice example net");
 	
 	g_mime_crypto_context_encrypt (ctx, sign, "alice example net",
-				       GMIME_CRYPTO_HASH_SHA256, recipients,
+				       GMIME_DIGEST_ALGO_SHA256, recipients,
 				       cleartext, ciphertext, &err);
 	
 	g_ptr_array_free (recipients, TRUE);
@@ -141,7 +142,7 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 static void
 test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
-	GMimeDecryptionResult *result;
+	GMimeDecryptResult *result;
 	Exception *ex = NULL;
 	GMimeStream *stream;
 	GError *err = NULL;
@@ -157,14 +158,14 @@ test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	}
 	
 	if (sign) {
-		if (!result->validity || get_sig_status (result->validity->signers) != GMIME_SIGNER_STATUS_GOOD)
+		if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
 			ex = exception_new ("expected GOOD signature");
 	} else {
-		if (result->validity && result->validity->signers != NULL)
+		if (result->signatures)
 			ex = exception_new ("unexpected signature");
 	}
 	
-	g_mime_decryption_result_free (result);
+	g_object_unref (result);
 	
 	if (ex != NULL) {
 		g_object_unref (stream);
diff --git a/tests/test-smime.c b/tests/test-smime.c
index c3a68fb..8d4fcbd 100644
--- a/tests/test-smime.c
+++ b/tests/test-smime.c
@@ -48,36 +48,38 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
-static GMimeSignerStatus
-get_sig_status (GMimeSigner *signers)
+static GMimeSignatureStatus
+get_sig_status (GMimeSignatureList *signatures)
 {
-	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
-	GMimeSigner *signer = signers;
+	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+	GMimeSignature *sig;
+	int i;
 	
-	if (signers == NULL)
-		return GMIME_SIGNER_STATUS_ERROR;
+	if (!signatures || signatures->array->len == 0)
+		return GMIME_SIGNATURE_STATUS_ERROR;
 	
-	while (signer != NULL) {
-		status = MAX (status, signer->status);
-		signer = signer->next;
+	for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		status = MAX (status, sig->status);
 	}
 	
 	return status;
 }
 
 static void
-print_verify_results (const GMimeSignatureValidity *validity)
+print_verify_results (GMimeSignatureList *signatures)
 {
-	GMimeSigner *signer;
+	GMimeSignature *sig;
+	int count, i;
 	
-	switch (get_sig_status (validity->signers)) {
-	case GMIME_SIGNER_STATUS_GOOD:
+	switch (get_sig_status (signatures)) {
+	case GMIME_SIGNATURE_STATUS_GOOD:
 		fputs ("GOOD\n", stdout);
 		break;
-	case GMIME_SIGNER_STATUS_BAD:
+	case GMIME_SIGNATURE_STATUS_BAD:
 		fputs ("BAD\n", stdout);
 		break;
-	case GMIME_SIGNER_STATUS_ERROR:
+	case GMIME_SIGNATURE_STATUS_ERROR:
 		fputs ("ERROR status\n", stdout);
 		break;
 	default:
@@ -85,75 +87,74 @@ print_verify_results (const GMimeSignatureValidity *validity)
 		break;
 	}
 	
-	fputs ("\nSigners:\n", stdout);
-	signer = validity->signers;
-	while (signer != NULL) {
-		fprintf (stdout, "\tName: %s\n", signer->name ? signer->name : "(null)");
-		fprintf (stdout, "\tKeyId: %s\n", signer->keyid ? signer->keyid : "(null)");
-		fprintf (stdout, "\tFingerprint: %s\n", signer->fingerprint ? signer->fingerprint : "(null)");
+	fputs ("\nSignatures:\n", stdout);
+	count = g_mime_signature_list_length (signatures);
+	for (i = 0; i < count; i++) {
+		sig = g_mime_signature_list_get_signature (signatures, i);
+		
+		fprintf (stdout, "\tName: %s\n", sig->cert->name ? sig->cert->name : "(null)");
+		fprintf (stdout, "\tKeyId: %s\n", sig->cert->keyid ? sig->cert->keyid : "(null)");
+		fprintf (stdout, "\tFingerprint: %s\n", sig->cert->fingerprint ? sig->cert->fingerprint : "(null)");
 		fprintf (stdout, "\tTrust: ");
 		
-		switch (signer->trust) {
-		case GMIME_SIGNER_TRUST_NONE:
+		switch (sig->cert->trust) {
+		case GMIME_CERTIFICATE_TRUST_NONE:
 			fputs ("None\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_NEVER:
+		case GMIME_CERTIFICATE_TRUST_NEVER:
 			fputs ("Never\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_UNDEFINED:
+		case GMIME_CERTIFICATE_TRUST_UNDEFINED:
 			fputs ("Undefined\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_MARGINAL:
+		case GMIME_CERTIFICATE_TRUST_MARGINAL:
 			fputs ("Marginal\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_FULLY:
+		case GMIME_CERTIFICATE_TRUST_FULLY:
 			fputs ("Fully\n", stdout);
 			break;
-		case GMIME_SIGNER_TRUST_ULTIMATE:
+		case GMIME_CERTIFICATE_TRUST_ULTIMATE:
 			fputs ("Ultimate\n", stdout);
 			break;
 		}
 		
 		fprintf (stdout, "\tStatus: ");
-		switch (signer->status) {
-		case GMIME_SIGNER_STATUS_GOOD:
+		switch (sig->status) {
+		case GMIME_SIGNATURE_STATUS_GOOD:
 			fputs ("GOOD\n", stdout);
 			break;
-		case GMIME_SIGNER_STATUS_BAD:
+		case GMIME_SIGNATURE_STATUS_BAD:
 			fputs ("BAD\n", stdout);
 			break;
-		case GMIME_SIGNER_STATUS_ERROR:
+		case GMIME_SIGNATURE_STATUS_ERROR:
 			fputs ("ERROR\n", stdout);
 			break;
 		}
 		
-		fprintf (stdout, "\tSignature made on %s", ctime (&signer->sig_created));
-		if (signer->sig_expires != (time_t) 0)
-			fprintf (stdout, "\tSignature expires on %s", ctime (&signer->sig_expires));
+		fprintf (stdout, "\tSignature made on %s", ctime (&sig->created));
+		if (sig->expires != (time_t) 0)
+			fprintf (stdout, "\tSignature expires on %s", ctime (&sig->expires));
 		else
 			fprintf (stdout, "\tSignature never expires\n");
 		
-		if (signer->errors) {
+		if (sig->errors) {
 			fprintf (stdout, "\tErrors: ");
-			if (signer->errors & GMIME_SIGNER_ERROR_EXPSIG)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG)
 				fputs ("Expired, ", stdout);
-			if (signer->errors & GMIME_SIGNER_ERROR_NO_PUBKEY)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY)
 				fputs ("No Pub Key, ", stdout);
-			if (signer->errors & GMIME_SIGNER_ERROR_EXPKEYSIG)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG)
 				fputs ("Key Expired, ", stdout);
-			if (signer->errors & GMIME_SIGNER_ERROR_REVKEYSIG)
+			if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG)
 				fputs ("Key Revoked", stdout);
 			fputc ('\n', stdout);
 		} else {
 			fprintf (stdout, "\tNo errors for this signer\n");
 		}
 		
-		if ((signer = signer->next))
+		if (i + 1 < count)
 			fputc ('\n', stdout);
 	}
-	
-	fprintf (stdout, "\nValidity diagnostics: \n%s\n",
-		 g_mime_signature_validity_get_details (validity));
 }
 
 #define MULTIPART_SIGNED_CONTENT "This is a test of the emergency broadcast system \
@@ -166,7 +167,7 @@ then we have ourselves a winner I guess...\n"
 static void
 test_multipart_signed (GMimeCryptoContext *ctx)
 {
-	GMimeSignatureValidity *validity;
+	GMimeSignatureList *signatures;
 	GMimeMultipartSigned *mps;
 	GMimeDataWrapper *content;
 	GMimeMessage *message;
@@ -201,7 +202,7 @@ test_multipart_signed (GMimeCryptoContext *ctx)
 	
 	/* sign the part */
 	g_mime_multipart_signed_sign (mps, GMIME_OBJECT (part), ctx, "alice example net",
-				      GMIME_CRYPTO_HASH_SHA1, &err);
+				      GMIME_DIGEST_ALGO_SHA1, &err);
 	g_object_unref (part);
 	
 	if (err != NULL) {
@@ -243,15 +244,15 @@ test_multipart_signed (GMimeCryptoContext *ctx)
 	mps = (GMimeMultipartSigned *) message->mime_part;
 	
 	v(fputs ("Trying to verify signature... ", stdout));
-	if (!(validity = g_mime_multipart_signed_verify (mps, ctx, &err))) {
+	if (!(signatures = g_mime_multipart_signed_verify (mps, ctx, &err))) {
 		ex = exception_new ("%s", err->message);
 		v(fputs ("failed.\n", stdout));
 		g_error_free (err);
 		throw (ex);
 	}
 	
-	v(print_verify_results (validity));
-	g_mime_signature_validity_free (validity);
+	v(print_verify_results (signatures));
+	g_object_unref (signatures);
 	
 	g_object_unref (message);
 }
@@ -263,7 +264,7 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 {
 	GMimeStream *cleartext, *stream;
 	GMimeMultipartEncrypted *mpe;
-	GMimeDecryptionResult *result;
+	GMimeDecryptResult *result;
 	GMimeDataWrapper *content;
 	GMimeObject *decrypted;
 	GPtrArray *recipients;
@@ -298,7 +299,7 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	recipients = g_ptr_array_new ();
 	g_ptr_array_add (recipients, "alice example net");
 	g_mime_multipart_encrypted_encrypt (mpe, GMIME_OBJECT (part), ctx, sign,
-					    "alice example net", GMIME_CRYPTO_HASH_SHA256,
+					    "alice example net", GMIME_DIGEST_ALGO_SHA256,
 					    recipients, &err);
 	g_ptr_array_free (recipients, TRUE);
 	g_object_unref (part);
@@ -346,24 +347,23 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	decrypted = g_mime_multipart_encrypted_decrypt (mpe, ctx, &result, &err);
 	if (!decrypted || err != NULL) {
 		ex = exception_new ("decryption failed: %s", err->message);
-		g_mime_decryption_result_free (result);
 		g_object_unref (cleartext);
 		g_error_free (err);
 		throw (ex);
 	}
 	
-	if (result->validity)
-		v(print_verify_results (result->validity));
+	if (result->signatures)
+		v(print_verify_results (result->signatures));
 	
 	if (sign) {
-		if (!result->validity || get_sig_status (result->validity->signers) != GMIME_SIGNER_STATUS_GOOD)
+		if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
 			ex = exception_new ("signature status expected to be GOOD");
 	} else {
-		if (result->validity && result->validity->signers != NULL)
+		if (result->signatures)
 			ex = exception_new ("signature status expected to be NONE");
 	}
 	
-	g_mime_decryption_result_free (result);
+	g_object_unref (result);
 	
 	if (ex != NULL) {
 		g_object_unref (cleartext);



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