/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #ifndef _AUTH_BIGNUMBER_H #define _AUTH_BIGNUMBER_H #include "Define.h" #include "Errors.h" #include #include #include #include struct bignum_st; class BigNumber { public: BigNumber(); BigNumber(BigNumber const& bn); BigNumber(uint32 v) : BigNumber() { SetDword(v); } BigNumber(int32 v) : BigNumber() { SetDword(v); } BigNumber(std::string const& v) : BigNumber() { SetHexStr(v); } template BigNumber(std::array const& v, bool littleEndian = true) : BigNumber() { SetBinary(v.data(), Size, littleEndian); } ~BigNumber(); void SetDword(int32); void SetDword(uint32); void SetQword(uint64); void SetBinary(uint8 const* bytes, int32 len, bool littleEndian = true); template auto SetBinary(Container const& c, bool littleEndian = true) -> std::enable_if_t>> { SetBinary(std::data(c), std::size(c), littleEndian); } void SetHexStr(char const* str); void SetHexStr(std::string const& str) { SetHexStr(str.c_str()); } void SetRand(int32 numbits); BigNumber& operator=(BigNumber const& bn); BigNumber operator+=(BigNumber const& bn); BigNumber operator+(BigNumber const& bn) const { BigNumber t(*this); return t += bn; } BigNumber operator-=(BigNumber const& bn); BigNumber operator-(BigNumber const& bn) const { BigNumber t(*this); return t -= bn; } BigNumber operator*=(BigNumber const& bn); BigNumber operator*(BigNumber const& bn) const { BigNumber t(*this); return t *= bn; } BigNumber operator/=(BigNumber const& bn); BigNumber operator/(BigNumber const& bn) const { BigNumber t(*this); return t /= bn; } BigNumber operator%=(BigNumber const& bn); BigNumber operator%(BigNumber const& bn) const { BigNumber t(*this); return t %= bn; } [[nodiscard]] bool isZero() const; BigNumber ModExp(BigNumber const& bn1, BigNumber const& bn2) const; BigNumber Exp(BigNumber const&) const; int32 GetNumBytes() const; struct bignum_st* BN() { return _bn; } struct bignum_st const* BN() const { return _bn; } uint32 AsDword(); void GetBytes(uint8* buf, size_t bufsize, bool littleEndian = true) const; std::vector ToByteVector(int32 minSize = 0, bool littleEndian = true) const; template std::array ToByteArray(bool littleEndian = true) const { std::array buf; GetBytes(buf.data(), Size, littleEndian); return buf; } [[nodiscard]] char* AsHexStr() const; [[nodiscard]] char* AsDecStr() const; private: struct bignum_st* _bn; }; #endif