summaryrefslogtreecommitdiff
path: root/modules/extra/enc_bcrypt.cpp
diff options
context:
space:
mode:
authorDaniel Vassdal <shutter@canternet.org>2014-02-17 18:49:44 -0800
committerDaniel Vassdal <shutter@canternet.org>2014-02-20 11:42:20 -0800
commitb6935e706cc29a05b827efaea6317885bfa2987b (patch)
tree72068ae943c1801c65bfd9730f91ec11fc5d61e1 /modules/extra/enc_bcrypt.cpp
parent109d8f431f3d25d56570a6aaa1af957867bbb80e (diff)
enc_bcrypt.cpp: Get rid of the libxcrypt dependency by including code from libxcrypt, and move enc_bcrypt out of extras
Diffstat (limited to 'modules/extra/enc_bcrypt.cpp')
-rw-r--r--modules/extra/enc_bcrypt.cpp121
1 files changed, 0 insertions, 121 deletions
diff --git a/modules/extra/enc_bcrypt.cpp b/modules/extra/enc_bcrypt.cpp
deleted file mode 100644
index cd5e05c35..000000000
--- a/modules/extra/enc_bcrypt.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/* RequiredLibraries: xcrypt */
-
-#include "module.h"
-#include "modules/encryption.h"
-#include <xcrypt.h>
-
-class EBCRYPT : public Module
-{
- unsigned int rounds;
-
- Anope::string Salt()
- {
- char entropy[16];
- for (unsigned int i = 0; i < sizeof(entropy); i++)
- entropy[i] = static_cast<char>(rand() % 0xFF);
-
- char salt[32];
- if (!crypt_gensalt_rn("$2a$", rounds, entropy, sizeof(entropy), salt, sizeof(salt)))
- return "";
- return salt;
- }
-
- Anope::string Generate(const Anope::string& data, const Anope::string& salt)
- {
- char hash[64];
- crypt_rn(data.c_str(), salt.c_str(), hash, sizeof(hash));
- return hash;
- }
-
- bool Compare(const Anope::string& string, const Anope::string& hash)
- {
- Anope::string ret = Generate(string, hash);
- if (ret.empty())
- return false;
-
- return (ret == hash);
- }
-
- public:
- EBCRYPT(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, ENCRYPTION | VENDOR | EXTRA),
- rounds(10)
- {
- // Should obviously never happen, but if xcrypt somehow was compiled without support for $2a$ I guess it might
- if (Salt() == "")
- throw ModuleException("Could not salt! BCrypt will not be available!");
- }
-
- EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest) anope_override
- {
- dest = "bcrypt:" + Generate(src, Salt());
- Log(LOG_DEBUG_2) << "(enc_bcrypt) hashed password from [" << src << "] to [" << dest << "]";
- return EVENT_ALLOW;
- }
-
- void OnCheckAuthentication(User *, IdentifyRequest *req) anope_override
- {
- const NickAlias *na = NickAlias::Find(req->GetAccount());
- if (na == NULL)
- return;
- NickCore *nc = na->nc;
-
- size_t pos = nc->pass.find(':');
- if (pos == Anope::string::npos)
- return;
- Anope::string hash_method(nc->pass.begin(), nc->pass.begin() + pos);
- if (hash_method != "bcrypt")
- return;
-
- if (Compare(req->GetPassword(), nc->pass.substr(7)))
- {
- /* if we are NOT the first module in the list,
- * we want to re-encrypt the pass with the new encryption
- */
-
- unsigned int hashrounds = 0;
- try
- {
- size_t roundspos = nc->pass.find('$', 11);
- if (roundspos == Anope::string::npos)
- throw ConvertException("Could not find hashrounds");
-
- hashrounds = convertTo<unsigned int>(nc->pass.substr(11, roundspos - 11));
- }
- catch (const ConvertException &)
- {
- Log(this) << "Could not get the round size of a hash. This is probably a bug. Hash: " << nc->pass;
- }
-
- if (ModuleManager::FindFirstOf(ENCRYPTION) != this || (hashrounds && hashrounds != rounds))
- Anope::Encrypt(req->GetPassword(), nc->pass);
- req->Success(this);
- }
- }
-
- void OnReload(Configuration::Conf *conf) anope_override
- {
- Configuration::Block *block = conf->GetModule(this);
- rounds = block->Get<unsigned int>("rounds", "10");
-
- if (rounds == 0)
- {
- rounds = 10;
- Log(this) << "Rounds can't be 0! Setting ignored.";
- }
- else if (rounds < 10)
- {
- Log(this) << "10 to 12 rounds is recommended.";
- }
- else if (rounds >= 32)
- {
- rounds = 10;
- Log(this) << "The maximum number of rounds supported is 31. Ignoring setting and using 10.";
- }
- else if (rounds >= 14)
- {
- Log(this) << "Are you sure you want to use " << stringify(rounds) << " in your bcrypt settings? This is very CPU intensive! Recommended rounds is 10-12.";
- }
- }
-};
-
-MODULE_INIT(EBCRYPT)