aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/openssl/big_integer/big_integer.cpp
diff options
context:
space:
mode:
authorkomels <komels@yandex-team.ru>2022-04-14 13:10:53 +0300
committerkomels <komels@yandex-team.ru>2022-04-14 13:10:53 +0300
commit21c9b0e6b039e9765eb414c406c2b86e8cea6850 (patch)
treef40ebc18ff8958dfbd189954ad024043ca983ea5 /library/cpp/openssl/big_integer/big_integer.cpp
parent9a4effa852abe489707139c2b260dccc6f4f9aa9 (diff)
downloadydb-21c9b0e6b039e9765eb414c406c2b86e8cea6850.tar.gz
Final part on compatibility layer: LOGBROKER-7215
ref:777c67aadbf705d19034a09a792b2df61ba53697
Diffstat (limited to 'library/cpp/openssl/big_integer/big_integer.cpp')
-rw-r--r--library/cpp/openssl/big_integer/big_integer.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/library/cpp/openssl/big_integer/big_integer.cpp b/library/cpp/openssl/big_integer/big_integer.cpp
new file mode 100644
index 0000000000..de59f84499
--- /dev/null
+++ b/library/cpp/openssl/big_integer/big_integer.cpp
@@ -0,0 +1,61 @@
+#include "big_integer.h"
+
+#include <util/generic/yexception.h>
+#include <util/generic/scope.h>
+#include <util/stream/output.h>
+
+#include <contrib/libs/openssl/include/openssl/bn.h>
+
+using namespace NOpenSsl;
+
+TBigInteger::~TBigInteger() noexcept {
+ BN_free(Impl_);
+}
+
+TBigInteger TBigInteger::FromULong(ui64 value) {
+ TBigInteger result(BN_new());
+
+ Y_ENSURE(result.Impl(), "BN_new() failed");
+ Y_ENSURE(BN_set_word(result.Impl(), value) == 1, "BN_set_word() failed");
+
+ return result;
+}
+
+TBigInteger TBigInteger::FromRegion(const void* ptr, size_t len) {
+ auto result = BN_bin2bn((ui8*)(ptr), len, nullptr);
+
+ Y_ENSURE(result, "BN_bin2bn() failed");
+
+ return result;
+}
+
+int TBigInteger::Compare(const TBigInteger& a, const TBigInteger& b) noexcept {
+ return BN_cmp(a.Impl(), b.Impl());
+}
+
+size_t TBigInteger::NumBytes() const noexcept {
+ return BN_num_bytes(Impl_);
+}
+
+size_t TBigInteger::ToRegion(void* to) const noexcept {
+ const auto ret = BN_bn2bin(Impl_, (unsigned char*)to);
+
+ Y_VERIFY(ret >= 0, "it happens");
+
+ return ret;
+}
+
+TString TBigInteger::ToDecimalString() const {
+ auto res = BN_bn2dec(Impl_);
+
+ Y_DEFER {
+ OPENSSL_free(res);
+ };
+
+ return res;
+}
+
+template <>
+void Out<TBigInteger>(IOutputStream& out, const TBigInteger& bi) {
+ out << bi.ToDecimalString();
+}