Finish up the ciphers and hashes

Thu, 10 Mar 2016 20:54:09 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 10 Mar 2016 20:54:09 -0600
changeset 37597
c92c6f818320
parent 37596
950e390d9d42
child 37598
13e5ff40475c

Finish up the ciphers and hashes

libpurple/tests/Makefile.am file | annotate | diff | comparison | revisions
libpurple/tests/test_cipher.c 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_hmac.c file | annotate | diff | comparison | revisions
libpurple/tests/test_md4.c file | annotate | diff | comparison | revisions
libpurple/tests/test_md4hash.c file | annotate | diff | comparison | revisions
libpurple/tests/test_md5.c file | annotate | diff | comparison | revisions
libpurple/tests/test_md5hash.c file | annotate | diff | comparison | revisions
libpurple/tests/test_sha1.c file | annotate | diff | comparison | revisions
libpurple/tests/test_sha1hash.c file | annotate | diff | comparison | revisions
libpurple/tests/test_sha256.c file | annotate | diff | comparison | revisions
libpurple/tests/test_sha256hash.c file | annotate | diff | comparison | revisions
--- a/libpurple/tests/Makefile.am	Wed Mar 09 22:23:39 2016 -0600
+++ b/libpurple/tests/Makefile.am	Thu Mar 10 20:54:09 2016 -0600
@@ -6,22 +6,35 @@
 	$(GPLUGIN_LIBS)
 
 test_programs=\
-	test_md4hash \
-	test_md5hash \
-	test_sha1hash \
-	test_sha256hash
+	test_des \
+	test_des3 \
+	test_hmac \
+	test_md4 \
+	test_md5 \
+	test_sha1 \
+	test_sha256
 
-test_md4hash_SOURCES=test_md4hash.c
-test_md4hash_LDADD=$(COMMON_LIBS)
+
+test_des_SOURCES=test_des.c
+test_des_LDADD=$(COMMON_LIBS)
+
+test_des3_SOURCES=test_des3.c
+test_des3_LDADD=$(COMMON_LIBS)
 
-test_md5hash_SOURCES=test_md5hash.c
-test_md5hash_LDADD=$(COMMON_LIBS)
+test_hmac_SOURCES=test_hmac.c
+test_hmac_LDADD=$(COMMON_LIBS)
+
+test_md4_SOURCES=test_md4.c
+test_md4_LDADD=$(COMMON_LIBS)
 
-test_sha1hash_SOURCES=test_sha1hash.c
-test_sha1hash_LDADD=$(COMMON_LIBS)
+test_md5_SOURCES=test_md5.c
+test_md5_LDADD=$(COMMON_LIBS)
 
-test_sha256hash_SOURCES=test_sha256hash.c
-test_sha256hash_LDADD=$(COMMON_LIBS)
+test_sha1_SOURCES=test_sha1.c
+test_sha1_LDADD=$(COMMON_LIBS)
+
+test_sha256_SOURCES=test_sha256.c
+test_sha256_LDADD=$(COMMON_LIBS)
 
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/libpurple \
--- a/libpurple/tests/test_cipher.c	Wed Mar 09 22:23:39 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,610 +0,0 @@
-#include <glib.h>
-#include <check.h>
-#include <stdlib.h>
-#include <string.h>
-
-#undef HAVE_DBUS
-
-#include "tests.h"
-
-#include "../ciphers/des3cipher.h"
-#include "../ciphers/descipher.h"
-#include "../ciphers/hmaccipher.h"
-#include "../ciphers/md4hash.h"
-#include "../ciphers/md5hash.h"
-#include "../ciphers/sha1hash.h"
-#include "../ciphers/sha256hash.h"
-
-/******************************************************************************
- * DES Tests
- *****************************************************************************/
-#define DES_TEST(in, keyz, out, len) { \
-	PurpleCipher *cipher = NULL; \
-	guchar answer[len+1]; \
-	gint ret = 0; \
-	guchar decrypt[len+1] = in; \
-	guchar key[8+1] = keyz;\
-	guchar encrypt[len+1] = out;\
-	\
-	cipher = purple_des_cipher_new(); \
-	purple_cipher_set_key(cipher, key, 8); \
-	\
-	ret = purple_cipher_encrypt(cipher, decrypt, len, answer, len); \
-	fail_unless(ret == len, NULL); \
-	fail_unless(memcmp(encrypt, answer, len) == 0, NULL); \
-	\
-	ret = purple_cipher_decrypt(cipher, encrypt, len, answer, len); \
-	fail_unless(ret == len, NULL); \
-	fail_unless(memcmp(decrypt, answer, len) == 0, NULL); \
-	\
-	g_object_unref(cipher); \
-}
-
-START_TEST(test_des_12345678) {
-	DES_TEST("12345678",
-	         "\x3b\x38\x98\x37\x15\x20\xf7\x5e",
-	         "\x06\x22\x05\xac\x6a\x0d\x55\xdd",
-	         8);
-}
-END_TEST
-
-START_TEST(test_des_abcdefgh) {
-	DES_TEST("abcdefgh",
-	         "\x3b\x38\x98\x37\x15\x20\xf7\x5e",
-	         "\x62\xe0\xc6\x8c\x48\xe4\x75\xed",
-	         8);
-}
-END_TEST
-
-/******************************************************************************
- * DES3 Tests
- * See http://csrc.nist.gov/groups/ST/toolkit/examples.html
- * and some NULL things I made up
- *****************************************************************************/
-
-#define DES3_TEST(in, key, iv, out, len, mode) { \
-	PurpleCipher *cipher = NULL; \
-	guchar answer[len+1]; \
-	guchar decrypt[len+1] = in; \
-	guchar encrypt[len+1] = out; \
-	gint ret = 0; \
-	\
-	cipher = purple_des3_cipher_new(); \
-	purple_cipher_set_key(cipher, (guchar *)key, 24); \
-	purple_cipher_set_batch_mode(cipher, (mode)); \
-	purple_cipher_set_iv(cipher, (guchar *)iv, 8); \
-	\
-	ret = purple_cipher_encrypt(cipher, decrypt, len, answer, len); \
-	fail_unless(ret == len, NULL); \
-	fail_unless(memcmp(encrypt, answer, len) == 0, NULL); \
-	\
-	ret = purple_cipher_decrypt(cipher, encrypt, len, answer, len); \
-	fail_unless(ret == len, NULL); \
-	fail_unless(memcmp(decrypt, answer, len) == 0, NULL); \
-	\
-	g_object_unref(cipher); \
-}
-
-START_TEST(test_des3_ecb_nist1) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_ecb_nist2) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_ecb_null_key) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_ecb_null_text) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_ecb_null_key_and_text) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_cbc_nist1) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_cbc_nist2) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_cbc_null_key) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_cbc_null_text) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-START_TEST(test_des3_cbc_null_key_and_text) {
-	DES3_TEST(
-	          "\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);
-}
-END_TEST
-
-/******************************************************************************
- * HMAC Tests
- * See RFC2202 and some other NULL tests I made up
- *****************************************************************************/
-
-#define HMAC_TEST(data, data_len, key, key_len, type, digest) { \
-	PurpleCipher *cipher = NULL; \
-	PurpleHash *hash = NULL; \
-	gchar cdigest[41]; \
-	gboolean ret = FALSE; \
-	\
-	hash = purple_##type##_hash_new(); \
-	cipher = purple_hmac_cipher_new(hash); \
-	purple_cipher_set_key(cipher, (guchar *)key, (key_len)); \
-	\
-	purple_cipher_append(cipher, (guchar *)(data), (data_len)); \
-	ret = purple_cipher_digest_to_str(cipher, cdigest, sizeof(cdigest)); \
-	\
-	fail_unless(ret == TRUE, NULL); \
-	fail_unless(strcmp((digest), cdigest) == 0, NULL); \
-	\
-	g_object_unref(cipher); \
-	g_object_unref(hash); \
-}
-
-/* HMAC MD5 */
-
-START_TEST(test_hmac_md5_Hi) {
-	HMAC_TEST("Hi There",
-	          8,
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
-	          16,
-	          md5,
-	          "9294727a3638bb1c13f48ef8158bfc9d");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_what) {
-	HMAC_TEST("what do ya want for nothing?",
-	          28,
-	          "Jefe",
-	          4,
-	          md5,
-	          "750c783e6ab0b503eaa86e310a5db738");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_dd) {
-	HMAC_TEST("\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
-	          50,
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
-	          16,
-	          md5,
-	          "56be34521d144c88dbb8c733f0e8b3f6");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_cd) {
-	HMAC_TEST("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
-	          50,
-	          "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
-	          "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
-	          "\x15\x16\x17\x18\x19",
-	          25,
-	          md5,
-	          "697eaf0aca3a3aea3a75164746ffaa79");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_truncation) {
-	HMAC_TEST("Test With Truncation",
-	          20,
-	          "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
-	          16,
-	          md5,
-	          "56461ef2342edc00f9bab995690efd4c");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_large_key) {
-	HMAC_TEST("Test Using Larger Than Block-Size Key - Hash Key First",
-	          54,
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
-	          80,
-	          md5,
-	          "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_large_key_and_data) {
-	HMAC_TEST("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
-	          73,
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
-	          80,
-	          md5,
-	          "6f630fad67cda0ee1fb1f562db3aa53e");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_null_key) {
-	HMAC_TEST("Hi There",
-	          8,
-	          "\x0a\x0b\x00\x0d\x0e\x0f\x1a\x2f\x0b\x0b"
-	          "\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
-	          20,
-	          md5,
-	          "597bfd644b797a985561eeb03a169e59");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_null_text) {
-	HMAC_TEST("Hi\x00There",
-	          8,
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
-	          20,
-	          md5,
-	          "70be8e1b7b50dfcc335d6cd7992c564f");
-}
-END_TEST
-
-START_TEST(test_hmac_md5_null_key_and_text) {
-	HMAC_TEST("Hi\x00Th\x00re",
-	          8,
-	          "\x0c\x0d\x00\x0f\x10\x1a\x3a\x3a\xe6\x34"
-	          "\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
-	          20,
-	          md5,
-	          "b31bcbba35a33a067cbba9131cba4889");
-}
-END_TEST
-
-/* HMAC SHA1 */
-
-START_TEST(test_hmac_sha1_Hi) {
-	HMAC_TEST("Hi There",
-	          8,
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
-	          20,
-	          sha1,
-	          "b617318655057264e28bc0b6fb378c8ef146be00");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_what) {
-	HMAC_TEST("what do ya want for nothing?",
-	          28,
-	          "Jefe",
-	          4,
-	          sha1,
-	          "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_dd) {
-	HMAC_TEST("\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
-	          "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
-	          50,
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
-	          20,
-	          sha1,
-	          "125d7342b9ac11cd91a39af48aa17b4f63f175d3");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_cd) {
-	HMAC_TEST("\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
-	          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
-	          50,
-	          "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
-	          "\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
-	          "\x15\x16\x17\x18\x19",
-	          25,
-	          sha1,
-	          "4c9007f4026250c6bc8414f9bf50c86c2d7235da");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_truncation) {
-	HMAC_TEST("Test With Truncation",
-	          20,
-	          "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
-	          "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
-	          20,
-	          sha1,
-	          "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_large_key) {
-	HMAC_TEST("Test Using Larger Than Block-Size Key - Hash Key First",
-	          54,
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
-	          80,
-	          sha1,
-	          "aa4ae5e15272d00e95705637ce8a3b55ed402112");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_large_key_and_data) {
-	HMAC_TEST("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
-	          73,
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
-	          "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
-	          80,
-	          sha1,
-	          "e8e99d0f45237d786d6bbaa7965c7808bbff1a91");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_null_key) {
-	HMAC_TEST("Hi There",
-	          8,
-	          "\x0a\x0b\x00\x0d\x0e\x0f\x1a\x2f\x0b\x0b"
-	          "\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
-	          20,
-	          sha1,
-	          "eb62a2e0e33d300be669c52aab3f591bc960aac5");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_null_text) {
-	HMAC_TEST("Hi\x00There",
-	          8,
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
-	          "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
-	          20,
-	          sha1,
-	          "31ca58d849e971e418e3439de2c6f83144b6abb7");
-}
-END_TEST
-
-START_TEST(test_hmac_sha1_null_key_and_text) {
-	HMAC_TEST("Hi\x00Th\x00re",
-	          8,
-	          "\x0c\x0d\x00\x0f\x10\x1a\x3a\x3a\xe6\x34"
-	          "\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
-	          20,
-	          sha1,
-	          "e6b8e2fede87aa09dcb13e554df1435e056eae36");
-}
-END_TEST
-
-/******************************************************************************
- * Suite
- *****************************************************************************/
-Suite *
-cipher_suite(void) {
-	Suite *s = suite_create("Cipher Suite");
-	TCase *tc = NULL;
-
-	/* md4 tests */
-	tc = tcase_create("MD4");
-	tcase_add_test(tc, test_md4_empty_string);
-	tcase_add_test(tc, test_md4_a);
-	tcase_add_test(tc, test_md4_abc);
-	tcase_add_test(tc, test_md4_message_digest);
-	tcase_add_test(tc, test_md4_a_to_z);
-	tcase_add_test(tc, test_md4_A_to_Z_a_to_z_0_to_9);
-	tcase_add_test(tc, test_md4_1_to_0_8_times);
-	suite_add_tcase(s, tc);
-
-	/* md5 tests */
-	tc = tcase_create("MD5");
-	tcase_add_test(tc, test_md5_empty_string);
-	tcase_add_test(tc, test_md5_a);
-	tcase_add_test(tc, test_md5_abc);
-	tcase_add_test(tc, test_md5_message_digest);
-	tcase_add_test(tc, test_md5_a_to_z);
-	tcase_add_test(tc, test_md5_A_to_Z_a_to_z_0_to_9);
-	tcase_add_test(tc, test_md5_1_to_0_8_times);
-	suite_add_tcase(s, tc);
-
-	/* sha1 tests */
-	tc = tcase_create("SHA1");
-	tcase_add_test(tc, test_sha1_empty_string);
-	tcase_add_test(tc, test_sha1_a);
-	tcase_add_test(tc, test_sha1_abc);
-	tcase_add_test(tc, test_sha1_abcd_gibberish);
-	tcase_add_test(tc, test_sha1_1000_as_1000_times);
-	suite_add_tcase(s, tc);
-
-	/* sha256 tests */
-	tc = tcase_create("SHA256");
-	tcase_add_test(tc, test_sha256_empty_string);
-	tcase_add_test(tc, test_sha256_a);
-	tcase_add_test(tc, test_sha256_abc);
-	tcase_add_test(tc, test_sha256_abcd_gibberish);
-	tcase_add_test(tc, test_sha256_1000_as_1000_times);
-	suite_add_tcase(s, tc);
-
-	/* des tests */
-	tc = tcase_create("DES");
-	tcase_add_test(tc, test_des_12345678);
-	tcase_add_test(tc, test_des_abcdefgh);
-	suite_add_tcase(s, tc);
-
-	/* des3 ecb tests */
-	tc = tcase_create("DES3 ECB");
-	tcase_add_test(tc, test_des3_ecb_nist1);
-	tcase_add_test(tc, test_des3_ecb_nist2);
-	tcase_add_test(tc, test_des3_ecb_null_key);
-	tcase_add_test(tc, test_des3_ecb_null_text);
-	tcase_add_test(tc, test_des3_ecb_null_key_and_text);
-	suite_add_tcase(s, tc);
-	/* des3 cbc tests */
-	tc = tcase_create("DES3 CBC");
-	tcase_add_test(tc, test_des3_cbc_nist1);
-	tcase_add_test(tc, test_des3_cbc_nist2);
-	tcase_add_test(tc, test_des3_cbc_null_key);
-	tcase_add_test(tc, test_des3_cbc_null_text);
-	tcase_add_test(tc, test_des3_cbc_null_key_and_text);
-	suite_add_tcase(s, tc);
-
-	/* hmac tests */
-	tc = tcase_create("HMAC");
-	tcase_add_test(tc, test_hmac_md5_Hi);
-	tcase_add_test(tc, test_hmac_md5_what);
-	tcase_add_test(tc, test_hmac_md5_dd);
-	tcase_add_test(tc, test_hmac_md5_cd);
-	tcase_add_test(tc, test_hmac_md5_truncation);
-	tcase_add_test(tc, test_hmac_md5_large_key);
-	tcase_add_test(tc, test_hmac_md5_large_key_and_data);
-	tcase_add_test(tc, test_hmac_md5_null_key);
-	tcase_add_test(tc, test_hmac_md5_null_text);
-	tcase_add_test(tc, test_hmac_md5_null_key_and_text);
-	tcase_add_test(tc, test_hmac_sha1_Hi);
-	tcase_add_test(tc, test_hmac_sha1_what);
-	tcase_add_test(tc, test_hmac_sha1_dd);
-	tcase_add_test(tc, test_hmac_sha1_cd);
-	tcase_add_test(tc, test_hmac_sha1_truncation);
-	tcase_add_test(tc, test_hmac_sha1_large_key);
-	tcase_add_test(tc, test_hmac_sha1_large_key_and_data);
-	tcase_add_test(tc, test_hmac_sha1_null_key);
-	tcase_add_test(tc, test_hmac_sha1_null_text);
-	tcase_add_test(tc, test_hmac_sha1_null_key_and_text);
-	suite_add_tcase(s, tc);
-
-	return s;
-}
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_des.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,69 @@
+#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();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_des3.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,223 @@
+#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();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_hmac.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,379 @@
+#include <glib.h>
+
+#include <purple.h>
+
+#include "ciphers/hmaccipher.h"
+#include "ciphers/md5hash.h"
+#include "ciphers/sha1hash.h"
+
+/******************************************************************************
+ * HMAC Tests
+ * See RFC2202 and some other NULL tests I made up
+ *****************************************************************************/
+static void
+test_hmac(gchar *data, size_t data_len,
+          const gchar *key, size_t key_len,
+          PurpleHash *hash, const gchar *digest)
+{
+	PurpleCipher *cipher = NULL;
+	gchar cdigest[41];
+	gboolean ret = FALSE;
+
+	cipher = purple_hmac_cipher_new(hash);
+	purple_cipher_set_key(cipher, (guchar *)key, key_len);
+
+	purple_cipher_append(cipher, (guchar *)data, data_len);
+	ret = purple_cipher_digest_to_str(cipher, cdigest, sizeof(cdigest));
+
+	g_assert(ret);
+	g_assert_cmpstr(digest, ==, cdigest);
+
+	g_object_unref(G_OBJECT(cipher));
+	g_object_unref(G_OBJECT(hash));
+}
+
+static void
+test_hmac_md5_hi(void) {
+	test_hmac(
+		"Hi There",
+		8,
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
+		16,
+		purple_md5_hash_new(),
+		"9294727a3638bb1c13f48ef8158bfc9d"
+	);
+}
+
+static void
+test_hmac_md5_what(void) {
+	test_hmac(
+		"what do ya want for nothing?",
+		28,
+		"Jefe",
+		4,
+		purple_md5_hash_new(),
+		"750c783e6ab0b503eaa86e310a5db738"
+	);
+}
+
+static void
+test_hmac_md5_dd(void) {
+	test_hmac(
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
+		50,
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+		16,
+		purple_md5_hash_new(),
+		"56be34521d144c88dbb8c733f0e8b3f6"
+	);
+}
+
+static void
+test_hmac_md5_cd(void) {
+	test_hmac(
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
+		50,
+		"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
+		"\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
+		"\x15\x16\x17\x18\x19",
+		25,
+		purple_md5_hash_new(),
+		"697eaf0aca3a3aea3a75164746ffaa79"
+	);
+}
+
+static void
+test_hmac_md5_truncation(void) {
+	test_hmac(
+		"Test With Truncation",
+		20,
+		"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
+		16,
+		purple_md5_hash_new(),
+		"56461ef2342edc00f9bab995690efd4c"
+	);
+}
+
+static void
+test_hmac_md5_large_key(void) {
+	test_hmac(
+		"Test Using Larger Than Block-Size Key - Hash Key First",
+		54,
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+		80,
+		purple_md5_hash_new(),
+		"6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd"
+	);
+}
+
+static void
+test_hmac_md5_large_key_and_data(void) {
+	test_hmac(
+		"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
+		73,
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+		80,
+		purple_md5_hash_new(),
+		"6f630fad67cda0ee1fb1f562db3aa53e"
+	);
+}
+
+static void
+test_hmac_md5_null_key(void) {
+	test_hmac(
+		"Hi There",
+		8,
+		"\x0a\x0b\x00\x0d\x0e\x0f\x1a\x2f\x0b\x0b"
+		"\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
+		20,
+		purple_md5_hash_new(),
+		"597bfd644b797a985561eeb03a169e59"
+	);
+}
+
+static void
+test_hmac_md5_null_text(void) {
+	test_hmac(
+		"Hi\x00There",
+		8,
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
+		20,
+		purple_md5_hash_new(),
+		"70be8e1b7b50dfcc335d6cd7992c564f"
+	);
+}
+
+static void
+test_hmac_md5_null_key_and_text(void) {
+	test_hmac(
+		"Hi\x00Th\x00re",
+		8,
+		"\x0c\x0d\x00\x0f\x10\x1a\x3a\x3a\xe6\x34"
+		"\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
+		20,
+		purple_md5_hash_new(),
+		"b31bcbba35a33a067cbba9131cba4889"
+	);
+}
+
+static void
+test_hmac_sha1_hi(void) {
+	test_hmac(
+		"Hi There",
+		8,
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
+		20,
+		purple_sha1_hash_new(),
+		"b617318655057264e28bc0b6fb378c8ef146be00"
+	);
+}
+
+static void
+test_hmac_sha1_what(void) {
+	test_hmac(
+		"what do ya want for nothing?",
+		28,
+		"Jefe",
+		4,
+		purple_sha1_hash_new(),
+		"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79"
+	);
+}
+
+static void
+test_hmac_sha1_dd(void) {
+	test_hmac(
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd",
+		50,
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+		20,
+		purple_sha1_hash_new(),
+		"125d7342b9ac11cd91a39af48aa17b4f63f175d3"
+	);
+}
+
+static void
+test_hmac_sha1_cd(void) {
+	test_hmac(
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
+		50,
+		"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
+		"\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
+		"\x15\x16\x17\x18\x19",
+		25,
+		purple_sha1_hash_new(),
+		"4c9007f4026250c6bc8414f9bf50c86c2d7235da"
+	);
+}
+
+static void
+test_hmac_sha1_truncation(void) {
+	test_hmac(
+		"Test With Truncation",
+		20,
+		"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c"
+		"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
+		20,
+		purple_sha1_hash_new(),
+		"4c1a03424b55e07fe7f27be1d58bb9324a9a5a04"
+	);
+}
+
+static void
+test_hmac_sha1_large_key(void) {
+	test_hmac(
+		"Test Using Larger Than Block-Size Key - Hash Key First",
+		54,
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+		80,
+		purple_sha1_hash_new(),
+		"aa4ae5e15272d00e95705637ce8a3b55ed402112"
+	);
+}
+
+static void
+test_hmac_sha1_large_key_and_data(void) {
+	test_hmac(
+		"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
+		73,
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+		80,
+		purple_sha1_hash_new(),
+		"e8e99d0f45237d786d6bbaa7965c7808bbff1a91"
+	);
+}
+
+static void
+test_hmac_sha1_null_key(void) {
+	test_hmac(
+		"Hi There",
+		8,
+		"\x0a\x0b\x00\x0d\x0e\x0f\x1a\x2f\x0b\x0b"
+		"\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
+		20,
+		purple_sha1_hash_new(),
+		"eb62a2e0e33d300be669c52aab3f591bc960aac5"
+	);
+}
+
+static void
+test_hmac_sha1_null_text(void) {
+	test_hmac(
+		"Hi\x00There",
+		8,
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
+		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
+		20,
+		purple_sha1_hash_new(),
+		"31ca58d849e971e418e3439de2c6f83144b6abb7"
+	);
+}
+
+static void
+test_hmac_sha1_null_key_and_text(void) {
+	test_hmac(
+		"Hi\x00Th\x00re",
+		8,
+		"\x0c\x0d\x00\x0f\x10\x1a\x3a\x3a\xe6\x34"
+		"\x0b\x00\x00\x0b\x0b\x49\x5f\x6e\x0b\x0b",
+		20,
+		purple_sha1_hash_new(),
+		"e6b8e2fede87aa09dcb13e554df1435e056eae36"
+	);
+}
+
+gint
+main(gint argc, gchar **argv) {
+	g_test_init(&argc, &argv, NULL);
+
+	g_test_add_func("/hmac/md5/hi",
+	                test_hmac_md5_hi);
+	g_test_add_func("/hmac/md5/what",
+	                test_hmac_md5_what);
+	g_test_add_func("/hmac/md5/dd",
+	                test_hmac_md5_dd);
+	g_test_add_func("/hmac/md5/cd",
+	                test_hmac_md5_cd);
+	g_test_add_func("/hmac/md5/truncation",
+	                test_hmac_md5_truncation);
+	g_test_add_func("/hmac/md5/large key",
+	                test_hmac_md5_large_key);
+	g_test_add_func("/hmac/md5/large key and data",
+	                test_hmac_md5_large_key_and_data);
+	g_test_add_func("/hmac/md5/null key",
+	                test_hmac_md5_null_key);
+	g_test_add_func("/hmac/md5/null text",
+	                test_hmac_md5_null_text);
+	g_test_add_func("/hmac/md5/null key and text",
+	                test_hmac_md5_null_key_and_text);
+
+	g_test_add_func("/hmac/sha1/hi",
+	                test_hmac_sha1_hi);
+	g_test_add_func("/hmac/sha1/what",
+	                test_hmac_sha1_what);
+	g_test_add_func("/hmac/sha1/dd",
+	                test_hmac_sha1_dd);
+	g_test_add_func("/hmac/sha1/cd",
+	                test_hmac_sha1_cd);
+	g_test_add_func("/hmac/sha1/truncation",
+	                test_hmac_sha1_truncation);
+	g_test_add_func("/hmac/sha1/large key",
+	                test_hmac_sha1_large_key);
+	g_test_add_func("/hmac/sha1/large key and data",
+	                test_hmac_sha1_large_key_and_data);
+	g_test_add_func("/hmac/sha1/null key",
+	                test_hmac_sha1_null_key);
+	g_test_add_func("/hmac/sha1/null text",
+	                test_hmac_sha1_null_text);
+	g_test_add_func("/hmac/sha1/null key and text",
+	                test_hmac_sha1_null_key_and_text);
+
+	return g_test_run();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_md4.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,85 @@
+#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();
+}
--- a/libpurple/tests/test_md4hash.c	Wed Mar 09 22:23:39 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-#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();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_md5.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,85 @@
+#include <glib.h>
+
+#include <purple.h>
+
+#include "ciphers/md5hash.h"
+
+static void
+test_md5hash(gchar *data, gchar *digest) {
+	PurpleHash *hash = NULL;
+	gchar cdigest[33];
+	gboolean ret = FALSE;
+
+	hash = purple_md5_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_md5hash_empty_string(void) {
+	test_md5hash("",
+	             "d41d8cd98f00b204e9800998ecf8427e");
+}
+
+static void
+test_md5hash_a(void) {
+	test_md5hash("a",
+	             "0cc175b9c0f1b6a831c399e269772661");
+}
+
+static void
+test_md5hash_abc(void) {
+	test_md5hash("abc",
+	             "900150983cd24fb0d6963f7d28e17f72");
+}
+
+static void
+test_md5hash_message_digest(void) {
+	test_md5hash("message digest",
+	             "f96b697d7cb7938d525a2f31aaf161d0");
+}
+
+static void
+test_md5hash_a_to_z(void) {
+	test_md5hash("abcdefghijklmnopqrstuvwxyz",
+	             "c3fcd3d76192e4007dfb496cca67e13b");
+}
+
+static void
+test_md5hash_A_to_Z_a_to_z_0_to_9(void) {
+	test_md5hash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+	             "d174ab98d277d9f5a5611c2c9f419d9f");
+}
+
+static void
+test_md5hash_1_to_0_eight_times(void) {
+	test_md5hash("12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+	             "57edf4a22be3c955ac49da2e2107b67a");
+}
+
+gint
+main(gint argc, gchar **argv) {
+	g_test_init(&argc, &argv, NULL);
+
+	g_test_add_func("/hash/md5/empty-string",
+	                test_md5hash_empty_string);
+	g_test_add_func("/hash/md5/a",
+	                test_md5hash_a);
+	g_test_add_func("/hash/md5/abc",
+	                test_md5hash_abc);
+	g_test_add_func("/hash/md5/message digest",
+	                test_md5hash_message_digest);
+	g_test_add_func("/hash/md5/a to z",
+	                test_md5hash_a_to_z);
+	g_test_add_func("/hash/md5/A to Z, a to z, 0 to 9" ,
+	                test_md5hash_A_to_Z_a_to_z_0_to_9);
+	g_test_add_func("/hash/md5/1 to 0 eight times",
+	                test_md5hash_1_to_0_eight_times);
+
+	return g_test_run();
+}
--- a/libpurple/tests/test_md5hash.c	Wed Mar 09 22:23:39 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-#include <glib.h>
-
-#include <purple.h>
-
-#include "ciphers/md5hash.h"
-
-static void
-test_md5hash(gchar *data, gchar *digest) {
-	PurpleHash *hash = NULL;
-	gchar cdigest[33];
-	gboolean ret = FALSE;
-
-	hash = purple_md5_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_md5hash_empty_string(void) {
-	test_md5hash("",
-	             "d41d8cd98f00b204e9800998ecf8427e");
-}
-
-static void
-test_md5hash_a(void) {
-	test_md5hash("a",
-	             "0cc175b9c0f1b6a831c399e269772661");
-}
-
-static void
-test_md5hash_abc(void) {
-	test_md5hash("abc",
-	             "900150983cd24fb0d6963f7d28e17f72");
-}
-
-static void
-test_md5hash_message_digest(void) {
-	test_md5hash("message digest",
-	             "f96b697d7cb7938d525a2f31aaf161d0");
-}
-
-static void
-test_md5hash_a_to_z(void) {
-	test_md5hash("abcdefghijklmnopqrstuvwxyz",
-	             "c3fcd3d76192e4007dfb496cca67e13b");
-}
-
-static void
-test_md5hash_A_to_Z_a_to_z_0_to_9(void) {
-	test_md5hash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-	             "d174ab98d277d9f5a5611c2c9f419d9f");
-}
-
-static void
-test_md5hash_1_to_0_eight_times(void) {
-	test_md5hash("12345678901234567890123456789012345678901234567890123456789012345678901234567890",
-	             "57edf4a22be3c955ac49da2e2107b67a");
-}
-
-gint
-main(gint argc, gchar **argv) {
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_add_func("/hash/md5/empty-string",
-	                test_md5hash_empty_string);
-	g_test_add_func("/hash/md5/a",
-	                test_md5hash_a);
-	g_test_add_func("/hash/md5/abc",
-	                test_md5hash_abc);
-	g_test_add_func("/hash/md5/message digest",
-	                test_md5hash_message_digest);
-	g_test_add_func("/hash/md5/a to z",
-	                test_md5hash_a_to_z);
-	g_test_add_func("/hash/md5/A to Z, a to z, 0 to 9" ,
-	                test_md5hash_A_to_Z_a_to_z_0_to_9);
-	g_test_add_func("/hash/md5/1 to 0 eight times",
-	                test_md5hash_1_to_0_eight_times);
-
-	return g_test_run();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_sha1.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,79 @@
+#include <glib.h>
+
+#include <purple.h>
+
+#include "ciphers/sha1hash.h"
+
+static void
+test_sha1hash(gchar *data, gchar *digest) {
+	PurpleHash *hash = NULL;
+	gchar cdigest[41];
+	gboolean ret = FALSE;
+
+	hash = purple_sha1_hash_new();
+
+	if(data) {
+		purple_hash_append(hash, (guchar *)data, strlen(data));
+	} else {
+		gint j;
+		guchar buff[1000];
+
+		memset(buff, 'a', 1000);
+
+		for(j = 0; j < 1000; j++)
+			purple_hash_append(hash, buff, 1000);
+	}
+
+	ret = purple_hash_digest_to_str(hash, cdigest, sizeof(cdigest));
+
+	g_assert(ret);
+	g_assert_cmpstr(digest, ==, cdigest);
+}
+
+static void
+test_sha1hash_empty_string(void) {
+	test_sha1hash("",
+	              "da39a3ee5e6b4b0d3255bfef95601890afd80709");
+}
+
+static void
+test_sha1hash_a(void) {
+	test_sha1hash("a",
+	              "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8");
+}
+
+static void
+test_sha1hash_abc(void) {
+	test_sha1hash("abc",
+	              "a9993e364706816aba3e25717850c26c9cd0d89d");
+}
+
+static void
+test_sha1hash_abcd_gibberish(void) {
+	test_sha1hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+	              "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
+}
+
+static void
+test_sha1hash_1000_as_1000_times(void) {
+	test_sha1hash(NULL,
+	              "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
+}
+
+gint
+main(gint argc, gchar **argv) {
+	g_test_init(&argc, &argv, NULL);
+
+	g_test_add_func("/hash/sha1/empty-string",
+	                test_sha1hash_empty_string);
+	g_test_add_func("/hash/sha1/a",
+	                test_sha1hash_a);
+	g_test_add_func("/hash/sha1/abc",
+	                test_sha1hash_abc);
+	g_test_add_func("/hash/sha1/abcd_gibberish",
+	                test_sha1hash_abcd_gibberish);
+	g_test_add_func("/hash/sha1/1000 a's 1000 times",
+	                test_sha1hash_1000_as_1000_times);
+
+	return g_test_run();
+}
--- a/libpurple/tests/test_sha1hash.c	Wed Mar 09 22:23:39 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-#include <glib.h>
-
-#include <purple.h>
-
-#include "ciphers/sha1hash.h"
-
-static void
-test_sha1hash(gchar *data, gchar *digest) {
-	PurpleHash *hash = NULL;
-	gchar cdigest[41];
-	gboolean ret = FALSE;
-
-	hash = purple_sha1_hash_new();
-
-	if(data) {
-		purple_hash_append(hash, (guchar *)data, strlen(data));
-	} else {
-		gint j;
-		guchar buff[1000];
-
-		memset(buff, 'a', 1000);
-
-		for(j = 0; j < 1000; j++)
-			purple_hash_append(hash, buff, 1000);
-	}
-
-	ret = purple_hash_digest_to_str(hash, cdigest, sizeof(cdigest));
-
-	g_assert(ret);
-	g_assert_cmpstr(digest, ==, cdigest);
-}
-
-static void
-test_sha1hash_empty_string(void) {
-	test_sha1hash("",
-	              "da39a3ee5e6b4b0d3255bfef95601890afd80709");
-}
-
-static void
-test_sha1hash_a(void) {
-	test_sha1hash("a",
-	              "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8");
-}
-
-static void
-test_sha1hash_abc(void) {
-	test_sha1hash("abc",
-	              "a9993e364706816aba3e25717850c26c9cd0d89d");
-}
-
-static void
-test_sha1hash_abcd_gibberish(void) {
-	test_sha1hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	              "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
-}
-
-static void
-test_sha1hash_1000_as_1000_times(void) {
-	test_sha1hash(NULL,
-	              "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
-}
-
-gint
-main(gint argc, gchar **argv) {
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_add_func("/hash/sha1/empty-string",
-	                test_sha1hash_empty_string);
-	g_test_add_func("/hash/sha1/a",
-	                test_sha1hash_a);
-	g_test_add_func("/hash/sha1/abc",
-	                test_sha1hash_abc);
-	g_test_add_func("/hash/sha1/abcd_gibberish",
-	                test_sha1hash_abcd_gibberish);
-	g_test_add_func("/hash/sha1/1000 a's 1000 times",
-	                test_sha1hash_1000_as_1000_times);
-
-	return g_test_run();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_sha256.c	Thu Mar 10 20:54:09 2016 -0600
@@ -0,0 +1,79 @@
+#include <glib.h>
+
+#include <purple.h>
+
+#include "ciphers/sha256hash.h"
+
+static void
+test_sha256hash(gchar *data, gchar *digest) {
+	PurpleHash *hash = NULL;
+	gchar cdigest[65];
+	gboolean ret = FALSE;
+
+	hash = purple_sha256_hash_new();
+
+	if(data) {
+		purple_hash_append(hash, (guchar *)data, strlen(data));
+	} else {
+		gint j;
+		guchar buff[1000];
+
+		memset(buff, 'a', 1000);
+
+		for(j = 0; j < 1000; j++)
+			purple_hash_append(hash, buff, 1000);
+	}
+
+	ret = purple_hash_digest_to_str(hash, cdigest, sizeof(cdigest));
+
+	g_assert(ret);
+	g_assert_cmpstr(digest, ==, cdigest);
+}
+
+static void
+test_sha256hash_empty_string(void) {
+	test_sha256hash("",
+	                "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
+}
+
+static void
+test_sha256hash_a(void) {
+	test_sha256hash("a",
+	                "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb");
+}
+
+static void
+test_sha256hash_abc(void) {
+	test_sha256hash("abc",
+	                "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
+}
+
+static void
+test_sha256hash_abcd_gibberish(void) {
+	test_sha256hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+	                "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
+}
+
+static void
+test_sha256hash_1000_as_1000_times(void) {
+	test_sha256hash(NULL,
+	                "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
+}
+
+gint
+main(gint argc, gchar **argv) {
+	g_test_init(&argc, &argv, NULL);
+
+	g_test_add_func("/hash/sha256/empty-string",
+	                test_sha256hash_empty_string);
+	g_test_add_func("/hash/sha256/a",
+	                test_sha256hash_a);
+	g_test_add_func("/hash/sha256/abc",
+	                test_sha256hash_abc);
+	g_test_add_func("/hash/sha256/abcd_gibberish",
+	                test_sha256hash_abcd_gibberish);
+	g_test_add_func("/hash/sha256/1000 a's 1000 times",
+	                test_sha256hash_1000_as_1000_times);
+
+	return g_test_run();
+}
--- a/libpurple/tests/test_sha256hash.c	Wed Mar 09 22:23:39 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-#include <glib.h>
-
-#include <purple.h>
-
-#include "ciphers/sha256hash.h"
-
-static void
-test_sha256hash(gchar *data, gchar *digest) {
-	PurpleHash *hash = NULL;
-	gchar cdigest[65];
-	gboolean ret = FALSE;
-
-	hash = purple_sha256_hash_new();
-
-	if(data) {
-		purple_hash_append(hash, (guchar *)data, strlen(data));
-	} else {
-		gint j;
-		guchar buff[1000];
-
-		memset(buff, 'a', 1000);
-
-		for(j = 0; j < 1000; j++)
-			purple_hash_append(hash, buff, 1000);
-	}
-
-	ret = purple_hash_digest_to_str(hash, cdigest, sizeof(cdigest));
-
-	g_assert(ret);
-	g_assert_cmpstr(digest, ==, cdigest);
-}
-
-static void
-test_sha256hash_empty_string(void) {
-	test_sha256hash("",
-	                "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
-}
-
-static void
-test_sha256hash_a(void) {
-	test_sha256hash("a",
-	                "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb");
-}
-
-static void
-test_sha256hash_abc(void) {
-	test_sha256hash("abc",
-	                "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
-}
-
-static void
-test_sha256hash_abcd_gibberish(void) {
-	test_sha256hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-	                "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
-}
-
-static void
-test_sha256hash_1000_as_1000_times(void) {
-	test_sha256hash(NULL,
-	                "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
-}
-
-gint
-main(gint argc, gchar **argv) {
-	g_test_init(&argc, &argv, NULL);
-
-	g_test_add_func("/hash/sha256/empty-string",
-	                test_sha256hash_empty_string);
-	g_test_add_func("/hash/sha256/a",
-	                test_sha256hash_a);
-	g_test_add_func("/hash/sha256/abc",
-	                test_sha256hash_abc);
-	g_test_add_func("/hash/sha256/abcd_gibberish",
-	                test_sha256hash_abcd_gibberish);
-	g_test_add_func("/hash/sha256/1000 a's 1000 times",
-	                test_sha256hash_1000_as_1000_times);
-
-	return g_test_run();
-}

mercurial