mirror of
https://github.com/thunderbrewhq/common.git
synced 2025-12-12 11:12:29 +00:00
feat(biginteger): add big integer function suite
This commit is contained in:
parent
7ef7db7824
commit
ca7b7c3bc6
3 changed files with 296 additions and 0 deletions
87
common/BigInteger.cpp
Normal file
87
common/BigInteger.cpp
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
#include "common/BigInteger.hpp"
|
||||
#include <cstring>
|
||||
#include <storm/Big.hpp>
|
||||
|
||||
void BigIntegerAdd(void* a, void* b, void* c) {
|
||||
SBigAdd(static_cast<BigData*>(a), static_cast<BigData*>(b), static_cast<BigData*>(c));
|
||||
}
|
||||
|
||||
void BigIntegerAddInt(void* a, void* b, uint32_t c) {
|
||||
BigData* c_;
|
||||
SBigNew(&c_);
|
||||
SBigFromUnsigned(c_, c);
|
||||
|
||||
SBigAdd(static_cast<BigData*>(a), static_cast<BigData*>(b), c_);
|
||||
|
||||
SBigDel(c_);
|
||||
}
|
||||
|
||||
uint32_t BigIntegerBitLen(void* num) {
|
||||
uint32_t len;
|
||||
SBigBitLen(static_cast<BigData*>(num), &len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int32_t BigIntegerCmp(void* a, void* b) {
|
||||
return SBigCompare(static_cast<BigData*>(a), static_cast<BigData*>(b));
|
||||
}
|
||||
|
||||
int32_t BigIntegerCmpInt(void* a, uint32_t b) {
|
||||
BigData* b_;
|
||||
SBigNew(&b_);
|
||||
SBigFromUnsigned(b_, b);
|
||||
|
||||
auto result = SBigCompare(static_cast<BigData*>(a), b_);
|
||||
|
||||
SBigDel(b_);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void BigIntegerFree(void* num) {
|
||||
SBigDel(static_cast<BigData*>(num));
|
||||
}
|
||||
|
||||
void* BigIntegerFromBytes(const uint8_t* data, uint32_t bytes) {
|
||||
BigData* num;
|
||||
SBigNew(&num);
|
||||
SBigFromBinary(num, data, bytes);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
void* BigIntegerFromInt(uint32_t val) {
|
||||
BigData* num;
|
||||
SBigNew(&num);
|
||||
SBigFromUnsigned(num, val);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
void BigIntegerMod(void* a, void* b, void* c) {
|
||||
SBigMod(static_cast<BigData*>(a), static_cast<BigData*>(b), static_cast<BigData*>(c));
|
||||
}
|
||||
|
||||
void BigIntegerModExp(void* a, void* b, void* c, void* d) {
|
||||
SBigPowMod(static_cast<BigData*>(a), static_cast<BigData*>(b), static_cast<BigData*>(c), static_cast<BigData*>(d));
|
||||
}
|
||||
|
||||
void BigIntegerMul(void* a, void* b, void* c) {
|
||||
SBigMul(static_cast<BigData*>(a), static_cast<BigData*>(b), static_cast<BigData*>(c));
|
||||
}
|
||||
|
||||
void BigIntegerSub(void* a, void* b, void* c) {
|
||||
SBigSub(static_cast<BigData*>(a), static_cast<BigData*>(b), static_cast<BigData*>(c));
|
||||
}
|
||||
|
||||
uint32_t BigIntegerToBytes(void* num, uint8_t* bytes, uint32_t maxBytes) {
|
||||
uint32_t copiedBytes;
|
||||
SBigToBinaryBuffer(static_cast<BigData*>(num), bytes, maxBytes, &copiedBytes);
|
||||
|
||||
if (maxBytes > copiedBytes) {
|
||||
memset(&bytes[copiedBytes], 0, maxBytes - copiedBytes);
|
||||
}
|
||||
|
||||
return copiedBytes;
|
||||
}
|
||||
32
common/BigInteger.hpp
Normal file
32
common/BigInteger.hpp
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef COMMON_BIG_INTEGER_HPP
|
||||
#define COMMON_BIG_INTEGER_HPP
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
void BigIntegerAdd(void* a, void* b, void* c);
|
||||
|
||||
void BigIntegerAddInt(void* a, void* b, uint32_t c);
|
||||
|
||||
uint32_t BigIntegerBitLen(void* num);
|
||||
|
||||
int32_t BigIntegerCmp(void* a, void* b);
|
||||
|
||||
int32_t BigIntegerCmpInt(void* a, uint32_t b);
|
||||
|
||||
void BigIntegerFree(void* num);
|
||||
|
||||
void* BigIntegerFromBytes(const uint8_t* bytes, uint32_t len);
|
||||
|
||||
void* BigIntegerFromInt(uint32_t val);
|
||||
|
||||
void BigIntegerMod(void* a, void* b, void* c);
|
||||
|
||||
void BigIntegerModExp(void* a, void* b, void* c, void* d);
|
||||
|
||||
void BigIntegerMul(void* a, void* b, void* c);
|
||||
|
||||
void BigIntegerSub(void* a, void* b, void* c);
|
||||
|
||||
uint32_t BigIntegerToBytes(void* num, uint8_t* bytes, uint32_t maxBytes);
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue