int
__fastcall TEACrypt::Tea_CBC_Decrypt(TEACrypt
*
a1,
int
a2, const unsigned __int8
*
a3, _BYTE
*
a4,
int
*
a5)
{
_BYTE
*
v6;
/
/
r3
int
v7;
/
/
r2
int
v8;
/
/
r3
int
v13;
/
/
[sp
+
10h
] [bp
-
3Ch
]
TEACrypt
*
v15;
/
/
[sp
+
14h
] [bp
-
38h
]
int
v16;
/
/
[sp
+
1Ch
] [bp
-
30h
]
TEACrypt
*
v17;
/
/
[sp
+
20h
] [bp
-
2Ch
]
int
v18;
/
/
[sp
+
24h
] [bp
-
28h
]
int
v19;
/
/
[sp
+
28h
] [bp
-
24h
]
int
j;
/
/
[sp
+
28h
] [bp
-
24h
]
int
v21;
/
/
[sp
+
28h
] [bp
-
24h
]
int
i;
/
/
[sp
+
2Ch
] [bp
-
20h
]
int
k;
/
/
[sp
+
2Ch
] [bp
-
20h
]
int
v24;
/
/
[sp
+
30h
] [bp
-
1Ch
]
unsigned __int8 v25[
8
];
/
/
[sp
+
34h
] [bp
-
18h
] BYREF
int
v26;
/
/
[sp
+
3Ch
] [bp
-
10h
]
v26
=
*
(_DWORD
*
)off_1F1E298;
if
( (a2 &
7
) !
=
0
|| a2 <
=
15
)
return
0
;
TEACrypt::TeaDecryptECB(a1, a3, v25, v25);
v24
=
v25[
0
] &
7
;
if
(
*
a5 < a2
-
1
-
v24
-
9
)
return
0
;
*
a5
=
a2
-
1
-
(v25[
0
] &
7
)
-
9
;
if
(
*
a5 <
0
)
return
0
;
v17
=
a1;
v13
=
a2
-
8
;
v15
=
(TEACrypt
*
)((char
*
)a1
+
8
);
v18
=
v24
+
1
;
v19
=
1
;
while
( v19 <
=
2
)
{
if
( v18 <
=
7
)
{
+
+
v18;
+
+
v19;
}
if
( v18
=
=
8
)
{
TEACrypt::TeaDecryptECB(v15, a3, v25, v25);
for
( i
=
0
; i <
=
7
;
+
+
i )
v25[i] ^
=
*
((_BYTE
*
)v17
+
i);
v17
=
v15;
v13
-
=
8
;
v15
=
(TEACrypt
*
)((char
*
)v15
+
8
);
v18
=
0
;
}
}
v16
=
*
a5;
while
( v16 )
{
if
( v18 >
7
)
{
if
( v18
=
=
8
)
{
TEACrypt::TeaDecryptECB(v15, a3, v25, v25);
for
( j
=
0
; j <
=
7
;
+
+
j )
v25[j] ^
=
*
((_BYTE
*
)v17
+
j);
v17
=
v15;
v13
-
=
8
;
v15
=
(TEACrypt
*
)((char
*
)v15
+
8
);
v18
=
0
;
}
}
else
{
v6
=
a4
+
+
;
v7
=
v18
+
+
;
*
v6
=
v25[v7];
-
-
v16;
}
}
v21
=
1
;
while
( v21 <
=
7
)
{
if
( v18 >
7
)
{
if
( v18
=
=
8
)
{
TEACrypt::TeaDecryptECB(v15, a3, v25, v25);
for
( k
=
0
; k <
=
7
;
+
+
k )
v25[k] ^
=
*
((_BYTE
*
)v17
+
k);
v17
=
v15;
v13
-
=
8
;
v15
=
(TEACrypt
*
)((char
*
)v15
+
8
);
v18
=
0
;
}
}
else
{
v8
=
v18
+
+
;
if
( v25[v8] )
return
0
;
+
+
v21;
}
}
return
1
;
}