summary refs log tree commit diff stats
path: root/plugins/checksum/checksum.c
diff options
context:
space:
mode:
authorberkeviktor@aol.com <berkeviktor@aol.com>2010-10-20 20:58:08 +0200
committerberkeviktor@aol.com <berkeviktor@aol.com>2010-10-20 20:58:08 +0200
commit676718594338b84812e0c6cbf1b28bf7589f3167 (patch)
treefff705df192ed9973306fdbf418ca57309aa0788 /plugins/checksum/checksum.c
parent48045bdf6aa3b2fe9f4da96fafe98b146933d932 (diff)
convert sha256sum to checksum plugin
Diffstat (limited to 'plugins/checksum/checksum.c')
-rw-r--r--plugins/checksum/checksum.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/plugins/checksum/checksum.c b/plugins/checksum/checksum.c
new file mode 100644
index 00000000..0293a874
--- /dev/null
+++ b/plugins/checksum/checksum.c
@@ -0,0 +1,147 @@
+/* XChat-WDK
+ * Copyright (c) 2010 Berke Viktor.
+ *
+ * Use of OpenSSL SHA256 interface: http://adamlamers.com/?p=5
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <malloc.h>
+#include <errno.h>
+#include <openssl/sha.h>
+
+#include "xchat-plugin.h"
+
+#define BUFSIZE 32768
+
+static xchat_plugin *ph;   /* plugin handle */
+
+void
+sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65])
+{
+	int i = 0;
+	for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
+	{
+		sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
+	}
+	outputBuffer[64] = 0;
+}
+
+void
+sha256 (char *string, char outputBuffer[65])
+{
+	int i;
+	unsigned char hash[SHA256_DIGEST_LENGTH];
+	SHA256_CTX sha256;
+
+	SHA256_Init (&sha256);
+	SHA256_Update (&sha256, string, strlen(string));
+	SHA256_Final (hash, &sha256);
+
+	for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
+	{
+		sprintf (outputBuffer + (i * 2), "%02x", hash[i]);
+	}
+	outputBuffer[64] = 0;
+}
+
+int
+sha256_file (char *path, char outputBuffer[65])
+{
+	int bytesRead;
+	unsigned char *buffer;
+	unsigned char hash[SHA256_DIGEST_LENGTH];
+	SHA256_CTX sha256;
+
+	FILE *file = fopen (path, "rb");
+	if (!file)
+	{
+		return -534;
+	}
+
+	SHA256_Init (&sha256);
+	buffer = malloc (BUFSIZE);
+	bytesRead = 0;
+
+	if (!buffer)
+	{
+		return ENOMEM;
+	}
+
+	while ((bytesRead = fread (buffer, 1, BUFSIZE, file)))
+	{
+		SHA256_Update (&sha256, buffer, bytesRead);
+    }
+
+    SHA256_Final (hash, &sha256);
+    sha256_hash_string (hash, outputBuffer);
+
+	fclose (file);
+    free (buffer);
+    return 0;
+}
+
+int
+dccrecv_cb(char *word[], void *userdata)
+{
+	unsigned char sum[65];
+	sha256_file (word[2], sum);
+	xchat_printf (ph, "DCC RECV %s from %s complete [%s cps]", word[1], word[3], word[4]);
+	xchat_printf (ph, "SHA256 checksum for %s: %s\n", word[1], sum);
+	return XCHAT_EAT_XCHAT;
+}
+
+int
+dccoffer_cb(char *word[], void *userdata)
+{
+	unsigned char sum[65];
+	sha256_file (word[3], sum);
+	xchat_printf (ph, "Offering %s to %s", word[1], word[2]);
+	xchat_printf (ph, "SHA256 checksum for %s: %s\n", word[1], sum);
+	return XCHAT_EAT_XCHAT;
+}
+
+int
+xchat_plugin_init (xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg)
+{
+	ph = plugin_handle;
+
+	*plugin_name = "Checksum";
+	*plugin_desc = "Calculate checksum for DCC file transfers";
+	*plugin_version = "1.0";
+	
+	xchat_hook_print(ph, "DCC RECV Complete", XCHAT_PRI_NORM, dccrecv_cb, NULL);
+	xchat_hook_print(ph, "DCC Offer", XCHAT_PRI_NORM, dccoffer_cb, NULL);
+
+	xchat_print (ph, "Checksum plugin loaded\n");
+
+	return 1;
+}
+
+int
+xchat_plugin_deinit (void)
+{
+	xchat_print (ph, "Checksum plugin unloaded\n");
+	return 1;
+}