1
mirror of https://github.com/hashcat/hashcat synced 2024-11-13 17:28:58 +01:00

More manually unrolled cipher code

This commit is contained in:
jsteube 2019-03-16 21:11:02 +01:00
parent a063e9ef62
commit 7cb510f1ce
2 changed files with 306 additions and 168 deletions

View File

@ -695,28 +695,90 @@ __constant u32a rcon[10] =
DECLSPEC void aes128_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4);
DECLSPEC void aes128_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
{
ks[0] = ukey[0];
ks[1] = ukey[1];
ks[2] = ukey[2];
ks[3] = ukey[3];
for (int i = 0, j = 0; i < 10; i += 1, j += 4)
{
u32 temp = ks[j + 3];
temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000)
^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff);
ks[j + 4] = ks[j + 0]
^ temp
^ rcon[i];
ks[j + 5] = ks[j + 1] ^ ks[j + 4];
ks[j + 6] = ks[j + 2] ^ ks[j + 5];
ks[j + 7] = ks[j + 3] ^ ks[j + 6];
}
ks[ 0] = ukey[0];
ks[ 1] = ukey[1];
ks[ 2] = ukey[2];
ks[ 3] = ukey[3];
ks[ 4] = ks[ 0] ^ 0x01000000
^ (s_te2[(ks[ 3] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[ 3] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[ 3] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[ 3] >> 24) & 0xff] & 0x000000ff);
ks[ 5] = ks[ 1] ^ ks[ 4];
ks[ 6] = ks[ 2] ^ ks[ 5];
ks[ 7] = ks[ 3] ^ ks[ 6];
ks[ 8] = ks[ 4] ^ 0x02000000
^ (s_te2[(ks[ 7] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[ 7] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[ 7] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[ 7] >> 24) & 0xff] & 0x000000ff);
ks[ 9] = ks[ 5] ^ ks[ 8];
ks[10] = ks[ 6] ^ ks[ 9];
ks[11] = ks[ 7] ^ ks[10];
ks[12] = ks[ 8] ^ 0x04000000
^ (s_te2[(ks[11] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[11] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[11] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[11] >> 24) & 0xff] & 0x000000ff);
ks[13] = ks[ 9] ^ ks[12];
ks[14] = ks[10] ^ ks[13];
ks[15] = ks[11] ^ ks[14];
ks[16] = ks[12] ^ 0x08000000
^ (s_te2[(ks[15] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[15] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[15] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[15] >> 24) & 0xff] & 0x000000ff);
ks[17] = ks[13] ^ ks[16];
ks[18] = ks[14] ^ ks[17];
ks[19] = ks[15] ^ ks[18];
ks[20] = ks[16] ^ 0x10000000
^ (s_te2[(ks[19] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[19] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[19] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[19] >> 24) & 0xff] & 0x000000ff);
ks[21] = ks[17] ^ ks[20];
ks[22] = ks[18] ^ ks[21];
ks[23] = ks[19] ^ ks[22];
ks[24] = ks[20] ^ 0x20000000
^ (s_te2[(ks[23] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[23] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[23] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[23] >> 24) & 0xff] & 0x000000ff);
ks[25] = ks[21] ^ ks[24];
ks[26] = ks[22] ^ ks[25];
ks[27] = ks[23] ^ ks[26];
ks[28] = ks[24] ^ 0x40000000
^ (s_te2[(ks[27] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[27] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[27] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[27] >> 24) & 0xff] & 0x000000ff);
ks[29] = ks[25] ^ ks[28];
ks[30] = ks[26] ^ ks[29];
ks[31] = ks[27] ^ ks[30];
ks[32] = ks[28] ^ 0x80000000
^ (s_te2[(ks[31] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[31] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[31] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[31] >> 24) & 0xff] & 0x000000ff);
ks[33] = ks[29] ^ ks[32];
ks[34] = ks[30] ^ ks[33];
ks[35] = ks[31] ^ ks[34];
ks[36] = ks[32] ^ 0x1b000000
^ (s_te2[(ks[35] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[35] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[35] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[35] >> 24) & 0xff] & 0x000000ff);
ks[37] = ks[33] ^ ks[36];
ks[38] = ks[34] ^ ks[37];
ks[39] = ks[35] ^ ks[38];
ks[40] = ks[36] ^ 0x36000000
^ (s_te2[(ks[39] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[39] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[39] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[39] >> 24) & 0xff] & 0x000000ff);
ks[41] = ks[37] ^ ks[40];
ks[42] = ks[38] ^ ks[41];
ks[43] = ks[39] ^ ks[42];
}
DECLSPEC void aes128_InvertKey (u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4);
@ -745,49 +807,42 @@ DECLSPEC void aes128_InvertKey (u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te
temp = ks[18]; ks[18] = ks[26]; ks[26] = temp;
temp = ks[19]; ks[19] = ks[27]; ks[27] = temp;
for (int i = 1, j = 4; i < 10; i += 1, j += 4)
{
const u32 x0s0 = (ks[j + 0] >> 0) & 0xff;
const u32 x0s1 = (ks[j + 0] >> 8) & 0xff;
const u32 x0s2 = (ks[j + 0] >> 16) & 0xff;
const u32 x0s3 = (ks[j + 0] >> 24) & 0xff;
const u32 x1s0 = (ks[j + 1] >> 0) & 0xff;
const u32 x1s1 = (ks[j + 1] >> 8) & 0xff;
const u32 x1s2 = (ks[j + 1] >> 16) & 0xff;
const u32 x1s3 = (ks[j + 1] >> 24) & 0xff;
const u32 x2s0 = (ks[j + 2] >> 0) & 0xff;
const u32 x2s1 = (ks[j + 2] >> 8) & 0xff;
const u32 x2s2 = (ks[j + 2] >> 16) & 0xff;
const u32 x2s3 = (ks[j + 2] >> 24) & 0xff;
const u32 x3s0 = (ks[j + 3] >> 0) & 0xff;
const u32 x3s1 = (ks[j + 3] >> 8) & 0xff;
const u32 x3s2 = (ks[j + 3] >> 16) & 0xff;
const u32 x3s3 = (ks[j + 3] >> 24) & 0xff;
ks[j + 0] =
s_td0[s_te1[x0s3] & 0xff] ^
s_td1[s_te1[x0s2] & 0xff] ^
s_td2[s_te1[x0s1] & 0xff] ^
s_td3[s_te1[x0s0] & 0xff];
ks[j + 1] =
s_td0[s_te1[x1s3] & 0xff] ^
s_td1[s_te1[x1s2] & 0xff] ^
s_td2[s_te1[x1s1] & 0xff] ^
s_td3[s_te1[x1s0] & 0xff];
ks[j + 2] =
s_td0[s_te1[x2s3] & 0xff] ^
s_td1[s_te1[x2s2] & 0xff] ^
s_td2[s_te1[x2s1] & 0xff] ^
s_td3[s_te1[x2s0] & 0xff];
ks[j + 3] =
s_td0[s_te1[x3s3] & 0xff] ^
s_td1[s_te1[x3s2] & 0xff] ^
s_td2[s_te1[x3s1] & 0xff] ^
s_td3[s_te1[x3s0] & 0xff];
}
ks[ 4] = td0[te1[(ks[ 4] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 4] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 4] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 4] >> 0) & 0xff] & 0xff];
ks[ 5] = td0[te1[(ks[ 5] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 5] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 5] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 5] >> 0) & 0xff] & 0xff];
ks[ 6] = td0[te1[(ks[ 6] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 6] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 6] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 6] >> 0) & 0xff] & 0xff];
ks[ 7] = td0[te1[(ks[ 7] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 7] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 7] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 7] >> 0) & 0xff] & 0xff];
ks[ 8] = td0[te1[(ks[ 8] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 8] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 8] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 8] >> 0) & 0xff] & 0xff];
ks[ 9] = td0[te1[(ks[ 9] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 9] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 9] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 9] >> 0) & 0xff] & 0xff];
ks[10] = td0[te1[(ks[10] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[10] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[10] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[10] >> 0) & 0xff] & 0xff];
ks[11] = td0[te1[(ks[11] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[11] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[11] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[11] >> 0) & 0xff] & 0xff];
ks[12] = td0[te1[(ks[12] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[12] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[12] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[12] >> 0) & 0xff] & 0xff];
ks[13] = td0[te1[(ks[13] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[13] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[13] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[13] >> 0) & 0xff] & 0xff];
ks[14] = td0[te1[(ks[14] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[14] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[14] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[14] >> 0) & 0xff] & 0xff];
ks[15] = td0[te1[(ks[15] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[15] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[15] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[15] >> 0) & 0xff] & 0xff];
ks[16] = td0[te1[(ks[16] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[16] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[16] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[16] >> 0) & 0xff] & 0xff];
ks[17] = td0[te1[(ks[17] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[17] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[17] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[17] >> 0) & 0xff] & 0xff];
ks[18] = td0[te1[(ks[18] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[18] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[18] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[18] >> 0) & 0xff] & 0xff];
ks[19] = td0[te1[(ks[19] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[19] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[19] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[19] >> 0) & 0xff] & 0xff];
ks[20] = td0[te1[(ks[20] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[20] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[20] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[20] >> 0) & 0xff] & 0xff];
ks[21] = td0[te1[(ks[21] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[21] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[21] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[21] >> 0) & 0xff] & 0xff];
ks[22] = td0[te1[(ks[22] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[22] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[22] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[22] >> 0) & 0xff] & 0xff];
ks[23] = td0[te1[(ks[23] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[23] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[23] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[23] >> 0) & 0xff] & 0xff];
ks[24] = td0[te1[(ks[24] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[24] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[24] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[24] >> 0) & 0xff] & 0xff];
ks[25] = td0[te1[(ks[25] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[25] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[25] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[25] >> 0) & 0xff] & 0xff];
ks[26] = td0[te1[(ks[26] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[26] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[26] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[26] >> 0) & 0xff] & 0xff];
ks[27] = td0[te1[(ks[27] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[27] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[27] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[27] >> 0) & 0xff] & 0xff];
ks[28] = td0[te1[(ks[28] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[28] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[28] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[28] >> 0) & 0xff] & 0xff];
ks[29] = td0[te1[(ks[29] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[29] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[29] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[29] >> 0) & 0xff] & 0xff];
ks[30] = td0[te1[(ks[30] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[30] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[30] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[30] >> 0) & 0xff] & 0xff];
ks[31] = td0[te1[(ks[31] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[31] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[31] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[31] >> 0) & 0xff] & 0xff];
ks[32] = td0[te1[(ks[32] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[32] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[32] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[32] >> 0) & 0xff] & 0xff];
ks[33] = td0[te1[(ks[33] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[33] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[33] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[33] >> 0) & 0xff] & 0xff];
ks[34] = td0[te1[(ks[34] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[34] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[34] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[34] >> 0) & 0xff] & 0xff];
ks[35] = td0[te1[(ks[35] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[35] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[35] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[35] >> 0) & 0xff] & 0xff];
ks[36] = td0[te1[(ks[36] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[36] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[36] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[36] >> 0) & 0xff] & 0xff];
ks[37] = td0[te1[(ks[37] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[37] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[37] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[37] >> 0) & 0xff] & 0xff];
ks[38] = td0[te1[(ks[38] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[38] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[38] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[38] >> 0) & 0xff] & 0xff];
ks[39] = td0[te1[(ks[39] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[39] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[39] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[39] >> 0) & 0xff] & 0xff];
}
DECLSPEC void aes128_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4);
@ -997,47 +1052,118 @@ DECLSPEC void aes128_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u
DECLSPEC void aes256_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4);
DECLSPEC void aes256_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
{
ks[0] = ukey[0];
ks[1] = ukey[1];
ks[2] = ukey[2];
ks[3] = ukey[3];
ks[4] = ukey[4];
ks[5] = ukey[5];
ks[6] = ukey[6];
ks[7] = ukey[7];
int i;
int j;
for (int i = 0, j = 0; i < 7; i += 1, j += 8)
{
const u32 temp1 = ks[j + 7];
ks[j + 8] = ks[j + 0]
^ (s_te2[(temp1 >> 16) & 0xff] & 0xff000000)
^ (s_te3[(temp1 >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(temp1 >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(temp1 >> 24) & 0xff] & 0x000000ff)
^ rcon[i];
ks[j + 9] = ks[j + 1] ^ ks[j + 8];
ks[j + 10] = ks[j + 2] ^ ks[j + 9];
ks[j + 11] = ks[j + 3] ^ ks[j + 10];
if (i == 6) break;
const u32 temp2 = ks[j + 11];
ks[j + 12] = ks[j + 4]
^ (s_te2[(temp2 >> 24) & 0xff] & 0xff000000)
^ (s_te3[(temp2 >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(temp2 >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(temp2 >> 0) & 0xff] & 0x000000ff);
ks[j + 13] = ks[j + 5] ^ ks[j + 12];
ks[j + 14] = ks[j + 6] ^ ks[j + 13];
ks[j + 15] = ks[j + 7] ^ ks[j + 14];
}
ks[ 0] = ukey[0];
ks[ 1] = ukey[1];
ks[ 2] = ukey[2];
ks[ 3] = ukey[3];
ks[ 4] = ukey[4];
ks[ 5] = ukey[5];
ks[ 6] = ukey[6];
ks[ 7] = ukey[7];
ks[ 8] = ks[ 0] ^ 0x01000000
^ (s_te2[(ks[ 7] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[ 7] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[ 7] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[ 7] >> 24) & 0xff] & 0x000000ff);
ks[ 9] = ks[ 1] ^ ks[ 8];
ks[10] = ks[ 2] ^ ks[ 9];
ks[11] = ks[ 3] ^ ks[10];
ks[12] = ks[ 4] ^ 0
^ (s_te2[(ks[11] >> 24) & 0xff] & 0xff000000)
^ (s_te3[(ks[11] >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[11] >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[11] >> 0) & 0xff] & 0x000000ff);
ks[13] = ks[ 5] ^ ks[12];
ks[14] = ks[ 6] ^ ks[13];
ks[15] = ks[ 7] ^ ks[14];
ks[16] = ks[ 8] ^ 0x02000000
^ (s_te2[(ks[15] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[15] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[15] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[15] >> 24) & 0xff] & 0x000000ff);
ks[17] = ks[ 9] ^ ks[16];
ks[18] = ks[10] ^ ks[17];
ks[19] = ks[11] ^ ks[18];
ks[20] = ks[12] ^ 0
^ (s_te2[(ks[19] >> 24) & 0xff] & 0xff000000)
^ (s_te3[(ks[19] >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[19] >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[19] >> 0) & 0xff] & 0x000000ff);
ks[21] = ks[13] ^ ks[20];
ks[22] = ks[14] ^ ks[21];
ks[23] = ks[15] ^ ks[22];
ks[24] = ks[16] ^ 0x04000000
^ (s_te2[(ks[23] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[23] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[23] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[23] >> 24) & 0xff] & 0x000000ff);
ks[25] = ks[17] ^ ks[24];
ks[26] = ks[18] ^ ks[25];
ks[27] = ks[19] ^ ks[26];
ks[28] = ks[20] ^ 0
^ (s_te2[(ks[27] >> 24) & 0xff] & 0xff000000)
^ (s_te3[(ks[27] >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[27] >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[27] >> 0) & 0xff] & 0x000000ff);
ks[29] = ks[21] ^ ks[28];
ks[30] = ks[22] ^ ks[29];
ks[31] = ks[23] ^ ks[30];
ks[32] = ks[24] ^ 0x08000000
^ (s_te2[(ks[31] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[31] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[31] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[31] >> 24) & 0xff] & 0x000000ff);
ks[33] = ks[25] ^ ks[32];
ks[34] = ks[26] ^ ks[33];
ks[35] = ks[27] ^ ks[34];
ks[36] = ks[28] ^ 0
^ (s_te2[(ks[35] >> 24) & 0xff] & 0xff000000)
^ (s_te3[(ks[35] >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[35] >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[35] >> 0) & 0xff] & 0x000000ff);
ks[37] = ks[29] ^ ks[36];
ks[38] = ks[30] ^ ks[37];
ks[39] = ks[31] ^ ks[38];
ks[40] = ks[32] ^ 0x10000000
^ (s_te2[(ks[39] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[39] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[39] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[39] >> 24) & 0xff] & 0x000000ff);
ks[41] = ks[33] ^ ks[40];
ks[42] = ks[34] ^ ks[41];
ks[43] = ks[35] ^ ks[42];
ks[44] = ks[36] ^ 0
^ (s_te2[(ks[43] >> 24) & 0xff] & 0xff000000)
^ (s_te3[(ks[43] >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[43] >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[43] >> 0) & 0xff] & 0x000000ff);
ks[45] = ks[37] ^ ks[44];
ks[46] = ks[38] ^ ks[45];
ks[47] = ks[39] ^ ks[46];
ks[48] = ks[40] ^ 0x20000000
^ (s_te2[(ks[47] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[47] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[47] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[47] >> 24) & 0xff] & 0x000000ff);
ks[49] = ks[41] ^ ks[48];
ks[50] = ks[42] ^ ks[49];
ks[51] = ks[43] ^ ks[50];
ks[52] = ks[44] ^ 0
^ (s_te2[(ks[51] >> 24) & 0xff] & 0xff000000)
^ (s_te3[(ks[51] >> 16) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[51] >> 8) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[51] >> 0) & 0xff] & 0x000000ff);
ks[53] = ks[45] ^ ks[52];
ks[54] = ks[46] ^ ks[53];
ks[55] = ks[47] ^ ks[54];
ks[56] = ks[48] ^ 0x40000000
^ (s_te2[(ks[55] >> 16) & 0xff] & 0xff000000)
^ (s_te3[(ks[55] >> 8) & 0xff] & 0x00ff0000)
^ (s_te0[(ks[55] >> 0) & 0xff] & 0x0000ff00)
^ (s_te1[(ks[55] >> 24) & 0xff] & 0x000000ff);
ks[57] = ks[49] ^ ks[56];
ks[58] = ks[50] ^ ks[57];
ks[59] = ks[51] ^ ks[58];
}
DECLSPEC void aes256_InvertKey (u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4);
@ -1074,49 +1200,58 @@ DECLSPEC void aes256_InvertKey (u32 *ks, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te
temp = ks[26]; ks[26] = ks[34]; ks[34] = temp;
temp = ks[27]; ks[27] = ks[35]; ks[35] = temp;
for (int i = 1, j = 4; i < 14; i += 1, j += 4)
{
const u32 x0s0 = (ks[j + 0] >> 0) & 0xff;
const u32 x0s1 = (ks[j + 0] >> 8) & 0xff;
const u32 x0s2 = (ks[j + 0] >> 16) & 0xff;
const u32 x0s3 = (ks[j + 0] >> 24) & 0xff;
const u32 x1s0 = (ks[j + 1] >> 0) & 0xff;
const u32 x1s1 = (ks[j + 1] >> 8) & 0xff;
const u32 x1s2 = (ks[j + 1] >> 16) & 0xff;
const u32 x1s3 = (ks[j + 1] >> 24) & 0xff;
const u32 x2s0 = (ks[j + 2] >> 0) & 0xff;
const u32 x2s1 = (ks[j + 2] >> 8) & 0xff;
const u32 x2s2 = (ks[j + 2] >> 16) & 0xff;
const u32 x2s3 = (ks[j + 2] >> 24) & 0xff;
const u32 x3s0 = (ks[j + 3] >> 0) & 0xff;
const u32 x3s1 = (ks[j + 3] >> 8) & 0xff;
const u32 x3s2 = (ks[j + 3] >> 16) & 0xff;
const u32 x3s3 = (ks[j + 3] >> 24) & 0xff;
ks[j + 0] =
s_td0[s_te1[x0s3] & 0xff] ^
s_td1[s_te1[x0s2] & 0xff] ^
s_td2[s_te1[x0s1] & 0xff] ^
s_td3[s_te1[x0s0] & 0xff];
ks[j + 1] =
s_td0[s_te1[x1s3] & 0xff] ^
s_td1[s_te1[x1s2] & 0xff] ^
s_td2[s_te1[x1s1] & 0xff] ^
s_td3[s_te1[x1s0] & 0xff];
ks[j + 2] =
s_td0[s_te1[x2s3] & 0xff] ^
s_td1[s_te1[x2s2] & 0xff] ^
s_td2[s_te1[x2s1] & 0xff] ^
s_td3[s_te1[x2s0] & 0xff];
ks[j + 3] =
s_td0[s_te1[x3s3] & 0xff] ^
s_td1[s_te1[x3s2] & 0xff] ^
s_td2[s_te1[x3s1] & 0xff] ^
s_td3[s_te1[x3s0] & 0xff];
}
ks[ 4] = td0[te1[(ks[ 4] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 4] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 4] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 4] >> 0) & 0xff] & 0xff];
ks[ 5] = td0[te1[(ks[ 5] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 5] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 5] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 5] >> 0) & 0xff] & 0xff];
ks[ 6] = td0[te1[(ks[ 6] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 6] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 6] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 6] >> 0) & 0xff] & 0xff];
ks[ 7] = td0[te1[(ks[ 7] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 7] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 7] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 7] >> 0) & 0xff] & 0xff];
ks[ 8] = td0[te1[(ks[ 8] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 8] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 8] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 8] >> 0) & 0xff] & 0xff];
ks[ 9] = td0[te1[(ks[ 9] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[ 9] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[ 9] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[ 9] >> 0) & 0xff] & 0xff];
ks[10] = td0[te1[(ks[10] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[10] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[10] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[10] >> 0) & 0xff] & 0xff];
ks[11] = td0[te1[(ks[11] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[11] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[11] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[11] >> 0) & 0xff] & 0xff];
ks[12] = td0[te1[(ks[12] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[12] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[12] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[12] >> 0) & 0xff] & 0xff];
ks[13] = td0[te1[(ks[13] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[13] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[13] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[13] >> 0) & 0xff] & 0xff];
ks[14] = td0[te1[(ks[14] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[14] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[14] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[14] >> 0) & 0xff] & 0xff];
ks[15] = td0[te1[(ks[15] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[15] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[15] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[15] >> 0) & 0xff] & 0xff];
ks[16] = td0[te1[(ks[16] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[16] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[16] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[16] >> 0) & 0xff] & 0xff];
ks[17] = td0[te1[(ks[17] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[17] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[17] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[17] >> 0) & 0xff] & 0xff];
ks[18] = td0[te1[(ks[18] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[18] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[18] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[18] >> 0) & 0xff] & 0xff];
ks[19] = td0[te1[(ks[19] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[19] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[19] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[19] >> 0) & 0xff] & 0xff];
ks[20] = td0[te1[(ks[20] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[20] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[20] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[20] >> 0) & 0xff] & 0xff];
ks[21] = td0[te1[(ks[21] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[21] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[21] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[21] >> 0) & 0xff] & 0xff];
ks[22] = td0[te1[(ks[22] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[22] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[22] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[22] >> 0) & 0xff] & 0xff];
ks[23] = td0[te1[(ks[23] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[23] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[23] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[23] >> 0) & 0xff] & 0xff];
ks[24] = td0[te1[(ks[24] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[24] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[24] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[24] >> 0) & 0xff] & 0xff];
ks[25] = td0[te1[(ks[25] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[25] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[25] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[25] >> 0) & 0xff] & 0xff];
ks[26] = td0[te1[(ks[26] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[26] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[26] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[26] >> 0) & 0xff] & 0xff];
ks[27] = td0[te1[(ks[27] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[27] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[27] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[27] >> 0) & 0xff] & 0xff];
ks[28] = td0[te1[(ks[28] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[28] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[28] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[28] >> 0) & 0xff] & 0xff];
ks[29] = td0[te1[(ks[29] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[29] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[29] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[29] >> 0) & 0xff] & 0xff];
ks[30] = td0[te1[(ks[30] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[30] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[30] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[30] >> 0) & 0xff] & 0xff];
ks[31] = td0[te1[(ks[31] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[31] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[31] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[31] >> 0) & 0xff] & 0xff];
ks[32] = td0[te1[(ks[32] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[32] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[32] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[32] >> 0) & 0xff] & 0xff];
ks[33] = td0[te1[(ks[33] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[33] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[33] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[33] >> 0) & 0xff] & 0xff];
ks[34] = td0[te1[(ks[34] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[34] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[34] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[34] >> 0) & 0xff] & 0xff];
ks[35] = td0[te1[(ks[35] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[35] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[35] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[35] >> 0) & 0xff] & 0xff];
ks[36] = td0[te1[(ks[36] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[36] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[36] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[36] >> 0) & 0xff] & 0xff];
ks[37] = td0[te1[(ks[37] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[37] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[37] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[37] >> 0) & 0xff] & 0xff];
ks[38] = td0[te1[(ks[38] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[38] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[38] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[38] >> 0) & 0xff] & 0xff];
ks[39] = td0[te1[(ks[39] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[39] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[39] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[39] >> 0) & 0xff] & 0xff];
ks[40] = td0[te1[(ks[40] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[40] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[40] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[40] >> 0) & 0xff] & 0xff];
ks[41] = td0[te1[(ks[41] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[41] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[41] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[41] >> 0) & 0xff] & 0xff];
ks[42] = td0[te1[(ks[42] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[42] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[42] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[42] >> 0) & 0xff] & 0xff];
ks[43] = td0[te1[(ks[43] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[43] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[43] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[43] >> 0) & 0xff] & 0xff];
ks[44] = td0[te1[(ks[44] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[44] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[44] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[44] >> 0) & 0xff] & 0xff];
ks[45] = td0[te1[(ks[45] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[45] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[45] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[45] >> 0) & 0xff] & 0xff];
ks[46] = td0[te1[(ks[46] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[46] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[46] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[46] >> 0) & 0xff] & 0xff];
ks[47] = td0[te1[(ks[47] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[47] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[47] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[47] >> 0) & 0xff] & 0xff];
ks[48] = td0[te1[(ks[48] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[48] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[48] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[48] >> 0) & 0xff] & 0xff];
ks[49] = td0[te1[(ks[49] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[49] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[49] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[49] >> 0) & 0xff] & 0xff];
ks[50] = td0[te1[(ks[50] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[50] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[50] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[50] >> 0) & 0xff] & 0xff];
ks[51] = td0[te1[(ks[51] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[51] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[51] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[51] >> 0) & 0xff] & 0xff];
ks[52] = td0[te1[(ks[52] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[52] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[52] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[52] >> 0) & 0xff] & 0xff];
ks[53] = td0[te1[(ks[53] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[53] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[53] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[53] >> 0) & 0xff] & 0xff];
ks[54] = td0[te1[(ks[54] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[54] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[54] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[54] >> 0) & 0xff] & 0xff];
ks[55] = td0[te1[(ks[55] >> 24) & 0xff] & 0xff] ^ td1[te1[(ks[55] >> 16) & 0xff] & 0xff] ^ td2[te1[(ks[55] >> 8) & 0xff] & 0xff] ^ td3[te1[(ks[55] >> 0) & 0xff] & 0xff];
}
DECLSPEC void aes256_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4);

View File

@ -271,27 +271,30 @@ DECLSPEC u32 mds_rem (u32 p0, u32 p1)
{
#define G_MOD 0x14d
for (int i = 0; i < 8; i++)
{
u32 t = p1 >> 24;
p1 = (p1 << 8) | (p0 >> 24);
p0 <<= 8;
u32 u = (t << 1);
if (t & 0x80) u ^= G_MOD;
p1 ^= t ^ (u << 16);
u ^= (t >> 1);
if (t & 0x01) u ^= G_MOD >> 1;
p1 ^= (u << 24) | (u << 8);
#define MDS_REM_ROUND() \
{ \
u32 t = p1 >> 24; \
p1 = (p1 << 8) | (p0 >> 24); \
p0 <<= 8; \
u32 u = (t << 1); \
if (t & 0x80) u ^= G_MOD; \
p1 ^= t ^ (u << 16); \
u ^= (t >> 1); \
if (t & 0x01) u ^= G_MOD >> 1; \
p1 ^= (u << 24) | (u << 8); \
}
MDS_REM_ROUND();
MDS_REM_ROUND();
MDS_REM_ROUND();
MDS_REM_ROUND();
MDS_REM_ROUND();
MDS_REM_ROUND();
MDS_REM_ROUND();
MDS_REM_ROUND();
#undef MDS_REM_ROUND
return p1;
}