diff options
author | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2014-05-30 01:42:36 -0700 |
---|---|---|
committer | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2014-05-30 01:42:36 -0700 |
commit | 15dfcf5abaacb3885859dcbe5fa2c29cf259cb0d (patch) | |
tree | 89624031de84d431b691a27290eda42163d68cb0 | |
parent | b101fbdf0d8b1153f7bea58bc97e773e1016b7cc (diff) |
Hardened Base64, making tomcrypt to properly generate secure random numbers under windows, and ditched tomcryptmath for tommath.
-rw-r--r-- | includes/Base64.h | 2 | ||||
-rw-r--r-- | includes/BigInt.h | 10 | ||||
-rw-r--r-- | src/Base64.cc | 28 | ||||
-rw-r--r-- | src/BigInt.cc | 220 | ||||
-rw-r--r-- | win32/project/Balau.vcxproj | 8 | ||||
-rw-r--r-- | win32/project/tomcrypt.vcxproj | 16 | ||||
-rw-r--r-- | win32/project/tommath.vcxproj | 8 |
7 files changed, 191 insertions, 101 deletions
diff --git a/includes/Base64.h b/includes/Base64.h index d039c73..8d0b71d 100644 --- a/includes/Base64.h +++ b/includes/Base64.h @@ -7,7 +7,7 @@ namespace Balau { class Base64 { public: static String encode(const uint8_t * data, int len); - static int decode(const String & str_in, uint8_t * data_out); + static int decode(const String & str_in, uint8_t * data_out, size_t outLen = static_cast<size_t>(-1)); static const double ratio; private: diff --git a/includes/BigInt.h b/includes/BigInt.h index ae5b0f7..3a31b2e 100644 --- a/includes/BigInt.h +++ b/includes/BigInt.h @@ -30,6 +30,9 @@ class BigInt { uint32_t to_uint32() const throw (GeneralException); int32_t to_int32() const throw (GeneralException); + BigInt operator^(const BigInt &) const throw (GeneralException); + BigInt operator|(const BigInt &) const throw (GeneralException); + BigInt operator&(const BigInt &) const throw (GeneralException); BigInt operator+(unsigned int) const throw (GeneralException); BigInt operator+(const BigInt &) const throw (GeneralException); BigInt operator-(unsigned int) const throw (GeneralException); @@ -41,6 +44,9 @@ class BigInt { BigInt operator<<(unsigned int) const throw (GeneralException); BigInt operator>>(unsigned int) const; + BigInt & operator^=(const BigInt &) throw (GeneralException); + BigInt & operator|=(const BigInt &) throw (GeneralException); + BigInt & operator&=(const BigInt &) throw (GeneralException); BigInt & operator+=(unsigned int) throw (GeneralException); BigInt & operator+=(const BigInt &) throw (GeneralException); BigInt & operator-=(unsigned int) throw (GeneralException); @@ -105,6 +111,10 @@ class BigInt { void exportBin(void *) const throw (GeneralException); void importBin(const void *, size_t) throw (GeneralException); + size_t exportUSize() const; + void exportUBin(void *) const throw (GeneralException); + void importUBin(const void *, size_t) throw (GeneralException); + String toString(int radix = 10) const; char * makeString(int radix = 10) const; diff --git a/src/Base64.cc b/src/Base64.cc index 3b638c6..06a730d 100644 --- a/src/Base64.cc +++ b/src/Base64.cc @@ -86,12 +86,14 @@ int Balau::Base64::decode_block(char s1, char s2, char s3, char s4, unsigned cha return len; } -int Balau::Base64::decode(const String & str_in, uint8_t * data_out) { +int Balau::Base64::decode(const String & str_in, uint8_t * data_out, size_t outLen) { int s_len = str_in.strlen(), len = 0, i, t_len, idx; char s1, s2, s3, s4; unsigned char t_out[3]; - unsigned char * out = (unsigned char *) malloc(s_len * 3 / 4 + 4); - unsigned char * p = out; + unsigned char * p = data_out; + + bool failure = false; + std::function<char()> readNext = [&]() { char r = '='; @@ -102,20 +104,28 @@ int Balau::Base64::decode(const String & str_in, uint8_t * data_out) { r = str_in[idx++]; } while (r == '\r' || r == '\n' || r == ' ' || r == '\t'); - return r; + if (isdigit(r) || isalpha(r) || r == '+' || r == '/') + return r; + + failure = true; + + return '='; }; - for (idx = 0; idx < s_len;) { + for (idx = 0; idx < s_len || failure; len += t_len) { s1 = readNext(); s2 = readNext(); s3 = readNext(); s4 = readNext(); t_len = decode_block(s1, s2, s3, s4, t_out); - for (i = 0; i < t_len; i++) *(p++) = t_out[i]; - - len += t_len; + for (i = 0; i < t_len; i++) { + if (outLen == 0) + return -1; + *(p++) = t_out[i]; + outLen--; + } } - return len; + return failure ? -1 : len; } diff --git a/src/BigInt.cc b/src/BigInt.cc index 8ec1b12..0df2e14 100644 --- a/src/BigInt.cc +++ b/src/BigInt.cc @@ -1,6 +1,6 @@ #include <malloc.h> #include <math.h> -#include "tomcrypt.h" +#include "tommath.h" #include "BigInt.h" #include "Main.h" @@ -10,10 +10,7 @@ class InitMP : public Balau::AtStart { public: InitMP() : AtStart(20) { } void doStart() { - ltc_mp = ltm_desc; - IAssert(!m_initialized, "doStart should only be called once."); m_initialized = true; - static Balau::BigInt s2p32; s2p32.set2expt(32); m_2p32 = &s2p32; @@ -33,13 +30,23 @@ static InitMP s_MP; Balau::BigInt::BigInt() throw (GeneralException) { AAssert(s_MP.initialized(), "You can't statically declare a BigInt."); - if (mp_init(&m_bi) != CRYPT_OK) + + m_bi = calloc(1, sizeof(mp_int)); + if (m_bi == NULL) + throw GeneralException("Unable to allocate "); + + if (mp_init((mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_init"); } Balau::BigInt::BigInt(const BigInt & v) throw (GeneralException) { AAssert(s_MP.initialized(), "You can't statically declare a BigInt."); - if (mp_init_copy(&m_bi, v.m_bi) != CRYPT_OK) + + m_bi = calloc(1, sizeof(mp_int)); + if (m_bi == NULL) + throw GeneralException("Unable to allocate "); + + if (mp_init_copy((mp_int *)m_bi, (mp_int *)v.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_init_copy"); } @@ -51,7 +58,8 @@ Balau::BigInt::BigInt(BigInt && v) { Balau::BigInt::~BigInt() { if (!m_bi) return; - mp_clear(m_bi); + mp_clear((mp_int *) m_bi); + free(m_bi); m_bi = NULL; } @@ -59,7 +67,7 @@ Balau::BigInt & Balau::BigInt::operator=(const BigInt & v) throw (GeneralExcepti if (&v == this) return *this; - if (mp_copy(v.m_bi, m_bi) != CRYPT_OK) + if (mp_copy((mp_int *) v.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_init_copy"); return *this; @@ -69,10 +77,10 @@ void Balau::BigInt::set(uint64_t v) throw (GeneralException) { uint32_t low = v & 0xffffffff; uint32_t high = v >> 32; if (high == 0) { - if (mp_set_int(m_bi, low) != CRYPT_OK) + if (mp_set_int((mp_int *) m_bi, low) != MP_OKAY) throw GeneralException("Error while calling mp_set_init"); } else { - if (mp_set_int(m_bi, high) != CRYPT_OK) + if (mp_set_int((mp_int *) m_bi, high) != MP_OKAY) throw GeneralException("Error while calling mp_set_init"); operator*=(s_MP.get2p32()); operator+=(low); @@ -90,7 +98,7 @@ void Balau::BigInt::set(int64_t v) { } void Balau::BigInt::set(uint32_t v) throw (GeneralException) { - if (mp_set_int(m_bi, v) != CRYPT_OK) + if (mp_set_int((mp_int *) m_bi, v) != MP_OKAY) throw GeneralException("Error while calling mp_set_init"); } @@ -112,7 +120,7 @@ void Balau::BigInt::set(double v) throw (GeneralException) { int e; f = frexp(v, &e); - if (mp_set_int(m_bi, 0) != CRYPT_OK) + if (mp_set_int((mp_int *) m_bi, 0) != MP_OKAY) throw GeneralException("Error while calling mp_set_init"); for (e -= 1.0; e > 0.0; e -= 1.0) { @@ -126,126 +134,152 @@ void Balau::BigInt::set(double v) throw (GeneralException) { } void Balau::BigInt::set(const String & v, int radix) throw (GeneralException) { - if (mp_read_radix(m_bi, v.to_charp(), radix) != CRYPT_OK) + if (mp_read_radix((mp_int *) m_bi, v.to_charp(), radix) != MP_OKAY) throw GeneralException("Error while calling mp_read_radix"); } void Balau::BigInt::set2expt(int i) throw (GeneralException) { - if (mp_2expt(m_bi, i) != CRYPT_OK) + if (mp_2expt((mp_int *) m_bi, i) != MP_OKAY) throw GeneralException("Error while calling mp_2expt"); } +static unsigned long get_digit(void * a, int n) { + mp_int * A = (mp_int *) a; + return (n >= A->used || n < 0) ? 0 : A->dp[n]; +} + uint64_t Balau::BigInt::to_uint64() const throw (GeneralException) { - if (mp_count_bits(m_bi) > 64) + if (mp_count_bits((mp_int *) m_bi) > 64) throw GeneralException("BigInt too big to fit in a uint64"); uint64_t v = 0; int shift = 0; int digit = 0; while (shift <= 64) { - v |= mp_get_digit(m_bi, digit++) << shift; + v |= get_digit(m_bi, digit++) << shift; shift += MP_DIGIT_BIT; } return v; } int64_t Balau::BigInt::to_int64() const throw (GeneralException) { - if (mp_count_bits(m_bi) > 63) + if (mp_count_bits((mp_int *) m_bi) > 63) throw GeneralException("BigInt too big to fit in a int64"); int64_t v = 0; int shift = 0; int digit = 0; while (shift <= 63) { - v |= mp_get_digit(m_bi, digit++) << shift; + v |= get_digit(m_bi, digit++) << shift; shift += MP_DIGIT_BIT; } return comp(0) == LT ? -v : v; } uint32_t Balau::BigInt::to_uint32() const throw (GeneralException) { - if (mp_count_bits(m_bi) > 32) + if (mp_count_bits((mp_int *) m_bi) > 32) throw GeneralException("BigInt too big to fit in a uint32"); uint64_t v = 0; int shift = 0; int digit = 0; while (shift <= 32) { - v |= mp_get_digit(m_bi, digit++) << shift; + v |= get_digit(m_bi, digit++) << shift; shift += MP_DIGIT_BIT; } return v; } int32_t Balau::BigInt::to_int32() const throw (GeneralException) { - if (mp_count_bits(m_bi) > 31) + if (mp_count_bits((mp_int *) m_bi) > 31) throw GeneralException("BigInt too big to fit in a uint32"); int64_t v = 0; int shift = 0; int digit = 0; while (shift <= 31) { - v |= mp_get_digit(m_bi, digit++) << shift; + v |= get_digit(m_bi, digit++) << shift; shift += MP_DIGIT_BIT; } return comp(0) == LT ? -v : v; } +Balau::BigInt Balau::BigInt::operator^(const BigInt & a) const throw (GeneralException) { + BigInt r; + if (mp_xor((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) + throw GeneralException("Error while calling mp_xor"); + return r; +} + +Balau::BigInt Balau::BigInt::operator|(const BigInt & a) const throw (GeneralException) { + BigInt r; + if (mp_or((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) + throw GeneralException("Error while calling mp_or"); + return r; +} + +Balau::BigInt Balau::BigInt::operator&(const BigInt & a) const throw (GeneralException) { + BigInt r; + if (mp_and((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) + throw GeneralException("Error while calling mp_and"); + return r; +} + Balau::BigInt Balau::BigInt::operator+(unsigned int i) const throw (GeneralException) { BigInt r; - if (mp_add_d(m_bi, i, r.m_bi) != CRYPT_OK) + if (mp_add_d((mp_int *) m_bi, i, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_add_d"); return r; } Balau::BigInt Balau::BigInt::operator+(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_add(m_bi, a.m_bi, r.m_bi) != CRYPT_OK) + if (mp_add((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_add"); return r; } Balau::BigInt Balau::BigInt::operator-(unsigned int i) const throw (GeneralException) { BigInt r; - if (mp_sub_d(m_bi, i, r.m_bi) != CRYPT_OK) + if (mp_sub_d((mp_int *) m_bi, i, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sub_d"); return r; } Balau::BigInt Balau::BigInt::operator-(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_sub(m_bi, a.m_bi, r.m_bi) != CRYPT_OK) + if (mp_sub((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sub"); return r; } Balau::BigInt Balau::BigInt::operator*(unsigned int i) const throw (GeneralException) { BigInt r; - if (mp_mul_d(m_bi, i, r.m_bi) != CRYPT_OK) + if (mp_mul_d((mp_int *) m_bi, i, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_mul_d"); return r; } Balau::BigInt Balau::BigInt::operator*(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_mul(m_bi, a.m_bi, r.m_bi) != CRYPT_OK) + if (mp_mul((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_mul"); return r; } Balau::BigInt Balau::BigInt::operator/(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_div(m_bi, a.m_bi, r.m_bi, NULL) != CRYPT_OK) + if (mp_div((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi, NULL) != MP_OKAY) throw GeneralException("Error while calling mp_div"); return r; } Balau::BigInt Balau::BigInt::operator%(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_div(m_bi, a.m_bi, NULL, r.m_bi) != CRYPT_OK) + if (mp_div((mp_int *) m_bi, (mp_int *) a.m_bi, NULL, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_div"); return r; } Balau::BigInt Balau::BigInt::operator<<(unsigned int a) const throw (GeneralException) { BigInt r; - if (mp_mul_d(m_bi, 1 << a, r.m_bi) != CRYPT_OK) + if (mp_mul_d((mp_int *) m_bi, 1 << a, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_div"); return *this; } @@ -256,56 +290,76 @@ Balau::BigInt Balau::BigInt::operator>>(unsigned int a) const { return operator/(s); } +Balau::BigInt & Balau::BigInt::operator^=(const BigInt & a) throw (GeneralException) { + if (mp_xor((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi) != MP_OKAY) + throw GeneralException("Error while calling mp_xor"); + return *this; +} + +Balau::BigInt & Balau::BigInt::operator|=(const BigInt & a) throw (GeneralException) { + BigInt r; + if (mp_or((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi) != MP_OKAY) + throw GeneralException("Error while calling mp_or"); + return *this; +} + +Balau::BigInt & Balau::BigInt::operator&=(const BigInt & a) throw (GeneralException) { + BigInt r; + if (mp_and((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi) != MP_OKAY) + throw GeneralException("Error while calling mp_and"); + return *this; +} + Balau::BigInt & Balau::BigInt::operator+=(unsigned int i) throw (GeneralException) { - if (mp_add_d(m_bi, i, m_bi) != CRYPT_OK) + if (mp_add_d((mp_int *) m_bi, i, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_add_d"); return *this; } Balau::BigInt & Balau::BigInt::operator+=(const BigInt & a) throw (GeneralException) { - if (mp_add(m_bi, a.m_bi, m_bi) != CRYPT_OK) + if (mp_add((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_add"); return *this; } Balau::BigInt & Balau::BigInt::operator-=(unsigned int i) throw (GeneralException) { - if (mp_sub_d(m_bi, i, m_bi) != CRYPT_OK) + if (mp_sub_d((mp_int *) m_bi, i, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sub_d"); return *this; } Balau::BigInt & Balau::BigInt::operator-=(const BigInt & a) throw (GeneralException) { - if (mp_sub(m_bi, a.m_bi, m_bi) != CRYPT_OK) + if (mp_sub((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sub"); return *this; } Balau::BigInt & Balau::BigInt::operator*=(unsigned int i) throw (GeneralException) { - if (mp_mul_d(m_bi, i, m_bi) != CRYPT_OK) + if (mp_mul_d((mp_int *) m_bi, i, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_mul_d"); return *this; } Balau::BigInt & Balau::BigInt::operator*=(const BigInt & a) throw (GeneralException) { - if (mp_mul(m_bi, a.m_bi, m_bi) != CRYPT_OK) + if (mp_mul((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_mul"); return *this; } Balau::BigInt & Balau::BigInt::operator/=(const BigInt & a) throw (GeneralException) { - if (mp_div(m_bi, a.m_bi, m_bi, NULL) != CRYPT_OK) + if (mp_div((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m_bi, NULL) != MP_OKAY) throw GeneralException("Error while calling mp_div"); return *this; } Balau::BigInt & Balau::BigInt::operator%=(const BigInt & a) throw (GeneralException) { - if (mp_div(m_bi, a.m_bi, NULL, m_bi) != CRYPT_OK) + if (mp_div((mp_int *) m_bi, (mp_int *) a.m_bi, NULL, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_div"); return *this; } Balau::BigInt & Balau::BigInt::operator<<=(unsigned int a) throw (GeneralException) { - if (mp_mul_d(m_bi, 1 << a, m_bi) != CRYPT_OK) + if (mp_mul_d((mp_int *) m_bi, 1 << a, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_div"); return *this; } @@ -344,52 +398,52 @@ Balau::BigInt Balau::BigInt::operator--(int) { Balau::BigInt Balau::BigInt::neg() const throw (GeneralException) { BigInt r; - if (mp_neg(m_bi, r.m_bi) != CRYPT_OK) + if (mp_neg((mp_int *) m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_neg"); return r; } Balau::BigInt & Balau::BigInt::do_neg() throw (GeneralException) { - if (mp_neg(m_bi, m_bi) != CRYPT_OK) + if (mp_neg((mp_int *) m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_neg"); return *this; } Balau::BigInt Balau::BigInt::sqrt() const throw (GeneralException) { BigInt r; - if (mp_sqr(m_bi, r.m_bi) != CRYPT_OK) + if (mp_sqr((mp_int *) m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sqr"); return r; } Balau::BigInt & Balau::BigInt::do_sqrt() throw (GeneralException) { - if (mp_sqr(m_bi, m_bi) != CRYPT_OK) + if (mp_sqr((mp_int *) m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sqr"); return *this; } Balau::BigInt Balau::BigInt::gcd(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_gcd(m_bi, a.m_bi, r.m_bi) != CRYPT_OK) + if (mp_gcd((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_gcd"); return r; } Balau::BigInt Balau::BigInt::lcm(const BigInt & a) const throw (GeneralException) { BigInt r; - if (mp_lcm(m_bi, a.m_bi, r.m_bi) != CRYPT_OK) + if (mp_lcm((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_lcm"); return r; } Balau::BigInt::comp_t Balau::BigInt::comp(const BigInt & a) const throw (GeneralException) { - int r = mp_cmp(m_bi, a.m_bi); + int r = mp_cmp((mp_int *) m_bi, (mp_int *) a.m_bi); switch (r) { - case LTC_MP_LT: + case MP_LT: return LT; - case LTC_MP_GT: + case MP_GT: return GT; - case LTC_MP_EQ: + case MP_EQ: return EQ; default: throw GeneralException("Unknown result from mp_cmp"); @@ -397,13 +451,13 @@ Balau::BigInt::comp_t Balau::BigInt::comp(const BigInt & a) const throw (General } Balau::BigInt::comp_t Balau::BigInt::comp(unsigned int a) const throw (GeneralException) { - int r = mp_cmp_d(m_bi, a); + int r = mp_cmp_d((mp_int *) m_bi, a); switch (r) { - case LTC_MP_LT: + case MP_LT: return LT; - case LTC_MP_GT: + case MP_GT: return GT; - case LTC_MP_EQ: + case MP_EQ: return EQ; default: throw GeneralException("Unknown result from mp_cmp_d"); @@ -472,117 +526,133 @@ bool Balau::BigInt::operator>(unsigned int a) const { Balau::BigInt Balau::BigInt::modadd(const BigInt & a, const BigInt & m) const throw (GeneralException) { BigInt r; - if (mp_addmod(m_bi, a.m_bi, m.m_bi, r.m_bi) != CRYPT_OK) + if (mp_addmod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_addmod"); return r; } Balau::BigInt Balau::BigInt::modsub(const BigInt & a, const BigInt & m) const throw (GeneralException) { BigInt r; - if (mp_submod(m_bi, a.m_bi, m.m_bi, r.m_bi) != CRYPT_OK) + if (mp_submod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_submod"); return r; } Balau::BigInt Balau::BigInt::modmul(const BigInt & a, const BigInt & m) const throw (GeneralException) { BigInt r; - if (mp_mulmod(m_bi, a.m_bi, m.m_bi, r.m_bi) != CRYPT_OK) + if (mp_mulmod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_mulmod"); return r; } Balau::BigInt Balau::BigInt::modsqr(const BigInt & m) const throw (GeneralException) { BigInt r; - if (mp_sqrmod(m_bi, m.m_bi, r.m_bi) != CRYPT_OK) + if (mp_sqrmod((mp_int *) m_bi, (mp_int *) m.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sqrmod"); return r; } Balau::BigInt Balau::BigInt::modinv(const BigInt & m) const throw (GeneralException) { BigInt r; - if (mp_invmod(m_bi, m.m_bi, r.m_bi) != CRYPT_OK) + if (mp_invmod((mp_int *) m_bi, (mp_int *) m.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_invmod"); return r; } Balau::BigInt Balau::BigInt::modpow(const BigInt & a, const BigInt & m) const throw (GeneralException) { BigInt r; - if (mp_exptmod(m_bi, a.m_bi, m.m_bi, r.m_bi) != CRYPT_OK) + if (mp_exptmod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) r.m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_exptmod"); return r; } Balau::BigInt & Balau::BigInt::do_modadd(const BigInt & a, const BigInt & m) throw (GeneralException) { - if (mp_addmod(m_bi, a.m_bi, m.m_bi, m_bi) != CRYPT_OK) + if (mp_addmod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_addmod"); return *this; } Balau::BigInt & Balau::BigInt::do_modsub(const BigInt & a, const BigInt & m) throw (GeneralException) { - if (mp_submod(m_bi, a.m_bi, m.m_bi, m_bi) != CRYPT_OK) + if (mp_submod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_submod"); return *this; } Balau::BigInt & Balau::BigInt::do_modmul(const BigInt & a, const BigInt & m) throw (GeneralException) { - if (mp_mulmod(m_bi, a.m_bi, m.m_bi, m_bi) != CRYPT_OK) + if (mp_mulmod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_mulmod"); return *this; } Balau::BigInt & Balau::BigInt::do_modsqr(const BigInt & m) throw (GeneralException) { - if (mp_sqrmod(m_bi, m.m_bi, m_bi) != CRYPT_OK) + if (mp_sqrmod((mp_int *) m_bi, (mp_int *) m.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_sqrmod"); return *this; } Balau::BigInt & Balau::BigInt::do_modinv(const BigInt & m) throw (GeneralException) { - if (mp_invmod(m_bi, m.m_bi, m_bi) != CRYPT_OK) + if (mp_invmod((mp_int *) m_bi, (mp_int *) m.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_invmod"); return *this; } Balau::BigInt & Balau::BigInt::do_modpow(const BigInt & a, const BigInt & m) throw (GeneralException) { - if (mp_exptmod(m_bi, a.m_bi, m.m_bi, m_bi) != CRYPT_OK) + if (mp_exptmod((mp_int *) m_bi, (mp_int *) a.m_bi, (mp_int *) m.m_bi, (mp_int *) m_bi) != MP_OKAY) throw GeneralException("Error while calling mp_exptmod"); return *this; } bool Balau::BigInt::isPrime() const throw (GeneralException) { int r = 0; - if (mp_prime_is_prime(m_bi, NULL, &r) != CRYPT_OK) + if (mp_prime_is_prime((mp_int *) m_bi, NULL, &r) != MP_OKAY) throw GeneralException("Error while calling mp_prime_is_prime"); - return r == LTC_MP_YES; + return r == MP_YES; } size_t Balau::BigInt::exportSize() const { - return mp_unsigned_bin_size(m_bi) + 1; + return mp_unsigned_bin_size((mp_int *) m_bi) + 1; +} + +size_t Balau::BigInt::exportUSize() const { + return mp_unsigned_bin_size((mp_int *) m_bi); } void Balau::BigInt::exportBin(void * _buf) const throw (GeneralException) { unsigned char * buf = (unsigned char *) _buf; buf[0] = comp(0) == LT ? 0xff : 0; - if (mp_to_unsigned_bin(m_bi, buf + 1) != CRYPT_OK) + if (mp_to_unsigned_bin((mp_int *) m_bi, buf + 1) != MP_OKAY) + throw GeneralException("Error while calling mp_to_unsigned_bin"); +} + +void Balau::BigInt::exportUBin(void * _buf) const throw (GeneralException) { + unsigned char * buf = (unsigned char *)_buf; + if (mp_to_unsigned_bin((mp_int *) m_bi, buf) != MP_OKAY) throw GeneralException("Error while calling mp_to_unsigned_bin"); } void Balau::BigInt::importBin(const void * _buf, size_t size) throw (GeneralException) { unsigned char * buf = (unsigned char *) _buf; bool isNeg = buf[0] != 0; - if (mp_read_unsigned_bin(m_bi, buf + 1, size - 1) != CRYPT_OK) + if (mp_read_unsigned_bin((mp_int *) m_bi, buf + 1, size - 1) != MP_OKAY) throw GeneralException("Error while calling mp_read_unsigned_bin"); if (isNeg) do_neg(); } +void Balau::BigInt::importUBin(const void * _buf, size_t size) throw (GeneralException) { + unsigned char * buf = (unsigned char *)_buf; + if (mp_read_unsigned_bin((mp_int *) m_bi, buf, size) != MP_OKAY) + throw GeneralException("Error while calling mp_read_unsigned_bin"); +} + Balau::String Balau::BigInt::toString(int radix) const { - char * out = (char *) alloca(mp_count_bits(m_bi) / (radix >= 10 ? 3 : 1) + 3); - mp_toradix(m_bi, out, radix); + char * out = (char *) alloca(mp_count_bits((mp_int *) m_bi) / (radix >= 10 ? 3 : 1) + 3); + mp_toradix((mp_int *) m_bi, out, radix); return String(out); } char * Balau::BigInt::makeString(int radix) const { - char * out = (char *) malloc(mp_count_bits(m_bi) / (radix >= 10 ? 3 : 1) + 3); - mp_toradix(m_bi, out, radix); + char * out = (char *) malloc(mp_count_bits((mp_int *) m_bi) / (radix >= 10 ? 3 : 1) + 3); + mp_toradix((mp_int *) m_bi, out, radix); return out; } diff --git a/win32/project/Balau.vcxproj b/win32/project/Balau.vcxproj index bf7a77b..9ca610e 100644 --- a/win32/project/Balau.vcxproj +++ b/win32/project/Balau.vcxproj @@ -86,7 +86,7 @@ <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4290;4800</DisableSpecificWarnings>
<ForcedIncludeFiles>$(SolutionDir)\Balau\msvc-config.h</ForcedIncludeFiles>
@@ -101,7 +101,7 @@ <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;DEBUG;_DEBUG;DEBUGBUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4290;4800</DisableSpecificWarnings>
<ForcedIncludeFiles>$(SolutionDir)\Balau\msvc-config.h</ForcedIncludeFiles>
@@ -117,7 +117,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4290;4800</DisableSpecificWarnings>
<ForcedIncludeFiles>$(SolutionDir)\Balau\msvc-config.h</ForcedIncludeFiles>
@@ -135,7 +135,7 @@ <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_SCL_SECURE_NO_WARNINGS;CARES_STATICLIB;_CONSOLE;_LIB;PTW32_STATIC_LIB;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\includes;..\..\includes\msc;..\..\libev;..\..\win32;..\..\win32\pthreads-win32;..\..\win32\iconv;..\..\win32\zlib;..\..\win32\regex;..\..\win32\c-ares;..\..\LuaJIT\src;..\..\src\jsoncpp\include;..\..\libtommath;..\..\libtomcrypt\src\headers</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4290;4800</DisableSpecificWarnings>
<ForcedIncludeFiles>$(SolutionDir)\Balau\msvc-config.h</ForcedIncludeFiles>
diff --git a/win32/project/tomcrypt.vcxproj b/win32/project/tomcrypt.vcxproj index d748040..9a875a1 100644 --- a/win32/project/tomcrypt.vcxproj +++ b/win32/project/tomcrypt.vcxproj @@ -86,8 +86,8 @@ <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
- <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath;..\pthreads-win32</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -98,8 +98,8 @@ <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
- <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath;..\pthreads-win32</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -112,8 +112,8 @@ <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
- <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath;..\pthreads-win32</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -128,8 +128,8 @@ <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
- <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\..\libtomcrypt\src\headers;..\..\libtommath;..\pthreads-win32</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>PTW32_STATIC_LIB;LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
diff --git a/win32/project/tommath.vcxproj b/win32/project/tommath.vcxproj index b935857..eba7789 100644 --- a/win32/project/tommath.vcxproj +++ b/win32/project/tommath.vcxproj @@ -87,7 +87,7 @@ <Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -99,7 +99,7 @@ <Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -113,7 +113,7 @@ <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -129,7 +129,7 @@ <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\..\libtommath</AdditionalIncludeDirectories>
- <PreprocessorDefinitions>LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>LTC_PTHREAD;WIN32;LTC_SOURCE;LTM_DESC;USE_LTM;LTC_NO_PROTOTYPES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
|