X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_sha256.cpp;h=c41bd06997c38f67fe11a498662c6ce6087691e0;hb=6d03943426dcce76ba66567a9b18425a5ebb4c0c;hp=d4be6a6a809a19cdc5176bd8e27d969ec98c55d7;hpb=b3ba32d08abd60cdc4a71c04e716a0fea0942055;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_sha256.cpp b/src/modules/m_sha256.cpp index d4be6a6a8..c41bd0699 100644 --- a/src/modules/m_sha256.cpp +++ b/src/modules/m_sha256.cpp @@ -2,12 +2,9 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * - * - * Written by Craig Edwards, Craig McLure, and others. + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits + * * This program is free but copyrighted software; see * the file COPYING for details. * @@ -53,15 +50,10 @@ /* $ModDesc: Allows for SHA-256 encrypted oper passwords */ /* $ModDep: m_hash.h */ -#include "inspircd_config.h" +#include "inspircd.h" #ifdef HAS_STDINT #include #endif -#include "users.h" -#include "channels.h" -#include "modules.h" -#include "inspircd.h" - #include "m_hash.h" #ifndef HAS_STDINT @@ -142,12 +134,12 @@ uint32_t sha256_k[64] = class ModuleSHA256 : public Module { - void SHA256Init(struct SHA256Context *ctx, const unsigned int* key) + void SHA256Init(SHA256Context *ctx, const unsigned int* ikey) { - if (key) + if (ikey) { for (int i = 0; i < 8; i++) - ctx->h[i] = key[i]; + ctx->h[i] = ikey[i]; } else { @@ -158,7 +150,7 @@ class ModuleSHA256 : public Module ctx->tot_len = 0; } - void SHA256Transform(struct SHA256Context *ctx, unsigned char *message, unsigned int block_nb) + void SHA256Transform(SHA256Context *ctx, unsigned char *message, unsigned int block_nb) { uint32_t w[64]; uint32_t wv[8]; @@ -167,7 +159,7 @@ class ModuleSHA256 : public Module { int j; sub_block = message + ((i - 1) << 6); - + for (j = 0; j < 16; j++) PACK32(&sub_block[j << 2], &w[j]); for (j = 16; j < 64; j++) @@ -191,10 +183,29 @@ class ModuleSHA256 : public Module ctx->h[j] += wv[j]; } } - - void SHA256Update(struct SHA256Context *ctx, unsigned char *message, unsigned int len) + + void SHA256Update(SHA256Context *ctx, unsigned char *message, unsigned int len) { - unsigned int rem_len = SHA256_BLOCK_SIZE - ctx->len; + /* + * XXX here be dragons! + * After many hours of pouring over this, I think I've found the problem. + * When Special created our module from the reference one, he used: + * + * unsigned int rem_len = SHA256_BLOCK_SIZE - ctx->len; + * + * instead of the reference's version of: + * + * unsigned int tmp_len = SHA256_BLOCK_SIZE - ctx->len; + * unsigned int rem_len = len < tmp_len ? len : tmp_len; + * + * I've changed back to the reference version of this code, and it seems to work with no errors. + * So I'm inclined to believe this was the problem.. + * -- w00t (January 06, 2008) + */ + unsigned int tmp_len = SHA256_BLOCK_SIZE - ctx->len; + unsigned int rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); if (ctx->len + len < SHA256_BLOCK_SIZE) { @@ -211,8 +222,8 @@ class ModuleSHA256 : public Module ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 6; } - - void SHA256Final(struct SHA256Context *ctx, unsigned char *digest) + + void SHA256Final(SHA256Context *ctx, unsigned char *digest) { unsigned int block_nb = (1 + ((SHA256_BLOCK_SIZE - 9) < (ctx->len % SHA256_BLOCK_SIZE))); unsigned int len_b = (ctx->tot_len + ctx->len) << 3; @@ -224,13 +235,13 @@ class ModuleSHA256 : public Module for (int i = 0 ; i < 8; i++) UNPACK32(ctx->h[i], &digest[i << 2]); } - - void SHA256(const char *src, char *dest, int len, const char* hxc, const unsigned int* key = NULL) + + void SHA256(const char *src, char *dest, int len, const char* hxc, const unsigned int* ikey = NULL) { // Generate the hash unsigned char bytehash[SHA256_DIGEST_SIZE]; - struct SHA256Context ctx; - SHA256Init(&ctx, key); + SHA256Context ctx; + SHA256Init(&ctx, ikey); SHA256Update(&ctx, (unsigned char *)src, (unsigned int)len); SHA256Final(&ctx, bytehash); // Convert it to hex @@ -247,22 +258,20 @@ class ModuleSHA256 : public Module public: - ModuleSHA256(InspIRCd* Me) : Module::Module(Me), key(NULL), chars(NULL) + ModuleSHA256() : key(NULL), chars(NULL) { - ServerInstance->PublishInterface("HashRequest", this); + ServerInstance->Modules->PublishInterface("HashRequest", this); + Implementation eventlist[] = { I_OnRequest }; + ServerInstance->Modules->Attach(eventlist, this, 1); } virtual ~ModuleSHA256() { - ServerInstance->UnpublishInterface("HashRequest", this); + ServerInstance->Modules->UnpublishInterface("HashRequest", this); } - void Implements(char *List) - { - List[I_OnRequest] = 1; - } - virtual char* OnRequest(Request* request) + virtual const char* OnRequest(Request* request) { HashRequest* SHA = (HashRequest*)request; if (strcmp("KEY", request->GetId()) == 0) @@ -276,7 +285,7 @@ class ModuleSHA256 : public Module else if (strcmp("SUM", request->GetId()) == 0) { static char data[MAXBUF]; - SHA256((const char*)SHA->GetHashData(), data, strlen(SHA->GetHashData()), chars ? chars : "0123456789abcdef", key); + SHA256((const char*)SHA->GetHashData().data(), data, SHA->GetHashData().length(), chars ? chars : "0123456789abcdef", key); return data; } else if (strcmp("NAME", request->GetId()) == 0) @@ -293,30 +302,8 @@ class ModuleSHA256 : public Module virtual Version GetVersion() { - return Version(1, 1, 0, 1, VF_VENDOR, API_VERSION); + return Version("Allows for SHA-256 encrypted oper passwords", VF_VENDOR|VF_SERVICEPROVIDER, API_VERSION); } }; - -class ModuleSHA256Factory : public ModuleFactory -{ -public: - ModuleSHA256Factory() - { - } - - ~ModuleSHA256Factory() - { - } - - virtual Module *CreateModule(InspIRCd* Me) - { - return new ModuleSHA256(Me); - } - -}; - -extern "C" void * init_module( void ) -{ - return new ModuleSHA256Factory; -} +MODULE_INIT(ModuleSHA256)