Коммит 9f37d1bd создал по автору Моисеенко Андрей Алексеевич's avatar Моисеенко Андрей Алексеевич
Просмотр файлов

~

владелец 4a33ead5
......@@ -290,7 +290,7 @@ bool CAntiRobot::Check(ANTIROBOT_IP Ip, int Num, CMaaString Hash, CMaaString *pe
CMaaString temp(m_Recs[i].m_Hash, 8, CMaaString::eMemString);
pexterr && pexterr->Format("%S\ni=%d, Hash[i]=%S, m_Recs[i].m_Hash=%S, t-m_Recs[i].m_Time=%d, m_Recs[i].m_Tries=%d", pexterr, i, &Hash, &temp, (int)(t-m_Recs[i].m_Time), m_Recs[i].m_Tries);
}
if (m_Recs[i].m_Ip == Ip && (Hash == "" || Hash == CMaaString(m_Recs[i].m_Hash, 8, CMaaString::eMemString)) && (_sdword)(m_Recs[i].m_Time - t) > -m_MaxCaptcheValidStore && (_sdword)(m_Recs[i].m_Time - t) < m_MaxCaptcheValidStore && m_Recs[i].m_Tries < (_dword)m_MaxTriesNumber)
if (m_Recs[i].m_Ip == Ip && (Hash.IsEmpty() || Hash == CMaaString(m_Recs[i].m_Hash, 8, CMaaString::eMemString)) && (_sdword)(m_Recs[i].m_Time - t) > -m_MaxCaptcheValidStore && (_sdword)(m_Recs[i].m_Time - t) < m_MaxCaptcheValidStore && m_Recs[i].m_Tries < (_dword)m_MaxTriesNumber)
{
if (m_Recs[i].m_Tries < MAX_TRY_PATTERN)
{
......
......@@ -1007,7 +1007,7 @@ void CGostBsMaa::GenSalt(void *OutSalt) const
memset(OutSalt, 0, 8);
GetRnd(OutSalt, 8);
const _dword _0[2] = {0, 0};
if (!memcmp(OutSalt, _0, 8))
if (!ConstMemcmp(OutSalt, _0, 8))
{
*(char *)OutSalt = 1;
}
......@@ -1247,7 +1247,7 @@ void GostTest()
g.Encrypt(k, data, sizeof(data), Salt, data2);
g.Decrypt(k, data2, sizeof(data2), Salt, data2);
if (!memcmp(data, data2, sizeof(data)))
if (!ConstMemcmp(data, data2, sizeof(data)))
{
printf("\r%d --> OK", i);
}
......@@ -1259,7 +1259,7 @@ void GostTest()
g.Decrypt(k, data, sizeof(data), Salt, data2);
g.Encrypt(k, data2, sizeof(data2), Salt, data2);
if (!memcmp(data, data2, sizeof(data)))
if (!ConstMemcmp(data, data2, sizeof(data)))
{
printf("\r%d <-- OK", i);
}
......@@ -1411,7 +1411,7 @@ bool DecryptSFK(CMaaString &ttt)
gGostBsMaa.Decrypt(Key, p, txt.Length() - 4 * sizeof(long), Salt);
long Imito2[2] = {0, 0};
gGostBsMaa.Imito(Key, p, txt.Length() - 4 * sizeof(long), Imito2, Salt);
if (!memcmp(Imito, Imito2, sizeof(Imito2)))
if (!ConstMemcmp(Imito, Imito2, sizeof(Imito2)))
{
Imito2[0] = Imito2[1] = 0;
int Len = ntohl(*(long *)p);
......@@ -1838,11 +1838,11 @@ static int test_gost_speed()
printf("x2/x1 = %.6lf, x1/x2 = %.6lf\n", x2 / x1, x1 / x2);
if (memcmp(t2, t1, len))
if (ConstMemcmp(t2, t1, len))
{
printf("t2 != t1\n");
}
if (memcmp(Imito2, Imito1, sizeof(Imito1)))
if (ConstMemcmp(Imito2, Imito1, sizeof(Imito1)))
{
printf("Imito2 != Imito1\n");
}
......
......@@ -213,3 +213,76 @@ LongInt2_MulLoop1:
pop rbx ; +
ret
;
;
global ConstMemcmp_unix
ConstMemcmp_unix:
; (RDI, RSI, RDX)
mov r8, rdx
mov rcx, rdi
mov rdx, rsi
global ConstMemcmp_win
ConstMemcmp_win:
; (RCX, RDX, R8)
; Необходимо сохранять RBX, RSI, RDI, RBP, R12, R13, R14, R15, XMM6..XMM15.
; Win64 can be used: RCX, RDX, R8, R9, RAX, R10, R11
;extern "C"
;{
; _dword ConstMemcmp_win(const void * p1, const void * p2, size_t len) noexcept;
;}
; rcx - p1
; rdx - p2
; r8 - len
mov r11, rsi ; save rsi
mov r10, rdi ; save rdi
mov rsi, rcx
mov rdi, rdx
mov r9, r8
xor ecx, ecx
shr r9, 4 ; mod ZF
jz ConstMemcmp_SkipLoop1
ConstMemcmp_Loop1:
mov rax, [rsi]
xor rax, [rdi]
or rcx, rax
mov rax, [rsi + 8]
xor rax, [rdi + 8]
or rcx, rax
lea rsi, [rsi + 10h]
lea rdi, [rdi + 10h]
dec r9
jnz ConstMemcmp_Loop1
mov eax, ecx
shr rcx, 32
or ecx, eax
ConstMemcmp_SkipLoop1:
mov r9d, r8d
shr r9d, 2
and r9d, 3
jz ConstMemcmp_SkipLoop2
ConstMemcmp_Loop2:
mov eax, [rsi]
xor eax, [rdi]
or ecx, eax
lea rsi, [rsi + 4]
lea rdi, [rdi + 4]
dec r9d
jnz ConstMemcmp_Loop2
ConstMemcmp_SkipLoop2:
and r8d, 3
jz ConstMemcmp_Exit1
ConstMemcmp_Loop3:
mov al, [rsi]
xor al, [rdi]
or cl, al
;lea rsi, [rsi + 1]
;lea rdi, [rdi + 1]
inc rsi
inc rdi
dec r8d
jnz ConstMemcmp_Loop3
ConstMemcmp_Exit1:
mov eax, ecx
mov rdi, r10 ; restore rdi
mov rsi, r11 ; restore rsi
ret
;
......@@ -133,7 +133,7 @@ bool LongInt2::operator==(const LongInt2 &That) const noexcept
{
return false;
}
return !memcmp(m_Number, That.m_Number, Size1);
return !memcmp(m_Number, That.m_Number, Size1); // ConstMemcmp
}
//---------------------------------------------------------------------------
bool LongInt2::operator!=(const LongInt2 &That) const noexcept
......
......@@ -75,9 +75,11 @@ extern "C"
_dword LongInt2_add_win(_qword sz8, _qword up8, void* dst, const void* src) noexcept;
_dword LongInt2_sub_win(_qword sz8, _qword up8, void* dst, const void* src) noexcept;
void LongInt2_mul_win(_qword Mul1SizeQw, _qword Mul2SizeQw, void* Product, const void* Mul1, const void* Mul2) noexcept;
_dword ConstMemcmp_win(const void* p1, const void* p2, _uqword len) noexcept;
#define LongInt2_add LongInt2_add_win
#define LongInt2_sub LongInt2_sub_win
#define LongInt2_mul LongInt2_mul_win
#define ConstMemcmp ConstMemcmp_win
}
#endif
#ifdef __linux__
......@@ -88,9 +90,11 @@ extern "C"
_dword LongInt2_add_unix(_qword sz8, _qword up8, void* dst, const void* src) noexcept;
_dword LongInt2_sub_unix(_qword sz8, _qword up8, void* dst, const void* src) noexcept;
void LongInt2_mul_unix(_qword Mul1SizeQw, _qword Mul2SizeQw, void* Product, const void* Mul1, const void* Mul2) noexcept;
_dword ConstMemcmp_unix(const void* p1, const void* p2, _uqword len) noexcept;
#define LongInt2_add LongInt2_add_unix
#define LongInt2_sub LongInt2_sub_unix
#define LongInt2_mul LongInt2_mul_unix
#define ConstMemcmp ConstMemcmp_unix
}
#endif
#endif
......
......@@ -146,7 +146,7 @@ bool CCryptRandom::Get(void * ptr, int len) // noexcept
static char zero[32];
if (nn == (int)sizeof(m_gost_key_and_salt))
{
if (memcmp(m_gost_key_and_salt, zero, 32) && memcmp(m_gost_key_and_salt + 32, zero, 32))
if (ConstMemcmp(m_gost_key_and_salt, zero, 32) && ConstMemcmp(m_gost_key_and_salt + 32, zero, 32))
{
//printf("point 3\n");
m_b1st = false;
......@@ -184,7 +184,7 @@ bool CCryptRandom::Get(void * ptr, int len) // noexcept
{
m_gost_key_and_salt[i] = (char)rand();
}
if (memcmp(m_gost_key_and_salt, zero, 32) && memcmp(m_gost_key_and_salt + 32, zero, 32))
if (ConstMemcmp(m_gost_key_and_salt, zero, 32) && ConstMemcmp(m_gost_key_and_salt + 32, zero, 32))
{
m_b1st = false;
}
......@@ -316,14 +316,14 @@ int CCryptRandom::FlushSeed(const void * ptr, int size)
{
if (size >= 64)
{
/*
/*
_qword uid = getuid();
CMaaFile f(CMaaString::sFormat2("%D", TMP_SEED_FILE1_FMT, uid), CMaaFile::eRWC_SrSw, "mode=640", false);
if (!f.IsOpen())
{
f = CMaaFile(CMaaString::sFormat2("%D", TMP_SEED_FILE2_FMT, uid), CMaaFile::eRWC_SrSw, "mode=640", false);
}
*/
*/
CMaaFile f(m_SeedFn, CMaaFile::eRWC_SrSw, "mode=640", false);
if (f.IsOpen())
{
......@@ -399,6 +399,50 @@ public:
}
};
#ifndef CRYPTLIB_USE_ASM64
#if 0
// 0 - p1[] == p2[], != 0 - p1[] != p2[]
_dword ConstMemcmp(const void* p1, const void* p2, size_t len) noexcept
{
const _uqword* ptr1 = (const _uqword*)p1;
const _uqword* ptr2 = (const _uqword*)p2;
_uqword a64 = 0;
size_t i;
for (i = len >> 4; i; i--)
{
a64 |= ptr1[0] ^ ptr2[0];
a64 |= ptr1[1] ^ ptr2[1];
ptr1 += 2;
ptr2 += 2;
}
_dword a32 = (_dword)((a64 >> 32) | a64);
const unsigned char* ptr1_ = (const unsigned char*)ptr1;
const unsigned char* ptr2_ = (const unsigned char*)ptr2;
for (i = len & 0xf; i; i--)
{
a32 |= *ptr1_++ ^ *ptr2_++;
}
//_dword a16 = (_word)((a32 >> 16) | a32);
//unsigned char a8 = (unsigned char)((a16 >> 8) | a16);
//return a8;
return a32;
}
#else
// 0 - p1[] == p2[], != 0 - p1[] != p2[]
_dword ConstMemcmp(const void* p1, const void* p2, size_t len) noexcept
{
const unsigned char* ptr1 = (const unsigned char*)p1;
const unsigned char* ptr2 = (const unsigned char*)p2;
unsigned char a = 0;
for (size_t i = len; i; i--)
{
a |= *ptr1++ ^ *ptr2++;
}
return a;
}
#endif
#endif
CMaaCLGlobDel gCMaaCLGlobDel;
void GetRnd(void *ptr, int size)
......@@ -572,7 +616,7 @@ void ___mainCrypt ()
//b2.print("b2 = ");
//b3.Mul(b1, b2);
b1 %= b2;
if (!memcmp(a1(), b1(), 64))
if (!ConstMemcmp(a1(), b1(), 64))
{
printf("OK\n");
}
......@@ -947,7 +991,7 @@ void CMyExponent2::Exponent ( void * A, void * X, void * Y )
//printf("Ax.CalcRestEx ( Ax, q, m_MulTable );\n");
Ax.CalcRestEx ( Ax, q, m_MulTable );
//Ax %= q;
/*if ( memcmp ( li (), Ax (), m_Size ) )
/*if ( ConstMemcmp ( li (), Ax (), m_Size ) )
{
printf ( "Mismatch\n" );
}*/
......@@ -971,7 +1015,7 @@ void CMyExponent2::Exponent ( void * A, void * X, void * Y )
//printf("Ai.CalcRestEx ( Ai, q, m_MulTable );\n");
Ai.CalcRestEx ( Ai, q, m_MulTable );
//Ai %= q;
/*if ( memcmp ( li (), Ai (), m_Size ) )
/*if ( ConstMemcmp ( li (), Ai (), m_Size ) )
{
printf ( "Mismatch\n" );
}*/
......
......@@ -83,6 +83,11 @@
void pr(const char * txt, const void * p, int l, int c = 1);
void pr(const char * txt, LongInt2 &x);
#ifndef CRYPTLIB_USE_ASM64
// 0 - p1[] == p2[], != 0 - p1[] != p2[]
_dword ConstMemcmp(const void* p1, const void* p2, size_t len) noexcept;
#endif
void GetRnd(void *ptr, int s);
class CCryptRandom
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать