summaryrefslogtreecommitdiff
path: root/extra/yassl/taocrypt/src
diff options
context:
space:
mode:
Diffstat (limited to 'extra/yassl/taocrypt/src')
-rw-r--r--extra/yassl/taocrypt/src/Makefile.am2
-rw-r--r--extra/yassl/taocrypt/src/aes.cpp39
-rw-r--r--extra/yassl/taocrypt/src/aestables.cpp2
-rw-r--r--extra/yassl/taocrypt/src/algebra.cpp3
-rw-r--r--extra/yassl/taocrypt/src/arc4.cpp2
-rw-r--r--extra/yassl/taocrypt/src/asn.cpp196
-rw-r--r--extra/yassl/taocrypt/src/blowfish.cpp36
-rw-r--r--extra/yassl/taocrypt/src/coding.cpp16
-rw-r--r--extra/yassl/taocrypt/src/dsa.cpp3
-rw-r--r--extra/yassl/taocrypt/src/hash.cpp17
-rw-r--r--extra/yassl/taocrypt/src/hc128.cpp317
-rw-r--r--extra/yassl/taocrypt/src/integer.cpp95
-rwxr-xr-x[-rw-r--r--]extra/yassl/taocrypt/src/make.bat0
-rw-r--r--extra/yassl/taocrypt/src/md4.cpp2
-rw-r--r--extra/yassl/taocrypt/src/md5.cpp18
-rw-r--r--extra/yassl/taocrypt/src/misc.cpp22
-rw-r--r--extra/yassl/taocrypt/src/rabbit.cpp250
-rw-r--r--extra/yassl/taocrypt/src/random.cpp6
-rw-r--r--extra/yassl/taocrypt/src/ripemd.cpp16
-rw-r--r--extra/yassl/taocrypt/src/rsa.cpp7
-rw-r--r--extra/yassl/taocrypt/src/sha.cpp16
-rw-r--r--extra/yassl/taocrypt/src/template_instnt.cpp1
-rw-r--r--extra/yassl/taocrypt/src/twofish.cpp2
23 files changed, 809 insertions, 259 deletions
diff --git a/extra/yassl/taocrypt/src/Makefile.am b/extra/yassl/taocrypt/src/Makefile.am
index 760205a625c..9fa0861babf 100644
--- a/extra/yassl/taocrypt/src/Makefile.am
+++ b/extra/yassl/taocrypt/src/Makefile.am
@@ -21,7 +21,7 @@ libtaocrypt_la_SOURCES = aes.cpp aestables.cpp algebra.cpp arc4.cpp \
asn.cpp bftables.cpp blowfish.cpp coding.cpp des.cpp dh.cpp \
dsa.cpp file.cpp hash.cpp integer.cpp md2.cpp md4.cpp md5.cpp misc.cpp \
random.cpp ripemd.cpp rsa.cpp sha.cpp template_instnt.cpp \
- tftables.cpp twofish.cpp
+ tftables.cpp twofish.cpp crypto.cpp rabbit.cpp hc128.cpp
libtaocrypt_la_CXXFLAGS = @yassl_taocrypt_extra_cxxflags@ -DYASSL_PURE_C \
@yassl_thread_cxxflags@
diff --git a/extra/yassl/taocrypt/src/aes.cpp b/extra/yassl/taocrypt/src/aes.cpp
index 21b21dc4856..811b483b0c9 100644
--- a/extra/yassl/taocrypt/src/aes.cpp
+++ b/extra/yassl/taocrypt/src/aes.cpp
@@ -78,7 +78,7 @@ void AES::Process(byte* out, const byte* in, word32 sz)
out += BLOCK_SIZE;
in += BLOCK_SIZE;
}
- }
+ }
}
#endif // DO_AES_ASM
@@ -86,8 +86,13 @@ void AES::Process(byte* out, const byte* in, word32 sz)
void AES::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
{
- assert( (keylen == 16) || (keylen == 24) || (keylen == 32) );
-
+ if (keylen <= 16)
+ keylen = 16;
+ else if (keylen >= 32)
+ keylen = 32;
+ else if (keylen != 24)
+ keylen = 24;
+
rounds_ = keylen/4 + 6;
word32 temp, *rk = key_;
@@ -245,34 +250,34 @@ void AES::encrypt(const byte* inBlock, const byte* xorBlock,
for (;;) {
t0 =
Te0[GETBYTE(s0, 3)] ^
- Te1[GETBYTE(s1, 2)] ^
- Te2[GETBYTE(s2, 1)] ^
- Te3[GETBYTE(s3, 0)] ^
+ Te1[GETBYTE(s1, 2)] ^
+ Te2[GETBYTE(s2, 1)] ^
+ Te3[GETBYTE(s3, 0)] ^
rk[4];
t1 =
Te0[GETBYTE(s1, 3)] ^
- Te1[GETBYTE(s2, 2)] ^
- Te2[GETBYTE(s3, 1)] ^
- Te3[GETBYTE(s0, 0)] ^
+ Te1[GETBYTE(s2, 2)] ^
+ Te2[GETBYTE(s3, 1)] ^
+ Te3[GETBYTE(s0, 0)] ^
rk[5];
t2 =
Te0[GETBYTE(s2, 3)] ^
- Te1[GETBYTE(s3, 2)] ^
- Te2[GETBYTE(s0, 1)] ^
- Te3[GETBYTE(s1, 0)] ^
+ Te1[GETBYTE(s3, 2)] ^
+ Te2[GETBYTE(s0, 1)] ^
+ Te3[GETBYTE(s1, 0)] ^
rk[6];
t3 =
Te0[GETBYTE(s3, 3)] ^
- Te1[GETBYTE(s0, 2)] ^
- Te2[GETBYTE(s1, 1)] ^
- Te3[GETBYTE(s2, 0)] ^
+ Te1[GETBYTE(s0, 2)] ^
+ Te2[GETBYTE(s1, 1)] ^
+ Te3[GETBYTE(s2, 0)] ^
rk[7];
rk += 8;
if (--r == 0) {
break;
}
-
+
s0 =
Te0[GETBYTE(t0, 3)] ^
Te1[GETBYTE(t1, 2)] ^
@@ -421,7 +426,7 @@ void AES::decrypt(const byte* inBlock, const byte* xorBlock,
(Td4[GETBYTE(t3, 2)] & 0x00ff0000) ^
(Td4[GETBYTE(t2, 1)] & 0x0000ff00) ^
(Td4[GETBYTE(t1, 0)] & 0x000000ff) ^
- rk[0];
+ rk[0];
s1 =
(Td4[GETBYTE(t1, 3)] & 0xff000000) ^
(Td4[GETBYTE(t0, 2)] & 0x00ff0000) ^
diff --git a/extra/yassl/taocrypt/src/aestables.cpp b/extra/yassl/taocrypt/src/aestables.cpp
index e9d6b7a80cb..05c2c3b8e62 100644
--- a/extra/yassl/taocrypt/src/aestables.cpp
+++ b/extra/yassl/taocrypt/src/aestables.cpp
@@ -33,6 +33,4 @@ const word32 AES::rcon_[] = {
};
-
-
} // namespace
diff --git a/extra/yassl/taocrypt/src/algebra.cpp b/extra/yassl/taocrypt/src/algebra.cpp
index 20a152d1a9d..73423d47546 100644
--- a/extra/yassl/taocrypt/src/algebra.cpp
+++ b/extra/yassl/taocrypt/src/algebra.cpp
@@ -247,7 +247,6 @@ void AbstractGroup::SimultaneousMultiply(Integer *results, const Integer &base,
for (i=0; i<expCount; i++)
{
- assert(expBegin->NotNegative());
exponents.push_back(WindowSlider(*expBegin++, InversionIsFast(), 0));
exponents[i].FindNextWindow();
buckets[i].resize(1<<(exponents[i].windowSize-1), Identity());
@@ -288,7 +287,7 @@ void AbstractGroup::SimultaneousMultiply(Integer *results, const Integer &base,
r = buckets[i][buckets[i].size()-1];
if (buckets[i].size() > 1)
{
- for (int j= (unsigned int) (buckets[i].size()) - 2; j >= 1; j--)
+ for (size_t j = buckets[i].size()-2; j >= 1; j--)
{
Accumulate(buckets[i][j], buckets[i][j+1]);
Accumulate(r, buckets[i][j]);
diff --git a/extra/yassl/taocrypt/src/arc4.cpp b/extra/yassl/taocrypt/src/arc4.cpp
index 0944cc31837..4630adcb11a 100644
--- a/extra/yassl/taocrypt/src/arc4.cpp
+++ b/extra/yassl/taocrypt/src/arc4.cpp
@@ -104,7 +104,7 @@ void ARC4::Process(byte* out, const byte* in, word32 length)
#ifdef DO_ARC4_ASM
#ifdef _MSC_VER
- __declspec(naked)
+ __declspec(naked)
#else
__attribute__ ((noinline))
#endif
diff --git a/extra/yassl/taocrypt/src/asn.cpp b/extra/yassl/taocrypt/src/asn.cpp
index 1b81db4f0a4..72cbd092f9d 100644
--- a/extra/yassl/taocrypt/src/asn.cpp
+++ b/extra/yassl/taocrypt/src/asn.cpp
@@ -111,7 +111,8 @@ bool ValidateDate(const byte* date, byte format, CertDecoder::DateType dt)
GetTime(certTime.tm_min, date, i);
GetTime(certTime.tm_sec, date, i);
- assert(date[i] == 'Z'); // only Zulu supported for this profile
+ if (date[i] != 'Z') // only Zulu supported for this profile
+ return false;
time_t ltime = time(0);
tm* localTime = gmtime(&ltime);
@@ -214,9 +215,9 @@ void PublicKey::AddToEnd(const byte* data, word32 len)
Signer::Signer(const byte* k, word32 kSz, const char* n, const byte* h)
: key_(k, kSz)
{
- size_t sz = strlen(n);
- memcpy(name_, n, sz);
- name_[sz] = 0;
+ size_t sz = strlen(n);
+ memcpy(name_, n, sz);
+ name_[sz] = 0;
memcpy(hash_, h, SHA::DIGEST_SIZE);
}
@@ -364,12 +365,59 @@ void RSA_Public_Decoder::Decode(RSA_PublicKey& key)
ReadHeader();
if (source_.GetError().What()) return;
+ ReadHeaderOpenSSL(); // may or may not be
+ if (source_.GetError().What()) return;
+
// public key
key.SetModulus(GetInteger(Integer().Ref()));
key.SetPublicExponent(GetInteger(Integer().Ref()));
}
+// Read OpenSSL format public header
+void RSA_Public_Decoder::ReadHeaderOpenSSL()
+{
+ byte b = source_.next(); // peek
+ source_.prev();
+
+ if (b != INTEGER) { // have OpenSSL public format
+ GetSequence();
+ b = source_.next();
+ if (b != OBJECT_IDENTIFIER) {
+ source_.SetError(OBJECT_ID_E);
+ return;
+ }
+
+ word32 len = GetLength(source_);
+ source_.advance(len);
+
+ b = source_.next();
+ if (b == TAG_NULL) { // could have NULL tag and 0 terminator, may not
+ b = source_.next();
+ if (b != 0) {
+ source_.SetError(EXPECT_0_E);
+ return;
+ }
+ }
+ else
+ source_.prev(); // put back
+
+ b = source_.next();
+ if (b != BIT_STRING) {
+ source_.SetError(BIT_STR_E);
+ return;
+ }
+
+ len = GetLength(source_);
+ b = source_.next();
+ if (b != 0) // could have 0
+ source_.prev(); // put back
+
+ GetSequence();
+ }
+}
+
+
void RSA_Public_Decoder::ReadHeader()
{
GetSequence();
@@ -420,12 +468,12 @@ CertDecoder::CertDecoder(Source& s, bool decode, SignerList* signers,
bool noVerify, CertType ct)
: BER_Decoder(s), certBegin_(0), sigIndex_(0), sigLength_(0),
signature_(0), verify_(!noVerify)
-{
+{
issuer_[0] = 0;
subject_[0] = 0;
if (decode)
- Decode(signers, ct);
+ Decode(signers, ct);
}
@@ -470,9 +518,9 @@ void CertDecoder::Decode(SignerList* signers, CertType ct)
source_.SetError(SIG_OID_E);
return;
}
-
+
if (ct != CA && verify_ && !ValidateSignature(signers))
- source_.SetError(SIG_OTHER_E);
+ source_.SetError(SIG_OTHER_E);
}
@@ -585,21 +633,19 @@ word32 CertDecoder::GetAlgoId()
while(length--)
oid += source_.next(); // just sum it up for now
- if (oid != SHAwDSA && oid != DSAk) {
- b = source_.next(); // should have NULL tag and 0
-
- if (b != TAG_NULL) {
- source_.SetError(TAG_NULL_E);
- return 0;
- }
-
+ // could have NULL tag and 0 terminator, but may not
+ b = source_.next();
+ if (b == TAG_NULL) {
b = source_.next();
if (b != 0) {
source_.SetError(EXPECT_0_E);
return 0;
}
}
-
+ else
+ // go back, didn't have it
+ b = source_.prev();
+
return oid;
}
@@ -653,20 +699,22 @@ word32 CertDecoder::GetDigest()
}
-char *CertDecoder::AddTag(char *ptr, const char *buf_end,
- const char *tag_name, word32 tag_name_length,
- word32 tag_value_length)
+// memory length checked add tag to buffer
+char* CertDecoder::AddTag(char* ptr, const char* buf_end, const char* tag_name,
+ word32 tag_name_length, word32 tag_value_length)
{
- if (ptr + tag_name_length + tag_value_length > buf_end)
- return 0;
-
- memcpy(ptr, tag_name, tag_name_length);
- ptr+= tag_name_length;
-
- memcpy(ptr, source_.get_current(), tag_value_length);
- ptr+= tag_value_length;
-
- return ptr;
+ if (ptr + tag_name_length + tag_value_length > buf_end) {
+ source_.SetError(CONTENT_E);
+ return 0;
+ }
+
+ memcpy(ptr, tag_name, tag_name_length);
+ ptr += tag_name_length;
+
+ memcpy(ptr, source_.get_current(), tag_value_length);
+ ptr += tag_value_length;
+
+ return ptr;
}
@@ -679,18 +727,19 @@ void CertDecoder::GetName(NameType nt)
word32 length = GetSequence(); // length of all distinguished names
if (length >= ASN_NAME_MAX)
- goto err;
+ return;
length += source_.get_index();
-
- char *ptr, *buf_end;
+
+ char* ptr;
+ char* buf_end;
if (nt == ISSUER) {
- ptr= issuer_;
- buf_end= ptr + sizeof(issuer_) - 1; // 1 byte for trailing 0
+ ptr = issuer_;
+ buf_end = ptr + sizeof(issuer_) - 1; // 1 byte for trailing 0
}
else {
- ptr= subject_;
- buf_end= ptr + sizeof(subject_) - 1; // 1 byte for trailing 0
+ ptr = subject_;
+ buf_end = ptr + sizeof(subject_) - 1; // 1 byte for trailing 0
}
while (source_.get_index() < length) {
@@ -716,39 +765,39 @@ void CertDecoder::GetName(NameType nt)
switch (id) {
case COMMON_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/CN=", 4, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/CN=", 4, strLen)))
+ return;
break;
case SUR_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/SN=", 4, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/SN=", 4, strLen)))
+ return;
break;
case COUNTRY_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/C=", 3, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/C=", 3, strLen)))
+ return;
break;
case LOCALITY_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/L=", 3, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/L=", 3, strLen)))
+ return;
break;
case STATE_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/ST=", 4, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/ST=", 4, strLen)))
+ return;
break;
case ORG_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/O=", 3, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/O=", 3, strLen)))
+ return;
break;
case ORGUNIT_NAME:
- if (!(ptr= AddTag(ptr, buf_end, "/OU=", 4, strLen)))
- goto err;
+ if (!(ptr = AddTag(ptr, buf_end, "/OU=", 4, strLen)))
+ return;
break;
}
sha.Update(source_.get_current(), strLen);
source_.advance(strLen);
}
- else {
+ else {
bool email = false;
if (joint[0] == 0x2a && joint[1] == 0x86) // email id hdr
email = true;
@@ -756,20 +805,23 @@ void CertDecoder::GetName(NameType nt)
source_.advance(oidSz + 1);
word32 length = GetLength(source_);
- if (email && !(ptr= AddTag(ptr, buf_end, "/emailAddress=", 14, length)))
- goto err;
+ if (email) {
+ if (!(ptr = AddTag(ptr, buf_end, "/emailAddress=", 14, length))) {
+ source_.SetError(CONTENT_E);
+ return;
+ }
+ }
source_.advance(length);
}
}
- *ptr= 0;
- sha.Final(nt == ISSUER ? issuerHash_ : subjectHash_);
-
- return;
-
-err:
- source_.SetError(CONTENT_E);
+ *ptr = 0;
+
+ if (nt == ISSUER)
+ sha.Final(issuerHash_);
+ else
+ sha.Final(subjectHash_);
}
@@ -794,8 +846,7 @@ void CertDecoder::GetDate(DateType dt)
memcpy(date, source_.get_current(), length);
source_.advance(length);
- if (!ValidateDate(date, b, dt) && verify_)
- {
+ if (!ValidateDate(date, b, dt) && verify_) {
if (dt == BEFORE)
source_.SetError(BEFORE_DATE_E);
else
@@ -856,7 +907,8 @@ void CertDecoder::GetCompareHash(const byte* plain, word32 sz, byte* digest,
// validate signature signed by someone else
bool CertDecoder::ValidateSignature(SignerList* signers)
{
- assert(signers);
+ if (!signers)
+ return false;
SignerList::iterator first = signers->begin();
SignerList::iterator last = signers->end();
@@ -1077,8 +1129,7 @@ word32 DecodeDSA_Signature(byte* decoded, const byte* encoded, word32 sz)
return 0;
}
word32 rLen = GetLength(source);
- if (rLen != 20)
- {
+ if (rLen != 20) {
if (rLen == 21) { // zero at front, eat
source.next();
--rLen;
@@ -1101,8 +1152,7 @@ word32 DecodeDSA_Signature(byte* decoded, const byte* encoded, word32 sz)
return 0;
}
word32 sLen = GetLength(source);
- if (sLen != 20)
- {
+ if (sLen != 20) {
if (sLen == 21) {
source.next(); // zero at front, eat
--sLen;
@@ -1123,6 +1173,7 @@ word32 DecodeDSA_Signature(byte* decoded, const byte* encoded, word32 sz)
}
+/*
// Get Cert in PEM format from BEGIN to END
int GetCert(Source& source)
{
@@ -1174,12 +1225,10 @@ void PKCS12_Decoder::Decode()
// Get MacData optional
- /*
- mac digestInfo like certdecoder::getdigest?
- macsalt octet string
- iter integer
+ // mac digestInfo like certdecoder::getdigest?
+ // macsalt octet string
+ // iter integer
- */
}
@@ -1199,6 +1248,7 @@ int GetPKCS_Cert(const char* password, Source& source)
return 0;
}
+*/
diff --git a/extra/yassl/taocrypt/src/blowfish.cpp b/extra/yassl/taocrypt/src/blowfish.cpp
index 8ee2f3fe569..64e8f0a84aa 100644
--- a/extra/yassl/taocrypt/src/blowfish.cpp
+++ b/extra/yassl/taocrypt/src/blowfish.cpp
@@ -86,7 +86,10 @@ void Blowfish::Process(byte* out, const byte* in, word32 sz)
void Blowfish::SetKey(const byte* key_string, word32 keylength, CipherDir dir)
{
- assert(keylength >= 4 && keylength <= 56);
+ if (keylength < 4)
+ keylength = 4;
+ else if (keylength > 56)
+ keylength = 56;
unsigned i, j=0, k;
word32 data, dspace[2] = {0, 0};
@@ -165,16 +168,21 @@ void Blowfish::crypt_block(const word32 in[2], word32 out[2]) const
word32 left = in[0];
word32 right = in[1];
+ const word32 *const s = sbox_;
const word32* p = pbox_;
- word32 tmp;
left ^= p[0];
- BF_ROUNDS
+ // roll back up and use s and p index instead of just p
+ for (unsigned i = 0; i < ROUNDS / 2; i++) {
+ right ^= (((s[GETBYTE(left,3)] + s[256+GETBYTE(left,2)])
+ ^ s[2*256+GETBYTE(left,1)]) + s[3*256+GETBYTE(left,0)])
+ ^ p[2*i+1];
-#if ROUNDS == 20
- BF_EXTRA_ROUNDS
-#endif
+ left ^= (((s[GETBYTE(right,3)] + s[256+GETBYTE(right,2)])
+ ^ s[2*256+GETBYTE(right,1)]) + s[3*256+GETBYTE(right,0)])
+ ^ p[2*i+2];
+ }
right ^= p[ROUNDS + 1];
@@ -188,17 +196,23 @@ typedef BlockGetAndPut<word32, BigEndian> gpBlock;
void Blowfish::ProcessAndXorBlock(const byte* in, const byte* xOr, byte* out)
const
{
- word32 tmp, left, right;
+ word32 left, right;
+ const word32 *const s = sbox_;
const word32* p = pbox_;
gpBlock::Get(in)(left)(right);
left ^= p[0];
- BF_ROUNDS
+ // roll back up and use s and p index instead of just p
+ for (unsigned i = 0; i < ROUNDS / 2; i++) {
+ right ^= (((s[GETBYTE(left,3)] + s[256+GETBYTE(left,2)])
+ ^ s[2*256+GETBYTE(left,1)]) + s[3*256+GETBYTE(left,0)])
+ ^ p[2*i+1];
-#if ROUNDS == 20
- BF_EXTRA_ROUNDS
-#endif
+ left ^= (((s[GETBYTE(right,3)] + s[256+GETBYTE(right,2)])
+ ^ s[2*256+GETBYTE(right,1)]) + s[3*256+GETBYTE(right,0)])
+ ^ p[2*i+2];
+ }
right ^= p[ROUNDS + 1];
diff --git a/extra/yassl/taocrypt/src/coding.cpp b/extra/yassl/taocrypt/src/coding.cpp
index 7c6a6a8bd8b..8647ea13f20 100644
--- a/extra/yassl/taocrypt/src/coding.cpp
+++ b/extra/yassl/taocrypt/src/coding.cpp
@@ -95,7 +95,6 @@ void HexEncoder::Encode()
void HexDecoder::Decode()
{
word32 bytes = coded_.size();
- assert((bytes % 2) == 0);
decoded_.New(bytes / 2);
word32 i(0);
@@ -104,15 +103,9 @@ void HexDecoder::Decode()
byte b = coded_.next() - 0x30; // 0 starts at 0x30
byte b2 = coded_.next() - 0x30;
- // sanity checks
- assert( b < sizeof(hexDecode)/sizeof(hexDecode[0]) );
- assert( b2 < sizeof(hexDecode)/sizeof(hexDecode[0]) );
-
b = hexDecode[b];
b2 = hexDecode[b2];
-
- assert( b != bad && b2 != bad );
-
+
decoded_[i++] = (b << 4) | b2;
bytes -= 2;
}
@@ -174,9 +167,9 @@ void Base64Encoder::Encode()
}
encoded_[i++] = '\n';
- assert(i == outSz);
-
- plain_.reset(encoded_);
+
+ if (i == outSz)
+ plain_.reset(encoded_);
}
@@ -197,7 +190,6 @@ void Base64Decoder::Decode()
byte e3 = coded_.next();
byte e4 = coded_.next();
- // do asserts first
if (e1 == 0) // end file 0's
break;
diff --git a/extra/yassl/taocrypt/src/dsa.cpp b/extra/yassl/taocrypt/src/dsa.cpp
index 79ee91e76f9..a4e9c9503e7 100644
--- a/extra/yassl/taocrypt/src/dsa.cpp
+++ b/extra/yassl/taocrypt/src/dsa.cpp
@@ -183,7 +183,8 @@ word32 DSA_Signer::Sign(const byte* sha_digest, byte* sig,
Integer kInv = k.InverseMod(q);
s_ = (kInv * (H + x*r_)) % q;
- assert(!!r_ && !!s_);
+ if (!(!!r_ && !!s_))
+ return -1;
int rSz = r_.ByteCount();
diff --git a/extra/yassl/taocrypt/src/hash.cpp b/extra/yassl/taocrypt/src/hash.cpp
index c51dc42a909..b36a486368c 100644
--- a/extra/yassl/taocrypt/src/hash.cpp
+++ b/extra/yassl/taocrypt/src/hash.cpp
@@ -21,7 +21,6 @@
#include "runtime.hpp"
#include <string.h>
-#include <assert.h>
#include "hash.hpp"
@@ -31,8 +30,6 @@ namespace TaoCrypt {
HASHwithTransform::HASHwithTransform(word32 digSz, word32 buffSz)
{
- assert(digSz <= MaxDigestSz);
- assert(buffSz <= MaxBufferSz);
}
@@ -73,15 +70,15 @@ void HASHwithTransform::Update(const byte* data, word32 len)
// Final process, place digest in hash
void HASHwithTransform::Final(byte* hash)
{
- word32 blockSz = getBlockSize();
- word32 digestSz = getDigestSize();
- word32 padSz = getPadSize();
- ByteOrder order = getByteOrder();
+ word32 blockSz = getBlockSize();
+ word32 digestSz = getDigestSize();
+ word32 padSz = getPadSize();
+ ByteOrder order = getByteOrder();
AddLength(buffLen_); // before adding pads
HashLengthType preLoLen = GetBitCountLo();
HashLengthType preHiLen = GetBitCountHi();
- byte* local = reinterpret_cast<byte*>(buffer_);
+ byte* local = reinterpret_cast<byte*>(buffer_);
local[buffLen_++] = 0x80; // add 1
@@ -95,7 +92,7 @@ void HASHwithTransform::Final(byte* hash)
buffLen_ = 0;
}
memset(&local[buffLen_], 0, padSz - buffLen_);
-
+
ByteReverseIf(local, local, blockSz, order);
memcpy(&local[padSz], order ? &preHiLen : &preLoLen, sizeof(preLoLen));
@@ -113,8 +110,6 @@ void HASHwithTransform::Final(byte* hash)
HASH64withTransform::HASH64withTransform(word32 digSz, word32 buffSz)
{
- assert(digSz <= MaxDigestSz);
- assert(buffSz <= MaxBufferSz);
}
diff --git a/extra/yassl/taocrypt/src/hc128.cpp b/extra/yassl/taocrypt/src/hc128.cpp
new file mode 100644
index 00000000000..aac92f0abb4
--- /dev/null
+++ b/extra/yassl/taocrypt/src/hc128.cpp
@@ -0,0 +1,317 @@
+/*
+ Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+#include "runtime.hpp"
+#include "hc128.hpp"
+
+
+
+namespace TaoCrypt {
+
+
+
+
+#ifdef BIG_ENDIAN_ORDER
+ #define LITTLE32(x) ByteReverse((word32)x)
+#else
+ #define LITTLE32(x) (x)
+#endif
+
+
+/*h1 function*/
+#define h1(x, y) { \
+ byte a,c; \
+ a = (byte) (x); \
+ c = (byte) ((x) >> 16); \
+ y = (T_[512+a])+(T_[512+256+c]); \
+}
+
+/*h2 function*/
+#define h2(x, y) { \
+ byte a,c; \
+ a = (byte) (x); \
+ c = (byte) ((x) >> 16); \
+ y = (T_[a])+(T_[256+c]); \
+}
+
+/*one step of HC-128, update P and generate 32 bits keystream*/
+#define step_P(u,v,a,b,c,d,n){ \
+ word32 tem0,tem1,tem2,tem3; \
+ h1((X_[(d)]),tem3); \
+ tem0 = rotrFixed((T_[(v)]),23); \
+ tem1 = rotrFixed((X_[(c)]),10); \
+ tem2 = rotrFixed((X_[(b)]),8); \
+ (T_[(u)]) += tem2+(tem0 ^ tem1); \
+ (X_[(a)]) = (T_[(u)]); \
+ (n) = tem3 ^ (T_[(u)]) ; \
+}
+
+/*one step of HC-128, update Q and generate 32 bits keystream*/
+#define step_Q(u,v,a,b,c,d,n){ \
+ word32 tem0,tem1,tem2,tem3; \
+ h2((Y_[(d)]),tem3); \
+ tem0 = rotrFixed((T_[(v)]),(32-23)); \
+ tem1 = rotrFixed((Y_[(c)]),(32-10)); \
+ tem2 = rotrFixed((Y_[(b)]),(32-8)); \
+ (T_[(u)]) += tem2 + (tem0 ^ tem1); \
+ (Y_[(a)]) = (T_[(u)]); \
+ (n) = tem3 ^ (T_[(u)]) ; \
+}
+
+
+/*16 steps of HC-128, generate 512 bits keystream*/
+void HC128::GenerateKeystream(word32* keystream)
+{
+ word32 cc,dd;
+ cc = counter1024_ & 0x1ff;
+ dd = (cc+16)&0x1ff;
+
+ if (counter1024_ < 512)
+ {
+ counter1024_ = (counter1024_ + 16) & 0x3ff;
+ step_P(cc+0, cc+1, 0, 6, 13,4, keystream[0]);
+ step_P(cc+1, cc+2, 1, 7, 14,5, keystream[1]);
+ step_P(cc+2, cc+3, 2, 8, 15,6, keystream[2]);
+ step_P(cc+3, cc+4, 3, 9, 0, 7, keystream[3]);
+ step_P(cc+4, cc+5, 4, 10,1, 8, keystream[4]);
+ step_P(cc+5, cc+6, 5, 11,2, 9, keystream[5]);
+ step_P(cc+6, cc+7, 6, 12,3, 10,keystream[6]);
+ step_P(cc+7, cc+8, 7, 13,4, 11,keystream[7]);
+ step_P(cc+8, cc+9, 8, 14,5, 12,keystream[8]);
+ step_P(cc+9, cc+10,9, 15,6, 13,keystream[9]);
+ step_P(cc+10,cc+11,10,0, 7, 14,keystream[10]);
+ step_P(cc+11,cc+12,11,1, 8, 15,keystream[11]);
+ step_P(cc+12,cc+13,12,2, 9, 0, keystream[12]);
+ step_P(cc+13,cc+14,13,3, 10,1, keystream[13]);
+ step_P(cc+14,cc+15,14,4, 11,2, keystream[14]);
+ step_P(cc+15,dd+0, 15,5, 12,3, keystream[15]);
+ }
+ else
+ {
+ counter1024_ = (counter1024_ + 16) & 0x3ff;
+ step_Q(512+cc+0, 512+cc+1, 0, 6, 13,4, keystream[0]);
+ step_Q(512+cc+1, 512+cc+2, 1, 7, 14,5, keystream[1]);
+ step_Q(512+cc+2, 512+cc+3, 2, 8, 15,6, keystream[2]);
+ step_Q(512+cc+3, 512+cc+4, 3, 9, 0, 7, keystream[3]);
+ step_Q(512+cc+4, 512+cc+5, 4, 10,1, 8, keystream[4]);
+ step_Q(512+cc+5, 512+cc+6, 5, 11,2, 9, keystream[5]);
+ step_Q(512+cc+6, 512+cc+7, 6, 12,3, 10,keystream[6]);
+ step_Q(512+cc+7, 512+cc+8, 7, 13,4, 11,keystream[7]);
+ step_Q(512+cc+8, 512+cc+9, 8, 14,5, 12,keystream[8]);
+ step_Q(512+cc+9, 512+cc+10,9, 15,6, 13,keystream[9]);
+ step_Q(512+cc+10,512+cc+11,10,0, 7, 14,keystream[10]);
+ step_Q(512+cc+11,512+cc+12,11,1, 8, 15,keystream[11]);
+ step_Q(512+cc+12,512+cc+13,12,2, 9, 0, keystream[12]);
+ step_Q(512+cc+13,512+cc+14,13,3, 10,1, keystream[13]);
+ step_Q(512+cc+14,512+cc+15,14,4, 11,2, keystream[14]);
+ step_Q(512+cc+15,512+dd+0, 15,5, 12,3, keystream[15]);
+ }
+}
+
+
+/* The following defines the initialization functions */
+#define f1(x) (rotrFixed((x),7) ^ rotrFixed((x),18) ^ ((x) >> 3))
+#define f2(x) (rotrFixed((x),17) ^ rotrFixed((x),19) ^ ((x) >> 10))
+
+/*update table P*/
+#define update_P(u,v,a,b,c,d){ \
+ word32 tem0,tem1,tem2,tem3; \
+ tem0 = rotrFixed((T_[(v)]),23); \
+ tem1 = rotrFixed((X_[(c)]),10); \
+ tem2 = rotrFixed((X_[(b)]),8); \
+ h1((X_[(d)]),tem3); \
+ (T_[(u)]) = ((T_[(u)]) + tem2+(tem0^tem1)) ^ tem3; \
+ (X_[(a)]) = (T_[(u)]); \
+}
+
+/*update table Q*/
+#define update_Q(u,v,a,b,c,d){ \
+ word32 tem0,tem1,tem2,tem3; \
+ tem0 = rotrFixed((T_[(v)]),(32-23)); \
+ tem1 = rotrFixed((Y_[(c)]),(32-10)); \
+ tem2 = rotrFixed((Y_[(b)]),(32-8)); \
+ h2((Y_[(d)]),tem3); \
+ (T_[(u)]) = ((T_[(u)]) + tem2+(tem0^tem1)) ^ tem3; \
+ (Y_[(a)]) = (T_[(u)]); \
+}
+
+/*16 steps of HC-128, without generating keystream, */
+/*but use the outputs to update P and Q*/
+void HC128::SetupUpdate() /*each time 16 steps*/
+{
+ word32 cc,dd;
+ cc = counter1024_ & 0x1ff;
+ dd = (cc+16)&0x1ff;
+
+ if (counter1024_ < 512)
+ {
+ counter1024_ = (counter1024_ + 16) & 0x3ff;
+ update_P(cc+0, cc+1, 0, 6, 13, 4);
+ update_P(cc+1, cc+2, 1, 7, 14, 5);
+ update_P(cc+2, cc+3, 2, 8, 15, 6);
+ update_P(cc+3, cc+4, 3, 9, 0, 7);
+ update_P(cc+4, cc+5, 4, 10,1, 8);
+ update_P(cc+5, cc+6, 5, 11,2, 9);
+ update_P(cc+6, cc+7, 6, 12,3, 10);
+ update_P(cc+7, cc+8, 7, 13,4, 11);
+ update_P(cc+8, cc+9, 8, 14,5, 12);
+ update_P(cc+9, cc+10,9, 15,6, 13);
+ update_P(cc+10,cc+11,10,0, 7, 14);
+ update_P(cc+11,cc+12,11,1, 8, 15);
+ update_P(cc+12,cc+13,12,2, 9, 0);
+ update_P(cc+13,cc+14,13,3, 10, 1);
+ update_P(cc+14,cc+15,14,4, 11, 2);
+ update_P(cc+15,dd+0, 15,5, 12, 3);
+ }
+ else
+ {
+ counter1024_ = (counter1024_ + 16) & 0x3ff;
+ update_Q(512+cc+0, 512+cc+1, 0, 6, 13, 4);
+ update_Q(512+cc+1, 512+cc+2, 1, 7, 14, 5);
+ update_Q(512+cc+2, 512+cc+3, 2, 8, 15, 6);
+ update_Q(512+cc+3, 512+cc+4, 3, 9, 0, 7);
+ update_Q(512+cc+4, 512+cc+5, 4, 10,1, 8);
+ update_Q(512+cc+5, 512+cc+6, 5, 11,2, 9);
+ update_Q(512+cc+6, 512+cc+7, 6, 12,3, 10);
+ update_Q(512+cc+7, 512+cc+8, 7, 13,4, 11);
+ update_Q(512+cc+8, 512+cc+9, 8, 14,5, 12);
+ update_Q(512+cc+9, 512+cc+10,9, 15,6, 13);
+ update_Q(512+cc+10,512+cc+11,10,0, 7, 14);
+ update_Q(512+cc+11,512+cc+12,11,1, 8, 15);
+ update_Q(512+cc+12,512+cc+13,12,2, 9, 0);
+ update_Q(512+cc+13,512+cc+14,13,3, 10, 1);
+ update_Q(512+cc+14,512+cc+15,14,4, 11, 2);
+ update_Q(512+cc+15,512+dd+0, 15,5, 12, 3);
+ }
+}
+
+
+/* for the 128-bit key: key[0]...key[15]
+* key[0] is the least significant byte of ctx->key[0] (K_0);
+* key[3] is the most significant byte of ctx->key[0] (K_0);
+* ...
+* key[12] is the least significant byte of ctx->key[3] (K_3)
+* key[15] is the most significant byte of ctx->key[3] (K_3)
+*
+* for the 128-bit iv: iv[0]...iv[15]
+* iv[0] is the least significant byte of ctx->iv[0] (IV_0);
+* iv[3] is the most significant byte of ctx->iv[0] (IV_0);
+* ...
+* iv[12] is the least significant byte of ctx->iv[3] (IV_3)
+* iv[15] is the most significant byte of ctx->iv[3] (IV_3)
+*/
+
+
+
+void HC128::SetIV(const byte* iv)
+{
+ word32 i;
+
+ for (i = 0; i < (128 >> 5); i++)
+ iv_[i] = LITTLE32(((word32*)iv)[i]);
+
+ for (; i < 8; i++) iv_[i] = iv_[i-4];
+
+ /* expand the key and IV into the table T */
+ /* (expand the key and IV into the table P and Q) */
+
+ for (i = 0; i < 8; i++) T_[i] = key_[i];
+ for (i = 8; i < 16; i++) T_[i] = iv_[i-8];
+
+ for (i = 16; i < (256+16); i++)
+ T_[i] = f2(T_[i-2]) + T_[i-7] + f1(T_[i-15]) + T_[i-16]+i;
+
+ for (i = 0; i < 16; i++) T_[i] = T_[256+i];
+
+ for (i = 16; i < 1024; i++)
+ T_[i] = f2(T_[i-2]) + T_[i-7] + f1(T_[i-15]) + T_[i-16]+256+i;
+
+ /* initialize counter1024, X and Y */
+ counter1024_ = 0;
+ for (i = 0; i < 16; i++) X_[i] = T_[512-16+i];
+ for (i = 0; i < 16; i++) Y_[i] = T_[512+512-16+i];
+
+ /* run the cipher 1024 steps before generating the output */
+ for (i = 0; i < 64; i++) SetupUpdate();
+}
+
+
+void HC128::SetKey(const byte* key, const byte* iv)
+{
+ word32 i;
+
+ /* Key size in bits 128 */
+ for (i = 0; i < (128 >> 5); i++)
+ key_[i] = LITTLE32(((word32*)key)[i]);
+
+ for ( ; i < 8 ; i++) key_[i] = key_[i-4];
+
+ SetIV(iv);
+}
+
+
+/* The following defines the encryption of data stream */
+void HC128::Process(byte* output, const byte* input, word32 msglen)
+{
+ word32 i, keystream[16];
+
+ for ( ; msglen >= 64; msglen -= 64, input += 64, output += 64)
+ {
+ GenerateKeystream(keystream);
+
+ /* unroll loop */
+ ((word32*)output)[0] = ((word32*)input)[0] ^ LITTLE32(keystream[0]);
+ ((word32*)output)[1] = ((word32*)input)[1] ^ LITTLE32(keystream[1]);
+ ((word32*)output)[2] = ((word32*)input)[2] ^ LITTLE32(keystream[2]);
+ ((word32*)output)[3] = ((word32*)input)[3] ^ LITTLE32(keystream[3]);
+ ((word32*)output)[4] = ((word32*)input)[4] ^ LITTLE32(keystream[4]);
+ ((word32*)output)[5] = ((word32*)input)[5] ^ LITTLE32(keystream[5]);
+ ((word32*)output)[6] = ((word32*)input)[6] ^ LITTLE32(keystream[6]);
+ ((word32*)output)[7] = ((word32*)input)[7] ^ LITTLE32(keystream[7]);
+ ((word32*)output)[8] = ((word32*)input)[8] ^ LITTLE32(keystream[8]);
+ ((word32*)output)[9] = ((word32*)input)[9] ^ LITTLE32(keystream[9]);
+ ((word32*)output)[10] = ((word32*)input)[10] ^ LITTLE32(keystream[10]);
+ ((word32*)output)[11] = ((word32*)input)[11] ^ LITTLE32(keystream[11]);
+ ((word32*)output)[12] = ((word32*)input)[12] ^ LITTLE32(keystream[12]);
+ ((word32*)output)[13] = ((word32*)input)[13] ^ LITTLE32(keystream[13]);
+ ((word32*)output)[14] = ((word32*)input)[14] ^ LITTLE32(keystream[14]);
+ ((word32*)output)[15] = ((word32*)input)[15] ^ LITTLE32(keystream[15]);
+ }
+
+ if (msglen > 0)
+ {
+ GenerateKeystream(keystream);
+
+#ifdef BIG_ENDIAN_ORDER
+ {
+ word32 wordsLeft = msglen / sizeof(word32);
+ if (msglen % sizeof(word32)) wordsLeft++;
+
+ ByteReverse(keystream, keystream, wordsLeft * sizeof(word32));
+ }
+#endif
+
+ for (i = 0; i < msglen; i++)
+ output[i] = input[i] ^ ((byte*)keystream)[i];
+ }
+
+}
+
+
+} // namespace
diff --git a/extra/yassl/taocrypt/src/integer.cpp b/extra/yassl/taocrypt/src/integer.cpp
index c00815df8cf..2d55f48e91f 100644
--- a/extra/yassl/taocrypt/src/integer.cpp
+++ b/extra/yassl/taocrypt/src/integer.cpp
@@ -73,7 +73,8 @@ template <class T>
CPP_TYPENAME AlignedAllocator<T>::pointer AlignedAllocator<T>::allocate(
size_type n, const void *)
{
- CheckSize(n);
+ if (n > max_size())
+ return 0;
if (n == 0)
return 0;
if (n >= 4)
@@ -91,16 +92,13 @@ CPP_TYPENAME AlignedAllocator<T>::pointer AlignedAllocator<T>::allocate(
#endif
#ifdef TAOCRYPT_NO_ALIGNED_ALLOC
- assert(m_pBlock == 0);
m_pBlock = p;
if (!IsAlignedOn(p, 16))
{
- assert(IsAlignedOn(p, 8));
p = (byte *)p + 8;
}
#endif
- assert(IsAlignedOn(p, 16));
return (T*)p;
}
return NEW_TC T[n];
@@ -116,7 +114,6 @@ void AlignedAllocator<T>::deallocate(void* p, size_type n)
#ifdef TAOCRYPT_MM_MALLOC_AVAILABLE
_mm_free(p);
#elif defined(TAOCRYPT_NO_ALIGNED_ALLOC)
- assert(m_pBlock == p || (byte*)m_pBlock+8 == p);
free(m_pBlock);
m_pBlock = 0;
#else
@@ -284,14 +281,14 @@ DWord() {}
private:
struct dword_struct
- {
- #ifdef LITTLE_ENDIAN_ORDER
- word low;
- word high;
- #else
- word high;
- word low;
- #endif
+ {
+ #ifdef LITTLE_ENDIAN_ORDER
+ word low;
+ word high;
+ #else
+ word high;
+ word low;
+ #endif
};
union
@@ -365,9 +362,6 @@ private:
template <class S, class D>
S DivideThreeWordsByTwo(S* A, S B0, S B1, D* dummy_VC6_WorkAround = 0)
{
- // assert {A[2],A[1]} < {B1,B0}, so quotient can fit in a S
- assert(A[2] < B1 || (A[2]==B1 && A[1] < B0));
-
// estimate the quotient: do a 2 S by 1 S divide
S Q;
if (S(B1+1) == 0)
@@ -393,7 +387,6 @@ S DivideThreeWordsByTwo(S* A, S B0, S B1, D* dummy_VC6_WorkAround = 0)
A[1] = u.GetLowHalf();
A[2] += u.GetHighHalf();
Q++;
- assert(Q); // shouldn't overflow
}
return Q;
@@ -491,7 +484,6 @@ static int Compare(const word *A, const word *B, unsigned int N)
static word Increment(word *A, unsigned int N, word B=1)
{
- assert(N);
word t = A[0];
A[0] = t+B;
if (A[0] >= t)
@@ -504,7 +496,6 @@ static word Increment(word *A, unsigned int N, word B=1)
static word Decrement(word *A, unsigned int N, word B=1)
{
- assert(N);
word t = A[0];
A[0] = t-B;
if (A[0] <= t)
@@ -538,14 +529,11 @@ static word LinearMultiply(word *C, const word *A, word B, unsigned int N)
static word AtomicInverseModPower2(word A)
{
- assert(A%2==1);
-
word R=A%8;
for (unsigned i=3; i<WORD_BITS; i*=2)
R = R*(2-R*A);
- assert(word(R*A)==1);
return R;
}
@@ -576,14 +564,11 @@ public:
static void TAOCRYPT_CDECL Square2(word *R, const word *A);
static void TAOCRYPT_CDECL Square4(word *R, const word *A);
- static void TAOCRYPT_CDECL Square8(word *R, const word *A) {assert(false);}
static unsigned int TAOCRYPT_CDECL SquareRecursionLimit() {return 4;}
};
word Portable::Add(word *C, const word *A, const word *B, unsigned int N)
{
- assert (N%2 == 0);
-
DWord u(0, 0);
for (unsigned int i = 0; i < N; i+=2)
{
@@ -597,8 +582,6 @@ word Portable::Add(word *C, const word *A, const word *B, unsigned int N)
word Portable::Subtract(word *C, const word *A, const word *B, unsigned int N)
{
- assert (N%2 == 0);
-
DWord u(0, 0);
for (unsigned int i = 0; i < N; i+=2)
{
@@ -1013,7 +996,7 @@ void Portable::Multiply8Bottom(word *R, const word *A, const word *B)
static jmp_buf s_env;
static void SigIllHandler(int)
{
- longjmp(s_env, 1);
+ longjmp(s_env, 1);
}
#endif
@@ -2130,8 +2113,6 @@ void P4Optimized::Multiply8Bottom(word *C, const word *A, const word *B)
void RecursiveMultiply(word *R, word *T, const word *A, const word *B,
unsigned int N)
{
- assert(N>=2 && N%2==0);
-
if (LowLevel::MultiplyRecursionLimit() >= 8 && N==8)
LowLevel::Multiply8(R, A, B);
else if (LowLevel::MultiplyRecursionLimit() >= 4 && N==4)
@@ -2188,7 +2169,6 @@ void RecursiveMultiply(word *R, word *T, const word *A, const word *B,
carry += LowLevel::Add(T0, T0, R2, N);
carry += LowLevel::Add(R1, R1, T0, N);
- assert (carry >= 0 && carry <= 2);
Increment(R3, N2, carry);
}
}
@@ -2196,9 +2176,6 @@ void RecursiveMultiply(word *R, word *T, const word *A, const word *B,
void RecursiveSquare(word *R, word *T, const word *A, unsigned int N)
{
- assert(N && N%2==0);
- if (LowLevel::SquareRecursionLimit() >= 8 && N==8)
- LowLevel::Square8(R, A);
if (LowLevel::SquareRecursionLimit() >= 4 && N==4)
LowLevel::Square4(R, A);
else if (N==2)
@@ -2227,7 +2204,6 @@ void RecursiveSquare(word *R, word *T, const word *A, unsigned int N)
void RecursiveMultiplyBottom(word *R, word *T, const word *A, const word *B,
unsigned int N)
{
- assert(N>=2 && N%2==0);
if (LowLevel::MultiplyBottomRecursionLimit() >= 8 && N==8)
LowLevel::Multiply8Bottom(R, A, B);
else if (LowLevel::MultiplyBottomRecursionLimit() >= 4 && N==4)
@@ -2250,8 +2226,6 @@ void RecursiveMultiplyBottom(word *R, word *T, const word *A, const word *B,
void RecursiveMultiplyTop(word *R, word *T, const word *L, const word *A,
const word *B, unsigned int N)
{
- assert(N>=2 && N%2==0);
-
if (N==4)
{
LowLevel::Multiply4(T, A, B);
@@ -2315,7 +2289,6 @@ void RecursiveMultiplyTop(word *R, word *T, const word *L, const word *A,
carry += Increment(R0, N2, c2+t);
carry += LowLevel::Add(R0, R0, T1, N2);
carry += LowLevel::Add(R0, R0, T3, N2);
- assert (carry >= 0 && carry <= 2);
CopyWords(R1, T3, N2);
Increment(R1, N2, carry);
@@ -2364,9 +2337,6 @@ void AsymmetricMultiply(word *R, word *T, const word *A, unsigned int NA,
STL::swap(NA, NB);
}
- assert(NB % NA == 0);
- assert((NB/NA)%2 == 0); // NB is an even multiple of NA
-
if (NA==2 && !A[1])
{
switch (A[0])
@@ -2433,8 +2403,6 @@ static inline unsigned int EvenWordCount(const word *X, unsigned int N)
unsigned int AlmostInverse(word *R, word *T, const word *A, unsigned int NA,
const word *M, unsigned int N)
{
- assert(NA<=N && N && N%2==0);
-
word *b = T;
word *c = T+N;
word *f = T+2*N;
@@ -2460,7 +2428,6 @@ unsigned int AlmostInverse(word *R, word *T, const word *A, unsigned int NA,
ShiftWordsRightByWords(f, fgLen, 1);
if (c[bcLen-1]) bcLen+=2;
- assert(bcLen <= N);
ShiftWordsLeftByWords(c, bcLen, 1);
k+=WORD_BITS;
t=f[0];
@@ -2489,7 +2456,6 @@ unsigned int AlmostInverse(word *R, word *T, const word *A, unsigned int NA,
{
c[bcLen] = t;
bcLen+=2;
- assert(bcLen <= N);
}
if (f[fgLen-2]==0 && g[fgLen-2]==0 && f[fgLen-1]==0 && g[fgLen-1]==0)
@@ -2508,7 +2474,6 @@ unsigned int AlmostInverse(word *R, word *T, const word *A, unsigned int NA,
{
b[bcLen] = 1;
bcLen+=2;
- assert(bcLen <= N);
}
}
}
@@ -2741,8 +2706,6 @@ void Integer::Randomize(RandomNumberGenerator& rng, unsigned int nbits)
void Integer::Randomize(RandomNumberGenerator& rng, const Integer& min,
const Integer& max)
{
- assert(min <= max);
-
Integer range = max - min;
const unsigned int nbits = range.BitCount();
@@ -2881,7 +2844,7 @@ Integer& Integer::operator++()
else
{
word borrow = Decrement(reg_.get_buffer(), reg_.size());
- assert(!borrow);
+ (void)borrow; // shut up compiler
if (WordCount()==0)
*this = Zero();
}
@@ -2998,7 +2961,6 @@ void PositiveSubtract(Integer &diff, const Integer &a, const Integer& b)
b.reg_.get_buffer(), bSize);
CopyWords(diff.reg_+bSize, a.reg_+bSize, aSize-bSize);
borrow = Decrement(diff.reg_+bSize, aSize-bSize, borrow);
- assert(!borrow);
diff.sign_ = Integer::POSITIVE;
}
else
@@ -3007,7 +2969,6 @@ void PositiveSubtract(Integer &diff, const Integer &a, const Integer& b)
a.reg_.get_buffer(), aSize);
CopyWords(diff.reg_+aSize, b.reg_+aSize, bSize-aSize);
borrow = Decrement(diff.reg_+aSize, bSize-aSize, borrow);
- assert(!borrow);
diff.sign_ = Integer::NEGATIVE;
}
}
@@ -3067,7 +3028,6 @@ bool Integer::GetBit(unsigned int n) const
unsigned long Integer::GetBits(unsigned int i, unsigned int n) const
{
- assert(n <= sizeof(unsigned long)*8);
unsigned long v = 0;
for (unsigned int j=0; j<n; j++)
v |= GetBit(i+j) << j;
@@ -3127,8 +3087,6 @@ bool Integer::IsConvertableToLong() const
signed long Integer::ConvertToLong() const
{
- assert(IsConvertableToLong());
-
unsigned long value = reg_[0];
value += SafeLeftShift<WORD_BITS, unsigned long>(reg_[1]);
return sign_ == POSITIVE ? value : -(signed long)value;
@@ -3227,11 +3185,9 @@ static inline void AtomicDivide(word *Q, const word *A, const word *B)
{
// multiply quotient and divisor and add remainder, make sure it
// equals dividend
- assert(!T[2] && !T[3] && (T[1] < B[1] || (T[1]==B[1] && T[0]<B[0])));
word P[4];
Portable::Multiply2(P, Q, B);
Add(P, P, T, 4);
- assert(memcmp(P, A, 4*WORD_SIZE)==0);
}
#endif
}
@@ -3241,8 +3197,6 @@ static inline void AtomicDivide(word *Q, const word *A, const word *B)
static void CorrectQuotientEstimate(word *R, word *T, word *Q, const word *B,
unsigned int N)
{
- assert(N && N%2==0);
-
if (Q[1])
{
T[N] = T[N+1] = 0;
@@ -3260,13 +3214,12 @@ static void CorrectQuotientEstimate(word *R, word *T, word *Q, const word *B,
}
word borrow = Subtract(R, R, T, N+2);
- assert(!borrow && !R[N+1]);
+ (void)borrow; // shut up compiler
while (R[N] || Compare(R, B, N) >= 0)
{
R[N] -= Subtract(R, R, B, N);
Q[1] += (++Q[0]==0);
- assert(Q[0] || Q[1]); // no overflow
}
}
@@ -3280,10 +3233,6 @@ static void CorrectQuotientEstimate(word *R, word *T, word *Q, const word *B,
void Divide(word* R, word* Q, word* T, const word* A, unsigned int NA,
const word* B, unsigned int NB)
{
- assert(NA && NB && NA%2==0 && NB%2==0);
- assert(B[NB-1] || B[NB-2]);
- assert(NB <= NA);
-
// set up temporary work space
word *const TA=T;
word *const TB=T+NA+2;
@@ -3294,7 +3243,6 @@ void Divide(word* R, word* Q, word* T, const word* A, unsigned int NA,
TB[0] = TB[NB-1] = 0;
CopyWords(TB+shiftWords, B, NB-shiftWords);
unsigned shiftBits = WORD_BITS - BitPrecision(TB[NB-1]);
- assert(shiftBits < WORD_BITS);
ShiftWordsLeftByBits(TB, NB, shiftBits);
// copy A into TA and normalize it
@@ -3314,7 +3262,6 @@ void Divide(word* R, word* Q, word* T, const word* A, unsigned int NA,
else
{
NA+=2;
- assert(Compare(TA+NA-NB, TB, NB) < 0);
}
word BT[2];
@@ -3340,8 +3287,6 @@ void PositiveDivide(Integer& remainder, Integer& quotient,
unsigned aSize = a.WordCount();
unsigned bSize = b.WordCount();
- assert(bSize);
-
if (a.PositiveCompare(b) == -1)
{
remainder = a;
@@ -3429,8 +3374,6 @@ Integer Integer::Modulo(const Integer &b) const
void Integer::Divide(word &remainder, Integer &quotient,
const Integer &dividend, word divisor)
{
- assert(divisor);
-
if ((divisor & (divisor-1)) == 0) // divisor is a power of 2
{
quotient = dividend >> (BitPrecision(divisor)-1);
@@ -3470,8 +3413,6 @@ Integer Integer::DividedBy(word b) const
word Integer::Modulo(word divisor) const
{
- assert(divisor);
-
word remainder;
if ((divisor & (divisor-1)) == 0) // divisor is a power of 2
@@ -3517,7 +3458,6 @@ Integer Integer::SquareRoot() const
// overestimate square root
Integer x, y = Power2((BitCount()+1)/2);
- assert(y*y >= *this);
do
{
@@ -3562,8 +3502,6 @@ Integer Integer::Gcd(const Integer &a, const Integer &b)
Integer Integer::InverseMod(const Integer &m) const
{
- assert(m.NotNegative());
-
if (IsNegative() || *this>=m)
return (*this%m).InverseMod(m);
@@ -3806,7 +3744,7 @@ void MontgomeryReduce(word *R, word *T, const word *X, const word *M,
word borrow = Subtract(T, X+N, T, N);
// defend against timing attack by doing this Add even when not needed
word carry = Add(T+N, T, M, N);
- assert(carry || !borrow);
+ (void)carry; // shut up compiler
CopyWords(R, T + (borrow ? N : 0), N);
}
@@ -3862,7 +3800,6 @@ MontgomeryRepresentation::MontgomeryRepresentation(const Integer &m)
u((word)0, modulus.reg_.size()),
workspace(5*modulus.reg_.size())
{
- assert(modulus.IsOdd());
RecursiveInverseModPower2(u.reg_.get_buffer(), workspace.get_buffer(),
modulus.reg_.get_buffer(), modulus.reg_.size());
}
@@ -3873,7 +3810,6 @@ const Integer& MontgomeryRepresentation::Multiply(const Integer &a,
word *const T = workspace.begin();
word *const R = result.reg_.begin();
const unsigned int N = modulus.reg_.size();
- assert(a.reg_.size()<=N && b.reg_.size()<=N);
AsymmetricMultiply(T, T+2*N, a.reg_.get_buffer(), a.reg_.size(),
b.reg_.get_buffer(), b.reg_.size());
@@ -3888,7 +3824,6 @@ const Integer& MontgomeryRepresentation::Square(const Integer &a) const
word *const T = workspace.begin();
word *const R = result.reg_.begin();
const unsigned int N = modulus.reg_.size();
- assert(a.reg_.size()<=N);
TaoCrypt::Square(T, T+2*N, a.reg_.get_buffer(), a.reg_.size());
SetWords(T+2*a.reg_.size(), 0, 2*N-2*a.reg_.size());
@@ -3902,7 +3837,6 @@ Integer MontgomeryRepresentation::ConvertOut(const Integer &a) const
word *const T = workspace.begin();
word *const R = result.reg_.begin();
const unsigned int N = modulus.reg_.size();
- assert(a.reg_.size()<=N);
CopyWords(T, a.reg_.get_buffer(), a.reg_.size());
SetWords(T+a.reg_.size(), 0, 2*N-a.reg_.size());
@@ -3919,7 +3853,6 @@ const Integer& MontgomeryRepresentation::MultiplicativeInverse(
word *const T = workspace.begin();
word *const R = result.reg_.begin();
const unsigned int N = modulus.reg_.size();
- assert(a.reg_.size()<=N);
CopyWords(T, a.reg_.get_buffer(), a.reg_.size());
SetWords(T+a.reg_.size(), 0, 2*N-a.reg_.size());
diff --git a/extra/yassl/taocrypt/src/make.bat b/extra/yassl/taocrypt/src/make.bat
index ecd3023f5ab..ecd3023f5ab 100644..100755
--- a/extra/yassl/taocrypt/src/make.bat
+++ b/extra/yassl/taocrypt/src/make.bat
diff --git a/extra/yassl/taocrypt/src/md4.cpp b/extra/yassl/taocrypt/src/md4.cpp
index cf17c218809..54820f4c944 100644
--- a/extra/yassl/taocrypt/src/md4.cpp
+++ b/extra/yassl/taocrypt/src/md4.cpp
@@ -27,7 +27,7 @@
#include "algorithm.hpp"
#endif
-
+
namespace STL = STL_NAMESPACE;
diff --git a/extra/yassl/taocrypt/src/md5.cpp b/extra/yassl/taocrypt/src/md5.cpp
index f18e0290c90..4d0a8bd03be 100644
--- a/extra/yassl/taocrypt/src/md5.cpp
+++ b/extra/yassl/taocrypt/src/md5.cpp
@@ -30,7 +30,7 @@
namespace STL = STL_NAMESPACE;
-
+
namespace TaoCrypt {
@@ -108,14 +108,14 @@ void MD5::Update(const byte* data, word32 len)
// at once for asm
if (buffLen_ == 0) {
- word32 times = len / BLOCK_SIZE;
- if (times) {
- AsmTransform(data, times);
- const word32 add = BLOCK_SIZE * times;
- AddLength(add);
- len -= add;
- data += add;
- }
+ word32 times = len / BLOCK_SIZE;
+ if (times) {
+ AsmTransform(data, times);
+ const word32 add = BLOCK_SIZE * times;
+ AddLength(add);
+ len -= add;
+ data += add;
+ }
}
// cache any data left
diff --git a/extra/yassl/taocrypt/src/misc.cpp b/extra/yassl/taocrypt/src/misc.cpp
index 6045ea3e42b..5ffa2a2a07a 100644
--- a/extra/yassl/taocrypt/src/misc.cpp
+++ b/extra/yassl/taocrypt/src/misc.cpp
@@ -41,28 +41,28 @@ namespace STL = STL_NAMESPACE;
void* operator new(size_t sz, TaoCrypt::new_t)
{
- void* ptr = malloc(sz ? sz : 1);
- if (!ptr) abort();
+ void* ptr = malloc(sz ? sz : 1);
+ if (!ptr) abort();
- return ptr;
+ return ptr;
}
void operator delete(void* ptr, TaoCrypt::new_t)
{
- if (ptr) free(ptr);
+ if (ptr) free(ptr);
}
void* operator new[](size_t sz, TaoCrypt::new_t nt)
{
- return ::operator new(sz, nt);
+ return ::operator new(sz, nt);
}
void operator delete[](void* ptr, TaoCrypt::new_t nt)
{
- ::operator delete(ptr, nt);
+ ::operator delete(ptr, nt);
}
@@ -89,7 +89,6 @@ namespace STL = STL_NAMESPACE;
// Handler for pure virtual functions
namespace __Crun {
void pure_error() {
- assert(!"Aborted: pure virtual method called.");
}
}
@@ -100,7 +99,6 @@ namespace __Crun {
extern "C" {
int __cxa_pure_virtual() {
- assert(!"Aborted: pure virtual method called.");
return 0;
}
@@ -196,8 +194,8 @@ bool HaveCpuId()
return true;
#else
word32 eax, ebx;
- __asm__ __volatile
- (
+ __asm__ __volatile
+ (
/* Put EFLAGS in eax and ebx */
"pushf;"
"pushf;"
@@ -214,9 +212,9 @@ bool HaveCpuId()
"pop %0;"
"popf"
: "=r" (eax), "=r" (ebx)
- :
+ :
: "cc"
- );
+ );
if (eax == ebx)
return false;
diff --git a/extra/yassl/taocrypt/src/rabbit.cpp b/extra/yassl/taocrypt/src/rabbit.cpp
new file mode 100644
index 00000000000..0ea4146618a
--- /dev/null
+++ b/extra/yassl/taocrypt/src/rabbit.cpp
@@ -0,0 +1,250 @@
+/*
+ Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+#include "runtime.hpp"
+#include "rabbit.hpp"
+
+
+
+namespace TaoCrypt {
+
+
+#define U32V(x) (word32)(x)
+
+
+#ifdef BIG_ENDIAN_ORDER
+ #define LITTLE32(x) ByteReverse((word32)x)
+#else
+ #define LITTLE32(x) (x)
+#endif
+
+
+// local
+namespace {
+
+
+/* Square a 32-bit unsigned integer to obtain the 64-bit result and return */
+/* the upper 32 bits XOR the lower 32 bits */
+word32 RABBIT_g_func(word32 x)
+{
+ /* Temporary variables */
+ word32 a, b, h, l;
+
+ /* Construct high and low argument for squaring */
+ a = x&0xFFFF;
+ b = x>>16;
+
+ /* Calculate high and low result of squaring */
+ h = (((U32V(a*a)>>17) + U32V(a*b))>>15) + b*b;
+ l = x*x;
+
+ /* Return high XOR low */
+ return U32V(h^l);
+}
+
+
+} // namespace local
+
+
+/* Calculate the next internal state */
+void Rabbit::NextState(RabbitCtx which)
+{
+ /* Temporary variables */
+ word32 g[8], c_old[8], i;
+
+ Ctx* ctx;
+
+ if (which == Master)
+ ctx = &masterCtx_;
+ else
+ ctx = &workCtx_;
+
+ /* Save old counter values */
+ for (i=0; i<8; i++)
+ c_old[i] = ctx->c[i];
+
+ /* Calculate new counter values */
+ ctx->c[0] = U32V(ctx->c[0] + 0x4D34D34D + ctx->carry);
+ ctx->c[1] = U32V(ctx->c[1] + 0xD34D34D3 + (ctx->c[0] < c_old[0]));
+ ctx->c[2] = U32V(ctx->c[2] + 0x34D34D34 + (ctx->c[1] < c_old[1]));
+ ctx->c[3] = U32V(ctx->c[3] + 0x4D34D34D + (ctx->c[2] < c_old[2]));
+ ctx->c[4] = U32V(ctx->c[4] + 0xD34D34D3 + (ctx->c[3] < c_old[3]));
+ ctx->c[5] = U32V(ctx->c[5] + 0x34D34D34 + (ctx->c[4] < c_old[4]));
+ ctx->c[6] = U32V(ctx->c[6] + 0x4D34D34D + (ctx->c[5] < c_old[5]));
+ ctx->c[7] = U32V(ctx->c[7] + 0xD34D34D3 + (ctx->c[6] < c_old[6]));
+ ctx->carry = (ctx->c[7] < c_old[7]);
+
+ /* Calculate the g-values */
+ for (i=0;i<8;i++)
+ g[i] = RABBIT_g_func(U32V(ctx->x[i] + ctx->c[i]));
+
+ /* Calculate new state values */
+ ctx->x[0] = U32V(g[0] + rotlFixed(g[7],16) + rotlFixed(g[6], 16));
+ ctx->x[1] = U32V(g[1] + rotlFixed(g[0], 8) + g[7]);
+ ctx->x[2] = U32V(g[2] + rotlFixed(g[1],16) + rotlFixed(g[0], 16));
+ ctx->x[3] = U32V(g[3] + rotlFixed(g[2], 8) + g[1]);
+ ctx->x[4] = U32V(g[4] + rotlFixed(g[3],16) + rotlFixed(g[2], 16));
+ ctx->x[5] = U32V(g[5] + rotlFixed(g[4], 8) + g[3]);
+ ctx->x[6] = U32V(g[6] + rotlFixed(g[5],16) + rotlFixed(g[4], 16));
+ ctx->x[7] = U32V(g[7] + rotlFixed(g[6], 8) + g[5]);
+}
+
+
+/* IV setup */
+void Rabbit::SetIV(const byte* iv)
+{
+ /* Temporary variables */
+ word32 i0, i1, i2, i3, i;
+
+ /* Generate four subvectors */
+ i0 = LITTLE32(*(word32*)(iv+0));
+ i2 = LITTLE32(*(word32*)(iv+4));
+ i1 = (i0>>16) | (i2&0xFFFF0000);
+ i3 = (i2<<16) | (i0&0x0000FFFF);
+
+ /* Modify counter values */
+ workCtx_.c[0] = masterCtx_.c[0] ^ i0;
+ workCtx_.c[1] = masterCtx_.c[1] ^ i1;
+ workCtx_.c[2] = masterCtx_.c[2] ^ i2;
+ workCtx_.c[3] = masterCtx_.c[3] ^ i3;
+ workCtx_.c[4] = masterCtx_.c[4] ^ i0;
+ workCtx_.c[5] = masterCtx_.c[5] ^ i1;
+ workCtx_.c[6] = masterCtx_.c[6] ^ i2;
+ workCtx_.c[7] = masterCtx_.c[7] ^ i3;
+
+ /* Copy state variables */
+ for (i=0; i<8; i++)
+ workCtx_.x[i] = masterCtx_.x[i];
+ workCtx_.carry = masterCtx_.carry;
+
+ /* Iterate the system four times */
+ for (i=0; i<4; i++)
+ NextState(Work);
+}
+
+
+/* Key setup */
+void Rabbit::SetKey(const byte* key, const byte* iv)
+{
+ /* Temporary variables */
+ word32 k0, k1, k2, k3, i;
+
+ /* Generate four subkeys */
+ k0 = LITTLE32(*(word32*)(key+ 0));
+ k1 = LITTLE32(*(word32*)(key+ 4));
+ k2 = LITTLE32(*(word32*)(key+ 8));
+ k3 = LITTLE32(*(word32*)(key+12));
+
+ /* Generate initial state variables */
+ masterCtx_.x[0] = k0;
+ masterCtx_.x[2] = k1;
+ masterCtx_.x[4] = k2;
+ masterCtx_.x[6] = k3;
+ masterCtx_.x[1] = U32V(k3<<16) | (k2>>16);
+ masterCtx_.x[3] = U32V(k0<<16) | (k3>>16);
+ masterCtx_.x[5] = U32V(k1<<16) | (k0>>16);
+ masterCtx_.x[7] = U32V(k2<<16) | (k1>>16);
+
+ /* Generate initial counter values */
+ masterCtx_.c[0] = rotlFixed(k2, 16);
+ masterCtx_.c[2] = rotlFixed(k3, 16);
+ masterCtx_.c[4] = rotlFixed(k0, 16);
+ masterCtx_.c[6] = rotlFixed(k1, 16);
+ masterCtx_.c[1] = (k0&0xFFFF0000) | (k1&0xFFFF);
+ masterCtx_.c[3] = (k1&0xFFFF0000) | (k2&0xFFFF);
+ masterCtx_.c[5] = (k2&0xFFFF0000) | (k3&0xFFFF);
+ masterCtx_.c[7] = (k3&0xFFFF0000) | (k0&0xFFFF);
+
+ /* Clear carry bit */
+ masterCtx_.carry = 0;
+
+ /* Iterate the system four times */
+ for (i=0; i<4; i++)
+ NextState(Master);
+
+ /* Modify the counters */
+ for (i=0; i<8; i++)
+ masterCtx_.c[i] ^= masterCtx_.x[(i+4)&0x7];
+
+ /* Copy master instance to work instance */
+ for (i=0; i<8; i++) {
+ workCtx_.x[i] = masterCtx_.x[i];
+ workCtx_.c[i] = masterCtx_.c[i];
+ }
+ workCtx_.carry = masterCtx_.carry;
+
+ if (iv) SetIV(iv);
+}
+
+
+/* Encrypt/decrypt a message of any size */
+void Rabbit::Process(byte* output, const byte* input, word32 msglen)
+{
+ /* Temporary variables */
+ word32 i;
+ byte buffer[16];
+
+ /* Encrypt/decrypt all full blocks */
+ while (msglen >= 16) {
+ /* Iterate the system */
+ NextState(Work);
+
+ /* Encrypt/decrypt 16 bytes of data */
+ *(word32*)(output+ 0) = *(word32*)(input+ 0) ^
+ LITTLE32(workCtx_.x[0] ^ (workCtx_.x[5]>>16) ^
+ U32V(workCtx_.x[3]<<16));
+ *(word32*)(output+ 4) = *(word32*)(input+ 4) ^
+ LITTLE32(workCtx_.x[2] ^ (workCtx_.x[7]>>16) ^
+ U32V(workCtx_.x[5]<<16));
+ *(word32*)(output+ 8) = *(word32*)(input+ 8) ^
+ LITTLE32(workCtx_.x[4] ^ (workCtx_.x[1]>>16) ^
+ U32V(workCtx_.x[7]<<16));
+ *(word32*)(output+12) = *(word32*)(input+12) ^
+ LITTLE32(workCtx_.x[6] ^ (workCtx_.x[3]>>16) ^
+ U32V(workCtx_.x[1]<<16));
+
+ /* Increment pointers and decrement length */
+ input += 16;
+ output += 16;
+ msglen -= 16;
+ }
+
+ /* Encrypt/decrypt remaining data */
+ if (msglen) {
+ /* Iterate the system */
+ NextState(Work);
+
+ /* Generate 16 bytes of pseudo-random data */
+ *(word32*)(buffer+ 0) = LITTLE32(workCtx_.x[0] ^
+ (workCtx_.x[5]>>16) ^ U32V(workCtx_.x[3]<<16));
+ *(word32*)(buffer+ 4) = LITTLE32(workCtx_.x[2] ^
+ (workCtx_.x[7]>>16) ^ U32V(workCtx_.x[5]<<16));
+ *(word32*)(buffer+ 8) = LITTLE32(workCtx_.x[4] ^
+ (workCtx_.x[1]>>16) ^ U32V(workCtx_.x[7]<<16));
+ *(word32*)(buffer+12) = LITTLE32(workCtx_.x[6] ^
+ (workCtx_.x[3]>>16) ^ U32V(workCtx_.x[1]<<16));
+
+ /* Encrypt/decrypt the data */
+ for (i=0; i<msglen; i++)
+ output[i] = input[i] ^ buffer[i];
+ }
+}
+
+
+} // namespace
diff --git a/extra/yassl/taocrypt/src/random.cpp b/extra/yassl/taocrypt/src/random.cpp
index 1be0fed612f..aa9be7f1985 100644
--- a/extra/yassl/taocrypt/src/random.cpp
+++ b/extra/yassl/taocrypt/src/random.cpp
@@ -96,13 +96,13 @@ void OS_Seed::GenerateSeed(byte* output, word32 sz)
/* The default OS_Seed implementation */
-OS_Seed::OS_Seed()
+OS_Seed::OS_Seed()
{
fd_ = open("/dev/urandom",O_RDONLY);
if (fd_ == -1) {
fd_ = open("/dev/random",O_RDONLY);
- if (fd_ == -1)
- error_.SetError(OPEN_RAN_E);
+ if (fd_ == -1)
+ error_.SetError(OPEN_RAN_E);
}
}
diff --git a/extra/yassl/taocrypt/src/ripemd.cpp b/extra/yassl/taocrypt/src/ripemd.cpp
index a738c197bf2..e012db43de5 100644
--- a/extra/yassl/taocrypt/src/ripemd.cpp
+++ b/extra/yassl/taocrypt/src/ripemd.cpp
@@ -110,14 +110,14 @@ void RIPEMD160::Update(const byte* data, word32 len)
// all at once for asm
if (buffLen_ == 0) {
- word32 times = len / BLOCK_SIZE;
- if (times) {
- AsmTransform(data, times);
- const word32 add = BLOCK_SIZE * times;
- AddLength(add);
- len -= add;
- data += add;
- }
+ word32 times = len / BLOCK_SIZE;
+ if (times) {
+ AsmTransform(data, times);
+ const word32 add = BLOCK_SIZE * times;
+ AddLength(add);
+ len -= add;
+ data += add;
+ }
}
// cache any data left
diff --git a/extra/yassl/taocrypt/src/rsa.cpp b/extra/yassl/taocrypt/src/rsa.cpp
index 57d19a59c76..576146377a3 100644
--- a/extra/yassl/taocrypt/src/rsa.cpp
+++ b/extra/yassl/taocrypt/src/rsa.cpp
@@ -61,7 +61,6 @@ Integer RSA_PrivateKey::CalculateInverse(RandomNumberGenerator& rng,
Integer y = ModularRoot(re, dq_, dp_, q_, p_, u_);
y = modn.Divide(y, r); // unblind
- assert(modn.Exponentiate(y, e_) == x); // check
return y;
}
@@ -124,7 +123,8 @@ word32 RSA_BlockType2::UnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen,
unsigned i=1;
while (i<pkcsBlockLen && pkcsBlock[i++]) { // null body
}
- assert(i==pkcsBlockLen || pkcsBlock[i-1]==0);
+ if (!(i==pkcsBlockLen || pkcsBlock[i-1]==0))
+ return 0;
unsigned int outputLen = pkcsBlockLen - i;
invalid = (outputLen > maxOutputLen) || invalid;
@@ -179,7 +179,8 @@ word32 RSA_BlockType1::UnPad(const byte* pkcsBlock, word32 pkcsBlockLen,
unsigned i=1;
while (i<pkcsBlockLen && pkcsBlock[i++]) { // null body
}
- assert(i==pkcsBlockLen || pkcsBlock[i-1]==0);
+ if (!(i==pkcsBlockLen || pkcsBlock[i-1]==0))
+ return 0;
unsigned int outputLen = pkcsBlockLen - i;
invalid = (outputLen > maxOutputLen) || invalid;
diff --git a/extra/yassl/taocrypt/src/sha.cpp b/extra/yassl/taocrypt/src/sha.cpp
index ef165a342ad..1ae42d94e4c 100644
--- a/extra/yassl/taocrypt/src/sha.cpp
+++ b/extra/yassl/taocrypt/src/sha.cpp
@@ -344,14 +344,14 @@ void SHA::Update(const byte* data, word32 len)
// all at once for asm
if (buffLen_ == 0) {
- word32 times = len / BLOCK_SIZE;
- if (times) {
- AsmTransform(data, times);
- const word32 add = BLOCK_SIZE * times;
- AddLength(add);
- len -= add;
- data += add;
- }
+ word32 times = len / BLOCK_SIZE;
+ if (times) {
+ AsmTransform(data, times);
+ const word32 add = BLOCK_SIZE * times;
+ AddLength(add);
+ len -= add;
+ data += add;
+ }
}
// cache any data left
diff --git a/extra/yassl/taocrypt/src/template_instnt.cpp b/extra/yassl/taocrypt/src/template_instnt.cpp
index 390da58e191..b472d18236f 100644
--- a/extra/yassl/taocrypt/src/template_instnt.cpp
+++ b/extra/yassl/taocrypt/src/template_instnt.cpp
@@ -61,7 +61,6 @@ template class PBKDF2_HMAC<SHA>;
template class HMAC<MD5>;
template class HMAC<SHA>;
template class HMAC<RIPEMD160>;
-
}
namespace mySTL {
diff --git a/extra/yassl/taocrypt/src/twofish.cpp b/extra/yassl/taocrypt/src/twofish.cpp
index 272a0def169..4ff1304a4cd 100644
--- a/extra/yassl/taocrypt/src/twofish.cpp
+++ b/extra/yassl/taocrypt/src/twofish.cpp
@@ -140,8 +140,6 @@ inline word32 Twofish::h(word32 x, const word32* key, unsigned int kLen)
void Twofish::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
{
- assert(keylen >= 16 && keylen <= 32);
-
unsigned int len = (keylen <= 16 ? 2 : (keylen <= 24 ? 3 : 4));
word32 key[8];
GetUserKey(LittleEndianOrder, key, len*2, userKey, keylen);