aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Cryptography/BigNumber.cpp
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2013-08-18 18:13:14 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2013-08-18 18:13:14 +0200
commitf16f427c48cb7fb9a62b75066f831af541d0ca02 (patch)
treecef1f28b26e234ad088169eb0d83132f0754af52 /src/server/shared/Cryptography/BigNumber.cpp
parent74689b1d93c2150130907b6baac861bfbcc47dd3 (diff)
parent19343ddd557fd03aecf7a19d310f46c62a8f336f (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/Entities/Unit/Unit.cpp src/server/game/Entities/Unit/Unit.h src/server/game/Handlers/CharacterHandler.cpp src/server/game/Server/WorldSocket.cpp src/server/game/Spells/Spell.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp src/server/scripts/Kalimdor/CMakeLists.txt src/server/scripts/Kalimdor/zone_azshara.cpp src/server/scripts/Kalimdor/zone_moonglade.cpp src/server/scripts/Kalimdor/zone_orgrimmar.cpp src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp src/server/scripts/Spells/spell_hunter.cpp
Diffstat (limited to 'src/server/shared/Cryptography/BigNumber.cpp')
-rw-r--r--src/server/shared/Cryptography/BigNumber.cpp43
1 files changed, 21 insertions, 22 deletions
diff --git a/src/server/shared/Cryptography/BigNumber.cpp b/src/server/shared/Cryptography/BigNumber.cpp
index 06ea57b662e..38c274b7555 100644
--- a/src/server/shared/Cryptography/BigNumber.cpp
+++ b/src/server/shared/Cryptography/BigNumber.cpp
@@ -22,17 +22,18 @@
#include <openssl/bn.h>
#include <openssl/crypto.h>
#include <algorithm>
+#include <ace/Auto_Ptr.h>
BigNumber::BigNumber()
- : _bn(BN_new()), _array(NULL)
+ : _bn(BN_new())
{ }
BigNumber::BigNumber(BigNumber const& bn)
- : _bn(BN_dup(bn._bn)), _array(NULL)
+ : _bn(BN_dup(bn._bn))
{ }
BigNumber::BigNumber(uint32 val)
- : _bn(BN_new()), _array(NULL)
+ : _bn(BN_new())
{
BN_set_word(_bn, val);
}
@@ -40,7 +41,6 @@ BigNumber::BigNumber(uint32 val)
BigNumber::~BigNumber()
{
BN_free(_bn);
- delete[] _array;
}
void BigNumber::SetDword(uint32 val)
@@ -50,16 +50,21 @@ void BigNumber::SetDword(uint32 val)
void BigNumber::SetQword(uint64 val)
{
- BN_add_word(_bn, (uint32)(val >> 32));
+ BN_set_word(_bn, (uint32)(val >> 32));
BN_lshift(_bn, _bn, 32);
BN_add_word(_bn, (uint32)(val & 0xFFFFFFFF));
}
void BigNumber::SetBinary(uint8 const* bytes, int32 len)
{
- uint8 t[1000];
- for (int i = 0; i < len; i++) t[i] = bytes[len - 1 - i];
- BN_bin2bn(t, len, _bn);
+ uint8* array = new uint8[len];
+
+ for (int i = 0; i < len; i++)
+ array[i] = bytes[len - 1 - i];
+
+ BN_bin2bn(array, len, _bn);
+
+ delete[] array;
}
void BigNumber::SetHexStr(char const* str)
@@ -165,29 +170,23 @@ bool BigNumber::isZero() const
return BN_is_zero(_bn);
}
-uint8* BigNumber::AsByteArray(int32 minSize, bool reverse)
+ACE_Auto_Array_Ptr<uint8> BigNumber::AsByteArray(int32 minSize, bool littleEndian)
{
int length = (minSize >= GetNumBytes()) ? minSize : GetNumBytes();
- ACE_GUARD_RETURN(ACE_Mutex, g, _lock, 0);
-
- if (_array)
- {
- delete[] _array;
- _array = NULL;
- }
- _array = new uint8[length];
+ uint8* array = new uint8[length];
// If we need more bytes than length of BigNumber set the rest to 0
if (length > GetNumBytes())
- memset((void*)_array, 0, length);
+ memset((void*)array, 0, length);
- BN_bn2bin(_bn, (unsigned char *)_array);
+ BN_bn2bin(_bn, (unsigned char *)array);
- if (reverse)
- std::reverse(_array, _array + length);
+ // openssl's BN stores data internally in big endian format, reverse if little endian desired
+ if (littleEndian)
+ std::reverse(array, array + length);
- return _array;
+ return ACE_Auto_Array_Ptr<uint8>(array);
}
char * BigNumber::AsHexStr() const