aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/openssl/big_integer/big_integer.cpp
diff options
context:
space:
mode:
authorqrort <qrort@yandex-team.com>2022-11-30 23:47:12 +0300
committerqrort <qrort@yandex-team.com>2022-11-30 23:47:12 +0300
commit22f8ae0e3f5d68b92aecccdf96c1d841a0334311 (patch)
treebffa27765faf54126ad44bcafa89fadecb7a73d7 /library/cpp/openssl/big_integer/big_integer.cpp
parent332b99e2173f0425444abb759eebcb2fafaa9209 (diff)
downloadydb-22f8ae0e3f5d68b92aecccdf96c1d841a0334311.tar.gz
validate canons without yatest_common
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..9b6802369a
--- /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 <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();
+}