libpurple: Remove PurpleCipher and PurpleHash implementations and tests

Thu, 15 Jun 2017 14:22:32 -0500

author
Mike Ruprecht <cmaiku@gmail.com>
date
Thu, 15 Jun 2017 14:22:32 -0500
changeset 38413
e35c6b6ca094
parent 38412
e25c73450414
child 38414
3892b306732f

libpurple: Remove PurpleCipher and PurpleHash implementations and tests

ChangeLog.API file | annotate | diff | comparison | revisions
doc/reference/libpurple/libpurple-docs.xml file | annotate | diff | comparison | revisions
libpurple/Makefile.am file | annotate | diff | comparison | revisions
libpurple/Makefile.mingw file | annotate | diff | comparison | revisions
libpurple/cipher.c file | annotate | diff | comparison | revisions
libpurple/cipher.h file | annotate | diff | comparison | revisions
libpurple/ciphers/aescipher.c file | annotate | diff | comparison | revisions
libpurple/ciphers/aescipher.h file | annotate | diff | comparison | revisions
libpurple/ciphers/des3cipher.c file | annotate | diff | comparison | revisions
libpurple/ciphers/des3cipher.h file | annotate | diff | comparison | revisions
libpurple/ciphers/descipher.c file | annotate | diff | comparison | revisions
libpurple/ciphers/descipher.h file | annotate | diff | comparison | revisions
libpurple/ciphers/md4hash.c file | annotate | diff | comparison | revisions
libpurple/ciphers/md4hash.h file | annotate | diff | comparison | revisions
libpurple/ciphers/pbkdf2cipher.c file | annotate | diff | comparison | revisions
libpurple/ciphers/pbkdf2cipher.h file | annotate | diff | comparison | revisions
libpurple/ciphers/rc4cipher.c file | annotate | diff | comparison | revisions
libpurple/ciphers/rc4cipher.h file | annotate | diff | comparison | revisions
libpurple/tests/Makefile.am file | annotate | diff | comparison | revisions
libpurple/tests/test_des.c file | annotate | diff | comparison | revisions
libpurple/tests/test_des3.c file | annotate | diff | comparison | revisions
libpurple/tests/test_md4.c file | annotate | diff | comparison | revisions
--- a/ChangeLog.API	Thu Sep 29 20:11:07 2016 -0500
+++ b/ChangeLog.API	Thu Jun 15 14:22:32 2017 -0500
@@ -23,14 +23,6 @@
 		* purple_account_presence_new
 		* purple_buddy_presence_new
 		* purple_account_register_completed
-		* PurpleAESCipher, PurpleDESCipher, PurpleDES3Cipher, PurpleHMACCipher,
-		  PurplePBKDF2Cipher and PurpleRC4Cipher inherit PurpleCipher
-		* purple_aes_cipher_new
-		* purple_des3_cipher_new
-		* purple_des_cipher_new
-		* purple_hmac_cipher_new
-		* purple_pbkdf2_cipher_new
-		* purple_rc4_cipher_new
 		* purple_blist_node_is_transient
 		* purple_blist_node_set_transient
 		* purple_certificate_get_der_data
@@ -55,13 +47,6 @@
 		* purple_counting_node_get_*
 		* purple_counting_node_change_*
 		* purple_counting_node_set_*
-		* PurpleHash and purple_hash_* API
-		* PurpleMD4Hash, PurpleMD5Hash, PurpleSHA1Hash and PurpleSHA265Hash
-		  inherit PurpleHash
-		* purple_md4_hash_new
-		* purple_md5_hash_new
-		* purple_sha1_hash_new
-		* purple_sha256_hash_new
 		* PurpleIMConversation and PurpleChatConversation inherit
 		  PurpleConversation
 		* purple_notify_emails_pending
@@ -197,8 +182,6 @@
 		* conversation.h has been split into conversation.h
 		  (PurpleConversation), conversationtypes.h (PurpleIMConversation and
 		  PurpleChatConversation) and conversations.h (Conversations subsystem)
-		* Files in libpurple/ciphers have been renamed. To use a particular
-		  cipher, include its header.
 		* Renamed ft.h file to xfer.h
 		* Renamed plugin.h file to plugins.h
 		* prpl.h has been split into protocol.h (PurpleProtocol GObject and
@@ -259,9 +242,6 @@
 		* Replaced 'chat-buddy' with 'chat-user' in conversation signals
 		* Replaced chatname, buddyname arguments of 'chat-user-flags' (formerly
 		  'chat-buddy-flags') signal with PurpleChatUser *
-		* PurpleCipher split into PurpleCipher and PurpleHash, both are
-		  GObjects. Please see the documentation for details.
-		* purple_cipher_context_* functions are now purple_cipher_*
 		* PurpleCircBuffer changed to PurpleCircularBuffer, is now a GObject.
 		  Please see the documentation for details.
 		* purple_circ_buffer_* functions are now purple_circular_buffer_*
@@ -403,7 +383,6 @@
 		* buddy-added and buddy-removed blist signals
 		* privacy.h file
 		* value.h file
-		* _PurpleCipherBatchMode
 		* _PurpleCmdFlag
 		* _PurpleCmdPriority
 		* _PurpleCmdRet
@@ -430,19 +409,8 @@
 		  purple_certificate_check_signature_chain, instead
 		* purple_certificate_display_x509. Use purple_request_certificate,
 		  instead
-		* PurpleCipherContext
-		* purple_cipher_context_destroy
-		* purple_cipher_context_get_data
-		* purple_cipher_context_get_option
-		* purple_cipher_context_new
-		* purple_cipher_context_new_by_name
-		* purple_cipher_context_set_data
-		* purple_cipher_context_set_option
-		* purple_cipher_get_capabilities
-		* purple_cipher_get_name
-		* PurpleCipherOps
-		* purple_ciphers_*
-		* PurpleCipher's init and uninit operations
+		* Purple Cipher API (PurpleCipherContext and friends).
+		  Use GLib's GHmac or GChecksum instead.
 		* purple_connection_error_reason
 		* purple_connection_new
 		* purple_connection_new_unregister
--- a/doc/reference/libpurple/libpurple-docs.xml	Thu Sep 29 20:11:07 2016 -0500
+++ b/doc/reference/libpurple/libpurple-docs.xml	Thu Jun 15 14:22:32 2017 -0500
@@ -104,17 +104,6 @@
         <xi:include href="xml/cmds.xml" />
     </chapter>
 
-    <chapter id="ciphers">
-      <title>Ciphers and Hashes</title>
-
-        <xi:include href="xml/aescipher.xml" />
-        <xi:include href="xml/descipher.xml" />
-        <xi:include href="xml/des3cipher.xml" />
-        <xi:include href="xml/pbkdf2cipher.xml" />
-        <xi:include href="xml/rc4cipher.xml" />
-        <xi:include href="xml/md4hash.xml" />
-    </chapter>
-
     <chapter id="smiley">
       <title>Smiley APIs</title>
 
--- a/libpurple/Makefile.am	Thu Sep 29 20:11:07 2016 -0500
+++ b/libpurple/Makefile.am	Thu Jun 15 14:22:32 2017 -0500
@@ -40,13 +40,6 @@
 	buddylist.c \
 	buddyicon.c \
 	chat.c \
-	ciphers/aescipher.c \
-	ciphers/descipher.c \
-	ciphers/des3cipher.c \
-	ciphers/md4hash.c \
-	ciphers/pbkdf2cipher.c \
-	ciphers/rc4cipher.c \
-	cipher.c \
 	circularbuffer.c \
 	cmds.c \
 	connection.c \
@@ -133,7 +126,6 @@
 	buddylist.h \
 	buddyicon.h \
 	chat.h \
-	cipher.h \
 	circularbuffer.h \
 	cmds.h \
 	connection.h \
@@ -233,20 +225,11 @@
 	codec.h \
 	enum-types.h
 
-purple_cipherheaders = \
-	aescipher.h \
-	descipher.h \
-	des3cipher.h \
-	md4hash.h \
-	pbkdf2cipher.h \
-	rc4cipher.h
-
 purple_builtheaders = purple.h version.h enums.h marshallers.h
 
 purple_enumheaders = \
 	$(srcdir)/account.h \
 	$(srcdir)/buddyicon.h \
-	$(srcdir)/cipher.h \
 	$(srcdir)/connection.h \
 	$(srcdir)/conversation.h \
 	$(srcdir)/conversationtypes.h \
@@ -319,7 +302,6 @@
 # to not being able to find the enums.h or marshallers.h files if
 # they've already been generated in the $(srcdir).
 purple_build_coreheaders = $(addprefix $(srcdir)/, $(purple_coreheaders)) \
-		$(addprefix $(srcdir)/ciphers/, $(purple_cipherheaders)) \
 		$(addprefix $(srcdir)/media/, $(purple_mediaheaders)) \
 		$(filter-out: enums.h marshallers.h, $(purple_builtheaders))
 dbus_build_exported = $(addprefix $(srcdir)/, $(dbus_exported))
@@ -358,7 +340,7 @@
 purple-client-bindings.c: dbus-analyze-functions.py $(dbus_exported)
 	$(AM_V_GEN) $(PYTHON) $(srcdir)/dbus-analyze-functions.py --client -o $@ $(dbus_build_exported)
 
-purple-client-bindings.h: dbus-analyze-types.py dbus-analyze-functions.py $(purple_coreheaders) $(addprefix ciphers/, $(purple_cipherheaders)) $(addprefix media/, $(purple_mediaheaders)) $(purple_builtheaders) $(dbus_exported)
+purple-client-bindings.h: dbus-analyze-types.py dbus-analyze-functions.py $(purple_coreheaders) $(addprefix media/, $(purple_mediaheaders)) $(purple_builtheaders) $(dbus_exported)
 	$(AM_V_GEN) $(PYTHON) $(srcdir)/dbus-analyze-types.py --keyword=enum --verbatim -o $@ $(purple_build_coreheaders)
 	$(AM_V_at) $(PYTHON) $(srcdir)/dbus-analyze-functions.py --client --headers --append -o $@ $(dbus_build_exported)
 
@@ -420,10 +402,6 @@
 	$(purple_builtheaders) \
 	$(dbus_headers)
 
-cipherincludedir=$(includedir)/libpurple/ciphers
-cipherinclude_HEADERS = \
-	$(addprefix $(srcdir)/ciphers/, $(purple_cipherheaders))
-
 mediaincludedir=$(includedir)/libpurple/media
 mediainclude_HEADERS = \
 	$(addprefix $(srcdir)/media/, $(purple_mediaheaders))
@@ -500,7 +478,6 @@
 if HAVE_INTROSPECTION
 introspection_sources = \
 	$(libpurpleinclude_HEADERS) \
-	$(addprefix ciphers/, $(purple_cipherheaders)) \
 	$(addprefix media/, $(purple_mediaheaders))
 
 Purple-$(PURPLE_MAJOR_VERSION).$(PURPLE_MINOR_VERSION).gir: $(builddir)/libpurple.la
--- a/libpurple/Makefile.mingw	Thu Sep 29 20:11:07 2016 -0500
+++ b/libpurple/Makefile.mingw	Thu Jun 15 14:22:32 2017 -0500
@@ -68,13 +68,6 @@
 			buddylist.c \
 			buddyicon.c \
 			certificate.c \
-			ciphers/aescipher.c \
-			ciphers/descipher.c \
-			ciphers/des3cipher.c \
-			ciphers/md4hash.c \
-			ciphers/pbkdf2cipher.c \
-			ciphers/rc4cipher.c \
-			cipher.c \
 			circularbuffer.c \
 			cmds.c \
 			connection.c \
@@ -146,7 +139,6 @@
 
 ENUM_HEADERS = \
 	account.h \
-	cipher.h \
 	connection.h \
 	conversation.h \
 	conversationtypes.h \
--- a/libpurple/cipher.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,555 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-#include "internal.h"
-#include "cipher.h"
-#include "debug.h"
-
-/******************************************************************************
- * PurpleCipher API
- *****************************************************************************/
-GType
-purple_cipher_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurpleCipherClass),
-			NULL,
-			NULL,
-			NULL,
-			NULL,
-			NULL,
-			sizeof(PurpleCipher),
-			0,
-			NULL,
-			NULL
-		};
-
-		type = g_type_register_static(G_TYPE_OBJECT,
-									  "PurpleCipher",
-									  &info, G_TYPE_FLAG_ABSTRACT);
-	}
-
-	return type;
-}
-
-static const gchar *
-purple_cipher_get_name(PurpleCipher *cipher)
-{
-	PurpleCipherClass *klass;
-	const gchar *name;
-
-	if (!PURPLE_IS_CIPHER(cipher))
-		return "(error: not a cipher)";
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-	if (!klass)
-		return "(error: unknown cipher class)";
-
-	name = g_type_name(G_TYPE_FROM_CLASS(klass));
-	if (!name)
-		return "(error: unknown cipher name)";
-
-	return name;
-}
-
-static const gchar *
-purple_hash_get_name(PurpleHash *hash)
-{
-	PurpleHashClass *klass;
-	const gchar *name;
-
-	if (!PURPLE_IS_HASH(hash))
-		return "(error: not a hash)";
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-	if (!klass)
-		return "(error: unknown hash class)";
-
-	name = g_type_name(G_TYPE_FROM_CLASS(klass));
-	if (!name)
-		return "(error: unknown hash name)";
-
-	return name;
-}
-
-void
-purple_cipher_reset(PurpleCipher *cipher) {
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->reset)
-		klass->reset(cipher);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the reset method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-void
-purple_cipher_reset_state(PurpleCipher *cipher) {
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->reset_state)
-		klass->reset_state(cipher);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the reset_state method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-void
-purple_cipher_set_iv(PurpleCipher *cipher, guchar *iv, size_t len)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-	g_return_if_fail(iv);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->set_iv)
-		klass->set_iv(cipher, iv, len);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the set_iv method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-void
-purple_cipher_append(PurpleCipher *cipher, const guchar *data,
-								size_t len)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->append)
-		klass->append(cipher, data, len);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the append method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-gboolean
-purple_cipher_digest(PurpleCipher *cipher, guchar digest[], size_t len)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), FALSE);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->digest)
-		return klass->digest(cipher, digest, len);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the digest method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return FALSE;
-}
-
-gboolean
-purple_cipher_digest_to_str(PurpleCipher *cipher, gchar digest_s[], size_t len)
-{
-	/* 8k is a bit excessive, will tweak later. */
-	guchar digest[BUF_LEN * 4];
-	size_t digest_size, n;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), FALSE);
-	g_return_val_if_fail(digest_s, FALSE);
-
-	digest_size = purple_cipher_get_digest_size(cipher);
-
-	g_return_val_if_fail(digest_size <= BUF_LEN * 4, FALSE);
-
-	if(!purple_cipher_digest(cipher, digest, sizeof(digest)))
-		return FALSE;
-
-	/* Every digest byte occupies 2 chars + the NUL at the end. */
-	g_return_val_if_fail(digest_size * 2 + 1 <= len, FALSE);
-
-	for(n = 0; n < digest_size; n++)
-		sprintf(digest_s + (n * 2), "%02x", digest[n]);
-
-	digest_s[n * 2] = '\0';
-
-	return TRUE;
-}
-
-size_t
-purple_cipher_get_digest_size(PurpleCipher *cipher)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), FALSE);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->get_digest_size)
-		return klass->get_digest_size(cipher);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the get_digest_size method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return FALSE;
-}
-
-ssize_t
-purple_cipher_encrypt(PurpleCipher *cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), -1);
-	g_return_val_if_fail(input != NULL, -1);
-	g_return_val_if_fail(output != NULL, -1);
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->encrypt)
-		return klass->encrypt(cipher, input, in_len, output, out_size);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the encrypt method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return -1;
-}
-
-ssize_t
-purple_cipher_decrypt(PurpleCipher *cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), -1);
-	g_return_val_if_fail(input != NULL, -1);
-	g_return_val_if_fail(output != NULL, -1);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->decrypt)
-		return klass->decrypt(cipher, input, in_len, output, out_size);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the decrypt method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return -1;
-}
-
-void
-purple_cipher_set_salt(PurpleCipher *cipher, const guchar *salt, size_t len) {
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->set_salt)
-		klass->set_salt(cipher, salt, len);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the set_salt method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-void
-purple_cipher_set_key(PurpleCipher *cipher, const guchar *key, size_t len) {
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->set_key)
-		klass->set_key(cipher, key, len);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the set_key method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-size_t
-purple_cipher_get_key_size(PurpleCipher *cipher) {
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), -1);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->get_key_size)
-		return klass->get_key_size(cipher);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the get_key_size method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return -1;
-}
-
-void
-purple_cipher_set_batch_mode(PurpleCipher *cipher,
-                                     PurpleCipherBatchMode mode)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_CIPHER(cipher));
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->set_batch_mode)
-		klass->set_batch_mode(cipher, mode);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the set_batch_mode method",
-			purple_cipher_get_name(cipher));
-	}
-}
-
-PurpleCipherBatchMode
-purple_cipher_get_batch_mode(PurpleCipher *cipher)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), -1);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->get_batch_mode)
-		return klass->get_batch_mode(cipher);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the get_batch_mode method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return -1;
-}
-
-size_t
-purple_cipher_get_block_size(PurpleCipher *cipher)
-{
-	PurpleCipherClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_CIPHER(cipher), -1);
-
-	klass = PURPLE_CIPHER_GET_CLASS(cipher);
-
-	if (klass && klass->get_block_size)
-		return klass->get_block_size(cipher);
-	else {
-		purple_debug_warning("cipher", "the %s cipher does not "
-			"implement the get_block_size method",
-			purple_cipher_get_name(cipher));
-	}
-
-	return -1;
-}
-
-/******************************************************************************
- * PurpleHash API
- *****************************************************************************/
-GType
-purple_hash_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurpleHashClass),
-			NULL,
-			NULL,
-			NULL,
-			NULL,
-			NULL,
-			sizeof(PurpleHash),
-			0,
-			NULL,
-			NULL
-		};
-
-		type = g_type_register_static(G_TYPE_OBJECT,
-									  "PurpleHash",
-									  &info, G_TYPE_FLAG_ABSTRACT);
-	}
-
-	return type;
-}
-
-void
-purple_hash_reset(PurpleHash *hash) {
-	PurpleHashClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_HASH(hash));
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-
-	if (klass && klass->reset)
-		klass->reset(hash);
-	else {
-		purple_debug_warning("hash", "the %s hash does not implement "
-			"the reset method", purple_hash_get_name(hash));
-	}
-}
-
-void
-purple_hash_reset_state(PurpleHash *hash) {
-	PurpleHashClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_HASH(hash));
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-
-	if (klass && klass->reset_state)
-		klass->reset_state(hash);
-	else {
-		purple_debug_warning("hash", "the %s hash does not implement "
-			"the reset_state method", purple_hash_get_name(hash));
-	}
-}
-
-void
-purple_hash_append(PurpleHash *hash, const guchar *data,
-								size_t len)
-{
-	PurpleHashClass *klass = NULL;
-
-	g_return_if_fail(PURPLE_IS_HASH(hash));
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-
-	if (klass && klass->append)
-		klass->append(hash, data, len);
-	else {
-		purple_debug_warning("hash", "the %s hash does not implement "
-			"the append method", purple_hash_get_name(hash));
-	}
-}
-
-gboolean
-purple_hash_digest(PurpleHash *hash, guchar digest[], size_t len)
-{
-	PurpleHashClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_HASH(hash), FALSE);
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-
-	if (klass && klass->digest)
-		return klass->digest(hash, digest, len);
-	else {
-		purple_debug_warning("hash", "the %s hash does not implement "
-			"the digest method", purple_hash_get_name(hash));
-	}
-
-	return FALSE;
-}
-
-gboolean
-purple_hash_digest_to_str(PurpleHash *hash, gchar digest_s[], size_t len)
-{
-	/* 8k is a bit excessive, will tweak later. */
-	guchar digest[BUF_LEN * 4];
-	size_t digest_size, n;
-
-	g_return_val_if_fail(PURPLE_IS_HASH(hash), FALSE);
-	g_return_val_if_fail(digest_s, FALSE);
-
-	digest_size = purple_hash_get_digest_size(hash);
-
-	g_return_val_if_fail(digest_size <= BUF_LEN * 4, FALSE);
-
-	if(!purple_hash_digest(hash, digest, sizeof(digest)))
-		return FALSE;
-
-	/* Every digest byte occupies 2 chars + the NUL at the end. */
-	g_return_val_if_fail(digest_size * 2 + 1 <= len, FALSE);
-
-	for(n = 0; n < digest_size; n++)
-		sprintf(digest_s + (n * 2), "%02x", digest[n]);
-
-	digest_s[n * 2] = '\0';
-
-	return TRUE;
-}
-
-size_t
-purple_hash_get_digest_size(PurpleHash *hash)
-{
-	PurpleHashClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_HASH(hash), FALSE);
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-
-	if (klass && klass->get_digest_size)
-		return klass->get_digest_size(hash);
-	else {
-		purple_debug_warning("hash", "the %s hash does not implement "
-			"the get_digest_size method", purple_hash_get_name(hash));
-	}
-
-	return FALSE;
-}
-
-size_t
-purple_hash_get_block_size(PurpleHash *hash)
-{
-	PurpleHashClass *klass = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_HASH(hash), -1);
-
-	klass = PURPLE_HASH_GET_CLASS(hash);
-
-	if (klass && klass->get_block_size)
-		return klass->get_block_size(hash);
-	else {
-		purple_debug_warning("hash", "the %s hash does not implement "
-			"the get_block_size method", purple_hash_get_name(hash));
-	}
-
-	return -1;
-}
--- a/libpurple/cipher.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,421 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#ifndef PURPLE_CIPHER_H
-#define PURPLE_CIPHER_H
-/**
- * SECTION:cipher
- * @section_id: libpurple-cipher
- * @short_description: <filename>cipher.h</filename>
- * @title: Cipher and Hash API
- */
-
-#include <glib.h>
-#include <glib-object.h>
-#include <string.h>
-
-#define PURPLE_TYPE_CIPHER				(purple_cipher_get_type())
-#define PURPLE_CIPHER(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_CIPHER, PurpleCipher))
-#define PURPLE_CIPHER_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_CIPHER, PurpleCipherClass))
-#define PURPLE_IS_CIPHER(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_CIPHER))
-#define PURPLE_IS_CIPHER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_CIPHER))
-#define PURPLE_CIPHER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_CIPHER, PurpleCipherClass))
-
-typedef struct _PurpleCipher       PurpleCipher;
-typedef struct _PurpleCipherClass  PurpleCipherClass;
-
-#define PURPLE_TYPE_HASH				(purple_hash_get_type())
-#define PURPLE_HASH(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_HASH, PurpleHash))
-#define PURPLE_HASH_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_HASH, PurpleHashClass))
-#define PURPLE_IS_HASH(obj)				(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_HASH))
-#define PURPLE_IS_HASH_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_HASH))
-#define PURPLE_HASH_GET_CLASS(obj)		(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_HASH, PurpleHashClass))
-
-typedef struct _PurpleHash       PurpleHash;
-typedef struct _PurpleHashClass  PurpleHashClass;
-
-/**
- * PurpleCipherBatchMode:
- * @PURPLE_CIPHER_BATCH_MODE_ECB: Electronic Codebook Mode
- * @PURPLE_CIPHER_BATCH_MODE_CBC: Cipher Block Chaining Mode
- *
- * Modes for batch encrypters
- */
-typedef enum {
-	PURPLE_CIPHER_BATCH_MODE_ECB,
-	PURPLE_CIPHER_BATCH_MODE_CBC
-} PurpleCipherBatchMode;
-
-/**
- * PurpleCipher:
- *
- * Purple Cipher is an opaque data structure and should not be used directly.
- */
-struct _PurpleCipher {
-	GObject gparent;
-};
-
-struct _PurpleCipherClass {
-	GObjectClass parent_class;
-
-	/** The reset function */
-	void (*reset)(PurpleCipher *cipher);
-
-	/** The reset state function */
-	void (*reset_state)(PurpleCipher *cipher);
-
-	/** The set initialization vector function */
-	void (*set_iv)(PurpleCipher *cipher, guchar *iv, size_t len);
-
-	/** The append data function */
-	void (*append)(PurpleCipher *cipher, const guchar *data, size_t len);
-
-	/** The digest function */
-	gboolean (*digest)(PurpleCipher *cipher, guchar digest[], size_t len);
-
-	/** The get digest size function */
-	size_t (*get_digest_size)(PurpleCipher *cipher);
-
-	/** The encrypt function */
-	ssize_t (*encrypt)(PurpleCipher *cipher, const guchar input[], size_t in_len, guchar output[], size_t out_size);
-
-	/** The decrypt function */
-	ssize_t (*decrypt)(PurpleCipher *cipher, const guchar input[], size_t in_len, guchar output[], size_t out_size);
-
-	/** The set salt function */
-	void (*set_salt)(PurpleCipher *cipher, const guchar *salt, size_t len);
-
-	/** The set key function */
-	void (*set_key)(PurpleCipher *cipher, const guchar *key, size_t len);
-
-	/** The get key size function */
-	size_t (*get_key_size)(PurpleCipher *cipher);
-
-	/** The set batch mode function */
-	void (*set_batch_mode)(PurpleCipher *cipher, PurpleCipherBatchMode mode);
-
-	/** The get batch mode function */
-	PurpleCipherBatchMode (*get_batch_mode)(PurpleCipher *cipher);
-
-	/** The get block size function */
-	size_t (*get_block_size)(PurpleCipher *cipher);
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-/**
- * PurpleHash:
- *
- * Purple Hash is an opaque data structure and should not be used directly.
- */
-struct _PurpleHash {
-	GObject gparent;
-};
-
-struct _PurpleHashClass {
-	GObjectClass parent_class;
-
-	/** The reset function */
-	void (*reset)(PurpleHash *hash);
-
-	/** The reset state function */
-	void (*reset_state)(PurpleHash *hash);
-
-	/** The append data function */
-	void (*append)(PurpleHash *hash, const guchar *data, size_t len);
-
-	/** The digest function */
-	gboolean (*digest)(PurpleHash *hash, guchar digest[], size_t len);
-
-	/** The get digest size function */
-	size_t (*get_digest_size)(PurpleHash *hash);
-
-	/** The get block size function */
-	size_t (*get_block_size)(PurpleHash *hash);
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-/*****************************************************************************/
-/* PurpleCipher API                                                          */
-/*****************************************************************************/
-
-/**
- * purple_cipher_get_type:
- *
- * Returns: The #GType for the Cipher object.
- */
-GType purple_cipher_get_type(void);
-
-/**
- * purple_cipher_reset:
- * @cipher:  The cipher
- *
- * Resets a cipher to it's default value
- * Note: If you have set an IV you will have to set it after resetting
- */
-void purple_cipher_reset(PurpleCipher *cipher);
-
-/**
- * purple_cipher_reset_state:
- * @cipher:  The cipher
- *
- * Resets a cipher state to it's default value, but doesn't touch stateless
- * configuration.
- *
- * That means, IV and digest will be wiped out, but keys, ops or salt
- * will remain untouched.
- */
-void purple_cipher_reset_state(PurpleCipher *cipher);
-
-/**
- * purple_cipher_set_iv:
- * @cipher:  The cipher
- * @iv:      The initialization vector to set
- * @len:     The len of the IV
- *
- * Sets the initialization vector for a cipher
- * Note: This should only be called right after a cipher is created or reset
- */
-void purple_cipher_set_iv(PurpleCipher *cipher, guchar *iv, size_t len);
-
-/**
- * purple_cipher_append:
- * @cipher:  The cipher
- * @data:    The data to append
- * @len:     The length of the data
- *
- * Appends data to the cipher context
- */
-void purple_cipher_append(PurpleCipher *cipher, const guchar *data, size_t len);
-
-/**
- * purple_cipher_digest:
- * @cipher:  The cipher
- * @digest:  The return buffer for the digest
- * @len:     The length of the buffer
- *
- * Digests a cipher context
- */
-gboolean purple_cipher_digest(PurpleCipher *cipher, guchar digest[], size_t len);
-
-/**
- * purple_cipher_digest_to_str:
- * @cipher:   The cipher
- * @digest_s: The return buffer for the string digest
- * @len:      The length of the buffer
- *
- * Converts a guchar digest into a hex string
- */
-gboolean purple_cipher_digest_to_str(PurpleCipher *cipher, gchar digest_s[], size_t len);
-
-/**
- * purple_cipher_get_digest_size:
- * @cipher: The cipher whose digest size to get
- *
- * Gets the digest size of a cipher
- *
- * Returns: The digest size of the cipher
- */
-size_t purple_cipher_get_digest_size(PurpleCipher *cipher);
-
-/**
- * purple_cipher_encrypt:
- * @cipher:   The cipher
- * @input:    The data to encrypt
- * @in_len:   The length of the data
- * @output:   The output buffer
- * @out_size: The size of the output buffer
- *
- * Encrypts data using the cipher
- *
- * Returns: A length of data that was outputed or -1, if failed
- */
-ssize_t purple_cipher_encrypt(PurpleCipher *cipher, const guchar input[], size_t in_len, guchar output[], size_t out_size);
-
-/**
- * purple_cipher_decrypt:
- * @cipher:   The cipher
- * @input:    The data to encrypt
- * @in_len:   The length of the returned value
- * @output:   The output buffer
- * @out_size: The size of the output buffer
- *
- * Decrypts data using the cipher
- *
- * Returns: A length of data that was outputed or -1, if failed
- */
-ssize_t purple_cipher_decrypt(PurpleCipher *cipher, const guchar input[], size_t in_len, guchar output[], size_t out_size);
-
-/**
- * purple_cipher_set_salt:
- * @cipher:  The cipher whose salt to set
- * @salt:    The salt
- * @len:     The length of the salt
- *
- * Sets the salt on a cipher
- */
-void purple_cipher_set_salt(PurpleCipher *cipher, const guchar *salt, size_t len);
-
-/**
- * purple_cipher_set_key:
- * @cipher:  The cipher whose key to set
- * @key:     The key
- * @len:     The size of the key
- *
- * Sets the key on a cipher
- */
-void purple_cipher_set_key(PurpleCipher *cipher, const guchar *key, size_t len);
-
-/**
- * purple_cipher_get_key_size:
- * @cipher: The cipher whose key size to get
- *
- * Gets the size of the key if the cipher supports it
- *
- * Returns: The size of the key
- */
-size_t purple_cipher_get_key_size(PurpleCipher *cipher);
-
-/**
- * purple_cipher_set_batch_mode:
- * @cipher:  The cipher whose batch mode to set
- * @mode:    The batch mode under which the cipher should operate
- *
- * Sets the batch mode of a cipher
- */
-void purple_cipher_set_batch_mode(PurpleCipher *cipher, PurpleCipherBatchMode mode);
-
-/**
- * purple_cipher_get_batch_mode:
- * @cipher: The cipher whose batch mode to get
- *
- * Gets the batch mode of a cipher
- *
- * Returns: The batch mode under which the cipher is operating
- */
-PurpleCipherBatchMode purple_cipher_get_batch_mode(PurpleCipher *cipher);
-
-/**
- * purple_cipher_get_block_size:
- * @cipher: The cipher whose block size to get
- *
- * Gets the block size of a cipher
- *
- * Returns: The block size of the cipher
- */
-size_t purple_cipher_get_block_size(PurpleCipher *cipher);
-
-/*****************************************************************************/
-/* PurpleHash API                                                            */
-/*****************************************************************************/
-
-/**
- * purple_hash_get_type:
- *
- * Returns: The #GType for the Hash object.
- */
-GType purple_hash_get_type(void);
-
-/**
- * purple_hash_reset:
- * @hash:  The hash
- *
- * Resets a hash to it's default value
- * Note: If you have set an IV you will have to set it after resetting
- */
-void purple_hash_reset(PurpleHash *hash);
-
-/**
- * purple_hash_reset_state:
- * @hash:  The hash
- *
- * Resets a hash state to it's default value, but doesn't touch stateless
- * configuration.
- *
- * That means, IV and digest will be wiped out, but keys, ops or salt
- * will remain untouched.
- */
-void purple_hash_reset_state(PurpleHash *hash);
-
-/**
- * purple_hash_append:
- * @hash:    The hash
- * @data:    The data to append
- * @len:     The length of the data
- *
- * Appends data to the hash context
- */
-void purple_hash_append(PurpleHash *hash, const guchar *data, size_t len);
-
-/**
- * purple_hash_digest:
- * @hash:    The hash
- * @digest:  The return buffer for the digest
- * @len:     The length of the buffer
- *
- * Digests a hash context
- */
-gboolean purple_hash_digest(PurpleHash *hash, guchar digest[], size_t len);
-
-/**
- * purple_hash_digest_to_str:
- * @hash:     The hash
- * @digest_s: The return buffer for the string digest
- * @len:      The length of the buffer
- *
- * Converts a guchar digest into a hex string
- */
-gboolean purple_hash_digest_to_str(PurpleHash *hash, gchar digest_s[], size_t len);
-
-/**
- * purple_hash_get_digest_size:
- * @hash: The hash whose digest size to get
- *
- * Gets the digest size of a hash
- *
- * Returns: The digest size of the hash
- */
-size_t purple_hash_get_digest_size(PurpleHash *hash);
-
-/**
- * purple_hash_get_block_size:
- * @hash: The hash whose block size to get
- *
- * Gets the block size of a hash
- *
- * Returns: The block size of the hash
- */
-size_t purple_hash_get_block_size(PurpleHash *hash);
-
-G_END_DECLS
-
-#endif /* PURPLE_CIPHER_H */
--- a/libpurple/ciphers/aescipher.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,725 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- *
- * Written by Tomek Wasilczyk <twasilczyk@pidgin.im>
- */
-
-#include "internal.h"
-#include "glibcompat.h"
-
-#include "aescipher.h"
-#include "debug.h"
-#include "enums.h"
-
-#include <string.h>
-
-#if defined(HAVE_GNUTLS)
-#  define PURPLE_AES_USE_GNUTLS 1
-#  include <gnutls/gnutls.h>
-#  include <gnutls/crypto.h>
-#elif defined(HAVE_NSS)
-#  define PURPLE_AES_USE_NSS 1
-#  include <nss.h>
-#  include <pk11pub.h>
-#  include <prerror.h>
-#else
-#  warning "No GnuTLS or NSS support"
-#endif
-
-/* 128bit */
-#define PURPLE_AES_BLOCK_SIZE 16
-
-/******************************************************************************
- * Structs
- *****************************************************************************/
-#define PURPLE_AES_CIPHER_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_AES_CIPHER, PurpleAESCipherPrivate))
-
-typedef struct {
-	guchar iv[PURPLE_AES_BLOCK_SIZE];
-	guchar key[32];
-	guint key_size;
-	gboolean failure;
-	PurpleCipherBatchMode batch_mode;
-} PurpleAESCipherPrivate;
-
-/******************************************************************************
- * Enums
- *****************************************************************************/
-enum {
-	PROP_NONE,
-	PROP_BATCH_MODE,
-	PROP_IV,
-	PROP_KEY,
-	PROP_LAST,
-};
-
-/*******************************************************************************
- * Globals
- ******************************************************************************/
-static GParamSpec *properties[PROP_LAST];
-
-/******************************************************************************
- * Cipher Stuff
- *****************************************************************************/
-
-typedef gboolean (*purple_aes_cipher_crypt_func)(
-	const guchar *input, guchar *output, size_t len,
-	guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32], guint key_size,
-	PurpleCipherBatchMode batch_mode);
-
-static void
-purple_aes_cipher_reset(PurpleCipher *cipher)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-
-	g_return_if_fail(priv != NULL);
-
-	memset(priv->iv, 0, sizeof(priv->iv));
-	memset(priv->key, 0, sizeof(priv->key));
-	priv->key_size = 32; /* 256bit */
-	priv->failure = FALSE;
-}
-
-static void
-purple_aes_cipher_set_iv(PurpleCipher *cipher, guchar *iv, size_t len)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-
-	if ((len > 0 && iv == NULL) ||
-		(len != 0 && len != sizeof(priv->iv))) {
-		purple_debug_error("cipher-aes", "invalid IV length\n");
-		priv->failure = TRUE;
-		return;
-	}
-
-	if (len == 0)
-		memset(priv->iv, 0, sizeof(priv->iv));
-	else
-		memcpy(priv->iv, iv, len);
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_IV]);
-}
-
-static void
-purple_aes_cipher_set_key(PurpleCipher *cipher, const guchar *key, size_t len)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-
-	if ((len > 0 && key == NULL) ||
-		(len != 0 && len != 16 && len != 24 && len != 32)) {
-		purple_debug_error("cipher-aes", "invalid key length\n");
-		priv->failure = TRUE;
-		return;
-	}
-
-	priv->key_size = len;
-	memset(priv->key, 0, sizeof(priv->key));
-	if (len > 0)
-		memcpy(priv->key, key, len);
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_KEY]);
-}
-
-static guchar *
-purple_aes_cipher_pad_pkcs7(const guchar input[], size_t in_len, size_t *out_len)
-{
-	int padding_len, total_len;
-	guchar *padded;
-
-	g_return_val_if_fail(input != NULL, NULL);
-	g_return_val_if_fail(out_len != NULL, NULL);
-
-	padding_len = PURPLE_AES_BLOCK_SIZE - (in_len % PURPLE_AES_BLOCK_SIZE);
-	total_len = in_len + padding_len;
-	g_assert((total_len % PURPLE_AES_BLOCK_SIZE) == 0);
-
-	padded = g_new(guchar, total_len);
-	*out_len = total_len;
-
-	memcpy(padded, input, in_len);
-	memset(padded + in_len, padding_len, padding_len);
-
-	return padded;
-}
-
-static ssize_t
-purple_aes_cipher_unpad_pkcs7(guchar input[], size_t in_len)
-{
-	guchar padding_len, i;
-	size_t out_len;
-
-	g_return_val_if_fail(input != NULL, -1);
-	g_return_val_if_fail(in_len > 0, -1);
-
-	padding_len = input[in_len - 1];
-	if (padding_len == 0 || padding_len > PURPLE_AES_BLOCK_SIZE ||
-		padding_len > in_len) {
-		purple_debug_warning("cipher-aes",
-			"Invalid padding length: %d (total %" G_GSIZE_FORMAT ") - "
-			"most probably, the key was invalid\n",
-			padding_len, in_len);
-		return -1;
-	}
-
-	out_len = in_len - padding_len;
-	for (i = 0; i < padding_len; i++) {
-		if (input[out_len + i] != padding_len) {
-			purple_debug_warning("cipher-aes",
-				"Padding doesn't match at pos %d (found %02x, "
-				"expected %02x) - "
-				"most probably, the key was invalid\n",
-				i, input[out_len + i], padding_len);
-			return -1;
-		}
-	}
-
-	memset(input + out_len, 0, padding_len);
-	return out_len;
-}
-
-#ifdef PURPLE_AES_USE_GNUTLS
-
-static gnutls_cipher_hd_t
-purple_aes_cipher_gnutls_crypt_init(guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32],
-	guint key_size)
-{
-	gnutls_cipher_hd_t handle;
-	gnutls_cipher_algorithm_t algorithm;
-	gnutls_datum_t key_info, iv_info;
-	int ret;
-
-	if (key_size == 16)
-		algorithm = GNUTLS_CIPHER_AES_128_CBC;
-	else if (key_size == 24)
-		algorithm = GNUTLS_CIPHER_AES_192_CBC;
-	else if (key_size == 32)
-		algorithm = GNUTLS_CIPHER_AES_256_CBC;
-	else
-		g_return_val_if_reached(NULL);
-
-	key_info.data = key;
-	key_info.size = key_size;
-
-	iv_info.data = iv;
-	iv_info.size = PURPLE_AES_BLOCK_SIZE;
-
-	ret = gnutls_cipher_init(&handle, algorithm, &key_info, &iv_info);
-	if (ret != 0) {
-		purple_debug_error("cipher-aes",
-			"gnutls_cipher_init failed: %d\n", ret);
-		return NULL;
-	}
-
-	return handle;
-}
-
-static gboolean
-purple_aes_cipher_gnutls_encrypt(const guchar *input, guchar *output, size_t len,
-	guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32], guint key_size,
-	PurpleCipherBatchMode batch_mode)
-{
-	gnutls_cipher_hd_t handle;
-	int ret;
-
-	/* We have to simulate ECB mode, which is not supported by GnuTLS. */
-	if (batch_mode == PURPLE_CIPHER_BATCH_MODE_ECB) {
-		size_t i;
-		for (i = 0; i < len / PURPLE_AES_BLOCK_SIZE; i++) {
-			int offset = i * PURPLE_AES_BLOCK_SIZE;
-			guchar iv_local[PURPLE_AES_BLOCK_SIZE];
-			gboolean succ;
-
-			memcpy(iv_local, iv, sizeof(iv_local));
-			succ = purple_aes_cipher_gnutls_encrypt(
-				input + offset, output + offset,
-				PURPLE_AES_BLOCK_SIZE,
-				iv_local, key, key_size,
-				PURPLE_CIPHER_BATCH_MODE_CBC);
-			if (!succ)
-				return FALSE;
-		}
-		return TRUE;
-	}
-
-	handle = purple_aes_cipher_gnutls_crypt_init(iv, key, key_size);
-	if (handle == NULL)
-		return FALSE;
-
-	ret = gnutls_cipher_encrypt2(handle, (guchar *)input, len, output, len);
-	gnutls_cipher_deinit(handle);
-
-	if (ret != 0) {
-		purple_debug_error("cipher-aes",
-			"gnutls_cipher_encrypt2 failed: %d\n", ret);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static gboolean
-purple_aes_cipher_gnutls_decrypt(const guchar *input, guchar *output, size_t len,
-	guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32], guint key_size,
-	PurpleCipherBatchMode batch_mode)
-{
-	gnutls_cipher_hd_t handle;
-	int ret;
-
-	/* We have to simulate ECB mode, which is not supported by GnuTLS. */
-	if (batch_mode == PURPLE_CIPHER_BATCH_MODE_ECB) {
-		size_t i;
-		for (i = 0; i < len / PURPLE_AES_BLOCK_SIZE; i++) {
-			int offset = i * PURPLE_AES_BLOCK_SIZE;
-			guchar iv_local[PURPLE_AES_BLOCK_SIZE];
-			gboolean succ;
-
-			memcpy(iv_local, iv, sizeof(iv_local));
-			succ = purple_aes_cipher_gnutls_decrypt(
-				input + offset, output + offset,
-				PURPLE_AES_BLOCK_SIZE,
-				iv_local, key, key_size,
-				PURPLE_CIPHER_BATCH_MODE_CBC);
-			if (!succ)
-				return FALSE;
-		}
-		return TRUE;
-	}
-
-	handle = purple_aes_cipher_gnutls_crypt_init(iv, key, key_size);
-	if (handle == NULL)
-		return FALSE;
-
-	ret = gnutls_cipher_decrypt2(handle, input, len, output, len);
-	gnutls_cipher_deinit(handle);
-
-	if (ret != 0) {
-		purple_debug_error("cipher-aes",
-			"gnutls_cipher_decrypt2 failed: %d\n", ret);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-#elif defined(PURPLE_AES_USE_NSS)
-
-typedef struct {
-	PK11SlotInfo *slot;
-	PK11SymKey *sym_key;
-	SECItem *sec_param;
-	PK11Context *enc_context;
-} PurpleAESCipherNSSContext;
-
-static void
-purple_aes_cipher_nss_cleanup(PurpleAESCipherNSSContext *context)
-{
-	g_return_if_fail(context != NULL);
-
-	if (context->enc_context != NULL)
-		PK11_DestroyContext(context->enc_context, TRUE);
-	if (context->sec_param != NULL)
-		SECITEM_FreeItem(context->sec_param, TRUE);
-	if (context->sym_key != NULL)
-		PK11_FreeSymKey(context->sym_key);
-	if (context->slot != NULL)
-		PK11_FreeSlot(context->slot);
-
-	memset(context, 0, sizeof(PurpleAESCipherNSSContext));
-}
-
-static gboolean
-purple_aes_cipher_nss_crypt(const guchar *input, guchar *output, size_t len,
-	guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32], guint key_size,
-	CK_ATTRIBUTE_TYPE operation, CK_MECHANISM_TYPE cipher_mech)
-{
-	PurpleAESCipherNSSContext context;
-	SECItem key_item, iv_item;
-	SECStatus ret;
-	int outlen = 0;
-	unsigned int outlen_tmp = 0;
-
-	memset(&context, 0, sizeof(PurpleAESCipherNSSContext));
-
-	if (NSS_NoDB_Init(NULL) != SECSuccess) {
-		purple_debug_error("cipher-aes",
-			"NSS_NoDB_Init failed: %d\n", PR_GetError());
-		return FALSE;
-	}
-
-	context.slot = PK11_GetBestSlot(cipher_mech, NULL);
-	if (context.slot == NULL) {
-		purple_debug_error("cipher-aes",
-			"PK11_GetBestSlot failed: %d\n", PR_GetError());
-		return FALSE;
-	}
-
-	key_item.type = siBuffer;
-	key_item.data = key;
-	key_item.len = key_size;
-	context.sym_key = PK11_ImportSymKey(context.slot, cipher_mech,
-		PK11_OriginUnwrap, CKA_ENCRYPT, &key_item, NULL);
-	if (context.sym_key == NULL) {
-		purple_debug_error("cipher-aes",
-			"PK11_ImportSymKey failed: %d\n", PR_GetError());
-		purple_aes_cipher_nss_cleanup(&context);
-		return FALSE;
-	}
-
-	iv_item.type = siBuffer;
-	iv_item.data = iv;
-	iv_item.len = PURPLE_AES_BLOCK_SIZE;
-	context.sec_param = PK11_ParamFromIV(cipher_mech, &iv_item);
-	if (context.sec_param == NULL) {
-		purple_debug_error("cipher-aes",
-			"PK11_ParamFromIV failed: %d\n", PR_GetError());
-		purple_aes_cipher_nss_cleanup(&context);
-		return FALSE;
-	}
-
-	context.enc_context = PK11_CreateContextBySymKey(cipher_mech, operation,
-		context.sym_key, context.sec_param);
-	if (context.enc_context == NULL) {
-		purple_debug_error("cipher-aes",
-			"PK11_CreateContextBySymKey failed: %d\n",
-				PR_GetError());
-		purple_aes_cipher_nss_cleanup(&context);
-		return FALSE;
-	}
-
-	ret = PK11_CipherOp(context.enc_context, output, &outlen, len,
-			(guchar *)input, len);
-	if (ret != SECSuccess) {
-		purple_debug_error("cipher-aes",
-			"PK11_CipherOp failed: %d\n", PR_GetError());
-		purple_aes_cipher_nss_cleanup(&context);
-		return FALSE;
-	}
-
-	ret = PK11_DigestFinal(context.enc_context, output + outlen, &outlen_tmp,
-		len - outlen);
-	if (ret != SECSuccess) {
-		purple_debug_error("cipher-aes",
-			"PK11_DigestFinal failed: %d\n", PR_GetError());
-		purple_aes_cipher_nss_cleanup(&context);
-		return FALSE;
-	}
-
-	purple_aes_cipher_nss_cleanup(&context);
-
-	outlen += outlen_tmp;
-	if (outlen != (int)len) {
-		purple_debug_error("cipher-aes",
-			"resulting length doesn't match: %d (expected: %"
-			G_GSIZE_FORMAT ")\n", outlen, len);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static CK_MECHANISM_TYPE
-purple_aes_cipher_nss_batch_mode(PurpleCipherBatchMode batch_mode)
-{
-	switch (batch_mode) {
-		case PURPLE_CIPHER_BATCH_MODE_CBC:
-			return CKM_AES_CBC;
-		case PURPLE_CIPHER_BATCH_MODE_ECB:
-			return CKM_AES_ECB;
-	}
-
-	return CKM_AES_CBC;
-}
-
-static gboolean
-purple_aes_cipher_nss_encrypt(const guchar *input, guchar *output, size_t len,
-	guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32], guint key_size,
-	PurpleCipherBatchMode batch_mode)
-{
-	return purple_aes_cipher_nss_crypt(input, output, len, iv, key, key_size,
-		CKA_ENCRYPT, purple_aes_cipher_nss_batch_mode(batch_mode));
-}
-
-static gboolean
-purple_aes_cipher_nss_decrypt(const guchar *input, guchar *output, size_t len,
-	guchar iv[PURPLE_AES_BLOCK_SIZE], guchar key[32], guint key_size,
-	PurpleCipherBatchMode batch_mode)
-{
-	return purple_aes_cipher_nss_crypt(input, output, len, iv, key, key_size,
-		CKA_DECRYPT, purple_aes_cipher_nss_batch_mode(batch_mode));
-}
-
-#endif /* PURPLE_AES_USE_NSS */
-
-static ssize_t
-purple_aes_cipher_encrypt(PurpleCipher *cipher, const guchar input[],
-	size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-	purple_aes_cipher_crypt_func encrypt_func;
-	guchar *input_padded;
-	size_t out_len = 0;
-	gboolean succ;
-
-	if (priv->failure)
-		return -1;
-
-	input_padded = purple_aes_cipher_pad_pkcs7(input, in_len, &out_len);
-
-	if (out_len > out_size) {
-		purple_debug_error("cipher-aes", "Output buffer too small (%"
-			G_GSIZE_FORMAT " > %" G_GSIZE_FORMAT ")",
-			out_len, out_size);
-		memset(input_padded, 0, out_len);
-		g_free(input_padded);
-		return -1;
-	}
-
-#if defined(PURPLE_AES_USE_GNUTLS)
-	encrypt_func = purple_aes_cipher_gnutls_encrypt;
-#elif defined(PURPLE_AES_USE_NSS)
-	encrypt_func = purple_aes_cipher_nss_encrypt;
-#else
-	purple_debug_error("cipher-aes", "No matching encrypt_func\n");
-	return -1;
-#endif
-
-	succ = encrypt_func(input_padded, output, out_len, priv->iv,
-		priv->key, priv->key_size, priv->batch_mode);
-
-	memset(input_padded, 0, out_len);
-	g_free(input_padded);
-
-	if (!succ) {
-		memset(output, 0, out_len);
-		return -1;
-	}
-
-	return out_len;
-}
-
-static ssize_t
-purple_aes_cipher_decrypt(PurpleCipher *cipher, const guchar input[],
-	size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-	purple_aes_cipher_crypt_func decrypt_func;
-	gboolean succ;
-	ssize_t out_len;
-
-	if (priv->failure)
-		return -1;
-
-	if (in_len > out_size) {
-		purple_debug_error("cipher-aes", "Output buffer too small\n");
-		return -1;
-	}
-
-	if ((in_len % PURPLE_AES_BLOCK_SIZE) != 0 || in_len == 0) {
-		purple_debug_error("cipher-aes", "Malformed data\n");
-		return -1;
-	}
-
-#if defined(PURPLE_AES_USE_GNUTLS)
-	decrypt_func = purple_aes_cipher_gnutls_decrypt;
-#elif defined(PURPLE_AES_USE_NSS)
-	decrypt_func = purple_aes_cipher_nss_decrypt;
-#else
-	purple_debug_error("cipher-aes", "No matching decrypt_func\n");
-	return -1;
-#endif
-
-	succ = decrypt_func(input, output, in_len, priv->iv, priv->key,
-		priv->key_size, priv->batch_mode);
-
-	if (!succ) {
-		memset(output, 0, in_len);
-		return -1;
-	}
-
-	out_len = purple_aes_cipher_unpad_pkcs7(output, in_len);
-	if (out_len < 0) {
-		memset(output, 0, in_len);
-		return -1;
-	}
-
-	return out_len;
-}
-
-static size_t
-purple_aes_cipher_get_key_size(PurpleCipher *cipher)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-
-	return priv->key_size;
-}
-
-static void
-purple_aes_cipher_set_batch_mode(PurpleCipher *cipher,
-	PurpleCipherBatchMode mode)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-
-	if (mode != PURPLE_CIPHER_BATCH_MODE_CBC &&
-		mode != PURPLE_CIPHER_BATCH_MODE_ECB)
-	{
-		purple_debug_error("cipher-aes", "unsupported batch mode\n");
-		priv->failure = TRUE;
-	}
-
-	priv->batch_mode = mode;
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_BATCH_MODE]);
-}
-
-static PurpleCipherBatchMode
-purple_aes_cipher_get_batch_mode(PurpleCipher *cipher)
-{
-	PurpleAESCipherPrivate *priv = PURPLE_AES_CIPHER_GET_PRIVATE(cipher);
-
-	return priv->batch_mode;
-}
-
-static size_t
-purple_aes_cipher_get_block_size(PurpleCipher *cipher)
-{
-	return PURPLE_AES_BLOCK_SIZE;
-}
-
-/******************************************************************************
- * Object Stuff
- *****************************************************************************/
-static void
-purple_aes_cipher_get_property(GObject *obj, guint param_id, GValue *value,
-								GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_BATCH_MODE:
-			g_value_set_enum(value,
-							 purple_cipher_get_batch_mode(cipher));
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_aes_cipher_set_property(GObject *obj, guint param_id,
-								const GValue *value, GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_BATCH_MODE:
-			purple_cipher_set_batch_mode(cipher,
-										 g_value_get_enum(value));
-			break;
-		case PROP_IV:
-			{
-				guchar *iv = (guchar *)g_value_get_string(value);
-				purple_cipher_set_iv(cipher, iv, strlen((gchar*)iv));
-			}
-			break;
-		case PROP_KEY:
-			purple_cipher_set_key(cipher, (guchar *)g_value_get_string(value),
-				purple_aes_cipher_get_key_size(cipher));
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_aes_cipher_class_init(PurpleAESCipherClass *klass) {
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-	PurpleCipherClass *cipher_class = PURPLE_CIPHER_CLASS(klass);
-
-	obj_class->get_property = purple_aes_cipher_get_property;
-	obj_class->set_property = purple_aes_cipher_set_property;
-
-	cipher_class->reset = purple_aes_cipher_reset;
-	cipher_class->set_iv = purple_aes_cipher_set_iv;
-	cipher_class->encrypt = purple_aes_cipher_encrypt;
-	cipher_class->decrypt = purple_aes_cipher_decrypt;
-	cipher_class->set_key = purple_aes_cipher_set_key;
-	cipher_class->get_key_size = purple_aes_cipher_get_key_size;
-	cipher_class->set_batch_mode = purple_aes_cipher_set_batch_mode;
-	cipher_class->get_batch_mode = purple_aes_cipher_get_batch_mode;
-	cipher_class->get_block_size = purple_aes_cipher_get_block_size;
-
-	g_type_class_add_private(klass, sizeof(PurpleAESCipherPrivate));
-
-	properties[PROP_BATCH_MODE] = g_param_spec_enum("batch-mode",
-		"batch-mode", "batch-mode", PURPLE_TYPE_CIPHER_BATCH_MODE,
-		PURPLE_CIPHER_BATCH_MODE_CBC,
-		G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_IV] = g_param_spec_string("iv", "iv", "iv", NULL,
-								G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_KEY] = g_param_spec_string("key", "key", "key", NULL,
-								G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
-
-	g_object_class_install_properties(obj_class, PROP_LAST, properties);
-}
-
-static void
-purple_aes_cipher_init(PurpleCipher *cipher) {
-	purple_cipher_reset(cipher);
-}
-
-/******************************************************************************
- * API
- *****************************************************************************/
-GType
-purple_aes_cipher_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurpleAESCipherClass),
-			NULL,
-			NULL,
-			(GClassInitFunc)purple_aes_cipher_class_init,
-			NULL,
-			NULL,
-			sizeof(PurpleAESCipher),
-			0,
-			(GInstanceInitFunc)purple_aes_cipher_init,
-			NULL
-		};
-
-		type = g_type_register_static(PURPLE_TYPE_CIPHER,
-									  "PurpleAESCipher",
-									  &info, 0);
-	}
-
-	return type;
-}
-
-PurpleCipher *
-purple_aes_cipher_new(void) {
-	return g_object_new(PURPLE_TYPE_AES_CIPHER, NULL);
-}
--- a/libpurple/ciphers/aescipher.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#ifndef PURPLE_AES_CIPHER_H
-#define PURPLE_AES_CIPHER_H
-/**
- * SECTION:aescipher
- * @section_id: libpurple-aescipher
- * @short_description: <filename>ciphers/aescipher.h</filename>
- * @title: AES Cipher
- */
-
-#include "cipher.h"
-
-#define PURPLE_TYPE_AES_CIPHER				(purple_aes_cipher_get_type())
-#define PURPLE_AES_CIPHER(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_AES_CIPHER, PurpleAESCipher))
-#define PURPLE_AES_CIPHER_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_AES_CIPHER, PurpleAESCipherClass))
-#define PURPLE_IS_AES_CIPHER(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_AES_CIPHER))
-#define PURPLE_IS_AES_CIPHER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((obj), PURPLE_TYPE_AES_CIPHER))
-#define PURPLE_AES_CIPHER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_AES_CIPHER, PurpleAESCipherClass))
-
-typedef struct _PurpleAESCipher			PurpleAESCipher;
-typedef struct _PurpleAESCipherClass		PurpleAESCipherClass;
-
-struct _PurpleAESCipher {
-	PurpleCipher gparent;
-};
-
-struct _PurpleAESCipherClass {
-	PurpleCipherClass gparent;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-GType purple_aes_cipher_get_type(void);
-
-PurpleCipher *purple_aes_cipher_new(void);
-
-G_END_DECLS
-
-#endif /* PURPLE_AES_CIPHER_H */
--- a/libpurple/ciphers/des3cipher.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,524 +0,0 @@
-/*
- * Original des taken from gpg
- *
- * des.c - Triple-DES encryption/decryption Algorithm
- *  Copyright (C) 1998 Free Software Foundation, Inc.
- *
- *  Please see below for more legal information!
- *  
- *   According to the definition of DES in FIPS PUB 46-2 from December 1993.
- *   For a description of triple encryption, see:
- *     Bruce Schneier: Applied Cryptography. Second Edition.
- *     John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff.
- *  
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-#include "internal.h"
-#include "glibcompat.h"
-
-#include "des3cipher.h"
-#include "descipher.h"
-#include "enums.h"
-
-#include <string.h>
-
-/******************************************************************************
- * Structs
- *****************************************************************************/
-
-#define PURPLE_DES3_CIPHER_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_DES3_CIPHER, PurpleDES3CipherPrivate))
-
-typedef struct _PurpleDES3CipherPrivate		PurpleDES3CipherPrivate;
-struct _PurpleDES3CipherPrivate
-{
-	PurpleCipherBatchMode mode;
-	guchar iv[8];
-	/* First key for encryption */
-	PurpleCipher *key1;
-	/* Second key for decryption */
-	PurpleCipher *key2;
-	/* Third key for encryption */
-	PurpleCipher *key3;
-};
-
-/******************************************************************************
- * Enums
- *****************************************************************************/
-enum {
-	PROP_NONE,
-	PROP_BATCH_MODE,
-	PROP_IV,
-	PROP_KEY,
-	PROP_LAST,
-};
-
-/******************************************************************************
- * Globals
- *****************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GParamSpec *properties[PROP_LAST];
-
-/******************************************************************************
- * Cipher Stuff
- *****************************************************************************/
-
-static size_t
-purple_des3_cipher_get_key_size(PurpleCipher *cipher)
-{
-	return 24;
-}
-
-/*
- *  Fill a DES3 context with subkeys calculated from 3 64bit key.
- *  Does not check parity bits, but simply ignore them.
- *  Does not check for weak keys.
- **/
-static void
-purple_des3_cipher_set_key(PurpleCipher *cipher, const guchar *key, size_t len)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	g_return_if_fail(len == 24);
-
-	purple_cipher_set_key(PURPLE_CIPHER(priv->key1), key +  0,
-					purple_cipher_get_key_size(PURPLE_CIPHER(priv->key1)));
-	purple_cipher_set_key(PURPLE_CIPHER(priv->key2), key +  8,
-					purple_cipher_get_key_size(PURPLE_CIPHER(priv->key2)));
-	purple_cipher_set_key(PURPLE_CIPHER(priv->key3), key + 16,
-					purple_cipher_get_key_size(PURPLE_CIPHER(priv->key3)));
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_KEY]);
-}
-
-static ssize_t
-purple_des3_cipher_ecb_encrypt(PurpleDES3Cipher *des3_cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	gsize offset = 0;
-	int i = 0;
-	gsize tmp;
-	guint8 buf[8] = {0,0,0,0,0,0,0,0};
-	gsize out_len;
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	while (offset + 8 <= in_len) {
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									input + offset, output + offset, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									buf, output + offset, 0);
-
-		offset += 8;
-	}
-
-	out_len = in_len;
-	if (offset < in_len) {
-		g_return_val_if_fail(in_len >= offset, -1);
-		out_len += in_len - offset;
-		g_return_val_if_fail(out_size >= out_len, -1);
-		tmp = offset;
-		memset(buf, 0, 8);
-		while (tmp < in_len) {
-			buf[i++] = input[tmp];
-			tmp++;
-		}
-
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									buf, output + offset, 0);
-	}
-
-	return out_len;
-}
-
-static ssize_t
-purple_des3_cipher_cbc_encrypt(PurpleDES3Cipher *des3_cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	gsize offset = 0;
-	int i = 0;
-	gsize tmp;
-	guint8 buf[8];
-	gsize out_len;
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	memcpy(buf, priv->iv, 8);
-
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	while (offset + 8 <= in_len) {
-		for (i = 0; i < 8; i++)
-			buf[i] ^= input[offset + i];
-
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									buf, output + offset, 0);
-
-		memcpy(buf, output+offset, 8);
-		offset += 8;
-	}
-
-	out_len = in_len;
-	if (offset < in_len) {
-		g_return_val_if_fail(in_len >= offset, -1);
-		out_len += in_len - offset;
-		g_return_val_if_fail(out_size >= out_len, -1);
-		tmp = offset;
-		i = 0;
-		while (tmp < in_len) {
-			buf[i++] ^= input[tmp];
-			tmp++;
-		}
-
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									buf, output + offset, 0);
-	}
-
-	return out_len;
-}
-
-static ssize_t
-purple_des3_cipher_encrypt(PurpleCipher *cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	if (priv->mode == PURPLE_CIPHER_BATCH_MODE_ECB) {
-		return purple_des3_cipher_ecb_encrypt(des3_cipher, input, in_len, output, out_size);
-	} else if (priv->mode == PURPLE_CIPHER_BATCH_MODE_CBC) {
-		return purple_des3_cipher_cbc_encrypt(des3_cipher, input, in_len, output, out_size);
-	} else {
-		g_return_val_if_reached(0);
-	}
-
-	return 0;
-}
-
-static ssize_t
-purple_des3_cipher_ecb_decrypt(PurpleDES3Cipher *des3_cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	gsize offset = 0;
-	int i = 0;
-	gsize tmp;
-	guint8 buf[8] = {0,0,0,0,0,0,0,0};
-	gsize out_len;
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	while (offset + 8 <= in_len) {
-		/* NOTE: Apply key in reverse */
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									input + offset, output + offset, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 1);
-
-		offset += 8;
-	}
-
-	out_len = in_len;
-	if (offset < in_len) {
-		g_return_val_if_fail(in_len >= offset, -1);
-		out_len += in_len - offset;
-		g_return_val_if_fail(out_size >= out_len, -1);
-		tmp = offset;
-		memset(buf, 0, 8);
-		while (tmp < in_len) {
-			buf[i++] = input[tmp];
-			tmp++;
-		}
-
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									buf, output + offset, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 1);
-	}
-
-	return out_len;
-}
-
-static ssize_t
-purple_des3_cipher_cbc_decrypt(PurpleDES3Cipher *des3_cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	gsize offset = 0;
-	int i = 0;
-	gsize tmp;
-	guint8 buf[8] = {0,0,0,0,0,0,0,0};
-	guint8 link[8];
-	gsize out_len;
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	memcpy(link, priv->iv, 8);
-	while (offset + 8 <= in_len) {
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									input + offset, output + offset, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 1);
-
-		for (i = 0; i < 8; i++)
-			output[offset + i] ^= link[i];
-
-		memcpy(link, input + offset, 8);
-
-		offset+=8;
-	}
-
-	out_len = in_len;
-	if(offset<in_len) {
-		g_return_val_if_fail(in_len >= offset, -1);
-		out_len += in_len - offset;
-		g_return_val_if_fail(out_size >= out_len, -1);
-		tmp = offset;
-		memset(buf, 0, 8);
-		i = 0;
-		while(tmp<in_len) {
-			buf[i++] = input[tmp];
-			tmp++;
-		}
-
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key3),
-									buf, output + offset, 1);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key2),
-									output + offset, buf, 0);
-		purple_des_cipher_ecb_crypt(PURPLE_DES_CIPHER(priv->key1),
-									buf, output + offset, 1);
-
-		for (i = 0; i < 8; i++)
-			output[offset + i] ^= link[i];
-	}
-
-	return out_len;
-}
-
-static ssize_t
-purple_des3_cipher_decrypt(PurpleCipher *cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(cipher);
-
-	if (priv->mode == PURPLE_CIPHER_BATCH_MODE_ECB) {
-		return purple_des3_cipher_ecb_decrypt(des3_cipher, input, in_len, output, out_size);
-	} else if (priv->mode == PURPLE_CIPHER_BATCH_MODE_CBC) {
-		return purple_des3_cipher_cbc_decrypt(des3_cipher, input, in_len, output, out_size);
-	} else {
-		g_return_val_if_reached(0);
-	}
-
-	return 0;
-}
-
-static void
-purple_des3_cipher_set_batch_mode(PurpleCipher *cipher, PurpleCipherBatchMode mode)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	priv->mode = mode;
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_BATCH_MODE]);
-}
-
-static PurpleCipherBatchMode
-purple_des3_cipher_get_batch_mode(PurpleCipher *cipher)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	return priv->mode;
-}
-
-static void
-purple_des3_cipher_set_iv(PurpleCipher *cipher, guchar *iv, size_t len)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	g_return_if_fail(len == 8);
-
-	memcpy(priv->iv, iv, len);
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_IV]);
-}
-
-/******************************************************************************
- * Object Stuff
- *****************************************************************************/
-static void
-purple_des3_cipher_get_property(GObject *obj, guint param_id, GValue *value,
-								GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_BATCH_MODE:
-			g_value_set_enum(value,
-							 purple_cipher_get_batch_mode(cipher));
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_des3_cipher_set_property(GObject *obj, guint param_id,
-								const GValue *value, GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_BATCH_MODE:
-			purple_cipher_set_batch_mode(cipher,
-										 g_value_get_enum(value));
-			break;
-		case PROP_IV:
-			{
-				guchar *iv = (guchar *)g_value_get_string(value);
-				purple_cipher_set_iv(cipher, iv, strlen((gchar*)iv));
-			}
-			break;
-		case PROP_KEY:
-			purple_cipher_set_key(cipher, (guchar *)g_value_get_string(value),
-				purple_des3_cipher_get_key_size(cipher));
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_des3_cipher_finalize(GObject *obj)
-{
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(obj);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	g_object_unref(G_OBJECT(priv->key1));
-	g_object_unref(G_OBJECT(priv->key2));
-	g_object_unref(G_OBJECT(priv->key3));
-
-	memset(priv->iv, 0, sizeof(priv->iv));
-
-	parent_class->finalize(obj);
-}
-
-static void
-purple_des3_cipher_class_init(PurpleDES3CipherClass *klass) {
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-	PurpleCipherClass *cipher_class = PURPLE_CIPHER_CLASS(klass);
-
-	parent_class = g_type_class_peek_parent(klass);
-
-	obj_class->finalize = purple_des3_cipher_finalize;
-	obj_class->get_property = purple_des3_cipher_get_property;
-	obj_class->set_property = purple_des3_cipher_set_property;
-
-	cipher_class->set_iv = purple_des3_cipher_set_iv;
-	cipher_class->encrypt = purple_des3_cipher_encrypt;
-	cipher_class->decrypt = purple_des3_cipher_decrypt;
-	cipher_class->set_key = purple_des3_cipher_set_key;
-	cipher_class->set_batch_mode = purple_des3_cipher_set_batch_mode;
-	cipher_class->get_batch_mode = purple_des3_cipher_get_batch_mode;
-	cipher_class->get_key_size = purple_des3_cipher_get_key_size;
-
-	g_type_class_add_private(klass, sizeof(PurpleDES3CipherPrivate));
-
-	properties[PROP_BATCH_MODE] = g_param_spec_enum("batch-mode", "batch-mode",
-							  "batch-mode", PURPLE_TYPE_CIPHER_BATCH_MODE, 0,
-							  G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_IV] = g_param_spec_string("iv", "iv", "iv", NULL,
-								G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_KEY] = g_param_spec_string("key", "key", "key", NULL,
-								G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
-
-	g_object_class_install_properties(obj_class, PROP_LAST, properties);
-}
-
-static void
-purple_des3_cipher_init(PurpleCipher *cipher) {
-	PurpleDES3Cipher *des3_cipher = PURPLE_DES3_CIPHER(cipher);
-	PurpleDES3CipherPrivate *priv = PURPLE_DES3_CIPHER_GET_PRIVATE(des3_cipher);
-
-	priv->key1 = purple_des_cipher_new();
-	priv->key2 = purple_des_cipher_new();
-	priv->key3 = purple_des_cipher_new();
-}
-
-/******************************************************************************
- * API
- *****************************************************************************/
-GType
-purple_des3_cipher_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurpleDES3CipherClass),
-			NULL,
-			NULL,
-			(GClassInitFunc)purple_des3_cipher_class_init,
-			NULL,
-			NULL,
-			sizeof(PurpleDES3Cipher),
-			0,
-			(GInstanceInitFunc)purple_des3_cipher_init,
-			NULL
-		};
-
-		type = g_type_register_static(PURPLE_TYPE_CIPHER,
-									  "PurpleDES3Cipher",
-									  &info, 0);
-	}
-
-	return type;
-}
-
-PurpleCipher *
-purple_des3_cipher_new(void) {
-	return g_object_new(PURPLE_TYPE_DES3_CIPHER, NULL);
-}
--- a/libpurple/ciphers/des3cipher.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#ifndef PURPLE_DES3_CIPHER_H
-#define PURPLE_DES3_CIPHER_H
-/**
- * SECTION:des3cipher
- * @section_id: libpurple-des3cipher
- * @short_description: <filename>ciphers/des3cipher.h</filename>
- * @title: Triple-DES Cipher
- */
-
-#include "cipher.h"
-
-#define PURPLE_TYPE_DES3_CIPHER				(purple_des3_cipher_get_type())
-#define PURPLE_DES3_CIPHER(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_DES3_CIPHER, PurpleDES3Cipher))
-#define PURPLE_DES3_CIPHER_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_DES3_CIPHER, PurpleDES3CipherClass))
-#define PURPLE_IS_DES3_CIPHER(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_DES3_CIPHER))
-#define PURPLE_IS_DES3_CIPHER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((obj), PURPLE_TYPE_DES3_CIPHER))
-#define PURPLE_DES3_CIPHER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_DES3_CIPHER, PurpleDES3CipherClass))
-
-typedef struct _PurpleDES3Cipher			PurpleDES3Cipher;
-typedef struct _PurpleDES3CipherClass		PurpleDES3CipherClass;
-
-struct _PurpleDES3Cipher {
-	PurpleCipher gparent;
-};
-
-struct _PurpleDES3CipherClass {
-	PurpleCipherClass gparent;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-GType purple_des3_cipher_get_type(void);
-
-PurpleCipher *purple_des3_cipher_new(void);
-
-G_END_DECLS
-
-#endif /* PURPLE_DES3_CIPHER_H */
-
--- a/libpurple/ciphers/descipher.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,581 +0,0 @@
-/*
- * Original des taken from gpg
- *
- * des.c - DES encryption/decryption Algorithm
- *  Copyright (C) 1998 Free Software Foundation, Inc.
- *
- *  Please see below for more legal information!
- *
- *   According to the definition of DES in FIPS PUB 46-2 from December 1993.
- *   For a description of triple encryption, see:
- *     Bruce Schneier: Applied Cryptography. Second Edition.
- *     John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff.
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-#include "internal.h"
-#include "glibcompat.h"
-
-#include "descipher.h"
-#include "enums.h"
-
-#include <string.h>
-
-/******************************************************************************
- * Structs
- *****************************************************************************/
-#define PURPLE_DES_CIPHER_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_DES_CIPHER, PurpleDESCipherPrivate))
-
-typedef struct {
-	guint32 encrypt_subkeys[32];
-	guint32 decrypt_subkeys[32];
-} PurpleDESCipherPrivate;
-
-/******************************************************************************
- * Enums
- *****************************************************************************/
-enum {
-	PROP_NONE,
-	PROP_KEY,
-	PROP_LAST,
-};
-
-/******************************************************************************
- * Globals
- *****************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GParamSpec *properties[PROP_LAST];
-
-/*
- *  The s-box values are permuted according to the 'primitive function P'
- */
-static guint32 sbox1[64] = {
-	0x00808200, 0x00000000, 0x00008000, 0x00808202, 0x00808002, 0x00008202,
-	0x00000002, 0x00008000, 0x00000200, 0x00808200, 0x00808202, 0x00000200,
-	0x00800202, 0x00808002, 0x00800000, 0x00000002, 0x00000202, 0x00800200,
-	0x00800200, 0x00008200, 0x00008200, 0x00808000, 0x00808000, 0x00800202,
-	0x00008002, 0x00800002, 0x00800002, 0x00008002, 0x00000000, 0x00000202,
-	0x00008202, 0x00800000, 0x00008000, 0x00808202, 0x00000002, 0x00808000,
-	0x00808200, 0x00800000, 0x00800000, 0x00000200, 0x00808002, 0x00008000,
-	0x00008200, 0x00800002, 0x00000200, 0x00000002, 0x00800202, 0x00008202,
-	0x00808202, 0x00008002, 0x00808000, 0x00800202, 0x00800002, 0x00000202,
-	0x00008202, 0x00808200, 0x00000202, 0x00800200, 0x00800200, 0x00000000,
-	0x00008002, 0x00008200, 0x00000000, 0x00808002
-};
-
-static guint32 sbox2[64] = {
-	0x40084010, 0x40004000, 0x00004000, 0x00084010, 0x00080000, 0x00000010,
-	0x40080010, 0x40004010, 0x40000010, 0x40084010, 0x40084000, 0x40000000,
-	0x40004000, 0x00080000, 0x00000010, 0x40080010, 0x00084000, 0x00080010,
-	0x40004010, 0x00000000, 0x40000000, 0x00004000, 0x00084010, 0x40080000,
-	0x00080010, 0x40000010, 0x00000000, 0x00084000, 0x00004010, 0x40084000,
-	0x40080000, 0x00004010, 0x00000000, 0x00084010, 0x40080010, 0x00080000,
-	0x40004010, 0x40080000, 0x40084000, 0x00004000, 0x40080000, 0x40004000,
-	0x00000010, 0x40084010, 0x00084010, 0x00000010, 0x00004000, 0x40000000,
-	0x00004010, 0x40084000, 0x00080000, 0x40000010, 0x00080010, 0x40004010,
-	0x40000010, 0x00080010, 0x00084000, 0x00000000, 0x40004000, 0x00004010,
-	0x40000000, 0x40080010, 0x40084010, 0x00084000
-};
-
-static guint32 sbox3[64] = {
-	0x00000104, 0x04010100, 0x00000000, 0x04010004, 0x04000100, 0x00000000,
-	0x00010104, 0x04000100, 0x00010004, 0x04000004, 0x04000004, 0x00010000,
-	0x04010104, 0x00010004, 0x04010000, 0x00000104, 0x04000000, 0x00000004,
-	0x04010100, 0x00000100, 0x00010100, 0x04010000, 0x04010004, 0x00010104,
-	0x04000104, 0x00010100, 0x00010000, 0x04000104, 0x00000004, 0x04010104,
-	0x00000100, 0x04000000, 0x04010100, 0x04000000, 0x00010004, 0x00000104,
-	0x00010000, 0x04010100, 0x04000100, 0x00000000, 0x00000100, 0x00010004,
-	0x04010104, 0x04000100, 0x04000004, 0x00000100, 0x00000000, 0x04010004,
-	0x04000104, 0x00010000, 0x04000000, 0x04010104, 0x00000004, 0x00010104,
-	0x00010100, 0x04000004, 0x04010000, 0x04000104, 0x00000104, 0x04010000,
-	0x00010104, 0x00000004, 0x04010004, 0x00010100
-};
-
-static guint32 sbox4[64] = {
-	0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x00401040, 0x80400040,
-	0x80400000, 0x80001000, 0x00000000, 0x00401000, 0x00401000, 0x80401040,
-	0x80000040, 0x00000000, 0x00400040, 0x80400000, 0x80000000, 0x00001000,
-	0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x80001000, 0x00001040,
-	0x80400040, 0x80000000, 0x00001040, 0x00400040, 0x00001000, 0x00401040,
-	0x80401040, 0x80000040, 0x00400040, 0x80400000, 0x00401000, 0x80401040,
-	0x80000040, 0x00000000, 0x00000000, 0x00401000, 0x00001040, 0x00400040,
-	0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x00000040,
-	0x80401040, 0x80000040, 0x80000000, 0x00001000, 0x80400000, 0x80001000,
-	0x00401040, 0x80400040, 0x80001000, 0x00001040, 0x00400000, 0x80401000,
-	0x00000040, 0x00400000, 0x00001000, 0x00401040
-};
-
-static guint32 sbox5[64] = {
-	0x00000080, 0x01040080, 0x01040000, 0x21000080, 0x00040000, 0x00000080,
-	0x20000000, 0x01040000, 0x20040080, 0x00040000, 0x01000080, 0x20040080,
-	0x21000080, 0x21040000, 0x00040080, 0x20000000, 0x01000000, 0x20040000,
-	0x20040000, 0x00000000, 0x20000080, 0x21040080, 0x21040080, 0x01000080,
-	0x21040000, 0x20000080, 0x00000000, 0x21000000, 0x01040080, 0x01000000,
-	0x21000000, 0x00040080, 0x00040000, 0x21000080, 0x00000080, 0x01000000,
-	0x20000000, 0x01040000, 0x21000080, 0x20040080, 0x01000080, 0x20000000,
-	0x21040000, 0x01040080, 0x20040080, 0x00000080, 0x01000000, 0x21040000,
-	0x21040080, 0x00040080, 0x21000000, 0x21040080, 0x01040000, 0x00000000,
-	0x20040000, 0x21000000, 0x00040080, 0x01000080, 0x20000080, 0x00040000,
-	0x00000000, 0x20040000, 0x01040080, 0x20000080
-};
-
-static guint32 sbox6[64] = {
-	0x10000008, 0x10200000, 0x00002000, 0x10202008, 0x10200000, 0x00000008,
-	0x10202008, 0x00200000, 0x10002000, 0x00202008, 0x00200000, 0x10000008,
-	0x00200008, 0x10002000, 0x10000000, 0x00002008, 0x00000000, 0x00200008,
-	0x10002008, 0x00002000, 0x00202000, 0x10002008, 0x00000008, 0x10200008,
-	0x10200008, 0x00000000, 0x00202008, 0x10202000, 0x00002008, 0x00202000,
-	0x10202000, 0x10000000, 0x10002000, 0x00000008, 0x10200008, 0x00202000,
-	0x10202008, 0x00200000, 0x00002008, 0x10000008, 0x00200000, 0x10002000,
-	0x10000000, 0x00002008, 0x10000008, 0x10202008, 0x00202000, 0x10200000,
-	0x00202008, 0x10202000, 0x00000000, 0x10200008, 0x00000008, 0x00002000,
-	0x10200000, 0x00202008, 0x00002000, 0x00200008, 0x10002008, 0x00000000,
-	0x10202000, 0x10000000, 0x00200008, 0x10002008
-};
-
-static guint32 sbox7[64] = {
-	0x00100000, 0x02100001, 0x02000401, 0x00000000, 0x00000400, 0x02000401,
-	0x00100401, 0x02100400, 0x02100401, 0x00100000, 0x00000000, 0x02000001,
-	0x00000001, 0x02000000, 0x02100001, 0x00000401, 0x02000400, 0x00100401,
-	0x00100001, 0x02000400, 0x02000001, 0x02100000, 0x02100400, 0x00100001,
-	0x02100000, 0x00000400, 0x00000401, 0x02100401, 0x00100400, 0x00000001,
-	0x02000000, 0x00100400, 0x02000000, 0x00100400, 0x00100000, 0x02000401,
-	0x02000401, 0x02100001, 0x02100001, 0x00000001, 0x00100001, 0x02000000,
-	0x02000400, 0x00100000, 0x02100400, 0x00000401, 0x00100401, 0x02100400,
-	0x00000401, 0x02000001, 0x02100401, 0x02100000, 0x00100400, 0x00000000,
-	0x00000001, 0x02100401, 0x00000000, 0x00100401, 0x02100000, 0x00000400,
-	0x02000001, 0x02000400, 0x00000400, 0x00100001
-};
-
-static guint32 sbox8[64] = {
-	0x08000820, 0x00000800, 0x00020000, 0x08020820, 0x08000000, 0x08000820,
-	0x00000020, 0x08000000, 0x00020020, 0x08020000, 0x08020820, 0x00020800,
-	0x08020800, 0x00020820, 0x00000800, 0x00000020, 0x08020000, 0x08000020,
-	0x08000800, 0x00000820, 0x00020800, 0x00020020, 0x08020020, 0x08020800,
-	0x00000820, 0x00000000, 0x00000000, 0x08020020, 0x08000020, 0x08000800,
-	0x00020820, 0x00020000, 0x00020820, 0x00020000, 0x08020800, 0x00000800,
-	0x00000020, 0x08020020, 0x00000800, 0x00020820, 0x08000800, 0x00000020,
-	0x08000020, 0x08020000, 0x08020020, 0x08000000, 0x00020000, 0x08000820,
-	0x00000000, 0x08020820, 0x00020020, 0x08000020, 0x08020000, 0x08000800,
-	0x08000820, 0x00000000, 0x08020820, 0x00020800, 0x00020800, 0x00000820,
-	0x00000820, 0x00020020, 0x08000000, 0x08020800
-};
-
-/*
- * These two tables are part of the 'permuted choice 1' function.
- * In this implementation several speed improvements are done.
- */
-static guint32 leftkey_swap[16] = {
-	0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00010000, 0x00010001,
-	0x00010100, 0x00010101, 0x01000000, 0x01000001, 0x01000100, 0x01000101,
-	0x01010000, 0x01010001, 0x01010100, 0x01010101
-};
-
-static guint32 rightkey_swap[16] = {
-	0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100,
-	0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001,
-	0x00000101, 0x01000101, 0x00010101, 0x01010101,
-};
-
-/*
- *  Numbers of left shifts per round for encryption subkey schedule
- *  To calculate the decryption key scheduling we just reverse the
- *  ordering of the subkeys so we can omit the table for decryption
- *  subkey schedule.
- */
-static guint8 encrypt_rotate_tab[16] = {
-	1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
-};
-
-
-/******************************************************************************
- * Helpers
- *****************************************************************************/
-/*
- * Macro to swap bits across two words
- */
-#define DO_PERMUTATION(a, temp, b, offset, mask)	\
-	temp = ((a>>offset) ^ b) & mask;				\
-	b ^= temp;										\
-	a ^= temp<<offset;
-
-/*
- * This performs the 'initial permutation' for the data to be encrypted or
- * decrypted
- */
-#define INITIAL_PERMUTATION(left, temp, right)			\
-	DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)	\
-	DO_PERMUTATION(left, temp, right, 16, 0x0000ffff)	\
-	DO_PERMUTATION(right, temp, left, 2, 0x33333333)	\
-	DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff)	\
-	DO_PERMUTATION(left, temp, right, 1, 0x55555555)
-
-/*
- * The 'inverse initial permutation'
- */
-#define FINAL_PERMUTATION(left, temp, right)			\
-    DO_PERMUTATION(left, temp, right, 1, 0x55555555)	\
-	DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff)	\
-	DO_PERMUTATION(right, temp, left, 2, 0x33333333)	\
-	DO_PERMUTATION(left, temp, right, 16, 0x0000ffff)	\
-	DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)
-
-/*
- * A full DES round including 'expansion function', 'sbox substitution'
- * and 'primitive function P' but without swapping the left and right word.
- */
-#define DES_ROUND(from, to, work, subkey)			\
-	work = ((from<<1) | (from>>31)) ^ *subkey++;	\
-	to ^= sbox8[  work      & 0x3f ];				\
-	to ^= sbox6[ (work>>8)  & 0x3f ];				\
-	to ^= sbox4[ (work>>16) & 0x3f ];				\
-	to ^= sbox2[ (work>>24) & 0x3f ];				\
-	work = ((from>>3) | (from<<29)) ^ *subkey++;	\
-	to ^= sbox7[  work      & 0x3f ];				\
-	to ^= sbox5[ (work>>8)  & 0x3f ];				\
-	to ^= sbox3[ (work>>16) & 0x3f ];				\
-	to ^= sbox1[ (work>>24) & 0x3f ];
-
-
-/*
- * Macros to convert 8 bytes from/to 32bit words
- */
-#define READ_64BIT_DATA(data, left, right)									\
-	left  = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];	\
-	right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
-
-#define WRITE_64BIT_DATA(data, left, right)							\
-	data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff;		\
-	data[2] = (left >> 8) &0xff; data[3] = left &0xff;				\
-	data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff;	\
-	data[6] = (right >> 8) &0xff; data[7] = right &0xff;
-
-/******************************************************************************
- * Cipher Stuff
- *****************************************************************************/
-/*
- * des_key_schedule():    Calculate 16 subkeys pairs (even/odd) for
- *            16 encryption rounds.
- *            To calculate subkeys for decryption the caller
- *                have to reorder the generated subkeys.
- *
- *        rawkey:       8 Bytes of key data
- *        subkey:       Array of at least 32 guint32s. Will be filled
- *              with calculated subkeys.
- *
- */
-static void
-purple_des_cipher_key_schedule(const guint8 * rawkey, guint32 * subkey) {
-	guint32 left, right, work;
-	int round;
-
-	READ_64BIT_DATA (rawkey, left, right)
-
-	DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f)
-	DO_PERMUTATION (right, work, left, 0, 0x10101010)
-
-	left = (leftkey_swap[(left >>  0) & 0xf] << 3)
-		 | (leftkey_swap[(left >>  8) & 0xf] << 2)
-		 | (leftkey_swap[(left >> 16) & 0xf] << 1)
-		 | (leftkey_swap[(left >> 24) & 0xf]     )
-		 | (leftkey_swap[(left >>  5) & 0xf] << 7)
-		 | (leftkey_swap[(left >> 13) & 0xf] << 6)
-		 | (leftkey_swap[(left >> 21) & 0xf] << 5)
-		 | (leftkey_swap[(left >> 29) & 0xf] << 4);
-
-	left &= 0x0fffffff;
-
-	right = (rightkey_swap[(right >>  1) & 0xf] << 3)
-		  | (rightkey_swap[(right >>  9) & 0xf] << 2)
-		  | (rightkey_swap[(right >> 17) & 0xf] << 1)
-		  | (rightkey_swap[(right >> 25) & 0xf]     )
-		  | (rightkey_swap[(right >>  4) & 0xf] << 7)
-		  | (rightkey_swap[(right >> 12) & 0xf] << 6)
-		  | (rightkey_swap[(right >> 20) & 0xf] << 5)
-		  | (rightkey_swap[(right >> 28) & 0xf] << 4);
-
-	right &= 0x0fffffff;
-
-	for (round = 0; round < 16; ++round) {
-		left = ((left << encrypt_rotate_tab[round]) |
-			    (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
-		right = ((right << encrypt_rotate_tab[round]) |
-				 (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
-
-		*subkey++ = ((left  <<  4) & 0x24000000)
-				  | ((left  << 28) & 0x10000000)
-				  | ((left  << 14) & 0x08000000)
-				  | ((left  << 18) & 0x02080000)
-				  | ((left  <<  6) & 0x01000000)
-				  | ((left  <<  9) & 0x00200000)
-				  | ((left  >>  1) & 0x00100000)
-				  | ((left  << 10) & 0x00040000)
-				  | ((left  <<  2) & 0x00020000)
-				  | ((left  >> 10) & 0x00010000)
-				  | ((right >> 13) & 0x00002000)
-				  | ((right >>  4) & 0x00001000)
-				  | ((right <<  6) & 0x00000800)
-				  | ((right >>  1) & 0x00000400)
-				  | ((right >> 14) & 0x00000200)
-				  | (right         & 0x00000100)
-				  | ((right >>  5) & 0x00000020)
-				  | ((right >> 10) & 0x00000010)
-				  | ((right >>  3) & 0x00000008)
-				  | ((right >> 18) & 0x00000004)
-				  | ((right >> 26) & 0x00000002)
-				  | ((right >> 24) & 0x00000001);
-
-		*subkey++ = ((left  << 15) & 0x20000000)
-				  | ((left  << 17) & 0x10000000)
-				  | ((left  << 10) & 0x08000000)
-				  | ((left  << 22) & 0x04000000)
-				  | ((left  >>  2) & 0x02000000)
-				  | ((left  <<  1) & 0x01000000)
-				  | ((left  << 16) & 0x00200000)
-				  | ((left  << 11) & 0x00100000)
-				  | ((left  <<  3) & 0x00080000)
-				  | ((left  >>  6) & 0x00040000)
-				  | ((left  << 15) & 0x00020000)
-				  | ((left  >>  4) & 0x00010000)
-				  | ((right >>  2) & 0x00002000)
-				  | ((right <<  8) & 0x00001000)
-				  | ((right >> 14) & 0x00000808)
-				  | ((right >>  9) & 0x00000400)
-				  | ((right)       & 0x00000200)
-				  | ((right <<  7) & 0x00000100)
-				  | ((right >>  7) & 0x00000020)
-				  | ((right >>  3) & 0x00000011)
-				  | ((right <<  2) & 0x00000004)
-				  | ((right >> 21) & 0x00000002);
-	}
-}
-
-/*
- * Fill a DES context with subkeys calculated from a 64bit key.
- * Does not check parity bits, but simply ignore them.
- * Does not check for weak keys.
- */
-static void
-purple_des_cipher_set_key(PurpleCipher *cipher, const guchar *key, size_t len) {
-	PurpleDESCipher *des_cipher = PURPLE_DES_CIPHER(cipher);
-	PurpleDESCipherPrivate *priv = PURPLE_DES_CIPHER_GET_PRIVATE(des_cipher);
-	int i;
-
-	g_return_if_fail(len == 8);
-
-	purple_des_cipher_key_schedule(key, priv->encrypt_subkeys);
-
-	for(i = 0; i < 32; i += 2) {
-		priv->decrypt_subkeys[i] = priv->encrypt_subkeys[30 - i];
-		priv->decrypt_subkeys[i + 1] = priv->encrypt_subkeys[31 - i];
-	}
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_KEY]);
-}
-
-static size_t
-purple_des_cipher_get_key_size(PurpleCipher *cipher)
-{
-	return 8;
-}
-
-/*
- * Electronic Codebook Mode DES encryption/decryption of data according to
- * 'mode'.
- */
-int
-purple_des_cipher_ecb_crypt(PurpleDESCipher *des_cipher, const guint8 * from, guint8 * to,
-			  int mode)
-{
-	guint32 left, right, work;
-	guint32 *keys;
-	PurpleDESCipherPrivate *priv = PURPLE_DES_CIPHER_GET_PRIVATE(des_cipher);
-
-	keys = mode ? priv->decrypt_subkeys :
-				  priv->encrypt_subkeys;
-
-	READ_64BIT_DATA (from, left, right)
-	INITIAL_PERMUTATION (left, work, right)
-
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-	DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
-
-	FINAL_PERMUTATION (right, work, left)
-	WRITE_64BIT_DATA (to, right, left)
-
-	return 0;
-}
-
-static ssize_t
-purple_des_cipher_encrypt(PurpleCipher *cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleDESCipher *des_cipher = PURPLE_DES_CIPHER(cipher);
-
-	gsize offset = 0;
-	int i = 0;
-	gsize tmp;
-	guint8 buf[8] = {0,0,0,0,0,0,0,0};
-	gsize out_len;
-
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	while(offset + 8 <= in_len) {
-		purple_des_cipher_ecb_crypt(des_cipher, input + offset, output + offset, 0);
-		offset += 8;
-	}
-
-	out_len = in_len;
-
-	if(offset<in_len) {
-		g_return_val_if_fail(in_len >= offset, -1);
-		out_len += in_len - offset;
-		g_return_val_if_fail(out_size >= out_len, -1);
-		tmp = offset;
-		while(tmp<in_len) {
-			buf[i++] = input[tmp];
-			tmp++;
-		}
-
-		purple_des_cipher_ecb_crypt(des_cipher, buf, output + offset, 0);
-	}
-
-	return out_len;
-}
-
-static ssize_t
-purple_des_cipher_decrypt(PurpleCipher *cipher, const guchar input[],
-							size_t in_len, guchar output[], size_t out_size)
-{
-	PurpleDESCipher *des_cipher = PURPLE_DES_CIPHER(cipher);
-
-	gsize offset = 0;
-	int i = 0;
-	gsize tmp;
-	guint8 buf[8] = {0,0,0,0,0,0,0,0};
-	gsize out_len;
-
-	g_return_val_if_fail(out_size >= in_len, -1);
-
-	while(offset + 8 <= in_len) {
-		purple_des_cipher_ecb_crypt(des_cipher, input + offset, output + offset, 1);
-		offset += 8;
-	}
-
-	out_len = in_len;
-	if(offset<in_len) {
-		g_return_val_if_fail(in_len >= offset, -1);
-		out_len += in_len - offset;
-		g_return_val_if_fail(out_size >= out_len, -1);
-		tmp = offset;
-		while(tmp<in_len) {
-			buf[i++] = input[tmp];
-			tmp++;
-		}
-
-		purple_des_cipher_ecb_crypt(des_cipher, buf, output + offset, 1);
-	}
-
-	return out_len;
-}
-
-/******************************************************************************
- * Object Stuff
- *****************************************************************************/
-static void
-purple_des_cipher_set_property(GObject *obj, guint param_id,
-							   const GValue *value, GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_KEY:
-			purple_cipher_set_key(cipher, (guchar *)g_value_get_string(value),
-										purple_des_cipher_get_key_size(cipher));
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_des_cipher_class_init(PurpleDESCipherClass *klass)
-{
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-	PurpleCipherClass *cipher_class = PURPLE_CIPHER_CLASS(klass);
-
-	parent_class = g_type_class_peek_parent(klass);
-
-	obj_class->set_property = purple_des_cipher_set_property;
-
-	cipher_class->encrypt = purple_des_cipher_encrypt;
-	cipher_class->decrypt = purple_des_cipher_decrypt;
-	cipher_class->set_key = purple_des_cipher_set_key;
-	cipher_class->get_key_size = purple_des_cipher_get_key_size;
-
-	g_type_class_add_private(klass, sizeof(PurpleDESCipherPrivate));
-
-	properties[PROP_KEY] = g_param_spec_string("key", "key", "key", NULL,
-								G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
-
-	g_object_class_install_properties(obj_class, PROP_LAST, properties);
-}
-
-/******************************************************************************
- * API
- *****************************************************************************/
-GType
-purple_des_cipher_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			.class_size = sizeof(PurpleDESCipherClass),
-			.class_init = (GClassInitFunc)purple_des_cipher_class_init,
-			.instance_size = sizeof(PurpleDESCipher),
-			.instance_init = (GInstanceInitFunc)purple_cipher_reset,
-		};
-
-		type = g_type_register_static(PURPLE_TYPE_CIPHER,
-									  "PurpleDESCipher",
-									  &info, 0);
-	}
-
-	return type;
-}
-
-/**
- * purple_des_cipher_new:
- *
- * Creates a new #PurpleCipher instance which implements the DES block cipher.
- *
- * Return Value: The new DES implementation of #PurpleCipher.
- */
-PurpleCipher *
-purple_des_cipher_new(void) {
-	return g_object_new(PURPLE_TYPE_DES_CIPHER, NULL);
-}
--- a/libpurple/ciphers/descipher.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef PURPLE_DES_CIPHER_H
-#define PURPLE_DES_CIPHER_H
-/**
- * SECTION:descipher
- * @section_id: libpurple-descipher
- * @short_description: <filename>ciphers/descipher.h</filename>
- * @title: DES Cipher
- */
-
-#include "cipher.h"
-
-#define PURPLE_TYPE_DES_CIPHER            (purple_des_cipher_get_type())
-#define PURPLE_DES_CIPHER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_DES_CIPHER, PurpleDESCipher))
-#define PURPLE_DES_CIPHER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_DES_CIPHER, PurpleDESCipherClass))
-#define PURPLE_IS_DES_CIPHER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_DES_CIPHER))
-#define PURPLE_IS_DES_CIPHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((obj), PURPLE_TYPE_DES_CIPHER))
-#define PURPLE_DES_CIPHER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_DES_CIPHER, PurpleDESCipherClass))
-
-typedef struct _PurpleDESCipher           PurpleDESCipher;
-typedef struct _PurpleDESCipherClass      PurpleDESCipherClass;
-
-struct _PurpleDESCipher {
-	PurpleCipher gparent;
-};
-
-struct _PurpleDESCipherClass {
-	PurpleCipherClass gparent;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-GType purple_des_cipher_get_type(void);
-
-PurpleCipher *purple_des_cipher_new(void);
-
-int purple_des_cipher_ecb_crypt(PurpleDESCipher *des_cipher, const guint8 * from, guint8 * to, int mode);
-
-G_END_DECLS
-
-#endif /* PURPLE_DES_CIPHER_H */
--- a/libpurple/ciphers/md4hash.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,311 +0,0 @@
-/*
- * Original md4 taken from linux kernel
- * MD4 Message Digest Algorithm (RFC1320).
- *
- * Implementation derived from Andrew Tridgell and Steve French's
- * CIFS MD4 implementation, and the cryptoapi implementation
- * originally based on the public domain implementation written
- * by Colin Plumb in 1993.
- *
- * Copyright (c) Andrew Tridgell 1997-1998.
- * Modified by Steve French (sfrench@us.ibm.com) 2002
- * Copyright (c) Cryptoapi developers.
- * Copyright (c) 2002 David S. Miller (davem@redhat.com)
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- */
-#include "internal.h"
-#include "md4hash.h"
-
-#include <string.h>
-
-#define MD4_DIGEST_SIZE		16
-#define MD4_BLOCK_WORDS		16
-#define MD4_HASH_WORDS		4
-
-#define PURPLE_MD4_HASH_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MD4_HASH, PurpleMD4HashPrivate))
-
-/******************************************************************************
- * Structs
- *****************************************************************************/
-typedef struct {
-	guint32 hash[MD4_HASH_WORDS];
-	guint32 block[MD4_BLOCK_WORDS];
-	guint64 byte_count;
-} PurpleMD4HashPrivate;
-
-/******************************************************************************
- * Globals
- *****************************************************************************/
-static GObjectClass *parent_class = NULL;
-
-/******************************************************************************
- * Helpers
- *****************************************************************************/
-#define ROUND1(a,b,c,d,k,s) \
-	(a = lshift(a + F(b,c,d) + k, s))
-
-#define ROUND2(a,b,c,d,k,s) \
-	(a = lshift(a + G(b,c,d) + k + (guint32)0x5a827999,s))
-
-#define ROUND3(a,b,c,d,k,s) \
-	(a = lshift(a + H(b,c,d) + k + (guint32)0x6ed9eba1,s))
-
-static inline guint32
-lshift(guint32 x, unsigned int s) {
-	x &= 0xffffffff;
-	return (((x << s) & 0xffffffff) | (x >> (32 - s)));
-}
-
-static inline guint32
-F(guint32 x, guint32 y, guint32 z) {
-	return ((x & y) | ((~x) & z));
-}
-
-static inline guint32
-G(guint32 x, guint32 y, guint32 z) {
-	return ((x & y) | (x & z) | (y & z));
-}
-
-static inline guint32
-H(guint32 x, guint32 y, guint32 z) {
-	return (x ^ y ^ z);
-}
-
-static inline void
-le32_to_cpu_array(guint32 *buf, unsigned int words) {
-	while(words--) {
-		*buf = GUINT_FROM_LE(*buf);
-		buf++;
-	}
-}
-
-static inline void
-cpu_to_le32_array(guint32 *buf, unsigned int words) {
-	while(words--) {
-		*buf = GUINT_TO_LE(*buf);
-		buf++;
-	}
-}
-
-static void
-md4_transform(guint32 *hash, guint32 const *in) {
-	guint32 a, b, c, d;
-
-	a = hash[0];
-	b = hash[1];
-	c = hash[2];
-	d = hash[3];
-
-	ROUND1(a, b, c, d, in[0], 3);
-	ROUND1(d, a, b, c, in[1], 7);
-	ROUND1(c, d, a, b, in[2], 11);
-	ROUND1(b, c, d, a, in[3], 19);
-	ROUND1(a, b, c, d, in[4], 3);
-	ROUND1(d, a, b, c, in[5], 7);
-	ROUND1(c, d, a, b, in[6], 11);
-	ROUND1(b, c, d, a, in[7], 19);
-	ROUND1(a, b, c, d, in[8], 3);
-	ROUND1(d, a, b, c, in[9], 7);
-	ROUND1(c, d, a, b, in[10], 11);
-	ROUND1(b, c, d, a, in[11], 19);
-	ROUND1(a, b, c, d, in[12], 3);
-	ROUND1(d, a, b, c, in[13], 7);
-	ROUND1(c, d, a, b, in[14], 11);
-	ROUND1(b, c, d, a, in[15], 19);
-
-	ROUND2(a, b, c, d,in[ 0], 3);
-	ROUND2(d, a, b, c, in[4], 5);
-	ROUND2(c, d, a, b, in[8], 9);
-	ROUND2(b, c, d, a, in[12], 13);
-	ROUND2(a, b, c, d, in[1], 3);
-	ROUND2(d, a, b, c, in[5], 5);
-	ROUND2(c, d, a, b, in[9], 9);
-	ROUND2(b, c, d, a, in[13], 13);
-	ROUND2(a, b, c, d, in[2], 3);
-	ROUND2(d, a, b, c, in[6], 5);
-	ROUND2(c, d, a, b, in[10], 9);
-	ROUND2(b, c, d, a, in[14], 13);
-	ROUND2(a, b, c, d, in[3], 3);
-	ROUND2(d, a, b, c, in[7], 5);
-	ROUND2(c, d, a, b, in[11], 9);
-	ROUND2(b, c, d, a, in[15], 13);
-
-	ROUND3(a, b, c, d,in[ 0], 3);
-	ROUND3(d, a, b, c, in[8], 9);
-	ROUND3(c, d, a, b, in[4], 11);
-	ROUND3(b, c, d, a, in[12], 15);
-	ROUND3(a, b, c, d, in[2], 3);
-	ROUND3(d, a, b, c, in[10], 9);
-	ROUND3(c, d, a, b, in[6], 11);
-	ROUND3(b, c, d, a, in[14], 15);
-	ROUND3(a, b, c, d, in[1], 3);
-	ROUND3(d, a, b, c, in[9], 9);
-	ROUND3(c, d, a, b, in[5], 11);
-	ROUND3(b, c, d, a, in[13], 15);
-	ROUND3(a, b, c, d, in[3], 3);
-	ROUND3(d, a, b, c, in[11], 9);
-	ROUND3(c, d, a, b, in[7], 11);
-	ROUND3(b, c, d, a, in[15], 15);
-
-	hash[0] += a;
-	hash[1] += b;
-	hash[2] += c;
-	hash[3] += d;
-}
-
-static inline void
-md4_transform_helper(PurpleHash *hash) {
-	PurpleMD4HashPrivate *priv = PURPLE_MD4_HASH_GET_PRIVATE(hash);
-
-	le32_to_cpu_array(priv->block, sizeof(priv->block) / sizeof(guint32));
-	md4_transform(priv->hash, priv->block);
-}
-
-/******************************************************************************
- * Hash Stuff
- *****************************************************************************/
-static void
-purple_md4_hash_reset(PurpleHash *hash) {
-	PurpleMD4HashPrivate *priv = PURPLE_MD4_HASH_GET_PRIVATE(hash);
-
-	priv->hash[0] = 0x67452301;
-	priv->hash[1] = 0xefcdab89;
-	priv->hash[2] = 0x98badcfe;
-	priv->hash[3] = 0x10325476;
-
-	priv->byte_count = 0;
-
-	memset(priv->block, 0, sizeof(priv->block));
-}
-
-static void
-purple_md4_hash_append(PurpleHash *hash, const guchar *data, size_t len) {
-	PurpleMD4HashPrivate *priv = PURPLE_MD4_HASH_GET_PRIVATE(hash);
-	const guint32 avail = sizeof(priv->block) - (priv->byte_count & 0x3f);
-
-	priv->byte_count += len;
-
-	if(avail > len) {
-		memcpy((char *)priv->block +
-			   (sizeof(priv->block) - avail),
-			   data, len);
-		return;
-	}
-
-	memcpy((char *)priv->block +
-		   (sizeof(priv->block) - avail),
-		   data, avail);
-
-	md4_transform_helper(hash);
-	data += avail;
-	len -= avail;
-
-	while(len >= sizeof(priv->block)) {
-		memcpy(priv->block, data, sizeof(priv->block));
-		md4_transform_helper(hash);
-		data += sizeof(priv->block);
-		len -= sizeof(priv->block);
-	}
-
-	memcpy(priv->block, data, len);
-}
-
-static gboolean
-purple_md4_hash_digest(PurpleHash *hash, guchar *out, size_t len)
-{
-	PurpleMD4HashPrivate *priv = PURPLE_MD4_HASH_GET_PRIVATE(hash);
-	const unsigned int offset = priv->byte_count & 0x3f;
-	gchar *p = (gchar *)priv->block + offset;
-	gint padding = 56 - (offset + 1);
-
-	if(len < 16)
-		return FALSE;
-
-	*p++ = 0x80;
-
-	if(padding < 0) {
-		memset(p, 0x00, padding + sizeof(guint64));
-		md4_transform_helper(hash);
-		p = (gchar *)priv->block;
-		padding = 56;
-	}
-
-	memset(p, 0, padding);
-	priv->block[14] = priv->byte_count << 3;
-	priv->block[15] = priv->byte_count >> 29;
-	le32_to_cpu_array(priv->block,
-					  (sizeof(priv->block) - sizeof(guint64)) /
-					  sizeof(guint32));
-	md4_transform(priv->hash, priv->block);
-	cpu_to_le32_array(priv->hash, sizeof(priv->hash) / sizeof(guint32));
-	memcpy(out, priv->hash, sizeof(priv->hash));
-
-	return TRUE;
-}
-
-static size_t
-purple_md4_hash_get_digest_size(PurpleHash *hash)
-{
-	return 16;
-}
-
-static size_t
-purple_md4_hash_get_block_size(PurpleHash *hash)
-{
-	/* This does not change (in this case) */
-	return 64;
-}
-
-/******************************************************************************
- * Object Stuff
- *****************************************************************************/
-static void
-purple_md4_hash_class_init(PurpleMD4HashClass *klass) {
-	PurpleHashClass *hash_class = PURPLE_HASH_CLASS(klass);
-
-	parent_class = g_type_class_peek_parent(klass);
-
-	g_type_class_add_private(klass, sizeof(PurpleMD4HashPrivate));
-
-	hash_class->reset = purple_md4_hash_reset;
-	hash_class->reset_state = purple_md4_hash_reset;
-	hash_class->append = purple_md4_hash_append;
-	hash_class->digest = purple_md4_hash_digest;
-	hash_class->get_digest_size = purple_md4_hash_get_digest_size;
-	hash_class->get_block_size = purple_md4_hash_get_block_size;
-}
-
-/******************************************************************************
- * API
- *****************************************************************************/
-GType
-purple_md4_hash_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurpleMD4HashClass),
-			NULL,
-			NULL,
-			(GClassInitFunc)purple_md4_hash_class_init,
-			NULL,
-			NULL,
-			sizeof(PurpleMD4Hash),
-			0,
-			(GInstanceInitFunc)purple_hash_reset,
-			NULL,
-		};
-
-		type = g_type_register_static(PURPLE_TYPE_HASH,
-									  "PurpleMD4Hash",
-									  &info, 0);
-	}
-
-	return type;
-}
-
-PurpleHash *
-purple_md4_hash_new(void) {
-	return g_object_new(PURPLE_TYPE_MD4_HASH, NULL);
-}
--- a/libpurple/ciphers/md4hash.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef PURPLE_MD4_HASH_H
-#define PURPLE_MD4_HASH_H
-/**
- * SECTION:md4hash
- * @section_id: libpurple-md4hash
- * @short_description: <filename>ciphers/md4hash.h</filename>
- * @title: MD4 Hash
- */
-
-#include "cipher.h"
-
-#define PURPLE_TYPE_MD4_HASH				(purple_md4_hash_get_type())
-#define PURPLE_MD4_HASH(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MD4_HASH, PurpleMD4Hash))
-#define PURPLE_MD4_HASH_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MD4_HASH, PurpleMD4HashClass))
-#define PURPLE_IS_MD4_HASH(obj)				(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MD4_HASH))
-#define PURPLE_IS_MD4_HASH_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE((obj), PURPLE_TYPE_MD4_HASH))
-#define PURPLE_MD4_HASH_GET_CLASS(obj)		(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MD4_HASH, PurpleMD4HashClass))
-
-typedef struct _PurpleMD4Hash				PurpleMD4Hash;
-typedef struct _PurpleMD4HashClass			PurpleMD4HashClass;
-
-struct _PurpleMD4Hash {
-	PurpleHash parent;
-};
-
-struct _PurpleMD4HashClass {
-	PurpleHashClass parent;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-GType purple_md4_hash_get_type(void);
-
-PurpleHash *purple_md4_hash_new(void);
-
-G_END_DECLS
-
-#endif /* PURPLE_MD4_HASH_H */
--- a/libpurple/ciphers/pbkdf2cipher.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,392 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- *
- * Written by Tomek Wasilczyk <twasilczyk@pidgin.im>
- */
-#include "internal.h"
-#include "glibcompat.h"
-
-#include "pbkdf2cipher.h"
-#include "debug.h"
-
-/* 1024bit */
-#define PBKDF2_HASH_MAX_LEN 128
-
-/******************************************************************************
- * Structs
- *****************************************************************************/
-#define PURPLE_PBKDF2_CIPHER_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_PBKDF2_CIPHER, PurplePBKDF2CipherPrivate))
-
-typedef struct {
-	GChecksumType hash_type;
-	guint iter_count;
-	size_t out_len;
-
-	guchar *salt;
-	size_t salt_len;
-	guchar *passphrase;
-	size_t passphrase_len;
-} PurplePBKDF2CipherPrivate;
-
-/******************************************************************************
- * Enums
- *****************************************************************************/
-enum {
-	PROP_NONE,
-	PROP_HASH_TYPE,
-	PROP_ITER_COUNT,
-	PROP_OUT_LEN,
-	PROP_LAST,
-};
-
-/*******************************************************************************
- * Globals
- ******************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GParamSpec *properties[PROP_LAST];
-
-/******************************************************************************
- * Cipher Stuff
- *****************************************************************************/
-static void
-purple_pbkdf2_cipher_reset(PurpleCipher *cipher)
-{
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	g_return_if_fail(priv != NULL);
-
-	priv->iter_count = 1;
-	priv->out_len = 256;
-
-	purple_cipher_reset_state(cipher);
-}
-
-static void
-purple_pbkdf2_cipher_reset_state(PurpleCipher *cipher)
-{
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	g_return_if_fail(priv != NULL);
-
-	purple_cipher_set_salt(cipher, NULL, 0);
-	purple_cipher_set_key(cipher, NULL, 0);
-}
-
-static size_t
-purple_pbkdf2_cipher_get_digest_size(PurpleCipher *cipher)
-{
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	g_return_val_if_fail(priv != NULL, 0);
-
-	return priv->out_len;
-}
-
-static void
-purple_pbkdf2_cipher_set_salt(PurpleCipher *cipher, const guchar *salt, size_t len)
-{
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	g_return_if_fail(priv != NULL);
-
-	g_free(priv->salt);
-	priv->salt = NULL;
-	priv->salt_len = 0;
-
-	if (len == 0)
-		return;
-	g_return_if_fail(salt != NULL);
-
-	priv->salt = g_memdup(salt, len);
-	priv->salt_len = len;
-}
-
-static void
-purple_pbkdf2_cipher_set_key(PurpleCipher *cipher, const guchar *key,
-	size_t len)
-{
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	g_return_if_fail(priv != NULL);
-
-	if (priv->passphrase != NULL) {
-		memset(priv->passphrase, 0, priv->passphrase_len);
-		g_free(priv->passphrase);
-		priv->passphrase = NULL;
-	}
-	priv->passphrase_len = 0;
-
-	if (len == 0)
-		return;
-	g_return_if_fail(key != NULL);
-
-	priv->passphrase = g_memdup(key, len);
-	priv->passphrase_len = len;
-}
-
-/* inspired by gnutls 3.1.10, pbkdf2-sha1.c */
-static gboolean
-purple_pbkdf2_cipher_digest(PurpleCipher *cipher, guchar digest[], size_t len)
-{
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	guchar halfkey[PBKDF2_HASH_MAX_LEN], halfkey_hash[PBKDF2_HASH_MAX_LEN];
-	guint halfkey_count, halfkey_pad, halfkey_no;
-	gsize halfkey_len;
-	guchar *salt_ext;
-	size_t salt_ext_len;
-	guint iter_no;
-
-	g_return_val_if_fail(priv != NULL, FALSE);
-	g_return_val_if_fail(digest != NULL, FALSE);
-	g_return_val_if_fail(len >= priv->out_len, FALSE);
-
-	g_return_val_if_fail(priv->iter_count > 0, FALSE);
-	g_return_val_if_fail(priv->passphrase != NULL ||
-		priv->passphrase_len == 0, FALSE);
-	g_return_val_if_fail(priv->salt != NULL || priv->salt_len == 0,
-		FALSE);
-	g_return_val_if_fail(priv->out_len > 0, FALSE);
-	g_return_val_if_fail(priv->out_len < 0xFFFFFFFFU, FALSE);
-
-	salt_ext_len = priv->salt_len + 4;
-
-	halfkey_len = g_checksum_type_get_length(priv->hash_type);
-	if (halfkey_len <= 0 || halfkey_len > PBKDF2_HASH_MAX_LEN) {
-		purple_debug_error("pbkdf2", "Unsupported hash function. "
-			"(digest size: %" G_GSIZE_FORMAT ")\n", halfkey_len);
-		return FALSE;
-	}
-
-	halfkey_count = ((priv->out_len - 1) / halfkey_len) + 1;
-	halfkey_pad = priv->out_len - (halfkey_count - 1) * halfkey_len;
-
-	salt_ext = g_new(guchar, salt_ext_len);
-	if (priv->salt_len > 0)
-		memcpy(salt_ext, priv->salt, priv->salt_len);
-
-	for (halfkey_no = 1; halfkey_no <= halfkey_count; halfkey_no++) {
-		memset(halfkey, 0, halfkey_len);
-
-		for (iter_no = 1; iter_no <= priv->iter_count; iter_no++) {
-			GHmac *hmac;
-			guint i;
-
-			hmac = g_hmac_new(priv->hash_type,
-				(const guchar*)priv->passphrase,
-				priv->passphrase_len);
-			if (hmac == NULL) {
-				purple_debug_error("pbkdf2",
-					"Couldn't create new hmac cipher\n");
-				g_free(salt_ext);
-				return FALSE;
-			}
-
-			if (iter_no == 1) {
-				salt_ext[salt_ext_len - 4] =
-					(halfkey_no & 0xff000000) >> 24;
-				salt_ext[salt_ext_len - 3] =
-					(halfkey_no & 0x00ff0000) >> 16;
-				salt_ext[salt_ext_len - 2] =
-					(halfkey_no & 0x0000ff00) >> 8;
-				salt_ext[salt_ext_len - 1] =
-					(halfkey_no & 0x000000ff) >> 0;
-
-				g_hmac_update(hmac, salt_ext, salt_ext_len);
-			}
-			else
-				g_hmac_update(hmac, halfkey_hash, halfkey_len);
-
-			g_hmac_get_digest(hmac, halfkey_hash, &halfkey_len);
-			g_hmac_unref(hmac);
-
-			for (i = 0; i < halfkey_len; i++)
-				halfkey[i] ^= halfkey_hash[i];
-		}
-
-		memcpy(digest + (halfkey_no - 1) * halfkey_len, halfkey,
-			(halfkey_no == halfkey_count) ? halfkey_pad :
-				halfkey_len);
-	}
-
-	g_free(salt_ext);
-
-	return TRUE;
-}
-
-/******************************************************************************
- * Object Stuff
- *****************************************************************************/
-static void
-purple_pbkdf2_cipher_get_property(GObject *obj, guint param_id, GValue *value,
-								GParamSpec *pspec)
-{
-	PurplePBKDF2Cipher *cipher = PURPLE_PBKDF2_CIPHER(obj);
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	switch(param_id) {
-		case PROP_HASH_TYPE:
-			g_value_set_int(value, priv->hash_type);
-			break;
-		case PROP_ITER_COUNT:
-			g_value_set_uint(value, priv->iter_count);
-			break;
-		case PROP_OUT_LEN:
-			g_value_set_uint(value, priv->out_len);
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_pbkdf2_cipher_set_property(GObject *obj, guint param_id,
-								const GValue *value, GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-	PurplePBKDF2CipherPrivate *priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	switch(param_id) {
-		case PROP_HASH_TYPE:
-			priv->hash_type = g_value_get_int(value);
-			break;
-		case PROP_ITER_COUNT:
-			priv->iter_count = g_value_get_uint(value);
-			break;
-		case PROP_OUT_LEN:
-			priv->out_len = g_value_get_uint(value);
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_pbkdf2_cipher_finalize(GObject *obj)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-
-	purple_pbkdf2_cipher_reset(cipher);
-
-	parent_class->finalize(obj);
-}
-
-static void
-purple_pbkdf2_cipher_class_init(PurplePBKDF2CipherClass *klass) {
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-	PurpleCipherClass *cipher_class = PURPLE_CIPHER_CLASS(klass);
-
-	parent_class = g_type_class_peek_parent(klass);
-
-	obj_class->finalize = purple_pbkdf2_cipher_finalize;
-	obj_class->get_property = purple_pbkdf2_cipher_get_property;
-	obj_class->set_property = purple_pbkdf2_cipher_set_property;
-
-	cipher_class->reset = purple_pbkdf2_cipher_reset;
-	cipher_class->reset_state = purple_pbkdf2_cipher_reset_state;
-	cipher_class->digest = purple_pbkdf2_cipher_digest;
-	cipher_class->get_digest_size = purple_pbkdf2_cipher_get_digest_size;
-	cipher_class->set_salt = purple_pbkdf2_cipher_set_salt;
-	cipher_class->set_key = purple_pbkdf2_cipher_set_key;
-
-	g_type_class_add_private(klass, sizeof(PurplePBKDF2CipherPrivate));
-
-	properties[PROP_HASH_TYPE] = g_param_spec_int("hash-type", "hash-type", "hash-type",
-								G_MININT, G_MAXINT, -1,
-								G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-								G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_ITER_COUNT] = g_param_spec_uint("iter-count", "iter-count",
-								"iter-count", 0,
-								G_MAXUINT, 0, G_PARAM_READWRITE |
-								G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_OUT_LEN] = g_param_spec_uint("out-len", "out-len",
-								"out-len", 0,
-								G_MAXUINT, 0, G_PARAM_READWRITE |
-								G_PARAM_STATIC_STRINGS);
-
-	g_object_class_install_properties(obj_class, PROP_LAST, properties);
-}
-
-static void
-purple_pbkdf2_cipher_init(PurpleCipher *cipher)
-{
-	PurplePBKDF2CipherPrivate *priv =
-		PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	priv->hash_type = -1;
-
-	purple_cipher_reset(cipher);
-}
-
-/******************************************************************************
- * API
- *****************************************************************************/
-GType
-purple_pbkdf2_cipher_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurplePBKDF2CipherClass),
-			NULL,
-			NULL,
-			(GClassInitFunc)purple_pbkdf2_cipher_class_init,
-			NULL,
-			NULL,
-			sizeof(PurplePBKDF2Cipher),
-			0,
-			(GInstanceInitFunc)purple_pbkdf2_cipher_init,
-			NULL
-		};
-
-		type = g_type_register_static(PURPLE_TYPE_CIPHER,
-									  "PurplePBKDF2Cipher",
-									  &info, 0);
-	}
-
-	return type;
-}
-
-PurpleCipher *
-purple_pbkdf2_cipher_new(GChecksumType hash_type) {
-	return g_object_new(PURPLE_TYPE_PBKDF2_CIPHER,
-						"hash-type", hash_type,
-						NULL);
-}
-
-GChecksumType
-purple_pbkdf2_cipher_get_hash_type(const PurplePBKDF2Cipher *cipher) {
-	PurplePBKDF2CipherPrivate *priv = NULL;
-
-	g_return_val_if_fail(PURPLE_IS_PBKDF2_CIPHER(cipher), -1);
-
-	priv = PURPLE_PBKDF2_CIPHER_GET_PRIVATE(cipher);
-
-	if(priv)
-		return priv->hash_type;
-
-	return -1;
-}
--- a/libpurple/ciphers/pbkdf2cipher.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#ifndef PURPLE_PBKDF2_CIPHER_H
-#define PURPLE_PBKDF2_CIPHER_H
-/**
- * SECTION:pbkdf2cipher
- * @section_id: libpurple-pbkdf2cipher
- * @short_description: <filename>ciphers/pbkdf2cipher.h</filename>
- * @title: PBKDF2 Cipher
- */
-
-#include "cipher.h"
-
-#define PURPLE_TYPE_PBKDF2_CIPHER				(purple_pbkdf2_cipher_get_type())
-#define PURPLE_PBKDF2_CIPHER(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_PBKDF2_CIPHER, PurplePBKDF2Cipher))
-#define PURPLE_PBKDF2_CIPHER_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_PBKDF2_CIPHER, PurplePBKDF2CipherClass))
-#define PURPLE_IS_PBKDF2_CIPHER(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_PBKDF2_CIPHER))
-#define PURPLE_IS_PBKDF2_CIPHER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((obj), PURPLE_TYPE_PBKDF2_CIPHER))
-#define PURPLE_PBKDF2_CIPHER_GET_CLASS(obj)		(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_PBKDF2_CIPHER, PurplePBKDF2CipherClass))
-
-typedef struct _PurplePBKDF2Cipher			PurplePBKDF2Cipher;
-typedef struct _PurplePBKDF2CipherClass		PurplePBKDF2CipherClass;
-
-struct _PurplePBKDF2Cipher {
-	PurpleCipher gparent;
-};
-
-struct _PurplePBKDF2CipherClass {
-	PurpleCipherClass gparent;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-GType purple_pbkdf2_cipher_get_type(void);
-
-PurpleCipher *purple_pbkdf2_cipher_new(GChecksumType hash_type);
-
-GChecksumType purple_pbkdf2_cipher_get_hash_type(const PurplePBKDF2Cipher *cipher);
-
-G_END_DECLS
-
-#endif /* PURPLE_PBKDF2_CIPHER_H */
-
--- a/libpurple/ciphers/rc4cipher.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-#include "internal.h"
-#include "glibcompat.h"
-
-#include "rc4cipher.h"
-
-/*******************************************************************************
- * Structs
- ******************************************************************************/
-#define PURPLE_RC4_CIPHER_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_RC4_CIPHER, PurpleRC4CipherPrivate))
-
-typedef struct {
-	guchar state[256];
-	guchar x;
-	guchar y;
-	gint key_len;
-} PurpleRC4CipherPrivate;
-
-/******************************************************************************
- * Enums
- *****************************************************************************/
-enum {
-	PROP_ZERO,
-	PROP_KEY_LEN,
-	PROP_KEY,
-	PROP_LAST,
-};
-
-/******************************************************************************
- * Globals
- *****************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GParamSpec *properties[PROP_LAST];
-
-/******************************************************************************
- * Cipher Stuff
- *****************************************************************************/
-static void
-purple_rc4_cipher_reset(PurpleCipher *cipher) {
-	PurpleRC4Cipher *rc4_cipher = PURPLE_RC4_CIPHER(cipher);
-	PurpleRC4CipherPrivate *priv = PURPLE_RC4_CIPHER_GET_PRIVATE(rc4_cipher);
-	guint i;
-
-	for(i = 0; i < 256; i++)
-		priv->state[i] = i;
-	priv->x = 0;
-	priv->y = 0;
-
-	/* default is 5 bytes (40bit key) */
-	priv->key_len = 5;
-}
-
-static void
-purple_rc4_cipher_set_key(PurpleCipher *cipher, const guchar *key, size_t len) {
-	PurpleRC4Cipher *rc4_cipher = PURPLE_RC4_CIPHER(cipher);
-	PurpleRC4CipherPrivate *priv = PURPLE_RC4_CIPHER_GET_PRIVATE(rc4_cipher);
-	guchar *state;
-	guchar temp_swap;
-	guchar x, y;
-	guint i;
-
-	x = 0;
-	y = 0;
-	state = &priv->state[0];
-	priv->key_len = len;
-	for(i = 0; i < 256; i++)
-	{
-		y = (key[x] + state[i] + y) % 256;
-		temp_swap = state[i];
-		state[i] = state[y];
-		state[y] = temp_swap;
-		x = (x + 1) % len;
-	}
-
-	g_object_notify_by_pspec(G_OBJECT(cipher), properties[PROP_KEY]);
-}
-
-static ssize_t
-purple_rc4_cipher_encrypt(PurpleCipher *cipher, const guchar input[], size_t in_len,
-							guchar output[], size_t out_size)
-{
-	PurpleRC4Cipher *rc4_cipher = PURPLE_RC4_CIPHER(cipher);
-	guchar temp_swap;
-	guchar x, y, z;
-	guchar *state;
-	guint i;
-	PurpleRC4CipherPrivate *priv = PURPLE_RC4_CIPHER_GET_PRIVATE(rc4_cipher);
-
-	x = priv->x;
-	y = priv->y;
-	state = &priv->state[0];
-
-	for(i = 0; i < in_len; i++)
-	{
-		x = (x + 1) % 256;
-		y = (state[x] + y) % 256;
-		temp_swap = state[x];
-		state[x] = state[y];
-		state[y] = temp_swap;
-		z = state[x] + (state[y]) % 256;
-		output[i] = input[i] ^ state[z];
-	}
-	priv->x = x;
-	priv->y = y;
-
-	return in_len;
-}
-
-/******************************************************************************
- * Object Stuff
- *****************************************************************************/
-static void
-purple_rc4_cipher_set_property(GObject *obj, guint param_id,
-							   const GValue *value, GParamSpec *pspec)
-{
-	PurpleCipher *cipher = PURPLE_CIPHER(obj);
-	PurpleRC4Cipher *rc4_cipher = PURPLE_RC4_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_KEY_LEN:
-			purple_rc4_cipher_set_key_len(rc4_cipher, g_value_get_int(value));
-			break;
-		case PROP_KEY:
-			{
-				guchar *key = (guchar *)g_value_get_string(value);
-				purple_rc4_cipher_set_key(cipher, key, strlen((gchar *) key));
-			}
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_rc4_cipher_get_property(GObject *obj, guint param_id, GValue *value,
-							   GParamSpec *pspec)
-{
-	PurpleRC4Cipher *rc4_cipher = PURPLE_RC4_CIPHER(obj);
-
-	switch(param_id) {
-		case PROP_KEY_LEN:
-			g_value_set_int(value,
-							purple_rc4_cipher_get_key_len(rc4_cipher));
-			break;
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
-			break;
-	}
-}
-
-static void
-purple_rc4_cipher_class_init(PurpleRC4CipherClass *klass) {
-	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
-	PurpleCipherClass *cipher_class = PURPLE_CIPHER_CLASS(klass);
-
-	parent_class = g_type_class_peek_parent(klass);
-
-	obj_class->set_property = purple_rc4_cipher_set_property;
-	obj_class->get_property = purple_rc4_cipher_get_property;
-
-	cipher_class->reset = purple_rc4_cipher_reset;
-	cipher_class->encrypt = purple_rc4_cipher_encrypt;
-	cipher_class->set_key = purple_rc4_cipher_set_key;
-
-	g_type_class_add_private(klass, sizeof(PurpleRC4CipherPrivate));
-
-	properties[PROP_KEY_LEN] = g_param_spec_int("key-len", "key-len", "key-len",
-							 G_MININT, G_MAXINT, 0,
-							 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-
-	properties[PROP_KEY] = g_param_spec_string("key", "key", "key", NULL,
-								G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
-
-	g_object_class_install_properties(obj_class, PROP_LAST, properties);
-}
-
-static void
-purple_rc4_cipher_init(PurpleCipher *cipher) {
-	purple_rc4_cipher_reset(cipher);
-}
-
-/******************************************************************************
- * API
- *****************************************************************************/
-GType
-purple_rc4_cipher_get_type(void) {
-	static GType type = 0;
-
-	if(type == 0) {
-		static const GTypeInfo info = {
-			sizeof(PurpleRC4CipherClass),
-			NULL,
-			NULL,
-			(GClassInitFunc)purple_rc4_cipher_class_init,
-			NULL,
-			NULL,
-			sizeof(PurpleRC4Cipher),
-			0,
-			(GInstanceInitFunc)purple_rc4_cipher_init,
-			NULL,
-		};
-
-		type = g_type_register_static(PURPLE_TYPE_CIPHER,
-									  "PurpleRC4Cipher",
-									  &info, 0);
-	}
-
-	return type;
-}
-
-PurpleCipher *
-purple_rc4_cipher_new(void) {
-	return g_object_new(PURPLE_TYPE_RC4_CIPHER, NULL);
-}
-
-void
-purple_rc4_cipher_set_key_len(PurpleRC4Cipher *rc4_cipher,
-							  gint key_len)
-{
-	PurpleRC4CipherPrivate *priv;
-
-	g_return_if_fail(PURPLE_IS_RC4_CIPHER(rc4_cipher));
-
-	priv = PURPLE_RC4_CIPHER_GET_PRIVATE(rc4_cipher);
-	priv->key_len = key_len;
-
-	g_object_notify_by_pspec(G_OBJECT(rc4_cipher), properties[PROP_KEY_LEN]);
-}
-
-gint
-purple_rc4_cipher_get_key_len(PurpleRC4Cipher *rc4_cipher)
-{
-	PurpleRC4CipherPrivate *priv;
-
-	g_return_val_if_fail(PURPLE_IS_RC4_CIPHER(rc4_cipher), 0);
-
-	priv = PURPLE_RC4_CIPHER_GET_PRIVATE(rc4_cipher);
-
-	return priv->key_len;
-}
--- a/libpurple/ciphers/rc4cipher.h	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/* purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#ifndef PURPLE_RC4_CIPHER_H
-#define PURPLE_RC4_CIPHER_H
-/**
- * SECTION:rc4cipher
- * @section_id: libpurple-rc4cipher
- * @short_description: <filename>ciphers/rc4cipher.h</filename>
- * @title: RC4 Cipher
- */
-
-#include "cipher.h"
-
-#define PURPLE_TYPE_RC4_CIPHER				(purple_rc4_cipher_get_type())
-#define PURPLE_RC4_CIPHER(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_RC4_CIPHER, PurpleRC4Cipher))
-#define PURPLE_RC4_CIPHER_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_RC4_CIPHER, PurpleRC4CipherClass))
-#define PURPLE_IS_RC4_CIPHER(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_RC4_CIPHER))
-#define PURPLE_IS_RC4_CIPHER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((obj), PURPLE_TYPE_RC4_CIPHER))
-#define PURPLE_RC4_CIPHER_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_RC4_CIPHER, PurpleRC4CipherClass))
-
-typedef struct _PurpleRC4Cipher				PurpleRC4Cipher;
-typedef struct _PurpleRC4CipherClass		PurpleRC4CipherClass;
-
-struct _PurpleRC4Cipher {
-	PurpleCipher gparent;
-};
-
-struct _PurpleRC4CipherClass {
-	PurpleCipherClass gparent;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
-G_BEGIN_DECLS
-
-GType purple_rc4_cipher_get_type(void);
-
-PurpleCipher *purple_rc4_cipher_new(void);
-
-gint purple_rc4_cipher_get_key_len(PurpleRC4Cipher *rc4_cipher);
-void purple_rc4_cipher_set_key_len(PurpleRC4Cipher *rc4_cipher, gint key_len);
-
-G_END_DECLS
-
-#endif /* PURPLE_RC4_CIPHER_H */
-
-
--- a/libpurple/tests/Makefile.am	Thu Sep 29 20:11:07 2016 -0500
+++ b/libpurple/tests/Makefile.am	Thu Jun 15 14:22:32 2017 -0500
@@ -6,28 +6,12 @@
 	$(GPLUGIN_LIBS)
 
 test_programs=\
-	test_des \
-	test_des3 \
-	test_image \
-	test_md4 \
 	test_smiley \
 	test_smiley_list \
 	test_trie \
 	test_util \
 	test_xmlnode
 
-test_des_SOURCES=test_des.c
-test_des_LDADD=$(COMMON_LIBS)
-
-test_des3_SOURCES=test_des3.c
-test_des3_LDADD=$(COMMON_LIBS)
-
-test_image_SOURCES=test_image.c
-test_image_LDADD=$(COMMON_LIBS)
-
-test_md4_SOURCES=test_md4.c
-test_md4_LDADD=$(COMMON_LIBS)
-
 test_smiley_SOURCES=test_smiley.c
 test_smiley_LDADD=$(COMMON_LIBS)
 
--- a/libpurple/tests/test_des.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- *
- */
-#include <glib.h>
-
-#include <purple.h>
-
-#include "ciphers/descipher.h"
-
-static void
-test_des_cipher(const gchar *in, const gchar *key, const gchar *out, size_t len) {
-	PurpleCipher *cipher = NULL;
-	guchar *decrypt = NULL, *encrypt = NULL, *answer = NULL;
-	size_t ret = 0;
-
-	decrypt = g_memdup(in, len + 1);
-	encrypt = g_memdup(out, len + 1);
-
-	cipher = purple_des_cipher_new();
-
-	purple_cipher_set_key(cipher, (const guchar *)key, 8);
-
-	answer = g_new0(guchar, len + 1);
-	ret = purple_cipher_encrypt(cipher, decrypt, len, answer, len);
-	g_assert(ret == len);
-	g_assert_cmpmem(encrypt, len, answer, len);
-	g_free(answer);
-
-	answer = g_new0(guchar, len + 1);
-	ret = purple_cipher_decrypt(cipher, encrypt, len, answer, len);
-	g_assert(ret == len);
-	g_assert_cmpmem(decrypt, len, answer, len);
-	g_free(answer);
-
-	g_free(encrypt);
-	g_free(decrypt);
-
-	g_object_unref(G_OBJECT(cipher));
-}
-
-static void
-test_des_cipher_12345678(void) {
-	test_des_cipher(
-		"12345678",
-		"\x3b\x38\x98\x37\x15\x20\xf7\x5e",
-		"\x06\x22\x05\xac\x6a\x0d\x55\xdd",
-		8
-	);
-}
-
-static void
-test_des_cipher_abcdefgh(void) {
-	test_des_cipher(
-		"abcdefgh",
-		"\x3b\x38\x98\x37\x15\x20\xf7\x5e",
-		"\x62\xe0\xc6\x8c\x48\xe4\x75\xed",
-		8
-	);
-}
-
-gint
-main(gint argc, gchar **argv) {
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_add_func("/cipher/des/12345678",
-	                test_des_cipher_12345678);
-
-	g_test_add_func("/cipher/des/abcdefgh",
-	                test_des_cipher_abcdefgh);
-
-	return g_test_run();
-}
--- a/libpurple/tests/test_des3.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,245 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- *
- */
-#include <glib.h>
-
-#include <purple.h>
-
-#include "ciphers/des3cipher.h"
-
-/******************************************************************************
- * DES3 Tests
- * See http://csrc.nist.gov/groups/ST/toolkit/examples.html
- * and some NULL things I made up
- *****************************************************************************/
-static void
-test_des3_cipher(const gchar *in, const gchar *key, const gchar *iv,
-	             const gchar *out, size_t len, PurpleCipherBatchMode mode)
-{
-	PurpleCipher *cipher = NULL;
-	guchar *decrypt = NULL, *encrypt = NULL, *answer = NULL;
-	size_t ret = 0;
-
-	decrypt = g_memdup(in, len + 1);
-	encrypt = g_memdup(out, len + 1);
-
-	cipher = purple_des3_cipher_new();
-
-	purple_cipher_set_key(cipher, (const guchar *)key, 24);
-	purple_cipher_set_batch_mode(cipher, mode);
-	purple_cipher_set_iv(cipher, (guchar *)iv, 8);
-
-	answer = g_new0(guchar, len + 1);
-	ret = purple_cipher_encrypt(cipher, decrypt, len, answer, len);
-	g_assert(ret == len);
-	g_assert_cmpmem(encrypt, len, answer, len);
-	g_free(answer);
-
-	answer = g_new0(guchar, len + 1);
-	ret = purple_cipher_decrypt(cipher, encrypt, len, answer, len);
-	g_assert(ret == len);
-	g_assert_cmpmem(decrypt, len, answer, len);
-	g_free(answer);
-
-	g_free(encrypt);
-	g_free(decrypt);
-
-	g_object_unref(G_OBJECT(cipher));
-}
-
-static void
-test_des3_cipher_ecb_nist1(void) {
-	test_des3_cipher(
-		"\x6B\xC1\xBE\xE2\x2E\x40\x9F\x96\xE9\x3D\x7E\x11\x73\x93\x17\x2A"
-		"\xAE\x2D\x8A\x57\x1E\x03\xAC\x9C\x9E\xB7\x6F\xAC\x45\xAF\x8E\x51",
-		"\x01\x23\x45\x67\x89\xAB\xCD\xEF"
-		"\x23\x45\x67\x89\xAB\xCD\xEF\x01"
-		"\x45\x67\x89\xAB\xCD\xEF\x01\x23",
-		"00000000", /* ignored */
-		"\x71\x47\x72\xF3\x39\x84\x1D\x34\x26\x7F\xCC\x4B\xD2\x94\x9C\xC3"
-		"\xEE\x11\xC2\x2A\x57\x6A\x30\x38\x76\x18\x3F\x99\xC0\xB6\xDE\x87",
-		32,
-		PURPLE_CIPHER_BATCH_MODE_ECB
-	);
-}
-
-static void
-test_des3_cipher_ecb_nist2(void) {
-	test_des3_cipher(
-		"\x6B\xC1\xBE\xE2\x2E\x40\x9F\x96\xE9\x3D\x7E\x11\x73\x93\x17\x2A"
-		"\xAE\x2D\x8A\x57\x1E\x03\xAC\x9C\x9E\xB7\x6F\xAC\x45\xAF\x8E\x51",
-		"\x01\x23\x45\x67\x89\xAB\xCD\xEF"
-		"\x23\x45\x67\x89\xAB\xCD\xEF\x01"
-		"\x01\x23\x45\x67\x89\xAB\xCD\xEF",
-		"00000000", /* ignored */
-		"\x06\xED\xE3\xD8\x28\x84\x09\x0A\xFF\x32\x2C\x19\xF0\x51\x84\x86"
-		"\x73\x05\x76\x97\x2A\x66\x6E\x58\xB6\xC8\x8C\xF1\x07\x34\x0D\x3D",
-		32,
-		PURPLE_CIPHER_BATCH_MODE_ECB
-	);
-}
-
-static void
-test_des3_cipher_ecb_null_key(void) {
-	test_des3_cipher(
-		"\x16\xf4\xb3\x77\xfd\x4b\x9e\xca",
-		"\x38\x00\x88\x6a\xef\xcb\x00\xad"
-		"\x5d\xe5\x29\x00\x7d\x98\x64\x4c"
-		"\x86\x00\x7b\xd3\xc7\x00\x7b\x32",
-		"00000000", /* ignored */
-		"\xc0\x60\x30\xa1\xb7\x25\x42\x44",
-		8,
-		PURPLE_CIPHER_BATCH_MODE_ECB
-	);
-}
-
-static void
-test_des3_cipher_ecb_null_text(void) {
-	test_des3_cipher(
-		"\x65\x73\x34\xc1\x19\x00\x79\x65",
-		"\x32\x64\xda\x10\x13\x6a\xfe\x1e"
-		"\x37\x54\xd1\x2c\x41\x04\x10\x40"
-		"\xaf\x1c\x75\x2b\x51\x3a\x03\xf5",
-		"00000000", /* ignored */
-		"\xe5\x80\xf6\x12\xf8\x4e\xd9\x6c",
-		8,
-		PURPLE_CIPHER_BATCH_MODE_ECB
-	);
-}
-
-static void
-test_des3_cipher_ecb_null_key_and_text(void) {
-	test_des3_cipher(
-		"\xdf\x7f\x00\x92\xe7\xc1\x49\xd2",
-		"\x0e\x41\x00\xc4\x8b\xf0\x6e\xa1"
-		"\x66\x49\x42\x63\x22\x00\xf0\x99"
-		"\x6b\x22\xc1\x37\x9c\x00\xe4\x8f",
-		"00000000", /* ignored */
-		"\x73\xd8\x1f\x1f\x50\x01\xe4\x79",
-		8,
-		PURPLE_CIPHER_BATCH_MODE_ECB
-	);
-}
-
-static void
-test_des3_cipher_cbc_nist1(void) {
-	test_des3_cipher(
-		"\x6B\xC1\xBE\xE2\x2E\x40\x9F\x96\xE9\x3D\x7E\x11\x73\x93\x17\x2A"
-		"\xAE\x2D\x8A\x57\x1E\x03\xAC\x9C\x9E\xB7\x6F\xAC\x45\xAF\x8E\x51",
-		"\x01\x23\x45\x67\x89\xAB\xCD\xEF"
-		"\x23\x45\x67\x89\xAB\xCD\xEF\x01"
-		"\x45\x67\x89\xAB\xCD\xEF\x01\x23",
-		"\xF6\x9F\x24\x45\xDF\x4F\x9B\x17",
-		"\x20\x79\xC3\xD5\x3A\xA7\x63\xE1\x93\xB7\x9E\x25\x69\xAB\x52\x62"
-		"\x51\x65\x70\x48\x1F\x25\xB5\x0F\x73\xC0\xBD\xA8\x5C\x8E\x0D\xA7",
-		32,
-		PURPLE_CIPHER_BATCH_MODE_CBC
-	);
-}
-
-static void
-test_des3_cipher_cbc_nist2(void) {
-	test_des3_cipher(
-		"\x6B\xC1\xBE\xE2\x2E\x40\x9F\x96\xE9\x3D\x7E\x11\x73\x93\x17\x2A"
-		"\xAE\x2D\x8A\x57\x1E\x03\xAC\x9C\x9E\xB7\x6F\xAC\x45\xAF\x8E\x51",
-		"\x01\x23\x45\x67\x89\xAB\xCD\xEF"
-		"\x23\x45\x67\x89\xAB\xCD\xEF\x01"
-		"\x01\x23\x45\x67\x89\xAB\xCD\xEF",
-		"\xF6\x9F\x24\x45\xDF\x4F\x9B\x17",
-		"\x74\x01\xCE\x1E\xAB\x6D\x00\x3C\xAF\xF8\x4B\xF4\x7B\x36\xCC\x21"
-		"\x54\xF0\x23\x8F\x9F\xFE\xCD\x8F\x6A\xCF\x11\x83\x92\xB4\x55\x81",
-		32,
-		PURPLE_CIPHER_BATCH_MODE_CBC
-	);
-}
-
-static void
-test_des3_cipher_cbc_null_key(void) {
-	test_des3_cipher(
-		"\x16\xf4\xb3\x77\xfd\x4b\x9e\xca",
-		"\x38\x00\x88\x6a\xef\xcb\x00\xad"
-		"\x5d\xe5\x29\x00\x7d\x98\x64\x4c"
-		"\x86\x00\x7b\xd3\xc7\x00\x7b\x32",
-		"\x31\x32\x33\x34\x35\x36\x37\x38",
-		"\x52\xe7\xde\x96\x39\x87\x87\xdb",
-		8,
-		PURPLE_CIPHER_BATCH_MODE_CBC
-	);
-}
-
-static void
-test_des3_cipher_cbc_null_text(void) {
-	test_des3_cipher(
-		"\x65\x73\x34\xc1\x19\x00\x79\x65",
-		"\x32\x64\xda\x10\x13\x6a\xfe\x1e"
-		"\x37\x54\xd1\x2c\x41\x04\x10\x40"
-		"\xaf\x1c\x75\x2b\x51\x3a\x03\xf5",
-		"\x7C\xAF\x0D\x57\x1E\x57\x10\xDA",
-		"\x40\x12\x0e\x00\x85\xff\x6c\xc2",
-		8,
-		PURPLE_CIPHER_BATCH_MODE_CBC
-	);
-}
-
-static void
-test_des3_cipher_cbc_null_key_and_text(void) {
-	test_des3_cipher(
-		"\xdf\x7f\x00\x92\xe7\xc1\x49\xd2",
-		"\x0e\x41\x00\xc4\x8b\xf0\x6e\xa1"
-		"\x66\x49\x42\x63\x22\x00\xf0\x99"
-		"\x6b\x22\xc1\x37\x9c\x00\xe4\x8f",
-		"\x01\x19\x0D\x2c\x40\x67\x89\x67",
-		"\xa7\xc1\x10\xbe\x9b\xd5\x8a\x67",
-		8,
-		PURPLE_CIPHER_BATCH_MODE_CBC
-	);
-}
-
-
-gint
-main(gint argc, gchar **argv) {
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_add_func("/cipher/des3/ecb nist1",
-	                test_des3_cipher_ecb_nist1);
-	g_test_add_func("/cipher/des3/ecb nist2",
-	                test_des3_cipher_ecb_nist2);
-	g_test_add_func("/cipher/des3/ecb null key",
-	                test_des3_cipher_ecb_null_key);
-	g_test_add_func("/cipher/des3/ecb null text",
-	                test_des3_cipher_ecb_null_text);
-	g_test_add_func("/cipher/des3/ebc null key and text",
-	                test_des3_cipher_ecb_null_key_and_text);
-
-	g_test_add_func("/cipher/des3/cbc nist1",
-	                test_des3_cipher_cbc_nist1);
-	g_test_add_func("/cipher/des3/cbc nist2",
-	                test_des3_cipher_cbc_nist2);
-	g_test_add_func("/cipher/des3/cbc null key",
-	                test_des3_cipher_cbc_null_key);
-	g_test_add_func("/cipher/des3/cbc null text",
-	                test_des3_cipher_cbc_null_text);
-	g_test_add_func("/cipher/des3/cbc null key and text",
-	                test_des3_cipher_cbc_null_key_and_text);
-
-	return g_test_run();
-}
--- a/libpurple/tests/test_md4.c	Thu Sep 29 20:11:07 2016 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/*
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- *
- */
-#include <glib.h>
-
-#include <purple.h>
-
-#include "ciphers/md4hash.h"
-
-static void
-test_md4hash(gchar *data, gchar *digest) {
-	PurpleHash *hash = NULL;
-	gchar cdigest[33];
-	gboolean ret = FALSE;
-
-	hash = purple_md4_hash_new();
-
-	purple_hash_append(hash, (guchar *)data, strlen(data));
-
-	ret = purple_hash_digest_to_str(hash, cdigest, sizeof(cdigest));
-
-	g_assert(ret);
-	g_assert_cmpstr(digest, ==, cdigest);
-}
-
-static void
-test_md4hash_empty_string(void) {
-	test_md4hash("",
-	             "31d6cfe0d16ae931b73c59d7e0c089c0");
-}
-
-static void
-test_md4hash_a(void) {
-	test_md4hash("a",
-	             "bde52cb31de33e46245e05fbdbd6fb24");
-}
-
-static void
-test_md4hash_abc(void) {
-	test_md4hash("abc",
-	             "a448017aaf21d8525fc10ae87aa6729d");
-}
-
-static void
-test_md4hash_message_digest(void) {
-	test_md4hash("message digest",
-	             "d9130a8164549fe818874806e1c7014b");
-}
-
-static void
-test_md4hash_a_to_z(void) {
-	test_md4hash("abcdefghijklmnopqrstuvwxyz",
-	             "d79e1c308aa5bbcdeea8ed63df412da9");
-}
-
-static void
-test_md4hash_A_to_Z_a_to_z_0_to_9(void) {
-	test_md4hash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-	             "043f8582f241db351ce627e153e7f0e4");
-}
-
-static void
-test_md4hash_1_to_0_eight_times(void) {
-	test_md4hash("12345678901234567890123456789012345678901234567890123456789012345678901234567890",
-	             "e33b4ddc9c38f2199c3e7b164fcc0536");
-}
-
-gint
-main(gint argc, gchar **argv) {
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_add_func("/hash/md4/empty-string",
-	                test_md4hash_empty_string);
-	g_test_add_func("/hash/md4/a",
-	                test_md4hash_a);
-	g_test_add_func("/hash/md4/abc",
-	                test_md4hash_abc);
-	g_test_add_func("/hash/md4/message digest",
-	                test_md4hash_message_digest);
-	g_test_add_func("/hash/md4/a to z",
-	                test_md4hash_a_to_z);
-	g_test_add_func("/hash/md4/A to Z, a to z, 0 to 9" ,
-	                test_md4hash_A_to_Z_a_to_z_0_to_9);
-	g_test_add_func("/hash/md4/1 to 0 eight times",
-	                test_md4hash_1_to_0_eight_times);
-
-	return g_test_run();
-}

mercurial