aboutsummaryrefslogtreecommitdiff
path: root/src/common/Cryptography/CryptoGenerics.h
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-07-26 01:53:34 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-03 19:39:00 +0200
commite9392ad28767626e519c463e2110184d71ba8426 (patch)
treeda391d7daf1ede4ef73883b5053520e160dc4ec4 /src/common/Cryptography/CryptoGenerics.h
parentcaa1e1171a1ea4e2db754cfb52b3be795385d544 (diff)
Core/Authserver: Authserver cleanup (PR#25093)
- Fix a handful of 1/256 bugs with most significant byte zero in BigNumber - Get rid of (most of) the C-style arrays in authserver - CryptoRandom as a unified source for cryptographic randomness - Bring our other crypto APIs into 2020 - BigNumber usability improvements - Authserver is now actually readable as a result of all of the above (cherry picked from commit 210176fd915cf4ba16f428d3c1a249a71f4aa7a7)
Diffstat (limited to 'src/common/Cryptography/CryptoGenerics.h')
-rw-r--r--src/common/Cryptography/CryptoGenerics.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/common/Cryptography/CryptoGenerics.h b/src/common/Cryptography/CryptoGenerics.h
new file mode 100644
index 00000000000..affa11bf79d
--- /dev/null
+++ b/src/common/Cryptography/CryptoGenerics.h
@@ -0,0 +1,117 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITY_CRYPTO_GENERICS_HPP
+#define TRINITY_CRYPTO_GENERICS_HPP
+
+#include "BigNumber.h"
+#include "CryptoRandom.h"
+#include "Define.h"
+#include "Errors.h"
+#include <iterator>
+#include <vector>
+
+namespace Trinity
+{
+namespace Impl
+{
+ struct CryptoGenericsImpl
+ {
+ template <typename Cipher>
+ static typename Cipher::IV GenerateRandomIV()
+ {
+ typename Cipher::IV iv;
+ Trinity::Crypto::GetRandomBytes(iv);
+ return iv;
+ }
+
+ template <typename Container>
+ static void AppendToBack(std::vector<uint8>& data, Container const& tail)
+ {
+ data.insert(data.end(), std::begin(tail), std::end(tail));
+ }
+
+ template <typename Container>
+ static void SplitFromBack(std::vector<uint8>& data, Container& tail)
+ {
+ ASSERT(data.size() >= std::size(tail));
+ for (size_t i = 1, N = std::size(tail); i <= N; ++i)
+ {
+ tail[N - i] = data.back();
+ data.pop_back();
+ }
+ }
+ };
+}
+}
+
+namespace Trinity
+{
+namespace Crypto
+{
+ template <typename Cipher>
+ void AEEncryptWithRandomIV(std::vector<uint8>& data, typename Cipher::Key const& key)
+ {
+ using IV = typename Cipher::IV;
+ using Tag = typename Cipher::Tag;
+ // select random IV
+ IV iv = Trinity::Impl::CryptoGenericsImpl::GenerateRandomIV<Cipher>();
+ Tag tag;
+
+ // encrypt data
+ Cipher cipher(true);
+ cipher.Init(key);
+ bool success = cipher.Process(iv, data.data(), data.size(), tag);
+ ASSERT(success);
+
+ // append trailing IV and tag
+ Trinity::Impl::CryptoGenericsImpl::AppendToBack(data, iv);
+ Trinity::Impl::CryptoGenericsImpl::AppendToBack(data, tag);
+ }
+
+ template <typename Cipher>
+ void AEEncryptWithRandomIV(std::vector<uint8>& data, BigNumber const& key)
+ {
+ AEEncryptWithRandomIV<Cipher>(data, key.ToByteArray<Cipher::KEY_SIZE_BYTES>());
+ }
+
+ template <typename Cipher>
+ bool AEDecrypt(std::vector<uint8>& data, typename Cipher::Key const& key)
+ {
+ using IV = typename Cipher::IV;
+ using Tag = typename Cipher::Tag;
+ // extract trailing IV and tag
+ IV iv;
+ Tag tag;
+ Trinity::Impl::CryptoGenericsImpl::SplitFromBack(data, tag);
+ Trinity::Impl::CryptoGenericsImpl::SplitFromBack(data, iv);
+
+ // decrypt data
+ Cipher cipher(false);
+ cipher.Init(key);
+ return cipher.Process(iv, data.data(), data.size(), tag);
+ }
+
+ template <typename Cipher>
+ bool AEDecrypt(std::vector<uint8>& data, BigNumber const& key)
+ {
+ return AEDecrypt<Cipher>(data, key.ToByteArray<Cipher::KEY_SIZE_BYTES>());
+ }
+}
+}
+
+#endif