diff options
author | Sadie Powell <sadie@witchery.services> | 2024-03-09 22:51:23 +0000 |
---|---|---|
committer | Sadie Powell <sadie@witchery.services> | 2024-03-09 22:51:23 +0000 |
commit | defb8348a79e499700cefaf2f4a63daefeaaac7e (patch) | |
tree | 3b737a09c9565d7dcb1603716b571548e79f1385 /include/modules/encryption.h | |
parent | 1b86665d81c0beefb140dcd2eaac8274e88617da (diff) |
Move the HMAC function to the encryption header.
This will be useful for doing challenge authentication on InspIRCd.
Diffstat (limited to 'include/modules/encryption.h')
-rw-r--r-- | include/modules/encryption.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/include/modules/encryption.h b/include/modules/encryption.h index 6b13fcf41..0eec23ec3 100644 --- a/include/modules/encryption.h +++ b/include/modules/encryption.h @@ -73,6 +73,27 @@ namespace Encryption context->Update(std::forward<Args>(args)...); return context->Finalize(); } + + inline Anope::string HMAC(const Anope::string &key, const Anope::string &data) + { + if (!block_size) + return {}; + + auto keybuf = key.length() > block_size ? Encrypt(key) : key; + keybuf.resize(block_size); + + Anope::string hmac1; + Anope::string hmac2; + for (size_t i = 0; i < block_size; ++i) + { + hmac1.push_back(static_cast<char>(keybuf[i] ^ 0x5C)); + hmac2.push_back(static_cast<char>(keybuf[i] ^ 0x36)); + } + hmac2.append(data); + hmac1.append(Encrypt(hmac2)); + + return Encrypt(hmac1); + } }; /** Helper template for creating simple providers of encryption contexts. */ |