From 676718594338b84812e0c6cbf1b28bf7589f3167 Mon Sep 17 00:00:00 2001 From: "berkeviktor@aol.com" Date: Wed, 20 Oct 2010 20:58:08 +0200 Subject: convert sha256sum to checksum plugin --- plugins/checksum/checksum.c | 147 ++++++++++++++++++++++++++++++++++++++++++ plugins/checksum/makefile.mak | 18 ++++++ 2 files changed, 165 insertions(+) create mode 100644 plugins/checksum/checksum.c create mode 100644 plugins/checksum/makefile.mak (limited to 'plugins') 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 +#include +#include +#include + +#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; +} diff --git a/plugins/checksum/makefile.mak b/plugins/checksum/makefile.mak new file mode 100644 index 00000000..9e2aae88 --- /dev/null +++ b/plugins/checksum/makefile.mak @@ -0,0 +1,18 @@ +include "..\..\src\makeinc.mak" + +all: checksum.obj checksum.def + link $(LDFLAGS) $(LIBS) /dll /out:xcchecksum.dll /libpath:$(LUAPATH)\lib $(LUALIB).lib /def:checksum.def checksum.obj + +checksum.def: + echo EXPORTS > checksum.def + echo xchat_plugin_init >> checksum.def + echo xchat_plugin_deinit >> checksum.def + +checksum.obj: checksum.c makefile.mak + cl $(CFLAGS) /Dsnprintf=g_snprintf /I$(LUAPATH)\include checksum.c + +clean: + del *.obj + del *.dll + del *.exp + del *.lib -- cgit 1.4.1