123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #include "epid/common-testhelper/bignum_wrapper-testhelper.h"
- #include "epid/common-testhelper/errors-testhelper.h"
- #include "epid/common/math/bignum.h"
- struct BigNumDeleter {
-
- void operator()(BigNum* bn) {
- if (bn) {
- DeleteBigNum(&bn);
- }
- }
- };
- BigNumDeleter bignum_deleter;
- struct BigNumObj::State {
-
- size_t size;
-
- std::shared_ptr<BigNum> bn_;
-
- State() : size(0), bn_() {}
-
- void write(unsigned char const* buf, size_t buflen, size_t len) {
- bool orig_has_data = (buf != nullptr) && (buflen > 0);
- std::shared_ptr<BigNum> bn;
- BigNum* bn_ptr = nullptr;
- THROW_ON_EPIDERR(NewBigNum(len, &bn_ptr));
- bn.reset(bn_ptr, bignum_deleter);
- size = len;
- if (orig_has_data) {
- THROW_ON_EPIDERR(ReadBigNum(buf, buflen, bn.get()));
- }
- bn_ = bn;
- }
- };
- BigNumObj::BigNumObj() : state_(new State) {
- state_->write(nullptr, 0, sizeof(BigNumStr));
- }
- BigNumObj::BigNumObj(BigNumObj const& other) : state_(new State) {
- bool orig_has_data = other.state_->bn_.get() != nullptr;
- std::vector<unsigned char> buf;
- if (orig_has_data) {
- buf.resize(other.state_->size);
- THROW_ON_EPIDERR(WriteBigNum(other.state_->bn_.get(), buf.size(), &buf[0]));
- }
- state_->write(&buf[0], other.state_->size, buf.size());
- }
- BigNumObj& BigNumObj::operator=(BigNumObj const& other) {
- bool orig_has_data = other.state_->bn_.get() != nullptr;
- std::vector<unsigned char> buf;
- if (orig_has_data) {
- buf.resize(other.state_->size);
- THROW_ON_EPIDERR(WriteBigNum(other.state_->bn_.get(), buf.size(), &buf[0]));
- }
- state_->write(&buf[0], other.state_->size, buf.size());
- return *this;
- }
- BigNumObj::BigNumObj(size_t data_size_bytes) : state_(new State) {
- state_->write(nullptr, 0, data_size_bytes);
- }
- BigNumObj::BigNumObj(size_t data_size_bytes,
- std::vector<unsigned char> const& bytes)
- : state_(new State) {
- state_->write(&bytes[0], bytes.size(), data_size_bytes);
- }
- BigNumObj::BigNumObj(size_t data_size_bytes, BigNumStr const& bytes)
- : state_(new State) {
- state_->write((unsigned char const*)&bytes, sizeof(BigNumStr),
- data_size_bytes);
- }
- BigNumObj::BigNumObj(std::vector<unsigned char> const& bytes)
- : state_(new State) {
- state_->write(&bytes[0], bytes.size(), bytes.size());
- }
- BigNumObj::BigNumObj(BigNumStr const& bytes) : state_(new State) {
- state_->write((unsigned char const*)&bytes, sizeof(BigNumStr),
- sizeof(BigNumStr));
- }
- BigNumObj::~BigNumObj() {}
- BigNumObj::operator BigNum*() { return state_->bn_.get(); }
- BigNumObj::operator const BigNum*() const { return state_->bn_.get(); }
- BigNum* BigNumObj::get() { return state_->bn_.get(); }
- BigNum const* BigNumObj::getc() const { return state_->bn_.get(); }
|